From ab2e267ac5e62ef5e10add720190f86e8657858d Mon Sep 17 00:00:00 2001 From: Wei Wei Date: Thu, 17 Nov 2022 10:18:28 +0000 Subject: [PATCH 001/297] Fixed shared key authentication failure when request uri contains '+' (#1747) * Fixed shared key authentication failure when request uri contains '+' * Add test case - skip for SDK issue --- ChangeLog.md | 1 + .../BlobSharedKeyAuthenticator.ts | 2 +- .../QueueSharedKeyAuthenticator.ts | 4 +- tests/blob/apis/container.test.ts | 61 +++++++++++++++++++ 4 files changed, 65 insertions(+), 3 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index 359e898d5..d17067b87 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -6,6 +6,7 @@ General: +- Fixed shared key authentication failure when request uri contains "+" - Stop accepting new connections and closes existing, idle connections (including keep-alives) without killing requests that are in-flight. Table: diff --git a/src/blob/authentication/BlobSharedKeyAuthenticator.ts b/src/blob/authentication/BlobSharedKeyAuthenticator.ts index e7fcacbf8..6491e9f41 100644 --- a/src/blob/authentication/BlobSharedKeyAuthenticator.ts +++ b/src/blob/authentication/BlobSharedKeyAuthenticator.ts @@ -309,7 +309,7 @@ export default class BlobSharedKeyAuthenticator implements IAuthenticator { queryKeys.sort(); for (const key of queryKeys) { canonicalizedResourceString += `\n${key}:${decodeURIComponent( - lowercaseQueries[key] + lowercaseQueries[key].replace(/\+/g, '%20') )}`; } } diff --git a/src/queue/authentication/QueueSharedKeyAuthenticator.ts b/src/queue/authentication/QueueSharedKeyAuthenticator.ts index aeca9e685..fca635fa8 100644 --- a/src/queue/authentication/QueueSharedKeyAuthenticator.ts +++ b/src/queue/authentication/QueueSharedKeyAuthenticator.ts @@ -289,14 +289,14 @@ export default class QueueSharedKeyAuthenticator implements IAuthenticator { queryKeys.sort(); for (const key of queryKeys) { canonicalizedResourceString += `\n${key}:${decodeURIComponent( - lowercaseQueries[key] + lowercaseQueries[key].replace(/\+/g, '%20') )}`; } } else if (type === "SharedKeyLite") { for (const key in queries) { if (queries.hasOwnProperty(key) && key.toLowerCase() === "comp") { canonicalizedResourceString += `?comp=${decodeURIComponent( - queries[key] + queries[key].replace(/\+/g, '%20') )}`; } } diff --git a/tests/blob/apis/container.test.ts b/tests/blob/apis/container.test.ts index d35d811c0..64cf39880 100644 --- a/tests/blob/apis/container.test.ts +++ b/tests/blob/apis/container.test.ts @@ -1150,4 +1150,65 @@ describe("ContainerAPIs", () => { assert.ok(result); assert.equal(result.segment.blobItems.length, 4); }); + + // Skip the case currently since js sdk caculate the stringToSign with "+" in prefix instead of decode to space + it.skip("List blob should success with '+' in query @loki @sql", async () => { + const blobClients = []; + let blobNames: Array = [ + "block blob/abc-001", + "block blob/abc-002" + ]; + + for (let i = 0; i < 2; i++) { + const blobClient = containerClient.getBlobClient(blobNames[i]); + const blockBlobClient = blobClient.getBlockBlobClient(); + await blockBlobClient.upload("", 0); + blobClients.push(blobClient); + } + + // list with prefix has "+" instead of "%20" for space + // create service client + let pipeline = newPipeline( + new StorageSharedKeyCredential( + EMULATOR_ACCOUNT_NAME, + EMULATOR_ACCOUNT_KEY + ), + { + retryOptions: { maxTries: 1 }, + // Make sure socket is closed once the operation is done. + keepAliveOptions: { enable: false } + } + ); + pipeline.factories.unshift( + new QueryRequestPolicyFactory("prefix=block%20blob", "prefix=block+blob") + ); + const serviceClientForOptions = new BlobServiceClient(`${baseURL}`, pipeline); + const containerClientForOptions = serviceClientForOptions.getContainerClient(containerClient.containerName); + + // List blobs + const inputmarker = undefined; + const result = ( + await containerClientForOptions + .listBlobsFlat({ + prefix: "block blob" + }) + .byPage({ continuationToken: inputmarker }) + .next() + ).value; + assert.ok(result.serviceEndpoint.length > 0); + assert.ok(containerClient.url.indexOf(result.containerName)); + assert.equal(result.segment.blobItems.length, 2); + + // verify list out blob names + const gotNames: Array = []; + for (const item of result.segment.blobItems) { + gotNames.push(item.name); + } + assert.deepStrictEqual(gotNames, blobNames); + + // clean up + for (const blob of blobClients) { + await blob.delete(); + } + }); }); From 73ed83c2dd07a4fc97f21b9d50450bef8b5c26b0 Mon Sep 17 00:00:00 2001 From: Roel Arents <2691308+roelarents@users.noreply.github.com> Date: Thu, 24 Nov 2022 10:57:35 +0100 Subject: [PATCH 002/297] don't default delimiter for list blob hierarchy to slash (#1690) --- src/blob/handlers/ContainerHandler.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/blob/handlers/ContainerHandler.ts b/src/blob/handlers/ContainerHandler.ts index 5d081b90c..6aba00517 100644 --- a/src/blob/handlers/ContainerHandler.ts +++ b/src/blob/handlers/ContainerHandler.ts @@ -682,7 +682,6 @@ export default class ContainerHandler extends BaseHandler const request = context.request!; const marker = options.marker; - delimiter = delimiter === "" ? "/" : delimiter; options.prefix = options.prefix || ""; options.marker = options.marker || ""; let includeSnapshots: boolean = false; @@ -709,7 +708,7 @@ export default class ContainerHandler extends BaseHandler context, accountName, containerName, - delimiter, + delimiter === "" ? undefined : delimiter, undefined, options.prefix, options.maxresults, From 36342fa82961bee38688d576cdce839a3f2b62f8 Mon Sep 17 00:00:00 2001 From: Wei Wei Date: Thu, 1 Dec 2022 09:15:45 +0000 Subject: [PATCH 003/297] Support Copy Blob From URL when cross account (#1742) * Support Copy Blob From URL when cross account * Modify test cases since sync copy only support loki --- ChangeLog.md | 4 + src/blob/handlers/BlobHandler.ts | 154 ++++++++++++++++--------------- tests/blob/sas.test.ts | 74 +++++++++++++++ 3 files changed, 160 insertions(+), 72 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index d17067b87..1cebe8c4b 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -9,6 +9,10 @@ General: - Fixed shared key authentication failure when request uri contains "+" - Stop accepting new connections and closes existing, idle connections (including keep-alives) without killing requests that are in-flight. +Blob: + +- Support Copy Blob From URL API when use different source and destination account (in same Azurite instance). + Table: - Added exit parameter to tests so they don't hang. diff --git a/src/blob/handlers/BlobHandler.ts b/src/blob/handlers/BlobHandler.ts index 6c431637f..ed61c4489 100644 --- a/src/blob/handlers/BlobHandler.ts +++ b/src/blob/handlers/BlobHandler.ts @@ -643,77 +643,7 @@ export default class BlobHandler extends BaseHandler implements IBlobHandler { } if (sourceAccount !== blobCtx.account) { - // Currently the only cross-account copy support is from/to the same Azurite instance. In either case access - // is determined by performing a request to the copy source to see if the authentication is valid. - const currentServer = blobCtx.request!.getHeader("Host") || ""; - if (currentServer !== url.host) { - this.logger.error( - `BlobHandler:startCopyFromURL() Source account ${url} is not on the same Azurite instance as target account ${account}`, - context.contextId - ); - - throw StorageErrorFactory.getCannotVerifyCopySource( - context.contextId!, - 404, - "The specified resource does not exist" - ); - } - - this.logger.debug( - `BlobHandler:startCopyFromURL() Validating access to the source account ${sourceAccount}`, - context.contextId - ); - - // In order to retrieve proper error details we make a metadata request to the copy source. If we instead issue - // a HEAD request then the error details are not returned and reporting authentication failures to the caller - // becomes a black box. - const metadataUrl = URLBuilder.parse(copySource); - metadataUrl.setQueryParameter("comp", "metadata"); - const validationResponse: AxiosResponse = await axios.get( - metadataUrl.toString(), - { - // Instructs axios to not throw an error for non-2xx responses - validateStatus: () => true - } - ); - if (validationResponse.status === 200) { - this.logger.debug( - `BlobHandler:startCopyFromURL() Successfully validated access to source account ${sourceAccount}`, - context.contextId - ); - } else { - this.logger.debug( - `BlobHandler:startCopyFromURL() Access denied to source account ${sourceAccount} StatusCode=${validationResponse.status}, AuthenticationErrorDetail=${validationResponse.data}`, - context.contextId - ); - - if (validationResponse.status === 404) { - throw StorageErrorFactory.getCannotVerifyCopySource( - context.contextId!, - validationResponse.status, - "The specified resource does not exist" - ); - } else { - // For non-successful responses attempt to unwrap the error message from the metadata call. - let message: string = - "Could not verify the copy source within the specified time."; - if ( - validationResponse.headers[HeaderConstants.CONTENT_TYPE] === - "application/xml" - ) { - const authenticationError = await parseXML(validationResponse.data); - if (authenticationError.Message !== undefined) { - message = authenticationError.Message.replace(/\n+/gm, ""); - } - } - - throw StorageErrorFactory.getCannotVerifyCopySource( - context.contextId!, - validationResponse.status, - message - ); - } - } + await this.validateCopySource(copySource, sourceAccount, context); } // Preserve metadata key case @@ -751,6 +681,83 @@ export default class BlobHandler extends BaseHandler implements IBlobHandler { return response; } + private async validateCopySource(copySource: string, sourceAccount: string, context: Context): Promise { + // Currently the only cross-account copy support is from/to the same Azurite instance. In either case access + // is determined by performing a request to the copy source to see if the authentication is valid. + const blobCtx = new BlobStorageContext(context); + + const currentServer = blobCtx.request!.getHeader("Host") || ""; + const url = new URL(copySource) + if (currentServer !== url.host) { + this.logger.error( + `BlobHandler:startCopyFromURL() Source account ${url} is not on the same Azurite instance as target account ${blobCtx.account}`, + context.contextId + ); + + throw StorageErrorFactory.getCannotVerifyCopySource( + context.contextId!, + 404, + "The specified resource does not exist" + ); + } + + this.logger.debug( + `BlobHandler:startCopyFromURL() Validating access to the source account ${sourceAccount}`, + context.contextId + ); + + // In order to retrieve proper error details we make a metadata request to the copy source. If we instead issue + // a HEAD request then the error details are not returned and reporting authentication failures to the caller + // becomes a black box. + const metadataUrl = URLBuilder.parse(copySource); + metadataUrl.setQueryParameter("comp", "metadata"); + const validationResponse: AxiosResponse = await axios.get( + metadataUrl.toString(), + { + // Instructs axios to not throw an error for non-2xx responses + validateStatus: () => true + } + ); + if (validationResponse.status === 200) { + this.logger.debug( + `BlobHandler:startCopyFromURL() Successfully validated access to source account ${sourceAccount}`, + context.contextId + ); + } else { + this.logger.debug( + `BlobHandler:startCopyFromURL() Access denied to source account ${sourceAccount} StatusCode=${validationResponse.status}, AuthenticationErrorDetail=${validationResponse.data}`, + context.contextId + ); + + if (validationResponse.status === 404) { + throw StorageErrorFactory.getCannotVerifyCopySource( + context.contextId!, + validationResponse.status, + "The specified resource does not exist" + ); + } else { + // For non-successful responses attempt to unwrap the error message from the metadata call. + let message: string = + "Could not verify the copy source within the specified time."; + if ( + validationResponse.headers[HeaderConstants.CONTENT_TYPE] === + "application/xml" + ) { + const authenticationError = await parseXML(validationResponse.data); + if (authenticationError.Message !== undefined) { + message = authenticationError.Message.replace(/\n+/gm, ""); + } + } + + throw StorageErrorFactory.getCannotVerifyCopySource( + context.contextId!, + validationResponse.status, + message + ); + } + } + } + /** * Abort copy from Url. * @@ -826,7 +833,6 @@ export default class BlobHandler extends BaseHandler implements IBlobHandler { const snapshot = url.searchParams.get("snapshot") || ""; if ( - sourceAccount !== blobCtx.account || sourceAccount === undefined || sourceContainer === undefined || sourceBlob === undefined @@ -834,6 +840,10 @@ export default class BlobHandler extends BaseHandler implements IBlobHandler { throw StorageErrorFactory.getBlobNotFound(context.contextId!); } + if (sourceAccount !== blobCtx.account) { + await this.validateCopySource(copySource, sourceAccount, context); + } + // Preserve metadata key case const metadata = convertRawHeadersToMetadata( blobCtx.request!.getRawHeaders() diff --git a/tests/blob/sas.test.ts b/tests/blob/sas.test.ts index be9cdbed3..ef368492f 100644 --- a/tests/blob/sas.test.ts +++ b/tests/blob/sas.test.ts @@ -1782,4 +1782,78 @@ describe("Shared Access Signature (SAS) authentication", () => { assert.equal(error.statusCode, 409); assert.equal(error.details.code, "BlobArchived"); }); + + it("Sync Copy blob across accounts should work and honor metadata when provided @loki", async () => { + const now = new Date(); + now.setMinutes(now.getMinutes() - 5); // Skip clock skew with server + + const tmr = new Date(); + tmr.setDate(tmr.getDate() + 1); + + // By default, credential is always the last element of pipeline factories + const factories = (serviceClient as any).pipeline.factories; + const sourceStorageSharedKeyCredential = factories[factories.length - 1]; + + const containerName = getUniqueName("con"); + const sourceContainerClient = serviceClient.getContainerClient( + containerName + ); + const targetContainerClient = serviceClient2.getContainerClient( + containerName + ); + await sourceContainerClient.create(); + await targetContainerClient.create(); + + const blobName = getUniqueName("blob"); + const blobName2 = getUniqueName("blob"); + const sas = generateBlobSASQueryParameters( + { + containerName, + blobName, + expiresOn: tmr, + ipRange: { start: "0.0.0.0", end: "255.255.255.255" }, + permissions: BlobSASPermissions.parse("r"), + protocol: SASProtocol.HttpsAndHttp, + startsOn: now, + version: "2016-05-31" + }, + sourceStorageSharedKeyCredential as StorageSharedKeyCredential + ).toString(); + + const sourceBlob = sourceContainerClient.getBlockBlobClient(blobName); + await sourceBlob.upload("hello", 5, { + metadata: { + foo: "1", + bar: "2" + } + }); + + // Copy From Uri + const targetBlob = targetContainerClient.getBlockBlobClient(blobName); + const targetBlobWithProps = targetContainerClient.getBlockBlobClient( + blobName2 + ); + const copyResponse3 = await targetBlob.syncCopyFromURL( + `${sourceBlob.url}?${sas}` + ); + assert.equal("success", copyResponse3.copyStatus); + const properties3 = await targetBlob.getProperties(); + assert.equal(properties3.metadata!["foo"], "1"); + assert.equal(properties3.metadata!["bar"], "2"); + + const copyResponse4 = await targetBlobWithProps.syncCopyFromURL( + `${sourceBlob.url}?${sas}`, + { + metadata: { + baz: "3" + } + } + ); + + assert.equal("success", copyResponse4.copyStatus); + const properties4 = await targetBlobWithProps.getProperties(); + assert.equal(properties4.metadata!["foo"], undefined); + assert.equal(properties4.metadata!["bar"], undefined); + assert.equal(properties4.metadata!["baz"], "3"); + }); }); From 63071982f44c79269921c87bbbadf4f6bc3102dd Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 5 Dec 2022 10:44:15 +0800 Subject: [PATCH 004/297] Bump decode-uri-component from 0.2.0 to 0.2.2 (#1759) Bumps [decode-uri-component](https://github.com/SamVerschueren/decode-uri-component) from 0.2.0 to 0.2.2. - [Release notes](https://github.com/SamVerschueren/decode-uri-component/releases) - [Commits](https://github.com/SamVerschueren/decode-uri-component/compare/v0.2.0...v0.2.2) --- updated-dependencies: - dependency-name: decode-uri-component dependency-type: indirect ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 371a88b67..8d6b18b41 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3622,9 +3622,9 @@ } }, "node_modules/decode-uri-component": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", + "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==", "dev": true, "engines": { "node": ">=0.10" @@ -14031,9 +14031,9 @@ "dev": true }, "decode-uri-component": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", + "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==", "dev": true }, "decompress-response": { From 72defc48188187c3e783b3569e9f1ffe572e1f39 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 5 Dec 2022 10:45:20 +0800 Subject: [PATCH 005/297] Bump vsce from 2.13.0 to 2.15.0 (#1758) Bumps [vsce](https://github.com/Microsoft/vsce) from 2.13.0 to 2.15.0. - [Release notes](https://github.com/Microsoft/vsce/releases) - [Commits](https://github.com/Microsoft/vsce/compare/v2.13.0...v2.15.0) --- updated-dependencies: - dependency-name: vsce dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 8d6b18b41..978b82037 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10517,9 +10517,10 @@ } }, "node_modules/vsce": { - "version": "2.13.0", - "resolved": "https://registry.npmjs.org/vsce/-/vsce-2.13.0.tgz", - "integrity": "sha512-t1otQ2lqyi5Y/G6qUl9BEc561nEIYrZbLT8k+R1SoZaKNa6gaehaLGQG5zvB524YPGZOVvbOBzAXoO7Mor1J5g==", + "version": "2.15.0", + "resolved": "https://registry.npmjs.org/vsce/-/vsce-2.15.0.tgz", + "integrity": "sha512-P8E9LAZvBCQnoGoizw65JfGvyMqNGlHdlUXD1VAuxtvYAaHBKLBdKPnpy60XKVDAkQCfmMu53g+gq9FM+ydepw==", + "deprecated": "vsce has been renamed to @vscode/vsce. Install using @vscode/vsce instead.", "dev": true, "dependencies": { "azure-devops-node-api": "^11.0.1", @@ -19249,9 +19250,9 @@ } }, "vsce": { - "version": "2.13.0", - "resolved": "https://registry.npmjs.org/vsce/-/vsce-2.13.0.tgz", - "integrity": "sha512-t1otQ2lqyi5Y/G6qUl9BEc561nEIYrZbLT8k+R1SoZaKNa6gaehaLGQG5zvB524YPGZOVvbOBzAXoO7Mor1J5g==", + "version": "2.15.0", + "resolved": "https://registry.npmjs.org/vsce/-/vsce-2.15.0.tgz", + "integrity": "sha512-P8E9LAZvBCQnoGoizw65JfGvyMqNGlHdlUXD1VAuxtvYAaHBKLBdKPnpy60XKVDAkQCfmMu53g+gq9FM+ydepw==", "dev": true, "requires": { "azure-devops-node-api": "^11.0.1", From 611c532c186a8acd5ff7aa9f3090956e0a29460f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 9 Dec 2022 10:11:12 +0800 Subject: [PATCH 006/297] Bump @types/vscode from 1.72.0 to 1.74.0 (#1765) Bumps [@types/vscode](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/vscode) from 1.72.0 to 1.74.0. - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/vscode) --- updated-dependencies: - dependency-name: "@types/vscode" dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 978b82037..ccfc11947 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1219,9 +1219,9 @@ "dev": true }, "node_modules/@types/vscode": { - "version": "1.72.0", - "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.72.0.tgz", - "integrity": "sha512-WvHluhUo+lQvE3I4wUagRpnkHuysB4qSyOQUyIAS9n9PYMJjepzTUD8Jyks0YeXoPD0UGctjqp2u84/b3v6Ydw==", + "version": "1.74.0", + "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.74.0.tgz", + "integrity": "sha512-LyeCIU3jb9d38w0MXFwta9r0Jx23ugujkAxdwLTNCyspdZTKUc43t7ppPbCiPoQ/Ivd/pnDFZrb4hWd45wrsgA==", "dev": true }, "node_modules/@types/xml2js": { @@ -11985,9 +11985,9 @@ "dev": true }, "@types/vscode": { - "version": "1.72.0", - "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.72.0.tgz", - "integrity": "sha512-WvHluhUo+lQvE3I4wUagRpnkHuysB4qSyOQUyIAS9n9PYMJjepzTUD8Jyks0YeXoPD0UGctjqp2u84/b3v6Ydw==", + "version": "1.74.0", + "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.74.0.tgz", + "integrity": "sha512-LyeCIU3jb9d38w0MXFwta9r0Jx23ugujkAxdwLTNCyspdZTKUc43t7ppPbCiPoQ/Ivd/pnDFZrb4hWd45wrsgA==", "dev": true }, "@types/xml2js": { From 484927b6304624c3ce8f5d92990f3b19dd6c98b9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 9 Dec 2022 10:23:05 +0800 Subject: [PATCH 007/297] Bump qs from 6.5.2 to 6.5.3 (#1766) Bumps [qs](https://github.com/ljharb/qs) from 6.5.2 to 6.5.3. - [Release notes](https://github.com/ljharb/qs/releases) - [Changelog](https://github.com/ljharb/qs/blob/main/CHANGELOG.md) - [Commits](https://github.com/ljharb/qs/compare/v6.5.2...v6.5.3) --- updated-dependencies: - dependency-name: qs dependency-type: indirect ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index ccfc11947..66bc7d7a4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8920,9 +8920,9 @@ } }, "node_modules/request/node_modules/qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", + "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", "dev": true, "engines": { "node": ">=0.6" @@ -18025,9 +18025,9 @@ } }, "qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", + "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", "dev": true } } From 7625366fa3d1b7080a3c1c442016bfd4cc2e1f1e Mon Sep 17 00:00:00 2001 From: Edwin Huber Date: Thu, 22 Dec 2022 17:39:01 +0100 Subject: [PATCH 008/297] Multiple fixes for Table and Refactoring (#1521) * fixed querying for binary props * added test to query for guid * updated tests * changes to test and support guid and bin column queries * refactoring query and persistence code * fixes #1428 and test added to check for top=0 * adds test that shows that we have fixed #1162 * Turns timestamp into system property * modified binary query from base64 to hex * corrected persistence test * quick fix of isValue regex * updated type validation * added test for backwards compatible Guid * binary query implemented * updated legacy db tests for parallel pipeline execution * added unit test for orleans filter * removed hard coded date from test SAS --- ChangeLog.md | 5 + src/table/entity/EdmGuid.ts | 44 +- src/table/entity/NormalizedEntity.ts | 25 +- .../persistence/LokiTableMetadataStore.ts | 1189 ++++++++--------- .../LokiTableStoreQueryGenerator.ts | 103 ++ .../persistence/QueryTranscriber/IQPState.ts | 14 + .../LokiJsQueryTranscriber.ts | 26 + .../LokiJsQueryTranscriberFactory.ts | 93 ++ .../PredicateModel/BinaryPredicate.ts | 99 ++ .../PredicateModel/BooleanPredicate.ts | 75 ++ .../PredicateModel/DatePredicate.ts | 82 ++ .../PredicateModel/DoublePredicate.ts | 75 ++ .../PredicateModel/GuidPredicate.ts | 145 ++ .../PredicateModel/IPredicate.ts | 13 + .../PredicateModel/IntegerPredicate.ts | 76 ++ .../PredicateModel/LongPredicate.ts | 83 ++ .../PredicateModel/ParensClose.ts | 19 + .../PredicateModel/ParensOpen.ts | 19 + .../PredicateModel/PredicateOperator.ts | 19 + .../PredicateModel/StringPredicate.ts | 89 ++ .../PredicateModel/TokenMap.ts | 15 + .../PredicateModel/UnknownPredicate.ts | 19 + .../persistence/QueryTranscriber/QPState.ts | 376 ++++++ .../QueryTranscriber/QueryContext.ts | 26 + .../QueryTranscriber/QueryStateName.ts | 20 + .../QueryTranscriber/QueryTranscriber.ts | 143 ++ .../StatePredicateFinished.ts | 444 ++++++ .../QueryTranscriber/StatePredicateStarted.ts | 74 + .../StateProcessIdentifier.ts | 158 +++ .../QueryTranscriber/StateProcessOperator.ts | 151 +++ .../StateProcessParensClose.ts | 92 ++ .../StateProcessParensOpen.ts | 95 ++ .../StateProcessPredicateOperator.ts | 175 +++ .../QueryTranscriber/StateProcessValue.ts | 174 +++ .../QueryTranscriber/StateQueryFinished.ts | 54 + .../QueryTranscriber/StateQueryStarted.ts | 74 + .../QueryTranscriber/TokenModel/ITokenType.ts | 15 + .../TokenModel/IdentifierToken.ts | 22 + .../TokenModel/OperatorToken.ts | 22 + .../TokenModel/ParensCloseToken.ts | 22 + .../TokenModel/ParensOpenToken.ts | 22 + .../TokenModel/TaggedToken.ts | 11 + .../TokenModel/UnknownToken.ts | 22 + .../QueryTranscriber/TokenModel/ValueToken.ts | 22 + .../table.entity.azure.data-tables.test.ts | 805 ++--------- tests/table/apis/table.entity.query.test.ts | 912 +++++++++++++ tests/table/apis/table.entity.rest.test.ts | 72 + tests/table/apis/table.entity.test.ts | 31 - .../table/database/__db_table_guid_bin__.json | 232 ++++ .../table/models/AzureDataTablesTestEntity.ts | 7 +- .../LokiJsQueryTranscriber.unit.test.2.ts} | 29 +- .../unit/LokiJsQueryTranscriber.unit.test.ts | 433 ++++++ tests/table/utils/table.entity.test.utils.ts | 57 +- .../table.entity.tests.rest.submitter.ts | 11 +- 54 files changed, 5694 insertions(+), 1436 deletions(-) create mode 100644 src/table/persistence/LokiTableStoreQueryGenerator.ts create mode 100644 src/table/persistence/QueryTranscriber/IQPState.ts create mode 100644 src/table/persistence/QueryTranscriber/LokiJsQueryTranscriber.ts create mode 100644 src/table/persistence/QueryTranscriber/LokiJsQueryTranscriberFactory.ts create mode 100644 src/table/persistence/QueryTranscriber/PredicateModel/BinaryPredicate.ts create mode 100644 src/table/persistence/QueryTranscriber/PredicateModel/BooleanPredicate.ts create mode 100644 src/table/persistence/QueryTranscriber/PredicateModel/DatePredicate.ts create mode 100644 src/table/persistence/QueryTranscriber/PredicateModel/DoublePredicate.ts create mode 100644 src/table/persistence/QueryTranscriber/PredicateModel/GuidPredicate.ts create mode 100644 src/table/persistence/QueryTranscriber/PredicateModel/IPredicate.ts create mode 100644 src/table/persistence/QueryTranscriber/PredicateModel/IntegerPredicate.ts create mode 100644 src/table/persistence/QueryTranscriber/PredicateModel/LongPredicate.ts create mode 100644 src/table/persistence/QueryTranscriber/PredicateModel/ParensClose.ts create mode 100644 src/table/persistence/QueryTranscriber/PredicateModel/ParensOpen.ts create mode 100644 src/table/persistence/QueryTranscriber/PredicateModel/PredicateOperator.ts create mode 100644 src/table/persistence/QueryTranscriber/PredicateModel/StringPredicate.ts create mode 100644 src/table/persistence/QueryTranscriber/PredicateModel/TokenMap.ts create mode 100644 src/table/persistence/QueryTranscriber/PredicateModel/UnknownPredicate.ts create mode 100644 src/table/persistence/QueryTranscriber/QPState.ts create mode 100644 src/table/persistence/QueryTranscriber/QueryContext.ts create mode 100644 src/table/persistence/QueryTranscriber/QueryStateName.ts create mode 100644 src/table/persistence/QueryTranscriber/QueryTranscriber.ts create mode 100644 src/table/persistence/QueryTranscriber/StatePredicateFinished.ts create mode 100644 src/table/persistence/QueryTranscriber/StatePredicateStarted.ts create mode 100644 src/table/persistence/QueryTranscriber/StateProcessIdentifier.ts create mode 100644 src/table/persistence/QueryTranscriber/StateProcessOperator.ts create mode 100644 src/table/persistence/QueryTranscriber/StateProcessParensClose.ts create mode 100644 src/table/persistence/QueryTranscriber/StateProcessParensOpen.ts create mode 100644 src/table/persistence/QueryTranscriber/StateProcessPredicateOperator.ts create mode 100644 src/table/persistence/QueryTranscriber/StateProcessValue.ts create mode 100644 src/table/persistence/QueryTranscriber/StateQueryFinished.ts create mode 100644 src/table/persistence/QueryTranscriber/StateQueryStarted.ts create mode 100644 src/table/persistence/QueryTranscriber/TokenModel/ITokenType.ts create mode 100644 src/table/persistence/QueryTranscriber/TokenModel/IdentifierToken.ts create mode 100644 src/table/persistence/QueryTranscriber/TokenModel/OperatorToken.ts create mode 100644 src/table/persistence/QueryTranscriber/TokenModel/ParensCloseToken.ts create mode 100644 src/table/persistence/QueryTranscriber/TokenModel/ParensOpenToken.ts create mode 100644 src/table/persistence/QueryTranscriber/TokenModel/TaggedToken.ts create mode 100644 src/table/persistence/QueryTranscriber/TokenModel/UnknownToken.ts create mode 100644 src/table/persistence/QueryTranscriber/TokenModel/ValueToken.ts create mode 100644 tests/table/apis/table.entity.query.test.ts create mode 100644 tests/table/database/__db_table_guid_bin__.json rename tests/table/{persistence/LokiTableMetadataStore.test.ts => unit/LokiJsQueryTranscriber.unit.test.2.ts} (85%) create mode 100644 tests/table/unit/LokiJsQueryTranscriber.unit.test.ts diff --git a/ChangeLog.md b/ChangeLog.md index 1cebe8c4b..5b80743d5 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -16,6 +16,11 @@ Blob: Table: - Added exit parameter to tests so they don't hang. +- Fixes issues using and querying GUID types. +- Removes odata Timestamp type from entities when accept is set to minimalmetadata. +- Ensures no entities are returned when queries use $top=0. +- Fixes issues querying for binary values. +- Implements new query parsing logic. ## 2022.10 Version 3.20.1 diff --git a/src/table/entity/EdmGuid.ts b/src/table/entity/EdmGuid.ts index ebe7b9409..5c84b89dc 100644 --- a/src/table/entity/EdmGuid.ts +++ b/src/table/entity/EdmGuid.ts @@ -3,6 +3,11 @@ import { AnnotationLevel } from "./EntityProperty"; import { IEdmType } from "./IEdmType"; export class EdmGuid implements IEdmType { + /** + * Stores value as base64 + * @param value + * @returns + */ public static validate(value: any): string { if (typeof value !== "string") { throw TypeError(`Not a valid EdmGuid string.`); @@ -10,7 +15,9 @@ export class EdmGuid implements IEdmType { // TODO: Check GUID string format - return value; + // we need to store GUID in base64 to avoid finding with a string query + const guidBuff = Buffer.from(value); + return guidBuff.toString("base64"); } public typedValue: string; @@ -23,8 +30,32 @@ export class EdmGuid implements IEdmType { return [name, this.typedValue]; } + /** + * We store GUIDs as base64 encoded strings to stop them being found + * by simple string searches. + * We must support backwards compatability, so cover both cases. + * @param name + * @returns + */ public toJsonPropertyValueString(name: string): string { - return `"${name}":${JSON.stringify(this.typedValue)}`; + if (EdmGuid.isBase64Encoded(this.value)) { + const binData = Buffer.from(this.value, "base64"); + const decoded = binData.toString("utf8"); + return `"${name}":${JSON.stringify(decoded)}`; + } + return `"${name}":${JSON.stringify(this.value)}`; + } + + private static isBase64Encoded(value: any) { + const stringValue: string = value; + const matches = stringValue.match( + /^([A-Za-z0-9+/]{4})*([A-Za-z0-9+/]{3}=|[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{1}=)?$/ + ); + return ( + matches !== null && + matches?.length === 3 && + (matches[2] === undefined || matches[2].length === 4) + ); } public toJsonPropertyTypePair( @@ -44,6 +75,15 @@ export class EdmGuid implements IEdmType { } } + /** + * Will return "@odata.type":"Edm.guid" + * + * @param {string} name + * @param {AnnotationLevel} annotationLevel + * @param {boolean} isSystemProperty + * @return {*} {(string | undefined)} + * @memberof EdmGuid + */ public toJsonPropertyTypeString( name: string, annotationLevel: AnnotationLevel, diff --git a/src/table/entity/NormalizedEntity.ts b/src/table/entity/NormalizedEntity.ts index 03b001a5d..9936b01da 100644 --- a/src/table/entity/NormalizedEntity.ts +++ b/src/table/entity/NormalizedEntity.ts @@ -57,7 +57,7 @@ export class NormalizedEntity { `Invalid EdmType value:${type} for key:${key}${ODATA_TYPE}` ); } - const property = parseEntityProperty(key, element, type, false); + const property = this.validateSystemProperty(key, element, type); this.properties.push(property); this.propertiesMap[key] = property; } @@ -65,6 +65,29 @@ export class NormalizedEntity { } } + /** + * Removes oData type from Timestamp property + * + * @private + * @param {string} key + * @param {(string | number | boolean | null)} element + * @param {string} type + * @return {*} + * @memberof NormalizedEntity + */ + private validateSystemProperty( + key: string, + element: string | number | boolean | null, + type: string + ) { + let isSystemProperty = false; + if (key === "Timestamp") { + isSystemProperty = true; + } + const property = parseEntityProperty(key, element, type, isSystemProperty); + return property; + } + // Convert to HTTP response payload string public toResponseString( annotationLevel: string, diff --git a/src/table/persistence/LokiTableMetadataStore.ts b/src/table/persistence/LokiTableMetadataStore.ts index 86f90f238..eedb44409 100644 --- a/src/table/persistence/LokiTableMetadataStore.ts +++ b/src/table/persistence/LokiTableMetadataStore.ts @@ -8,6 +8,7 @@ import Context from "../generated/Context"; import { Entity, Table } from "../persistence/ITableMetadataStore"; import { ODATA_TYPE, QUERY_RESULT_MAX_NUM } from "../utils/constants"; import ITableMetadataStore, { TableACL } from "./ITableMetadataStore"; +import LokiTableStoreQueryGenerator from "./LokiTableStoreQueryGenerator"; /** MODELS FOR SERVICE */ interface IServiceAdditionalProperties { @@ -17,17 +18,6 @@ interface IServiceAdditionalProperties { export type ServicePropertiesModel = Models.TableServiceProperties & IServiceAdditionalProperties; -// used by the query filter checking logic -type TokenTuple = [string, TokenType]; -enum TokenType { - Unknown, - Identifier, - Comparisson, - LogicalOp, - Value, - Parens -} - export default class LokiTableMetadataStore implements ITableMetadataStore { private readonly db: Loki; private readonly TABLES_COLLECTION = "$TABLES_COLLECTION$"; @@ -49,55 +39,26 @@ export default class LokiTableMetadataStore implements ITableMetadataStore { }); } + /** + * Initializes the persistence layer + * + * @return {*} {Promise} + * @memberof LokiTableMetadataStore + */ public async init(): Promise { - await new Promise((resolve, reject) => { - stat(this.lokiDBPath, (statError, stats) => { - if (!statError) { - this.db.loadDatabase({}, (dbError) => { - if (dbError) { - reject(dbError); - } else { - resolve(); - } - }); - } else { - // when DB file doesn't exist, ignore the error because following will re-create the file - resolve(); - } - }); - }); - - // Create tables collection if not exists - if (this.db.getCollection(this.TABLES_COLLECTION) === null) { - this.db.addCollection(this.TABLES_COLLECTION, { - // Optimization for indexing and searching - // https://rawgit.com/techfort/LokiJS/master/jsdoc/tutorial-Indexing%20and%20Query%20performance.html - indices: ["account", "table"] - }); // Optimize for find operation - } - - // Create service properties collection if not exists - let servicePropertiesColl = this.db.getCollection(this.SERVICES_COLLECTION); - if (servicePropertiesColl === null) { - servicePropertiesColl = this.db.addCollection(this.SERVICES_COLLECTION, { - unique: ["accountName"] - }); - } - - await new Promise((resolve, reject) => { - this.db.saveDatabase((err) => { - if (err) { - reject(err); - } else { - resolve(); - } - }); - }); - - this.initialized = true; - this.closed = false; + await this.loadDB(); + this.createTablesCollection(); + this.createServicePropsCollection(); + await this.saveDBState(); + this.finalizeInitializionState(); } + /** + * Close down the DB + * + * @return {*} {Promise} + * @memberof LokiTableMetadataStore + */ public async close(): Promise { await new Promise((resolve, reject) => { this.db.close((err) => { @@ -120,40 +81,35 @@ export default class LokiTableMetadataStore implements ITableMetadataStore { return this.closed; } + /** + * Create a table in the persistence layer + * + * @param {Context} context + * @param {Table} tableModel + * @return {*} {Promise} + * @memberof LokiTableMetadataStore + */ public async createTable(context: Context, tableModel: Table): Promise { // Check for table entry in the table registry collection const coll = this.db.getCollection(this.TABLES_COLLECTION); // Azure Storage Service is case insensitive tableModel.table = tableModel.table; - const doc = coll.findOne({ - account: tableModel.account, - table: { $regex: [String.raw`\b${tableModel.table}\b`, "i"] } - }); - - // If the metadata exists, we will throw getTableAlreadyExists error - if (doc) { - throw StorageErrorFactory.getTableAlreadyExists(context); - } + this.checkIfTableExists(coll, tableModel, context); coll.insert(tableModel); - // now we create the collection to represent the table using a unique string - const tableCollectionName = this.getTableCollectionName( - tableModel.account, - tableModel.table - ); - const extentColl = this.db.getCollection(tableCollectionName); - if (extentColl) { - this.db.removeCollection(tableCollectionName); - } - - this.db.addCollection(tableCollectionName, { - // Optimization for indexing and searching - // https://rawgit.com/techfort/LokiJS/master/jsdoc/tutorial-Indexing%20and%20Query%20performance.html - indices: ["PartitionKey", "RowKey"] - }); // Optimize for find operation + this.createCollectionForTable(tableModel); } + /** + * Delete a table from the persistence layer + * + * @param {Context} context + * @param {string} table + * @param {string} account + * @return {*} {Promise} + * @memberof LokiTableMetadataStore + */ public async deleteTable( context: Context, table: string, @@ -167,17 +123,10 @@ export default class LokiTableMetadataStore implements ITableMetadataStore { account, table: { $regex: [`^${tableLower}$`, "i"] } }); - if (doc) { - coll.remove(doc); - } else { - throw StorageErrorFactory.ResourceNotFound(context); - } + this.checkIfResourceExists(doc, context); + coll.remove(doc); - const tableCollectionName = this.getTableCollectionName(account, doc.table); - const tableEntityCollection = this.db.getCollection(tableCollectionName); - if (tableEntityCollection) { - this.db.removeCollection(tableCollectionName); - } + this.removeTableCollection(account, doc); } /** @@ -253,7 +202,9 @@ export default class LokiTableMetadataStore implements ITableMetadataStore { let queryWhere; try { - queryWhere = this.generateQueryTableWhereFunction(queryOptions.filter); + queryWhere = LokiTableStoreQueryGenerator.generateQueryTableWhereFunction( + queryOptions.filter + ); } catch (e) { throw StorageErrorFactory.getQueryConditionInvalid(context); } @@ -312,37 +263,6 @@ export default class LokiTableMetadataStore implements ITableMetadataStore { return entity; } - /** - * Gets the collection of entites for a specific table. - * Ensures that table name is case insensitive. - * - * @private - * @param {string} account - * @param {string} table - * @param {Context} context - * @return {*} {Collection} - * @memberof LokiTableMetadataStore - */ - private getEntityCollection( - account: string, - table: string, - context: Context - ): Collection { - let tableEntityCollection = this.db.getCollection( - this.getTableCollectionName(account, table.toLowerCase()) - ); - if (!tableEntityCollection) { - // this is to avoid a breaking change for users of persisted storage - tableEntityCollection = this.db.getCollection( - this.getTableCollectionName(account, table) - ); - if (!tableEntityCollection) { - throw StorageErrorFactory.getTableNotExist(context); - } - } - return tableEntityCollection; - } - public async insertOrUpdateTableEntity( context: Context, table: string, @@ -457,16 +377,11 @@ export default class LokiTableMetadataStore implements ITableMetadataStore { RowKey: rowKey }) as Entity; - if (!doc) { - throw StorageErrorFactory.getEntityNotFound(context); - } else { - if (etag !== "*" && doc.eTag !== etag) { - throw StorageErrorFactory.getPreconditionFailed(context); - } - } - if (batchId !== "") { - this.transactionRollbackTheseEntities.push(doc); - } + this.checkForMissingEntity(doc, context); + + this.checkIfMatchPrecondition(etag, doc, context); + + this.trackRollback(batchId, doc); tableEntityCollection.remove(doc); return; } @@ -488,14 +403,13 @@ export default class LokiTableMetadataStore implements ITableMetadataStore { context ); - let queryWhere; - try { - queryWhere = this.generateQueryEntityWhereFunction(queryOptions.filter); - } catch (e) { - throw StorageErrorFactory.getQueryConditionInvalid(context); - } + const queryWhere = + LokiTableStoreQueryGenerator.generateQueryForPersistenceLayer( + queryOptions, + context + ); - const maxResults = queryOptions.top || QUERY_RESULT_MAX_NUM; + const maxResults = this.getMaxResultsOption(queryOptions); // Decode the nextPartitionKey and nextRowKey. This is necessary since non-ASCII characters can // be in partition and row keys but should not be in headers. @@ -551,30 +465,13 @@ export default class LokiTableMetadataStore implements ITableMetadataStore { .limit(maxResults + 1) .data(); - let nextPartitionKeyResponse; - let nextRowKeyResponse; - - if (result.length > maxResults) { - const tail = result.pop(); - nextPartitionKeyResponse = this.encodeContinuationHeader( - tail.PartitionKey - ); - nextRowKeyResponse = this.encodeContinuationHeader(tail.RowKey); - } - - return [result, nextPartitionKeyResponse, nextRowKeyResponse]; - } - - private decodeContinuationHeader(input?: string) { - if (input !== undefined) { - return Buffer.from(input, "base64").toString("utf8"); - } - } + const response = this.adjustQueryResultforTop(result, maxResults); - private encodeContinuationHeader(input?: string) { - if (input !== undefined) { - return Buffer.from(input, "utf8").toString("base64"); - } + return [ + result, + response.nextPartitionKeyResponse, + response.nextRowKeyResponse + ]; } public async queryTableEntitiesWithPartitionAndRowKey( @@ -610,587 +507,563 @@ export default class LokiTableMetadataStore implements ITableMetadataStore { throw new NotImplementedError(context); } - private async updateTableEntity( + /** + * Get service properties for specific storage account. + * + * @param {string} account + * @returns {Promise} + * @memberof LokiBlobMetadataStore + */ + public async getServiceProperties( context: Context, - table: string, - account: string, - entity: Entity, - ifMatch?: string, - batchId?: string - ): Promise { - const tableEntityCollection = this.getEntityCollection( - account, - table, - context - ); + account: string + ): Promise { + const coll = this.db.getCollection(this.SERVICES_COLLECTION); + if (coll) { + const doc = coll.by("accountName", account); + return doc ? doc : undefined; + } + return undefined; + } - const doc = tableEntityCollection.findOne({ - PartitionKey: entity.PartitionKey, - RowKey: entity.RowKey - }) as Entity; + /** + * Update table service properties. + * THis will create service properties if they do not exist in the persistence layer. + * + * TODO: Account's service property should be created when storage account is created or metadata + * storage initialization. This method should only be responsible for updating existing record. + * In this way, we can reduce one I/O call to get account properties. + * Undefined properties will be ignored during properties setup. + * + * @param {ServicePropertiesModel} serviceProperties + * @returns {Promise} + * @memberof LokiBlobMetadataStore + */ + public async setServiceProperties( + context: Context, + serviceProperties: ServicePropertiesModel + ): Promise { + const coll = this.db.getCollection(this.SERVICES_COLLECTION); + const doc = coll.by("accountName", serviceProperties.accountName); - if (!doc) { - throw StorageErrorFactory.getEntityNotFound(context); - } - if (batchId !== "") { - this.transactionRollbackTheseEntities.push(doc); - } + if (doc) { + doc.cors = + serviceProperties.cors === undefined + ? doc.cors + : serviceProperties.cors; - // Test if etag value is valid - const encodedEtag = doc.eTag.replace(":", "%3A").replace(":", "%3A"); - let encodedIfMatch: string | undefined; - if (ifMatch !== undefined) { - encodedIfMatch = ifMatch!.replace(":", "%3A").replace(":", "%3A"); - } - if ( - encodedIfMatch === undefined || - encodedIfMatch === "*" || - (encodedIfMatch !== undefined && encodedEtag === encodedIfMatch) - ) { - tableEntityCollection.remove(doc); + doc.hourMetrics = + serviceProperties.hourMetrics === undefined + ? doc.hourMetrics + : serviceProperties.hourMetrics; - entity.properties.Timestamp = entity.lastModifiedTime; - entity.properties["Timestamp@odata.type"] = "Edm.DateTime"; + doc.logging = + serviceProperties.logging === undefined + ? doc.logging + : serviceProperties.logging; - tableEntityCollection.insert(entity); - return entity; - } + doc.minuteMetrics = + serviceProperties.minuteMetrics === undefined + ? doc.minuteMetrics + : serviceProperties.minuteMetrics; - throw StorageErrorFactory.getPreconditionFailed(context); + return coll.update(doc); + } else { + return coll.insert(serviceProperties); + } } - private async mergeTableEntity( - context: Context, - table: string, - account: string, - entity: Entity, - ifMatch?: string, - batchId?: string - ): Promise { - const tableEntityCollection = this.getEntityCollection( - account, - table, - context - ); - - const doc = tableEntityCollection.findOne({ - PartitionKey: entity.PartitionKey, - RowKey: entity.RowKey - }) as Entity; - - if (!doc) { - throw StorageErrorFactory.getEntityNotFound(context); - } - if (batchId !== "") { - this.transactionRollbackTheseEntities.push(doc); - } - - // if match is URL encoded from the clients, match URL encoding - // this does not always seem to be consistent... - const encodedEtag = doc.eTag.replace(":", "%3A").replace(":", "%3A"); - let encodedIfMatch: string | undefined; - if (ifMatch !== undefined) { - encodedIfMatch = ifMatch!.replace(":", "%3A").replace(":", "%3A"); - } + /** + * Validates state for start of batch. + * Instead of copying all entities / rows in the collection, + * we shall just backup those rows that we change. + * Keeping the batchId in the interface to allow logging scenarios to extend. + * + * @param {string} batchId + * @return {*} {Promise} + * @memberof LokiTableMetadataStore + */ + public async beginBatchTransaction(batchId: string): Promise { if ( - encodedIfMatch === undefined || - encodedIfMatch === "*" || - (encodedIfMatch !== undefined && encodedEtag === encodedIfMatch) + this.transactionRollbackTheseEntities.length > 0 || + this.transactionDeleteTheseEntities.length > 0 ) { - const mergedDEntity: Entity = { - ...doc, - ...entity, - properties: { - ...doc.properties - // ...entity.properties - } - }; - - // Merge inner properties - for (const key in entity.properties) { - if (Object.prototype.hasOwnProperty.call(entity.properties, key)) { - if (key.endsWith(ODATA_TYPE)) { - continue; - } + throw new Error("Transaction Overlapp!"); + } + } - const value = entity.properties[key]; - mergedDEntity.properties[key] = value; + /** + * Ends a batch transaction and will allow for rollback if needed. + * + * @param {string} account + * @param {string} table + * @param {string} batchId + * @param {Context} context + * @param {boolean} succeeded + * @return {*} {Promise} + * @memberof LokiTableMetadataStore + */ + public async endBatchTransaction( + account: string, + table: string, + batchId: string, + context: Context, + succeeded: boolean + ): Promise { + // rollback all changes in the case of failed batch transaction + if (!succeeded) { + const tableBatchCollection = this.db.getCollection( + this.getTableCollectionName(account, table) + ); + if (tableBatchCollection) { + this.rollbackEntityChanges(tableBatchCollection); - if (entity.properties[`${key}${ODATA_TYPE}`] !== undefined) { - mergedDEntity.properties[`${key}${ODATA_TYPE}`] = - entity.properties[`${key}${ODATA_TYPE}`]; - } else { - delete mergedDEntity.properties[`${key}${ODATA_TYPE}`]; - } - } + this.removeEntitiesAddedInBatch(tableBatchCollection); } - - tableEntityCollection.update(mergedDEntity); - return mergedDEntity; - } else { - throw StorageErrorFactory.getPreconditionFailed(context); } + // reset entity rollback trackers + this.transactionRollbackTheseEntities = []; + this.transactionDeleteTheseEntities = []; } - private getTableCollectionName(account: string, table: string): string { - return `${account}$${table}`; + /** + * Sets variables that track state of initialized DB + * + * @private + * @memberof LokiTableMetadataStore + */ + private finalizeInitializionState() { + this.initialized = true; + this.closed = false; } - private static tokenizeQuery(originalQuery: string): string[] { - // Escape a single backtick to prevent interpreting the start of a template literal. - const query = originalQuery.replace(/`/g, "\\`"); - - let tokenStart = 0; - const tokens: string[] = []; - let inString = false; - let i: number; - - function appendToken() { - if (i - tokenStart > 0) { - let token: string; - if (inString) { - // Extract the token and unescape quotes - token = query.substring(tokenStart, i).replace(/''/g, "'"); - - // Extract the leading type prefix, if any. - const stringStart = token.indexOf("'"); - const typePrefix = token.substring(0, stringStart); - const backtickString = - "`" + token.substring(typePrefix.length + 1) + "`"; - - // Remove the GUID type prefix since we compare these as strings - if (typePrefix === "guid") { - token = backtickString; - } else { - token = typePrefix + backtickString; - } + /** + * Loads the DB from disk + * + * @private + * @memberof LokiTableMetadataStore + */ + private async loadDB() { + await new Promise((resolve, reject) => { + stat(this.lokiDBPath, (statError, stats) => { + if (!statError) { + this.db.loadDatabase({}, (dbError) => { + if (dbError) { + reject(dbError); + } else { + resolve(); + } + }); } else { - token = convertToken(query.substring(tokenStart, i)); + // when DB file doesn't exist, ignore the error because following will re-create the file + resolve(); } + }); + }); + } - if (token) { - tokens.push(token); + private async saveDBState() { + await new Promise((resolve, reject) => { + this.db.saveDatabase((err) => { + if (err) { + reject(err); + } else { + resolve(); } - } - tokenStart = i + 1; - } + }); + }); + } - function convertToken(token: string): string { - switch (token) { - case "TableName": - return "name"; - case "eq": - return "==="; - case "gt": - return ">"; - case "ge": - return ">="; - case "lt": - return "<"; - case "le": - return "<="; - case "ne": - return "!=="; - case "and": - return "&&"; - case "or": - return "||"; - case "not": - return "!"; - default: - return token; - } + /** + * Creates the Service Properties collection if it does not exist + * + * @private + * @memberof LokiTableMetadataStore + */ + private createServicePropsCollection() { + let servicePropertiesColl = this.db.getCollection(this.SERVICES_COLLECTION); + if (servicePropertiesColl === null) { + servicePropertiesColl = this.db.addCollection(this.SERVICES_COLLECTION, { + unique: ["accountName"] + }); } + } - for (i = 0; i < query.length; i++) { - if (inString) { - // Look for a double quote, inside of a string. - if (i < query.length - 1 && query[i] === "'" && query[i + 1] === "'") { - i++; - continue; - } else if (query[i] === "'") { - appendToken(); - inString = false; - } - } else if (query[i] === "(" || query[i] === ")") { - if ( - (i !== 0 && - (query[i - 1].match(/\S/) !== null || - (i >= 5 && query.slice(i - 5, i) === " true") || - (i >= 6 && query.slice(i - 6, i) === " false"))) || - query.substring(tokenStart, i).match(/\b[0-9]+L\b/g) != null - ) { - // this is needed if query does not contain whitespace between number token / boolean and paren - appendToken(); - } - i--; - appendToken(); - i++; - tokens.push(query[i]); - tokenStart++; - } else if (/\s/.test(query[i])) { - appendToken(); - } else if (query[i] === "'") { - inString = true; - } + /** + * Creates the tables collection if it does not exist + * + * @private + * @memberof LokiTableMetadataStore + */ + private createTablesCollection() { + if (this.db.getCollection(this.TABLES_COLLECTION) === null) { + this.db.addCollection(this.TABLES_COLLECTION, { + // Optimization for indexing and searching + // https://rawgit.com/techfort/LokiJS/master/jsdoc/tutorial-Indexing%20and%20Query%20performance.html + indices: ["account", "table"] + }); } - - appendToken(); - - return tokens; } /** - * @param query Query Tables $query string. + * Create a collection to represent the table using a unique string. + * This optimizes using an index for find operations. + * + * @private + * @param {Table} tableModel + * @memberof LokiTableMetadataStore */ - private generateQueryTableWhereFunction( - query: string | undefined - ): (entity: Table) => boolean { - if (query === undefined) { - return () => true; + private createCollectionForTable(tableModel: Table) { + const tableCollectionName = this.getTableCollectionName( + tableModel.account, + tableModel.table + ); + const extentColl = this.db.getCollection(tableCollectionName); + if (extentColl) { + this.db.removeCollection(tableCollectionName); } - const transformedQuery = LokiTableMetadataStore.transformTableQuery(query); + this.db.addCollection(tableCollectionName, { + // Optimization for indexing and searching + // https://rawgit.com/techfort/LokiJS/master/jsdoc/tutorial-Indexing%20and%20Query%20performance.html + indices: ["PartitionKey", "RowKey"] + }); + } - // tslint:disable-next-line: no-console - // console.log(query); - // tslint:disable-next-line: no-console - // console.log(transformedQuery); + /** + * Throws an exception if a table exists + * + * @private + * @param {Collection} coll + * @param {Table} tableModel + * @param {Context} context + * @memberof LokiTableMetadataStore + */ + private checkIfTableExists( + coll: Collection, + tableModel: Table, + context: Context + ) { + const doc = coll.findOne({ + account: tableModel.account, + table: { $regex: [String.raw`\b${tableModel.table}\b`, "i"] } + }); - return new Function("item", transformedQuery) as any; + // If the metadata exists, we will throw getTableAlreadyExists error + if (doc) { + throw StorageErrorFactory.getTableAlreadyExists(context); + } } /** - * Azurite V2 query tables implementation. + * With throw a storage exception if resource not found. + * + * @private + * @param {*} doc + * @param {Context} context + * @memberof LokiTableMetadataStore */ - public static transformTableQuery(query: string): string { - const systemProperties: Map = new Map([ - ["name", "table"] - ]); - const allowCustomProperties = false; - - return LokiTableMetadataStore.transformQuery( - query, - systemProperties, - allowCustomProperties - ); + private checkIfResourceExists(doc: any, context: Context) { + if (!doc) { + throw StorageErrorFactory.ResourceNotFound(context); + } } /** - * @param query Query Enties $query string. + * Removes a table collection and index when deleting a table. + * + * @private + * @param {string} account + * @param {*} doc + * @memberof LokiTableMetadataStore */ - private generateQueryEntityWhereFunction( - query: string | undefined - ): (entity: Entity) => boolean { - if (query === undefined) { - return () => true; + private removeTableCollection(account: string, doc: any) { + const tableCollectionName = this.getTableCollectionName(account, doc.table); + const tableEntityCollection = this.db.getCollection(tableCollectionName); + if (tableEntityCollection) { + this.db.removeCollection(tableCollectionName); } - - const transformedQuery = LokiTableMetadataStore.transformEntityQuery(query); - - return new Function("item", transformedQuery) as any; } /** - * Azurite V2 query entities implementation as temporary workaround before new refactored implementation of querying. - * TODO: Handle query types + * Gets the collection of entites for a specific table. + * Ensures that table name is case insensitive. + * + * @private + * @param {string} account + * @param {string} table + * @param {Context} context + * @return {*} {Collection} + * @memberof LokiTableMetadataStore */ - public static transformEntityQuery(query: string): string { - const systemProperties: Map = new Map([ - ["PartitionKey", "PartitionKey"], - ["RowKey", "RowKey"] - ]); - const allowCustomProperties = true; - - return LokiTableMetadataStore.transformQuery( - query, - systemProperties, - allowCustomProperties + private getEntityCollection( + account: string, + table: string, + context: Context + ): Collection { + let tableEntityCollection = this.db.getCollection( + this.getTableCollectionName(account, table.toLowerCase()) ); + if (!tableEntityCollection) { + // this is to avoid a breaking change for users of persisted storage + tableEntityCollection = this.db.getCollection( + this.getTableCollectionName(account, table) + ); + if (!tableEntityCollection) { + throw StorageErrorFactory.getTableNotExist(context); + } + } + return tableEntityCollection; } - private static transformQuery( - query: string, - systemProperties: Map, - allowCustomProperties: boolean - ): string { - // If a token is neither a number, nor a boolean, nor a string enclosed with quotation marks it is an operand. - // Operands are attributes of the object used within the where clause of LokiJS, thus we need to prepend each - // attribute with an object identifier 'item.attribs'. - let transformedQuery = "return ( "; - let isOp = false; - let previousIsOp = false; - const tokens = LokiTableMetadataStore.tokenizeQuery(query); - - const tokenTuples: TokenTuple[] = []; - for (const token of tokens) { - tokenTuples.push([token, TokenType.Unknown]); + private trackRollback(batchId: string, doc: Entity) { + if (batchId !== "") { + this.transactionRollbackTheseEntities.push(doc); } - let counter = -1; - for (const token of tokenTuples) { - counter++; - if (token[0] === "") { - continue; - } - if (token[0].match(/\b\d+/)) { - token[1] = TokenType.Value; - } - previousIsOp = isOp; - isOp = ["===", ">", ">=", "<", "<=", "!=="].includes(token[0]); - if (isOp) { - token[1] = TokenType.LogicalOp; - } - if ([")", "("].includes(token[0])) { - token[1] = TokenType.Parens; - } - if (["&&", "||"].includes(token[0])) { - token[1] = TokenType.Comparisson; - } - if (["`", "'", '"'].includes(token[0].charAt(0))) { - token[1] = TokenType.Value; - } - if ( - !token[0].match(/\b\d+/) && - token[0] !== "true" && - token[0] !== "false" && - !token[0].includes("`") && - ![ - "===", - ">", - ">=", - "<", - "<=", - "!==", - "&&", - "||", - "!", - "(", - ")" - ].includes(token[0]) - ) { - if (systemProperties.has(token[0])) { - transformedQuery += `item.${systemProperties.get(token[0])} `; - token[1] = TokenType.Identifier; - } else if (allowCustomProperties) { - // Datetime compare - if ( - counter + 2 <= tokens.length - 1 && - tokens[counter + 2].startsWith("datetime") - ) { - transformedQuery += `new Date(item.properties.${token[0]}).getTime() `; - token[1] = TokenType.Identifier; - } else { - transformedQuery += `item.properties.${token[0]} `; - token[1] = TokenType.Identifier; - } - } else { - throw Error( - "Custom properties are not supported on this query type." - ); - } - } else { - // Remove "L" from long int - // 2039283L ==> 2039283 - const matchLongInt = token[0].match(/\b[0-9]*L\b/g); - if ( - previousIsOp && - matchLongInt !== null && - matchLongInt.length === 1 - ) { - const newtoken = token[0].slice(0, token[0].length - 1); - // however, as long int is stored as string, we need to add inverted commas - token[0] = "'" + newtoken + "'"; - token[1] = TokenType.Value; - } else if (previousIsOp && token[0].startsWith("datetime")) { - token[0] = token[0].replace(/\bdatetime\b/g, ""); - token[0] = `new Date(${token[0]}).getTime()`; - token[1] = TokenType.Value; - } else if ( - previousIsOp && - (token[0].startsWith("X") || token[0].startsWith("binary")) - ) { - throw Error("Binary filter is not supported yet."); - } + } - transformedQuery += `${token[0]} `; - } + private checkIfMatchPrecondition( + etag: string, + doc: Entity, + context: Context + ) { + if (etag !== "*" && doc.eTag !== etag) { + throw StorageErrorFactory.getPreconditionFailed(context); } - transformedQuery += ")"; - - // we need to validate that the filter has some valide predicate logic - // simply we check if we have sequence identifier > op > value through the tokens - validatePredicateSequence(tokenTuples); + } - return transformedQuery; + private checkForMissingEntity(doc: Entity, context: Context) { + if (!doc) { + throw StorageErrorFactory.getEntityNotFound(context); + } } - /** - * Get service properties for specific storage account. - * - * @param {string} account - * @returns {Promise} - * @memberof LokiBlobMetadataStore - */ - public async getServiceProperties( - context: Context, - account: string - ): Promise { - const coll = this.db.getCollection(this.SERVICES_COLLECTION); - if (coll) { - const doc = coll.by("accountName", account); - return doc ? doc : undefined; + private getMaxResultsOption(queryOptions: Models.QueryOptions) { + if ( + undefined === queryOptions.top || + null === queryOptions.top || + QUERY_RESULT_MAX_NUM < queryOptions.top + ) { + return QUERY_RESULT_MAX_NUM; } - return undefined; + return queryOptions.top; } /** - * Update table service properties. - * THis will create service properties if they do not exist in the persistence layer. + * Adjusts the query result for the max results specified in top parameter * - * TODO: Account's service property should be created when storage account is created or metadata - * storage initialization. This method should only be responsible for updating existing record. - * In this way, we can reduce one I/O call to get account properties. - * - * @param {ServicePropertiesModel} serviceProperties - * @returns {Promise} undefined properties will be ignored during properties setup - * @memberof LokiBlobMetadataStore + * @private + * @param {any[]} result + * @param {number} maxResults + * @param {*} nextPartitionKeyResponse + * @param {*} nextRowKeyResponse + * @return {*} + * @memberof LokiTableMetadataStore */ - public async setServiceProperties( - context: Context, - serviceProperties: ServicePropertiesModel - ): Promise { - const coll = this.db.getCollection(this.SERVICES_COLLECTION); - const doc = coll.by("accountName", serviceProperties.accountName); + private adjustQueryResultforTop(result: any[], maxResults: number) { + let nextPartitionKeyResponse: string | undefined; + let nextRowKeyResponse: string | undefined; + if (result.length > maxResults) { + const tail = result.pop(); + nextPartitionKeyResponse = this.encodeContinuationHeader( + tail.PartitionKey + ); + nextRowKeyResponse = this.encodeContinuationHeader(tail.RowKey); + } + return { nextPartitionKeyResponse, nextRowKeyResponse } as const; + } - if (doc) { - doc.cors = - serviceProperties.cors === undefined - ? doc.cors - : serviceProperties.cors; + private decodeContinuationHeader(input?: string) { + if (input !== undefined) { + return Buffer.from(input, "base64").toString("utf8"); + } + } - doc.hourMetrics = - serviceProperties.hourMetrics === undefined - ? doc.hourMetrics - : serviceProperties.hourMetrics; + private encodeContinuationHeader(input?: string) { + if (input !== undefined) { + return Buffer.from(input, "utf8").toString("base64"); + } + } - doc.logging = - serviceProperties.logging === undefined - ? doc.logging - : serviceProperties.logging; + private async updateTableEntity( + context: Context, + table: string, + account: string, + entity: Entity, + ifMatch?: string, + batchId?: string + ): Promise { + const tableEntityCollection = this.getEntityCollection( + account, + table, + context + ); - doc.minuteMetrics = - serviceProperties.minuteMetrics === undefined - ? doc.minuteMetrics - : serviceProperties.minuteMetrics; + const doc = tableEntityCollection.findOne({ + PartitionKey: entity.PartitionKey, + RowKey: entity.RowKey + }) as Entity; - return coll.update(doc); - } else { - return coll.insert(serviceProperties); + if (!doc) { + throw StorageErrorFactory.getEntityNotFound(context); + } + if (batchId !== "") { + this.transactionRollbackTheseEntities.push(doc); } - } - public async beginBatchTransaction(batchId: string): Promise { - // instead of copying all entities / rows in the collection, - // we shall just backup those rows that we change - // Keeping the batchId in the interface to allow logging scenarios to extend + // Test if etag value is valid + const encodedEtag = this.encodeIfMatch(doc.eTag); + let encodedIfMatch: string | undefined; + if (ifMatch !== undefined) { + encodedIfMatch = this.encodeIfMatch(ifMatch); + } if ( - this.transactionRollbackTheseEntities.length > 0 || - this.transactionDeleteTheseEntities.length > 0 + encodedIfMatch === undefined || + encodedIfMatch === "*" || + (encodedIfMatch !== undefined && encodedEtag === encodedIfMatch) ) { - throw new Error("Transaction Overlapp!"); + tableEntityCollection.remove(doc); + + entity.properties.Timestamp = entity.lastModifiedTime; + entity.properties["Timestamp@odata.type"] = "Edm.DateTime"; + + tableEntityCollection.insert(entity); + return entity; } + + throw StorageErrorFactory.getPreconditionFailed(context); } - public async endBatchTransaction( - account: string, - table: string, - batchId: string, + private async mergeTableEntity( context: Context, - succeeded: boolean - ): Promise { - // rollback all changes in the case of failed batch transaction - if (!succeeded) { - const tableBatchCollection = this.db.getCollection( - this.getTableCollectionName(account, table) - ); - if (tableBatchCollection) { - // for entities deleted or modified - for (const entity of this.transactionRollbackTheseEntities) { - const copiedEntity: Entity = { - PartitionKey: entity.PartitionKey, - RowKey: entity.RowKey, - properties: entity.properties, - lastModifiedTime: entity.lastModifiedTime, - eTag: entity.eTag - }; - // lokijs applies this insert as an upsert - const doc = tableBatchCollection.findOne({ - PartitionKey: entity.PartitionKey, - RowKey: entity.RowKey - }); - // we can't rely on upsert behavior if documents already exist - if (doc) { - tableBatchCollection.remove(doc); - } - tableBatchCollection.insert(copiedEntity); + table: string, + account: string, + entity: Entity, + ifMatch?: string, + batchId?: string + ): Promise { + const tableEntityCollection = this.getEntityCollection( + account, + table, + context + ); + + const doc = tableEntityCollection.findOne({ + PartitionKey: entity.PartitionKey, + RowKey: entity.RowKey + }) as Entity; + + if (!doc) { + throw StorageErrorFactory.getEntityNotFound(context); + } + if (batchId !== "") { + this.transactionRollbackTheseEntities.push(doc); + } + + // if match is URL encoded from the clients, match URL encoding + // this does not always seem to be consistent... + const encodedEtag = this.encodeIfMatch(doc.eTag); + let encodedIfMatch: string | undefined; + encodedIfMatch = this.encodeIfMatch(ifMatch); + + if ( + encodedIfMatch === undefined || + encodedIfMatch === "*" || + (encodedIfMatch !== undefined && encodedEtag === encodedIfMatch) + ) { + const mergedDEntity: Entity = { + ...doc, + ...entity, + properties: { + ...doc.properties + // ...entity.properties } + }; + + // Merge inner properties + for (const key in entity.properties) { + if (Object.prototype.hasOwnProperty.call(entity.properties, key)) { + if (key.endsWith(ODATA_TYPE)) { + continue; + } + + const value = entity.properties[key]; + mergedDEntity.properties[key] = value; - // for entities added to the collection - for (const deleteRow of this.transactionDeleteTheseEntities) { - tableBatchCollection.remove(deleteRow); + this.filterOdataMetaData(entity, key, mergedDEntity); } } + + tableEntityCollection.update(mergedDEntity); + return mergedDEntity; } - // reset entity rollback trackers - this.transactionRollbackTheseEntities = []; - this.transactionDeleteTheseEntities = []; + throw StorageErrorFactory.getPreconditionFailed(context); } -} -/** - * Checks that a filter expression conforms to a minimum predicate - * style logic. - * It is easier to follow the predicate test logic like this than to - * manage a state machine during the creation of the query function. - * Should we continue to have to support more complex query validation - * we shall implement a query validation state machine. - * - * @param {string[]} tokens - */ -function validatePredicateSequence(tokens: TokenTuple[]) { - if (tokens.length < 3) { - throw Error("Invalid filter string detected!"); - } - let foundPredicate: boolean = false; - let state: TokenType = TokenType.Unknown; - let lastState: TokenType = tokens[0][1]; - // base case for duplicated token types - for (let i = 1; i < tokens.length; i++) { - state = tokens[i][1]; - if (state === TokenType.LogicalOp) { - foundPredicate = true; - } - if ( - state !== TokenType.Unknown && - state !== TokenType.Parens && - state === lastState - ) { - throw Error("Invalid filter string detected!"); + private filterOdataMetaData( + entity: Entity, + key: string, + mergedDEntity: Entity + ) { + if (entity.properties[`${key}${ODATA_TYPE}`] !== undefined) { + mergedDEntity.properties[`${key}${ODATA_TYPE}`] = + entity.properties[`${key}${ODATA_TYPE}`]; + } else { + delete mergedDEntity.properties[`${key}${ODATA_TYPE}`]; } - if (lastState === TokenType.Comparisson && state === TokenType.Value) { - throw Error("Invalid token after comparisson operator"); + } + + private encodeIfMatch(ifMatch: string | undefined): string | undefined { + let encodeIfMatch: string | undefined; + if (ifMatch !== undefined) { + encodeIfMatch = ifMatch!.replace(":", "%3A").replace(":", "%3A"); } - if ( - lastState === TokenType.Value && - state !== TokenType.Unknown && - state !== TokenType.Parens && - state !== TokenType.Comparisson - ) { - throw Error("Invalid token after value"); + return encodeIfMatch; + } + + private getTableCollectionName(account: string, table: string): string { + return `${account}$${table}`; + } + + /** + * Rolls back changes for deleted or modified entities + * + * @private + * @param {Collection} tableBatchCollection + * @memberof LokiTableMetadataStore + */ + private rollbackEntityChanges(tableBatchCollection: Collection) { + for (const entity of this.transactionRollbackTheseEntities) { + const copiedEntity: Entity = { + PartitionKey: entity.PartitionKey, + RowKey: entity.RowKey, + properties: entity.properties, + lastModifiedTime: entity.lastModifiedTime, + eTag: entity.eTag + }; + // lokijs applies this insert as an upsert + const doc = tableBatchCollection.findOne({ + PartitionKey: entity.PartitionKey, + RowKey: entity.RowKey + }); + // we can't rely on upsert behavior if documents already exist + if (doc) { + tableBatchCollection.remove(doc); + } + tableBatchCollection.insert(copiedEntity); } - lastState = state; } - if (foundPredicate === false) { - throw Error("No predicate clause found"); + + /** + * Removes entities added to the batch collection + * + * @private + * @param {Collection} tableBatchCollection + * @memberof LokiTableMetadataStore + */ + private removeEntitiesAddedInBatch(tableBatchCollection: Collection) { + for (const deleteRow of this.transactionDeleteTheseEntities) { + tableBatchCollection.remove(deleteRow); + } } } diff --git a/src/table/persistence/LokiTableStoreQueryGenerator.ts b/src/table/persistence/LokiTableStoreQueryGenerator.ts new file mode 100644 index 000000000..f86ccf42f --- /dev/null +++ b/src/table/persistence/LokiTableStoreQueryGenerator.ts @@ -0,0 +1,103 @@ +import StorageErrorFactory from "../errors/StorageErrorFactory"; +import { Entity, Table } from "./ITableMetadataStore"; +import Context from "../generated/Context"; +import * as Models from "../generated/artifacts/models"; +import LokiJsQueryTranscriberFactory from "./QueryTranscriber/LokiJsQueryTranscriberFactory"; + +/** + * Handles Query Logic For LokiJs Table Implementation + * + * @export + * @class LokiTableStoreQueryGenerator + */ +export default class LokiTableStoreQueryGenerator { + /** + * Will throw an exception on invalid query syntax + * + * @param queryOptions + * @param context + * @returns (entity: Entity) => boolean + */ + public static generateQueryForPersistenceLayer( + queryOptions: Models.QueryOptions, + context: Context + ): (entity: Entity) => boolean { + let queryWhere; + try { + queryWhere = + LokiTableStoreQueryGenerator.generateQueryEntityWhereFunction( + queryOptions.filter + ); + } catch (e) { + throw StorageErrorFactory.getQueryConditionInvalid(context); + } + return queryWhere; + } + + /** + * Generates the table query function + * + * @static + * @param {(string | undefined)} query + * @return {*} {(entity: Table) => boolean} + * @memberof LokiTableStoreQueryGenerator + */ + public static generateQueryTableWhereFunction( + query: string | undefined + ): (entity: Table) => boolean { + if (query === undefined) { + return () => true; + } + + const transformedQuery = + LokiTableStoreQueryGenerator.transformTableQuery(query); + + return new Function("item", transformedQuery) as any; + } + + /** + * generates a table query for the Loki Js table store + * + * @static + * @param {string} query + * @return {*} {string} + * @memberof LokiTableStoreQueryGenerator + */ + public static transformTableQuery(query: string): string { + const queryTranscriber = + LokiJsQueryTranscriberFactory.createTableQueryTranscriber( + query, + "lokiJsTableQueryTranscriber" + ); + + queryTranscriber.transcribe(); + + return queryTranscriber.getTranscribedQuery(); + } + + /** + * generates an entity query for the Loki Js table store + * + * @static + * @param {(string | undefined)} query + * @return {*} {(entity: Entity) => boolean} + * @memberof LokiTableStoreQueryGenerator + */ + private static generateQueryEntityWhereFunction( + query: string | undefined + ): (entity: Entity) => boolean { + if (query === undefined) { + return () => true; + } + + const queryTranscriber = + LokiJsQueryTranscriberFactory.createEntityQueryTranscriber( + query, + "lokiJsQueryTranscriber" + ); + + queryTranscriber.transcribe(); + + return new Function("item", queryTranscriber.getTranscribedQuery()) as any; + } +} diff --git a/src/table/persistence/QueryTranscriber/IQPState.ts b/src/table/persistence/QueryTranscriber/IQPState.ts new file mode 100644 index 000000000..d466cce7d --- /dev/null +++ b/src/table/persistence/QueryTranscriber/IQPState.ts @@ -0,0 +1,14 @@ +import QueryContext from "./QueryContext"; +import { QueryStateName } from "./QueryStateName"; + +/** + * Interface for Query Predicate State + * + * @export + * @interface IQPState + */ +export default interface IQPState { + name: QueryStateName; + onProcess: (context: QueryContext) => QueryContext; + onExit: (context: QueryContext) => QueryContext; +} diff --git a/src/table/persistence/QueryTranscriber/LokiJsQueryTranscriber.ts b/src/table/persistence/QueryTranscriber/LokiJsQueryTranscriber.ts new file mode 100644 index 000000000..2e77b0d70 --- /dev/null +++ b/src/table/persistence/QueryTranscriber/LokiJsQueryTranscriber.ts @@ -0,0 +1,26 @@ +import QueryContext from "./QueryContext"; +import { QueryStateName } from "./QueryStateName"; +import QueryTranscriber from "./QueryTranscriber"; + +/** + * provides a facade over the QueryTranscriber to hide state + * implementation from callers + * + * @export + * @class LokiJsQueryTranscriber + * @extends {QueryTranscriber} + */ +export default class LokiJsQueryTranscriber extends QueryTranscriber { + constructor(queryContext: QueryContext, name: string) { + super(queryContext, name); + } + + /** + * Starts the statemachine without the need to know what states were used + * + * @memberof LokiJsQueryTranscriber + */ + public transcribe() { + this.setState(QueryStateName.QueryStarted); + } +} diff --git a/src/table/persistence/QueryTranscriber/LokiJsQueryTranscriberFactory.ts b/src/table/persistence/QueryTranscriber/LokiJsQueryTranscriberFactory.ts new file mode 100644 index 000000000..bdc220408 --- /dev/null +++ b/src/table/persistence/QueryTranscriber/LokiJsQueryTranscriberFactory.ts @@ -0,0 +1,93 @@ +import QueryContext from "./QueryContext"; +import { QueryStateName } from "./QueryStateName"; +import StatePredicateFinished from "./StatePredicateFinished"; +import StatePredicateStarted from "./StatePredicateStarted"; +import StateProcessIdentifier from "./StateProcessIdentifier"; +import StateProcessOperator from "./StateProcessOperator"; +import StateProcessValue from "./StateProcessValue"; +import StateQueryFinished from "./StateQueryFinished"; +import StateQueryStarted from "./StateQueryStarted"; +import LokiJsQueryTranscriber from "./LokiJsQueryTranscriber"; +import StateProcessPredicateOperator from "./StateProcessPredicateOperator"; +import StateProcessParensOpen from "./StateProcessParensOpen"; +import StateProcessParensClose from "./StateProcessParensClose"; + +export default class LokiJsQueryTranscriberFactory { + public static createEntityQueryTranscriber( + queryString: string, + name: string = "entity query transcriber" + ): LokiJsQueryTranscriber { + // initializes the data state for the query transcriber state machine + const queryContext = new QueryContext(queryString); + const transcriber = new LokiJsQueryTranscriber(queryContext, name); + + // Add the states to the transcriber. + transcriber.addState(QueryStateName.QueryStarted, new StateQueryStarted()); + transcriber.addState( + QueryStateName.ProcessParensOpen, + new StateProcessParensOpen() + ); + transcriber.addState( + QueryStateName.ProcessParensClose, + new StateProcessParensClose() + ); + transcriber.addState( + QueryStateName.PredicateStarted, + new StatePredicateStarted() + ); + transcriber.addState( + QueryStateName.ProcessIdentifier, + new StateProcessIdentifier() + ); + transcriber.addState( + QueryStateName.ProcessOperator, + new StateProcessOperator() + ); + transcriber.addState( + QueryStateName.ProcessPredicateOperator, + new StateProcessPredicateOperator() + ); + transcriber.addState(QueryStateName.ProcessValue, new StateProcessValue()); + transcriber.addState( + QueryStateName.PredicateFinished, + new StatePredicateFinished() + ); + transcriber.addState( + QueryStateName.QueryFinished, + new StateQueryFinished() + ); + + return transcriber; + } + + // ToDo: need to observe system props and not allow custom props + public static createTableQueryTranscriber( + queryString: string, + name: string = "table query transcriber" + ): LokiJsQueryTranscriber { + // initializes the data state for the query transcriber state machine + const queryContext = new QueryContext(queryString, true); + const transcriber = new LokiJsQueryTranscriber(queryContext, name); + + // Add the states to the transcriber. + transcriber + .addState(QueryStateName.QueryStarted, new StateQueryStarted()) + .addState(QueryStateName.ProcessParensOpen, new StateProcessParensOpen()) + .addState( + QueryStateName.ProcessParensClose, + new StateProcessParensClose() + ) + .addState(QueryStateName.PredicateStarted, new StatePredicateStarted()) + .addState(QueryStateName.ProcessIdentifier, new StateProcessIdentifier()) + .addState(QueryStateName.ProcessOperator, new StateProcessOperator()) + .addState( + QueryStateName.ProcessPredicateOperator, + new StateProcessPredicateOperator() + ) + .addState(QueryStateName.ProcessValue, new StateProcessValue()) + .addState(QueryStateName.PredicateFinished, new StatePredicateFinished()) + .addState(QueryStateName.QueryFinished, new StateQueryFinished()); + + return transcriber; + } +} diff --git a/src/table/persistence/QueryTranscriber/PredicateModel/BinaryPredicate.ts b/src/table/persistence/QueryTranscriber/PredicateModel/BinaryPredicate.ts new file mode 100644 index 000000000..cd0f3e7d2 --- /dev/null +++ b/src/table/persistence/QueryTranscriber/PredicateModel/BinaryPredicate.ts @@ -0,0 +1,99 @@ +import { TokenMap } from "./TokenMap"; +import IPredicate from "./IPredicate"; +import IdentifierToken from "../TokenModel/IdentifierToken"; +import TaggedToken from "../TokenModel/TaggedToken"; +import ValueToken from "../TokenModel/ValueToken"; + +export default class BinaryPredicate implements IPredicate { + tokenMap: TokenMap; + constructor(tokenMap: TokenMap) { + this.tokenMap = tokenMap; + } + + /** + * Converts a binary predicate for LokiJs filter + * + * @return {*} + * @memberof BinaryPredicate + */ + public convertPredicateForLokiJS() { + const newTokens: TaggedToken[] = []; + try { + this.tokenMap.tokens.forEach((taggedToken) => { + this.pushValue(taggedToken, newTokens); + this.pushIdentifier(taggedToken, newTokens); + this.pushOperator(taggedToken, newTokens); + }); + this.tokenMap.tokens = newTokens; + } catch (err) { + throw err; + } + + return this; + } + + /** + * Pushes value for boolean predicate + * + * @param {TaggedToken} taggedToken + * @param {TaggedToken[]} newTokens + * @memberof BooleanPredicate + */ + pushValue(taggedToken: TaggedToken, newTokens: TaggedToken[]) { + if (taggedToken.type.isValue()) { + // assumption is that we have a binary value which needs to be + // converted to base64 + // decision on type is made earlier so no additional check + const trim = this.getTrimLength(taggedToken.token); + const binaryString = taggedToken.token.slice( + trim, + taggedToken.token.length - 1 + ); + + const base64String = Buffer.from(binaryString, "hex").toString("base64"); + newTokens.push( + new TaggedToken("'" + base64String + "'", new ValueToken()) + ); + } + } + + getTrimLength(token: string): number { + if (token.match(/^X\'/) !== null) { + return 2; + } else if (token.match(/^binary\'/) !== null) { + return 7; + } + return 0; + } + + /** + * pushes identifier for boolean predicate + * + * @param {TaggedToken} taggedToken + * @param {TaggedToken[]} newTokens + * @memberof BooleanPredicate + */ + pushIdentifier(taggedToken: TaggedToken, newTokens: TaggedToken[]) { + if (taggedToken.type.isIdentifier()) { + newTokens.push( + new TaggedToken( + `item.properties.${taggedToken.token}`, + new IdentifierToken() + ) + ); + } + } + + /** + * pushes operator for boolean predicate + * + * @param {TaggedToken} taggedToken + * @param {TaggedToken[]} newTokens + * @memberof BooleanPredicate + */ + pushOperator(taggedToken: TaggedToken, newTokens: TaggedToken[]) { + if (taggedToken.type.isOperator()) { + newTokens.push(taggedToken); + } + } +} diff --git a/src/table/persistence/QueryTranscriber/PredicateModel/BooleanPredicate.ts b/src/table/persistence/QueryTranscriber/PredicateModel/BooleanPredicate.ts new file mode 100644 index 000000000..b98cf3beb --- /dev/null +++ b/src/table/persistence/QueryTranscriber/PredicateModel/BooleanPredicate.ts @@ -0,0 +1,75 @@ +import TaggedToken from "../TokenModel/TaggedToken"; +import { TokenMap } from "./TokenMap"; +import IdentifierToken from "../TokenModel/IdentifierToken"; +import ValueToken from "../TokenModel/ValueToken"; +import IPredicate from "./IPredicate"; + +export default class BooleanPredicate implements IPredicate { + tokenMap: TokenMap; + constructor(tokenMap: TokenMap) { + this.tokenMap = tokenMap; + } + + /** + * converts a boolean predicate for lokijs schema + * + * @return {*} + * @memberof BooleanPredicate + */ + public convertPredicateForLokiJS() { + const newTokens: TaggedToken[] = []; + + this.tokenMap.tokens.forEach((taggedToken) => { + this.pushValue(taggedToken, newTokens); + this.pushIdentifier(taggedToken, newTokens); + this.pushOperator(taggedToken, newTokens); + }); + this.tokenMap.tokens = newTokens; + + return this; + } + + /** + * Pushes value for boolean predicate + * + * @param {TaggedToken} taggedToken + * @param {TaggedToken[]} newTokens + * @memberof BooleanPredicate + */ + pushValue(taggedToken: TaggedToken, newTokens: TaggedToken[]) { + if (taggedToken.type.isValue()) { + newTokens.push(new TaggedToken(taggedToken.token, new ValueToken())); + } + } + + /** + * pushes identifier for boolean predicate + * + * @param {TaggedToken} taggedToken + * @param {TaggedToken[]} newTokens + * @memberof BooleanPredicate + */ + pushIdentifier(taggedToken: TaggedToken, newTokens: TaggedToken[]) { + if (taggedToken.type.isIdentifier()) { + newTokens.push( + new TaggedToken( + `item.properties.${taggedToken.token}`, + new IdentifierToken() + ) + ); + } + } + + /** + * pushes operator for boolean predicate + * + * @param {TaggedToken} taggedToken + * @param {TaggedToken[]} newTokens + * @memberof BooleanPredicate + */ + pushOperator(taggedToken: TaggedToken, newTokens: TaggedToken[]) { + if (taggedToken.type.isOperator()) { + newTokens.push(taggedToken); + } + } +} diff --git a/src/table/persistence/QueryTranscriber/PredicateModel/DatePredicate.ts b/src/table/persistence/QueryTranscriber/PredicateModel/DatePredicate.ts new file mode 100644 index 000000000..cf3783e11 --- /dev/null +++ b/src/table/persistence/QueryTranscriber/PredicateModel/DatePredicate.ts @@ -0,0 +1,82 @@ +import TaggedToken from "../TokenModel/TaggedToken"; +import { TokenMap } from "./TokenMap"; +import IdentifierToken from "../TokenModel/IdentifierToken"; +import ValueToken from "../TokenModel/ValueToken"; +import IPredicate from "./IPredicate"; + +export default class DatePredicate implements IPredicate { + tokenMap: TokenMap; + constructor(tokenMap: TokenMap) { + this.tokenMap = tokenMap; + } + + /** + * converts a datetime predicate for lokijs schema + * + * @return {*} + * @memberof DatePredicate + */ + public convertPredicateForLokiJS() { + const newTokens: TaggedToken[] = []; + + this.tokenMap.tokens.forEach((taggedToken) => { + this.pushValue(taggedToken, newTokens); + this.pushIdentifier(taggedToken, newTokens); + this.pushOperator(taggedToken, newTokens); + }); + this.tokenMap.tokens = newTokens; + + return this; + } + + /** + * pushes value for date predicate + * + * @param {TaggedToken} taggedToken + * @param {TaggedToken[]} newTokens + * @memberof DatePredicate + */ + pushValue(taggedToken: TaggedToken, newTokens: TaggedToken[]) { + if (taggedToken.type.isValue()) { + newTokens.push( + new TaggedToken( + "new Date(" + + taggedToken.token.substring(8, taggedToken.token.length) + + ").getTime()", + new ValueToken() + ) + ); + } + } + + /** + * pushes identifier in a date predicate + * + * @param {TaggedToken} taggedToken + * @param {TaggedToken[]} newTokens + * @memberof DatePredicate + */ + pushIdentifier(taggedToken: TaggedToken, newTokens: TaggedToken[]) { + if (taggedToken.type.isIdentifier()) { + newTokens.push( + new TaggedToken( + `new Date(item.properties.${taggedToken.token}).getTime()`, + new IdentifierToken() + ) + ); + } + } + + /** + * Pushes operator in a date predicate + * + * @param {TaggedToken} taggedToken + * @param {TaggedToken[]} newTokens + * @memberof DatePredicate + */ + pushOperator(taggedToken: TaggedToken, newTokens: TaggedToken[]) { + if (taggedToken.type.isOperator()) { + newTokens.push(taggedToken); + } + } +} diff --git a/src/table/persistence/QueryTranscriber/PredicateModel/DoublePredicate.ts b/src/table/persistence/QueryTranscriber/PredicateModel/DoublePredicate.ts new file mode 100644 index 000000000..76d8e065e --- /dev/null +++ b/src/table/persistence/QueryTranscriber/PredicateModel/DoublePredicate.ts @@ -0,0 +1,75 @@ +import TaggedToken from "../TokenModel/TaggedToken"; +import { TokenMap } from "./TokenMap"; +import IdentifierToken from "../TokenModel/IdentifierToken"; +import ValueToken from "../TokenModel/ValueToken"; +import IPredicate from "./IPredicate"; + +export default class DoublePredicate implements IPredicate { + tokenMap: TokenMap; + constructor(tokenMap: TokenMap) { + this.tokenMap = tokenMap; + } + + /** + * converts a double predicate for lokijs schema + * + * @return {*} + * @memberof DoublePredicate + */ + public convertPredicateForLokiJS() { + const newTokens: TaggedToken[] = []; + + this.tokenMap.tokens.forEach((taggedToken) => { + this.pushValue(taggedToken, newTokens); + this.pushIdentifier(taggedToken, newTokens); + this.pushOperator(taggedToken, newTokens); + }); + this.tokenMap.tokens = newTokens; + + return this; + } + + /** + * pushes value for double predicate + * + * @param {TaggedToken} taggedToken + * @param {TaggedToken[]} newTokens + * @memberof DoublePredicate + */ + pushValue(taggedToken: TaggedToken, newTokens: TaggedToken[]) { + if (taggedToken.type.isValue()) { + newTokens.push(new TaggedToken(taggedToken.token, new ValueToken())); + } + } + + /** + * pushes identifier for double predicate + * + * @param {TaggedToken} taggedToken + * @param {TaggedToken[]} newTokens + * @memberof DoublePredicate + */ + pushIdentifier(taggedToken: TaggedToken, newTokens: TaggedToken[]) { + if (taggedToken.type.isIdentifier()) { + newTokens.push( + new TaggedToken( + `item.properties.${taggedToken.token}`, + new IdentifierToken() + ) + ); + } + } + + /** + * pushes operator for double predicate + * + * @param {TaggedToken} taggedToken + * @param {TaggedToken[]} newTokens + * @memberof DoublePredicate + */ + pushOperator(taggedToken: TaggedToken, newTokens: TaggedToken[]) { + if (taggedToken.type.isOperator()) { + newTokens.push(taggedToken); + } + } +} diff --git a/src/table/persistence/QueryTranscriber/PredicateModel/GuidPredicate.ts b/src/table/persistence/QueryTranscriber/PredicateModel/GuidPredicate.ts new file mode 100644 index 000000000..a95c85560 --- /dev/null +++ b/src/table/persistence/QueryTranscriber/PredicateModel/GuidPredicate.ts @@ -0,0 +1,145 @@ +import TaggedToken from "../TokenModel/TaggedToken"; +import { TokenMap } from "./TokenMap"; +import IdentifierToken from "../TokenModel/IdentifierToken"; +import OperatorToken from "../TokenModel/OperatorToken"; +import ParensCloseToken from "../TokenModel/ParensCloseToken"; +import ParensOpenToken from "../TokenModel/ParensOpenToken"; +import ValueToken from "../TokenModel/ValueToken"; +import IPredicate from "./IPredicate"; + +export default class GuidPredicate implements IPredicate { + tokenMap: TokenMap; + constructor(tokenMap: TokenMap) { + this.tokenMap = tokenMap; + } + + /** + * Converts a guid predicate for lokijs schema + * Guid predicate has special handling as we need to support + * older schema for the cases that database is not new before + * updating to new logic to differentiate between guid type + * and string type + * + * @return {*} + * @memberof GuidPredicate + */ + public convertPredicateForLokiJS() { + const newTokens: TaggedToken[] = []; + this.pushStringGuidPredicate(newTokens, this.tokenMap); + newTokens.push(new TaggedToken("||", new OperatorToken())); + this.pushBase64GuidPredicate(newTokens, this.tokenMap); + this.tokenMap.tokens = newTokens; + return this; + } + + /** + * new schema converts guids to base64 representation + * + * @private + * @param {TaggedToken[]} newTokens + * @param {TokenMap} taggedPredicate + * @memberof GuidPredicate + */ + private pushBase64GuidPredicate( + newTokens: TaggedToken[], + taggedPredicate: TokenMap + ) { + newTokens.push(new TaggedToken("(", new ParensOpenToken())); + taggedPredicate.tokens.forEach((taggedToken) => { + this.pushIdentifier(taggedToken, newTokens); + this.pushOperator(taggedToken, newTokens); + this.pushBase64Guid(taggedToken, newTokens); + }); + newTokens.push(new TaggedToken(")", new ParensCloseToken())); + } + + /** + * Pushes the base64 guid to the predicate + * + * @private + * @param {TaggedToken} taggedToken + * @param {TaggedToken[]} newTokens + * @memberof GuidPredicate + */ + private pushBase64Guid(taggedToken: TaggedToken, newTokens: TaggedToken[]) { + if (taggedToken.type.isValue()) { + const newToken = taggedToken.token.substring( + 5, + taggedToken.token.length - 1 + ); + const guidBuff = Buffer.from(newToken); + newTokens.push( + new TaggedToken(`'${guidBuff.toString("base64")}'`, new ValueToken()) + ); + } + } + + /** + * old schema guids used string representation + * + * @private + * @param {TaggedToken[]} newTokens + * @param {TokenMap} taggedPredicate + * @memberof GuidPredicate + */ + private pushStringGuidPredicate( + newTokens: TaggedToken[], + taggedPredicate: TokenMap + ) { + newTokens.push(new TaggedToken("(", new ParensOpenToken())); + taggedPredicate.tokens.forEach((taggedToken) => { + this.pushStringGuid(taggedToken, newTokens); + this.pushIdentifier(taggedToken, newTokens); + this.pushOperator(taggedToken, newTokens); + }); + newTokens.push(new TaggedToken(")", new ParensCloseToken())); + } + + /** + * Pushes the string guid to the predicate + * + * @private + * @param {TaggedToken} taggedToken + * @param {TaggedToken[]} newTokens + * @memberof GuidPredicate + */ + private pushStringGuid(taggedToken: TaggedToken, newTokens: TaggedToken[]) { + if (taggedToken.type.isValue()) { + const newToken = taggedToken.token.substring(4); + newTokens.push(new TaggedToken(newToken, new ValueToken())); + } + } + + /** + * Pushes the guid identifier to the predicate + * + * @private + * @param {TaggedToken} taggedToken + * @param {TaggedToken[]} newTokens + * @memberof GuidPredicate + */ + private pushIdentifier(taggedToken: TaggedToken, newTokens: TaggedToken[]) { + if (taggedToken.type.isIdentifier()) { + newTokens.push( + new TaggedToken( + `item.properties.${taggedToken.token}`, + new IdentifierToken() + ) + ); + } + } + + /** + * Pushes the operator to the guid predicate + * + * @private + * @param {TaggedToken} taggedToken + * @param {TaggedToken[]} newTokens + * @memberof GuidPredicate + */ + private pushOperator(taggedToken: TaggedToken, newTokens: TaggedToken[]) { + if (taggedToken.type.isOperator()) { + newTokens.push(taggedToken); + } + } +} diff --git a/src/table/persistence/QueryTranscriber/PredicateModel/IPredicate.ts b/src/table/persistence/QueryTranscriber/PredicateModel/IPredicate.ts new file mode 100644 index 000000000..48054b680 --- /dev/null +++ b/src/table/persistence/QueryTranscriber/PredicateModel/IPredicate.ts @@ -0,0 +1,13 @@ +import { TokenMap } from "./TokenMap"; + +/** + * Interface used with predicates to allow conversion + * to different database representation / schemas + * + * @export + * @interface IPredicate + */ +export default interface IPredicate { + convertPredicateForLokiJS(): IPredicate; + tokenMap: TokenMap; +} diff --git a/src/table/persistence/QueryTranscriber/PredicateModel/IntegerPredicate.ts b/src/table/persistence/QueryTranscriber/PredicateModel/IntegerPredicate.ts new file mode 100644 index 000000000..e6841b9e9 --- /dev/null +++ b/src/table/persistence/QueryTranscriber/PredicateModel/IntegerPredicate.ts @@ -0,0 +1,76 @@ +import TaggedToken from "../TokenModel/TaggedToken"; +import { TokenMap } from "./TokenMap"; +import IdentifierToken from "../TokenModel/IdentifierToken"; +import ValueToken from "../TokenModel/ValueToken"; +import IPredicate from "./IPredicate"; + +export default class IntegerPredicate implements IPredicate { + tokenMap: TokenMap; + constructor(tokenMap: TokenMap) { + this.tokenMap = tokenMap; + } + + /** + * Converts an integer predicate for lokijs schema + * + * @return {*} + * @memberof IntegerPredicate + */ + public convertPredicateForLokiJS() { + const newTokens: TaggedToken[] = []; + + this.tokenMap.tokens.forEach((taggedToken) => { + this.pushValue(taggedToken, newTokens); + this.pushIdentifier(taggedToken, newTokens); + this.pushOperator(taggedToken, newTokens); + }); + this.tokenMap.tokens = newTokens; + + return this; + } + + /** + * Pushes the value to the integer predicate + * + * @param {TaggedToken} taggedToken + * @param {TaggedToken[]} newTokens + * @memberof IntegerPredicate + */ + pushValue(taggedToken: TaggedToken, newTokens: TaggedToken[]) { + if (taggedToken.type.isValue()) { + newTokens.push(new TaggedToken(taggedToken.token, new ValueToken())); + } + } + + /** + * Pushes the identifier to the integer predicate + * + * @param {TaggedToken} taggedToken + * @param {TaggedToken[]} newTokens + * @memberof IntegerPredicate + */ + pushIdentifier(taggedToken: TaggedToken, newTokens: TaggedToken[]) { + if (taggedToken.type.isIdentifier()) { + newTokens.push( + new TaggedToken( + `item.properties.${taggedToken.token}`, + new IdentifierToken() + ) + ); + } + } + + /** + * Pushes the operator to the integer predicate + * + * @private + * @param {TaggedToken} taggedToken + * @param {TaggedToken[]} newTokens + * @memberof IntegerPredicate + */ + private pushOperator(taggedToken: TaggedToken, newTokens: TaggedToken[]) { + if (taggedToken.type.isOperator()) { + newTokens.push(taggedToken); + } + } +} diff --git a/src/table/persistence/QueryTranscriber/PredicateModel/LongPredicate.ts b/src/table/persistence/QueryTranscriber/PredicateModel/LongPredicate.ts new file mode 100644 index 000000000..d9a7d9896 --- /dev/null +++ b/src/table/persistence/QueryTranscriber/PredicateModel/LongPredicate.ts @@ -0,0 +1,83 @@ +import TaggedToken from "../TokenModel/TaggedToken"; +import { TokenMap } from "./TokenMap"; +import IdentifierToken from "../TokenModel/IdentifierToken"; +import ValueToken from "../TokenModel/ValueToken"; +import IPredicate from "./IPredicate"; + +export default class LongPredicate implements IPredicate { + tokenMap: TokenMap; + constructor(tokenMap: TokenMap) { + this.tokenMap = tokenMap; + } + + /** + * converts a long predicate for lokijs schema + * + * @return {*} + * @memberof LongPredicate + */ + public convertPredicateForLokiJS() { + const newTokens: TaggedToken[] = []; + + this.tokenMap.tokens.forEach((taggedToken) => { + this.pushValue(taggedToken, newTokens); + this.pushIdentifier(taggedToken, newTokens); + this.pushOperator(taggedToken, newTokens); + }); + this.tokenMap.tokens = newTokens; + + return this; + } + + /** + * pushes value for long predicate + * + * @param {TaggedToken} taggedToken + * @param {TaggedToken[]} newTokens + * @memberof LongPredicate + */ + pushValue(taggedToken: TaggedToken, newTokens: TaggedToken[]) { + if (taggedToken.type.isValue()) { + newTokens.push( + new TaggedToken( + "'" + + taggedToken.token.substring(0, taggedToken.token.length - 1) + + "'", + new ValueToken() + ) + ); + } + } + + /** + * pushes identifier for long predicate + * + * @param {TaggedToken} taggedToken + * @param {TaggedToken[]} newTokens + * @memberof LongPredicate + */ + pushIdentifier(taggedToken: TaggedToken, newTokens: TaggedToken[]) { + if (taggedToken.type.isIdentifier()) { + newTokens.push( + new TaggedToken( + `item.properties.${taggedToken.token}`, + new IdentifierToken() + ) + ); + } + } + + /** + * pushes operator for long predicate + * + * @private + * @param {TaggedToken} taggedToken + * @param {TaggedToken[]} newTokens + * @memberof LongPredicate + */ + private pushOperator(taggedToken: TaggedToken, newTokens: TaggedToken[]) { + if (taggedToken.type.isOperator()) { + newTokens.push(taggedToken); + } + } +} diff --git a/src/table/persistence/QueryTranscriber/PredicateModel/ParensClose.ts b/src/table/persistence/QueryTranscriber/PredicateModel/ParensClose.ts new file mode 100644 index 000000000..6e8f88f64 --- /dev/null +++ b/src/table/persistence/QueryTranscriber/PredicateModel/ParensClose.ts @@ -0,0 +1,19 @@ +import { TokenMap } from "./TokenMap"; +import IPredicate from "./IPredicate"; + +export default class ParensClose implements IPredicate { + tokenMap: TokenMap; + constructor(tokenMap: TokenMap) { + this.tokenMap = tokenMap; + } + + /** + * currently no special handling required + * + * @return {*} + * @memberof ParensClose + */ + public convertPredicateForLokiJS() { + return this; + } +} diff --git a/src/table/persistence/QueryTranscriber/PredicateModel/ParensOpen.ts b/src/table/persistence/QueryTranscriber/PredicateModel/ParensOpen.ts new file mode 100644 index 000000000..f9932a9cd --- /dev/null +++ b/src/table/persistence/QueryTranscriber/PredicateModel/ParensOpen.ts @@ -0,0 +1,19 @@ +import { TokenMap } from "./TokenMap"; +import IPredicate from "./IPredicate"; + +export default class ParensOpen implements IPredicate { + tokenMap: TokenMap; + constructor(tokenMap: TokenMap) { + this.tokenMap = tokenMap; + } + + /** + * currently no special handling required + * + * @return {*} + * @memberof ParensClose + */ + public convertPredicateForLokiJS() { + return this; + } +} diff --git a/src/table/persistence/QueryTranscriber/PredicateModel/PredicateOperator.ts b/src/table/persistence/QueryTranscriber/PredicateModel/PredicateOperator.ts new file mode 100644 index 000000000..1c1e9d04e --- /dev/null +++ b/src/table/persistence/QueryTranscriber/PredicateModel/PredicateOperator.ts @@ -0,0 +1,19 @@ +import { TokenMap } from "./TokenMap"; +import IPredicate from "./IPredicate"; + +export default class PredicateOperator implements IPredicate { + tokenMap: TokenMap; + constructor(tokenMap: TokenMap) { + this.tokenMap = tokenMap; + } + + /** + * currently no special handling required + * + * @return {*} + * @memberof PredicateOperator + */ + public convertPredicateForLokiJS() { + return this; + } +} diff --git a/src/table/persistence/QueryTranscriber/PredicateModel/StringPredicate.ts b/src/table/persistence/QueryTranscriber/PredicateModel/StringPredicate.ts new file mode 100644 index 000000000..b4e402f4a --- /dev/null +++ b/src/table/persistence/QueryTranscriber/PredicateModel/StringPredicate.ts @@ -0,0 +1,89 @@ +import TaggedToken from "../TokenModel/TaggedToken"; +import { TokenMap } from "./TokenMap"; +import IdentifierToken from "../TokenModel/IdentifierToken"; +import ValueToken from "../TokenModel/ValueToken"; +import IPredicate from "./IPredicate"; + +export default class StringPredicate implements IPredicate { + tokenMap: TokenMap; + constructor(tokenMap: TokenMap) { + this.tokenMap = tokenMap; + } + + /** + * converts a string predicate for lokijs schema + * + * @return {*} + * @memberof StringPredicate + */ + public convertPredicateForLokiJS() { + const newTokens: TaggedToken[] = []; + + this.tokenMap.tokens.forEach((taggedToken) => { + this.pushValue(taggedToken, newTokens); + this.pushIdentifier(taggedToken, newTokens); + this.pushOperator(taggedToken, newTokens); + }); + this.tokenMap.tokens = newTokens; + + return this; + } + + /** + * Pushes the value to the string predicate + * + * @private + * @param {TaggedToken} taggedToken + * @param {TaggedToken[]} newTokens + * @memberof StringPredicate + */ + private pushValue(taggedToken: TaggedToken, newTokens: TaggedToken[]) { + if (taggedToken.type.isValue()) { + newTokens.push(new TaggedToken(taggedToken.token, new ValueToken())); + } + } + + /** + * Pushes the identifier to the string predicate + * + * @private + * @param {TaggedToken} taggedToken + * @param {TaggedToken[]} newTokens + * @memberof StringPredicate + */ + private pushIdentifier(taggedToken: TaggedToken, newTokens: TaggedToken[]) { + if (taggedToken.type.isIdentifier()) { + const newToken = this.createStringIdentifierToken(taggedToken.token); + newTokens.push(newToken); + } + } + + /** + * handles the special case for "TableName" + * + * @param {string} token + * @return {*} + * @memberof StringPredicate + */ + createStringIdentifierToken(token: string) { + // asterisk is not allowed in an identifier + if (token.toLocaleLowerCase() === "**blena**") { + return new TaggedToken(`item.table`, new IdentifierToken()); + } + return new TaggedToken(`item.properties.${token}`, new IdentifierToken()); + } + + /** + * Pushes the operator to the string predicate + * + * @private + * @param {TaggedToken} taggedToken + * @param {TaggedToken[]} newTokens + * @memberof StringPredicate + */ + private pushOperator(taggedToken: TaggedToken, newTokens: TaggedToken[]) { + if (taggedToken.type.isOperator()) { + newTokens.push(taggedToken); + } + } +} diff --git a/src/table/persistence/QueryTranscriber/PredicateModel/TokenMap.ts b/src/table/persistence/QueryTranscriber/PredicateModel/TokenMap.ts new file mode 100644 index 000000000..10c23098f --- /dev/null +++ b/src/table/persistence/QueryTranscriber/PredicateModel/TokenMap.ts @@ -0,0 +1,15 @@ +import TaggedToken from "../TokenModel/TaggedToken"; + +/** + * Contains a map of the predicate with tagged tokens indicating + * their role in the predicate. + * + * @export + * @class TokenMap + */ +export class TokenMap { + public tokens: TaggedToken[] = []; + constructor(tokens: TaggedToken[] = []) { + this.tokens = tokens; + } +} diff --git a/src/table/persistence/QueryTranscriber/PredicateModel/UnknownPredicate.ts b/src/table/persistence/QueryTranscriber/PredicateModel/UnknownPredicate.ts new file mode 100644 index 000000000..dc2e305a3 --- /dev/null +++ b/src/table/persistence/QueryTranscriber/PredicateModel/UnknownPredicate.ts @@ -0,0 +1,19 @@ +import { TokenMap } from "./TokenMap"; +import IPredicate from "./IPredicate"; + +export default class UnknownPredicate implements IPredicate { + tokenMap: TokenMap; + constructor(tokenMap: TokenMap) { + this.tokenMap = tokenMap; + } + + /** + * currently no special handling required + * + * @return {*} + * @memberof ParensClose + */ + public convertPredicateForLokiJS() { + return this; + } +} diff --git a/src/table/persistence/QueryTranscriber/QPState.ts b/src/table/persistence/QueryTranscriber/QPState.ts new file mode 100644 index 000000000..2e9b6e2cd --- /dev/null +++ b/src/table/persistence/QueryTranscriber/QPState.ts @@ -0,0 +1,376 @@ +import QueryContext from "./QueryContext"; +import IQPState from "./IQPState"; +import { QueryStateName } from "./QueryStateName"; +import { TokenMap } from "./PredicateModel/TokenMap"; +import TaggedToken from "./TokenModel/TaggedToken"; +import ParensOpenToken from "./TokenModel/ParensOpenToken"; +import ParensCloseToken from "./TokenModel/ParensCloseToken"; +import ParensClose from "./PredicateModel/ParensClose"; +import ParensOpen from "./PredicateModel/ParensOpen"; +import UnknownPredicate from "./PredicateModel/UnknownPredicate"; +import PredicateOperator from "./PredicateModel/PredicateOperator"; + +export default class QPState implements IQPState { + name: QueryStateName = QueryStateName.None; + + onProcess(context: QueryContext): QueryContext { + return context; + } + + onExit(context: QueryContext): QueryContext { + return context; + } + + /** + * Processes the first opening parens of a query + * @param context + * @returns + */ + protected processOpeningParens( + context: QueryContext, + token: string + ): QueryContext { + if (token.match(/\(/) && context.currentPos === 0) { + const taggedToken: TaggedToken = new TaggedToken( + "(", + new ParensOpenToken() + ); + context.taggedPredicates.push( + new ParensOpen(new TokenMap([taggedToken])) + ); + context.currentPos += 1; + } + return context; + } + + /** + * Processes the closing parens on a query + * @param context + * @returns + */ + protected processClosingParens(context: QueryContext): QueryContext { + if (context.originalQuery.match(/^\)/)) { + const taggedToken: TaggedToken = new TaggedToken( + ")", + new ParensCloseToken() + ); + context.taggedPredicates.push( + new ParensClose(new TokenMap([taggedToken])) + ); + context.currentPos += 1; + } + return context; + } + + protected startofNextRelevantToken( + context: QueryContext + ): [QueryContext, number] { + let pos = context.currentPos; + let token = context.originalQuery[pos]; + let relevantTokenFound = false; + while (relevantTokenFound === false && pos < context.originalQuery.length) { + token = context.originalQuery[pos]; + switch (token) { + case " ": + pos += 1; + context.currentPos += 1; + break; + default: + relevantTokenFound = true; + break; + } + } + return [context, pos]; + } + + protected endOfToken(context: QueryContext, startPos: number): number { + if ( + context.originalQuery[startPos] === "(" || + context.originalQuery[startPos] === ")" + ) { + return startPos + 1; + } + let pos = startPos + 1; + let token = context.originalQuery[pos]; + let endTokenFound = false; + while (endTokenFound === false && pos < context.originalQuery.length) { + token = context.originalQuery[pos]; + switch (token) { + case " ": + endTokenFound = true; + break; + case "(": + endTokenFound = true; + break; + case ")": + endTokenFound = true; + break; + default: + pos += 1; + break; + } + } + if (pos > context.originalQuery.length) { + return context.originalQuery.length - 1; + } + return pos; + } + + /** + * Determines the next token. + * @param context + * @returns + */ + protected getNextToken(context: QueryContext): [QueryContext, string] { + // detmermine what the next token should be. + // logic: + // from current position in query string + // determine start if token: + let tokenStart: number; + [context, tokenStart] = this.startofNextRelevantToken(context); + // determine end: + const tokenEnd = this.endOfToken(context, tokenStart); + return this.validateToken(context, tokenStart, tokenEnd); + } + + protected validateToken( + context: QueryContext, + tokenStart: number, + tokenEnd: number + ): [QueryContext, string] { + if (tokenEnd > context.originalQuery.length) { + return [context, ""]; + } + return [context, context.originalQuery.slice(tokenStart, tokenEnd)]; + } + + isPredicateOperator(token: string): boolean { + let isOperator = true; + switch (token) { + case "and": + break; + case "or": + break; + case "not": + break; + default: + isOperator = false; + } + return isOperator; + } + + /** + * checks if the token matches what should be a value + * Does not validate that the value is using correct + * Syntax! + * + * @param {string} token + * @return {*} {boolean} + * @memberof QPState + */ + isValue(token: string): boolean { + const match = token.match( + /^true$|^false$|^-?\d+|^guid'|^'|^"|^X'|^binary'|^datetime'/ + ); + if (match !== null && match!.length > 0) { + return true; + } + return false; + } + + /** + * Checks is value matches correct Guid syntax + * + * @param {string} token + * @return {boolean} + * @memberof QPState + */ + isGuidValue(token: string): boolean { + const match = token.match( + /^guid'[A-Z0-9]{8}-([A-Z0-9]{4}-){3}[A-Z0-9]{12}'/gim + ); + if (match !== null && match!.length > 0) { + return true; + } + return false; + } + + /** + * Checks if token matches binary syntax + * + * @param {string} token + * @return {*} {boolean} + * @memberof QPState + */ + isBinaryValue(token: string): boolean { + const match = token.match(/^X'|^binary'/); + if (match !== null && match!.length > 0) { + return true; + } + return false; + } + + /** + * Checks if token matches Long value syntax + * + * @param {string} token + * @return {*} {boolean} + * @memberof QPState + */ + isLongValue(token: string): boolean { + const match = token.match(/^-?\d+\.?\d*L$/); + if (match !== null && match!.length > 0) { + return true; + } + return false; + } + + /** + * Checks if token matches integer value syntax + * + * @param {string} token + * @return {*} {boolean} + * @memberof QPState + */ + isIntegerValue(token: string): boolean { + const match = token.match(/^-?\d+$/); + if (match !== null && match!.length > 0) { + return true; + } + return false; + } + + /** + * Checks if token matches string value syntax + * + * @param {string} token + * @return {*} {boolean} + * @memberof QPState + */ + isStringValue(token: string): boolean { + const match = token.match(/^\'.*\'$|^\".*\"$/); + if (match !== null && match!.length > 0) { + return true; + } + return false; + } + + /** + * Checks if token matches Long value syntax + * + * @param {string} token + * @return {*} {boolean} + * @memberof QPState + */ + isDoubleValue(token: string): boolean { + const match = token.match(/^-?\d+\.+\d+$/); + if (match !== null && match!.length > 0) { + return true; + } + return false; + } + + /** + * Checks if token matches datetime value syntax + * + * @param {string} token + * @return {*} {boolean} + * @memberof QPState + */ + isDateValue(token: string): boolean { + const match = token.match(/^datetime'/); + if (match !== null && match!.length > 0) { + return true; + } + return false; + } + + /** + * Checks if token matches boolean value syntax + * + * @param {string} token + * @return {*} {boolean} + * @memberof QPState + */ + isBooleanValue(token: string): boolean { + const match = token.match(/^true$|^false$/); + if (match !== null && match!.length > 0) { + return true; + } + return false; + } + + /** + * Checks if token is an identifier + * + * @param {string} token + * @return {*} {boolean} + * @memberof QPState + */ + isIdentifier(token: string): boolean { + const match = token.match( + /^(?!true$)(?!false$)(?!guid')(?!binary')(?!X')(?!datetime')[a-zA-Z]/ + ); + if (match !== null && match!.length > 0) { + return true; + } + return false; + } + + protected isOperand(token: string): boolean { + // ToDo: Validate performance vs regex or array / enum op + let isOperator = true; + switch (token) { + case "eq": + break; + case "gt": + break; + case "ge": + break; + case "lt": + break; + case "le": + break; + case "ne": + break; + default: + isOperator = false; + } + return isOperator; + } + + protected updateTaggedTokens( + context: QueryContext, + taggedToken: TaggedToken + ) { + let taggedTokens: TaggedToken[] = []; + if (context.taggedPredicates.length === context.currentPredicate + 1) { + taggedTokens = + context.taggedPredicates[context.currentPredicate].tokenMap.tokens; + } + taggedTokens.push(taggedToken); + return taggedTokens; + } + + /** + * Updates tagged predicate, will set to unknown + * PredicateType should be set correctly in the checking functions + * + * @protected + * @param {TaggedToken[]} taggedTokens + * @param {QueryContext} context + * @return {*} {QueryContext} + * @memberof QPState + */ + protected updateTaggedPredicate( + taggedTokens: TaggedToken[], + context: QueryContext, + isPredicateOperator: boolean = false + ): QueryContext { + const tokenMap: TokenMap = new TokenMap(taggedTokens); + context.taggedPredicates[context.currentPredicate] = isPredicateOperator + ? new PredicateOperator(tokenMap) + : new UnknownPredicate(tokenMap); + return context; + } +} diff --git a/src/table/persistence/QueryTranscriber/QueryContext.ts b/src/table/persistence/QueryTranscriber/QueryContext.ts new file mode 100644 index 000000000..bf0c02c52 --- /dev/null +++ b/src/table/persistence/QueryTranscriber/QueryContext.ts @@ -0,0 +1,26 @@ +import IPredicate from "./PredicateModel/IPredicate"; +import { QueryStateName } from "./QueryStateName"; + +/** + * This object contains the state of the query + * as it undergoes transcription processing + * + * @export + * @class QueryContext + */ +export default class QueryContext { + public currentPos: number = 0; + // the original query string passed into the transcriber + public originalQuery: string = ""; + // a collection of predicates which are used in the query function + public taggedPredicates: IPredicate[] = []; + // represents the current predicate that is being processed + public currentPredicate: number = 0; + public transcribedQuery: string = ""; + public stateQueue: QueryStateName[] = []; + public isTableQuery: boolean = false; + constructor(queryString: string, isTableQuery: boolean = false) { + this.originalQuery = queryString; + this.isTableQuery = isTableQuery; + } +} diff --git a/src/table/persistence/QueryTranscriber/QueryStateName.ts b/src/table/persistence/QueryTranscriber/QueryStateName.ts new file mode 100644 index 000000000..ce56fec49 --- /dev/null +++ b/src/table/persistence/QueryTranscriber/QueryStateName.ts @@ -0,0 +1,20 @@ +/** + * Query state names are used in state store to + * access and identify states + * + * @export + * @enum {number} + */ +export enum QueryStateName { + None, + QueryStarted, + QueryFinished, + PredicateStarted, + PredicateFinished, + ProcessIdentifier, + ProcessOperator, + ProcessValue, + ProcessPredicateOperator, + ProcessParensOpen, + ProcessParensClose +} diff --git a/src/table/persistence/QueryTranscriber/QueryTranscriber.ts b/src/table/persistence/QueryTranscriber/QueryTranscriber.ts new file mode 100644 index 000000000..7c81601cf --- /dev/null +++ b/src/table/persistence/QueryTranscriber/QueryTranscriber.ts @@ -0,0 +1,143 @@ +import IQPState from "./IQPState"; +import QueryContext from "./QueryContext"; +import { QueryStateName } from "./QueryStateName"; + +/** + * Statemachine implementation for the Azurite query transcriber. + * + * @export + * @class QueryTranscriber + */ +export default class QueryTranscriber { + private queryContext: QueryContext; + private states = new Map(); + private currentState: IQPState; + private isSwitchingState = false; + + public name: string; + constructor(queryContext: QueryContext, name: string) { + this.queryContext = queryContext; + this.name = name ?? "machine"; + this.currentState = { + name: QueryStateName.None, + onProcess: (context: QueryContext) => { + return context; + }, + onExit: (context: QueryContext) => { + return context; + } + }; + } + + isCurrentState(name: QueryStateName): boolean { + return this.currentState?.name === name; + } + + /** + * Add a state to the machine. + * + * @param {string} name + * @param {IQPState} state - The state to add. + * @return {QueryTranscriber} + * @memberof LokiJsQueryTranscriber + */ + addState(name: QueryStateName, config: IQPState): QueryTranscriber { + this.states.set(name, { + name, + onProcess: config.onProcess?.bind(this.queryContext), + onExit: config.onExit?.bind(this.queryContext) + }); + + return this; + } + + /** + * Switch to the state with the given name. + * + * @param {string} name, + * @param {QueryContext} queryContext + * @return {QueryTranscriber} + * @memberof LokiJsQueryTranscriber + */ + setState(name: QueryStateName): QueryTranscriber { + if (this.states.has(name) === false) { + // This is a case which should only occur in testing + // or when adding new states. + // We do not expect to see this during run time! + throw new Error("Invalid State Name!"); + } + + if (this.isSwitchingState) { + this.queryContext.stateQueue.push(name); + return this; + } + + this.switchState(name); + + // processes state queue + // if there is a problem with state transitions, recursive call of + // setState will cause a stack overflow, which is OK: + // as otherwise we would hang the process... + while (this.queryContext.stateQueue.length > 0) { + if (this.queryContext.stateQueue.length > 0) { + const newState = this.queryContext.stateQueue.shift()!; + this.setState(newState); + } + } + this.currentState.onExit(this.queryContext); + return this; + } + + /** + * switches states by exiting last state and processing new state + * + * @private + * @param {QueryStateName} name + * @memberof QueryTranscriber + */ + private switchState(name: QueryStateName) { + this.isSwitchingState = true; + + this.queryContext = this.currentState.onExit(this.queryContext); + const state = this.states.get(name); + + this.updateState(state, name); + this.queryContext = this.currentState.onProcess(this.queryContext); + + this.isSwitchingState = false; + } + + private updateState(state: IQPState | undefined, name: QueryStateName) { + if (state !== undefined) { + this.currentState = state; + } else { + throw Error(`${this.name} does not have a state named ${name}`); + } + } + + /** + * Returns the query transcribed by the state machine. + * + * @return {*} {string} + * @memberof LokiJsQueryTranscriber + */ + getTranscribedQuery(): string { + if ( + this.queryContext === undefined || + this.queryContext.transcribedQuery === "" + ) { + throw new Error("Query failed to be transcribed!"); + } + return this.queryContext.transcribedQuery; + } + + /** + * + * + * @param {QueryStateName} name + * @memberof LokiJsQueryTranscriber + */ + setInitialState(name: QueryStateName) { + this.queryContext.stateQueue.push(name); + } +} diff --git a/src/table/persistence/QueryTranscriber/StatePredicateFinished.ts b/src/table/persistence/QueryTranscriber/StatePredicateFinished.ts new file mode 100644 index 000000000..c58ba37bf --- /dev/null +++ b/src/table/persistence/QueryTranscriber/StatePredicateFinished.ts @@ -0,0 +1,444 @@ +import IQPState from "./IQPState"; +import QPState from "./QPState"; +import QueryContext from "./QueryContext"; +import { QueryStateName } from "./QueryStateName"; +import GuidPredicate from "./PredicateModel/GuidPredicate"; +import BinaryPredicate from "./PredicateModel/BinaryPredicate"; +import LongPredicate from "./PredicateModel/LongPredicate"; +import DoublePredicate from "./PredicateModel/DoublePredicate"; +import IntegerPredicate from "./PredicateModel/IntegerPredicate"; +import StringPredicate from "./PredicateModel/StringPredicate"; +import DatePredicate from "./PredicateModel/DatePredicate"; +import BooleanPredicate from "./PredicateModel/BooleanPredicate"; + +/** + * contains the logic for checking a predicate when it is finished + * + * @export + * @class StatePredicateFinished + * @extends {QPState} + * @implements {IQPState} + */ +export default class StatePredicateFinished + extends QPState + implements IQPState +{ + name = QueryStateName.PredicateFinished; + + /** + * when finishing a predicate, we need to update the query type + * based on the value being queried + * + * @param {QueryContext} context + * @memberof StatePredicateFinished + */ + onProcess = (context: QueryContext) => { + let token = ""; + + context = this.validatePredicate(context); + + [context, token] = this.getNextToken(context); + + context = this.handleToken(context, token); + + return context; + }; + + /** + * state transition logic + * + * @protected + * @param {QueryContext} context + * @param {string} token + * @return {*} {QueryContext} + * @memberof StatePredicateFinished + */ + protected handleToken(context: QueryContext, token: string): QueryContext { + // categorize the token + if (token === "") { + context.stateQueue.push(QueryStateName.QueryFinished); + } else if (token === "(") { + context.stateQueue.push(QueryStateName.PredicateStarted); + } else if (token === ")") { + context.stateQueue.push(QueryStateName.ProcessParensClose); + } else if (this.isPredicateOperator(token)) { + context.stateQueue.push(QueryStateName.ProcessPredicateOperator); + // will need to end current predicate and create a new predicate + } else if (this.isOperand(token)) { + // match operand (specific set) + throw new Error( + "Invalid Query, unable to process operand starting predicate!" + ); + } else if (this.isValue(token)) { + // match number (long & doubles? needed) + // match string (starts with ', or " ?) + // match guid (is exactly guid'') + context.stateQueue.push(QueryStateName.PredicateStarted); + } else if (this.isIdentifier(token)) { + // match identifier (can only start with letter) + context.stateQueue.push(QueryStateName.PredicateStarted); + } + + return context; + } + + /** + * validates the predicate using some simple logic + * ToDo: ensure correct error codes!!! + * + * @param {QueryContext} context + * @return {*} {QueryContext} + * @memberof StatePredicateFinished + */ + private validatePredicate(context: QueryContext): QueryContext { + const predicateOffset: number = this.getPredicateOffsetToCheck(context); + this.checkPredicateLength(predicateOffset, context); + this.checkSingleTerm(predicateOffset, context); + this.checkMultipleTerms(predicateOffset, context); + context = this.setPredicateType(context); + return context; + } + + private getPredicateOffsetToCheck(context: QueryContext): number { + return context.currentPredicate > 0 ? context.currentPredicate - 1 : 0; + } + + /** + * tags the predicate based on the type of value found in the + * predicate terms + * + * @param {QueryContext} context + * @return {*} {QueryContext} + * @memberof StatePredicateFinished + */ + private setPredicateType(context: QueryContext): QueryContext { + if (context.taggedPredicates[context.currentPredicate] === undefined) { + return context; + } + const taggedTokens = + context.taggedPredicates[context.currentPredicate].tokenMap.tokens; + + taggedTokens.forEach((taggedToken) => { + if (taggedToken.type.isValue()) { + context = this.ifGuidPredicate(context, taggedToken.token); + context = this.ifBinaryPredicate(context, taggedToken.token); + context = this.ifLongPredicate(context, taggedToken.token); + context = this.ifDoublePredicate(context, taggedToken.token); + context = this.ifIntegerPredicate(context, taggedToken.token); + context = this.ifStringPredicate(context, taggedToken.token); + context = this.ifDatePredicate(context, taggedToken.token); + context = this.ifBooleanPredicate(context, taggedToken.token); + } + }); + return context; + } + + /** + * tags predicate for the case of a guid predicate + * + * @param {QueryContext} context + * @param {string} tokenToCheck + * @return {*} {QueryContext} + * @memberof StatePredicateFinished + */ + private ifGuidPredicate( + context: QueryContext, + tokenToCheck: string + ): QueryContext { + if (this.isGuidValue(tokenToCheck)) { + context.taggedPredicates[context.currentPredicate] = new GuidPredicate( + context.taggedPredicates[context.currentPredicate].tokenMap + ); + return context; + } + return context; + } + + /** + * tags predicate for the case of a binary value + * + * @param {QueryContext} context + * @param {string} tokenToCheck + * @return {*} {QueryContext} + * @memberof StatePredicateFinished + */ + private ifBinaryPredicate( + context: QueryContext, + tokenToCheck: string + ): QueryContext { + if (this.isBinaryValue(tokenToCheck)) { + context.taggedPredicates[context.currentPredicate] = new BinaryPredicate( + context.taggedPredicates[context.currentPredicate].tokenMap + ); + return context; + } + return context; + } + + /** + * tags predicate for the case of a long value + * + * @param {QueryContext} context + * @param {string} tokenToCheck + * @return {*} {QueryContext} + * @memberof StatePredicateFinished + */ + private ifLongPredicate( + context: QueryContext, + tokenToCheck: string + ): QueryContext { + if (this.isLongValue(tokenToCheck)) { + context.taggedPredicates[context.currentPredicate] = new LongPredicate( + context.taggedPredicates[context.currentPredicate].tokenMap + ); + return context; + } + return context; + } + + /** + * tags predicate for the case of a double value + * + * @param {QueryContext} context + * @param {string} tokenToCheck + * @return {*} {QueryContext} + * @memberof StatePredicateFinished + */ + private ifDoublePredicate( + context: QueryContext, + tokenToCheck: string + ): QueryContext { + if (this.isDoubleValue(tokenToCheck)) { + context.taggedPredicates[context.currentPredicate] = new DoublePredicate( + context.taggedPredicates[context.currentPredicate].tokenMap + ); + return context; + } + return context; + } + + /** + * tags predicate for the case of an integer value + * + * @param {QueryContext} context + * @param {string} tokenToCheck + * @return {*} {QueryContext} + * @memberof StatePredicateFinished + */ + private ifIntegerPredicate( + context: QueryContext, + tokenToCheck: string + ): QueryContext { + if (this.isIntegerValue(tokenToCheck)) { + context.taggedPredicates[context.currentPredicate] = new IntegerPredicate( + context.taggedPredicates[context.currentPredicate].tokenMap + ); + return context; + } + return context; + } + + /** + * tags predicate for the case of a string value + * + * @param {QueryContext} context + * @param {string} tokenToCheck + * @return {*} {QueryContext} + * @memberof StatePredicateFinished + */ + private ifStringPredicate( + context: QueryContext, + tokenToCheck: string + ): QueryContext { + if (this.isStringValue(tokenToCheck)) { + context.taggedPredicates[context.currentPredicate] = new StringPredicate( + context.taggedPredicates[context.currentPredicate].tokenMap + ); + return context; + } + return context; + } + + /** + * tags predicate for the case of a date value + * + * @param {QueryContext} context + * @param {string} tokenToCheck + * @return {*} {QueryContext} + * @memberof StatePredicateFinished + */ + private ifDatePredicate( + context: QueryContext, + tokenToCheck: string + ): QueryContext { + if (this.isDateValue(tokenToCheck)) { + context.taggedPredicates[context.currentPredicate] = new DatePredicate( + context.taggedPredicates[context.currentPredicate].tokenMap + ); + return context; + } + return context; + } + + /** + * tags predicate for the case of a boolean value + * + * @param {QueryContext} context + * @param {string} tokenToCheck + * @return {*} {QueryContext} + * @memberof StatePredicateFinished + */ + private ifBooleanPredicate( + context: QueryContext, + tokenToCheck: string + ): QueryContext { + if (this.isBooleanValue(tokenToCheck)) { + context.taggedPredicates[context.currentPredicate] = new BooleanPredicate( + context.taggedPredicates[context.currentPredicate].tokenMap + ); + return context; + } + return context; + } + + /** + * optional post processing, here we can add logging + * or additional validation etc + * + * @param {QueryContext} context + * @memberof StateProcessValue + */ + onExit = (context: QueryContext) => { + // ToDo: validate current predicate early or during transcribing? + // might even be able to remove the onExit hooks. + return context; + }; + + /** + * checks the number of terms in a predicate based on the state + * machines own logic (1 or 3 terms) + * + * @private + * @param {QueryContext} context + * @memberof StatePredicateFinished + */ + private checkPredicateLength(offset: number, context: QueryContext) { + if ( + context.taggedPredicates[offset].tokenMap.tokens.length !== 1 && + context.taggedPredicates[offset].tokenMap.tokens.length !== 3 + ) { + // we must have form "x operator b", or a single value + throw new Error("Invalid Query"); + } + } + + /** + * checks a single term + * + * @private + * @param {QueryContext} context + * @return {*} + * @memberof StatePredicateFinished + */ + private checkSingleTerm(offset: number, context: QueryContext) { + if (context.taggedPredicates[offset].tokenMap.tokens.length === 1) { + // we must have a parens or a single value + // ToDo: validate this logic has parity with Azure service + // This checks that a single tagged token is of a type allowed to be + // on it's own in a predicate; + const predicateType = + context.taggedPredicates[offset].tokenMap.tokens[0].type; + if ( + predicateType.isParensOpen() || + predicateType.isParensClose() || + predicateType.isOperator() + ) { + return; + } + throw new Error("Invalid Query"); + } + } + + /** + * checks multiple terms + * + * @private + * @param {QueryContext} context + * @memberof StatePredicateFinished + */ + private checkMultipleTerms(offset: number, context: QueryContext) { + if (context.taggedPredicates[offset].tokenMap.tokens.length === 3) { + // we must have form "x operator b" + this.checkNumberOfValues(offset, context); + this.checkNumberOfOperators(offset, context); + this.checkNumberOfIdentifiers(offset, context); + } + } + + /** + * Checks that there is only 1 value in the predicate + * + * @private + * @param {number} offset + * @param {QueryContext} context + * @memberof StatePredicateFinished + */ + private checkNumberOfValues(offset: number, context: QueryContext) { + let valueCount = 0; + context.taggedPredicates[offset].tokenMap.tokens.forEach((taggedToken) => { + if (taggedToken.type.isValue()) { + valueCount++; + } + }); + this.checkPredicateTermCount(valueCount); + } + + /** + * Checks that there is only 1 identifier in the predicate + * + * @private + * @param {number} offset + * @param {QueryContext} context + * @memberof StatePredicateFinished + */ + private checkNumberOfIdentifiers(offset: number, context: QueryContext) { + let valueCount = 0; + context.taggedPredicates[offset].tokenMap.tokens.forEach((taggedToken) => { + if (taggedToken.type.isIdentifier()) { + valueCount++; + } + }); + this.checkPredicateTermCount(valueCount); + } + + /** + * Checks that there is only 1 operator in the predicate + * + * @private + * @param {number} offset + * @param {QueryContext} context + * @memberof StatePredicateFinished + */ + private checkNumberOfOperators(offset: number, context: QueryContext) { + let valueCount = 0; + context.taggedPredicates[offset].tokenMap.tokens.forEach((taggedToken) => { + if (taggedToken.type.isOperator()) { + valueCount++; + } + }); + this.checkPredicateTermCount(valueCount); + } + + /** + * checks that there is only 1 of this type of term + * + * @private + * @param {number} count + * @memberof StatePredicateFinished + */ + private checkPredicateTermCount(count: number) { + if (count !== 1) { + throw new Error("Invalid number of terms in query!"); + } + } +} diff --git a/src/table/persistence/QueryTranscriber/StatePredicateStarted.ts b/src/table/persistence/QueryTranscriber/StatePredicateStarted.ts new file mode 100644 index 000000000..3e79f66ff --- /dev/null +++ b/src/table/persistence/QueryTranscriber/StatePredicateStarted.ts @@ -0,0 +1,74 @@ +import IQPState from "./IQPState"; +import QPState from "./QPState"; +import QueryContext from "./QueryContext"; +import { QueryStateName } from "./QueryStateName"; + +export default class StatePredicateStarted extends QPState implements IQPState { + name = QueryStateName.PredicateStarted; + + /** + * Starts the processing of a predicate clause + * these ar the units in which we need to maintain + * backwards schema compatibility + * + * @param {QueryContext} context + * @memberof StatePredicateStarted + */ + onProcess = (context: QueryContext) => { + let token = ""; + [context, token] = this.getNextToken(context); + context = this.handleToken(context, token); + + return context; + }; + + /** + * state transition logic + * + * @protected + * @param {QueryContext} context + * @param {string} token + * @return {*} {QueryContext} + * @memberof StatePredicateStarted + */ + protected handleToken(context: QueryContext, token: string): QueryContext { + // categorize the token + if (token === "") { + context.stateQueue.push(QueryStateName.PredicateFinished); + } else if (token === "(") { + context.stateQueue.push(QueryStateName.ProcessParensOpen); + } else if (token === ")") { + context.stateQueue.push(QueryStateName.ProcessParensClose); + } else if (this.isPredicateOperator(token)) { + context.stateQueue.push(QueryStateName.PredicateFinished); + + // will need to end current predicate and create a new predicate + } else if (this.isOperand(token)) { + // match operand (specific set) + throw new Error( + "Invalid Query, cannot start predicate with operator! " + token + ); + } else if (this.isValue(token)) { + // match number (long & doubles? needed) + // match string (starts with ', or " ?) + // match guid (is exactly guid'') + context.stateQueue.push(QueryStateName.ProcessValue); + } else if (this.isIdentifier(token)) { + // match identifier (can only start with letter) + context.stateQueue.push(QueryStateName.ProcessIdentifier); + } + + return context; + } + + /** + * optional post processing, here we can add logging + * or additional validation etc + * + * @param {QueryContext} context + * @memberof StateProcessValue + */ + onExit = (context: QueryContext) => { + return context; + }; +} diff --git a/src/table/persistence/QueryTranscriber/StateProcessIdentifier.ts b/src/table/persistence/QueryTranscriber/StateProcessIdentifier.ts new file mode 100644 index 000000000..9b7f3712d --- /dev/null +++ b/src/table/persistence/QueryTranscriber/StateProcessIdentifier.ts @@ -0,0 +1,158 @@ +import IQPState from "./IQPState"; +import QPState from "./QPState"; +import QueryContext from "./QueryContext"; +import { QueryStateName } from "./QueryStateName"; +import TaggedToken from "./TokenModel/TaggedToken"; +import IdentifierToken from "./TokenModel/IdentifierToken"; +import UnknownPredicate from "./PredicateModel/UnknownPredicate"; +import { TokenMap } from "./PredicateModel/TokenMap"; + +/** + * contains the logic to handle an identifier + * + * @export + * @class StateProcessIdentifier + * @extends {QPState} + * @implements {IQPState} + */ +export default class StateProcessIdentifier + extends QPState + implements IQPState +{ + name = QueryStateName.ProcessIdentifier; + + /** + * process current token which is an identifier + * + * @param {QueryContext} context + * @memberof StateProcessIdentifier + */ + onProcess = (context: QueryContext) => { + let token = ""; + [context, token] = this.getNextToken(context); + + context = this.storeTaggedTokens(context, token); + + [context, token] = this.getNextToken(context); + context = this.handleToken(context, token); + + return context; + }; + + /** + * state transition logic + * + * @protected + * @param {QueryContext} context + * @param {string} token + * @return {*} {QueryContext} + * @memberof StateProcessIdentifier + */ + protected handleToken(context: QueryContext, token: string): QueryContext { + // categorize the token + if (token === "") { + context.stateQueue.push(QueryStateName.PredicateFinished); + } else if (token === "(") { + context.stateQueue.push(QueryStateName.PredicateStarted); + } else if (token === ")") { + context.stateQueue.push(QueryStateName.PredicateFinished); + } else if (this.isPredicateOperator(token)) { + if (this.name === QueryStateName.PredicateFinished) { + context.stateQueue.push(QueryStateName.ProcessPredicateOperator); + } else { + context.stateQueue.push(QueryStateName.PredicateFinished); + } + // will need to end current predicate and create a new predicate + } else if (this.isOperand(token)) { + // match operand (specific set) + context.stateQueue.push(QueryStateName.ProcessOperator); + } else if (this.isValue(token)) { + // match number (long & doubles? needed) + // match string (starts with ', or " ?) + // match guid (is exactly guid'') + context.stateQueue.push(QueryStateName.ProcessValue); + } else if (this.isIdentifier(token)) { + // match identifier (can only start with letter) + context.stateQueue.push(QueryStateName.ProcessIdentifier); + } + + return context; + } + + /** + * optional post processing, here we can add logging + * or additional validation etc + * + * @param {QueryContext} context + * @memberof StateProcessValue + */ + onExit = (context: QueryContext) => { + return context; + }; + + /** + * stores the token as an identifier + * + * @private + * @param {QueryContext} context + * @param {string} token + * @return {*} {QueryContext} + * @memberof StateProcessIdentifier + */ + private storeTaggedTokens( + context: QueryContext, + token: string + ): QueryContext { + token = this.updateTableIdentifier(context, token); + + const taggedToken: TaggedToken = new TaggedToken( + token, + new IdentifierToken() + ); + + context = this.startNewPredicate(context); + + const taggedTokens = this.updateTaggedTokens(context, taggedToken); + context = this.updateTaggedPredicate(taggedTokens, context); + + context.currentPos += token.length; + + return context; + } + + private updateTableIdentifier(context: QueryContext, token: string) { + if (context.isTableQuery && token.toLowerCase() === "tablename") { + token = "**blena**"; + } + return token; + } + + /** + * This determines if we need to start a new predicate clause + * + * @private + * @param {QueryContext} context + * @return {*} {QueryContext} + * @memberof StateProcessIdentifier + */ + private startNewPredicate(context: QueryContext): QueryContext { + if ( + context.taggedPredicates[context.currentPredicate] !== undefined && + context.taggedPredicates[context.currentPredicate].tokenMap.tokens + .length !== 0 && + (context.taggedPredicates[ + context.currentPredicate + ].tokenMap.tokens[0].type.isParensOpen() || + context.taggedPredicates[ + context.currentPredicate + ].tokenMap.tokens[0].type.isParensClose() || + context.taggedPredicates[ + context.currentPredicate + ].tokenMap.tokens[0].type.isOperator()) + ) { + context.taggedPredicates.push(new UnknownPredicate(new TokenMap([]))); + context.currentPredicate += 1; + } + return context; + } +} diff --git a/src/table/persistence/QueryTranscriber/StateProcessOperator.ts b/src/table/persistence/QueryTranscriber/StateProcessOperator.ts new file mode 100644 index 000000000..fcc0079af --- /dev/null +++ b/src/table/persistence/QueryTranscriber/StateProcessOperator.ts @@ -0,0 +1,151 @@ +import IQPState from "./IQPState"; +import QPState from "./QPState"; +import QueryContext from "./QueryContext"; +import { QueryStateName } from "./QueryStateName"; +import TaggedToken from "./TokenModel/TaggedToken"; +import OperatorToken from "./TokenModel/OperatorToken"; + +/** + * contains logic to handle operators + * + * @export + * @class StateProcessOperator + * @extends {QPState} + * @implements {IQPState} + */ +export default class StateProcessOperator extends QPState implements IQPState { + name = QueryStateName.ProcessOperator; + + /** + * process current query token which is operator + * + * @param {QueryContext} context + * @memberof StateProcessOperator + */ + onProcess = (context: QueryContext) => { + let token = ""; + [context, token] = this.getNextToken(context); + const originalTokenLength = token.length; + token = this.convertOperatorToken(token); + context = this.storeTaggedTokens(context, token, originalTokenLength); + + [context, token] = this.getNextToken(context); + context = this.handleToken(context, token); + + return context; + }; + + /** + * state transition logic + * + * @protected + * @param {QueryContext} context + * @param {string} token + * @return {*} {QueryContext} + * @memberof StateProcessOperator + */ + protected handleToken(context: QueryContext, token: string): QueryContext { + // categorize the token + if (token === "") { + context.stateQueue.push(QueryStateName.PredicateFinished); + } else if (token === "(") { + context.stateQueue.push(QueryStateName.PredicateStarted); + } else if (token === ")") { + context.stateQueue.push(QueryStateName.PredicateFinished); + } else if (this.isPredicateOperator(token)) { + if (this.name === QueryStateName.PredicateFinished) { + context.stateQueue.push(QueryStateName.ProcessPredicateOperator); + } else { + context.stateQueue.push(QueryStateName.PredicateFinished); + } + // will need to end current predicate and create a new predicate + } else if (this.isOperand(token)) { + // match operand (specific set) + context.stateQueue.push(QueryStateName.ProcessOperator); + } else if (this.isValue(token)) { + // match number (long & doubles? needed) + // match string (starts with ', or " ?) + // match guid (is exactly guid'') + context.stateQueue.push(QueryStateName.ProcessValue); + } else if (this.isIdentifier(token)) { + // match identifier (can only start with letter) + context.stateQueue.push(QueryStateName.ProcessIdentifier); + } + + return context; + } + + /** + * optional post processing, here we can add logging + * or additional validation etc + * + * @param {QueryContext} context + * @memberof StateProcessValue + */ + onExit = (context: QueryContext) => { + return context; + }; + + /** + * Converts a token from query request to a type used in persistence + * layer query function. + * + * @private + * @static + * @param {string} token + * @return {*} {string} + * @memberof LokiTableMetadataStore + */ + private convertOperatorToken(token: string): string { + switch (token) { + case "eq": + return "==="; + case "gt": + return ">"; + case "ge": + return ">="; + case "lt": + return "<"; + case "le": + return "<="; + case "ne": + return "!=="; + case "and": + return "&&"; + case "or": + return "||"; + case "not": + return "!"; + default: + return token; + } + } + + /** + * stores and tags the token as an operator + * + * @private + * @param {QueryContext} context + * @param {string} token + * @param {number} originalTokenLength + * @return {*} {QueryContext} + * @memberof StateProcessOperator + */ + private storeTaggedTokens( + context: QueryContext, + token: string, + originalTokenLength: number + ): QueryContext { + const taggedToken: TaggedToken = new TaggedToken( + token, + new OperatorToken() + ); + + const taggedTokens = this.updateTaggedTokens(context, taggedToken); + context = this.updateTaggedPredicate(taggedTokens, context); + + context.currentPos += originalTokenLength; + + return context; + } +} diff --git a/src/table/persistence/QueryTranscriber/StateProcessParensClose.ts b/src/table/persistence/QueryTranscriber/StateProcessParensClose.ts new file mode 100644 index 000000000..9545a43df --- /dev/null +++ b/src/table/persistence/QueryTranscriber/StateProcessParensClose.ts @@ -0,0 +1,92 @@ +import IQPState from "./IQPState"; +import QPState from "./QPState"; +import QueryContext from "./QueryContext"; +import { QueryStateName } from "./QueryStateName"; +import TaggedToken from "./TokenModel/TaggedToken"; +import { TokenMap } from "./PredicateModel/TokenMap"; +import ParensCloseToken from "./TokenModel/ParensCloseToken"; +import ParensClose from "./PredicateModel/ParensClose"; + +/** + * contains the logic to handle parens close + * + * @export + * @class StateProcessParensClose + * @extends {QPState} + * @implements {IQPState} + */ +export default class StateProcessParensClose + extends QPState + implements IQPState +{ + name = QueryStateName.ProcessParensClose; + + /** + * process current query token which is operator + * + * @param {QueryContext} context + * @memberof StateProcessOperator + */ + onProcess = (context: QueryContext) => { + let token = ""; + [context, token] = this.getNextToken(context); + + context = this.storeTaggedTokens(context, token); + + [context, token] = this.getNextToken(context); + context = this.handleToken(context, token); + + return context; + }; + + /** + * state transition logic + * + * @protected + * @param {QueryContext} context + * @param {string} token + * @return {*} {QueryContext} + * @memberof StateProcessParensClose + */ + protected handleToken(context: QueryContext, token: string): QueryContext { + // Parens Close will always end the predicate + context.stateQueue.push(QueryStateName.PredicateFinished); + return context; + } + + /** + * optional post processing, here we can add logging + * or additional validation etc + * + * @param {QueryContext} context + * @memberof StateProcessValue + */ + onExit = (context: QueryContext) => { + return context; + }; + + /** + * Stores the tokens + * + * @private + * @param {QueryContext} context + * @param {string} token + * @param {number} originalTokenLength + * @return {*} {QueryContext} + * @memberof StateProcessParensClose + */ + private storeTaggedTokens( + context: QueryContext, + token: string + ): QueryContext { + const taggedParensToken: TaggedToken = new TaggedToken( + token, + new ParensCloseToken() + ); + const parensTokenMap: TokenMap = new TokenMap([taggedParensToken]); + context.taggedPredicates.push(new ParensClose(parensTokenMap)); + context.currentPredicate += 1; + context.currentPos += token.length; + return context; + } +} diff --git a/src/table/persistence/QueryTranscriber/StateProcessParensOpen.ts b/src/table/persistence/QueryTranscriber/StateProcessParensOpen.ts new file mode 100644 index 000000000..2503b085c --- /dev/null +++ b/src/table/persistence/QueryTranscriber/StateProcessParensOpen.ts @@ -0,0 +1,95 @@ +import IQPState from "./IQPState"; +import QPState from "./QPState"; +import QueryContext from "./QueryContext"; +import { QueryStateName } from "./QueryStateName"; +import TaggedToken from "./TokenModel/TaggedToken"; +import { TokenMap } from "./PredicateModel/TokenMap"; +import ParensOpenToken from "./TokenModel/ParensOpenToken"; +import ParensOpen from "./PredicateModel/ParensOpen"; + +/** + * contains the logic for parens open + * + * @export + * @class StateProcessParensOpen + * @extends {QPState} + * @implements {IQPState} + */ +export default class StateProcessParensOpen + extends QPState + implements IQPState +{ + name = QueryStateName.ProcessParensOpen; + + /** + * process current query token which is operator + * + * @param {QueryContext} context + * @memberof StateProcessOperator + */ + onProcess = (context: QueryContext) => { + let token = ""; + [context, token] = this.getNextToken(context); + + context = this.storeTaggedTokens(context, token); + + [context, token] = this.getNextToken(context); + context = this.handleToken(context, token); + return context; + }; + + /** + * state transition logic + * + * @protected + * @param {QueryContext} context + * @param {string} token + * @return {*} {QueryContext} + * @memberof StateProcessParensOpen + */ + protected handleToken(context: QueryContext, token: string): QueryContext { + // Parens Open will always start a predicate + context.stateQueue.push(QueryStateName.PredicateStarted); + + return context; + } + + /** + * optional post processing, here we can add logging + * or additional validation etc + * + * @param {QueryContext} context + * @memberof StateProcessValue + */ + onExit = (context: QueryContext) => { + return context; + }; + + /** + * Stores the tokens + * + * @private + * @param {QueryContext} context + * @param {string} token + * @return {*} {QueryContext} + * @memberof StateProcessParensOpen + */ + private storeTaggedTokens( + context: QueryContext, + token: string + ): QueryContext { + // predicate operator should be stored singly + + const taggedToken: TaggedToken = new TaggedToken( + token, + new ParensOpenToken() + ); + + context.taggedPredicates.push(new ParensOpen(new TokenMap([taggedToken]))); + context.currentPredicate += 1; + + context.currentPos += 1; // increment for parens + + return context; + } +} diff --git a/src/table/persistence/QueryTranscriber/StateProcessPredicateOperator.ts b/src/table/persistence/QueryTranscriber/StateProcessPredicateOperator.ts new file mode 100644 index 000000000..ba0ef29a6 --- /dev/null +++ b/src/table/persistence/QueryTranscriber/StateProcessPredicateOperator.ts @@ -0,0 +1,175 @@ +import IQPState from "./IQPState"; +import QPState from "./QPState"; +import QueryContext from "./QueryContext"; +import { QueryStateName } from "./QueryStateName"; +import TaggedToken from "./TokenModel/TaggedToken"; +import OperatorToken from "./TokenModel/OperatorToken"; +import UnknownPredicate from "./PredicateModel/UnknownPredicate"; +import { TokenMap } from "./PredicateModel/TokenMap"; +import PredicateOperator from "./PredicateModel/PredicateOperator"; + +/** + * contains the logic for handling operators between predicates + * + * @export + * @class StateProcessPredicateOperator + * @extends {QPState} + * @implements {IQPState} + */ +export default class StateProcessPredicateOperator + extends QPState + implements IQPState +{ + name = QueryStateName.ProcessOperator; + + /** + * process current query token which is operator + * + * @param {QueryContext} context + * @memberof StateProcessOperator + */ + onProcess = (context: QueryContext) => { + let token = ""; + [context, token] = this.getNextToken(context); + const originalTokenLength = token.length; + token = this.convertOperatorToken(token); + context = this.storeTaggedTokens(context, token, originalTokenLength); + + [context, token] = this.getNextToken(context); + context = this.handleToken(context, token); + return context; + }; + + /** + * contains state transition logic + * + * @protected + * @param {QueryContext} context + * @param {string} token + * @return {*} {QueryContext} + * @memberof StateProcessPredicateOperator + */ + protected handleToken(context: QueryContext, token: string): QueryContext { + // with a predicate operator we always finish the last predicate and start another + + context.stateQueue.push(QueryStateName.PredicateFinished); + + return context; + } + + /** + * optional post processing, here we can add logging + * or additional validation etc + * + * @param {QueryContext} context + * @memberof StateProcessValue + */ + onExit = (context: QueryContext) => { + return context; + }; + + /** + * Converts a token from query request to a type used in persistence + * layer query function. + * + * @private + * @static + * @param {string} token + * @return {*} {string} + * @memberof LokiTableMetadataStore + */ + private convertOperatorToken(token: string): string { + switch (token) { + case "and": + return "&&"; + case "or": + return "||"; + case "not": + return "!"; + default: + return token; + } + } + + /** + * Stores the tokens + * + * @private + * @param {QueryContext} context + * @param {string} token + * @param {number} originalTokenLength + * @return {*} {QueryContext} + * @memberof StateProcessPredicateOperator + */ + private storeTaggedTokens( + context: QueryContext, + token: string, + originalTokenLength: number + ): QueryContext { + // predicate operator should be stored singly + + const taggedToken: TaggedToken = new TaggedToken( + token, + new OperatorToken() + ); + + context.taggedPredicates.push( + new PredicateOperator(new TokenMap([taggedToken])) + ); + context.currentPredicate += 1; + + context.currentPos += originalTokenLength; + + return context; + } + + /** + * Starts a new predicate in case we are working without parens + * + * @param {QueryContext} context + * @return {*} {QueryContext} + * @memberof StateProcessPredicateOperator + */ + incrementPredicateWithoutParens(context: QueryContext): QueryContext { + if ( + context.taggedPredicates[this.getCorrectPredicate(context)].tokenMap + .tokens.length === 3 + ) { + context.currentPredicate += 1; + context.taggedPredicates.push(new UnknownPredicate(new TokenMap([]))); + return context; + } + this.checkNumberOfTokens(context); + return context; + } + + /** + * Get's the correct predic ate number, depending on if we have parens or not + * + * @param {QueryContext} context + * @return {*} + * @memberof StateProcessPredicateOperator + */ + getCorrectPredicate(context: QueryContext) { + if (context.taggedPredicates[context.currentPredicate] === undefined) { + return context.currentPredicate - 1; // why is this 2? + } else { + return context.currentPredicate; + } + } + + /** + * Ensures that predicate is valid based on number of tokens + * + * @param {QueryContext} context + * @memberof StateProcessPredicateOperator + */ + checkNumberOfTokens(context: QueryContext) { + if ( + context.taggedPredicates[this.getCorrectPredicate(context)].tokenMap + .tokens.length !== 1 + ) { + throw new Error("Invalid number of tokens in predicate."); + } + } +} diff --git a/src/table/persistence/QueryTranscriber/StateProcessValue.ts b/src/table/persistence/QueryTranscriber/StateProcessValue.ts new file mode 100644 index 000000000..f6476220c --- /dev/null +++ b/src/table/persistence/QueryTranscriber/StateProcessValue.ts @@ -0,0 +1,174 @@ +import IQPState from "./IQPState"; +import { TokenMap } from "./PredicateModel/TokenMap"; +import UnknownPredicate from "./PredicateModel/UnknownPredicate"; +import QPState from "./QPState"; +import QueryContext from "./QueryContext"; +import { QueryStateName } from "./QueryStateName"; +import TaggedToken from "./TokenModel/TaggedToken"; +import ValueToken from "./TokenModel/ValueToken"; + +/** + * contains the logic for processing values + * + * @export + * @class StateProcessValue + * @extends {QPState} + * @implements {IQPState} + */ +export default class StateProcessValue extends QPState implements IQPState { + name = QueryStateName.ProcessValue; + + /** + * processes the current token which is a value + * + * @param {QueryContext} context + * @memberof StateProcessValue + */ + onProcess = (context: QueryContext) => { + let token = ""; + [context, token] = this.getNextToken(context); + + context = this.storeTaggedTokens(context, token); + + [context, token] = this.getNextToken(context); + context = this.handleToken(context, token); + + return context; + }; + + /** + * Determines the next token. + * Overriden for the case of value processing + * due to strings containing whitespace + * @param context + * @returns + */ + protected override getNextToken( + context: QueryContext + ): [QueryContext, string] { + let tokenStart: number; + [context, tokenStart] = this.startofNextRelevantToken(context); + const tokenEnd = this.handleStringValue(context, tokenStart); + return this.validateToken(context, tokenStart, tokenEnd); + } + + /** + * extract a string value + * + * @private + * @param {QueryContext} context + * @param {number} tokenStart + * @return {*} + * @memberof StateProcessValue + */ + private handleStringValue(context: QueryContext, tokenStart: number) { + if (context.originalQuery[tokenStart] === "'") { + return context.originalQuery.indexOf("'", tokenStart + 1) + 1; + } + return this.endOfToken(context, tokenStart); + } + + /** + * state transition logic + * + * @protected + * @param {QueryContext} context + * @param {string} token + * @return {*} {QueryContext} + * @memberof StateProcessValue + */ + protected handleToken(context: QueryContext, token: string): QueryContext { + // categorize the token + if (token === "") { + context.stateQueue.push(QueryStateName.PredicateFinished); + } else if (token === "(") { + context.stateQueue.push(QueryStateName.PredicateStarted); + } else if (token === ")") { + context.stateQueue.push(QueryStateName.PredicateFinished); + } else if (this.isPredicateOperator(token)) { + if (this.name === QueryStateName.PredicateFinished) { + context.stateQueue.push(QueryStateName.ProcessPredicateOperator); + } else { + context.stateQueue.push(QueryStateName.PredicateFinished); + } + // will need to end current predicate and create a new predicate + } else if (this.isOperand(token)) { + // match operand (specific set) + context.stateQueue.push(QueryStateName.ProcessOperator); + } else if (this.isValue(token)) { + // match number (long & doubles? needed) + // match string (starts with ', or " ?) + // match guid (is exactly guid'') + context.stateQueue.push(QueryStateName.ProcessValue); + } else if (this.isIdentifier(token)) { + // match identifier (can only start with letter) + context.stateQueue.push(QueryStateName.ProcessIdentifier); + } + + return context; + } + + /** + * optional post processing, here we can add logging + * or additional validation etc + * + * @param {QueryContext} context + * @memberof StateProcessValue + */ + onExit = (context: QueryContext) => { + return context; + }; + + /** + * stores the token as value + * + * @private + * @param {QueryContext} context + * @param {string} token + * @return {*} {QueryContext} + * @memberof StateProcessValue + */ + private storeTaggedTokens( + context: QueryContext, + token: string + ): QueryContext { + context = this.startNewPredicate(context); + + const taggedToken: TaggedToken = new TaggedToken(token, new ValueToken()); + + const taggedTokens = this.updateTaggedTokens(context, taggedToken); + context = this.updateTaggedPredicate(taggedTokens, context); + + context.currentPos += token.length; + + return context; + } + + /** + * determines if we need to start a new predicate + * + * @param {QueryContext} context + * @return {*} {QueryContext} + * @memberof StateProcessValue + */ + startNewPredicate(context: QueryContext): QueryContext { + if ( + context.taggedPredicates[context.currentPredicate] !== undefined && + context.taggedPredicates[context.currentPredicate].tokenMap.tokens + .length !== 0 && + (context.taggedPredicates[ + context.currentPredicate + ].tokenMap.tokens[0].type.isParensOpen() || + context.taggedPredicates[ + context.currentPredicate + ].tokenMap.tokens[0].type.isParensClose() || + context.taggedPredicates[ + context.currentPredicate + ].tokenMap.tokens[0].type.isOperator()) + ) { + context.taggedPredicates.push(new UnknownPredicate(new TokenMap([]))); + context.currentPredicate += 1; + } + return context; + } +} diff --git a/src/table/persistence/QueryTranscriber/StateQueryFinished.ts b/src/table/persistence/QueryTranscriber/StateQueryFinished.ts new file mode 100644 index 000000000..7f70acda8 --- /dev/null +++ b/src/table/persistence/QueryTranscriber/StateQueryFinished.ts @@ -0,0 +1,54 @@ +import IQPState from "./IQPState"; +import QueryContext from "./QueryContext"; +import { QueryStateName } from "./QueryStateName"; + +/** + * state to complete the transcribing of a query + * + * @export + * @class StateQueryFinished + * @implements {IQPState} + */ +export default class StateQueryFinished implements IQPState { + name = QueryStateName.QueryFinished; + + /** + * completes query transcribing + * + * @memberof StateQueryFinished + */ + onProcess = (context: QueryContext) => { + // first setup the query output function + context.transcribedQuery = "return ("; + // add tagged predicates to the query output, then close the query function + // this is where we add support for backwards compatability in the schema + // and do conversions for special types etc and their DB schema representation + for (const taggedPredicate of context.taggedPredicates) { + let predicate = ""; + if (taggedPredicate !== undefined) { + const convertedPredicate = taggedPredicate.convertPredicateForLokiJS(); + for (const taggedPredicateToken of convertedPredicate.tokenMap.tokens) { + predicate += " "; + predicate += taggedPredicateToken.token; + } + } + + context.transcribedQuery += predicate; + } + // Close off query function: + context.transcribedQuery += " )"; + return context; + }; + + /** + * optional post processing, here we can add logging + * or additional validation etc + * + * @param {QueryContext} context + * @memberof StateProcessValue + */ + onExit = (context: QueryContext) => { + // ToDo: Log converted query? + return context; + }; +} diff --git a/src/table/persistence/QueryTranscriber/StateQueryStarted.ts b/src/table/persistence/QueryTranscriber/StateQueryStarted.ts new file mode 100644 index 000000000..6b5b81199 --- /dev/null +++ b/src/table/persistence/QueryTranscriber/StateQueryStarted.ts @@ -0,0 +1,74 @@ +import IQPState from "./IQPState"; +import QPState from "./QPState"; +import QueryContext from "./QueryContext"; +import { QueryStateName } from "./QueryStateName"; + +/** + * This is the first state of the query processing + * + * @export + * @class StateQueryStarted + * @extends {QPState} + * @implements {IQPState} + */ +export default class StateQueryStarted extends QPState implements IQPState { + name = QueryStateName.QueryStarted; + /** + * start the processing and state machine + * + * @memberof StateQueryStarted + */ + onProcess = (context: QueryContext) => { + let token = ""; + [context, token] = this.getNextToken(context); + context = this.handleToken(context, token); + + return context; + }; + + /** + * State transition logic + * + * @protected + * @param {QueryContext} context + * @param {string} token + * @return {*} {QueryContext} + * @memberof StateQueryStarted + */ + protected handleToken(context: QueryContext, token: string): QueryContext { + // categorize the token + if (token === "") { + context.stateQueue.push(QueryStateName.QueryFinished); + } else if (token === "(") { + context.stateQueue.push(QueryStateName.PredicateStarted); + } else if (token === ")") { + throw new Error("Invalid Query, starting with parens close!"); + } else if (this.isPredicateOperator(token)) { + context.stateQueue.push(QueryStateName.PredicateStarted); + } else if (this.isOperand(token)) { + // match operand (specific set) + throw new Error("Invalid Query, starting with operand!"); + } else if (this.isValue(token)) { + // match number (long & doubles? needed) + // match string (starts with ', or " ?) + // match guid (is exactly guid'') + context.stateQueue.push(QueryStateName.PredicateStarted); + } else if (this.isIdentifier(token)) { + // match identifier (can only start with letter) + context.stateQueue.push(QueryStateName.PredicateStarted); + } + + return context; + } + + /** + * optional post processing, here we can add logging + * or additional validation etc + * + * @param {QueryContext} context + * @memberof StateProcessValue + */ + onExit = (context: QueryContext) => { + return context; + }; +} diff --git a/src/table/persistence/QueryTranscriber/TokenModel/ITokenType.ts b/src/table/persistence/QueryTranscriber/TokenModel/ITokenType.ts new file mode 100644 index 000000000..2a3580ea0 --- /dev/null +++ b/src/table/persistence/QueryTranscriber/TokenModel/ITokenType.ts @@ -0,0 +1,15 @@ +/** + * Token Type provides the capability to perform + * tokenization and conversion based on value in query + * + * @export + * @interface ITokenType + */ +export default interface ITokenType { + isUnknown(): boolean; + isIdentifier(): boolean; + isOperator(): boolean; + isValue(): boolean; + isParensOpen(): boolean; + isParensClose(): boolean; +} diff --git a/src/table/persistence/QueryTranscriber/TokenModel/IdentifierToken.ts b/src/table/persistence/QueryTranscriber/TokenModel/IdentifierToken.ts new file mode 100644 index 000000000..7dbb68d1d --- /dev/null +++ b/src/table/persistence/QueryTranscriber/TokenModel/IdentifierToken.ts @@ -0,0 +1,22 @@ +import ITokenType from "./ITokenType"; + +export default class IdentifierToken implements ITokenType { + isUnknown(): boolean { + return false; + } + isIdentifier(): boolean { + return true; + } + isOperator(): boolean { + return false; + } + isValue(): boolean { + return false; + } + isParensOpen(): boolean { + return false; + } + isParensClose(): boolean { + return false; + } +} diff --git a/src/table/persistence/QueryTranscriber/TokenModel/OperatorToken.ts b/src/table/persistence/QueryTranscriber/TokenModel/OperatorToken.ts new file mode 100644 index 000000000..2c124bfb0 --- /dev/null +++ b/src/table/persistence/QueryTranscriber/TokenModel/OperatorToken.ts @@ -0,0 +1,22 @@ +import ITokenType from "./ITokenType"; + +export default class OperatorToken implements ITokenType { + isUnknown(): boolean { + return false; + } + isIdentifier(): boolean { + return false; + } + isOperator(): boolean { + return true; + } + isValue(): boolean { + return false; + } + isParensOpen(): boolean { + return false; + } + isParensClose(): boolean { + return false; + } +} diff --git a/src/table/persistence/QueryTranscriber/TokenModel/ParensCloseToken.ts b/src/table/persistence/QueryTranscriber/TokenModel/ParensCloseToken.ts new file mode 100644 index 000000000..051b1c1ff --- /dev/null +++ b/src/table/persistence/QueryTranscriber/TokenModel/ParensCloseToken.ts @@ -0,0 +1,22 @@ +import ITokenType from "./ITokenType"; + +export default class ParensCloseToken implements ITokenType { + isUnknown(): boolean { + return false; + } + isIdentifier(): boolean { + return false; + } + isOperator(): boolean { + return false; + } + isValue(): boolean { + return false; + } + isParensOpen(): boolean { + return false; + } + isParensClose(): boolean { + return true; + } +} diff --git a/src/table/persistence/QueryTranscriber/TokenModel/ParensOpenToken.ts b/src/table/persistence/QueryTranscriber/TokenModel/ParensOpenToken.ts new file mode 100644 index 000000000..f36dd1c1d --- /dev/null +++ b/src/table/persistence/QueryTranscriber/TokenModel/ParensOpenToken.ts @@ -0,0 +1,22 @@ +import ITokenType from "./ITokenType"; + +export default class ParensOpenToken implements ITokenType { + isUnknown(): boolean { + return false; + } + isIdentifier(): boolean { + return false; + } + isOperator(): boolean { + return false; + } + isValue(): boolean { + return false; + } + isParensOpen(): boolean { + return true; + } + isParensClose(): boolean { + return false; + } +} diff --git a/src/table/persistence/QueryTranscriber/TokenModel/TaggedToken.ts b/src/table/persistence/QueryTranscriber/TokenModel/TaggedToken.ts new file mode 100644 index 000000000..1bf1eba1e --- /dev/null +++ b/src/table/persistence/QueryTranscriber/TokenModel/TaggedToken.ts @@ -0,0 +1,11 @@ +import ITokenType from "./ITokenType"; + +export default class TaggedToken { + public token: string; + public type: ITokenType; + + constructor(token: string, type: ITokenType) { + this.token = token; + this.type = type; + } +} diff --git a/src/table/persistence/QueryTranscriber/TokenModel/UnknownToken.ts b/src/table/persistence/QueryTranscriber/TokenModel/UnknownToken.ts new file mode 100644 index 000000000..9bd184cbc --- /dev/null +++ b/src/table/persistence/QueryTranscriber/TokenModel/UnknownToken.ts @@ -0,0 +1,22 @@ +import ITokenType from "./ITokenType"; + +export default class UnknownToken implements ITokenType { + isUnknown(): boolean { + return true; + } + isIdentifier(): boolean { + return false; + } + isOperator(): boolean { + return false; + } + isValue(): boolean { + return false; + } + isParensOpen(): boolean { + return false; + } + isParensClose(): boolean { + return false; + } +} diff --git a/src/table/persistence/QueryTranscriber/TokenModel/ValueToken.ts b/src/table/persistence/QueryTranscriber/TokenModel/ValueToken.ts new file mode 100644 index 000000000..c85b10662 --- /dev/null +++ b/src/table/persistence/QueryTranscriber/TokenModel/ValueToken.ts @@ -0,0 +1,22 @@ +import ITokenType from "./ITokenType"; + +export default class ValueToken implements ITokenType { + isUnknown(): boolean { + return false; + } + isIdentifier(): boolean { + return false; + } + isOperator(): boolean { + return false; + } + isValue(): boolean { + return true; + } + isParensOpen(): boolean { + return false; + } + isParensClose(): boolean { + return false; + } +} diff --git a/tests/table/apis/table.entity.azure.data-tables.test.ts b/tests/table/apis/table.entity.azure.data-tables.test.ts index 689aaf709..8520f8f7e 100644 --- a/tests/table/apis/table.entity.azure.data-tables.test.ts +++ b/tests/table/apis/table.entity.azure.data-tables.test.ts @@ -2,7 +2,7 @@ import * as assert from "assert"; import LogicAppReproEntity from "../models/table.entity.test.logicapp.entity"; -import { Edm, odata, TableEntity, TableTransaction } from "@azure/data-tables"; +import { TableTransaction } from "@azure/data-tables"; import { configLogger } from "../../../src/common/Logger"; import TableServer from "../../../src/table/TableServer"; import { getUniqueName } from "../../testutils"; @@ -32,22 +32,16 @@ const testLocalAzuriteInstance = true; describe("table Entity APIs test - using Azure/data-tables", () => { let server: TableServer; - const requestOverride = { headers: {} }; - before(async () => { server = createTableServerForTestHttps(); await server.start(); - requestOverride.headers = { - Prefer: "return-content", - accept: "application/json;odata=fullmetadata" - }; }); after(async () => { await server.close(); }); - it("Batch API should return row keys in format understood by @azure/data-tables, @loki", async () => { + it("01. Batch API should return row keys in format understood by @azure/data-tables, @loki", async () => { const tableClient = createAzureDataTablesClient( testLocalAzuriteInstance, getUniqueName("dataTables") @@ -71,7 +65,7 @@ describe("table Entity APIs test - using Azure/data-tables", () => { }); // https://github.com/Azure/Azurite/issues/754 - it("Batch API should correctly process LogicApp style update request sequence", async () => { + it("02. Batch API should correctly process LogicApp style update request sequence, @loki", async () => { const tableClient = createAzureDataTablesClient( testLocalAzuriteInstance, getUniqueName("logicapp") @@ -161,7 +155,7 @@ describe("table Entity APIs test - using Azure/data-tables", () => { await tableClient.deleteTable(); }); - it("Should return bad request error for incorrectly formatted etags, @loki", async () => { + it("03. Should return bad request error for incorrectly formatted etags, @loki", async () => { const tableClient = createAzureDataTablesClient( testLocalAzuriteInstance, getUniqueName("etags") @@ -210,545 +204,7 @@ describe("table Entity APIs test - using Azure/data-tables", () => { await tableClient.deleteTable(); }); - it("should find an int as a number, @loki", async () => { - const tableClient = createAzureDataTablesClient( - testLocalAzuriteInstance, - getUniqueName("int") - ); - const partitionKey = createUniquePartitionKey(""); - const testEntity: AzureDataTablesTestEntity = - createBasicEntityForTest(partitionKey); - - await tableClient.createTable({ requestOptions: { timeout: 60000 } }); - const result = await tableClient.createEntity(testEntity); - assert.ok(result.etag); - - const queryResult = await tableClient - .listEntities({ - queryOptions: { - filter: `PartitionKey eq '${partitionKey}' and int32Field eq 54321` - } - }) - .next(); - assert.notStrictEqual(queryResult.value, undefined); - await tableClient.deleteTable(); - }); - - it("should find a long int, @loki", async () => { - const tableClient = createAzureDataTablesClient( - testLocalAzuriteInstance, - getUniqueName("longint") - ); - const partitionKey = createUniquePartitionKey(""); - const testEntity: AzureDataTablesTestEntity = - createBasicEntityForTest(partitionKey); - - await tableClient.createTable({ requestOptions: { timeout: 60000 } }); - const result = await tableClient.createEntity(testEntity); - assert.ok(result.etag); - - const queryResult = await tableClient - .listEntities({ - queryOptions: { - filter: `PartitionKey eq '${partitionKey}' and int64Field eq 12345L` - } - }) - .next(); - assert.notStrictEqual(queryResult.value, undefined); - - await tableClient.deleteTable(); - }); - - it("should find an entity using a partition key with multiple spaces, @loki", async () => { - const tableClient = createAzureDataTablesClient( - testLocalAzuriteInstance, - getUniqueName("query1s") - ); - const partitionKey = createUniquePartitionKey("") + " with spaces"; - const testEntity: AzureDataTablesTestEntity = - createBasicEntityForTest(partitionKey); - - await tableClient.createTable({ requestOptions: { timeout: 60000 } }); - const result = await tableClient.createEntity(testEntity); - assert.ok(result.etag); - - const queryResult = await tableClient - .listEntities({ - queryOptions: { - filter: `PartitionKey eq '${partitionKey}'` - } - }) - .next(); - assert.notStrictEqual(queryResult.value, undefined); - - await tableClient.deleteTable(); - }); - - it("should provide a complete query result when using query entities by page, @loki", async () => { - const tableClient = createAzureDataTablesClient( - testLocalAzuriteInstance, - getUniqueName("querybypage") - ); - const partitionKeyForQueryTest = createUniquePartitionKey(""); - const totalItems = 20; - await tableClient.createTable(); - - for (let i = 0; i < totalItems; i++) { - const result = await tableClient.createEntity({ - partitionKey: partitionKeyForQueryTest, - rowKey: `${i}`, - foo: "testEntity" - }); - assert.notStrictEqual(result.etag, undefined); - } - - const maxPageSize = 5; - const entities = tableClient.listEntities>({ - queryOptions: { - filter: odata`PartitionKey eq ${partitionKeyForQueryTest}` - } - }); - let all: TableEntity<{ foo: string }>[] = []; - for await (const entity of entities.byPage({ - maxPageSize - })) { - all = [...all, ...entity]; - } - assert.strictEqual(all.length, totalItems); - all.sort((obj1, obj2) => { - if (parseInt(obj1.rowKey, 10) > parseInt(obj2.rowKey, 10)) { - return 1; - } else if (obj1.rowKey === obj2.rowKey) { - return 0; - } else { - return -1; - } - }); - let rowKeyChecker = 0; - while (rowKeyChecker < totalItems) { - assert.strictEqual(all[rowKeyChecker].rowKey, rowKeyChecker.toString()); - rowKeyChecker++; - } - await tableClient.deleteTable(); - }); - - it("should return the correct number of results querying with a timestamp or different SDK whitespacing behaviours, @loki", async () => { - const tableClient = createAzureDataTablesClient( - testLocalAzuriteInstance, - getUniqueName("sdkspace") - ); - const partitionKeyForQueryTest = createUniquePartitionKey(""); - const totalItems = 10; - await tableClient.createTable(); - const timestamp = new Date(); - timestamp.setDate(timestamp.getDate() + 1); - const newTimeStamp = timestamp.toISOString(); - for (let i = 0; i < totalItems; i++) { - const result = await tableClient.createEntity({ - partitionKey: partitionKeyForQueryTest, - rowKey: `${i}`, - number: i - }); - assert.notStrictEqual(result.etag, undefined); - } - const maxPageSize = 5; - let testsCompleted = 0; - // take note of the different whitespacing and query formatting: - const queriesAndExpectedResult = [ - { - queryOptions: { - filter: odata`PartitionKey eq ${partitionKeyForQueryTest} and number gt 11` - }, - expectedResult: 0 - }, - { - queryOptions: { - filter: odata`PartitionKey eq ${partitionKeyForQueryTest} and number lt 11` - }, - expectedResult: 10 - }, - { - queryOptions: { - filter: odata`PartitionKey eq ${partitionKeyForQueryTest} and number gt 11 and Timestamp lt datetime'${newTimeStamp}'` - }, - expectedResult: 0 - }, - { - queryOptions: { - filter: odata`PartitionKey eq ${partitionKeyForQueryTest} and number lt 11 and Timestamp lt datetime'${newTimeStamp}'` - }, - expectedResult: 10 - }, - { - queryOptions: { - filter: odata`(PartitionKey eq ${partitionKeyForQueryTest}) and (number lt 12) and (Timestamp lt datetime'${newTimeStamp}')` - }, - expectedResult: 10 - }, - { - queryOptions: { - filter: odata`(PartitionKey eq ${partitionKeyForQueryTest})and (number lt 12) and(Timestamp lt datetime'${newTimeStamp}')` - }, - expectedResult: 10 - }, - { - queryOptions: { - filter: odata`(PartitionKey eq ${partitionKeyForQueryTest})and(number lt 12)and(Timestamp lt datetime'${newTimeStamp}')` - }, - expectedResult: 10 - } - ]; - - for (const queryTest of queriesAndExpectedResult) { - const entities = tableClient.listEntities< - TableEntity<{ number: number }> - >({ - queryOptions: queryTest.queryOptions, - disableTypeConversion: true - }); - let all: TableEntity<{ number: number }>[] = []; - for await (const entity of entities.byPage({ - maxPageSize - })) { - all = [...all, ...entity]; - } - assert.strictEqual( - all.length, - queryTest.expectedResult, - `Failed on query ${queryTest.queryOptions.filter}` - ); - testsCompleted++; - } - assert.strictEqual(testsCompleted, 7, "Not all tests completed"); - await tableClient.deleteTable(); - }); - - it("should return the correct number of results querying with a boolean field regardless of whitespacing behaviours, @loki", async () => { - const tableClient = createAzureDataTablesClient( - testLocalAzuriteInstance, - getUniqueName("bool") - ); - const partitionKeyForQueryTest = createUniquePartitionKey("bool"); - const totalItems = 10; - await tableClient.createTable(); - const timestamp = new Date(); - timestamp.setDate(timestamp.getDate() + 1); - for (let i = 0; i < totalItems; i++) { - const myBool: boolean = i % 2 !== 0 ? true : false; - const result = await tableClient.createEntity({ - partitionKey: partitionKeyForQueryTest, - rowKey: `${i}`, - number: i, - myBool - }); - assert.notStrictEqual(result.etag, undefined); - } - const maxPageSize = 10; - let testsCompleted = 0; - // take note of the different whitespacing and query formatting: - const queriesAndExpectedResult = [ - { - queryOptions: { - filter: odata`(PartitionKey eq ${partitionKeyForQueryTest})and(myBool eq true )` - }, - expectedResult: 5 - }, - { - queryOptions: { - filter: odata`(PartitionKey eq ${partitionKeyForQueryTest}) and (myBool eq true)` - }, - expectedResult: 5 - }, - { - queryOptions: { - filter: odata`(PartitionKey eq ${partitionKeyForQueryTest}) and (myBool eq false)` - }, - expectedResult: 5 - }, - { - queryOptions: { - filter: odata`(PartitionKey eq ${partitionKeyForQueryTest})and (myBool eq false)` - }, - expectedResult: 5 - }, - { - queryOptions: { - filter: odata`(PartitionKey eq ${partitionKeyForQueryTest}) and(myBool eq false)` - }, - expectedResult: 5 - }, - { - queryOptions: { - filter: odata`(PartitionKey eq ${partitionKeyForQueryTest}) and (myBool eq false)` - }, - expectedResult: 5 - } - ]; - - for (const queryTest of queriesAndExpectedResult) { - const entities = tableClient.listEntities< - TableEntity<{ number: number }> - >({ - queryOptions: queryTest.queryOptions - }); - let all: TableEntity<{ number: number }>[] = []; - for await (const entity of entities.byPage({ - maxPageSize - })) { - all = [...all, ...entity]; - } - assert.strictEqual( - all.length, - queryTest.expectedResult, - `Failed with query ${queryTest.queryOptions.filter}` - ); - testsCompleted++; - } - assert.strictEqual(testsCompleted, queriesAndExpectedResult.length); - await tableClient.deleteTable(); - }); - - it("should return the correct number of results querying with an int64 field regardless of whitespacing behaviours, @loki", async () => { - const tableClient = createAzureDataTablesClient( - testLocalAzuriteInstance, - getUniqueName("int64") - ); - const partitionKeyForQueryTest = createUniquePartitionKey("int64"); - const totalItems = 10; - await tableClient.createTable(); - const timestamp = new Date(); - timestamp.setDate(timestamp.getDate() + 1); - for (let i = 0; i < totalItems; i++) { - const testEntity: AzureDataTablesTestEntity = createBasicEntityForTest( - partitionKeyForQueryTest - ); - testEntity.int64Field = { value: `${i}`, type: "Int64" }; - const result = await tableClient.createEntity(testEntity); - assert.notStrictEqual(result.etag, undefined); - } - const maxPageSize = 10; - let testsCompleted = 0; - type queryOptions = { - filter: string; - }; - type queryAndResult = { - queryOptions: queryOptions; - expectedResult: Edm<"Int64">; - }; - // take note of the different whitespacing and query formatting: - const queriesAndExpectedResult: queryAndResult[] = [ - { - queryOptions: { - filter: odata`(PartitionKey eq ${partitionKeyForQueryTest}) and (int64Field eq 1L )` - }, - expectedResult: { value: "1", type: "Int64" } - }, - { - queryOptions: { - filter: odata`(PartitionKey eq ${partitionKeyForQueryTest}) and (int64Field eq 2L)` - }, - expectedResult: { value: "2", type: "Int64" } - }, - { - queryOptions: { - filter: odata`(PartitionKey eq ${partitionKeyForQueryTest}) and (int64Field eq 6L)` - }, - expectedResult: { value: "6", type: "Int64" } - } - ]; - - for (const queryTest of queriesAndExpectedResult) { - const entities = tableClient.listEntities({ - queryOptions: queryTest.queryOptions, - disableTypeConversion: true - }); - let all: AzureDataTablesTestEntity[] = []; - for await (const entity of entities.byPage({ - maxPageSize - })) { - all = [...all, ...entity]; - } - assert.strictEqual( - all.length, - 1, - `Failed on number of results with query ${queryTest.queryOptions.filter}` - ); - - assert.strictEqual( - all[0].int64Field.value, - queryTest.expectedResult.value, - `Failed to validate value with query ${queryTest.queryOptions.filter}` - ); - testsCompleted++; - } - assert.strictEqual(testsCompleted, queriesAndExpectedResult.length); - await tableClient.deleteTable(); - }); - - it("should return the correct number of results querying with a double field regardless of whitespacing behaviours, @loki", async () => { - const tableClient = createAzureDataTablesClient( - testLocalAzuriteInstance, - getUniqueName("datatables") - ); - const partitionKeyForQueryTest = createUniquePartitionKey("double"); - const totalItems = 10; - await tableClient.createTable(); - const timestamp = new Date(); - timestamp.setDate(timestamp.getDate() + 1); - for (let i = 0; i < totalItems; i++) { - const testEntity: AzureDataTablesTestEntity = createBasicEntityForTest( - partitionKeyForQueryTest - ); - const result = await tableClient.createEntity(testEntity); - assert.notStrictEqual(result.etag, undefined); - } - const maxPageSize = 10; - let testsCompleted = 0; - // take note of the different whitespacing and query formatting: - const queriesAndExpectedResult = [ - { - queryOptions: { - filter: odata`(PartitionKey eq ${partitionKeyForQueryTest}) and (doubleField eq 54.321 )` - }, - expectedResult: 10 - }, - { - queryOptions: { - filter: odata`(PartitionKey eq ${partitionKeyForQueryTest}) and (doubleField eq 54.321)` - }, - expectedResult: 10 - }, - { - queryOptions: { - filter: odata`(PartitionKey eq ${partitionKeyForQueryTest}) and (doubleField eq 54.321)` - }, - expectedResult: 10 - }, - { - queryOptions: { - filter: odata`(PartitionKey eq ${partitionKeyForQueryTest}) and (doubleField gt 53.321)` - }, - expectedResult: 10 - }, - { - queryOptions: { - filter: odata`(PartitionKey eq ${partitionKeyForQueryTest}) and (doubleField lt 57.321)` - }, - expectedResult: 10 - } - ]; - for (const queryTest of queriesAndExpectedResult) { - const entities = tableClient.listEntities({ - queryOptions: queryTest.queryOptions - }); - let all: AzureDataTablesTestEntity[] = []; - for await (const entity of entities.byPage({ - maxPageSize - })) { - all = [...all, ...entity]; - } - assert.strictEqual( - all.length, - queryTest.expectedResult, - `Failed on number of results with query ${queryTest.queryOptions.filter}` - ); - assert.strictEqual( - all[0].doubleField, - 54.321, - `Failed on value of double returned by query ${queryTest.queryOptions.filter}` - ); - testsCompleted++; - } - assert.strictEqual(testsCompleted, queriesAndExpectedResult.length); - await tableClient.deleteTable(); - }); - - it("should return the correct number of results querying with a double field containing a single digit number regardless of whitespacing behaviours, @loki", async () => { - const tableClient = createAzureDataTablesClient( - testLocalAzuriteInstance, - getUniqueName("datatables") - ); - const partitionKeyForQueryTest = createUniquePartitionKey("double"); - const totalItems = 10; - await tableClient.createTable(); - const timestamp = new Date(); - timestamp.setDate(timestamp.getDate() + 1); - for (let i = 0; i < totalItems; i++) { - const testEntity: AzureDataTablesTestEntity = createBasicEntityForTest( - partitionKeyForQueryTest - ); - testEntity.doubleField = { value: 5, type: "Double" }; - const result = await tableClient.createEntity(testEntity); - assert.notStrictEqual(result.etag, undefined); - } - const maxPageSize = 10; - let testsCompleted = 0; - // take note of the different whitespacing and query formatting: - const queriesAndExpectedResult = [ - { - queryOptions: { - filter: odata`(PartitionKey eq ${partitionKeyForQueryTest}) and (doubleField eq 5 )` - }, - expectedResult: 10 - }, - { - queryOptions: { - filter: odata`(PartitionKey eq ${partitionKeyForQueryTest}) and (doubleField eq 5.0)` - }, - expectedResult: 10 - }, - { - queryOptions: { - filter: odata`(PartitionKey eq ${partitionKeyForQueryTest}) and (doubleField eq 5)` - }, - expectedResult: 10 - }, - { - queryOptions: { - filter: odata`(PartitionKey eq ${partitionKeyForQueryTest}) and (doubleField gt 4)` - }, - expectedResult: 10 - }, - { - queryOptions: { - filter: odata`(PartitionKey eq ${partitionKeyForQueryTest}) and (doubleField lt 6)` - }, - expectedResult: 10 - }, - { - queryOptions: { - filter: odata`(PartitionKey eq ${partitionKeyForQueryTest})and(doubleField lt 6)` - }, - expectedResult: 10 - } - ]; - for (const queryTest of queriesAndExpectedResult) { - const entities = tableClient.listEntities({ - queryOptions: queryTest.queryOptions - }); - let all: AzureDataTablesTestEntity[] = []; - for await (const entity of entities.byPage({ - maxPageSize - })) { - all = [...all, ...entity]; - } - assert.strictEqual( - all.length, - queryTest.expectedResult, - `Failed on number of results with query ${queryTest.queryOptions.filter}` - ); - assert.strictEqual( - all[0].doubleField, - 5, - `Failed on value of double returned by query ${queryTest.queryOptions.filter}` - ); - testsCompleted++; - } - assert.strictEqual(testsCompleted, queriesAndExpectedResult.length); - await tableClient.deleteTable(); - }); - - it("Should respect Boolean property as edm string, @loki", async () => { + it("04. Should respect Boolean property as edm string, @loki", async () => { const tableClient = createAzureDataTablesClient( testLocalAzuriteInstance, getUniqueName("issue1259") @@ -805,9 +261,10 @@ describe("table Entity APIs test - using Azure/data-tables", () => { } catch (err1259b) { assert.ifError(err1259b); } + await tableClient.deleteTable(); }); - it("Should respect Int32 property as edm string, @loki", async () => { + it("05. Should respect Int32 property as edm string, @loki", async () => { const tableClient = createAzureDataTablesClient( testLocalAzuriteInstance, getUniqueName("issue1259") @@ -881,9 +338,10 @@ describe("table Entity APIs test - using Azure/data-tables", () => { "Expecting invalid input!" ); } + await tableClient.deleteTable(); }); - it("should delete an entity with empty row and partition keys, @loki", async () => { + it("06. should delete an entity with empty row and partition keys, @loki", async () => { const tableClient = createAzureDataTablesClient( testLocalAzuriteInstance, getUniqueName("empty") @@ -900,107 +358,10 @@ describe("table Entity APIs test - using Azure/data-tables", () => { const deleteResult = await tableClient.deleteEntity("", ""); assert.notStrictEqual(deleteResult.version, undefined); - }); - - it("should error on query with invalid filter string, @loki", async () => { - const tableClient = createAzureDataTablesClient( - testLocalAzuriteInstance, - getUniqueName("dataTables") - ); - const partitionKeyForQueryTest = createUniquePartitionKey("filter"); - const totalItems = 10; - await tableClient.createTable(); - const timestamp = new Date(); - timestamp.setDate(timestamp.getDate() + 1); - for (let i = 0; i < totalItems; i++) { - const testEntity: AzureDataTablesTestEntity = createBasicEntityForTest( - partitionKeyForQueryTest - ); - testEntity.doubleField = { value: 5, type: "Double" }; - const result = await tableClient.createEntity(testEntity); - assert.notStrictEqual(result.etag, undefined); - } - const maxPageSize = 10; - let testsCompleted = 0; - // each of these queries is invalid and generates an error against the service - // case (1 === 1) leads to status code 501 from the service, we return 400 - const queriesAndExpectedResult = [ - { - queryOptions: { - filter: odata`(1 === 1)` - }, - expectedResult: 0 - }, - { - queryOptions: { - filter: odata`(1)` - }, - expectedResult: 0 - }, - { - queryOptions: { - filter: odata`(1 1 1)` - }, - expectedResult: 0 - }, - { - queryOptions: { - filter: odata`("a" eq "a")` - }, - expectedResult: 0 - }, - { - queryOptions: { - filter: odata`(PartitionKey eq ${partitionKeyForQueryTest} eq 5.0)` - }, - expectedResult: 0 - }, - { - queryOptions: { - filter: odata`(PartitionKey eq eq ${partitionKeyForQueryTest}) and (doubleField eq 5)` - }, - expectedResult: 0 - }, - { - queryOptions: { - filter: odata`(PartitionKey eq ${partitionKeyForQueryTest}) and and (doubleField gt 4)` - }, - expectedResult: 0 - } - ]; - for (const queryTest of queriesAndExpectedResult) { - const entities = tableClient.listEntities({ - queryOptions: queryTest.queryOptions - }); - - try { - let all: AzureDataTablesTestEntity[] = []; - for await (const entity of entities.byPage({ - maxPageSize - })) { - all = [...all, ...entity]; - } - // we should not hit this assert if the exception is generated. - // it helps catch the cases which slip through filter validation - assert.strictEqual( - all.length, - -1, - `Failed on number of results with query ${queryTest.queryOptions.filter}.` - ); - } catch (filterException: any) { - assert.strictEqual( - [400, 501].includes(filterException.statusCode), - true, - `Filter "${queryTest.queryOptions.filter}". Unexpected error. We got : ${filterException.message}` - ); - } - testsCompleted++; - } - assert.strictEqual(testsCompleted, queriesAndExpectedResult.length); await tableClient.deleteTable(); }); - it("Should create entity with PartitionKey starting with %, @loki", async () => { + it("07. Should create entity with PartitionKey starting with %, @loki", async () => { const tableClient = createAzureDataTablesClient( testLocalAzuriteInstance, getUniqueName("percent") @@ -1021,7 +382,7 @@ describe("table Entity APIs test - using Azure/data-tables", () => { }); // https://github.com/Azure/Azurite/issues/1286 - it("Should update Etags with sufficient granualrity, @loki", async () => { + it("08. Should update Etags with sufficient granualrity, @loki", async () => { const tableClient = createAzureDataTablesClient( testLocalAzuriteInstance, getUniqueName("etags") @@ -1080,7 +441,7 @@ describe("table Entity APIs test - using Azure/data-tables", () => { await tableClient.deleteTable(); }); - it("Should delete entity with PartitionKey starting with %, @loki", async () => { + it("09. Should delete entity with PartitionKey starting with %, @loki", async () => { const tableClient = createAzureDataTablesClient( testLocalAzuriteInstance, getUniqueName("percent") @@ -1124,7 +485,7 @@ describe("table Entity APIs test - using Azure/data-tables", () => { }); [2, 1, 0].map((delta) => { - it(`Should insert entities containing binary properties less than or equal than 64K bytes (delta ${delta}), @loki`, async () => { + it(`10. Should insert entities containing binary properties less than or equal than 64K bytes (delta ${delta}), @loki`, async () => { const tableClient = createAzureDataTablesClient( testLocalAzuriteInstance, getUniqueName(`longbinary${delta}`) @@ -1144,7 +505,7 @@ describe("table Entity APIs test - using Azure/data-tables", () => { }); [1, 2, 3].map((delta) => { - it(`Should not insert entities containing binary properties greater than 64K bytes (delta ${delta}), @loki`, async () => { + it(`11. Should not insert entities containing binary properties greater than 64K bytes (delta ${delta}), @loki`, async () => { const tableClient = createAzureDataTablesClient( testLocalAzuriteInstance, getUniqueName(`toolongbinary${delta}`) @@ -1179,7 +540,7 @@ describe("table Entity APIs test - using Azure/data-tables", () => { }); }); - it("Should not insert entities containing string properties longer than 32K chars, @loki", async () => { + it("12. Should not insert entities containing string properties longer than 32K chars, @loki", async () => { const tableClient = createAzureDataTablesClient( testLocalAzuriteInstance, getUniqueName("longstrings") @@ -1213,7 +574,7 @@ describe("table Entity APIs test - using Azure/data-tables", () => { await tableClient.deleteTable(); }); - it("Should not merge entities containing string properties longer than 32K chars, @loki", async () => { + it("13. Should not merge entities containing string properties longer than 32K chars, @loki", async () => { const tableClient = createAzureDataTablesClient( testLocalAzuriteInstance, getUniqueName("longstrings") @@ -1253,7 +614,7 @@ describe("table Entity APIs test - using Azure/data-tables", () => { await tableClient.deleteTable(); }); - it("Should create entity with RowKey starting with %, @loki", async () => { + it("14. Should create entity with RowKey starting with %, @loki", async () => { const tableClient = createAzureDataTablesClient( testLocalAzuriteInstance, getUniqueName("percent") @@ -1274,7 +635,7 @@ describe("table Entity APIs test - using Azure/data-tables", () => { await tableClient.deleteTable(); }); - it("Should not replace entities containing string properties longer than 32K chars, @loki", async () => { + it("15. Should not replace entities containing string properties longer than 32K chars, @loki", async () => { const tableClient = createAzureDataTablesClient( testLocalAzuriteInstance, getUniqueName("longstrings") @@ -1314,7 +675,7 @@ describe("table Entity APIs test - using Azure/data-tables", () => { await tableClient.deleteTable(); }); - it("Should delete entity with RowKey starting with %, @loki", async () => { + it("16. Should delete entity with RowKey starting with %, @loki", async () => { const tableClient = createAzureDataTablesClient( testLocalAzuriteInstance, getUniqueName("percent") @@ -1358,7 +719,7 @@ describe("table Entity APIs test - using Azure/data-tables", () => { await tableClient.deleteTable(); }); - it("Should not insert entities with request body greater than 4 MB, @loki", async () => { + it("17. Should not insert entities with request body greater than 4 MB, @loki", async () => { const tableClient = createAzureDataTablesClient( testLocalAzuriteInstance, getUniqueName("longstrings") @@ -1391,7 +752,7 @@ describe("table Entity APIs test - using Azure/data-tables", () => { await tableClient.deleteTable(); }); - it("Should reject batches with request body larger than 4 MB, @loki", async () => { + it("18. Should reject batches with request body larger than 4 MB, @loki", async () => { const tableClient = createAzureDataTablesClient( testLocalAzuriteInstance, getUniqueName("bigBatch") @@ -1402,9 +763,9 @@ describe("table Entity APIs test - using Azure/data-tables", () => { // Each entity is a bit over 4 * 32 * 1024 bytes. // This means 32 of these entities will exceed the 4 MB limit. - for (var i = 0; i < 32; i++) { + for (let i = 0; i < 32; i++) { transaction.createEntity({ - partitionKey: partitionKey, + partitionKey, rowKey: "rk" + i, a: "a".repeat(32 * 1024), b: "b".repeat(32 * 1024), @@ -1433,7 +794,7 @@ describe("table Entity APIs test - using Azure/data-tables", () => { }); // https://github.com/Azure/Azurite/issues/754 - it("Should create and delete entity using batch and PartitionKey starting with %, @loki", async () => { + it("19. Should create and delete entity using batch and PartitionKey starting with %, @loki", async () => { const tableClient = createAzureDataTablesClient( testLocalAzuriteInstance, getUniqueName("percentBatch") @@ -1460,7 +821,7 @@ describe("table Entity APIs test - using Azure/data-tables", () => { await tableClient.deleteTable(); }); - it("Should not merge entities with request body greater than 4 MB, @loki", async () => { + it("20. Should not merge entities with request body greater than 4 MB, @loki", async () => { const tableClient = createAzureDataTablesClient( testLocalAzuriteInstance, getUniqueName("longstrings") @@ -1502,7 +863,7 @@ describe("table Entity APIs test - using Azure/data-tables", () => { }); // https://github.com/Azure/Azurite/issues/754 - it("Should create and delete entity using batch and RowKey starting with %, @loki", async () => { + it("21. Should create and delete entity using batch and RowKey starting with %, @loki", async () => { const tableClient = createAzureDataTablesClient( testLocalAzuriteInstance, getUniqueName("percentBatch") @@ -1532,7 +893,7 @@ describe("table Entity APIs test - using Azure/data-tables", () => { await tableClient.deleteTable(); }); - it("Should not replace entities with request body greater than 4 MB, @loki", async () => { + it("22. Should not replace entities with request body greater than 4 MB, @loki", async () => { const tableClient = createAzureDataTablesClient( testLocalAzuriteInstance, getUniqueName("longstrings") @@ -1573,69 +934,7 @@ describe("table Entity APIs test - using Azure/data-tables", () => { await tableClient.deleteTable(); }); - it("should correctly insert and retrieve entities using special values using batch api", async () => { - const tableClient = createAzureDataTablesClient( - testLocalAzuriteInstance, - getUniqueName("decodeURI") - ); - const partitionKeyForQueryTest = createUniquePartitionKey("decode"); - await tableClient.createTable(); - const timestamp = new Date(); - timestamp.setDate(timestamp.getDate() + 1); - const valuesForTest = [ - "%D1%88%D0%B5%D0%BB%D0%BB%D1%8B", - "%2B", - "%1C", - "\u001c", - "Übermütige Kühe mögen Umlaute", - "grave à et aigu é" - ]; - let testsCompleted = 0; - for (const valToTest of valuesForTest) { - const testEntity: AzureDataTablesTestEntity = createBasicEntityForTest( - partitionKeyForQueryTest - ); - testEntity.myValue = valToTest; - const transaction = new TableTransaction(); - transaction.createEntity(testEntity); - - try { - const result = await tableClient.submitTransaction(transaction.actions); - assert.ok(result.subResponses[0].rowKey); - } catch (err: any) { - assert.strictEqual(err, undefined, `We failed with ${err}`); - } - - const maxPageSize = 10; - - const entities = tableClient.listEntities({ - queryOptions: { - filter: odata`(PartitionKey eq ${partitionKeyForQueryTest}) and (myValue eq ${valToTest})` - } - }); - let all: AzureDataTablesTestEntity[] = []; - for await (const entity of entities.byPage({ - maxPageSize - })) { - all = [...all, ...entity]; - } - assert.strictEqual( - all.length, - 1, - `Failed on number of results with this value ${valToTest}` - ); - assert.strictEqual( - all[0].myValue, - valToTest, - `Failed on value returned by query ${all[0].myValue} was not the same as ${valToTest}` - ); - testsCompleted++; - } - assert.strictEqual(testsCompleted, valuesForTest.length); - await tableClient.deleteTable(); - }); - - it('Should create entity with RowKey containing comma ",", @loki', async () => { + it('23. Should create entity with RowKey containing comma ",", @loki', async () => { const tableClient = createAzureDataTablesClient( testLocalAzuriteInstance, getUniqueName("comma") @@ -1654,7 +953,7 @@ describe("table Entity APIs test - using Azure/data-tables", () => { await tableClient.deleteTable(); }); - it("Should insert entities with null properties, @loki", async () => { + it("24. Should insert entities with null properties, @loki", async () => { const tableClient = createAzureDataTablesClient( testLocalAzuriteInstance, getUniqueName("longstrings") @@ -1693,4 +992,50 @@ describe("table Entity APIs test - using Azure/data-tables", () => { await tableClient.deleteTable(); }); + + it("25. Should not return timestamp odata type with minimal meta data option, @loki", async () => { + const tableClient = createAzureDataTablesClient( + testLocalAzuriteInstance, + getUniqueName("odatadate") + ); + await tableClient.createTable(); + const partitionKey = createUniquePartitionKey("odatadate"); + const testEntity = createBasicEntityForTest(partitionKey); + testEntity.nullableString = null; + + try { + const result1 = await tableClient.createEntity(testEntity); + assert.notStrictEqual( + result1.etag, + null, + "We should have created the first test entity!" + ); + } catch (err: any) { + assert.strictEqual( + err.statusCode, + 200, + `We should not see status ${err.statusCode}!` + ); + } + + const entity: any = await tableClient.getEntity( + testEntity.partitionKey, + testEntity.rowKey, + { + requestOptions: { + customHeaders: { + accept: "application/json;odata=minimalmetadata" + } + } + } + ); + + assert.strictEqual( + typeof entity.timestamp === "string", + true, + "Timestamp should be string!" + ); + + await tableClient.deleteTable(); + }); }); diff --git a/tests/table/apis/table.entity.query.test.ts b/tests/table/apis/table.entity.query.test.ts new file mode 100644 index 000000000..dc841f4f6 --- /dev/null +++ b/tests/table/apis/table.entity.query.test.ts @@ -0,0 +1,912 @@ +// Tests in this file are using @azure/data-tables +// Tests in this file validate query logic +import * as assert from "assert"; +import { Edm, odata, TableEntity, TableTransaction } from "@azure/data-tables"; +import { configLogger } from "../../../src/common/Logger"; +import TableServer from "../../../src/table/TableServer"; +import { getUniqueName } from "../../testutils"; +import { + AzureDataTablesTestEntity, + createBasicEntityForTest +} from "../models/AzureDataTablesTestEntity"; +import { + createAzureDataTablesClient, + createTableServerForQueryTestHttps, + createUniquePartitionKey +} from "../utils/table.entity.test.utils"; +import uuid from "uuid"; +// import uuid from "uuid"; +// Set true to enable debug log +configLogger(false); +// For convenience, we have a switch to control the use +// of a local Azurite instance, otherwise we need an +// ENV VAR called AZURE_TABLE_STORAGE added to mocha +// script or launch.json containing +// Azure Storage Connection String (using SAS or Key). +const testLocalAzuriteInstance = true; + +describe("table Entity APIs test - using Azure/data-tables", () => { + let server: TableServer; + + const requestOverride = { headers: {} }; // this is not used with data tables and this test set yet + + before(async () => { + server = createTableServerForQueryTestHttps(); + await server.start(); + requestOverride.headers = { + Prefer: "return-content", + accept: "application/json;odata=nometadata" //fullmetadata" + }; + }); + + after(async () => { + await server.close(); + }); + + it("should find an int as a number, @loki", async () => { + const tableClient = createAzureDataTablesClient( + testLocalAzuriteInstance, + getUniqueName("int") + ); + const partitionKey = createUniquePartitionKey(""); + const testEntity: AzureDataTablesTestEntity = + createBasicEntityForTest(partitionKey); + + await tableClient.createTable({ requestOptions: { timeout: 60000 } }); + const result = await tableClient.createEntity(testEntity); + assert.ok(result.etag); + + const queryResult = await tableClient + .listEntities({ + queryOptions: { + filter: `PartitionKey eq '${partitionKey}' and int32Field eq 54321` + } + }) + .next(); + assert.notStrictEqual(queryResult.value, undefined); + await tableClient.deleteTable(); + }); + + it("should find a long int, @loki", async () => { + const tableClient = createAzureDataTablesClient( + testLocalAzuriteInstance, + getUniqueName("longint") + ); + const partitionKey = createUniquePartitionKey(""); + const testEntity: AzureDataTablesTestEntity = + createBasicEntityForTest(partitionKey); + + await tableClient.createTable({ requestOptions: { timeout: 60000 } }); + const result = await tableClient.createEntity(testEntity); + assert.ok(result.etag); + + const queryResult = await tableClient + .listEntities({ + queryOptions: { + filter: `PartitionKey eq '${partitionKey}' and int64Field eq 12345L` + } + }) + .next(); + assert.notStrictEqual(queryResult.value, undefined); + + await tableClient.deleteTable(); + }); + + it("should find an entity using a partition key with multiple spaces, @loki", async () => { + const tableClient = createAzureDataTablesClient( + testLocalAzuriteInstance, + getUniqueName("query1s") + ); + const partitionKey = createUniquePartitionKey("") + " with spaces"; + const testEntity: AzureDataTablesTestEntity = + createBasicEntityForTest(partitionKey); + + await tableClient.createTable({ requestOptions: { timeout: 60000 } }); + const result = await tableClient.createEntity(testEntity); + assert.ok(result.etag); + + const queryResult = await tableClient + .listEntities({ + queryOptions: { + filter: `PartitionKey eq '${partitionKey}'` + } + }) + .next(); + assert.notStrictEqual(queryResult.value, undefined); + + await tableClient.deleteTable(); + }); + + it("should provide a complete query result when using query entities by page, @loki", async () => { + const tableClient = createAzureDataTablesClient( + testLocalAzuriteInstance, + getUniqueName("querybypage") + ); + const partitionKeyForQueryTest = createUniquePartitionKey(""); + const totalItems = 20; + await tableClient.createTable(); + + for (let i = 0; i < totalItems; i++) { + const result = await tableClient.createEntity({ + partitionKey: partitionKeyForQueryTest, + rowKey: `${i}`, + foo: "testEntity" + }); + assert.notStrictEqual(result.etag, undefined); + } + + const maxPageSize = 5; + const entities = tableClient.listEntities>({ + queryOptions: { + filter: odata`PartitionKey eq ${partitionKeyForQueryTest}` + } + }); + let all: TableEntity<{ foo: string }>[] = []; + for await (const entity of entities.byPage({ + maxPageSize + })) { + all = [...all, ...entity]; + } + assert.strictEqual(all.length, totalItems); + all.sort((obj1, obj2) => { + if (parseInt(obj1.rowKey, 10) > parseInt(obj2.rowKey, 10)) { + return 1; + } else if (obj1.rowKey === obj2.rowKey) { + return 0; + } else { + return -1; + } + }); + let rowKeyChecker = 0; + while (rowKeyChecker < totalItems) { + assert.strictEqual(all[rowKeyChecker].rowKey, rowKeyChecker.toString()); + rowKeyChecker++; + } + await tableClient.deleteTable(); + }); + + it("should return the correct number of results querying with a timestamp or different SDK whitespacing behaviours, @loki", async () => { + const tableClient = createAzureDataTablesClient( + testLocalAzuriteInstance, + getUniqueName("sdkspace") + ); + const partitionKeyForQueryTest = createUniquePartitionKey(""); + const totalItems = 10; + await tableClient.createTable(); + const timestamp = new Date(); + timestamp.setDate(timestamp.getDate() + 1); + const newTimeStamp = timestamp.toISOString(); + for (let i = 0; i < totalItems; i++) { + const result = await tableClient.createEntity({ + partitionKey: partitionKeyForQueryTest, + rowKey: `${i}`, + number: i + }); + assert.notStrictEqual(result.etag, undefined); + } + const maxPageSize = 5; + let testsCompleted = 0; + // take note of the different whitespacing and query formatting: + const queriesAndExpectedResult = [ + { + queryOptions: { + filter: odata`PartitionKey eq ${partitionKeyForQueryTest} and number gt 11` + }, + expectedResult: 0 + }, + { + queryOptions: { + filter: odata`PartitionKey eq ${partitionKeyForQueryTest} and number lt 11` + }, + expectedResult: 10 + }, + { + queryOptions: { + filter: odata`PartitionKey eq ${partitionKeyForQueryTest} and number gt 11 and Timestamp lt datetime'${newTimeStamp}'` + }, + expectedResult: 0 + }, + { + queryOptions: { + filter: odata`PartitionKey eq ${partitionKeyForQueryTest} and number lt 11 and Timestamp lt datetime'${newTimeStamp}'` + }, + expectedResult: 10 + }, + { + queryOptions: { + filter: odata`(PartitionKey eq ${partitionKeyForQueryTest}) and (number lt 12) and (Timestamp lt datetime'${newTimeStamp}')` + }, + expectedResult: 10 + }, + { + queryOptions: { + filter: odata`(PartitionKey eq ${partitionKeyForQueryTest})and (number lt 12) and(Timestamp lt datetime'${newTimeStamp}')` + }, + expectedResult: 10 + }, + { + queryOptions: { + filter: odata`(PartitionKey eq ${partitionKeyForQueryTest})and(number lt 12)and(Timestamp lt datetime'${newTimeStamp}')` + }, + expectedResult: 10 + } + ]; + + for (const queryTest of queriesAndExpectedResult) { + const entities = tableClient.listEntities< + TableEntity<{ number: number }> + >({ + queryOptions: queryTest.queryOptions, + disableTypeConversion: true + }); + let all: TableEntity<{ number: number }>[] = []; + for await (const entity of entities.byPage({ + maxPageSize + })) { + all = [...all, ...entity]; + } + assert.strictEqual( + all.length, + queryTest.expectedResult, + `Failed on query ${queryTest.queryOptions.filter}` + ); + testsCompleted++; + } + assert.strictEqual(testsCompleted, 7, "Not all tests completed"); + await tableClient.deleteTable(); + }); + + it("should return the correct number of results querying with a boolean field regardless of whitespacing behaviours, @loki", async () => { + const tableClient = createAzureDataTablesClient( + testLocalAzuriteInstance, + getUniqueName("bool") + ); + const partitionKeyForQueryTest = createUniquePartitionKey("bool"); + const totalItems = 10; + await tableClient.createTable(); + const timestamp = new Date(); + timestamp.setDate(timestamp.getDate() + 1); + for (let i = 0; i < totalItems; i++) { + const myBool: boolean = i % 2 !== 0 ? true : false; + const result = await tableClient.createEntity({ + partitionKey: partitionKeyForQueryTest, + rowKey: `${i}`, + number: i, + myBool + }); + assert.notStrictEqual(result.etag, undefined); + } + const maxPageSize = 10; + let testsCompleted = 0; + // take note of the different whitespacing and query formatting: + const queriesAndExpectedResult = [ + { + queryOptions: { + filter: odata`(PartitionKey eq ${partitionKeyForQueryTest})and(myBool eq true )` + }, + expectedResult: 5 + }, + { + queryOptions: { + filter: odata`(PartitionKey eq ${partitionKeyForQueryTest}) and (myBool eq true)` + }, + expectedResult: 5 + }, + { + queryOptions: { + filter: odata`(PartitionKey eq ${partitionKeyForQueryTest}) and (myBool eq false)` + }, + expectedResult: 5 + }, + { + queryOptions: { + filter: odata`(PartitionKey eq ${partitionKeyForQueryTest})and (myBool eq false)` + }, + expectedResult: 5 + }, + { + queryOptions: { + filter: odata`(PartitionKey eq ${partitionKeyForQueryTest}) and(myBool eq false)` + }, + expectedResult: 5 + }, + { + queryOptions: { + filter: odata`(PartitionKey eq ${partitionKeyForQueryTest}) and (myBool eq false)` + }, + expectedResult: 5 + } + ]; + + for (const queryTest of queriesAndExpectedResult) { + const entities = tableClient.listEntities< + TableEntity<{ number: number }> + >({ + queryOptions: queryTest.queryOptions + }); + let all: TableEntity<{ number: number }>[] = []; + for await (const entity of entities.byPage({ + maxPageSize + })) { + all = [...all, ...entity]; + } + assert.strictEqual( + all.length, + queryTest.expectedResult, + `Failed with query ${queryTest.queryOptions.filter}` + ); + testsCompleted++; + } + assert.strictEqual(testsCompleted, queriesAndExpectedResult.length); + await tableClient.deleteTable(); + }); + + it("should return the correct number of results querying with an int64 field regardless of whitespacing behaviours, @loki", async () => { + const tableClient = createAzureDataTablesClient( + testLocalAzuriteInstance, + getUniqueName("int64") + ); + const partitionKeyForQueryTest = createUniquePartitionKey("int64"); + const totalItems = 10; + await tableClient.createTable(); + const timestamp = new Date(); + timestamp.setDate(timestamp.getDate() + 1); + for (let i = 0; i < totalItems; i++) { + const testEntity: AzureDataTablesTestEntity = createBasicEntityForTest( + partitionKeyForQueryTest + ); + testEntity.int64Field = { value: `${i}`, type: "Int64" }; + const result = await tableClient.createEntity(testEntity); + assert.notStrictEqual(result.etag, undefined); + } + const maxPageSize = 10; + let testsCompleted = 0; + type queryOptions = { + filter: string; + }; + type queryAndResult = { + queryOptions: queryOptions; + expectedResult: Edm<"Int64">; + }; + // take note of the different whitespacing and query formatting: + const queriesAndExpectedResult: queryAndResult[] = [ + { + queryOptions: { + filter: odata`(PartitionKey eq ${partitionKeyForQueryTest}) and (int64Field eq 1L )` + }, + expectedResult: { value: "1", type: "Int64" } + }, + { + queryOptions: { + filter: odata`(PartitionKey eq ${partitionKeyForQueryTest}) and (int64Field eq 2L)` + }, + expectedResult: { value: "2", type: "Int64" } + }, + { + queryOptions: { + filter: odata`(PartitionKey eq ${partitionKeyForQueryTest}) and (int64Field eq 6L)` + }, + expectedResult: { value: "6", type: "Int64" } + } + ]; + + for (const queryTest of queriesAndExpectedResult) { + const entities = tableClient.listEntities({ + queryOptions: queryTest.queryOptions, + disableTypeConversion: true + }); + let all: AzureDataTablesTestEntity[] = []; + for await (const entity of entities.byPage({ + maxPageSize + })) { + all = [...all, ...entity]; + } + assert.strictEqual( + all.length, + 1, + `Failed on number of results with query ${queryTest.queryOptions.filter}` + ); + + assert.strictEqual( + all[0].int64Field.value, + queryTest.expectedResult.value, + `Failed to validate value with query ${queryTest.queryOptions.filter}` + ); + testsCompleted++; + } + assert.strictEqual(testsCompleted, queriesAndExpectedResult.length); + await tableClient.deleteTable(); + }); + + it("should return the correct number of results querying with a double field regardless of whitespacing behaviours, @loki", async () => { + const tableClient = createAzureDataTablesClient( + testLocalAzuriteInstance, + getUniqueName("datatables") + ); + const partitionKeyForQueryTest = createUniquePartitionKey("double"); + const totalItems = 10; + await tableClient.createTable(); + const timestamp = new Date(); + timestamp.setDate(timestamp.getDate() + 1); + for (let i = 0; i < totalItems; i++) { + const testEntity: AzureDataTablesTestEntity = createBasicEntityForTest( + partitionKeyForQueryTest + ); + const result = await tableClient.createEntity(testEntity); + assert.notStrictEqual(result.etag, undefined); + } + const maxPageSize = 10; + let testsCompleted = 0; + // take note of the different whitespacing and query formatting: + const queriesAndExpectedResult = [ + { + queryOptions: { + filter: odata`(PartitionKey eq ${partitionKeyForQueryTest}) and (doubleField eq 54.321 )` + }, + expectedResult: 10 + }, + { + queryOptions: { + filter: odata`(PartitionKey eq ${partitionKeyForQueryTest}) and (doubleField eq 54.321)` + }, + expectedResult: 10 + }, + { + queryOptions: { + filter: odata`(PartitionKey eq ${partitionKeyForQueryTest}) and (doubleField eq 54.321)` + }, + expectedResult: 10 + }, + { + queryOptions: { + filter: odata`(PartitionKey eq ${partitionKeyForQueryTest}) and (doubleField gt 53.321)` + }, + expectedResult: 10 + }, + { + queryOptions: { + filter: odata`(PartitionKey eq ${partitionKeyForQueryTest}) and (doubleField lt 57.321)` + }, + expectedResult: 10 + } + ]; + for (const queryTest of queriesAndExpectedResult) { + const entities = tableClient.listEntities({ + queryOptions: queryTest.queryOptions + }); + let all: AzureDataTablesTestEntity[] = []; + for await (const entity of entities.byPage({ + maxPageSize + })) { + all = [...all, ...entity]; + } + assert.strictEqual( + all.length, + queryTest.expectedResult, + `Failed on number of results with query ${queryTest.queryOptions.filter}` + ); + assert.strictEqual( + all[0].doubleField, + 54.321, + `Failed on value of double returned by query ${queryTest.queryOptions.filter}` + ); + testsCompleted++; + } + assert.strictEqual(testsCompleted, queriesAndExpectedResult.length); + await tableClient.deleteTable(); + }); + + it("should return the correct number of results querying with a double field containing a single digit number regardless of whitespacing behaviours, @loki", async () => { + const tableClient = createAzureDataTablesClient( + testLocalAzuriteInstance, + getUniqueName("datatables") + ); + const partitionKeyForQueryTest = createUniquePartitionKey("double"); + const totalItems = 10; + await tableClient.createTable(); + const timestamp = new Date(); + timestamp.setDate(timestamp.getDate() + 1); + for (let i = 0; i < totalItems; i++) { + const testEntity: AzureDataTablesTestEntity = createBasicEntityForTest( + partitionKeyForQueryTest + ); + testEntity.doubleField = { value: 5, type: "Double" }; + const result = await tableClient.createEntity(testEntity); + assert.notStrictEqual(result.etag, undefined); + } + const maxPageSize = 10; + let testsCompleted = 0; + // take note of the different whitespacing and query formatting: + const queriesAndExpectedResult = [ + { + queryOptions: { + filter: odata`(PartitionKey eq ${partitionKeyForQueryTest}) and (doubleField eq 5 )` + }, + expectedResult: 10 + }, + { + queryOptions: { + filter: odata`(PartitionKey eq ${partitionKeyForQueryTest}) and (doubleField eq 5.0)` + }, + expectedResult: 10 + }, + { + queryOptions: { + filter: odata`(PartitionKey eq ${partitionKeyForQueryTest}) and (doubleField eq 5)` + }, + expectedResult: 10 + }, + { + queryOptions: { + filter: odata`(PartitionKey eq ${partitionKeyForQueryTest}) and (doubleField gt 4)` + }, + expectedResult: 10 + }, + { + queryOptions: { + filter: odata`(PartitionKey eq ${partitionKeyForQueryTest}) and (doubleField lt 6)` + }, + expectedResult: 10 + }, + { + queryOptions: { + filter: odata`(PartitionKey eq ${partitionKeyForQueryTest})and(doubleField lt 6)` + }, + expectedResult: 10 + } + ]; + for (const queryTest of queriesAndExpectedResult) { + const entities = tableClient.listEntities({ + queryOptions: queryTest.queryOptions + }); + let all: AzureDataTablesTestEntity[] = []; + for await (const entity of entities.byPage({ + maxPageSize + })) { + all = [...all, ...entity]; + } + assert.strictEqual( + all.length, + queryTest.expectedResult, + `Failed on number of results with query ${queryTest.queryOptions.filter}` + ); + assert.strictEqual( + all[0].doubleField, + 5, + `Failed on value of double returned by query ${queryTest.queryOptions.filter}` + ); + testsCompleted++; + } + assert.strictEqual(testsCompleted, queriesAndExpectedResult.length); + await tableClient.deleteTable(); + }); + + it("should error on query with invalid filter string, @loki", async () => { + const tableClient = createAzureDataTablesClient( + testLocalAzuriteInstance, + getUniqueName("dataTables") + ); + const partitionKeyForQueryTest = createUniquePartitionKey("filter"); + const totalItems = 10; + await tableClient.createTable(); + const timestamp = new Date(); + timestamp.setDate(timestamp.getDate() + 1); + for (let i = 0; i < totalItems; i++) { + const testEntity: AzureDataTablesTestEntity = createBasicEntityForTest( + partitionKeyForQueryTest + ); + testEntity.doubleField = { value: 5, type: "Double" }; + const result = await tableClient.createEntity(testEntity); + assert.notStrictEqual(result.etag, undefined); + } + const maxPageSize = 10; + let testsCompleted = 0; + // each of these queries is invalid and generates an error against the service + // case (1 === 1) leads to status code 501 from the service, we return 400 + const queriesAndExpectedResult = [ + { + queryOptions: { + filter: odata`(1 === 1)` + }, + expectedResult: 0 + }, + { + queryOptions: { + filter: odata`(1)` + }, + expectedResult: 0 + }, + { + queryOptions: { + filter: odata`(1 1 1)` + }, + expectedResult: 0 + }, + { + queryOptions: { + filter: odata`("a" eq "a")` + }, + expectedResult: 0 + }, + { + queryOptions: { + filter: odata`(PartitionKey eq ${partitionKeyForQueryTest} eq 5.0)` + }, + expectedResult: 0 + }, + { + queryOptions: { + filter: odata`(PartitionKey eq eq ${partitionKeyForQueryTest}) and (doubleField eq 5)` + }, + expectedResult: 0 + }, + { + queryOptions: { + filter: odata`(PartitionKey eq ${partitionKeyForQueryTest}) and and (doubleField gt 4)` + }, + expectedResult: 0 + } + ]; + for (const queryTest of queriesAndExpectedResult) { + const entities = tableClient.listEntities({ + queryOptions: queryTest.queryOptions + }); + + try { + let all: AzureDataTablesTestEntity[] = []; + for await (const entity of entities.byPage({ + maxPageSize + })) { + all = [...all, ...entity]; + } + // we should not hit this assert if the exception is generated. + // it helps catch the cases which slip through filter validation + assert.strictEqual( + all.length, + -1, + `Failed on number of results with query ${queryTest.queryOptions.filter}.` + ); + } catch (filterException: any) { + assert.strictEqual( + [400, 501].includes(filterException.statusCode), + true, + `Filter "${queryTest.queryOptions.filter}". Unexpected error. We got : ${filterException.message}` + ); + } + testsCompleted++; + } + assert.strictEqual(testsCompleted, queriesAndExpectedResult.length); + await tableClient.deleteTable(); + }); + + it("should correctly insert and query entities using special values using batch api", async () => { + const tableClient = createAzureDataTablesClient( + testLocalAzuriteInstance, + getUniqueName("decodeURI") + ); + const partitionKeyForQueryTest = createUniquePartitionKey("decode"); + await tableClient.createTable(); + const timestamp = new Date(); + timestamp.setDate(timestamp.getDate() + 1); + const valuesForTest = [ + "%D1%88%D0%B5%D0%BB%D0%BB%D1%8B", + "%2B", + "%1C", + "\u001c", + "Übermütige Kühe mögen Umlaute", + "grave à et aigu é" + ]; + let testsCompleted = 0; + for (const valToTest of valuesForTest) { + const testEntity: AzureDataTablesTestEntity = createBasicEntityForTest( + partitionKeyForQueryTest + ); + testEntity.myValue = valToTest; + const transaction = new TableTransaction(); + transaction.createEntity(testEntity); + + try { + const result = await tableClient.submitTransaction(transaction.actions); + assert.ok(result.subResponses[0].rowKey); + } catch (err: any) { + assert.strictEqual(err, undefined, `We failed with ${err}`); + } + + const maxPageSize = 10; + + const entities = tableClient.listEntities({ + queryOptions: { + filter: odata`(PartitionKey eq ${partitionKeyForQueryTest}) and (myValue eq ${valToTest})` + } + }); + let all: AzureDataTablesTestEntity[] = []; + for await (const entity of entities.byPage({ + maxPageSize + })) { + all = [...all, ...entity]; + } + assert.strictEqual( + all.length, + 1, + `Failed on number of results with this value ${valToTest}` + ); + assert.strictEqual( + all[0].myValue, + valToTest, + `Failed on value returned by query ${all[0].myValue} was not the same as ${valToTest}` + ); + testsCompleted++; + } + assert.strictEqual(testsCompleted, valuesForTest.length); + await tableClient.deleteTable(); + }); + + it("should correctly return results for query on a binary property, @loki", async () => { + const tableClient = createAzureDataTablesClient( + testLocalAzuriteInstance, + getUniqueName("binquery") + ); + const partitionKeyForQueryTest = createUniquePartitionKey("bin"); + const totalItems = 10; + await tableClient.createTable(); + const timestamp = new Date(); + timestamp.setDate(timestamp.getDate() + 1); + for (let i = 0; i < totalItems; i++) { + const entity = createBasicEntityForTest(partitionKeyForQueryTest); + if (i % 2 === 0) { + entity.binaryField = Buffer.from("binaryData"); // should equal YmluYXJ5RGF0YQ== + } + const result = await tableClient.createEntity(entity); + assert.notStrictEqual(result.etag, undefined); + } + const maxPageSize = 10; + let testsCompleted = 0; + const queriesAndExpectedResult = [ + { + queryOptions: { + filter: odata`(PartitionKey eq ${partitionKeyForQueryTest}) and (binaryField eq binary'62696e61727944617461')` + }, + expectedResult: 5 + }, + { + queryOptions: { + filter: odata`(PartitionKey eq ${partitionKeyForQueryTest}) and (binaryField eq X'62696e61727944617461')` + }, + expectedResult: 5 + } + ]; + + for (const queryTest of queriesAndExpectedResult) { + const entities = tableClient.listEntities< + TableEntity<{ number: number }> + >({ + queryOptions: queryTest.queryOptions + }); + let all: TableEntity<{ number: number }>[] = []; + for await (const entity of entities.byPage({ + maxPageSize + })) { + all = [...all, ...entity]; + } + assert.strictEqual( + all.length, + queryTest.expectedResult, + `Failed with query ${queryTest.queryOptions.filter}` + ); + testsCompleted++; + } + assert.strictEqual(testsCompleted, queriesAndExpectedResult.length); + await tableClient.deleteTable(); + }); + + it("should find both old and new guids (backwards compatible) when using guid type, @loki", async () => { + const tableClient = createAzureDataTablesClient( + testLocalAzuriteInstance, + "reproTable" + ); + const partitionKeyForQueryTest = "1"; // partition key used in repro db with old schema + const totalItems = 10; + await tableClient.createTable(); + const timestamp = new Date(); + timestamp.setDate(timestamp.getDate() + 1); + const guidEntities: AzureDataTablesTestEntity[] = []; + const guidFromOldDB = "5d62a508-f0f7-45bc-be10-4b192d7fed2d"; + + const dupOldGuid = createBasicEntityForTest(partitionKeyForQueryTest); + dupOldGuid.guidField.value = guidFromOldDB; + const dupResult = await tableClient.createEntity(dupOldGuid); + assert.notStrictEqual(dupResult.etag, undefined); + /// Edwin quick test remove afterwards! + const getResult = await tableClient.getEntity( + dupOldGuid.partitionKey, + dupOldGuid.rowKey + ); + assert.notStrictEqual(getResult.etag, undefined); + /// Edwin quick test remove afterwards! + guidEntities.push(dupOldGuid); + + for (let i = 1; i < totalItems; i++) { + const entity = createBasicEntityForTest(partitionKeyForQueryTest); + entity.guidField.value = uuid.v4(); + // The chances of hitting a duplicate GUID are extremely low + // will only affect our pipelines in dev + const result = await tableClient.createEntity(entity); + assert.notStrictEqual(result.etag, undefined); + guidEntities.push(entity); + } + const maxPageSize = 10; + let testsCompleted = 0; + const queriesAndExpectedResult = [ + { + queryOptions: { + filter: odata`(PartitionKey eq ${partitionKeyForQueryTest}) and (guidField eq guid'${guidFromOldDB}')` + }, + expectedResult: 2, // we expect the old GUID to be found for backwards compatability and the one we just inserted + // not sure that this is the right behavior + expectedValue: guidEntities[0].guidField.value + }, + { + queryOptions: { + filter: odata`(PartitionKey eq ${partitionKeyForQueryTest}) and (guidField eq guid'${guidEntities[1].guidField.value}')` + }, + expectedResult: 1, + expectedValue: guidEntities[1].guidField.value + }, + { + queryOptions: { + filter: odata`(PartitionKey eq ${partitionKeyForQueryTest})and (guidField eq ${guidEntities[1].guidField.value})` + }, + expectedResult: 0, + expectedValue: undefined + }, + { + queryOptions: { + filter: odata`(PartitionKey eq ${partitionKeyForQueryTest}) and(guidField eq guid'${guidEntities[8].guidField.value}')` + }, + expectedResult: 1, + expectedValue: guidEntities[8].guidField.value + }, + { + queryOptions: { + filter: odata`(PartitionKey eq ${partitionKeyForQueryTest})and(guidField eq '${guidEntities[8].guidField.value}')` + }, + expectedResult: 0, + expectedValue: undefined + } + ]; + + for (const queryTest of queriesAndExpectedResult) { + const entities = tableClient.listEntities({ + queryOptions: queryTest.queryOptions + }); + let all: AzureDataTablesTestEntity[] = []; + for await (const entity of entities.byPage({ + maxPageSize + })) { + all = [...all, ...entity]; + } + assert.strictEqual( + all.length, + queryTest.expectedResult, + `Failed with query ${queryTest.queryOptions.filter}` + ); + if (all[0] !== undefined) { + assert.strictEqual( + all[0].guidField.value, + queryTest.expectedValue, + `Value ${all[0].guidField.value} was not equal to ${queryTest.expectedValue} with query ${queryTest.queryOptions.filter}` + ); + } else { + assert.strictEqual( + all[0], + queryTest.expectedValue, + `Value ${all[0]} was not equal to ${queryTest.expectedValue} with query ${queryTest.queryOptions.filter}` + ); + } + + testsCompleted++; + } + assert.strictEqual(testsCompleted, queriesAndExpectedResult.length); + await tableClient.deleteTable(); + }); +}); diff --git a/tests/table/apis/table.entity.rest.test.ts b/tests/table/apis/table.entity.rest.test.ts index 808102d1e..a7610e761 100644 --- a/tests/table/apis/table.entity.rest.test.ts +++ b/tests/table/apis/table.entity.rest.test.ts @@ -564,6 +564,78 @@ describe("table Entity APIs REST tests", () => { } }); + // https://github.com/Azure/Azurite/issues/1428 + it("Should not receive any results when querying with filter and top = 0, @loki", async () => { + // first create the table for these tests + reproFlowsTableName = getUniqueName("top"); + const body = JSON.stringify({ + TableName: reproFlowsTableName + }); + const createTableHeaders = { + "Content-Type": "application/json", + Accept: "application/json;odata=nometadata" + }; + const createTableResult = await postToAzurite( + "Tables", + body, + createTableHeaders + ); + assert.strictEqual(createTableResult.status, 201); + + // now create entities for these tests + const createEntityHeaders = { + "x-ms-version": "2019-02-02", + "Content-Type": "application/json", + Accept: "application/json;odata=nometadata" + }; + const partitionKey = createUniquePartitionKey(); + + // first create entities to query + + for (let i = 0; i < 5; i++) { + const rowKey = i.toString(); + const createEntityResult = await postToAzurite( + reproFlowsTableName, + `{"PartitionKey":"${partitionKey}","RowKey":"${rowKey}"}`, + createEntityHeaders + ); + + assert.strictEqual( + createEntityResult.status, + 201, + `We failed to create the entity 0${i.toString()} to prepare rest query test` + ); + } + + // this is the query from storage explorer based on the repro in the issue: + // GET /devstoreaccount1/test01?%24select=&%24filter=PartitionKey%20eq%20%270%27&%24top=0 HTTP/1.1" 200 - + await getToAzurite( + `${reproFlowsTableName}`, + { + "x-ms-version": "2021-06-08", + "Content-Type": "application/json", + Accept: "application/json;odata=nometadata" + }, + "?%24select=&%24filter=PartitionKey%20eq%20%270%27&%24top=0" + ) + .catch((getErr) => { + assert.strictEqual( + getErr.response.status, + 200, + "We should not error on query!" + ); + }) + .then((response) => { + if (response) { + assert.strictEqual( + response.status, + 200, + `${response.status} was not expected status code for query!` + ); + } + }); + }); + /** * Check that ifmatch * update works... * if etag == *, then tableClient.updateEntity is calling "Merge" via PATCH with merge option. diff --git a/tests/table/apis/table.entity.test.ts b/tests/table/apis/table.entity.test.ts index 8f39e9ba0..df1d05ec3 100644 --- a/tests/table/apis/table.entity.test.ts +++ b/tests/table/apis/table.entity.test.ts @@ -656,37 +656,6 @@ describe("table Entity APIs test - using Azure-Storage", () => { }); }); - ["MERGE", "REPLACE"].forEach((operation) => { - it(`${operation} of non-existent entity with ${label} in a BATCH, @loki`, (done) => { - requestOverride.headers = { - Prefer: "return-content", - accept: "application/json;odata=fullmetadata" - }; - - const batchEntity1 = new TestEntity( - !pk ? pk : getUniqueName(pk), - !rk ? rk : getUniqueName(rk), - "value1" - ); - - const entityBatch: Azure.TableBatch = new Azure.TableBatch(); - entityBatch.addOperation(operation, batchEntity1); - - tableService.executeBatch( - tableName, - entityBatch, - (updateError, updateResult, updateResponse) => { - if (!updateError) { - assert.fail("Test should have thrown an error"); - } else { - assert.strictEqual(updateResponse.statusCode, 404); - done(); - } - } - ); - }); - }); - ["MERGE", "REPLACE"].forEach((operation) => { it(`${operation} of entity with ${label} in a BATCH, @loki`, (done) => { requestOverride.headers = { diff --git a/tests/table/database/__db_table_guid_bin__.json b/tests/table/database/__db_table_guid_bin__.json new file mode 100644 index 000000000..5ddbe3e72 --- /dev/null +++ b/tests/table/database/__db_table_guid_bin__.json @@ -0,0 +1,232 @@ +{ + "filename": "G:\\repo\\azurite_main\\azurite\\__azurite_db_table__.json", + "collections": [ + { + "name": "$TABLES_COLLECTION$", + "data": [ + { + "account": "devstoreaccount1", + "table": "reproTable", + "meta": { + "revision": 0, + "created": 1656085720173, + "version": 0 + }, + "$loki": 1 + } + ], + "idIndex": null, + "binaryIndices": { + "account": { + "name": "account", + "dirty": false, + "values": [ + 0 + ] + }, + "table": { + "name": "table", + "dirty": false, + "values": [ + 0 + ] + } + }, + "constraints": null, + "uniqueNames": [], + "transforms": {}, + "objType": "$TABLES_COLLECTION$", + "dirty": false, + "cachedIndex": null, + "cachedBinaryIndex": null, + "cachedData": null, + "adaptiveBinaryIndices": true, + "transactional": false, + "cloneObjects": false, + "cloneMethod": "parse-stringify", + "asyncListeners": false, + "disableMeta": false, + "disableChangesApi": true, + "disableDeltaChangesApi": true, + "autoupdate": false, + "serializableIndices": true, + "disableFreeze": true, + "ttl": null, + "maxId": 1, + "DynamicViews": [], + "events": { + "insert": [], + "update": [], + "pre-insert": [], + "pre-update": [], + "close": [], + "flushbuffer": [], + "error": [], + "delete": [ + null + ], + "warning": [ + null + ] + }, + "changes": [], + "dirtyIds": [] + }, + { + "name": "$SERVICES_COLLECTION$", + "data": [], + "idIndex": null, + "binaryIndices": {}, + "constraints": null, + "uniqueNames": [ + "accountName" + ], + "transforms": {}, + "objType": "$SERVICES_COLLECTION$", + "dirty": false, + "cachedIndex": null, + "cachedBinaryIndex": null, + "cachedData": null, + "adaptiveBinaryIndices": true, + "transactional": false, + "cloneObjects": false, + "cloneMethod": "parse-stringify", + "asyncListeners": false, + "disableMeta": false, + "disableChangesApi": true, + "disableDeltaChangesApi": true, + "autoupdate": false, + "serializableIndices": true, + "disableFreeze": true, + "ttl": null, + "maxId": 0, + "DynamicViews": [], + "events": { + "insert": [], + "update": [], + "pre-insert": [], + "pre-update": [], + "close": [], + "flushbuffer": [], + "error": [], + "delete": [ + null + ], + "warning": [ + null + ] + }, + "changes": [], + "dirtyIds": [] + }, + { + "name": "devstoreaccount1$reproTable", + "data": [ + { + "PartitionKey": "1", + "RowKey": "1", + "properties": { + "PartitionKey": "1", + "RowKey": "1", + "guidField": "5d62a508-f0f7-45bc-be10-4b192d7fed2d", + "guidField@odata.type": "Edm.Guid", + "binaryProp": "cmVwcm9WYWx1ZQ==", + "binaryProp@odata.type": "Edm.Binary", + "Timestamp": "2022-06-24T15:50:57.0550000Z", + "Timestamp@odata.type": "Edm.DateTime" + }, + "lastModifiedTime": "2022-06-24T15:50:57.055Z", + "eTag": "W/\"datetime'2022-06-24T15%3A50%3A57.055658Z'\"", + "meta": { + "revision": 0, + "created": 1656085857057, + "version": 0 + }, + "$loki": 1 + } + ], + "idIndex": null, + "binaryIndices": { + "PartitionKey": { + "name": "PartitionKey", + "dirty": false, + "values": [ + 0 + ] + }, + "RowKey": { + "name": "RowKey", + "dirty": false, + "values": [ + 0 + ] + } + }, + "constraints": null, + "uniqueNames": [], + "transforms": {}, + "objType": "devstoreaccount1$reproTable", + "dirty": false, + "cachedIndex": null, + "cachedBinaryIndex": null, + "cachedData": null, + "adaptiveBinaryIndices": true, + "transactional": false, + "cloneObjects": false, + "cloneMethod": "parse-stringify", + "asyncListeners": false, + "disableMeta": false, + "disableChangesApi": true, + "disableDeltaChangesApi": true, + "autoupdate": false, + "serializableIndices": true, + "disableFreeze": true, + "ttl": null, + "maxId": 1, + "DynamicViews": [], + "events": { + "insert": [], + "update": [], + "pre-insert": [], + "pre-update": [], + "close": [], + "flushbuffer": [], + "error": [], + "delete": [ + null + ], + "warning": [ + null + ] + }, + "changes": [], + "dirtyIds": [] + } + ], + "databaseVersion": 1.5, + "engineVersion": 1.5, + "autosave": true, + "autosaveInterval": 5000, + "autosaveHandle": null, + "throttledSaves": true, + "options": { + "autosave": true, + "autosaveInterval": 5000, + "serializationMethod": "normal", + "destructureDelimiter": "$<\n" + }, + "persistenceMethod": "fs", + "persistenceAdapter": null, + "verbose": false, + "events": { + "init": [ + null + ], + "loaded": [], + "flushChanges": [], + "close": [], + "changes": [], + "warning": [] + }, + "ENV": "NODEJS" +} \ No newline at end of file diff --git a/tests/table/models/AzureDataTablesTestEntity.ts b/tests/table/models/AzureDataTablesTestEntity.ts index 6e5f76fce..b36a30105 100644 --- a/tests/table/models/AzureDataTablesTestEntity.ts +++ b/tests/table/models/AzureDataTablesTestEntity.ts @@ -19,7 +19,7 @@ export function createBasicEntityForTest( /** * This is the Entity Class used by Azure Data-Tables SDK tests - * + * https://docs.microsoft.com/en-us/rest/api/storageservices/payload-format-for-table-service-operations * @export * @class AzureDataTablesTestEntity */ @@ -30,8 +30,11 @@ export class AzureDataTablesTestEntity { public int32Field: number = 54321; public int64Field: Edm<"Int64"> = { value: "12345", type: "Int64" }; public doubleField: Edm<"Double"> = { value: 54.321, type: "Double" }; + public guidField: Edm<"Guid"> = { value: "", type: "Guid" }; public nullableString: string | null = "notNull"; - public binaryField: Buffer = Buffer.alloc(8); + public binaryField: Buffer = Buffer.from("11111111"); + public booleanField: boolean = true; + public dateField: Edm<"DateTime"> = { value: "", type: "DateTime" }; constructor(part: string, row: string, value: string) { this.partitionKey = part; this.rowKey = row; diff --git a/tests/table/persistence/LokiTableMetadataStore.test.ts b/tests/table/unit/LokiJsQueryTranscriber.unit.test.2.ts similarity index 85% rename from tests/table/persistence/LokiTableMetadataStore.test.ts rename to tests/table/unit/LokiJsQueryTranscriber.unit.test.2.ts index 40e552edc..09c2a085e 100644 --- a/tests/table/persistence/LokiTableMetadataStore.test.ts +++ b/tests/table/unit/LokiJsQueryTranscriber.unit.test.2.ts @@ -1,5 +1,5 @@ import * as assert from "assert"; -import LokiTableMetadataStore from "../../../src/table/persistence/LokiTableMetadataStore"; +import LokiJsQueryTranscriberFactory from "../../../src/table/persistence/QueryTranscriber/LokiJsQueryTranscriberFactory"; const entityQueries = [ { @@ -136,17 +136,24 @@ const entityQueries = [ } ]; -describe("unit tests for converting an entity OData query to a JavaScript query for LokiJS", () => { +describe("Unit tests for converting an entity OData query to a JavaScript query for LokiJS", () => { entityQueries.forEach(({ input, expected }) => { it(`should transform '${input}' into '${expected}'`, (done) => { try { - const actual = LokiTableMetadataStore.transformEntityQuery(input); + const queryTranscriber = + LokiJsQueryTranscriberFactory.createEntityQueryTranscriber( + input, + "lokiJsQueryTranscriber" + ); + + queryTranscriber.transcribe(); + const actual = queryTranscriber.getTranscribedQuery(); assert.strictEqual(actual, expected); } catch (err: any) { if (input === "1 eq 1") assert.strictEqual( err.message, - "Invalid token after value", + "Invalid number of terms in query!", `Did not get expected error on invalid query ${input}` ); } @@ -190,17 +197,25 @@ const tableQueries = [ } ]; -describe("unit tests for converting an table OData query to a JavaScript query for LokiJS", () => { +describe("Unit tests for converting an table OData query to a JavaScript query for LokiJS", () => { tableQueries.forEach(({ input, expected }) => { it(`should transform '${input}' into '${expected}'`, (done) => { try { - const actual = LokiTableMetadataStore.transformTableQuery(input); + const queryTranscriber = + LokiJsQueryTranscriberFactory.createTableQueryTranscriber( + input, + "lokiJsTableQueryTranscriber" + ); + + queryTranscriber.transcribe(); + + const actual = queryTranscriber.getTranscribedQuery(); assert.strictEqual(actual, expected); } catch (err: any) { if (input === "1 eq 1") assert.strictEqual( err.message, - "Invalid token after value", + "Invalid number of terms in query!", `Did not get expected error on invalid query ${input}` ); } diff --git a/tests/table/unit/LokiJsQueryTranscriber.unit.test.ts b/tests/table/unit/LokiJsQueryTranscriber.unit.test.ts new file mode 100644 index 000000000..73599c513 --- /dev/null +++ b/tests/table/unit/LokiJsQueryTranscriber.unit.test.ts @@ -0,0 +1,433 @@ +import * as assert from "assert"; +import LokiJsQueryTranscriberFactory from "../../../src/table/persistence/QueryTranscriber/LokiJsQueryTranscriberFactory"; + +describe("LokiJs Query Transcribing unit tests, also ensures backward compatability with earlier schemas:", () => { + it("correctly transcribes a simple query with irregular whitespace", async () => { + // use the expected response string to compare the reult to. + const testArray = [ + { + originalQuery: "( )", + expectedQuery: "return ( ( ) )" + }, + { + originalQuery: "(partitionKey eq 'test')", + expectedQuery: "return ( ( item.properties.partitionKey === 'test' ) )" + }, + { + originalQuery: "( partitionKey eq 'test' )", + expectedQuery: "return ( ( item.properties.partitionKey === 'test' ) )" + }, + { + originalQuery: "('test' eq partitionKey)", + expectedQuery: "return ( ( 'test' === item.properties.partitionKey ) )" + }, + { + originalQuery: "( 'test' eq partitionKey )", + expectedQuery: "return ( ( 'test' === item.properties.partitionKey ) )" + } + ]; + + for (const test of testArray) { + const queryTranscriber = + LokiJsQueryTranscriberFactory.createEntityQueryTranscriber( + test.originalQuery, + "stateMachineTest" + ); + + queryTranscriber.transcribe(); + assert.strictEqual( + queryTranscriber.getTranscribedQuery(), + test.expectedQuery, + `Transcribed query "${queryTranscriber.getTranscribedQuery()}" did not match expected ${ + test.expectedQuery + }` + ); + } + }); + + it("correctly transcribes a query for a value of type boolean", async () => { + // use the expected response string to compare the reult to. + const testArray = [ + { + originalQuery: "(myBoolean eq false )", + expectedQuery: "return ( ( item.properties.myBoolean === false ) )" + }, + { + originalQuery: "( true eq myBoolean )", + expectedQuery: "return ( ( true === item.properties.myBoolean ) )" + } + ]; + + for (const test of testArray) { + const queryTranscriber = + LokiJsQueryTranscriberFactory.createEntityQueryTranscriber( + test.originalQuery, + "stateMachineTest" + ); + + queryTranscriber.transcribe(); + assert.strictEqual( + queryTranscriber.getTranscribedQuery(), + test.expectedQuery, + `Transcribed query "${queryTranscriber.getTranscribedQuery()}" did not match expected ${ + test.expectedQuery + }` + ); + } + }); + + it("correctly transcribes a query for a value of type double", async () => { + // use the expected response string to compare the reult to. + const testArray = [ + { + originalQuery: "(myDouble lt 123.01 )", + expectedQuery: "return ( ( item.properties.myDouble < 123.01 ) )" + }, + { + originalQuery: "( 123.01 gt myDouble )", + expectedQuery: "return ( ( 123.01 > item.properties.myDouble ) )" + } + ]; + + for (const test of testArray) { + const queryTranscriber = + LokiJsQueryTranscriberFactory.createEntityQueryTranscriber( + test.originalQuery, + "stateMachineTest" + ); + + queryTranscriber.transcribe(); + assert.strictEqual( + queryTranscriber.getTranscribedQuery(), + test.expectedQuery, + `Transcribed query "${queryTranscriber.getTranscribedQuery()}" did not match expected ${ + test.expectedQuery + }` + ); + } + }); + + it("correctly transcribes a query for a value of type Guid", async () => { + // use the expected response string to compare the reult to. + // guid should have both simple string rep and base64 encoded + // version for legacy schema compatibility + const testArray = [ + { + originalQuery: + "(myGuid eq guid'12345678-1234-1234-1234-1234567890ab' )", + expectedQuery: + "return ( ( ( item.properties.myGuid === '12345678-1234-1234-1234-1234567890ab' ) || ( item.properties.myGuid === 'MTIzNDU2NzgtMTIzNC0xMjM0LTEyMzQtMTIzNDU2Nzg5MGFi' ) ) )" + } + ]; + + for (const test of testArray) { + const queryTranscriber = + LokiJsQueryTranscriberFactory.createEntityQueryTranscriber( + test.originalQuery, + "stateMachineTest" + ); + + queryTranscriber.transcribe(); + assert.strictEqual( + queryTranscriber.getTranscribedQuery(), + test.expectedQuery, + `Transcribed query "${queryTranscriber.getTranscribedQuery()}" did not match expected ${ + test.expectedQuery + }` + ); + } + }); + + it("correctly transcribes a query for a value of type string", async () => { + // use the expected response string to compare the reult to. + const testArray = [ + { + originalQuery: "(myString eq '123.01' )", + expectedQuery: "return ( ( item.properties.myString === '123.01' ) )" + }, + { + originalQuery: "( '123.01L' eq myString )", + expectedQuery: "return ( ( '123.01L' === item.properties.myString ) )" + }, + { + originalQuery: "( 'I am a string' eq myString )", + expectedQuery: + "return ( ( 'I am a string' === item.properties.myString ) )" + } + ]; + + for (const test of testArray) { + const queryTranscriber = + LokiJsQueryTranscriberFactory.createEntityQueryTranscriber( + test.originalQuery, + "stateMachineTest" + ); + + queryTranscriber.transcribe(); + assert.strictEqual( + queryTranscriber.getTranscribedQuery(), + test.expectedQuery, + `Transcribed query "${queryTranscriber.getTranscribedQuery()}" did not match expected ${ + test.expectedQuery + }` + ); + } + }); + + it("correctly transcribes a query for a value of type integer", async () => { + // use the expected response string to compare the reult to. + const testArray = [ + { + originalQuery: "(myInt eq 123 )", + expectedQuery: "return ( ( item.properties.myInt === 123 ) )" + }, + { + originalQuery: "( -123 lt myInt )", + expectedQuery: "return ( ( -123 < item.properties.myInt ) )" + } + ]; + + for (const test of testArray) { + const queryTranscriber = + LokiJsQueryTranscriberFactory.createEntityQueryTranscriber( + test.originalQuery, + "stateMachineTest" + ); + + queryTranscriber.transcribe(); + assert.strictEqual( + queryTranscriber.getTranscribedQuery(), + test.expectedQuery, + `Transcribed query "${queryTranscriber.getTranscribedQuery()}" did not match expected ${ + test.expectedQuery + }` + ); + } + }); + + it("correctly transcribes a query for a value of type long", async () => { + // use the expected response string to compare the reult to. + const testArray = [ + { + originalQuery: "(myLong eq 123.01L )", + expectedQuery: "return ( ( item.properties.myLong === '123.01' ) )" + }, + { + originalQuery: "( 123.01L eq myLong )", + expectedQuery: "return ( ( '123.01' === item.properties.myLong ) )" + }, + { + originalQuery: "PartitionKey eq 'partition1' and int64Field eq 12345L", + expectedQuery: + "return ( item.properties.PartitionKey === 'partition1' && item.properties.int64Field === '12345' )" + } + ]; + + for (const test of testArray) { + const queryTranscriber = + LokiJsQueryTranscriberFactory.createEntityQueryTranscriber( + test.originalQuery, + "stateMachineTest" + ); + + queryTranscriber.transcribe(); + assert.strictEqual( + queryTranscriber.getTranscribedQuery(), + test.expectedQuery, + `Transcribed query "${queryTranscriber.getTranscribedQuery()}" did not match expected ${ + test.expectedQuery + }` + ); + } + }); + + it("correctly transcribes a query for a value of type date", async () => { + // use the expected response string to compare the reult to. + const timestamp = new Date(); + timestamp.setDate(timestamp.getDate() + 1); + const newTimeStamp = timestamp.toISOString(); + const testArray = [ + { + originalQuery: `(myDate eq datetime'${newTimeStamp}' )`, + expectedQuery: `return ( ( new Date(item.properties.myDate).getTime() === new Date('${newTimeStamp}').getTime() ) )` + }, + { + originalQuery: `( datetime'${newTimeStamp}' eq myDate )`, + expectedQuery: `return ( ( new Date('${newTimeStamp}').getTime() === new Date(item.properties.myDate).getTime() ) )` + }, + { + originalQuery: `PartitionKey eq 'partition1' and number gt 11 and Timestamp lt datetime'${newTimeStamp}'`, + expectedQuery: `return ( item.properties.PartitionKey === 'partition1' && item.properties.number > 11 && new Date(item.properties.Timestamp).getTime() < new Date('${newTimeStamp}').getTime() )` + }, + { + originalQuery: `PartitionKey eq 'partition1' and number lt 11 and Timestamp lt datetime'${newTimeStamp}'`, + expectedQuery: `return ( item.properties.PartitionKey === 'partition1' && item.properties.number < 11 && new Date(item.properties.Timestamp).getTime() < new Date('${newTimeStamp}').getTime() )` + }, + { + originalQuery: `(PartitionKey eq 'partition1') and (number lt 12) and (Timestamp lt datetime'${newTimeStamp}')`, + expectedQuery: `return ( ( item.properties.PartitionKey === 'partition1' ) && ( item.properties.number < 12 ) && ( new Date(item.properties.Timestamp).getTime() < new Date('${newTimeStamp}').getTime() ) )` + } + ]; + + for (const test of testArray) { + const queryTranscriber = + LokiJsQueryTranscriberFactory.createEntityQueryTranscriber( + test.originalQuery, + "stateMachineTest" + ); + + queryTranscriber.transcribe(); + assert.strictEqual( + queryTranscriber.getTranscribedQuery(), + test.expectedQuery, + `Transcribed query "${queryTranscriber.getTranscribedQuery()}" did not match expected ${ + test.expectedQuery + }` + ); + } + }); + + it("correctly transcribes a query with multiple predicates", async () => { + // use the expected response string to compare the reult to. + const testArray = [ + { + originalQuery: "(myInt eq 123 ) and (myString eq 'hello')", + expectedQuery: + "return ( ( item.properties.myInt === 123 ) && ( item.properties.myString === 'hello' ) )" + } + ]; + + for (const test of testArray) { + const queryTranscriber = + LokiJsQueryTranscriberFactory.createEntityQueryTranscriber( + test.originalQuery, + "stateMachineTest" + ); + + queryTranscriber.transcribe(); + assert.strictEqual( + queryTranscriber.getTranscribedQuery(), + test.expectedQuery, + `Transcribed query "${queryTranscriber.getTranscribedQuery()}" did not match expected ${ + test.expectedQuery + }` + ); + } + }); + + it("correctly transcribes a query with multiple predicates and no brackets", async () => { + // use the expected response string to compare the reult to. + const testArray = [ + { + originalQuery: "PartitionKey eq 'partitionKey' and int32Field eq 54321", + expectedQuery: + "return ( item.properties.PartitionKey === 'partitionKey' && item.properties.int32Field === 54321 )" + } + ]; + + for (const test of testArray) { + const queryTranscriber = + LokiJsQueryTranscriberFactory.createEntityQueryTranscriber( + test.originalQuery, + "stateMachineTest" + ); + + queryTranscriber.transcribe(); + assert.strictEqual( + queryTranscriber.getTranscribedQuery(), + test.expectedQuery, + `Transcribed query "${queryTranscriber.getTranscribedQuery()}" did not match expected ${ + test.expectedQuery + }` + ); + } + }); + + it("correctly transcribes a query for a value of type binary", async () => { + // use the expected response string to compare the reult to. + const testArray = [ + { + originalQuery: `(PartitionKey eq 'part1') and (binaryField eq binary'62696e61727944617461')`, + expectedQuery: `return ( ( item.properties.PartitionKey === 'part1' ) && ( item.properties.binaryField === 'YmluYXJ5RGF0YQ==' ) )` + }, + { + originalQuery: `(PartitionKey eq 'part1') and (binaryField eq X'62696e61727944617461')`, + expectedQuery: `return ( ( item.properties.PartitionKey === 'part1' ) && ( item.properties.binaryField === 'YmluYXJ5RGF0YQ==' ) )` + } + ]; + + for (const test of testArray) { + const queryTranscriber = + LokiJsQueryTranscriberFactory.createEntityQueryTranscriber( + test.originalQuery, + "stateMachineTest" + ); + + queryTranscriber.transcribe(); + assert.strictEqual( + queryTranscriber.getTranscribedQuery(), + test.expectedQuery, + `Transcribed query "${queryTranscriber.getTranscribedQuery()}" did not match expected ${ + test.expectedQuery + }` + ); + } + }); + + it("correctly transcribes a query for tables", async () => { + // allow custom props = false! + // system props : "name", "table" + const testArray = [ + { + originalQuery: "TableName ge 'myTable' and TableName lt 'myTable{'", + expectedQuery: + "return ( item.table >= 'myTable' && item.table < 'myTable{' )" + } + ]; + + for (const test of testArray) { + const queryTranscriber = + LokiJsQueryTranscriberFactory.createTableQueryTranscriber( + test.originalQuery, + "stateMachineTest" + ); + + queryTranscriber.transcribe(); + assert.strictEqual( + queryTranscriber.getTranscribedQuery(), + test.expectedQuery, + `Transcribed query "${queryTranscriber.getTranscribedQuery()}" did not match expected ${ + test.expectedQuery + }` + ); + } + }); + + it("correctly transcribes a very long query i.e. from Orleans", async () => { + const testArray = [ + { + originalQuery: + "(PartitionKey eq '6e4ab0516fca4122bff05fb23a5f6adf') and (((RowKey eq 'user%2fsomeraondomuser_cf9e6f1fc7264c9c8148d6050e27ee3e') and (ActivationId eq '512b5a68bc1c46b480a1a052da681f45')) or ((RowKey eq 'user%2fsomeraondomuser_267f6d72c0874408a021043138c6e395') and (ActivationId eq 'e195014973754b11ae1b74cb4be9aab1')) or ((RowKey eq 'user%2fsomeraondomuser_34b4d10839ba48928a3ceee0ea6a1175') and (ActivationId eq '4573eccdaf8d42148907fd3b654b72c3')) or ((RowKey eq 'user%2fsomeraondomuser_931d172de3034561af4d210aa4007b8f') and (ActivationId eq 'd3e7ffeb439b4acf912006b2f01aa5a9')) or ((RowKey eq 'user%2fsomeraondomuser_6db90a01fab7429ca52698534629dd5d') and (ActivationId eq '492fe8afa0514a919fc0c491afc88e18')) or ((RowKey eq 'user%2fsomeraondomuser_b4710ac467ea46678d3b692d552b4573') and (ActivationId eq 'ed3a90e556474a4486196d7d20c7e0a8')) or ((RowKey eq 'user%2fsomeraondomuser_9a7d0ed9e934457790c4af955a5d0aa2') and (ActivationId eq 'e6098dd0457a438b8c8810381e72b103')) or ((RowKey eq 'user%2fsomeraondomuser_5f45717f56d14f6ebc1df2d3195609d8') and (ActivationId eq '1001b0b9b2224ab08c9b3e1413e733e3')) or ((RowKey eq 'user%2fsomeraondomuser_593e5eb5533f41998a6946d37748d1c4') and (ActivationId eq '100df8cda69a4101bd038f097073dcf0')) or ((RowKey eq 'user%2fsomeraondomuser_5c837b849f024914b694ebf978129210') and (ActivationId eq 'd4b38859695c4b31892053e2f8f16ce1')) or ((RowKey eq 'user%2fsomeraondomuser_0d59188361ed46b8967ff553fc31da22') and (ActivationId eq 'cc235fce46ca4dcf9c24a12eda86a23e')) or ((RowKey eq 'user%2fsomeraondomuser_46daebbc6d214de1b724a6d1bd909f2e') and (ActivationId eq 'f901237d1de5466bb350013841f7e1d9')) or ((RowKey eq 'user%2fsomeraondomuser_4bf3d38ef9664a17b8acbe6e6f4475e6') and (ActivationId eq '0d8b22f41df443f4956b4cef9ddccc7b')) or ((RowKey eq 'user%2fsomeraondomuser_7d157b7f3a3a4508a182b47394444a97') and (ActivationId eq '391cbd2712e94a10b1e8f7f5566ad1d1')) or ((RowKey eq 'user%2fsomeraondomuser_3173c9fea0124785a6dce8bb1ce22ff5') and (ActivationId eq '5926f7967953443089276d4011de4586')) or ((RowKey eq 'user%2fsomeraondomuser_855b9f1c9b1d4793b633dd312f97acee') and (ActivationId eq 'acbb6b581b604bd9bdb7d8109ad80c25')) or ((RowKey eq 'user%2fsomeraondomuser_0f11694546a049df89c234f5aca29594') and (ActivationId eq '83a8b6c565e74569a3d1f358ae1b4767')) or ((RowKey eq 'user%2fsomeraondomuser_5bd0f86dc2a74ba18848156fd4384fa0') and (ActivationId eq '430dcf95b539468cbfb99886949840b5')) or ((RowKey eq 'user%2fsomeraondomuser_85c207c588dd4c9697a921b29481152b') and (ActivationId eq 'e114211645144d8581b279cc8b780879')) or ((RowKey eq 'user%2fsomeraondomuser_d2d48e3e8e594b7ea755a6df291c55a4') and (ActivationId eq 'a9f50b02fa634628b56622602733d2df')) or ((RowKey eq 'user%2fsomeraondomuser_3f1c4bcf08c34efb8b64a40ee4e33698') and (ActivationId eq 'e7180ac71c6a4fb3b5e68c3a6d3c5ce6')) or ((RowKey eq 'user%2fsomeraondomuser_3871c563cd0e433fbb7d4ebbd6db4856') and (ActivationId eq 'c05eab92d0b44f4b8ea57b6cf9339cc2')) or ((RowKey eq 'user%2fsomeraondomuser_beb39451febe40aa9b51b051a5940b7c') and (ActivationId eq '51998e3e875c4c499f4ebb14bc9a91e6')) or ((RowKey eq 'user%2fsomeraondomuser_1258f93c3b054ee2b80a52f9f9bdc170') and (ActivationId eq 'cb3d1fd19e2d45eeb0ebd9a704e6d576')) or ((RowKey eq 'user%2fsomeraondomuser_b37d9915799047988a1b0598a47f7ba4') and (ActivationId eq '2560bf1bcde5461eb4899ef8ae009a7a')) or ((RowKey eq 'user%2fsomeraondomuser_37a27899265b4125ba98bc7fd2f9c000') and (ActivationId eq '166e0f18cd744666b3684c406493945e')) or ((RowKey eq 'user%2fsomeraondomuser_240b39fd90d94b54b0e923134b4cba55') and (ActivationId eq '329c6825c2754dd3b18411083b7b58e4')) or ((RowKey eq 'user%2fsomeraondomuser_e7c33f051c3c42a8883712e255635bbf') and (ActivationId eq 'f127763cb6374f49bf52b7876e594147')) or ((RowKey eq 'user%2fsomeraondomuser_3d5d8beeafac4b0aa6a146f7f2e5eadb') and (ActivationId eq '6f89c9bda1d74977997b1415db56a21e')) or ((RowKey eq 'user%2fsomeraondomuser_21d9c87ed89646e88be406cb57db4e1c') and (ActivationId eq '640d3e743baa4c969e4292aa80efbac2')) or ((RowKey eq 'user%2fsomeraondomuser_6d71d83c8083415a835943b18b9d6d99') and (ActivationId eq 'd4f8417dab4544ed972b288bae03efa3')) or ((RowKey eq 'user%2fsomeraondomuser_44253ea6cadc4165994fd4501998190b') and (ActivationId eq 'a099990633bb441a852ff00266c372ee')) or ((RowKey eq 'user%2fsomeraondomuser_169185ee08b446ee9a1dd329997f4b50') and (ActivationId eq '6928aeac8dfe4caeb44b275d3765bb9c')) or ((RowKey eq 'user%2fsomeraondomuser_5639229f610444df9ff2c3a598ba5ff3') and (ActivationId eq 'afd94604d549455983d4bb043b9bf4fc')) or ((RowKey eq 'user%2fsomeraondomuser_6e8177f40d924eecad86fe29cf042c5b') and (ActivationId eq 'ef6dff8131634580a05602b12b3c7030')) or ((RowKey eq 'user%2fsomeraondomuser_82c02c372d274b12b42eb613a94f0032') and (ActivationId eq 'c629d8827dec4946918fac970b0b01fc')) or ((RowKey eq 'user%2fsomeraondomuser_82d799f96a8341a888e823e7e6c680aa') and (ActivationId eq '6a430683a6864d518747c5613aae81f7')) or ((RowKey eq 'user%2fsomeraondomuser_eee54678565d4c62b3ee75ff595a639f') and (ActivationId eq '05b779023a86487291c54274f2351763')) or ((RowKey eq 'user%2fsomeraondomuser_d61b2e412be74d449cbe2e32c040b054') and (ActivationId eq 'abd89950074c455eabf0ce6507cff05b')) or ((RowKey eq 'user%2fsomeraondomuser_7d3b47e40a40403bac3c879f8ccc785a') and (ActivationId eq 'f37b30e2b99944ad8951924d890d6514')) or ((RowKey eq 'user%2fsomeraondomuser_fa9e78d2c68447928d3b5bcc7170f112') and (ActivationId eq 'bc9c4dde5ba443dea12137e5da919c41')) or ((RowKey eq 'user%2fsomeraondomuser_3bb66b8c2abb45c8b33e75ce4baa93ac') and (ActivationId eq '49c8905d49bc47bc9fea7d859c7812dd')) or ((RowKey eq 'user%2fsomeraondomuser_55b23534d04c4efe9d580c3740230486') and (ActivationId eq '1322e451d37145f4b1b41559f30b58e9')) or ((RowKey eq 'user%2fsomeraondomuser_8b8d04a70b8f43ab87d065e89d84aefb') and (ActivationId eq '3f7b8e9d039d4d788597d5fe7bb37666')) or ((RowKey eq 'user%2fsomeraondomuser_0d5ec8bb559d4e34a2d4c4b5d935386d') and (ActivationId eq '6eb87695c16f4289b48374a57fcc2bab')) or ((RowKey eq 'user%2fsomeraondomuser_a0ba488c7b0542d49cb2b406a7b3cca4') and (ActivationId eq 'fb20d88f4b6d4193aad4511c8951ef59')) or ((RowKey eq 'user%2fsomeraondomuser_25de238770ab41399d8cbe0343b9d0d3') and (ActivationId eq 'b587806d63324a4084cde9c92af04065')) or ((RowKey eq 'user%2fsomeraondomuser_7688796792e245d0913f050a3a7c6c02') and (ActivationId eq 'd95909aedd96417f945834151d397f51')) or ((RowKey eq 'user%2fsomeraondomuser_72967c3265ce4996b12001ea1814d62f') and (ActivationId eq 'd046ebb2304b4ff0be1c9d5a4c8a8831')) or ((RowKey eq 'user%2fsomeraondomuser_6238575aaee54a628caebb48b44584e5') and (ActivationId eq '6ac73966adb6496cb2a4553c7b9fe8ce')) or ((RowKey eq 'user%2fsomeraondomuser_fb89e80d21ed4b17a850f9021c4b1d2a') and (ActivationId eq '3833b18cabc344dab1dbdbb62c99accd')) or ((RowKey eq 'user%2fsomeraondomuser_f7aa848f4c7243b892fd979326884e3d') and (ActivationId eq '6911fe2a462e44aab8a143603e1af98f')) or ((RowKey eq 'user%2fsomeraondomuser_349234378ad34ec99c3ea00cb9149f80') and (ActivationId eq '62e351ea6ba44be8b45b2cb1a42efea3')) or ((RowKey eq 'user%2fsomeraondomuser_25707be4343f4f89955ea71bb2d75fe2') and (ActivationId eq '757fdf560e6e4fb0acc1d0578bc4bc83')) or ((RowKey eq 'user%2fsomeraondomuser_fdfe656c1e47438286a19ce4147201d1') and (ActivationId eq '5f417d1d6d9c498da973d30a26ac4c0f')) or ((RowKey eq 'user%2fsomeraondomuser_a4d0398c7b004774b638156dba8050b6') and (ActivationId eq '824bfc22f638402c99aa844984bc6814')) or ((RowKey eq 'user%2fsomeraondomuser_744afd919a134feb8167ea55d036a659') and (ActivationId eq 'b3cc18bb13254e95befa49486e7b7b9c')) or ((RowKey eq 'user%2fsomeraondomuser_6c8dbd201e6d4755a505586d669fb639') and (ActivationId eq 'e1aae7d578604f018c757fe76af995dd')) or ((RowKey eq 'user%2fsomeraondomuser_bcc2eecd8f6d4b53b22bc974e6ff5342') and (ActivationId eq '97916e010c614aa9873307d81cda8447')) or ((RowKey eq 'user%2fsomeraondomuser_be43c3586cf341318cee5941dab73f25') and (ActivationId eq 'a4cb2c286df54db89ddfa6a81ae7a4b8')) or ((RowKey eq 'user%2fsomeraondomuser_131c2342fa9f469ab2448122979901b2') and (ActivationId eq 'fb44869a714c49c6964ff7a14be19f77')) or ((RowKey eq 'user%2fsomeraondomuser_c01e6722572449bf9fd84be9911dd293') and (ActivationId eq 'cbfa2c14f69846ce9c3875b22652c5d9')) or ((RowKey eq 'user%2fsomeraondomuser_add4d77de01d455eaded6a1aa09185d2') and (ActivationId eq '6f9fa3a41f574fbebf7abcac08dd04b2')) or ((RowKey eq 'user%2fsomeraondomuser_ce38323206534df6a9764036fa08c6f9') and (ActivationId eq 'c0ec0e42e5fa4c03a5cb760d2c6323f5')) or ((RowKey eq 'user%2fsomeraondomuser_3f1d9bb315f84ef090977234ef50b78d') and (ActivationId eq '9314a7399ee24c039c05a1b242cd7dbd')) or ((RowKey eq 'user%2fsomeraondomuser_21cd31ddb97343d1b519799652af5a9a') and (ActivationId eq 'db93c80c878642f2974ca4589031c59c')) or ((RowKey eq 'user%2fsomeraondomuser_a53b1e377c774e539b9ee17e59d84028') and (ActivationId eq '12f4c570e1774c3f9cd5e9ba53ba24b0')) or ((RowKey eq 'user%2fsomeraondomuser_35629a332fb4418a8285c5a6e5ac1acb') and (ActivationId eq 'c6b4759436d9450aa5d6d06f0d493df3')) or ((RowKey eq 'user%2fsomeraondomuser_1fb4bd8083ed46c2a5a63acbba0f62f2') and (ActivationId eq '70b0af2656c04a7eb357556d5406bad1')) or ((RowKey eq 'user%2fsomeraondomuser_63968d03c6364bf281240cc5f66fa76d') and (ActivationId eq '2cc36dfd68a24892a3125ff93da1466c')) or ((RowKey eq 'user%2fsomeraondomuser_c1dac4848b6f42a2a49a5e74c8e23624') and (ActivationId eq 'bdd07a677e6841809f2580163d41f4cb')) or ((RowKey eq 'user%2fsomeraondomuser_e33ddf101a174c388a5f8b0b0aa589a5') and (ActivationId eq '71520233b5624b188e1f79b7acd64117')) or ((RowKey eq 'user%2fsomeraondomuser_1894548c3c164d88b28aa8ca81eec52e') and (ActivationId eq '4c5ffd05b895460695bb25e2f6445f80')) or ((RowKey eq 'user%2fsomeraondomuser_6072680f29f240cea960b4cb5d760a96') and (ActivationId eq 'a050286a236643bab071993b4816fe24')) or ((RowKey eq 'user%2fsomeraondomuser_530b499f40bc4d94830ac93e7cbf91c7') and (ActivationId eq '0b2848508785441aa8ac1b54ab74d37e')) or ((RowKey eq 'user%2fsomeraondomuser_fec06bded49c45629b38f019b2f2b1b5') and (ActivationId eq '963fb89616d6449fa26df30b0467fd3c')) or ((RowKey eq 'user%2fsomeraondomuser_f3163586cec543669edaa7a6b3dea09c') and (ActivationId eq '400088d1a343455ea5dbccd0e41aa143')) or ((RowKey eq 'user%2fsomeraondomuser_1d8cc8d9f1c149e4800b0982ca098cb4') and (ActivationId eq '1594d642ac864bebb1a24cec9e517fde')) or ((RowKey eq 'user%2fsomeraondomuser_cf63930ad32244e19795d6a36aab026b') and (ActivationId eq '7d79e95eea21479b84b294bb0163ed59')) or ((RowKey eq 'user%2fsomeraondomuser_f1a529712bc04e19b6a53b5900532059') and (ActivationId eq '53873144412d4846adff21d4efc3d83f')) or ((RowKey eq 'user%2fsomeraondomuser_ea51485ea2a145bd89a17c7584100c3a') and (ActivationId eq 'be0e6b64f793467691256ead12aa9232')) or ((RowKey eq 'user%2fsomeraondomuser_e007bb2d411f46dd90f0b1a426e66e93') and (ActivationId eq '1dd8fa52775748b385da70094b8b2094')) or ((RowKey eq 'user%2fsomeraondomuser_9ee4348df9c041ac9eace6ade2d76ecf') and (ActivationId eq '465722690f4f42df8cd602f7197d3be8')) or ((RowKey eq 'user%2fsomeraondomuser_b7307b3c66424fe3b1a7adb04e7477af') and (ActivationId eq '2956c4fbdda74079ba840a40f290cd7d')) or ((RowKey eq 'user%2fsomeraondomuser_92c5168aba054ba4bdf6d12fee1314f6') and (ActivationId eq 'ea1009a1d59d4550bbcb58978aef3cdd')) or ((RowKey eq 'user%2fsomeraondomuser_b454f3f44a0747f59a5b16bad9e468e1') and (ActivationId eq '6308e191701147e4a9a72bc3473fbdb2')) or ((RowKey eq 'user%2fsomeraondomuser_24af472a228f4c38b30b78c4ed9076f8') and (ActivationId eq '3e518a0f7a0f49149422f65c7043caa3')) or ((RowKey eq 'user%2fsomeraondomuser_574ddad0703a4b5d96d9231ab0e42fc7') and (ActivationId eq 'eb2baddcdc334ac3b5d4497b4adbd6a4')) or ((RowKey eq 'user%2fsomeraondomuser_3c772b3dfbab4de09523fd1805cc5ba2') and (ActivationId eq 'c64844c4eee14533b5d5319c25190908')) or ((RowKey eq 'user%2fsomeraondomuser_527e8e5da4d9469f9487af8e2566366d') and (ActivationId eq '461322a278544e90a0df05efdd840c46')) or ((RowKey eq 'user%2fsomeraondomuser_ef61d4ecc9544f5da29145c6f8bcfa9d') and (ActivationId eq '20f8029af34a4c3eaf24df390e89f427')) or ((RowKey eq 'user%2fsomeraondomuser_8678a87f705e41aba41c3925220f23fe') and (ActivationId eq '6cb3b765a2dd48958ef0537826804b4b')) or ((RowKey eq 'user%2fsomeraondomuser_d271d9a5cb354e0691dacaebdb9281f3') and (ActivationId eq '66ac01d677c34f9cae99dfb4cdaa00e5')) or ((RowKey eq 'user%2fsomeraondomuser_5d982fbac181413295310c6c8fc93c5f') and (ActivationId eq 'd94b900aec6249ee9e1856e3805b091b')) or ((RowKey eq 'user%2fsomeraondomuser_81b88cb28e69458d9b80067476f7c1af') and (ActivationId eq '2c53f55e7203418b91a360bdb28e5028')) or ((RowKey eq 'user%2fsomeraondomuser_a7ac9f7d851840579b8db4bf8ac61a7b') and (ActivationId eq '3c55ef4b112b4e4fbefd1df5ea871018')) or ((RowKey eq 'user%2fsomeraondomuser_3c100e76c2f14dcf97146a67a835c702') and (ActivationId eq '4e03bb4eb4364e6fa88f736b561eae82')) or ((RowKey eq 'user%2fsomeraondomuser_ff86a95db64f492d8c23296215ba1d54') and (ActivationId eq '4e29d0707ccb42e3b5b054eec8c040e4')) or ((RowKey eq 'user%2fsomeraondomuser_f443ac2a7bc9433bad7ec2b1c4228ef7') and (ActivationId eq 'b03811e7f6e94158a75912e71edffa06')) or ((RowKey eq 'user%2fsomeraondomuser_9baa6c0b81d34a6d8c9cef39d9a5f4e6') and (ActivationId eq '71cb5917ddf34a5baaf0f78810910a95')))", + expectedQuery: + "return ( ( item.properties.PartitionKey === '6e4ab0516fca4122bff05fb23a5f6adf' ) && ( ( ( item.properties.RowKey === 'user%2fsomeraondomuser_cf9e6f1fc7264c9c8148d6050e27ee3e' ) && ( item.properties.ActivationId === '512b5a68bc1c46b480a1a052da681f45' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_267f6d72c0874408a021043138c6e395' ) && ( item.properties.ActivationId === 'e195014973754b11ae1b74cb4be9aab1' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_34b4d10839ba48928a3ceee0ea6a1175' ) && ( item.properties.ActivationId === '4573eccdaf8d42148907fd3b654b72c3' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_931d172de3034561af4d210aa4007b8f' ) && ( item.properties.ActivationId === 'd3e7ffeb439b4acf912006b2f01aa5a9' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_6db90a01fab7429ca52698534629dd5d' ) && ( item.properties.ActivationId === '492fe8afa0514a919fc0c491afc88e18' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_b4710ac467ea46678d3b692d552b4573' ) && ( item.properties.ActivationId === 'ed3a90e556474a4486196d7d20c7e0a8' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_9a7d0ed9e934457790c4af955a5d0aa2' ) && ( item.properties.ActivationId === 'e6098dd0457a438b8c8810381e72b103' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_5f45717f56d14f6ebc1df2d3195609d8' ) && ( item.properties.ActivationId === '1001b0b9b2224ab08c9b3e1413e733e3' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_593e5eb5533f41998a6946d37748d1c4' ) && ( item.properties.ActivationId === '100df8cda69a4101bd038f097073dcf0' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_5c837b849f024914b694ebf978129210' ) && ( item.properties.ActivationId === 'd4b38859695c4b31892053e2f8f16ce1' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_0d59188361ed46b8967ff553fc31da22' ) && ( item.properties.ActivationId === 'cc235fce46ca4dcf9c24a12eda86a23e' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_46daebbc6d214de1b724a6d1bd909f2e' ) && ( item.properties.ActivationId === 'f901237d1de5466bb350013841f7e1d9' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_4bf3d38ef9664a17b8acbe6e6f4475e6' ) && ( item.properties.ActivationId === '0d8b22f41df443f4956b4cef9ddccc7b' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_7d157b7f3a3a4508a182b47394444a97' ) && ( item.properties.ActivationId === '391cbd2712e94a10b1e8f7f5566ad1d1' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_3173c9fea0124785a6dce8bb1ce22ff5' ) && ( item.properties.ActivationId === '5926f7967953443089276d4011de4586' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_855b9f1c9b1d4793b633dd312f97acee' ) && ( item.properties.ActivationId === 'acbb6b581b604bd9bdb7d8109ad80c25' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_0f11694546a049df89c234f5aca29594' ) && ( item.properties.ActivationId === '83a8b6c565e74569a3d1f358ae1b4767' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_5bd0f86dc2a74ba18848156fd4384fa0' ) && ( item.properties.ActivationId === '430dcf95b539468cbfb99886949840b5' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_85c207c588dd4c9697a921b29481152b' ) && ( item.properties.ActivationId === 'e114211645144d8581b279cc8b780879' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_d2d48e3e8e594b7ea755a6df291c55a4' ) && ( item.properties.ActivationId === 'a9f50b02fa634628b56622602733d2df' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_3f1c4bcf08c34efb8b64a40ee4e33698' ) && ( item.properties.ActivationId === 'e7180ac71c6a4fb3b5e68c3a6d3c5ce6' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_3871c563cd0e433fbb7d4ebbd6db4856' ) && ( item.properties.ActivationId === 'c05eab92d0b44f4b8ea57b6cf9339cc2' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_beb39451febe40aa9b51b051a5940b7c' ) && ( item.properties.ActivationId === '51998e3e875c4c499f4ebb14bc9a91e6' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_1258f93c3b054ee2b80a52f9f9bdc170' ) && ( item.properties.ActivationId === 'cb3d1fd19e2d45eeb0ebd9a704e6d576' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_b37d9915799047988a1b0598a47f7ba4' ) && ( item.properties.ActivationId === '2560bf1bcde5461eb4899ef8ae009a7a' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_37a27899265b4125ba98bc7fd2f9c000' ) && ( item.properties.ActivationId === '166e0f18cd744666b3684c406493945e' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_240b39fd90d94b54b0e923134b4cba55' ) && ( item.properties.ActivationId === '329c6825c2754dd3b18411083b7b58e4' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_e7c33f051c3c42a8883712e255635bbf' ) && ( item.properties.ActivationId === 'f127763cb6374f49bf52b7876e594147' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_3d5d8beeafac4b0aa6a146f7f2e5eadb' ) && ( item.properties.ActivationId === '6f89c9bda1d74977997b1415db56a21e' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_21d9c87ed89646e88be406cb57db4e1c' ) && ( item.properties.ActivationId === '640d3e743baa4c969e4292aa80efbac2' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_6d71d83c8083415a835943b18b9d6d99' ) && ( item.properties.ActivationId === 'd4f8417dab4544ed972b288bae03efa3' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_44253ea6cadc4165994fd4501998190b' ) && ( item.properties.ActivationId === 'a099990633bb441a852ff00266c372ee' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_169185ee08b446ee9a1dd329997f4b50' ) && ( item.properties.ActivationId === '6928aeac8dfe4caeb44b275d3765bb9c' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_5639229f610444df9ff2c3a598ba5ff3' ) && ( item.properties.ActivationId === 'afd94604d549455983d4bb043b9bf4fc' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_6e8177f40d924eecad86fe29cf042c5b' ) && ( item.properties.ActivationId === 'ef6dff8131634580a05602b12b3c7030' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_82c02c372d274b12b42eb613a94f0032' ) && ( item.properties.ActivationId === 'c629d8827dec4946918fac970b0b01fc' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_82d799f96a8341a888e823e7e6c680aa' ) && ( item.properties.ActivationId === '6a430683a6864d518747c5613aae81f7' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_eee54678565d4c62b3ee75ff595a639f' ) && ( item.properties.ActivationId === '05b779023a86487291c54274f2351763' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_d61b2e412be74d449cbe2e32c040b054' ) && ( item.properties.ActivationId === 'abd89950074c455eabf0ce6507cff05b' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_7d3b47e40a40403bac3c879f8ccc785a' ) && ( item.properties.ActivationId === 'f37b30e2b99944ad8951924d890d6514' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_fa9e78d2c68447928d3b5bcc7170f112' ) && ( item.properties.ActivationId === 'bc9c4dde5ba443dea12137e5da919c41' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_3bb66b8c2abb45c8b33e75ce4baa93ac' ) && ( item.properties.ActivationId === '49c8905d49bc47bc9fea7d859c7812dd' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_55b23534d04c4efe9d580c3740230486' ) && ( item.properties.ActivationId === '1322e451d37145f4b1b41559f30b58e9' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_8b8d04a70b8f43ab87d065e89d84aefb' ) && ( item.properties.ActivationId === '3f7b8e9d039d4d788597d5fe7bb37666' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_0d5ec8bb559d4e34a2d4c4b5d935386d' ) && ( item.properties.ActivationId === '6eb87695c16f4289b48374a57fcc2bab' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_a0ba488c7b0542d49cb2b406a7b3cca4' ) && ( item.properties.ActivationId === 'fb20d88f4b6d4193aad4511c8951ef59' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_25de238770ab41399d8cbe0343b9d0d3' ) && ( item.properties.ActivationId === 'b587806d63324a4084cde9c92af04065' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_7688796792e245d0913f050a3a7c6c02' ) && ( item.properties.ActivationId === 'd95909aedd96417f945834151d397f51' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_72967c3265ce4996b12001ea1814d62f' ) && ( item.properties.ActivationId === 'd046ebb2304b4ff0be1c9d5a4c8a8831' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_6238575aaee54a628caebb48b44584e5' ) && ( item.properties.ActivationId === '6ac73966adb6496cb2a4553c7b9fe8ce' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_fb89e80d21ed4b17a850f9021c4b1d2a' ) && ( item.properties.ActivationId === '3833b18cabc344dab1dbdbb62c99accd' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_f7aa848f4c7243b892fd979326884e3d' ) && ( item.properties.ActivationId === '6911fe2a462e44aab8a143603e1af98f' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_349234378ad34ec99c3ea00cb9149f80' ) && ( item.properties.ActivationId === '62e351ea6ba44be8b45b2cb1a42efea3' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_25707be4343f4f89955ea71bb2d75fe2' ) && ( item.properties.ActivationId === '757fdf560e6e4fb0acc1d0578bc4bc83' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_fdfe656c1e47438286a19ce4147201d1' ) && ( item.properties.ActivationId === '5f417d1d6d9c498da973d30a26ac4c0f' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_a4d0398c7b004774b638156dba8050b6' ) && ( item.properties.ActivationId === '824bfc22f638402c99aa844984bc6814' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_744afd919a134feb8167ea55d036a659' ) && ( item.properties.ActivationId === 'b3cc18bb13254e95befa49486e7b7b9c' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_6c8dbd201e6d4755a505586d669fb639' ) && ( item.properties.ActivationId === 'e1aae7d578604f018c757fe76af995dd' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_bcc2eecd8f6d4b53b22bc974e6ff5342' ) && ( item.properties.ActivationId === '97916e010c614aa9873307d81cda8447' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_be43c3586cf341318cee5941dab73f25' ) && ( item.properties.ActivationId === 'a4cb2c286df54db89ddfa6a81ae7a4b8' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_131c2342fa9f469ab2448122979901b2' ) && ( item.properties.ActivationId === 'fb44869a714c49c6964ff7a14be19f77' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_c01e6722572449bf9fd84be9911dd293' ) && ( item.properties.ActivationId === 'cbfa2c14f69846ce9c3875b22652c5d9' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_add4d77de01d455eaded6a1aa09185d2' ) && ( item.properties.ActivationId === '6f9fa3a41f574fbebf7abcac08dd04b2' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_ce38323206534df6a9764036fa08c6f9' ) && ( item.properties.ActivationId === 'c0ec0e42e5fa4c03a5cb760d2c6323f5' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_3f1d9bb315f84ef090977234ef50b78d' ) && ( item.properties.ActivationId === '9314a7399ee24c039c05a1b242cd7dbd' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_21cd31ddb97343d1b519799652af5a9a' ) && ( item.properties.ActivationId === 'db93c80c878642f2974ca4589031c59c' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_a53b1e377c774e539b9ee17e59d84028' ) && ( item.properties.ActivationId === '12f4c570e1774c3f9cd5e9ba53ba24b0' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_35629a332fb4418a8285c5a6e5ac1acb' ) && ( item.properties.ActivationId === 'c6b4759436d9450aa5d6d06f0d493df3' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_1fb4bd8083ed46c2a5a63acbba0f62f2' ) && ( item.properties.ActivationId === '70b0af2656c04a7eb357556d5406bad1' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_63968d03c6364bf281240cc5f66fa76d' ) && ( item.properties.ActivationId === '2cc36dfd68a24892a3125ff93da1466c' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_c1dac4848b6f42a2a49a5e74c8e23624' ) && ( item.properties.ActivationId === 'bdd07a677e6841809f2580163d41f4cb' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_e33ddf101a174c388a5f8b0b0aa589a5' ) && ( item.properties.ActivationId === '71520233b5624b188e1f79b7acd64117' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_1894548c3c164d88b28aa8ca81eec52e' ) && ( item.properties.ActivationId === '4c5ffd05b895460695bb25e2f6445f80' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_6072680f29f240cea960b4cb5d760a96' ) && ( item.properties.ActivationId === 'a050286a236643bab071993b4816fe24' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_530b499f40bc4d94830ac93e7cbf91c7' ) && ( item.properties.ActivationId === '0b2848508785441aa8ac1b54ab74d37e' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_fec06bded49c45629b38f019b2f2b1b5' ) && ( item.properties.ActivationId === '963fb89616d6449fa26df30b0467fd3c' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_f3163586cec543669edaa7a6b3dea09c' ) && ( item.properties.ActivationId === '400088d1a343455ea5dbccd0e41aa143' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_1d8cc8d9f1c149e4800b0982ca098cb4' ) && ( item.properties.ActivationId === '1594d642ac864bebb1a24cec9e517fde' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_cf63930ad32244e19795d6a36aab026b' ) && ( item.properties.ActivationId === '7d79e95eea21479b84b294bb0163ed59' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_f1a529712bc04e19b6a53b5900532059' ) && ( item.properties.ActivationId === '53873144412d4846adff21d4efc3d83f' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_ea51485ea2a145bd89a17c7584100c3a' ) && ( item.properties.ActivationId === 'be0e6b64f793467691256ead12aa9232' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_e007bb2d411f46dd90f0b1a426e66e93' ) && ( item.properties.ActivationId === '1dd8fa52775748b385da70094b8b2094' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_9ee4348df9c041ac9eace6ade2d76ecf' ) && ( item.properties.ActivationId === '465722690f4f42df8cd602f7197d3be8' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_b7307b3c66424fe3b1a7adb04e7477af' ) && ( item.properties.ActivationId === '2956c4fbdda74079ba840a40f290cd7d' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_92c5168aba054ba4bdf6d12fee1314f6' ) && ( item.properties.ActivationId === 'ea1009a1d59d4550bbcb58978aef3cdd' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_b454f3f44a0747f59a5b16bad9e468e1' ) && ( item.properties.ActivationId === '6308e191701147e4a9a72bc3473fbdb2' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_24af472a228f4c38b30b78c4ed9076f8' ) && ( item.properties.ActivationId === '3e518a0f7a0f49149422f65c7043caa3' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_574ddad0703a4b5d96d9231ab0e42fc7' ) && ( item.properties.ActivationId === 'eb2baddcdc334ac3b5d4497b4adbd6a4' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_3c772b3dfbab4de09523fd1805cc5ba2' ) && ( item.properties.ActivationId === 'c64844c4eee14533b5d5319c25190908' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_527e8e5da4d9469f9487af8e2566366d' ) && ( item.properties.ActivationId === '461322a278544e90a0df05efdd840c46' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_ef61d4ecc9544f5da29145c6f8bcfa9d' ) && ( item.properties.ActivationId === '20f8029af34a4c3eaf24df390e89f427' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_8678a87f705e41aba41c3925220f23fe' ) && ( item.properties.ActivationId === '6cb3b765a2dd48958ef0537826804b4b' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_d271d9a5cb354e0691dacaebdb9281f3' ) && ( item.properties.ActivationId === '66ac01d677c34f9cae99dfb4cdaa00e5' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_5d982fbac181413295310c6c8fc93c5f' ) && ( item.properties.ActivationId === 'd94b900aec6249ee9e1856e3805b091b' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_81b88cb28e69458d9b80067476f7c1af' ) && ( item.properties.ActivationId === '2c53f55e7203418b91a360bdb28e5028' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_a7ac9f7d851840579b8db4bf8ac61a7b' ) && ( item.properties.ActivationId === '3c55ef4b112b4e4fbefd1df5ea871018' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_3c100e76c2f14dcf97146a67a835c702' ) && ( item.properties.ActivationId === '4e03bb4eb4364e6fa88f736b561eae82' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_ff86a95db64f492d8c23296215ba1d54' ) && ( item.properties.ActivationId === '4e29d0707ccb42e3b5b054eec8c040e4' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_f443ac2a7bc9433bad7ec2b1c4228ef7' ) && ( item.properties.ActivationId === 'b03811e7f6e94158a75912e71edffa06' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_9baa6c0b81d34a6d8c9cef39d9a5f4e6' ) && ( item.properties.ActivationId === '71cb5917ddf34a5baaf0f78810910a95' ) ) ) )" + } + ]; + + for (const test of testArray) { + const queryTranscriber = + LokiJsQueryTranscriberFactory.createTableQueryTranscriber( + test.originalQuery, + "stateMachineTest" + ); + + queryTranscriber.transcribe(); + assert.strictEqual( + queryTranscriber.getTranscribedQuery(), + test.expectedQuery, + `Transcribed query "${queryTranscriber.getTranscribedQuery()}" did not match expected ${ + test.expectedQuery + }` + ); + } + }); +}); diff --git a/tests/table/utils/table.entity.test.utils.ts b/tests/table/utils/table.entity.test.utils.ts index 03807328d..95fe25af8 100644 --- a/tests/table/utils/table.entity.test.utils.ts +++ b/tests/table/utils/table.entity.test.utils.ts @@ -7,6 +7,7 @@ import { TestEntity } from "../models/TestEntity"; import TableServer from "../../../src/table/TableServer"; import TableConfiguration from "../../../src/table/TableConfiguration"; import { AzureNamedKeyCredential, TableClient } from "@azure/data-tables"; +import { copyFile } from "fs"; export const PROTOCOL = "http"; export const HOST = "127.0.0.1"; @@ -24,6 +25,8 @@ const AZURE_TABLE_STORAGE: string = "AZURE_TABLE_STORAGE"; const AZURE_DATATABLES_STORAGE_STRING = "AZURE_DATATABLES_STORAGE_STRING"; const AZURE_DATATABLES_SAS = "AZURE_DATATABLES_SAS"; const AZURITE_TABLE_BASE_URL = "AZURITE_TABLE_BASE_URL"; +// Azure Pipelines need a unique name per test instance +// const REPRO_DB_PATH = "./querydb.json"; const config = new TableConfiguration( HOST, @@ -73,6 +76,23 @@ export function createTableServerForTestHttps(): TableServer { return new TableServer(httpsConfig); } +/** + * Creates a copy of the legacy schema database to use in tests + * and to ensure backwards compatability. + * + * @export + * @return {*} {TableServer} + */ +export function createTableServerForQueryTestHttps(): TableServer { + // we need a unique name for the pipieline tests which + // all run on the same VM. + const uniqueDbName = getUniqueName("querydb"); + const uniqueDBpath = "./" + uniqueDbName + ".json"; + duplicateReproDBForTest(uniqueDBpath); + const queryConfig = createQueryConfig(uniqueDBpath); + return new TableServer(queryConfig); +} + export function createTableServerForTestOAuth(oauth?: string): TableServer { const oAuthConfig = new TableConfiguration( HOST, @@ -175,8 +195,43 @@ export function createAzureDataTablesClient( } else { return new TableClient( process.env[AZURE_DATATABLES_STORAGE_STRING]! + - process.env[AZURE_DATATABLES_SAS]!, + process.env[AZURE_DATATABLES_SAS]!, tableName ); } } + +/** + * Default behavior will overwrite target. + * This will copy the old db file with older schema on which we then + * run our tests to ensure backwards compatability. + * + */ +function duplicateReproDBForTest(uniqueDBpath: string) { + copyFile( + "./tests/table/database/__db_table_guid_bin__.json", + uniqueDBpath, + (exception) => { + if (exception) { + throw exception; + } + } + ); +} + +function createQueryConfig(uniqueDBpath: string): TableConfiguration { + const queryConfig = new TableConfiguration( + HOST, + PORT, + uniqueDBpath, // contains guid and binProp object from legacy schema DB + enableDebugLog, + false, + undefined, + debugLogPath, + false, + true, + "tests/server.cert", + "tests/server.key" + ); + return queryConfig; +} diff --git a/tests/table/utils/table.entity.tests.rest.submitter.ts b/tests/table/utils/table.entity.tests.rest.submitter.ts index 4e83765cf..40a3f9ffd 100644 --- a/tests/table/utils/table.entity.tests.rest.submitter.ts +++ b/tests/table/utils/table.entity.tests.rest.submitter.ts @@ -46,9 +46,13 @@ export async function postToAzurite( */ export async function getToAzurite( path: string, - headers: any + headers: any, + queryString?: string ): Promise> { - const url = `${TableEntityTestConfig.protocol}://${TableEntityTestConfig.host}:${TableEntityTestConfig.port}/${TableEntityTestConfig.accountName}/${path}`; + if (undefined === queryString) { + queryString = ""; + } + const url = `${TableEntityTestConfig.protocol}://${TableEntityTestConfig.host}:${TableEntityTestConfig.port}/${TableEntityTestConfig.accountName}/${path}${queryString}`; const requestConfig = axiosRequestConfig(url, path, headers); const result = await axios.get(url, requestConfig); return result; @@ -83,8 +87,7 @@ function generateSas(): string { // Generate an account SAS with the NamedKeyCredential and the permissions set previously const accountSas = generateAccountSas(cred, { - permissions, - expiresOn: new Date("2022-12-12") + permissions }); return new AzureSASCredential(accountSas).signature; From 8e02ed5881b8abb5da55ee4c939f5bc2fab72f01 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 27 Dec 2022 10:39:10 +0800 Subject: [PATCH 009/297] Bump husky from 8.0.1 to 8.0.2 (#1778) Bumps [husky](https://github.com/typicode/husky) from 8.0.1 to 8.0.2. - [Release notes](https://github.com/typicode/husky/releases) - [Commits](https://github.com/typicode/husky/compare/v8.0.1...v8.0.2) --- updated-dependencies: - dependency-name: husky dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 66bc7d7a4..452063080 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5484,9 +5484,9 @@ } }, "node_modules/husky": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/husky/-/husky-8.0.1.tgz", - "integrity": "sha512-xs7/chUH/CKdOCs7Zy0Aev9e/dKOMZf3K1Az1nar3tzlv0jfqnYtu235bstsWTmXOR0EfINrPa97yy4Lz6RiKw==", + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/husky/-/husky-8.0.2.tgz", + "integrity": "sha512-Tkv80jtvbnkK3mYWxPZePGFpQ/tT3HNSs/sasF9P2YfkMezDl3ON37YN6jUUI4eTg5LcyVynlb6r4eyvOmspvg==", "dev": true, "bin": { "husky": "lib/bin.js" @@ -15442,9 +15442,9 @@ "dev": true }, "husky": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/husky/-/husky-8.0.1.tgz", - "integrity": "sha512-xs7/chUH/CKdOCs7Zy0Aev9e/dKOMZf3K1Az1nar3tzlv0jfqnYtu235bstsWTmXOR0EfINrPa97yy4Lz6RiKw==", + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/husky/-/husky-8.0.2.tgz", + "integrity": "sha512-Tkv80jtvbnkK3mYWxPZePGFpQ/tT3HNSs/sasF9P2YfkMezDl3ON37YN6jUUI4eTg5LcyVynlb6r4eyvOmspvg==", "dev": true }, "iconv-lite": { From b60388cf5c411f3da664ededf852a6dc4385fc24 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 3 Jan 2023 14:03:36 +0800 Subject: [PATCH 010/297] Bump @types/async from 3.2.15 to 3.2.16 (#1780) Bumps [@types/async](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/async) from 3.2.15 to 3.2.16. - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/async) --- updated-dependencies: - dependency-name: "@types/async" dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 452063080..a9cbc5916 100644 --- a/package-lock.json +++ b/package-lock.json @@ -990,9 +990,9 @@ "dev": true }, "node_modules/@types/async": { - "version": "3.2.15", - "resolved": "https://registry.npmjs.org/@types/async/-/async-3.2.15.tgz", - "integrity": "sha512-PAmPfzvFA31mRoqZyTVsgJMsvbynR429UTTxhmfsUCrWGh3/fxOrzqBtaTPJsn4UtzTv4Vb0+/O7CARWb69N4g==", + "version": "3.2.16", + "resolved": "https://registry.npmjs.org/@types/async/-/async-3.2.16.tgz", + "integrity": "sha512-jnlGp5Z/cAZ7JVYyLnSDuYJ+YyYm0o2yzL8Odv6ckWmGMow3j/P/wgfziybB044cXXA93lEuymJyxVR8Iz2amQ==", "dev": true }, "node_modules/@types/bluebird": { @@ -11756,9 +11756,9 @@ "dev": true }, "@types/async": { - "version": "3.2.15", - "resolved": "https://registry.npmjs.org/@types/async/-/async-3.2.15.tgz", - "integrity": "sha512-PAmPfzvFA31mRoqZyTVsgJMsvbynR429UTTxhmfsUCrWGh3/fxOrzqBtaTPJsn4UtzTv4Vb0+/O7CARWb69N4g==", + "version": "3.2.16", + "resolved": "https://registry.npmjs.org/@types/async/-/async-3.2.16.tgz", + "integrity": "sha512-jnlGp5Z/cAZ7JVYyLnSDuYJ+YyYm0o2yzL8Odv6ckWmGMow3j/P/wgfziybB044cXXA93lEuymJyxVR8Iz2amQ==", "dev": true }, "@types/bluebird": { From abd5119b5ad77fa287f04d6b93e6c4ff77f522d0 Mon Sep 17 00:00:00 2001 From: Wei Wei Date: Wed, 4 Jan 2023 14:17:58 +0800 Subject: [PATCH 011/297] fix issue 1757 (#1776) --- ChangeLog.md | 1 + src/table/handlers/TableHandler.ts | 7 ++++++ tests/table/apis/table.entity.test.ts | 24 +++++++++++++++++++ .../table/models/AzureDataTablesTestEntity.ts | 2 +- 4 files changed, 33 insertions(+), 1 deletion(-) diff --git a/ChangeLog.md b/ChangeLog.md index 5b80743d5..680a1e84c 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -16,6 +16,7 @@ Blob: Table: - Added exit parameter to tests so they don't hang. +- Fixed request not fail on creating an entity without specifying a property value of type DateTimeOffset - Fixes issues using and querying GUID types. - Removes odata Timestamp type from entities when accept is set to minimalmetadata. - Ensures no entities are returned when queries use $top=0. diff --git a/src/table/handlers/TableHandler.ts b/src/table/handlers/TableHandler.ts index 85204aa77..99678b1ba 100644 --- a/src/table/handlers/TableHandler.ts +++ b/src/table/handlers/TableHandler.ts @@ -1071,6 +1071,13 @@ export default class TableHandler extends BaseHandler implements ITableHandler { } else if (properties[prop].length > 32 * 1024) { throw StorageErrorFactory.getPropertyValueTooLargeError(context); } + else if (properties[prop] === undefined || properties[prop] === "") + { + const propertyType = properties[`${prop}${ODATA_TYPE}`]; + if (propertyType !== undefined && propertyType === "Edm.DateTime") { + throw StorageErrorFactory.getInvalidInput(context); + } + } } } } diff --git a/tests/table/apis/table.entity.test.ts b/tests/table/apis/table.entity.test.ts index df1d05ec3..150d9002d 100644 --- a/tests/table/apis/table.entity.test.ts +++ b/tests/table/apis/table.entity.test.ts @@ -134,6 +134,30 @@ describe("table Entity APIs test - using Azure-Storage", () => { ); }); + // Insert empty entity property with type "Edm.DateTime", server will return error + it("Insert new Entity property with type Edm.DateTime will convert to UTC, @loki", (done) => { + const timeValue = ""; + const entity = { + PartitionKey: "part1", + RowKey: "utctest", + myValue: timeValue, + "myValue@odata.type": "Edm.DateTime" + }; + + tableService.insertEntity( + tableName, + entity, + (insertError, insertResult, insertResponse) => { + if (!insertError) { + assert.fail("Insert should fail with DataTime type property has empty value."); + } else { + assert.strictEqual(true, insertError.message.startsWith("An error occurred while processing this request.")); + done(); + } + } + ); + }); + // Simple test in here until we have the full set checked in, as we need // a starting point for delete and query entity APIs it("Should insert new Entity with empty RowKey, @loki", (done) => { diff --git a/tests/table/models/AzureDataTablesTestEntity.ts b/tests/table/models/AzureDataTablesTestEntity.ts index b36a30105..bed93e68e 100644 --- a/tests/table/models/AzureDataTablesTestEntity.ts +++ b/tests/table/models/AzureDataTablesTestEntity.ts @@ -34,7 +34,7 @@ export class AzureDataTablesTestEntity { public nullableString: string | null = "notNull"; public binaryField: Buffer = Buffer.from("11111111"); public booleanField: boolean = true; - public dateField: Edm<"DateTime"> = { value: "", type: "DateTime" }; + public dateField: Edm<"DateTime"> = { value: "2023-01-01T23:00:00", type: "DateTime" }; constructor(part: string, row: string, value: string) { this.partitionKey = part; this.rowKey = row; From 7cc4434811c6f04d2e7a8b3d514649bb621ba0b2 Mon Sep 17 00:00:00 2001 From: Ariel Alonso Date: Wed, 4 Jan 2023 04:22:40 -0500 Subject: [PATCH 012/297] (CORS) Add support for use of wildcard character in allowed-origins (#1764) * (CORS) Add support for use of wildcard character in allowed-origins for subdomains (blob) * clean up package-lock.json * clean up package-lock.json --- ChangeLog.md | 1 + package-lock.json | 42 ++++++++-- package.json | 2 + .../middlewares/PreflightMiddlewareFactory.ts | 17 +++- tests/blob/blobCorsRequest.test.ts | 77 ++++++++++++++++++- 5 files changed, 124 insertions(+), 15 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index 680a1e84c..d7fd36f40 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -12,6 +12,7 @@ General: Blob: - Support Copy Blob From URL API when use different source and destination account (in same Azurite instance). +- Support use of wildcard character to allow all subdomains of a given domain to make requests via CORS Table: diff --git a/package-lock.json b/package-lock.json index a9cbc5916..3e8f91c02 100644 --- a/package-lock.json +++ b/package-lock.json @@ -15,6 +15,7 @@ "etag": "^1.8.1", "express": "^4.16.4", "fs-extra": "^10.1.0", + "glob-to-regexp": "^0.4.1", "jsonwebtoken": "^8.5.1", "lokijs": "^1.5.6", "morgan": "^1.9.1", @@ -49,6 +50,7 @@ "@types/etag": "^1.8.0", "@types/express": "^4.16.0", "@types/fs-extra": "^9.0.13", + "@types/glob-to-regexp": "^0.4.1", "@types/jsonwebtoken": "^8.3.9", "@types/lokijs": "^1.5.2", "@types/mocha": "^9.0.0", @@ -899,6 +901,12 @@ "node": ">=4" } }, + "node_modules/@mrmlnc/readdir-enhanced/node_modules/glob-to-regexp": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz", + "integrity": "sha512-Iozmtbqv0noj0uDDqoL0zNq0VBEfK2YFoMAZoxJe4cwphvLR+JskfF30QhXHOR4m3KrE6NLRYw+U9MRXvifyig==", + "dev": true + }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -1085,6 +1093,12 @@ "@types/node": "*" } }, + "node_modules/@types/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@types/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-S0mIukll6fbF0tvrKic/jj+jI8SHoSvGU+Cs95b/jzZEnBYCbj+7aJtQ9yeABuK3xP1okwA3jEH9qIRayijnvQ==", + "dev": true + }, "node_modules/@types/jsonwebtoken": { "version": "8.5.9", "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-8.5.9.tgz", @@ -4895,10 +4909,9 @@ } }, "node_modules/glob-to-regexp": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz", - "integrity": "sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=", - "dev": true + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==" }, "node_modules/globals": { "version": "9.18.0", @@ -11679,6 +11692,14 @@ "requires": { "call-me-maybe": "^1.0.1", "glob-to-regexp": "^0.3.0" + }, + "dependencies": { + "glob-to-regexp": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz", + "integrity": "sha512-Iozmtbqv0noj0uDDqoL0zNq0VBEfK2YFoMAZoxJe4cwphvLR+JskfF30QhXHOR4m3KrE6NLRYw+U9MRXvifyig==", + "dev": true + } } }, "@nodelib/fs.scandir": { @@ -11851,6 +11872,12 @@ "@types/node": "*" } }, + "@types/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@types/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-S0mIukll6fbF0tvrKic/jj+jI8SHoSvGU+Cs95b/jzZEnBYCbj+7aJtQ9yeABuK3xP1okwA3jEH9qIRayijnvQ==", + "dev": true + }, "@types/jsonwebtoken": { "version": "8.5.9", "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-8.5.9.tgz", @@ -15015,10 +15042,9 @@ } }, "glob-to-regexp": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz", - "integrity": "sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=", - "dev": true + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==" }, "globals": { "version": "9.18.0", diff --git a/package.json b/package.json index 574dfb3c7..4f3f74a12 100644 --- a/package.json +++ b/package.json @@ -26,6 +26,7 @@ "etag": "^1.8.1", "express": "^4.16.4", "fs-extra": "^10.1.0", + "glob-to-regexp": "^0.4.1", "jsonwebtoken": "^8.5.1", "lokijs": "^1.5.6", "morgan": "^1.9.1", @@ -54,6 +55,7 @@ "@types/etag": "^1.8.0", "@types/express": "^4.16.0", "@types/fs-extra": "^9.0.13", + "@types/glob-to-regexp": "^0.4.1", "@types/jsonwebtoken": "^8.3.9", "@types/lokijs": "^1.5.2", "@types/mocha": "^9.0.0", diff --git a/src/blob/middlewares/PreflightMiddlewareFactory.ts b/src/blob/middlewares/PreflightMiddlewareFactory.ts index c562a5ea4..c6be46372 100644 --- a/src/blob/middlewares/PreflightMiddlewareFactory.ts +++ b/src/blob/middlewares/PreflightMiddlewareFactory.ts @@ -7,6 +7,7 @@ import { Response } from "express"; +import glob from "glob-to-regexp"; import ILogger from "../../common/ILogger"; import BlobStorageContext from "../context/BlobStorageContext"; import StorageErrorFactory from "../errors/StorageErrorFactory"; @@ -20,6 +21,7 @@ import { MethodConstants } from "../utils/constants"; + export default class PreflightMiddlewareFactory { constructor(private readonly logger: ILogger) {} @@ -76,7 +78,7 @@ export default class PreflightMiddlewareFactory { metadataStore .getServiceProperties(context, account) - .then(properties => { + .then((properties) => { if (properties === undefined || properties.cors === undefined) { return next( StorageErrorFactory.corsPreflightFailure(requestId, { @@ -168,7 +170,7 @@ export default class PreflightMiddlewareFactory { metadataStore .getServiceProperties(context, account) - .then(properties => { + .then((properties) => { if (properties === undefined || properties.cors === undefined) { return next(err); } @@ -241,6 +243,12 @@ export default class PreflightMiddlewareFactory { const allowedOriginArray = allowedOrigin.split(","); for (const corsOrigin of allowedOriginArray) { + if (corsOrigin.includes("*")) { + return glob(corsOrigin.trim().toLowerCase()).test( + origin.trim().toLowerCase() + ); + } + if (origin.trim().toLowerCase() === corsOrigin.trim().toLowerCase()) { return true; } @@ -323,8 +331,9 @@ export default class PreflightMiddlewareFactory { ); // Handle collection of headers starting with same prefix, such as x-ms-meta prefix - const headerCollectionPrefix = (headerMapper as msRest.DictionaryMapper) - .headerCollectionPrefix; + const headerCollectionPrefix = ( + headerMapper as msRest.DictionaryMapper + ).headerCollectionPrefix; if ( headerCollectionPrefix !== undefined && headerValueOriginal !== undefined diff --git a/tests/blob/blobCorsRequest.test.ts b/tests/blob/blobCorsRequest.test.ts index f46468450..7fc25f36c 100644 --- a/tests/blob/blobCorsRequest.test.ts +++ b/tests/blob/blobCorsRequest.test.ts @@ -7,6 +7,7 @@ import * as assert from "assert"; import { configLogger } from "../../src/common/Logger"; import BlobTestServerFactory from "../BlobTestServerFactory"; +import { RestError } from "@azure/core-http"; import { EMULATOR_ACCOUNT_KEY, EMULATOR_ACCOUNT_NAME, @@ -531,6 +532,77 @@ describe("Blob Cors requests test", () => { assert.ok(res._response.status === 200); }); + context( + "OPTIONS request should work with matching rule containing wildcard in Origin @loki @sql", + async () => { + const testCases = [ + { origin: undefined, expected: 403 }, + { origin: "contoso.com", expected: 403 }, + { origin: "bar.notcontoso.com", expected: 403 }, + { origin: "foo.contoso.com", expected: 200 }, + { origin: "foo.bar.baz.contoso.com", expected: 200 }, + { origin: "foo.CONTOSO.com", expected: 200 } + ]; + + testCases.forEach(async (testCase) => { + it(`${testCase.origin}`, async () => { + const serviceProperties = await serviceClient.getProperties(); + + const newCORS = { + allowedHeaders: "header", + allowedMethods: "GET", + allowedOrigins: "*.contoso.com", + exposedHeaders: "*", + maxAgeInSeconds: 8888 + }; + + serviceProperties.cors = [newCORS]; + + await serviceClient.setProperties(serviceProperties); + + await sleep(100); + + const origin = testCase.origin; + const requestMethod = "GET"; + const expectedStatus = testCase.expected; + + const pipeline = newPipeline( + new StorageSharedKeyCredential( + EMULATOR_ACCOUNT_NAME, + EMULATOR_ACCOUNT_KEY + ), + { + retryOptions: { maxTries: 1 }, + // Make sure socket is closed once the operation is done. + keepAliveOptions: { enable: false } + } + ); + pipeline.factories.unshift( + new OPTIONSRequestPolicyFactory(origin, requestMethod) + ); + const serviceClientForOptions = new BlobServiceClient( + baseURL, + pipeline + ); + + let status: number = 0; + try { + const res = await serviceClientForOptions.getProperties(); + status = res._response.status; + } catch (e: any) { + if (!(e instanceof RestError)) { + throw e; + } + + status = e.response?.status || 0; + } + + assert.ok(status === expectedStatus); + }); + }); + } + ); + it("Response of request to service without cors rules should not contains cors info @loki @sql", async () => { const serviceProperties = await serviceClient.getProperties(); @@ -714,9 +786,8 @@ describe("Blob Cors requests test", () => { pipeline.factories.unshift(new OriginPolicyFactory(origin)); const serviceClientWithOrigin = new BlobServiceClient(baseURL, pipeline); - const containerClientWithOrigin = serviceClientWithOrigin.getContainerClient( - "notexistcontainer" - ); + const containerClientWithOrigin = + serviceClientWithOrigin.getContainerClient("notexistcontainer"); try { await containerClientWithOrigin.getProperties(); From 4e343212e6e5a9bd1fc1857ba6275634d255ffd8 Mon Sep 17 00:00:00 2001 From: Emma Zhu Date: Thu, 27 Oct 2022 18:21:42 +0800 Subject: [PATCH 013/297] Add support for user delegation key --- ChangeLog.md | 1 + .../authentication/BlobSASAuthenticator.ts | 189 ++++++++--- .../authentication/IBlobSASSignatureValues.ts | 293 ++++++++++++++++++ src/blob/generated/utils/utils.ts | 22 ++ src/blob/handlers/ServiceHandler.ts | 27 +- src/blob/utils/constants.ts | 4 + tests/blob/oauth.test.ts | 228 +++++++++++++- 7 files changed, 713 insertions(+), 51 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index d7fd36f40..6c279786b 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -13,6 +13,7 @@ Blob: - Support Copy Blob From URL API when use different source and destination account (in same Azurite instance). - Support use of wildcard character to allow all subdomains of a given domain to make requests via CORS +- Add support for user delegation key. Table: diff --git a/src/blob/authentication/BlobSASAuthenticator.ts b/src/blob/authentication/BlobSASAuthenticator.ts index 13ae151ed..a8abf91ad 100644 --- a/src/blob/authentication/BlobSASAuthenticator.ts +++ b/src/blob/authentication/BlobSASAuthenticator.ts @@ -7,12 +7,14 @@ import { AccessPolicy, BlobType } from "../generated/artifacts/models"; import Operation from "../generated/artifacts/operation"; import Context from "../generated/Context"; import IRequest from "../generated/IRequest"; +import { getUserDelegationKeyValue } from "../generated/utils/utils"; import IBlobMetadataStore from "../persistence/IBlobMetadataStore"; import { BlobSASPermission } from "./BlobSASPermissions"; import { BlobSASResourceType } from "./BlobSASResourceType"; import IAuthenticator from "./IAuthenticator"; import { generateBlobSASSignature, + generateBlobSASSignatureWithUDK, IBlobSASSignatureValues } from "./IBlobSASSignatureValues"; import { @@ -137,75 +139,162 @@ export default class BlobSASAuthenticator implements IAuthenticator { throw new StrictModelNotSupportedError("SAS Encryption Scope 'ses'", context.contextId); } - this.logger.info( - `BlobSASAuthenticator:validate() Validate signature based account key1.`, - context.contextId - ); - const [sig1, stringToSign1] = generateBlobSASSignature( - values, - resource, - account, - accountProperties.key1 - ); - this.logger.debug( - `BlobSASAuthenticator:validate() String to sign is: ${JSON.stringify( - stringToSign1 - )}`, - context.contextId! - ); - this.logger.debug( - `BlobSASAuthenticator:validate() Calculated signature is: ${sig1}`, - context.contextId! - ); + if (values.signedObjectId + || values.signedTenantId + || values.signedService + || values.signedVersion + || values.signedStartsOn + || values.signedExpiresOn) { + this.logger.info( + `BlobSASAuthenticator:validate() Validate signature based on user delegation key.`, + context.contextId + ); - const sig1Pass = sig1 === signature; - this.logger.info( - `BlobSASAuthenticator:validate() Signature based on key1 validation ${ - sig1Pass ? "passed" : "failed" - }.`, - context.contextId - ); + if (!values.signedObjectId + || !values.signedTenantId + || !values.signedStartsOn + || !values.signedExpiresOn + || !values.signedService + || !values.signedVersion + || values.signedService !== "b") { + this.logger.info( + `BlobSASAuthenticator:validate() Signature based on user delegation key validation failed" + }.`, + context.contextId + ); + throw StorageErrorFactory.getAuthorizationFailure(context.contextId!); + } + + const savedPolicy = this.decodeIfExist(req.getQuery("si")); + if (savedPolicy) { + this.logger.info( + `BlobSASAuthenticator:validate() Access policy used in UDK SAS.`, + context.contextId + ); + throw StorageErrorFactory.getAuthorizationFailure(context.contextId!); + } - if (accountProperties.key2 !== undefined) { this.logger.info( - `BlobSASAuthenticator:validate() Account key2 is not empty, validate signature based account key2.`, + `BlobSASAuthenticator:validate() Validate UDK start and expiry time.`, context.contextId ); - const [sig2, stringToSign2] = generateBlobSASSignature( + + if (!this.validateTime(values.signedExpiresOn!, values.signedStartsOn!)) { + this.logger.info( + `BlobSASAuthenticator:validate() Validate UDK start and expiry failed.`, + context.contextId + ); + throw StorageErrorFactory.getAuthorizationFailure(context.contextId!); + } + + const keyValue = getUserDelegationKeyValue( + values.signedObjectId!, + values.signedTenantId!, + values.signedStartsOn!, + values.signedExpiresOn!, + values.signedVersion! + ); + const [sig, stringToSign] = generateBlobSASSignatureWithUDK( values, resource, account, - accountProperties.key2 + Buffer.from(keyValue, "base64") ); + this.logger.debug( `BlobSASAuthenticator:validate() String to sign is: ${JSON.stringify( - stringToSign2 + stringToSign )}`, context.contextId! ); this.logger.debug( - `BlobSASAuthenticator:validate() Calculated signature is: ${sig2}`, + `BlobSASAuthenticator:validate() Calculated signature is: ${sig}`, context.contextId! ); - const sig2Pass = sig2 !== signature; + const sigPass = sig === signature; this.logger.info( - `BlobSASAuthenticator:validate() Signature based on key2 validation ${ - sig2Pass ? "passed" : "failed" + `BlobSASAuthenticator:validate() Signature based on UDK ${ + sigPass ? "passed" : "failed" }.`, context.contextId ); - if (!sig2Pass && !sig1Pass) { + if (!sigPass) { + return sigPass; + } + } + else { + this.logger.info( + `BlobSASAuthenticator:validate() Validate signature based account key1.`, + context.contextId + ); + const [sig1, stringToSign1] = generateBlobSASSignature( + values, + resource, + account, + accountProperties.key1 + ); + this.logger.debug( + `BlobSASAuthenticator:validate() String to sign is: ${JSON.stringify( + stringToSign1 + )}`, + context.contextId! + ); + this.logger.debug( + `BlobSASAuthenticator:validate() Calculated signature is: ${sig1}`, + context.contextId! + ); + + const sig1Pass = sig1 === signature; + this.logger.info( + `BlobSASAuthenticator:validate() Signature based on key1 validation ${ + sig1Pass ? "passed" : "failed" + }.`, + context.contextId + ); + + if (accountProperties.key2 !== undefined) { this.logger.info( - `BlobSASAuthenticator:validate() Validate signature based account key1 and key2 failed.`, + `BlobSASAuthenticator:validate() Account key2 is not empty, validate signature based account key2.`, context.contextId ); - return false; - } - } else { - if (!sig1Pass) { - return false; + const [sig2, stringToSign2] = generateBlobSASSignature( + values, + resource, + account, + accountProperties.key2 + ); + this.logger.debug( + `BlobSASAuthenticator:validate() String to sign is: ${JSON.stringify( + stringToSign2 + )}`, + context.contextId! + ); + this.logger.debug( + `BlobSASAuthenticator:validate() Calculated signature is: ${sig2}`, + context.contextId! + ); + + const sig2Pass = sig2 !== signature; + this.logger.info( + `BlobSASAuthenticator:validate() Signature based on key2 validation ${ + sig2Pass ? "passed" : "failed" + }.`, + context.contextId + ); + + if (!sig2Pass && !sig1Pass) { + this.logger.info( + `BlobSASAuthenticator:validate() Validate signature based account key1 and key2 failed.`, + context.contextId + ); + return false; + } + } else { + if (!sig1Pass) { + return false; + } } } @@ -375,6 +464,12 @@ export default class BlobSASAuthenticator implements IAuthenticator { const signedResource = this.decodeIfExist(req.getQuery("sr")); const snapshot = this.decodeIfExist(req.getQuery("snapshot")); const encryptionScope = this.decodeIfExist(req.getQuery("ses")); + const signedObjectId = this.decodeIfExist(req.getQuery("skoid")); + const signedTenantId = this.decodeIfExist(req.getQuery("sktid")); + const signedStartsOn = this.decodeIfExist(req.getQuery("skt")); + const signedExpiresOn = this.decodeIfExist(req.getQuery("ske")); + const signedVersion = this.decodeIfExist(req.getQuery("skv")); + const signedService = this.decodeIfExist(req.getQuery("sks")); if (!identifier && (!permissions || !expiryTime)) { this.logger.warn( @@ -411,7 +506,13 @@ export default class BlobSASAuthenticator implements IAuthenticator { contentLanguage, contentType, signedResource, - snapshot + snapshot, + signedObjectId, + signedTenantId, + signedService, + signedVersion, + signedStartsOn, + signedExpiresOn }; return blobSASValues; diff --git a/src/blob/authentication/IBlobSASSignatureValues.ts b/src/blob/authentication/IBlobSASSignatureValues.ts index 2f20b2337..ca4f2ead2 100644 --- a/src/blob/authentication/IBlobSASSignatureValues.ts +++ b/src/blob/authentication/IBlobSASSignatureValues.ts @@ -153,6 +153,54 @@ export interface IBlobSASSignatureValues { * @memberof IBlobSASSignatureValues */ snapshot?: string; + + /** + * Optional. Specifies the Azure Active Directory object ID in GUID format. + * + * @type {string} + * @memberof IBlobSASSignatureValues + */ + signedObjectId?: string; + + /** + * Optional. Specifies the Azure Active Directory object ID in GUID format. + * + * @type {string} + * @memberof IBlobSASSignatureValues + */ + signedTenantId?: string; + + /** + * Optional. Abbreviation of the Azure Storage service that accepts the key.. + * + * @type {string} + * @memberof IBlobSASSignatureValues + */ + signedService?: string; + + /** + * Optional. Specifies the service version to create the key. + * + * @type {string} + * @memberof IBlobSASSignatureValues + */ + signedVersion?: string; + + /** + * Optional. Specifies date-time when the key is active. + * + * @type {string} + * @memberof IBlobSASSignatureValues + */ + signedStartsOn?: string; + + /** + * Optional. Specifies date-time when the key expires. + * + * @type {string} + * @memberof IBlobSASSignatureValues + */ + signedExpiresOn?: string; } /** @@ -203,6 +251,58 @@ export function generateBlobSASSignature( } } +/** + * Creates an instance of SASQueryParameters. + * + * Only accepts required settings needed to create a SAS. For optional settings please + * set corresponding properties directly, such as permissions, startTime and identifier. + * + * WARNING: When identifier is not provided, permissions and expiryTime are required. + * You MUST assign value to identifier or expiryTime & permissions manually if you initial with + * this constructor. + * + * @export + * @param {IBlobSASSignatureValues} blobSASSignatureValues + * @param {BlobSASResourceType} resource + * @param {string} accountName + * @param {Buffer} udkValue + * @returns {[string, string]} signature and stringToSign + */ +export function generateBlobSASSignatureWithUDK( + blobSASSignatureValues: IBlobSASSignatureValues, + resource: BlobSASResourceType, + accountName: string, + udkValue: Buffer +): [string, string] { + if (blobSASSignatureValues.version >= "2020-12-06") { + return generateBlobSASBlobSASSignatureWithUDK20201206( + blobSASSignatureValues, + resource, + accountName, + udkValue + ); + } + else if (blobSASSignatureValues.version >= "2020-02-10"){ + return generateBlobSASSignatureWithUDK20200210( + blobSASSignatureValues, + resource, + accountName, + udkValue + ); + } + else if (blobSASSignatureValues.version >= "2018-11-09") { + return generateBlobSASSignatureUDK20181109( + blobSASSignatureValues, + resource, + accountName, + udkValue + ); + } + else { + throw new RangeError("SAS token version is not valid"); + } +} + function generateBlobSASSignature20201206( blobSASSignatureValues: IBlobSASSignatureValues, resource: BlobSASResourceType, @@ -412,6 +512,199 @@ function generateBlobSASSignature20150405( return [signature, stringToSign]; } +function generateBlobSASSignatureUDK20181109( + blobSASSignatureValues: IBlobSASSignatureValues, + resource: BlobSASResourceType, + accountName: string, + userDelegationKeyValue: Buffer +): [string, string] { + if ( + !blobSASSignatureValues.identifier && + (!blobSASSignatureValues.permissions && !blobSASSignatureValues.expiryTime) + ) { + throw new RangeError( + // tslint:disable-next-line:max-line-length + "generateBlobSASSignature(): Must provide 'permissions' and 'expiryTime' for Blob SAS generation when 'identifier' is not provided." + ); + } + + const verifiedPermissions = blobSASSignatureValues.permissions; + + // Signature is generated on the un-url-encoded values. + const stringToSign = [ + verifiedPermissions ? verifiedPermissions : "", + blobSASSignatureValues.startTime === undefined + ? "" + : typeof blobSASSignatureValues.startTime === "string" + ? blobSASSignatureValues.startTime + : truncatedISO8061Date(blobSASSignatureValues.startTime, false), + blobSASSignatureValues.expiryTime === undefined + ? "" + : typeof blobSASSignatureValues.expiryTime === "string" + ? blobSASSignatureValues.expiryTime + : truncatedISO8061Date(blobSASSignatureValues.expiryTime, false), + getCanonicalName( + accountName, + blobSASSignatureValues.containerName, + blobSASSignatureValues.blobName + ), + blobSASSignatureValues.signedObjectId, + blobSASSignatureValues.signedTenantId, + blobSASSignatureValues.signedStartsOn, + blobSASSignatureValues.signedExpiresOn, + blobSASSignatureValues.signedService, + blobSASSignatureValues.signedVersion, + blobSASSignatureValues.ipRange === undefined + ? "" + : typeof blobSASSignatureValues.ipRange === "string" + ? blobSASSignatureValues.ipRange + : ipRangeToString(blobSASSignatureValues.ipRange), + blobSASSignatureValues.protocol ? blobSASSignatureValues.protocol : "", + blobSASSignatureValues.version, + resource, + undefined, // blob version timestamp, + blobSASSignatureValues.cacheControl, + blobSASSignatureValues.contentDisposition, + blobSASSignatureValues.contentEncoding, + blobSASSignatureValues.contentLanguage, + blobSASSignatureValues.contentType, + ].join("\n"); + + const signature = computeHMACSHA256(stringToSign, userDelegationKeyValue); + return [signature, stringToSign]; +} + +function generateBlobSASSignatureWithUDK20200210( + blobSASSignatureValues: IBlobSASSignatureValues, + resource: BlobSASResourceType, + accountName: string, + userDelegationKeyValue: Buffer +): [string, string] { + if ( + !blobSASSignatureValues.identifier && + (!blobSASSignatureValues.permissions && !blobSASSignatureValues.expiryTime) + ) { + throw new RangeError( + // tslint:disable-next-line:max-line-length + "generateBlobSASSignature(): Must provide 'permissions' and 'expiryTime' for Blob SAS generation when 'identifier' is not provided." + ); + } + + const verifiedPermissions = blobSASSignatureValues.permissions; + + // Signature is generated on the un-url-encoded values. + const stringToSign = [ + verifiedPermissions ? verifiedPermissions : "", + blobSASSignatureValues.startTime === undefined + ? "" + : typeof blobSASSignatureValues.startTime === "string" + ? blobSASSignatureValues.startTime + : truncatedISO8061Date(blobSASSignatureValues.startTime, false), + blobSASSignatureValues.expiryTime === undefined + ? "" + : typeof blobSASSignatureValues.expiryTime === "string" + ? blobSASSignatureValues.expiryTime + : truncatedISO8061Date(blobSASSignatureValues.expiryTime, false), + getCanonicalName( + accountName, + blobSASSignatureValues.containerName, + blobSASSignatureValues.blobName + ), + blobSASSignatureValues.signedObjectId, + blobSASSignatureValues.signedTenantId, + blobSASSignatureValues.signedStartsOn, + blobSASSignatureValues.signedExpiresOn, + blobSASSignatureValues.signedService, + blobSASSignatureValues.signedVersion, + undefined, // blobSASSignatureValues.preauthorizedAgentObjectId, + undefined, // agentObjectId + undefined, // blobSASSignatureValues.correlationId, + blobSASSignatureValues.ipRange === undefined + ? "" + : typeof blobSASSignatureValues.ipRange === "string" + ? blobSASSignatureValues.ipRange + : ipRangeToString(blobSASSignatureValues.ipRange), + blobSASSignatureValues.protocol ? blobSASSignatureValues.protocol : "", + blobSASSignatureValues.version, + resource, + undefined, // blob versiontimestamp, + blobSASSignatureValues.cacheControl, + blobSASSignatureValues.contentDisposition, + blobSASSignatureValues.contentEncoding, + blobSASSignatureValues.contentLanguage, + blobSASSignatureValues.contentType, + ].join("\n"); + + const signature = computeHMACSHA256(stringToSign, userDelegationKeyValue); + return [signature, stringToSign]; +} + +function generateBlobSASBlobSASSignatureWithUDK20201206( + blobSASSignatureValues: IBlobSASSignatureValues, + resource: BlobSASResourceType, + accountName: string, + userDelegationKeyValue: Buffer +): [string, string] { + if ( + !blobSASSignatureValues.identifier && + (!blobSASSignatureValues.permissions && !blobSASSignatureValues.expiryTime) + ) { + throw new RangeError( + // tslint:disable-next-line:max-line-length + "generateBlobSASSignature(): Must provide 'permissions' and 'expiryTime' for Blob SAS generation when 'identifier' is not provided." + ); + } + + const verifiedPermissions = blobSASSignatureValues.permissions; + + // Signature is generated on the un-url-encoded values. + const stringToSign = [ + verifiedPermissions ? verifiedPermissions : "", + blobSASSignatureValues.startTime === undefined + ? "" + : typeof blobSASSignatureValues.startTime === "string" + ? blobSASSignatureValues.startTime + : truncatedISO8061Date(blobSASSignatureValues.startTime, false), + blobSASSignatureValues.expiryTime === undefined + ? "" + : typeof blobSASSignatureValues.expiryTime === "string" + ? blobSASSignatureValues.expiryTime + : truncatedISO8061Date(blobSASSignatureValues.expiryTime, false), + getCanonicalName( + accountName, + blobSASSignatureValues.containerName, + blobSASSignatureValues.blobName + ), + blobSASSignatureValues.signedObjectId, + blobSASSignatureValues.signedTenantId, + blobSASSignatureValues.signedStartsOn, + blobSASSignatureValues.signedExpiresOn, + blobSASSignatureValues.signedService, + blobSASSignatureValues.signedVersion, + undefined, // blobSASSignatureValues.preauthorizedAgentObjectId, + undefined, // agentObjectId + undefined, // blobSASSignatureValues.correlationId, + blobSASSignatureValues.ipRange === undefined + ? "" + : typeof blobSASSignatureValues.ipRange === "string" + ? blobSASSignatureValues.ipRange + : ipRangeToString(blobSASSignatureValues.ipRange), + blobSASSignatureValues.protocol ? blobSASSignatureValues.protocol : "", + blobSASSignatureValues.version, + resource, + undefined, // blob version timestamp, + blobSASSignatureValues.encryptionScope, + blobSASSignatureValues.cacheControl, + blobSASSignatureValues.contentDisposition, + blobSASSignatureValues.contentEncoding, + blobSASSignatureValues.contentLanguage, + blobSASSignatureValues.contentType, + ].join("\n"); + + const signature = computeHMACSHA256(stringToSign, userDelegationKeyValue); + return [signature, stringToSign]; +} + function getCanonicalName( accountName: string, containerName: string, diff --git a/src/blob/generated/utils/utils.ts b/src/blob/generated/utils/utils.ts index 014377abe..58cffb703 100644 --- a/src/blob/generated/utils/utils.ts +++ b/src/blob/generated/utils/utils.ts @@ -1,4 +1,6 @@ +import { createHmac } from "crypto"; import URITemplate from "uri-templates"; +import { USERDELEGATIONKEY_BASIC_KEY } from "../../utils/constants"; export function isURITemplateMatch(url: string, template: string): boolean { const uriTemplate = URITemplate(template); @@ -18,3 +20,23 @@ export function isURITemplateMatch(url: string, template: string): boolean { } return true; } + +export function getUserDelegationKeyValue( + signedObjectid: string, + signedTenantid: string, + signedStartsOn: string, + signedExpiresOn: string, + signedVersion: string, +) : string { + + const stringToSign = [ + signedObjectid, + signedTenantid, + signedStartsOn, + signedExpiresOn, + "b", + signedVersion + ].join("\n"); + + return createHmac("sha256", USERDELEGATIONKEY_BASIC_KEY).update(stringToSign, "utf8").digest("base64"); +} \ No newline at end of file diff --git a/src/blob/handlers/ServiceHandler.ts b/src/blob/handlers/ServiceHandler.ts index 999e90293..ba3786142 100644 --- a/src/blob/handlers/ServiceHandler.ts +++ b/src/blob/handlers/ServiceHandler.ts @@ -1,11 +1,12 @@ import BlobStorageContext from "../context/BlobStorageContext"; import StorageErrorFactory from "../errors/StorageErrorFactory"; -import NotImplementedError from "../errors/NotImplementedError"; import * as Models from "../generated/artifacts/models"; import Context from "../generated/Context"; import IServiceHandler from "../generated/handlers/IServiceHandler"; import { parseXML } from "../generated/utils/xml"; import { + AAD_OBJECT_ID, + AAD_TENANT_ID, BLOB_API_VERSION, DEFAULT_LIST_CONTAINERS_MAX_RESULTS, EMULATOR_ACCOUNT_KIND, @@ -19,6 +20,7 @@ import ILogger from "../../common/ILogger"; import { BlobBatchHandler } from "./BlobBatchHandler"; import { Readable } from "stream"; import { OAuthLevel } from "../../common/models"; +import { getUserDelegationKeyValue } from "../generated/utils/utils"; /** * ServiceHandler handles Azure Storage Blob service related requests. @@ -77,12 +79,31 @@ export default class ServiceHandler extends BaseHandler } }; - public getUserDelegationKey( + public async getUserDelegationKey( keyInfo: Models.KeyInfo, options: Models.ServiceGetUserDelegationKeyOptionalParams, context: Context ): Promise { - throw new NotImplementedError(context.contextId); + const keyValue = getUserDelegationKeyValue( + AAD_OBJECT_ID, + AAD_TENANT_ID, + keyInfo.start, + keyInfo.expiry, + BLOB_API_VERSION + ); + + const response: Models.ServiceGetUserDelegationKeyResponse = { + statusCode: 200, + signedOid: AAD_OBJECT_ID, + signedTid: AAD_TENANT_ID, + signedService: "b", + signedVersion: BLOB_API_VERSION, + signedStart: keyInfo.start, + signedExpiry: keyInfo.expiry, + value: keyValue + }; + + return response; } diff --git a/src/blob/utils/constants.ts b/src/blob/utils/constants.ts index cfc7a081f..b186b2d09 100644 --- a/src/blob/utils/constants.ts +++ b/src/blob/utils/constants.ts @@ -156,3 +156,7 @@ export const VALID_BLOB_AUDIENCES = [ export const HTTP_LINE_ENDING = "\r\n"; export const HTTP_HEADER_DELIMITER = ": "; + +export const AAD_OBJECT_ID = "23657296-5cd5-45b0-a809-d972a7f4dfe1"; +export const AAD_TENANT_ID = "dd0d0df1-06c3-436c-8034-4b9a153097ce"; +export const USERDELEGATIONKEY_BASIC_KEY = "I17GKLvcJUossaebtsEDZZ2RJ8GNLwLH4m7hRMxbVbkx6wNIRAABj4Rtw0FBhFuEAgmbL4gFMzUw+AStz9Sqdg=="; diff --git a/tests/blob/oauth.test.ts b/tests/blob/oauth.test.ts index bf3d7e657..13577e319 100644 --- a/tests/blob/oauth.test.ts +++ b/tests/blob/oauth.test.ts @@ -1,13 +1,12 @@ -import { BlobServiceClient, newPipeline } from "@azure/storage-blob"; +import { AnonymousCredential, BlobServiceClient, ContainerClient, ContainerSASPermissions, generateBlobSASQueryParameters, newPipeline } from "@azure/storage-blob"; import * as assert from "assert"; import { configLogger } from "../../src/common/Logger"; import BlobTestServerFactory from "../BlobTestServerFactory"; -import { generateJWTToken, getUniqueName } from "../testutils"; +import { EMULATOR_ACCOUNT_KEY, EMULATOR_ACCOUNT_NAME, generateJWTToken, getUniqueName } from "../testutils"; import { SimpleTokenCredential } from "../simpleTokenCredential"; -import { BlobClient } from "@azure/storage-blob"; -import { BlobBatch } from "@azure/storage-blob"; +import { BlobClient, StorageSharedKeyCredential, BlobBatch} from "@azure/storage-blob"; // Set true to enable debug log configLogger(false); @@ -185,6 +184,227 @@ describe("Blob OAuth Basic", () => { } }); + it(`Should work with delegation SAS @loki @sql`, async () => { + const token = generateJWTToken( + new Date("2019/01/01"), + new Date("2019/01/01"), + new Date("2100/01/01"), + "https://sts.windows-ppe.net/ab1f708d-50f6-404c-a006-d71b2ac7a606/", + "https://storage.azure.com", + "user_impersonation" + ); + + const serviceClient = new BlobServiceClient( + baseURL, + newPipeline(new SimpleTokenCredential(token), { + retryOptions: { maxTries: 1 }, + // Make sure socket is closed once the operation is done. + keepAliveOptions: { enable: false } + }) + ); + + const startTime = new Date(); + startTime.setHours(startTime.getHours() - 1); + const expiryTime = new Date(); + expiryTime.setDate(expiryTime.getDate() + 1); + const userDelegationKey = await serviceClient.getUserDelegationKey(startTime, expiryTime); + + const containerName: string = getUniqueName("1container-with-dash") + + const sasExpirytime = new Date(); + sasExpirytime.setHours(sasExpirytime.getHours() + 1); + + const containerSAS = generateBlobSASQueryParameters( + { + containerName: containerName, + expiresOn: sasExpirytime, + permissions: ContainerSASPermissions.parse("racwdl"), + }, + userDelegationKey, + "devstoreaccount1" + ); + + const containerClient = new ContainerClient( + `${serviceClient.url}/${containerName}?${containerSAS}`, + newPipeline(new AnonymousCredential()) + ); + await containerClient.create(); + await containerClient.delete(); + }); + + it(`Should fail with delegation SAS with invalid time duration @loki @sql`, async () => { + const token = generateJWTToken( + new Date("2019/01/01"), + new Date("2019/01/01"), + new Date("2100/01/01"), + "https://sts.windows-ppe.net/ab1f708d-50f6-404c-a006-d71b2ac7a606/", + "https://storage.azure.com", + "user_impersonation" + ); + + const serviceClient = new BlobServiceClient( + baseURL, + newPipeline(new SimpleTokenCredential(token), { + retryOptions: { maxTries: 1 }, + // Make sure socket is closed once the operation is done. + keepAliveOptions: { enable: false } + }) + ); + const containerName: string = getUniqueName("1container-with-dash") + + // Later user delegation key start time + let startTime = new Date(); + startTime.setMinutes(startTime.getMinutes() + 20); + let expiryTime = new Date(); + expiryTime.setDate(expiryTime.getDate() + 1); + let userDelegationKey = await serviceClient.getUserDelegationKey(startTime, expiryTime); + + let sasExpirytime = new Date(); + sasExpirytime.setHours(sasExpirytime.getHours() + 1); + + let containerSAS = generateBlobSASQueryParameters( + { + containerName: containerName, + expiresOn: sasExpirytime, + permissions: ContainerSASPermissions.parse("racwdl"), + }, + userDelegationKey, + "devstoreaccount1" + ); + + let containerClient = new ContainerClient( + `${serviceClient.url}/${containerName}?${containerSAS}`, + newPipeline(new AnonymousCredential()) + ); + let failed = false; + try { + await containerClient.create(); + } + catch (err) { + failed = true; + assert.equal(err.statusCode, 403); + } + assert.ok(failed); + + // Eearlier user delegation key expirty time + startTime = new Date(); + startTime.setDate(startTime.getDate() - 1); + expiryTime = new Date(); + expiryTime.setMinutes(expiryTime.getMinutes() - 1); + userDelegationKey = await serviceClient.getUserDelegationKey(startTime, expiryTime); + + sasExpirytime = new Date(); + sasExpirytime.setHours(sasExpirytime.getHours() + 1); + + containerSAS = generateBlobSASQueryParameters( + { + containerName: containerName, + expiresOn: sasExpirytime, + permissions: ContainerSASPermissions.parse("racwdl"), + }, + userDelegationKey, + "devstoreaccount1" + ); + + containerClient = new ContainerClient( + `${serviceClient.url}/${containerName}?${containerSAS}`, + newPipeline(new AnonymousCredential()) + ); + + failed = false; + try { + await containerClient.create(); + } + catch (err) { + failed = true; + assert.equal(err.statusCode, 403); + } + assert.ok(failed); + }); + + + it(`Should fail with delegation SAS with access policy @loki @sql`, async () => { + const token = generateJWTToken( + new Date("2019/01/01"), + new Date("2019/01/01"), + new Date("2100/01/01"), + "https://sts.windows-ppe.net/ab1f708d-50f6-404c-a006-d71b2ac7a606/", + "https://storage.azure.com", + "user_impersonation" + ); + + const serviceClient = new BlobServiceClient( + baseURL, + newPipeline(new SimpleTokenCredential(token), { + retryOptions: { maxTries: 1 }, + // Make sure socket is closed once the operation is done. + keepAliveOptions: { enable: false } + }) + ); + + const startTime = new Date(); + startTime.setHours(startTime.getHours() - 1); + const expiryTime = new Date(); + expiryTime.setDate(expiryTime.getDate() + 1); + const userDelegationKey = await serviceClient.getUserDelegationKey(startTime, expiryTime); + + const serviceClientWithAccountKey = new BlobServiceClient( + baseURL, + newPipeline( + new StorageSharedKeyCredential( + EMULATOR_ACCOUNT_NAME, + EMULATOR_ACCOUNT_KEY + ), + { + retryOptions: { maxTries: 1 }, + // Make sure socket is closed once the operation is done. + keepAliveOptions: { enable: false } + } + ) + ); + const containerName: string = getUniqueName("1container-with-dash"); + const containerClientWithKey = serviceClientWithAccountKey.getContainerClient(containerName); + await containerClientWithKey.create(); + await containerClientWithKey.setAccessPolicy(undefined, + [ + { + accessPolicy: { + permissions: "racwdl" + }, + id: "MTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTI=" + } + ]); + + const sasExpirytime = new Date(); + sasExpirytime.setHours(sasExpirytime.getHours() + 1); + + const containerSAS = generateBlobSASQueryParameters( + { + containerName: containerName, + expiresOn: sasExpirytime, + permissions: ContainerSASPermissions.parse("racwdl"), + identifier: "MTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTI=" + }, + userDelegationKey, + "devstoreaccount1" + ); + + const containerClient = new ContainerClient( + `${serviceClient.url}/${containerName}?${containerSAS}`, + newPipeline(new AnonymousCredential()) + ); + + let failed = false; + try { + await containerClient.getProperties(); + } + catch (err) { + failed = true; + assert.equal(err.statusCode, 403); + } + assert.ok(failed); + }); + it(`Should not work with invalid JWT token @loki @sql`, async () => { const serviceClient = new BlobServiceClient( baseURL, From 0cf0da5bb8c35c934c025570fc3fa71166112c20 Mon Sep 17 00:00:00 2001 From: Emma Zhu Date: Sat, 17 Dec 2022 11:49:26 +0800 Subject: [PATCH 014/297] Resolve PR comments Added test case for getUserDelegationKey with SAS token or account key credential --- .../authentication/AccountSASAuthenticator.ts | 10 +++ .../authentication/BlobSASAuthenticator.ts | 12 +++- .../BlobSharedKeyAuthenticator.ts | 28 ++++++++- src/blob/generated/utils/utils.ts | 22 ------- src/blob/handlers/ServiceHandler.ts | 20 +++--- src/blob/utils/constants.ts | 4 +- src/blob/utils/utils.ts | 21 +++++++ tests/blob/apis/service.test.ts | 60 ++++++++++++++++++ tests/blob/oauth.test.ts | 61 ++++++++++++++----- tests/queue/oauth.test.ts | 40 +++++++++--- tests/table/auth/oauth.test.ts | 40 +++++++++--- tests/testutils.ts | 8 ++- 12 files changed, 256 insertions(+), 70 deletions(-) diff --git a/src/blob/authentication/AccountSASAuthenticator.ts b/src/blob/authentication/AccountSASAuthenticator.ts index 2d2442e86..e376922e3 100644 --- a/src/blob/authentication/AccountSASAuthenticator.ts +++ b/src/blob/authentication/AccountSASAuthenticator.ts @@ -14,6 +14,7 @@ import { import IAuthenticator from "./IAuthenticator"; import OPERATION_ACCOUNT_SAS_PERMISSIONS from "./OperationAccountSASPermission"; import StrictModelNotSupportedError from "../errors/StrictModelNotSupportedError"; +import { AUTHENTICATION_BEARERTOKEN_REQUIRED } from "../utils/constants"; export default class AccountSASAuthenticator implements IAuthenticator { public constructor( @@ -205,6 +206,15 @@ export default class AccountSASAuthenticator implements IAuthenticator { `AccountSASAuthenticator:validate() operation shouldn't be undefined. Please make sure DispatchMiddleware is hooked before authentication related middleware.` ); } + else if (operation === Operation.Service_GetUserDelegationKey) { + this.logger.info( + `AccountSASAuthenticator:validate() Service_GetUserDelegationKey requires OAuth credentials" + }.`, + context.contextId + ); + throw StorageErrorFactory.getAuthenticationFailed(context.contextId!, + AUTHENTICATION_BEARERTOKEN_REQUIRED); + } const accountSASPermission = OPERATION_ACCOUNT_SAS_PERMISSIONS.get( operation diff --git a/src/blob/authentication/BlobSASAuthenticator.ts b/src/blob/authentication/BlobSASAuthenticator.ts index a8abf91ad..6c7b54887 100644 --- a/src/blob/authentication/BlobSASAuthenticator.ts +++ b/src/blob/authentication/BlobSASAuthenticator.ts @@ -7,8 +7,9 @@ import { AccessPolicy, BlobType } from "../generated/artifacts/models"; import Operation from "../generated/artifacts/operation"; import Context from "../generated/Context"; import IRequest from "../generated/IRequest"; -import { getUserDelegationKeyValue } from "../generated/utils/utils"; import IBlobMetadataStore from "../persistence/IBlobMetadataStore"; +import { AUTHENTICATION_BEARERTOKEN_REQUIRED } from "../utils/constants"; +import { getUserDelegationKeyValue } from "../utils/utils"; import { BlobSASPermission } from "./BlobSASPermissions"; import { BlobSASResourceType } from "./BlobSASResourceType"; import IAuthenticator from "./IAuthenticator"; @@ -371,6 +372,15 @@ export default class BlobSASAuthenticator implements IAuthenticator { `BlobSASAuthenticator:validate() Operation shouldn't be undefined. Please make sure DispatchMiddleware is hooked before authentication related middleware.` ); } + else if (operation === Operation.Service_GetUserDelegationKey) { + this.logger.info( + `BlobSASAuthenticator:validate() Service_GetUserDelegationKey requires OAuth credentials" + }.`, + context.contextId + ); + throw StorageErrorFactory.getAuthenticationFailed(context.contextId!, + AUTHENTICATION_BEARERTOKEN_REQUIRED); + } const blobSASPermission = resource === BlobSASResourceType.Blob diff --git a/src/blob/authentication/BlobSharedKeyAuthenticator.ts b/src/blob/authentication/BlobSharedKeyAuthenticator.ts index 6491e9f41..a2e5783c1 100644 --- a/src/blob/authentication/BlobSharedKeyAuthenticator.ts +++ b/src/blob/authentication/BlobSharedKeyAuthenticator.ts @@ -3,9 +3,10 @@ import ILogger from "../../common/ILogger"; import { computeHMACSHA256, getURLQueries } from "../../common/utils/utils"; import BlobStorageContext from "../context/BlobStorageContext"; import StorageErrorFactory from "../errors/StorageErrorFactory"; +import Operation from "../generated/artifacts/operation"; import Context from "../generated/Context"; import IRequest from "../generated/IRequest"; -import { HeaderConstants } from "../utils/constants"; +import { AUTHENTICATION_BEARERTOKEN_REQUIRED, HeaderConstants } from "../utils/constants"; import IAuthenticator from "./IAuthenticator"; export default class BlobSharedKeyAuthenticator implements IAuthenticator { @@ -35,6 +36,14 @@ export default class BlobSharedKeyAuthenticator implements IAuthenticator { ); return undefined; } + else if (!authHeaderValue.startsWith("SharedKey")) { + this.logger.info( + // tslint:disable-next-line:max-line-length + `BlobSharedKeyAuthenticator:validate() Request doesn't include shared key authentication.`, + blobContext.contextId + ); + return undefined; + } // TODO: Make following async const accountProperties = this.dataStore.getAccount(account); @@ -49,6 +58,23 @@ export default class BlobSharedKeyAuthenticator implements IAuthenticator { ); } + const operation = context.operation; + if (operation === undefined) { + throw new Error( + // tslint:disable-next-line:max-line-length + `BlobSharedKeyAuthenticator:validate() Operation shouldn't be undefined. Please make sure DispatchMiddleware is hooked before authentication related middleware.` + ); + } + else if (operation === Operation.Service_GetUserDelegationKey) { + this.logger.info( + `BlobSharedKeyAuthenticator:validate() Service_GetUserDelegationKey requires OAuth credentials" + }.`, + context.contextId + ); + throw StorageErrorFactory.getAuthenticationFailed(context.contextId!, + AUTHENTICATION_BEARERTOKEN_REQUIRED); + } + const stringToSign: string = [ req.getMethod().toUpperCase(), diff --git a/src/blob/generated/utils/utils.ts b/src/blob/generated/utils/utils.ts index 58cffb703..09128f7e2 100644 --- a/src/blob/generated/utils/utils.ts +++ b/src/blob/generated/utils/utils.ts @@ -1,6 +1,4 @@ -import { createHmac } from "crypto"; import URITemplate from "uri-templates"; -import { USERDELEGATIONKEY_BASIC_KEY } from "../../utils/constants"; export function isURITemplateMatch(url: string, template: string): boolean { const uriTemplate = URITemplate(template); @@ -19,24 +17,4 @@ export function isURITemplateMatch(url: string, template: string): boolean { } } return true; -} - -export function getUserDelegationKeyValue( - signedObjectid: string, - signedTenantid: string, - signedStartsOn: string, - signedExpiresOn: string, - signedVersion: string, -) : string { - - const stringToSign = [ - signedObjectid, - signedTenantid, - signedStartsOn, - signedExpiresOn, - "b", - signedVersion - ].join("\n"); - - return createHmac("sha256", USERDELEGATIONKEY_BASIC_KEY).update(stringToSign, "utf8").digest("base64"); } \ No newline at end of file diff --git a/src/blob/handlers/ServiceHandler.ts b/src/blob/handlers/ServiceHandler.ts index ba3786142..318784855 100644 --- a/src/blob/handlers/ServiceHandler.ts +++ b/src/blob/handlers/ServiceHandler.ts @@ -5,12 +5,11 @@ import Context from "../generated/Context"; import IServiceHandler from "../generated/handlers/IServiceHandler"; import { parseXML } from "../generated/utils/xml"; import { - AAD_OBJECT_ID, - AAD_TENANT_ID, BLOB_API_VERSION, DEFAULT_LIST_CONTAINERS_MAX_RESULTS, EMULATOR_ACCOUNT_KIND, EMULATOR_ACCOUNT_SKUNAME, + HeaderConstants, } from "../utils/constants"; import BaseHandler from "./BaseHandler"; import IAccountDataStore from "../../common/IAccountDataStore"; @@ -20,7 +19,9 @@ import ILogger from "../../common/ILogger"; import { BlobBatchHandler } from "./BlobBatchHandler"; import { Readable } from "stream"; import { OAuthLevel } from "../../common/models"; -import { getUserDelegationKeyValue } from "../generated/utils/utils"; +import { BEARER_TOKEN_PREFIX } from "../../common/utils/constants"; +import { decode } from "jsonwebtoken"; +import { getUserDelegationKeyValue } from "../utils/utils"; /** * ServiceHandler handles Azure Storage Blob service related requests. @@ -84,9 +85,14 @@ export default class ServiceHandler extends BaseHandler options: Models.ServiceGetUserDelegationKeyOptionalParams, context: Context ): Promise { + const blobContext = new BlobStorageContext(context); + const request = blobContext.request!; + const authHeaderValue = request.getHeader(HeaderConstants.AUTHORIZATION); + const token = authHeaderValue!.substr(BEARER_TOKEN_PREFIX.length + 1); + const decodedToken = decode(token) as { [key: string]: any }; const keyValue = getUserDelegationKeyValue( - AAD_OBJECT_ID, - AAD_TENANT_ID, + decodedToken.oid, + decodedToken.tid, keyInfo.start, keyInfo.expiry, BLOB_API_VERSION @@ -94,8 +100,8 @@ export default class ServiceHandler extends BaseHandler const response: Models.ServiceGetUserDelegationKeyResponse = { statusCode: 200, - signedOid: AAD_OBJECT_ID, - signedTid: AAD_TENANT_ID, + signedOid: decodedToken.oid, + signedTid: decodedToken.tid, signedService: "b", signedVersion: BLOB_API_VERSION, signedStart: keyInfo.start, diff --git a/src/blob/utils/constants.ts b/src/blob/utils/constants.ts index b186b2d09..49a8aa6e8 100644 --- a/src/blob/utils/constants.ts +++ b/src/blob/utils/constants.ts @@ -157,6 +157,6 @@ export const VALID_BLOB_AUDIENCES = [ export const HTTP_LINE_ENDING = "\r\n"; export const HTTP_HEADER_DELIMITER = ": "; -export const AAD_OBJECT_ID = "23657296-5cd5-45b0-a809-d972a7f4dfe1"; -export const AAD_TENANT_ID = "dd0d0df1-06c3-436c-8034-4b9a153097ce"; export const USERDELEGATIONKEY_BASIC_KEY = "I17GKLvcJUossaebtsEDZZ2RJ8GNLwLH4m7hRMxbVbkx6wNIRAABj4Rtw0FBhFuEAgmbL4gFMzUw+AStz9Sqdg=="; + +export const AUTHENTICATION_BEARERTOKEN_REQUIRED = "Only authentication scheme Bearer is supported"; diff --git a/src/blob/utils/utils.ts b/src/blob/utils/utils.ts index 462ec1d9c..cecc80544 100644 --- a/src/blob/utils/utils.ts +++ b/src/blob/utils/utils.ts @@ -1,5 +1,7 @@ +import { createHmac } from "crypto"; import { createWriteStream, PathLike } from "fs"; import StorageErrorFactory from "../errors/StorageErrorFactory"; +import { USERDELEGATIONKEY_BASIC_KEY } from "./constants"; export function checkApiVersion( inputApiVersion: string, @@ -143,3 +145,22 @@ export function validateContainerName( throw StorageErrorFactory.getInvalidResourceName(requestID); } } + +export function getUserDelegationKeyValue( + signedObjectid: string, + signedTenantid: string, + signedStartsOn: string, + signedExpiresOn: string, + signedVersion: string, +) : string { + const stringToSign = [ + signedObjectid, + signedTenantid, + signedStartsOn, + signedExpiresOn, + "b", + signedVersion + ].join("\n"); + + return createHmac("sha256", USERDELEGATIONKEY_BASIC_KEY).update(stringToSign, "utf8").digest("base64"); +} diff --git a/tests/blob/apis/service.test.ts b/tests/blob/apis/service.test.ts index 382b3017e..999062aef 100644 --- a/tests/blob/apis/service.test.ts +++ b/tests/blob/apis/service.test.ts @@ -1,6 +1,11 @@ import { + AccountSASPermissions, + AccountSASResourceTypes, + AccountSASServices, BlobServiceClient, + generateAccountSASQueryParameters, newPipeline, + SASProtocol, StorageSharedKeyCredential } from "@azure/storage-blob"; import * as assert from "assert"; @@ -49,6 +54,61 @@ describe("ServiceAPIs", () => { await server.clean(); }); + it(`getUserDelegationKey with Key credential should fail @loki @sql`, async () => { + const startTime = new Date(); + startTime.setHours(startTime.getHours() - 1); + const expiryTime = new Date(); + expiryTime.setDate(expiryTime.getDate() + 1); + + try { + await serviceClient.getUserDelegationKey(startTime, expiryTime); + assert.fail("Should fail to invoke getUserDelegationKey with account key credentials") + } catch (error) { + assert.strictEqual((error as any).details.AuthenticationErrorDetail, "Only authentication scheme Bearer is supported"); + } + }); + + it(`getUserDelegationKey with SAS token credential should fail @loki @sql`, async () => { + const sasTokenStart = new Date(); + sasTokenStart.setHours(sasTokenStart.getHours() - 1); + + const sasTokenExpiry = new Date(); + sasTokenExpiry.setDate(sasTokenExpiry.getDate() + 1); + + // By default, credential is always the last element of pipeline factories + const factories = (serviceClient as any).pipeline.factories; + const sharedKeyCredential = factories[factories.length - 1]; + + const sas = generateAccountSASQueryParameters( + { + startsOn: sasTokenStart, + expiresOn: sasTokenExpiry, + ipRange: { start: "0.0.0.0", end: "255.255.255.255" }, + permissions: AccountSASPermissions.parse("rwdlacup"), + protocol: SASProtocol.HttpsAndHttp, + resourceTypes: AccountSASResourceTypes.parse("sco").toString(), + services: AccountSASServices.parse("btqf").toString(), + }, + sharedKeyCredential as StorageSharedKeyCredential + ).toString(); + + const sasClient = `${serviceClient.url}?${sas}`; + const serviceClientWithSAS = new BlobServiceClient(sasClient, newPipeline()); + + const skStart = new Date(); + skStart.setHours(skStart.getHours() - 1); + + const skExpiry = new Date(); + skExpiry.setDate(skExpiry.getDate() + 1); + + try { + await serviceClientWithSAS.getUserDelegationKey(skStart, skExpiry); + assert.fail("Should fail to invoke getUserDelegationKey with SAS token credentials") + } catch (error) { + assert.strictEqual((error as any).details.AuthenticationErrorDetail, "Only authentication scheme Bearer is supported"); + } + }); + it("GetServiceProperties @loki @sql", async () => { const result = await serviceClient.getProperties(); diff --git a/tests/blob/oauth.test.ts b/tests/blob/oauth.test.ts index 13577e319..651c9a69d 100644 --- a/tests/blob/oauth.test.ts +++ b/tests/blob/oauth.test.ts @@ -32,7 +32,9 @@ describe("Blob OAuth Basic", () => { new Date("2100/01/01"), "https://sts.windows-ppe.net/ab1f708d-50f6-404c-a006-d71b2ac7a606/", "https://storage.azure.com", - "user_impersonation" + "user_impersonation", + "23657296-5cd5-45b0-a809-d972a7f4dfe1", + "dd0d0df1-06c3-436c-8034-4b9a153097ce" ); const serviceClient = new BlobServiceClient( @@ -58,7 +60,9 @@ describe("Blob OAuth Basic", () => { new Date("2100/01/01"), "https://sts.windows-ppe.net/ab1f708d-50f6-404c-a006-d71b2ac7a606/", "https://storage.azure.com", - "user_impersonation" + "user_impersonation", + "23657296-5cd5-45b0-a809-d972a7f4dfe1", + "dd0d0df1-06c3-436c-8034-4b9a153097ce" ); const serviceClient = new BlobServiceClient( @@ -127,7 +131,9 @@ describe("Blob OAuth Basic", () => { new Date("2100/01/01"), "https://sts.windows-ppe.net/ab1f708d-50f6-404c-a006-d71b2ac7a606/", "https://storage.azure.com", - "user_impersonation" + "user_impersonation", + "23657296-5cd5-45b0-a809-d972a7f4dfe1", + "dd0d0df1-06c3-436c-8034-4b9a153097ce" ); const serviceClient = new BlobServiceClient( @@ -191,7 +197,9 @@ describe("Blob OAuth Basic", () => { new Date("2100/01/01"), "https://sts.windows-ppe.net/ab1f708d-50f6-404c-a006-d71b2ac7a606/", "https://storage.azure.com", - "user_impersonation" + "user_impersonation", + "23657296-5cd5-45b0-a809-d972a7f4dfe1", + "dd0d0df1-06c3-436c-8034-4b9a153097ce" ); const serviceClient = new BlobServiceClient( @@ -207,6 +215,7 @@ describe("Blob OAuth Basic", () => { startTime.setHours(startTime.getHours() - 1); const expiryTime = new Date(); expiryTime.setDate(expiryTime.getDate() + 1); + const userDelegationKey = await serviceClient.getUserDelegationKey(startTime, expiryTime); const containerName: string = getUniqueName("1container-with-dash") @@ -239,7 +248,9 @@ describe("Blob OAuth Basic", () => { new Date("2100/01/01"), "https://sts.windows-ppe.net/ab1f708d-50f6-404c-a006-d71b2ac7a606/", "https://storage.azure.com", - "user_impersonation" + "user_impersonation", + "23657296-5cd5-45b0-a809-d972a7f4dfe1", + "dd0d0df1-06c3-436c-8034-4b9a153097ce" ); const serviceClient = new BlobServiceClient( @@ -330,7 +341,9 @@ describe("Blob OAuth Basic", () => { new Date("2100/01/01"), "https://sts.windows-ppe.net/ab1f708d-50f6-404c-a006-d71b2ac7a606/", "https://storage.azure.com", - "user_impersonation" + "user_impersonation", + "23657296-5cd5-45b0-a809-d972a7f4dfe1", + "dd0d0df1-06c3-436c-8034-4b9a153097ce" ); const serviceClient = new BlobServiceClient( @@ -453,7 +466,9 @@ describe("Blob OAuth Basic", () => { new Date("2100/01/01"), "https://sts.windows-ppe.net/ab1f708d-50f6-404c-a006-d71b2ac7a606/", audience, - "user_impersonation" + "user_impersonation", + "23657296-5cd5-45b0-a809-d972a7f4dfe1", + "dd0d0df1-06c3-436c-8034-4b9a153097ce" ); const serviceClient = new BlobServiceClient( @@ -480,7 +495,9 @@ describe("Blob OAuth Basic", () => { new Date("2100/01/01"), "https://sts.windows-ppe.net/ab1f708d-50f6-404c-a006-d71b2ac7a606/", "https://invalidaccount.blob.core.windows.net", - "user_impersonation" + "user_impersonation", + "23657296-5cd5-45b0-a809-d972a7f4dfe1", + "dd0d0df1-06c3-436c-8034-4b9a153097ce" ); const serviceClient = new BlobServiceClient( @@ -524,7 +541,9 @@ describe("Blob OAuth Basic", () => { new Date("2100/01/01"), `${issuerPrefix}/ab1f708d-50f6-404c-a006-d71b2ac7a606/`, "e406a681-f3d4-42a8-90b6-c2b029497af1", - "user_impersonation" + "user_impersonation", + "23657296-5cd5-45b0-a809-d972a7f4dfe1", + "dd0d0df1-06c3-436c-8034-4b9a153097ce" ); const serviceClient = new BlobServiceClient( @@ -551,7 +570,9 @@ describe("Blob OAuth Basic", () => { new Date("2100/01/01"), "https://invalidissuer/ab1f708d-50f6-404c-a006-d71b2ac7a606/", "https://invalidaccount.blob.core.windows.net", - "user_impersonation" + "user_impersonation", + "23657296-5cd5-45b0-a809-d972a7f4dfe1", + "dd0d0df1-06c3-436c-8034-4b9a153097ce" ); const serviceClient = new BlobServiceClient( @@ -587,7 +608,9 @@ describe("Blob OAuth Basic", () => { new Date("2100/01/01"), "https://sts.windows-ppe.net/ab1f708d-50f6-404c-a006-d71b2ac7a606/", "https://devstoreaccount1.blob.core.windows.net", - "user_impersonation" + "user_impersonation", + "23657296-5cd5-45b0-a809-d972a7f4dfe1", + "dd0d0df1-06c3-436c-8034-4b9a153097ce" ); const serviceClient = new BlobServiceClient( @@ -623,7 +646,9 @@ describe("Blob OAuth Basic", () => { new Date("2019/01/01"), "https://sts.windows-ppe.net/ab1f708d-50f6-404c-a006-d71b2ac7a606/", "https://devstoreaccount1.blob.core.windows.net", - "user_impersonation" + "user_impersonation", + "23657296-5cd5-45b0-a809-d972a7f4dfe1", + "dd0d0df1-06c3-436c-8034-4b9a153097ce" ); const serviceClient = new BlobServiceClient( @@ -659,7 +684,9 @@ describe("Blob OAuth Basic", () => { new Date("2100/01/01"), "https://sts.windows-ppe.net/ab1f708d-50f6-404c-a006-d71b2ac7a606/", "https://devstoreaccount1.blob.core.windows.net", - "user_impersonation" + "user_impersonation", + "23657296-5cd5-45b0-a809-d972a7f4dfe1", + "dd0d0df1-06c3-436c-8034-4b9a153097ce" ); const serviceClient = new BlobServiceClient( @@ -696,7 +723,9 @@ describe("Blob OAuth Basic", () => { new Date("2100/01/01"), "https://sts.windows-ppe.net/ab1f708d-50f6-404c-a006-d71b2ac7a606/", "https://devstoreaccount1.blob.core.windows.net", - "user_impersonation" + "user_impersonation", + "23657296-5cd5-45b0-a809-d972a7f4dfe1", + "dd0d0df1-06c3-436c-8034-4b9a153097ce" ); const serviceClient = new BlobServiceClient( @@ -741,7 +770,9 @@ describe("Blob OAuth Basic", () => { new Date("2019/01/01"), "https://sts.windows-ppe.net/ab1f708d-50f6-404c-a006-d71b2ac7a606/", "https://devstoreaccount1.blob.core.windows.net", - "user_impersonation" + "user_impersonation", + "23657296-5cd5-45b0-a809-d972a7f4dfe1", + "dd0d0df1-06c3-436c-8034-4b9a153097ce" ); const serviceClient = new BlobServiceClient( diff --git a/tests/queue/oauth.test.ts b/tests/queue/oauth.test.ts index b47d46b86..fac9495f5 100644 --- a/tests/queue/oauth.test.ts +++ b/tests/queue/oauth.test.ts @@ -67,7 +67,9 @@ describe("Queue OAuth Basic", () => { new Date("2100/01/01"), "https://sts.windows-ppe.net/ab1f708d-50f6-404c-a006-d71b2ac7a606/", "https://storage.azure.com", - "user_impersonation" + "user_impersonation", + "23657296-5cd5-45b0-a809-d972a7f4dfe1", + "dd0d0df1-06c3-436c-8034-4b9a153097ce" ); const serviceClient = new QueueServiceClient( @@ -130,7 +132,9 @@ describe("Queue OAuth Basic", () => { new Date("2100/01/01"), "https://sts.windows-ppe.net/ab1f708d-50f6-404c-a006-d71b2ac7a606/", audience, - "user_impersonation" + "user_impersonation", + "23657296-5cd5-45b0-a809-d972a7f4dfe1", + "dd0d0df1-06c3-436c-8034-4b9a153097ce" ); const serviceClient = new QueueServiceClient( @@ -155,7 +159,9 @@ describe("Queue OAuth Basic", () => { new Date("2100/01/01"), "https://sts.windows-ppe.net/ab1f708d-50f6-404c-a006-d71b2ac7a606/", "https://invalidaccount.queue.core.windows.net", - "user_impersonation" + "user_impersonation", + "23657296-5cd5-45b0-a809-d972a7f4dfe1", + "dd0d0df1-06c3-436c-8034-4b9a153097ce" ); const serviceClient = new QueueServiceClient( @@ -197,7 +203,9 @@ describe("Queue OAuth Basic", () => { new Date("2100/01/01"), `${issuerPrefix}/ab1f708d-50f6-404c-a006-d71b2ac7a606/`, "e406a681-f3d4-42a8-90b6-c2b029497af1", - "user_impersonation" + "user_impersonation", + "23657296-5cd5-45b0-a809-d972a7f4dfe1", + "dd0d0df1-06c3-436c-8034-4b9a153097ce" ); const serviceClient = new QueueServiceClient( @@ -222,7 +230,9 @@ describe("Queue OAuth Basic", () => { new Date("2100/01/01"), "https://invalidissuer/ab1f708d-50f6-404c-a006-d71b2ac7a606/", "https://invalidaccount.queue.core.windows.net", - "user_impersonation" + "user_impersonation", + "23657296-5cd5-45b0-a809-d972a7f4dfe1", + "dd0d0df1-06c3-436c-8034-4b9a153097ce" ); const serviceClient = new QueueServiceClient( @@ -256,7 +266,9 @@ describe("Queue OAuth Basic", () => { new Date("2100/01/01"), "https://sts.windows-ppe.net/ab1f708d-50f6-404c-a006-d71b2ac7a606/", "https://devstoreaccount1.queue.core.windows.net", - "user_impersonation" + "user_impersonation", + "23657296-5cd5-45b0-a809-d972a7f4dfe1", + "dd0d0df1-06c3-436c-8034-4b9a153097ce" ); const serviceClient = new QueueServiceClient( @@ -290,7 +302,9 @@ describe("Queue OAuth Basic", () => { new Date("2019/01/01"), "https://sts.windows-ppe.net/ab1f708d-50f6-404c-a006-d71b2ac7a606/", "https://devstoreaccount1.queue.core.windows.net", - "user_impersonation" + "user_impersonation", + "23657296-5cd5-45b0-a809-d972a7f4dfe1", + "dd0d0df1-06c3-436c-8034-4b9a153097ce" ); const serviceClient = new QueueServiceClient( @@ -324,7 +338,9 @@ describe("Queue OAuth Basic", () => { new Date("2100/01/01"), "https://sts.windows-ppe.net/ab1f708d-50f6-404c-a006-d71b2ac7a606/", "https://devstoreaccount1.queue.core.windows.net", - "user_impersonation" + "user_impersonation", + "23657296-5cd5-45b0-a809-d972a7f4dfe1", + "dd0d0df1-06c3-436c-8034-4b9a153097ce" ); const serviceClient = new QueueServiceClient( @@ -359,7 +375,9 @@ describe("Queue OAuth Basic", () => { new Date("2100/01/01"), "https://sts.windows-ppe.net/ab1f708d-50f6-404c-a006-d71b2ac7a606/", "https://devstoreaccount1.queue.core.windows.net", - "user_impersonation" + "user_impersonation", + "23657296-5cd5-45b0-a809-d972a7f4dfe1", + "dd0d0df1-06c3-436c-8034-4b9a153097ce" ); const serviceClient = new QueueServiceClient( @@ -420,7 +438,9 @@ describe("Queue OAuth Basic", () => { new Date("2019/01/01"), "https://sts.windows-ppe.net/ab1f708d-50f6-404c-a006-d71b2ac7a606/", "https://devstoreaccount1.queue.core.windows.net", - "user_impersonation" + "user_impersonation", + "23657296-5cd5-45b0-a809-d972a7f4dfe1", + "dd0d0df1-06c3-436c-8034-4b9a153097ce" ); const serviceClient = new QueueServiceClient( diff --git a/tests/table/auth/oauth.test.ts b/tests/table/auth/oauth.test.ts index 055c9b0ec..9c3ab73a7 100644 --- a/tests/table/auth/oauth.test.ts +++ b/tests/table/auth/oauth.test.ts @@ -31,7 +31,9 @@ describe("Table OAuth Basic", () => { new Date("2100/01/01"), "https://sts.windows-ppe.net/ab1f708d-50f6-404c-a006-d71b2ac7a606/", "https://storage.azure.com", - "user_impersonation" + "user_impersonation", + "23657296-5cd5-45b0-a809-d972a7f4dfe1", + "dd0d0df1-06c3-436c-8034-4b9a153097ce" ); const tableName: string = getUniqueName("tablewithdash"); @@ -94,7 +96,9 @@ describe("Table OAuth Basic", () => { new Date("2100/01/01"), "https://sts.windows-ppe.net/ab1f708d-50f6-404c-a006-d71b2ac7a606/", audience, - "user_impersonation" + "user_impersonation", + "23657296-5cd5-45b0-a809-d972a7f4dfe1", + "dd0d0df1-06c3-436c-8034-4b9a153097ce" ); const tableName: string = getUniqueName("ltablewithdash"); @@ -119,7 +123,9 @@ describe("Table OAuth Basic", () => { new Date("2100/01/01"), "https://sts.windows-ppe.net/ab1f708d-50f6-404c-a006-d71b2ac7a606/", "https://invalidaccount.table.core.windows.net", - "user_impersonation" + "user_impersonation", + "23657296-5cd5-45b0-a809-d972a7f4dfe1", + "dd0d0df1-06c3-436c-8034-4b9a153097ce" ); const tableName: string = getUniqueName("tablewithdash"); @@ -161,7 +167,9 @@ describe("Table OAuth Basic", () => { new Date("2100/01/01"), `${issuerPrefix}/ab1f708d-50f6-404c-a006-d71b2ac7a606/`, "e406a681-f3d4-42a8-90b6-c2b029497af1", - "user_impersonation" + "user_impersonation", + "23657296-5cd5-45b0-a809-d972a7f4dfe1", + "dd0d0df1-06c3-436c-8034-4b9a153097ce" ); const tableName: string = getUniqueName("tablewithdash"); @@ -186,7 +194,9 @@ describe("Table OAuth Basic", () => { new Date("2100/01/01"), "https://invalidissuer/ab1f708d-50f6-404c-a006-d71b2ac7a606/", "https://invalidaccount.table.core.windows.net", - "user_impersonation" + "user_impersonation", + "23657296-5cd5-45b0-a809-d972a7f4dfe1", + "dd0d0df1-06c3-436c-8034-4b9a153097ce" ); const tableName: string = getUniqueName("tablewithdash"); @@ -220,7 +230,9 @@ describe("Table OAuth Basic", () => { new Date("2100/01/01"), "https://sts.windows-ppe.net/ab1f708d-50f6-404c-a006-d71b2ac7a606/", "https://devstoreaccount1.table.core.windows.net", - "user_impersonation" + "user_impersonation", + "23657296-5cd5-45b0-a809-d972a7f4dfe1", + "dd0d0df1-06c3-436c-8034-4b9a153097ce" ); const tableName: string = getUniqueName("tablewithdash"); @@ -254,7 +266,9 @@ describe("Table OAuth Basic", () => { new Date("2019/01/01"), "https://sts.windows-ppe.net/ab1f708d-50f6-404c-a006-d71b2ac7a606/", "https://devstoreaccount1.table.core.windows.net", - "user_impersonation" + "user_impersonation", + "23657296-5cd5-45b0-a809-d972a7f4dfe1", + "dd0d0df1-06c3-436c-8034-4b9a153097ce" ); const tableName: string = getUniqueName("tablewithdash"); @@ -288,7 +302,9 @@ describe("Table OAuth Basic", () => { new Date("2100/01/01"), "https://sts.windows-ppe.net/ab1f708d-50f6-404c-a006-d71b2ac7a606/", "https://devstoreaccount1.table.core.windows.net", - "user_impersonation" + "user_impersonation", + "23657296-5cd5-45b0-a809-d972a7f4dfe1", + "dd0d0df1-06c3-436c-8034-4b9a153097ce" ); const tableName: string = getUniqueName("tablewithdash"); @@ -323,7 +339,9 @@ describe("Table OAuth Basic", () => { new Date("2100/01/01"), "https://sts.windows-ppe.net/ab1f708d-50f6-404c-a006-d71b2ac7a606/", "https://devstoreaccount1.table.core.windows.net", - "user_impersonation" + "user_impersonation", + "23657296-5cd5-45b0-a809-d972a7f4dfe1", + "dd0d0df1-06c3-436c-8034-4b9a153097ce" ); const tableName: string = getUniqueName("tablewithdash"); @@ -378,7 +396,9 @@ describe("Table OAuth Basic", () => { new Date("2019/01/01"), "https://sts.windows-ppe.net/ab1f708d-50f6-404c-a006-d71b2ac7a606/", "https://devstoreaccount1.table.core.windows.net", - "user_impersonation" + "user_impersonation", + "23657296-5cd5-45b0-a809-d972a7f4dfe1", + "dd0d0df1-06c3-436c-8034-4b9a153097ce" ); const tableName: string = getUniqueName("tablewithdash"); diff --git a/tests/testutils.ts b/tests/testutils.ts index dd1e94806..560d7b39a 100644 --- a/tests/testutils.ts +++ b/tests/testutils.ts @@ -182,7 +182,9 @@ export function generateJWTToken( exp: Date, iss: string, aud: string, - scp: string + scp: string, + oid: string, + tid: string, ) { const privateKey = readFileSync("./tests/server.key"); const token = sign( @@ -192,7 +194,9 @@ export function generateJWTToken( exp: Math.floor(exp.getTime() / 1000), iss, aud, - scp + scp, + oid, + tid }, privateKey, { algorithm: "RS256" } From b8a38c4dc1d713bd927d3d3b5414cbb7d4266e88 Mon Sep 17 00:00:00 2001 From: Emma Zhu Date: Mon, 19 Dec 2022 10:22:44 +0800 Subject: [PATCH 015/297] Fix a table test case failure --- tests/table/utils/table.entity.tests.rest.submitter.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/tests/table/utils/table.entity.tests.rest.submitter.ts b/tests/table/utils/table.entity.tests.rest.submitter.ts index 40a3f9ffd..63e4d6bce 100644 --- a/tests/table/utils/table.entity.tests.rest.submitter.ts +++ b/tests/table/utils/table.entity.tests.rest.submitter.ts @@ -85,9 +85,13 @@ function generateSas(): string { delete: true }; + const expiriesOn = new Date(); + expiriesOn.setDate(expiriesOn.getDate() + 1); + // Generate an account SAS with the NamedKeyCredential and the permissions set previously const accountSas = generateAccountSas(cred, { - permissions + permissions, + expiresOn: expiriesOn }); return new AzureSASCredential(accountSas).signature; From dba174d84c0e20fc84d5b4d03a0ad611a8614841 Mon Sep 17 00:00:00 2001 From: Wei Wei Date: Fri, 6 Jan 2023 02:33:06 +0000 Subject: [PATCH 016/297] Update Notice file for dependency change of PR 1764 (#1782) --- NOTICE.txt | 8071 +++++++++++++++++++--------------------------------- 1 file changed, 2976 insertions(+), 5095 deletions(-) diff --git a/NOTICE.txt b/NOTICE.txt index eb4b0364e..57c9c0532 100644 --- a/NOTICE.txt +++ b/NOTICE.txt @@ -17,54 +17,10 @@ required to debug changes to any libraries licensed under the GNU Lesser General --------------------------------------------------------- -tslib 2.0.0 - 0BSD -https://www.typescriptlang.org/ - -Copyright (c) Microsoft Corporation. - -Copyright (c) Microsoft Corporation. - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH -REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY -AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, -INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM -LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR -OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR -PERFORMANCE OF THIS SOFTWARE. - ---------------------------------------------------------- - ---------------------------------------------------------- - tslib 1.14.1 - 0BSD https://www.typescriptlang.org/ -Copyright (c) Microsoft Corporation. - -Copyright (c) Microsoft Corporation. - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH -REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY -AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, -INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM -LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR -OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR -PERFORMANCE OF THIS SOFTWARE. - ---------------------------------------------------------- - ---------------------------------------------------------- - -tslib 2.2.0 - 0BSD -https://www.typescriptlang.org/ - -Copyright (c) Microsoft Corporation. +Copyright (c) Microsoft Corporation Copyright (c) Microsoft Corporation. @@ -83,10 +39,10 @@ PERFORMANCE OF THIS SOFTWARE. --------------------------------------------------------- -tslib 2.3.0 - 0BSD +tslib 2.4.0 - 0BSD https://www.typescriptlang.org/ -Copyright (c) Microsoft Corporation. +Copyright (c) Microsoft Corporation Copyright (c) Microsoft Corporation. @@ -105,9 +61,8 @@ PERFORMANCE OF THIS SOFTWARE. --------------------------------------------------------- -@malept/cross-spawn-promise 1.1.1 - Apache-2.0 -https://github.com/malept/cross-spawn-promise#readme - +@opentelemetry/api 1.0.4 - Apache-2.0 +https://github.com/open-telemetry/opentelemetry-js-api#readme Apache License @@ -317,11 +272,10 @@ https://github.com/malept/cross-spawn-promise#readme --------------------------------------------------------- -@opencensus/web-types 0.0.7 - Apache-2.0 -https://github.com/census-instrumentation/opencensus-web#readme - -Copyright 2019, OpenCensus +denque 2.0.1 - Apache-2.0 +https://docs.page/invertase/denque +Copyright 2018-present Invertase Limited Apache License Version 2.0, January 2004 @@ -511,7 +465,7 @@ Copyright 2019, OpenCensus same "printed page" as the copyright notice for easier identification within third-party archives. - Copyright [yyyy] [name of copyright owner] + Copyright 2018-present Invertase Limited Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -530,11 +484,12 @@ Copyright 2019, OpenCensus --------------------------------------------------------- -@opentelemetry/api 1.0.1 - Apache-2.0 -https://github.com/open-telemetry/opentelemetry-js-api#readme +ecdsa-sig-formatter 1.0.11 - Apache-2.0 +https://github.com/Brightspace/node-ecdsa-sig-formatter#readme +Copyright 2015 D2L Corporation - Apache License +Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ @@ -714,7 +669,7 @@ https://github.com/open-telemetry/opentelemetry-js-api#readme APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" + boilerplate notice, with the fields enclosed by brackets "{}" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a @@ -722,7 +677,7 @@ https://github.com/open-telemetry/opentelemetry-js-api#readme same "printed page" as the copyright notice for easier identification within third-party archives. - Copyright [yyyy] [name of copyright owner] + Copyright 2015 D2L Corporation Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -741,14 +696,14 @@ https://github.com/open-telemetry/opentelemetry-js-api#readme --------------------------------------------------------- -@opentelemetry/api 0.6.1 - Apache-2.0 -https://github.com/open-telemetry/opentelemetry-js#readme +jsbi 4.3.0 - Apache-2.0 +https://github.com/GoogleChromeLabs/jsbi#readme -Copyright 2019, OpenTelemetry +Copyright 2018 Google Inc. Apache License Version 2.0, January 2004 - http://www.apache.org/licenses/ + https://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION @@ -923,38 +878,14 @@ Copyright 2019, OpenTelemetry END OF TERMS AND CONDITIONS - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --------------------------------------------------------- --------------------------------------------------------- -@opentelemetry/api 1.0.0-rc.0 - Apache-2.0 -https://github.com/open-telemetry/opentelemetry-js-api#readme +long 4.0.0 - Apache-2.0 +https://github.com/dcodeIO/long.js#readme + Apache License @@ -1164,1601 +1095,61 @@ https://github.com/open-telemetry/opentelemetry-js-api#readme --------------------------------------------------------- -@opentelemetry/context-base 0.6.1 - Apache-2.0 -https://github.com/open-telemetry/opentelemetry-js#readme - -Copyright 2019, OpenTelemetry - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION +glob-to-regexp 0.4.1 - BSD-2-Clause +https://github.com/fitzgen/glob-to-regexp#readme - 1. Definitions. +Copyright (c) 2013, Nick Fitzgerald - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. +Copyright (c) . All rights reserved. - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. + 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. + 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. +--------------------------------------------------------- - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). +--------------------------------------------------------- - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. +webidl-conversions 3.0.1 - BSD-2-Clause +https://github.com/jsdom/webidl-conversions#readme - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." +Copyright (c) 2014, Domenic Denicola - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. +# The BSD 2-Clause License - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. +Copyright (c) 2014, Domenic Denicola +All rights reserved. - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: +1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and +2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. +--------------------------------------------------------- - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. +--------------------------------------------------------- - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. +@js-joda/core 5.2.0 - BSD-3-Clause +https://js-joda.github.io/js-joda - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. +copyright (c) 2016, Philipp Thurwachter, Pattrick Huper +Copyright (c) 2016, Philipp Thurwachter & Pattrick Huper +copyright (c) 2016, Philipp Thurwachter & Pattrick Huper +copyright (c) 2007-present, Stephen Colebourne & Michael Nascimento Santos +copyright (c) 2015-present, Philipp Thurwachter, Pattrick Huper & js-joda contributors +copyright (c) 2016-present, Philipp Thurwachter & Pattrick Huper & js-joda contributors - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. +BSD License - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - - ---------------------------------------------------------- - ---------------------------------------------------------- - -adal-node 0.2.2 - Apache-2.0 -https://github.com/AzureAD/azure-activedirectory-library-for-nodejs#readme - -Copyright (c) Microsoft Open Technologies, Inc. - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - - ---------------------------------------------------------- - ---------------------------------------------------------- - -cross-spawn-windows-exe 1.2.0 - Apache-2.0 -https://github.com/malept/cross-spawn-windows-exe#readme - - - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - - ---------------------------------------------------------- - ---------------------------------------------------------- - -denque 1.5.0 - Apache-2.0 -https://github.com/invertase/denque#readme - -Copyright (c) 2018 Mike Diarmid - -Copyright (c) 2018 Mike Diarmid (Salakar) - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this library except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - - ---------------------------------------------------------- - ---------------------------------------------------------- - -detect-libc 1.0.3 - Apache-2.0 -https://github.com/lovell/detect-libc#readme - -Copyright 2017 Lovell Fuller - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "{}" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright {yyyy} {name of copyright owner} - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - - ---------------------------------------------------------- - ---------------------------------------------------------- - -ecdsa-sig-formatter 1.0.11 - Apache-2.0 -https://github.com/Brightspace/node-ecdsa-sig-formatter#readme - -Copyright 2015 D2L Corporation - -Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "{}" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright 2015 D2L Corporation - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - - ---------------------------------------------------------- - ---------------------------------------------------------- - -jsbi 3.1.5 - Apache-2.0 -https://github.com/GoogleChromeLabs/jsbi#readme - - - Apache License - Version 2.0, January 2004 - https://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - ---------------------------------------------------------- - ---------------------------------------------------------- - -long 4.0.0 - Apache-2.0 -https://github.com/dcodeIO/long.js#readme - - - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - - ---------------------------------------------------------- - ---------------------------------------------------------- - -tunnel-agent 0.6.0 - Apache-2.0 -https://github.com/mikeal/tunnel-agent#readme - - -Apache License - -Version 2.0, January 2004 - -http://www.apache.org/licenses/ - -TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - -1. Definitions. - -"License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. - -"Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. - -"Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. - -"You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. - -"Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. - -"Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. - -"Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). - -"Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. - -"Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." - -"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. - -2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. - -3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. - -4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: - -You must give any other recipients of the Work or Derivative Works a copy of this License; and - -You must cause any modified files to carry prominent notices stating that You changed the files; and - -You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and - -If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. - -5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. - -6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. - -7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. - -8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. - -9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. - -END OF TERMS AND CONDITIONS - ---------------------------------------------------------- - ---------------------------------------------------------- - -rc 1.2.8 - BSD-2-Clause OR (MIT OR Apache-2.0) -https://github.com/dominictarr/rc#readme - -Copyright (c) 2011 Dominic Tarr -Copyright (c) 2013, Dominic Tarr - -The MIT License - -Copyright (c) 2011 Dominic Tarr - -Permission is hereby granted, free of charge, -to any person obtaining a copy of this software and -associated documentation files (the "Software"), to -deal in the Software without restriction, including -without limitation the rights to use, copy, modify, -merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom -the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice -shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES -OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - ---------------------------------------------------------- - ---------------------------------------------------------- - -@js-joda/core 3.2.0 - BSD-3-Clause -https://js-joda.github.io/js-joda - -copyright (c) 2016, Philipp Thurwachter, Pattrick Huper -Copyright (c) 2016, Philipp Thurwachter & Pattrick Huper -copyright (c) 2016, Philipp Thurwachter & Pattrick Huper -copyright (c) 2007-present, Stephen Colebourne & Michael Nascimento Santos -copyright (c) 2015-present, Philipp Thurwachter, Pattrick Huper & js-joda contributors -copyright (c) 2016-present, Philipp Thurwachter & Pattrick Huper & js-joda contributors - -BSD License - -For js-joda software +For js-joda software Copyright (c) 2016, Philipp Thürwächter & Pattrick Hüper @@ -2843,39 +1234,40 @@ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND --------------------------------------------------------- -qs 6.7.0 - BSD-3-Clause +qs 6.10.3 - BSD-3-Clause https://github.com/ljharb/qs -Copyright (c) 2014 Nathan LaFreniere and other contributors. +Copyright (c) 2014, Nathan LaFreniere and other contributors (https://github.com/ljharb/qs/graphs/contributors) -Copyright (c) 2014 Nathan LaFreniere and other contributors. +BSD 3-Clause License + +Copyright (c) 2014, Nathan LaFreniere and other [contributors](https://github.com/ljharb/qs/graphs/contributors) All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * The names of any contributors may not be used to endorse or promote - products derived from this software without specific prior written - permission. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS AND CONTRIBUTORS BE LIABLE FOR ANY -DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. - * * * +3. Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. -The complete list of contributors can be found at: https://github.com/hapijs/qs/graphs/contributors +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. --------------------------------------------------------- @@ -2917,42 +1309,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. --------------------------------------------------------- -sprintf-js 1.0.3 - BSD-3-Clause -https://github.com/alexei/sprintf.js#readme - -Copyright (c) 2007-2014, Alexandru Marasteanu - -Copyright (c) 2007-2014, Alexandru Marasteanu -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: -* Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. -* Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. -* Neither the name of this software nor the names of its contributors may be - used to endorse or promote products derived from this software without - specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - ---------------------------------------------------------- - ---------------------------------------------------------- - -tough-cookie 4.0.0 - BSD-3-Clause +tough-cookie 2.5.0 - BSD-3-Clause https://github.com/salesforce/tough-cookie Copyright (c) 2015, Salesforce.com, Inc. @@ -2976,7 +1333,7 @@ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND --------------------------------------------------------- -tough-cookie 2.5.0 - BSD-3-Clause +tough-cookie 4.0.0 - BSD-3-Clause https://github.com/salesforce/tough-cookie Copyright (c) 2015, Salesforce.com, Inc. @@ -3000,36 +1357,50 @@ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND --------------------------------------------------------- -tough-cookie 3.0.1 - BSD-3-Clause -https://github.com/salesforce/tough-cookie +sprintf-js 1.0.3 - BSD-3-Clause AND BSD-3-Clause-Clear +https://github.com/alexei/sprintf.js#readme -Copyright (c) 2015, Salesforce.com, Inc. -Copyright (c) 2018, Salesforce.com, Inc. +Copyright (c) 2007-2014, Alexandru Marasteanu -Copyright (c) 2015, Salesforce.com, Inc. +Copyright (c) 2007-2014, Alexandru Marasteanu All rights reserved. -Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - -3. Neither the name of Salesforce.com nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: +* Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. +* Neither the name of this software nor the names of its contributors may be + used to endorse or promote products derived from this software without + specific prior written permission. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. --------------------------------------------------------- --------------------------------------------------------- -aproba 1.2.0 - ISC -https://github.com/iarna/aproba +fs.realpath 1.0.0 - ISC +https://github.com/isaacs/fs.realpath#readme + +Copyright (c) Isaac Z. Schlueter and Contributors +Copyright Joyent, Inc. and other Node contributors -Copyright (c) 2015, Rebecca Turner +The ISC License -Copyright (c) 2015, Rebecca Turner +Copyright (c) Isaac Z. Schlueter and Contributors Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above @@ -3040,33 +1411,44 @@ WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF -OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ---------------------------------------------------------- +---- ---------------------------------------------------------- +This library bundles a version of the `fs.realpath` and `fs.realpathSync` +methods from Node.js v0.10 under the terms of the Node.js MIT license. -are-we-there-yet 1.1.5 - ISC -https://github.com/iarna/are-we-there-yet +Node's license follows, also included at the header of `old.js` which contains +the licensed code: -Copyright (c) 2015, Rebecca Turner + Copyright Joyent, Inc. and other Node contributors. -Copyright (c) 2015, Rebecca Turner + Permission is hereby granted, free of charge, to any person obtaining a + copy of this software and associated documentation files (the "Software"), + to deal in the Software without restriction, including without limitation + the rights to use, copy, modify, merge, publish, distribute, sublicense, + and/or sell copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following conditions: -Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. --------------------------------------------------------- --------------------------------------------------------- -chownr 1.1.4 - ISC -https://github.com/isaacs/chownr#readme +glob 7.1.4 - ISC +https://github.com/isaacs/node-glob#readme Copyright (c) Isaac Z. Schlueter and Contributors @@ -3086,17 +1468,25 @@ WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +## Glob Logo + +Glob's logo created by Tanya Brassie , licensed +under a Creative Commons Attribution-ShareAlike 4.0 International License +https://creativecommons.org/licenses/by-sa/4.0/ + --------------------------------------------------------- --------------------------------------------------------- -console-control-strings 1.1.0 - ISC -https://github.com/iarna/console-control-strings#readme +graceful-fs 4.2.8 - ISC +https://github.com/isaacs/node-graceful-fs#readme -Copyright (c) 2014, Rebecca Turner +Copyright (c) Isaac Z. Schlueter, Ben Noordhuis, and Contributors -Copyright (c) 2014, Rebecca Turner +The ISC License + +Copyright (c) Isaac Z. Schlueter, Ben Noordhuis, and Contributors Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above @@ -3107,23 +1497,22 @@ WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF -OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. --------------------------------------------------------- --------------------------------------------------------- -fs.realpath 1.0.0 - ISC -https://github.com/isaacs/fs.realpath#readme +inflight 1.0.6 - ISC +https://github.com/isaacs/inflight -Copyright (c) Isaac Z. Schlueter and Contributors -Copyright Joyent, Inc. and other Node contributors. +Copyright (c) Isaac Z. Schlueter The ISC License -Copyright (c) Isaac Z. Schlueter and Contributors +Copyright (c) Isaac Z. Schlueter Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above @@ -3137,65 +1526,40 @@ WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ----- - -This library bundles a version of the `fs.realpath` and `fs.realpathSync` -methods from Node.js v0.10 under the terms of the Node.js MIT license. - -Node's license follows, also included at the header of `old.js` which contains -the licensed code: - - Copyright Joyent, Inc. and other Node contributors. - - Permission is hereby granted, free of charge, to any person obtaining a - copy of this software and associated documentation files (the "Software"), - to deal in the Software without restriction, including without limitation - the rights to use, copy, modify, merge, publish, distribute, sublicense, - and/or sell copies of the Software, and to permit persons to whom the - Software is furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in - all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - DEALINGS IN THE SOFTWARE. - --------------------------------------------------------- --------------------------------------------------------- -gauge 2.7.4 - ISC -https://github.com/iarna/gauge +inherits 2.0.4 - ISC +https://github.com/isaacs/inherits#readme + +Copyright (c) Isaac Z. Schlueter -Copyright (c) 2014, Rebecca Turner +The ISC License -Copyright (c) 2014, Rebecca Turner +Copyright (c) Isaac Z. Schlueter Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF -OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM +LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR +OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +PERFORMANCE OF THIS SOFTWARE. + --------------------------------------------------------- --------------------------------------------------------- -glob 7.1.4 - ISC -https://github.com/isaacs/node-glob#readme +lru-cache 4.1.5 - ISC +https://github.com/isaacs/node-lru-cache#readme Copyright (c) Isaac Z. Schlueter and Contributors @@ -3215,50 +1579,19 @@ WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -## Glob Logo - -Glob's logo created by Tanya Brassie , licensed -under a Creative Commons Attribution-ShareAlike 4.0 International License -https://creativecommons.org/licenses/by-sa/4.0/ - - ---------------------------------------------------------- - ---------------------------------------------------------- - -has-unicode 2.0.1 - ISC -https://github.com/iarna/has-unicode - -Copyright (c) 2014, Rebecca Turner - -Copyright (c) 2014, Rebecca Turner - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted, provided that the above -copyright notice and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF -OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - --------------------------------------------------------- --------------------------------------------------------- -inflight 1.0.6 - ISC -https://github.com/isaacs/inflight +lru-cache 6.0.0 - ISC +https://github.com/isaacs/node-lru-cache#readme -Copyright (c) Isaac Z. Schlueter +Copyright (c) Isaac Z. Schlueter and Contributors The ISC License -Copyright (c) Isaac Z. Schlueter +Copyright (c) Isaac Z. Schlueter and Contributors Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above @@ -3277,62 +1610,60 @@ IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. --------------------------------------------------------- -inherits 2.0.3 - ISC -https://github.com/isaacs/inherits#readme +minimatch 3.0.4 - ISC +https://github.com/isaacs/minimatch#readme -Copyright (c) Isaac Z. Schlueter +Copyright (c) Isaac Z. Schlueter and Contributors The ISC License -Copyright (c) Isaac Z. Schlueter +Copyright (c) Isaac Z. Schlueter and Contributors Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH -REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND -FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, -INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM -LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR -OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR -PERFORMANCE OF THIS SOFTWARE. - +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. --------------------------------------------------------- --------------------------------------------------------- -inherits 2.0.4 - ISC -https://github.com/isaacs/inherits#readme +once 1.4.0 - ISC +https://github.com/isaacs/once#readme -Copyright (c) Isaac Z. Schlueter +Copyright (c) Isaac Z. Schlueter and Contributors The ISC License -Copyright (c) Isaac Z. Schlueter +Copyright (c) Isaac Z. Schlueter and Contributors Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH -REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND -FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, -INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM -LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR -OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR -PERFORMANCE OF THIS SOFTWARE. - +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. --------------------------------------------------------- --------------------------------------------------------- -ini 1.3.8 - ISC -https://github.com/isaacs/ini#readme +pseudomap 1.0.2 - ISC +https://github.com/isaacs/pseudomap#readme Copyright (c) Isaac Z. Schlueter and Contributors @@ -3357,8 +1688,8 @@ IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. --------------------------------------------------------- -isexe 2.0.0 - ISC -https://github.com/isaacs/isexe#readme +rimraf 3.0.2 - ISC +https://github.com/isaacs/rimraf#readme Copyright (c) Isaac Z. Schlueter and Contributors @@ -3383,10 +1714,11 @@ IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. --------------------------------------------------------- -lru-cache 4.1.5 - ISC -https://github.com/isaacs/node-lru-cache#readme +sax 1.2.4 - ISC +https://github.com/isaacs/sax-js#readme Copyright (c) Isaac Z. Schlueter and Contributors +Copyright Mathias Bynens The ISC License @@ -3404,14 +1736,42 @@ WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +==== + +`String.fromCodePoint` by Mathias Bynens used according to terms of MIT +License, as follows: + + Copyright Mathias Bynens + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + "Software"), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + --------------------------------------------------------- --------------------------------------------------------- -lru-cache 6.0.0 - ISC -https://github.com/isaacs/node-lru-cache#readme +semver 5.7.1 - ISC +https://github.com/npm/node-semver#readme +Copyright Isaac Z. +Copyright Isaac Z. Schlueter Copyright (c) Isaac Z. Schlueter and Contributors The ISC License @@ -3435,9 +1795,10 @@ IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. --------------------------------------------------------- -minimatch 3.0.4 - ISC -https://github.com/isaacs/minimatch#readme +semver 7.3.5 - ISC +https://github.com/npm/node-semver#readme +Copyright Isaac Z. Schlueter Copyright (c) Isaac Z. Schlueter and Contributors The ISC License @@ -3461,14 +1822,12 @@ IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. --------------------------------------------------------- -npmlog 4.1.2 - ISC -https://github.com/npm/npmlog#readme - -Copyright (c) Isaac Z. Schlueter and Contributors +setprototypeof 1.2.0 - ISC +https://github.com/wesleytodd/setprototypeof -The ISC License +Copyright (c) 2015, Wes Todd -Copyright (c) Isaac Z. Schlueter and Contributors +Copyright (c) 2015, Wes Todd Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above @@ -3476,19 +1835,19 @@ copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR -IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY +SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION +OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN +CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. --------------------------------------------------------- --------------------------------------------------------- -once 1.4.0 - ISC -https://github.com/isaacs/once#readme +wrappy 1.0.2 - ISC +https://github.com/npm/wrappy Copyright (c) Isaac Z. Schlueter and Contributors @@ -3513,8 +1872,8 @@ IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. --------------------------------------------------------- -pseudomap 1.0.2 - ISC -https://github.com/isaacs/pseudomap#readme +yallist 2.1.2 - ISC +https://github.com/isaacs/yallist#readme Copyright (c) Isaac Z. Schlueter and Contributors @@ -3539,8 +1898,8 @@ IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. --------------------------------------------------------- -rimraf 3.0.2 - ISC -https://github.com/isaacs/rimraf#readme +yallist 4.0.0 - ISC +https://github.com/isaacs/yallist#readme Copyright (c) Isaac Z. Schlueter and Contributors @@ -3561,385 +1920,600 @@ ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ---------------------------------------------------------- +--------------------------------------------------------- + +--------------------------------------------------------- + +@azure/abort-controller 1.0.1 - MIT +https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/core/abort-controller + +Copyright (c) Microsoft Corporation. + + MIT License + + Copyright (c) Microsoft Corporation. All rights reserved. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE + + +--------------------------------------------------------- + +--------------------------------------------------------- + +@azure/core-asynciterator-polyfill 1.0.0 - MIT +https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/core/core-asynciterator-polyfill + +Copyright (c) Microsoft Corporation. + + MIT License + + Copyright (c) Microsoft Corporation. All rights reserved. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE + + +--------------------------------------------------------- + +--------------------------------------------------------- + +@azure/core-auth 1.4.0 - MIT +https://github.com/Azure/azure-sdk-for-js/blob/main/sdk/core/core-auth/README.md + +Copyright (c) 2020 Microsoft +Copyright (c) Microsoft Corporation + +The MIT License (MIT) + +Copyright (c) 2020 Microsoft + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +--------------------------------------------------------- + +--------------------------------------------------------- + +@azure/core-client 1.5.0 - MIT +https://github.com/Azure/azure-sdk-for-js/blob/main/sdk/core/core-client/ + +Copyright (c) 2020 Microsoft +Copyright (c) Microsoft Corporation +Copyright (c) Microsoft Corporation. const CollectionFormatToDelimiterMap CSV + +The MIT License (MIT) + +Copyright (c) 2020 Microsoft + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +--------------------------------------------------------- + +--------------------------------------------------------- + +@azure/core-http 2.2.4 - MIT +https://github.com/Azure/azure-sdk-for-js/blob/main/sdk/core/core-http/README.md + +Copyright (c) 2020 Microsoft +Copyright (c) Microsoft Corporation +Copyright (c) Microsoft Corporation. const RedactedString REDACTED ---------------------------------------------------------- +The MIT License (MIT) -sax 1.2.4 - ISC -https://github.com/isaacs/sax-js#readme +Copyright (c) 2020 Microsoft -Copyright (c) Isaac Z. Schlueter and Contributors -Copyright Mathias Bynens +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: -The ISC License +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. -Copyright (c) Isaac Z. Schlueter and Contributors +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted, provided that the above -copyright notice and this permission notice appear in all copies. -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR -IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +--------------------------------------------------------- -==== +--------------------------------------------------------- -`String.fromCodePoint` by Mathias Bynens used according to terms of MIT -License, as follows: +@azure/core-lro 2.2.4 - MIT +https://github.com/Azure/azure-sdk-for-js/blob/main/sdk/core/core-lro/README.md - Copyright Mathias Bynens +Copyright (c) 2020 Microsoft +Copyright (c) Microsoft Corporation - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - "Software"), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: +The MIT License (MIT) - The above copyright notice and this permission notice shall be - included in all copies or substantial portions of the Software. +Copyright (c) 2020 Microsoft - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE - LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION - OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION - WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. --------------------------------------------------------- --------------------------------------------------------- -semver 5.7.1 - ISC -https://github.com/npm/node-semver#readme +@azure/core-paging 1.1.1 - MIT +https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/core/core-paging -Copyright Isaac Z. -Copyright Isaac Z. Schlueter -Copyright (c) Isaac Z. Schlueter and Contributors -The ISC License +The MIT License (MIT) -Copyright (c) Isaac Z. Schlueter and Contributors +Copyright (c) 2020 Microsoft -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted, provided that the above -copyright notice and this permission notice appear in all copies. +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR -IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. --------------------------------------------------------- --------------------------------------------------------- -semver 7.3.5 - ISC -https://github.com/npm/node-semver#readme +@azure/core-rest-pipeline 1.9.2 - MIT +https://github.com/Azure/azure-sdk-for-js/blob/main/sdk/core/core-rest-pipeline/ -Copyright Isaac Z. Schlueter -Copyright (c) Isaac Z. Schlueter and Contributors -The ISC License +The MIT License (MIT) -Copyright (c) Isaac Z. Schlueter and Contributors +Copyright (c) 2020 Microsoft -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted, provided that the above -copyright notice and this permission notice appear in all copies. +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR -IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. --------------------------------------------------------- --------------------------------------------------------- -set-blocking 2.0.0 - ISC -https://github.com/yargs/set-blocking#readme +@azure/core-tracing 1.0.0-preview.13 - MIT +https://github.com/Azure/azure-sdk-for-js/blob/main/sdk/core/core-tracing/README.md -Copyright (c) 2016 +Copyright (c) Microsoft Corporation. -Copyright (c) 2016, Contributors +The MIT License (MIT) -Permission to use, copy, modify, and/or distribute this software -for any purpose with or without fee is hereby granted, provided -that the above copyright notice and this permission notice -appear in all copies. +Copyright (c) 2020 Microsoft -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES -OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE -LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES -OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, -WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, -ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. --------------------------------------------------------- --------------------------------------------------------- -setprototypeof 1.1.1 - ISC -https://github.com/wesleytodd/setprototypeof +@azure/core-tracing 1.0.1 - MIT +https://github.com/Azure/azure-sdk-for-js/blob/main/sdk/core/core-tracing/README.md -Copyright (c) 2015, Wes Todd +Copyright (c) 2020 Microsoft +Copyright (c) Microsoft Corporation -Copyright (c) 2015, Wes Todd +The MIT License (MIT) -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted, provided that the above -copyright notice and this permission notice appear in all copies. +Copyright (c) 2020 Microsoft -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY -SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION -OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN -CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. --------------------------------------------------------- --------------------------------------------------------- -signal-exit 3.0.2 - ISC -https://github.com/tapjs/signal-exit +@azure/core-util 1.0.0 - MIT +https://github.com/Azure/azure-sdk-for-js/blob/main/sdk/core/core-util/ + +Copyright (c) 2020 Microsoft +Copyright (c) Microsoft Corporation -Copyright (c) 2015 +The MIT License (MIT) -The ISC License +Copyright (c) 2020 Microsoft -Copyright (c) 2015, Contributors +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: -Permission to use, copy, modify, and/or distribute this software -for any purpose with or without fee is hereby granted, provided -that the above copyright notice and this permission notice -appear in all copies. +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES -OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE -LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES -OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, -WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, -ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. --------------------------------------------------------- --------------------------------------------------------- -which 1.3.1 - ISC -https://github.com/isaacs/node-which#readme +@azure/identity 2.0.4 - MIT +https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/identity/identity/README.md -Copyright (c) Isaac Z. Schlueter and Contributors +Copyright (c) 2020 Microsoft +Copyright (c) Microsoft Corporation -The ISC License +The MIT License (MIT) -Copyright (c) Isaac Z. Schlueter and Contributors +Copyright (c) 2020 Microsoft -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted, provided that the above -copyright notice and this permission notice appear in all copies. +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR -IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. --------------------------------------------------------- --------------------------------------------------------- -which 2.0.2 - ISC -https://github.com/isaacs/node-which#readme +@azure/keyvault-keys 4.4.0 - MIT +https://github.com/Azure/azure-sdk-for-js/blob/main/sdk/keyvault/keyvault-keys/README.md -Copyright (c) Isaac Z. Schlueter and Contributors +Copyright (c) 2020 Microsoft +Copyright (c) Microsoft Corporation -The ISC License +The MIT License (MIT) -Copyright (c) Isaac Z. Schlueter and Contributors +Copyright (c) 2020 Microsoft -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted, provided that the above -copyright notice and this permission notice appear in all copies. +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR -IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. --------------------------------------------------------- --------------------------------------------------------- -wide-align 1.1.3 - ISC -https://github.com/iarna/wide-align#readme +@azure/logger 1.0.0 - MIT +https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/core/logger -Copyright (c) 2015, Rebecca Turner +Copyright (c) Microsoft Corporation. -Copyright (c) 2015, Rebecca Turner + MIT License -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted, provided that the above -copyright notice and this permission notice appear in all copies. + Copyright (c) Microsoft Corporation. All rights reserved. -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF -OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE --------------------------------------------------------- --------------------------------------------------------- -wrappy 1.0.2 - ISC -https://github.com/npm/wrappy +@azure/msal-browser 2.22.1 - MIT +https://github.com/AzureAD/microsoft-authentication-library-for-js#readme -Copyright (c) Isaac Z. Schlueter and Contributors +Copyright (c) Microsoft Corporation -The ISC License +MIT License -Copyright (c) Isaac Z. Schlueter and Contributors +Copyright (c) Microsoft Corporation. All rights reserved. -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted, provided that the above -copyright notice and this permission notice appear in all copies. +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR -IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE --------------------------------------------------------- --------------------------------------------------------- -yallist 2.1.2 - ISC -https://github.com/isaacs/yallist#readme +@azure/msal-common 4.5.1 - MIT +https://github.com/AzureAD/microsoft-authentication-library-for-js#readme -Copyright (c) Isaac Z. Schlueter and Contributors +Copyright (c) Microsoft Corporation. -The ISC License +MIT License -Copyright (c) Isaac Z. Schlueter and Contributors +Copyright (c) Microsoft Corporation. All rights reserved. -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted, provided that the above -copyright notice and this permission notice appear in all copies. +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR -IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE --------------------------------------------------------- --------------------------------------------------------- -yallist 4.0.0 - ISC -https://github.com/isaacs/yallist#readme +@azure/msal-common 6.1.0 - MIT +https://github.com/AzureAD/microsoft-authentication-library-for-js#readme -Copyright (c) Isaac Z. Schlueter and Contributors +Copyright (c) Microsoft Corporation -The ISC License +MIT License -Copyright (c) Isaac Z. Schlueter and Contributors +Copyright (c) Microsoft Corporation. All rights reserved. -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted, provided that the above -copyright notice and this permission notice appear in all copies. +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR -IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE --------------------------------------------------------- --------------------------------------------------------- -@azure/abort-controller 1.0.1 - MIT -https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/core/abort-controller +@azure/msal-node 1.7.0 - MIT +https://github.com/AzureAD/microsoft-authentication-library-for-js#readme -Copyright (c) Microsoft Corporation. +Copyright (c) 2020 Microsoft +Copyright (c) Microsoft Corporation - MIT License +MIT License - Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) 2020 Microsoft - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: - The above copyright notice and this permission notice shall be included in all - copies or substantial portions of the Software. +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - SOFTWARE +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. --------------------------------------------------------- --------------------------------------------------------- -@azure/core-asynciterator-polyfill 1.0.0 - MIT -https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/core/core-asynciterator-polyfill +@azure/ms-rest-js 1.11.2 - MIT +https://github.com/Azure/ms-rest-js Copyright (c) Microsoft Corporation. +Copyright (c) 2010-2016 Robert Kieffer and other contributors MIT License @@ -3968,14 +2542,21 @@ Copyright (c) Microsoft Corporation. --------------------------------------------------------- -@azure/core-auth 1.1.3 - MIT -https://github.com/Azure/azure-sdk-for-js/blob/master/sdk/core/core-auth/README.md +@colors/colors 1.5.0 - MIT +https://github.com/DABH/colors.js -Copyright (c) Microsoft Corporation. +Copyright (c) Marak Squires +Copyright (c) DABH (https://github.com/DABH) +Copyright (c) Sindre Sorhus (sindresorhus.com) -The MIT License (MIT) +MIT License -Copyright (c) 2020 Microsoft +Original Library + - Copyright (c) Marak Squires + +Additional Functionality + - Copyright (c) Sindre Sorhus (sindresorhus.com) + - Copyright (c) DABH (https://github.com/DABH) Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -3984,30 +2565,61 @@ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + + +--------------------------------------------------------- + +--------------------------------------------------------- + +@dabh/diagnostics 2.0.3 - MIT +https://github.com/3rd-Eden/diagnostics + +Copyright (c) 2015 Arnout Kazemier, Martijn Swaagman + +The MIT License (MIT) + +Copyright (c) 2015 Arnout Kazemier, Martijn Swaagman, the Contributors. + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. --------------------------------------------------------- --------------------------------------------------------- -@azure/core-auth 1.3.0 - MIT -https://github.com/Azure/azure-sdk-for-js/blob/master/sdk/core/core-auth/README.md +@tootallnate/once 2.0.0 - MIT +https://github.com/TooTallNate/once#readme -Copyright (c) Microsoft Corporation. +Copyright (c) 2020 Nathan Rajlich -The MIT License (MIT) +MIT License -Copyright (c) 2020 Microsoft +Copyright (c) 2020 Nathan Rajlich Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -4032,308 +2644,204 @@ SOFTWARE. --------------------------------------------------------- -@azure/core-auth 1.3.2 - MIT -https://github.com/Azure/azure-sdk-for-js/blob/main/sdk/core/core-auth/README.md - -Copyright (c) Microsoft Corporation. +@types/debug 4.1.7 - MIT +https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/debug -The MIT License (MIT) +Copyright (c) Microsoft Corporation -Copyright (c) 2020 Microsoft +MIT License -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: +Copyright (c) -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. --------------------------------------------------------- --------------------------------------------------------- -@azure/core-client 1.1.0 - MIT -https://github.com/Azure/azure-sdk-for-js/blob/master/sdk/core/core-client/ +@types/es-aggregate-error 1.0.2 - MIT +https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/es-aggregate-error Copyright (c) Microsoft Corporation. -Copyright (c) Microsoft Corporation. const CollectionFormatToDelimiterMap CSV - -The MIT License (MIT) -Copyright (c) 2020 Microsoft +MIT License -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: +Copyright (c) -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. --------------------------------------------------------- --------------------------------------------------------- -@azure/core-http 1.1.4 - MIT -https://github.com/Azure/azure-sdk-for-js/blob/master/sdk/core/core-http/README.md +@types/ms 0.7.31 - MIT -Copyright (c) Microsoft Corporation. -The MIT License (MIT) +Copyright (c) Microsoft Corporation -Copyright (c) 2020 Microsoft +MIT License -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: +Copyright (c) -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. --------------------------------------------------------- --------------------------------------------------------- -@azure/core-http 1.2.6 - MIT -https://github.com/Azure/azure-sdk-for-js/blob/master/sdk/core/core-http/README.md +@types/node 14.14.24 - MIT -Copyright (c) Microsoft Corporation. -The MIT License (MIT) +Copyright (c) Microsoft Corporation. -Copyright (c) 2020 Microsoft +MIT License -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: +Copyright (c) -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. --------------------------------------------------------- --------------------------------------------------------- -@azure/core-lro 1.0.2 - MIT -https://github.com/Azure/azure-sdk-for-js/blob/master/sdk/core/core-lro +@types/node-fetch 2.5.0 - MIT -Copyright (c) Microsoft Corporation. -Copyright (c) Microsoft and contributors. -The MIT License (MIT) +Copyright (c) Microsoft Corporation. -Copyright (c) 2020 Microsoft +MIT License -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: +Copyright (c) -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. --------------------------------------------------------- --------------------------------------------------------- -@azure/core-paging 1.1.1 - MIT -https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/core/core-paging - +@types/tunnel 0.0.3 - MIT +https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/tunnel -The MIT License (MIT) +Copyright (c) Microsoft Corporation -Copyright (c) 2020 Microsoft +MIT License -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: +Copyright (c) -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. --------------------------------------------------------- --------------------------------------------------------- -@azure/core-rest-pipeline 1.1.1 - MIT -https://github.com/Azure/azure-sdk-for-js/blob/main/sdk/core/core-rest-pipeline/ +accepts 1.3.8 - MIT +https://github.com/jshttp/accepts#readme -Copyright (c) Microsoft Corporation. -Copyright (c) Microsoft Corporation. const RedactedString REDACTED -Copyright (c) Microsoft Corporation. const ValidPhaseNames new Set +Copyright (c) 2014 Jonathan Ong +Copyright (c) 2015 Douglas Christopher Wilson +Copyright (c) 2014 Jonathan Ong +Copyright (c) 2015 Douglas Christopher Wilson -The MIT License (MIT) +(The MIT License) -Copyright (c) 2020 Microsoft +Copyright (c) 2014 Jonathan Ong +Copyright (c) 2015 Douglas Christopher Wilson -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. --------------------------------------------------------- --------------------------------------------------------- -@azure/core-rest-pipeline 1.0.3 - MIT -https://github.com/Azure/azure-sdk-for-js/blob/master/sdk/core/core-rest-pipeline/ - -Copyright (c) Microsoft Corporation. -Copyright (c) Microsoft Corporation. const RedactedString REDACTED -Copyright (c) Microsoft Corporation. const ValidPhaseNames new Set +agent-base 6.0.2 - MIT +https://github.com/TooTallNate/node-agent-base#readme -The MIT License (MIT) +Copyright (c) 2013 Nathan Rajlich -Copyright (c) 2020 Microsoft +MIT License -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: +Copyright (c) -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. --------------------------------------------------------- --------------------------------------------------------- -@azure/core-tracing 1.0.0-preview.8 - MIT -https://github.com/azure/azure-sdk-for-js/tree/master/sdk/core/core-tracing +ansi-styles 3.2.1 - MIT +https://github.com/chalk/ansi-styles#readme -Copyright (c) Microsoft Corporation. +Copyright (c) Sindre Sorhus (sindresorhus.com) -The MIT License (MIT) +MIT License -Copyright (c) 2020 Microsoft +Copyright (c) Sindre Sorhus (sindresorhus.com) -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. --------------------------------------------------------- --------------------------------------------------------- -@azure/core-tracing 1.0.0-preview.11 - MIT -https://github.com/Azure/azure-sdk-for-js/blob/master/sdk/core/core-tracing/README.md +args 5.0.3 - MIT +https://github.com/leo/args#readme -Copyright (c) Microsoft Corporation. -Copyright (c) Microsoft Corporation. V1 OpenTelemetry +Copyright (c) 2022 Leonard Lamprecht The MIT License (MIT) -Copyright (c) 2020 Microsoft +Copyright (c) 2022 Leonard Lamprecht Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -4358,14 +2866,14 @@ SOFTWARE. --------------------------------------------------------- -@azure/core-tracing 1.0.0-preview.12 - MIT -https://github.com/Azure/azure-sdk-for-js/blob/main/sdk/core/core-tracing/README.md +array-flatten 1.1.1 - MIT +https://github.com/blakeembrey/array-flatten -Copyright (c) Microsoft Corporation. +Copyright (c) 2014 Blake Embrey (hello@blakeembrey.com) The MIT License (MIT) -Copyright (c) 2020 Microsoft +Copyright (c) 2014 Blake Embrey (hello@blakeembrey.com) Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -4374,30 +2882,28 @@ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. --------------------------------------------------------- --------------------------------------------------------- -@azure/identity 1.5.0 - MIT -https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/identity/identity/README.md - -Copyright (c) Microsoft Corporation. +async 3.2.3 - MIT +https://caolan.github.io/async/ -The MIT License (MIT) +Copyright (c) 2010-2018 Caolan McMahon -Copyright (c) 2020 Microsoft +Copyright (c) 2010-2018 Caolan McMahon Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -4406,31 +2912,30 @@ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. --------------------------------------------------------- --------------------------------------------------------- -@azure/keyvault-keys 4.2.2 - MIT -https://github.com/Azure/azure-sdk-for-js/blob/master/sdk/keyvault/keyvault-keys/README.md +asynckit 0.4.0 - MIT +https://github.com/alexindigo/asynckit#readme -Copyright (c) Microsoft Corporation. -Copyright (c) Microsoft and contributors. +Copyright (c) 2016 Alex Indigo The MIT License (MIT) -Copyright (c) 2020 Microsoft +Copyright (c) 2016 Alex Indigo Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -4455,46 +2960,11 @@ SOFTWARE. --------------------------------------------------------- -@azure/logger 1.0.0 - MIT -https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/core/logger - -Copyright (c) Microsoft Corporation. - - MIT License - - Copyright (c) Microsoft Corporation. All rights reserved. - - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in all - copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - SOFTWARE - - ---------------------------------------------------------- - ---------------------------------------------------------- - -@azure/msal-common 4.5.0 - MIT -https://github.com/AzureAD/microsoft-authentication-library-for-js#readme - -Copyright (c) Microsoft Corporation. +axios 0.21.4 - MIT +https://axios-http.com/ -MIT License -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) 2014-present Matt Zabriskie Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -4503,31 +2973,29 @@ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. --------------------------------------------------------- --------------------------------------------------------- -@azure/msal-node 1.0.0-beta.6 - MIT -https://github.com/AzureAD/microsoft-authentication-library-for-js#readme - -Copyright (c) Microsoft Corporation. -Copyright (c) 2014-present, Facebook, Inc. +axios 0.27.2 - MIT +https://axios-http.com/ -MIT License +(c) 2022 by Matt Zabriskie +Copyright (c) 2014-present Matt Zabriskie -Copyright (c) 2020 Microsoft +Copyright (c) 2014-present Matt Zabriskie Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -4536,197 +3004,137 @@ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - - ---------------------------------------------------------- - ---------------------------------------------------------- - -@azure/ms-rest-azure-env 2.0.0 - MIT -https://github.com/Azure/ms-rest-azure-env - -Copyright (c) Microsoft Corporation. - - MIT License - - Copyright (c) Microsoft Corporation. All rights reserved. - - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in all - copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - SOFTWARE - - ---------------------------------------------------------- - ---------------------------------------------------------- - -@azure/ms-rest-js 1.11.2 - MIT -https://github.com/Azure/ms-rest-js - -Copyright (c) Microsoft Corporation. -Copyright (c) 2010-2016 Robert Kieffer and other contributors - - MIT License - - Copyright (c) Microsoft Corporation. All rights reserved. - - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in all - copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - SOFTWARE +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. --------------------------------------------------------- --------------------------------------------------------- -@azure/ms-rest-js 2.5.3 - MIT -https://github.com/Azure/ms-rest-js - -copyright 2015 Toru Nagashima. -Copyright (c) Microsoft Corporation. -Copyright (c) 2010-2016 Robert Kieffer and other contributors +balanced-match 1.0.0 - MIT +https://github.com/juliangruber/balanced-match - MIT License +Copyright (c) 2013 Julian Gruber - Copyright (c) Microsoft Corporation. All rights reserved. +(MIT) - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: +Copyright (c) 2013 Julian Gruber <julian@juliangruber.com> - The above copyright notice and this permission notice shall be included in all - copies or substantial portions of the Software. +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - SOFTWARE +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. ---------------------------------------------------------- --------------------------------------------------------- -@azure/ms-rest-nodeauth 3.0.10 - MIT -https://github.com/Azure/ms-rest-nodeauth - - - MIT License - - Copyright (c) Microsoft Corporation. All rights reserved. - - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in all - copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - SOFTWARE - - --------------------------------------------------------- ---------------------------------------------------------- +base64-js 1.5.1 - MIT +https://github.com/beatgammit/base64-js -@tootallnate/once 1.1.2 - MIT -https://github.com/TooTallNate/once#readme +Copyright (c) 2014 Jameson Little +The MIT License (MIT) -MIT License +Copyright (c) 2014 Jameson Little -Copyright (c) +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. --------------------------------------------------------- --------------------------------------------------------- -@types/node 8.10.66 - MIT +basic-auth 2.0.1 - MIT +https://github.com/jshttp/basic-auth#readme +Copyright (c) 2014 Jonathan Ong +Copyright (c) 2013 TJ Holowaychuk +Copyright (c) 2015-2016 Douglas Christopher Wilson +Copyright (c) 2014 Jonathan Ong +Copyright (c) 2015-2016 Douglas Christopher Wilson -Copyright (c) Microsoft Corporation. +(The MIT License) -MIT License +Copyright (c) 2013 TJ Holowaychuk +Copyright (c) 2014 Jonathan Ong +Copyright (c) 2015-2016 Douglas Christopher Wilson -Copyright (c) +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. --------------------------------------------------------- --------------------------------------------------------- -@types/node 14.14.24 - MIT +bl 5.0.0 - MIT +https://github.com/rvagg/bl +Copyright (c) 2013-2019 bl contributors -Copyright (c) Microsoft Corporation. +The MIT License (MIT) +===================== -MIT License +Copyright (c) 2013-2019 bl contributors +---------------------------------- -Copyright (c) +*bl contributors listed at * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: @@ -4734,75 +3142,122 @@ The above copyright notice and this permission notice shall be included in all c THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + --------------------------------------------------------- --------------------------------------------------------- -@types/node-fetch 2.5.0 - MIT +body-parser 1.20.0 - MIT +https://github.com/expressjs/body-parser#readme +Copyright (c) 2014 Jonathan Ong +Copyright (c) 2014-2015 Douglas Christopher Wilson +Copyright (c) 2014 Jonathan Ong +Copyright (c) 2014-2015 Douglas Christopher Wilson -Copyright (c) Microsoft Corporation. +(The MIT License) -MIT License +Copyright (c) 2014 Jonathan Ong +Copyright (c) 2014-2015 Douglas Christopher Wilson -Copyright (c) +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. --------------------------------------------------------- --------------------------------------------------------- -@types/stoppable 1.1.1 - MIT -https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/stoppable +brace-expansion 1.1.11 - MIT +https://github.com/juliangruber/brace-expansion +Copyright (c) 2013 Julian Gruber MIT License -Copyright (c) +Copyright (c) 2013 Julian Gruber -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. --------------------------------------------------------- --------------------------------------------------------- -@types/tunnel 0.0.1 - MIT +buffer 5.7.1 - MIT +https://github.com/feross/buffer +Copyright (c) Feross Aboukhadijeh, and other contributors +Copyright (c) Feross Aboukhadijeh (http://feross.org), and other contributors -Copyright (c) Microsoft Corporation. +The MIT License (MIT) -MIT License +Copyright (c) Feross Aboukhadijeh, and other contributors. -Copyright (c) +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. --------------------------------------------------------- --------------------------------------------------------- -abort-controller 3.0.0 - MIT -https://github.com/mysticatea/abort-controller#readme +buffer 6.0.3 - MIT +https://github.com/feross/buffer -copyright 2015 Toru Nagashima. -Copyright (c) 2017 Toru Nagashima +Copyright (c) Feross Aboukhadijeh, and other contributors +Copyright (c) Feross Aboukhadijeh (http://feross.org), and other contributors -MIT License +The MIT License (MIT) -Copyright (c) 2017 Toru Nagashima +Copyright (c) Feross Aboukhadijeh, and other contributors. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -4811,34 +3266,34 @@ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. --------------------------------------------------------- --------------------------------------------------------- -accepts 1.3.7 - MIT -https://github.com/jshttp/accepts#readme +bytes 3.1.2 - MIT +https://github.com/visionmedia/bytes.js#readme -Copyright (c) 2014 Jonathan Ong -Copyright (c) 2015 Douglas Christopher Wilson -Copyright (c) 2014 Jonathan Ong -Copyright (c) 2015 Douglas Christopher Wilson +Copyright (c) 2015 Jed Watson +Copyright (c) 2012-2014 TJ Holowaychuk +Copyright (c) 2015 Jed Watson +Copyright (c) 2012-2014 TJ Holowaychuk (The MIT License) -Copyright (c) 2014 Jonathan Ong -Copyright (c) 2015 Douglas Christopher Wilson +Copyright (c) 2012-2014 TJ Holowaychuk +Copyright (c) 2015 Jed Watson Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the @@ -4864,60 +3319,61 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. --------------------------------------------------------- -agent-base 6.0.2 - MIT -https://github.com/TooTallNate/node-agent-base#readme +call-bind 1.0.2 - MIT +https://github.com/ljharb/call-bind#readme -Copyright (c) 2013 Nathan Rajlich +Copyright (c) 2020 Jordan Harband MIT License -Copyright (c) +Copyright (c) 2020 Jordan Harband -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. --------------------------------------------------------- --------------------------------------------------------- -ansi-regex 2.1.1 - MIT -https://github.com/chalk/ansi-regex#readme +camelcase 5.0.0 - MIT +https://github.com/sindresorhus/camelcase#readme -(c) Sindre Sorhus (http://sindresorhus.com) +(c) Sindre Sorhus (https://sindresorhus.com) Copyright (c) Sindre Sorhus (sindresorhus.com) -The MIT License (MIT) +MIT License Copyright (c) Sindre Sorhus (sindresorhus.com) -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. --------------------------------------------------------- --------------------------------------------------------- -ansi-styles 3.2.1 - MIT -https://github.com/chalk/ansi-styles#readme +chalk 2.4.2 - MIT +https://github.com/chalk/chalk#readme Copyright (c) Sindre Sorhus (sindresorhus.com) @@ -4936,168 +3392,158 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI --------------------------------------------------------- -any-promise 1.3.0 - MIT -http://github.com/kevinbeaty/any-promise +color 3.2.1 - MIT +https://github.com/Qix-/color#readme -Copyright (c) 2014-2016 Kevin Beaty +Copyright (c) 2012 Heather Arthur -Copyright (C) 2014-2016 Kevin Beaty +Copyright (c) 2012 Heather Arthur -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ---------------------------------------------------------- --------------------------------------------------------- -args 5.0.1 - MIT -https://github.com/leo/args#readme +--------------------------------------------------------- -Copyright (c) 2016 Leonard Lamprecht +color-convert 1.9.3 - MIT +https://github.com/Qix-/color-convert#readme -The MIT License (MIT) +Copyright (c) 2011-2016, Heather Arthur and Josh Junon +Copyright (c) 2011-2016 Heather Arthur -Copyright (c) 2016 Leonard Lamprecht +Copyright (c) 2011-2016 Heather Arthur -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. --------------------------------------------------------- --------------------------------------------------------- -array-flatten 1.1.1 - MIT -https://github.com/blakeembrey/array-flatten +color-name 1.1.3 - MIT +https://github.com/dfcreative/color-name -Copyright (c) 2014 Blake Embrey (hello@blakeembrey.com) +Copyright (c) 2015 Dmitry Ivanov The MIT License (MIT) +Copyright (c) 2015 Dmitry Ivanov -Copyright (c) 2014 Blake Embrey (hello@blakeembrey.com) - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. --------------------------------------------------------- --------------------------------------------------------- -async 2.6.3 - MIT -https://caolan.github.io/async/ +colorspace 1.1.4 - MIT +https://github.com/3rd-Eden/colorspace -Copyright (c) 2010-2018 Caolan McMahon +Copyright (c) 2015 Arnout Kazemier, Martijn Swaagman -Copyright (c) 2010-2018 Caolan McMahon +The MIT License (MIT) -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: +Copyright (c) 2015 Arnout Kazemier, Martijn Swaagman, the Contributors. -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. --------------------------------------------------------- --------------------------------------------------------- -asynckit 0.4.0 - MIT -https://github.com/alexindigo/asynckit#readme +color-string 1.9.0 - MIT +https://github.com/Qix-/color-string#readme -Copyright (c) 2016 Alex Indigo +Copyright (c) 2011 Heather Arthur -The MIT License (MIT) +Copyright (c) 2011 Heather Arthur -Copyright (c) 2016 Alex Indigo +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. --------------------------------------------------------- --------------------------------------------------------- -axios 0.21.1 - MIT -https://github.com/axios/axios +combined-stream 1.0.8 - MIT +https://github.com/felixge/node-combined-stream -Copyright (c) 2014-present Matt Zabriskie +Copyright (c) 2011 Debuggable Limited -Copyright (c) 2014-present Matt Zabriskie +Copyright (c) 2011 Debuggable Limited Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -5122,84 +3568,42 @@ THE SOFTWARE. --------------------------------------------------------- -balanced-match 1.0.0 - MIT -https://github.com/juliangruber/balanced-match - -Copyright (c) 2013 Julian Gruber +concat-map 0.0.1 - MIT +https://github.com/substack/node-concat-map -(MIT) -Copyright (c) 2013 Julian Gruber <julian@juliangruber.com> +This software is released under the MIT license: Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - - ---------------------------------------------------------- - ---------------------------------------------------------- - -base64-js 1.5.1 - MIT -https://github.com/beatgammit/base64-js - -Copyright (c) 2014 Jameson Little - -The MIT License (MIT) - -Copyright (c) 2014 Jameson Little - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. --------------------------------------------------------- --------------------------------------------------------- -basic-auth 2.0.1 - MIT -https://github.com/jshttp/basic-auth#readme +content-disposition 0.5.4 - MIT +https://github.com/jshttp/content-disposition#readme -Copyright (c) 2014 Jonathan Ong -Copyright (c) 2013 TJ Holowaychuk -Copyright (c) 2015-2016 Douglas Christopher Wilson -Copyright (c) 2014 Jonathan Ong -Copyright (c) 2015-2016 Douglas Christopher Wilson +Copyright (c) 2014-2017 Douglas Christopher Wilson (The MIT License) -Copyright (c) 2013 TJ Holowaychuk -Copyright (c) 2014 Jonathan Ong -Copyright (c) 2015-2016 Douglas Christopher Wilson +Copyright (c) 2014-2017 Douglas Christopher Wilson Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the @@ -5225,65 +3629,51 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. --------------------------------------------------------- -bl 5.0.0 - MIT -https://github.com/rvagg/bl - - -The MIT License (MIT) -===================== - -Copyright (c) 2013-2019 bl contributors ----------------------------------- - -*bl contributors listed at * - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - ---------------------------------------------------------- - ---------------------------------------------------------- - -bl 4.1.0 - MIT -https://github.com/rvagg/bl - -Copyright (c) 2013-2019 bl contributors +content-type 1.0.4 - MIT +https://github.com/jshttp/content-type#readme -The MIT License (MIT) -===================== +Copyright (c) 2015 Douglas Christopher Wilson -Copyright (c) 2013-2019 bl contributors ----------------------------------- +(The MIT License) -*bl contributors listed at * +Copyright (c) 2015 Douglas Christopher Wilson -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. --------------------------------------------------------- --------------------------------------------------------- -body-parser 1.19.0 - MIT -https://github.com/expressjs/body-parser#readme +cookie 0.5.0 - MIT +https://github.com/jshttp/cookie#readme -Copyright (c) 2014 Jonathan Ong -Copyright (c) 2014-2015 Douglas Christopher Wilson -Copyright (c) 2014 Jonathan Ong -Copyright (c) 2014-2015 Douglas Christopher Wilson +Copyright (c) 2012-2014 Roman Shtylman +Copyright (c) 2015 Douglas Christopher Wilson +Copyright (c) 2012-2014 Roman Shtylman +Copyright (c) 2015 Douglas Christopher Wilson (The MIT License) -Copyright (c) 2014 Jonathan Ong -Copyright (c) 2014-2015 Douglas Christopher Wilson +Copyright (c) 2012-2014 Roman Shtylman +Copyright (c) 2015 Douglas Christopher Wilson Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the @@ -5305,57 +3695,42 @@ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + --------------------------------------------------------- --------------------------------------------------------- -brace-expansion 1.1.11 - MIT -https://github.com/juliangruber/brace-expansion +cookie-signature 1.0.6 - MIT +https://github.com/visionmedia/node-cookie-signature -Copyright (c) 2013 Julian Gruber +Copyright (c) 2012 LearnBoost MIT License -Copyright (c) 2013 Julian Gruber - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: +Copyright (c) -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. --------------------------------------------------------- --------------------------------------------------------- -buffer 5.7.1 - MIT -https://github.com/feross/buffer - -Copyright (c) Feross Aboukhadijeh, and other contributors. -Copyright (c) Feross Aboukhadijeh (http://feross.org), and other contributors. +core-util-is 1.0.2 - MIT +https://github.com/isaacs/core-util-is#readme -The MIT License (MIT) +Copyright Joyent, Inc. and other Node contributors -Copyright (c) Feross Aboukhadijeh, and other contributors. +Copyright Node.js contributors. All rights reserved. Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is +of this software and associated documentation files (the "Software"), to +deal in the Software without restriction, including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in @@ -5365,217 +3740,164 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +IN THE SOFTWARE. --------------------------------------------------------- --------------------------------------------------------- -buffer 6.0.3 - MIT -https://github.com/feross/buffer +debug 2.6.9 - MIT +https://github.com/visionmedia/debug#readme -Copyright (c) Feross Aboukhadijeh, and other contributors. -Copyright (c) Feross Aboukhadijeh (http://feross.org), and other contributors. +Copyright (c) 2014 TJ Holowaychuk +Copyright (c) 2014-2016 TJ Holowaychuk -The MIT License (MIT) +(The MIT License) -Copyright (c) Feross Aboukhadijeh, and other contributors. +Copyright (c) 2014 TJ Holowaychuk -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: +Permission is hereby granted, free of charge, to any person obtaining a copy of this software +and associated documentation files (the 'Software'), to deal in the Software without restriction, +including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. +The above copyright notice and this permission notice shall be included in all copies or substantial +portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT +LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. --------------------------------------------------------- --------------------------------------------------------- -bytes 3.1.0 - MIT -https://github.com/visionmedia/bytes.js#readme +debug 3.1.0 - MIT +https://github.com/visionmedia/debug#readme -Copyright (c) 2015 Jed Watson -Copyright (c) 2012-2014 TJ Holowaychuk -Copyright (c) 2015 Jed Watson -Copyright (c) 2012-2014 TJ Holowaychuk +Copyright (c) 2014 TJ Holowaychuk +Copyright (c) 2014-2017 TJ Holowaychuk (The MIT License) -Copyright (c) 2012-2014 TJ Holowaychuk -Copyright (c) 2015 Jed Watson +Copyright (c) 2014 TJ Holowaychuk -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: +Permission is hereby granted, free of charge, to any person obtaining a copy of this software +and associated documentation files (the 'Software'), to deal in the Software without restriction, +including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. +The above copyright notice and this permission notice shall be included in all copies or substantial +portions of the Software. -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT +LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ---------------------------------------------------------- --------------------------------------------------------- -camelcase 5.0.0 - MIT -https://github.com/sindresorhus/camelcase#readme - -(c) Sindre Sorhus (https://sindresorhus.com) -Copyright (c) Sindre Sorhus (sindresorhus.com) - -MIT License - -Copyright (c) Sindre Sorhus (sindresorhus.com) - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - --------------------------------------------------------- ---------------------------------------------------------- +debug 4.3.1 - MIT +https://github.com/visionmedia/debug#readme -chalk 2.4.2 - MIT -https://github.com/chalk/chalk#readme +Copyright (c) 2014 TJ Holowaychuk +Copyright (c) 2014-2017 TJ Holowaychuk -Copyright (c) Sindre Sorhus (sindresorhus.com) +(The MIT License) -MIT License +Copyright (c) 2014 TJ Holowaychuk -Copyright (c) Sindre Sorhus (sindresorhus.com) +Permission is hereby granted, free of charge, to any person obtaining a copy of this software +and associated documentation files (the 'Software'), to deal in the Software without restriction, +including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +The above copyright notice and this permission notice shall be included in all copies or substantial +portions of the Software. -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT +LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. --------------------------------------------------------- --------------------------------------------------------- -code-point-at 1.1.0 - MIT -https://github.com/sindresorhus/code-point-at#readme +debug 4.3.3 - MIT +https://github.com/debug-js/debug#readme -(c) Sindre Sorhus (https://sindresorhus.com) -Copyright (c) Sindre Sorhus (sindresorhus.com) +Copyright (c) 2014-2017 TJ Holowaychuk -The MIT License (MIT) +(The MIT License) -Copyright (c) Sindre Sorhus (sindresorhus.com) +Copyright (c) 2014-2017 TJ Holowaychuk +Copyright (c) 2018-2021 Josh Junon -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: +Permission is hereby granted, free of charge, to any person obtaining a copy of this software +and associated documentation files (the 'Software'), to deal in the Software without restriction, +including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. +The above copyright notice and this permission notice shall be included in all copies or substantial +portions of the Software. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT +LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ---------------------------------------------------------- --------------------------------------------------------- -color 3.0.0 - MIT -https://github.com/Qix-/color#readme - -Copyright (c) 2012 Heather Arthur - -Copyright (c) 2012 Heather Arthur - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - - --------------------------------------------------------- ---------------------------------------------------------- +debug 4.3.4 - MIT +https://github.com/debug-js/debug#readme -color-convert 1.9.3 - MIT -https://github.com/Qix-/color-convert#readme +Copyright (c) 2018-2021 Josh Junon +Copyright (c) 2014-2017 TJ Holowaychuk -Copyright (c) 2011-2016, Heather Arthur and Josh Junon. -Copyright (c) 2011-2016 Heather Arthur +(The MIT License) -Copyright (c) 2011-2016 Heather Arthur +Copyright (c) 2014-2017 TJ Holowaychuk +Copyright (c) 2018-2021 Josh Junon -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: +Permission is hereby granted, free of charge, to any person obtaining a copy of this software +and associated documentation files (the 'Software'), to deal in the Software without restriction, +including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. +The above copyright notice and this permission notice shall be included in all copies or substantial +portions of the Software. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT +LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. @@ -5583,13 +3905,15 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. --------------------------------------------------------- -color-name 1.1.3 - MIT -https://github.com/dfcreative/color-name +define-lazy-prop 2.0.0 - MIT +https://github.com/sindresorhus/define-lazy-prop#readme -Copyright (c) 2015 Dmitry Ivanov +(c) Sindre Sorhus (https://sindresorhus.com) +Copyright (c) Sindre Sorhus (sindresorhus.com) -The MIT License (MIT) -Copyright (c) 2015 Dmitry Ivanov +MIT License + +Copyright (c) Sindre Sorhus (sindresorhus.com) Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: @@ -5597,18 +3921,19 @@ The above copyright notice and this permission notice shall be included in all c THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + --------------------------------------------------------- --------------------------------------------------------- -colornames 1.1.1 - MIT -https://github.com/timoxley/colornames#readme +define-properties 1.1.4 - MIT +https://github.com/ljharb/define-properties#readme -Copyright (c) 2015 Tim Oxley +Copyright (c) 2015 Jordan Harband The MIT License (MIT) -Copyright (c) 2015 Tim Oxley +Copyright (C) 2015 Jordan Harband Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -5628,24 +3953,16 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - --------------------------------------------------------- --------------------------------------------------------- -colors 1.3.3 - MIT -https://github.com/Marak/colors.js - -Copyright (c) Marak Squires -Copyright (c) Sindre Sorhus (sindresorhus.com) - -MIT License +delayed-stream 1.0.0 - MIT +https://github.com/felixge/node-delayed-stream -Original Library - - Copyright (c) Marak Squires +Copyright (c) 2011 Debuggable Limited -Additional Functionality - - Copyright (c) Sindre Sorhus (sindresorhus.com) +Copyright (c) 2011 Debuggable Limited Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -5670,47 +3987,19 @@ THE SOFTWARE. --------------------------------------------------------- -colorspace 1.1.2 - MIT -https://github.com/3rd-Eden/colorspace - -Copyright (c) 2015 Arnout Kazemier, Martijn Swaagman - -The MIT License (MIT) - -Copyright (c) 2015 Arnout Kazemier, Martijn Swaagman, the Contributors. - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - ---------------------------------------------------------- - ---------------------------------------------------------- +depd 2.0.0 - MIT +https://github.com/dougwilson/nodejs-depd#readme -color-string 1.5.5 - MIT -https://github.com/Qix-/color-string#readme +Copyright (c) 2015 Douglas Christopher Wilson +Copyright (c) 2014-2018 Douglas Christopher Wilson -Copyright (c) 2011 Heather Arthur +(The MIT License) -Copyright (c) 2011 Heather Arthur +Copyright (c) 2014-2018 Douglas Christopher Wilson Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including +'Software'), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to @@ -5719,26 +4008,32 @@ the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. --------------------------------------------------------- --------------------------------------------------------- -combined-stream 1.0.8 - MIT -https://github.com/felixge/node-combined-stream +destroy 1.2.0 - MIT +https://github.com/stream-utils/destroy#readme -Copyright (c) 2011 Debuggable Limited +Copyright (c) 2014 Jonathan Ong +Copyright (c) 2014 Jonathan Ong me@jongleberry.com +Copyright (c) 2015-2022 Douglas Christopher Wilson +Copyright (c) 2015-2022 Douglas Christopher Wilson doug@somethingdoug.com -Copyright (c) 2011 Debuggable Limited + +The MIT License (MIT) + +Copyright (c) 2014 Jonathan Ong me@jongleberry.com +Copyright (c) 2015-2022 Douglas Christopher Wilson doug@somethingdoug.com Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -5763,112 +4058,113 @@ THE SOFTWARE. --------------------------------------------------------- -concat-map 0.0.1 - MIT -https://github.com/substack/node-concat-map +dottie 2.0.2 - MIT +https://github.com/mickhansen/dottie.js#readme +Copyright (c) 2013-2014 Mick Hansen. http://mhansen.io -This software is released under the MIT license: +The MIT License -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: +Copyright (c) 2013-2014 Mick Hansen. http://mhansen.io -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + + --------------------------------------------------------- --------------------------------------------------------- -content-disposition 0.5.3 - MIT -https://github.com/jshttp/content-disposition#readme +ee-first 1.1.1 - MIT +https://github.com/jonathanong/ee-first -Copyright (c) 2014-2017 Douglas Christopher Wilson +Copyright (c) 2014 Jonathan Ong +Copyright (c) 2014 Jonathan Ong me@jongleberry.com -(The MIT License) -Copyright (c) 2014-2017 Douglas Christopher Wilson +The MIT License (MIT) -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: +Copyright (c) 2014 Jonathan Ong me@jongleberry.com -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. --------------------------------------------------------- --------------------------------------------------------- -content-type 1.0.4 - MIT -https://github.com/jshttp/content-type#readme +enabled 2.0.0 - MIT +https://github.com/3rd-Eden/enabled#readme -Copyright (c) 2015 Douglas Christopher Wilson +Copyright (c) 2015 Arnout Kazemier, Martijn Swaagman -(The MIT License) +The MIT License (MIT) -Copyright (c) 2015 Douglas Christopher Wilson +Copyright (c) 2015 Arnout Kazemier, Martijn Swaagman, the Contributors. -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. --------------------------------------------------------- --------------------------------------------------------- -cookie 0.4.0 - MIT -https://github.com/jshttp/cookie#readme +encodeurl 1.0.2 - MIT +https://github.com/pillarjs/encodeurl#readme -Copyright (c) 2012-2014 Roman Shtylman -Copyright (c) 2015 Douglas Christopher Wilson -Copyright (c) 2012-2014 Roman Shtylman -Copyright (c) 2015 Douglas Christopher Wilson +Copyright (c) 2016 Douglas Christopher Wilson (The MIT License) -Copyright (c) 2012-2014 Roman Shtylman -Copyright (c) 2015 Douglas Christopher Wilson +Copyright (c) 2016 Douglas Christopher Wilson Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the @@ -5878,54 +4174,37 @@ distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - - ---------------------------------------------------------- - ---------------------------------------------------------- - -cookie-signature 1.0.6 - MIT -https://github.com/visionmedia/node-cookie-signature - -Copyright (c) 2012 LearnBoost - -MIT License - -Copyright (c) - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. --------------------------------------------------------- --------------------------------------------------------- -core-util-is 1.0.2 - MIT -https://github.com/isaacs/core-util-is#readme +es-abstract 1.19.5 - MIT +https://github.com/ljharb/es-abstract#readme -Copyright Joyent, Inc. and other Node contributors. +(c) Object C +Copyright (c) 2015 Jordan Harband -Copyright Node.js contributors. All rights reserved. +The MIT License (MIT) + +Copyright (C) 2015 Jordan Harband Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to -deal in the Software without restriction, including without limitation the -rights to use, copy, modify, merge, publish, distribute, sublicense, and/or -sell copies of the Software, and to permit persons to whom the Software is +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in @@ -5935,28 +4214,30 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS -IN THE SOFTWARE. +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. --------------------------------------------------------- --------------------------------------------------------- -cross-spawn 5.1.0 - MIT -https://github.com/IndigoUnited/node-cross-spawn#readme +es-aggregate-error 1.0.8 - MIT +https://github.com/es-shims/AggregateError#readme + +Copyright (c) 2019 Jordan Harband -Copyright (c) 2014 IndigoUnited +MIT License -Copyright (c) 2014 IndigoUnited +Copyright (c) 2019 Jordan Harband Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is furnished -to do so, subject to the following conditions: +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. @@ -5966,22 +4247,60 @@ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +--------------------------------------------------------- + +--------------------------------------------------------- + +escape-html 1.0.3 - MIT +https://github.com/component/escape-html + +Copyright (c) 2015 Andreas Lubbe +Copyright (c) 2012-2013 TJ Holowaychuk +Copyright (c) 2015 Tiancheng Timothy Gu + +(The MIT License) + +Copyright (c) 2012-2013 TJ Holowaychuk +Copyright (c) 2015 Andreas Lubbe +Copyright (c) 2015 Tiancheng "Timothy" Gu + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. --------------------------------------------------------- --------------------------------------------------------- -cross-spawn 7.0.3 - MIT -https://github.com/moxystudio/node-cross-spawn +escape-string-regexp 1.0.5 - MIT +https://github.com/sindresorhus/escape-string-regexp -Copyright (c) 2018 Made With MOXY Lda +(c) Sindre Sorhus (http://sindresorhus.com) +Copyright (c) Sindre Sorhus (sindresorhus.com) The MIT License (MIT) -Copyright (c) 2018 Made With MOXY Lda +Copyright (c) Sindre Sorhus (sindresorhus.com) Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -6006,15 +4325,14 @@ THE SOFTWARE. --------------------------------------------------------- -date-utils 1.2.21 - MIT -https://jerrysievert.github.io/date-utils/ +es-to-primitive 1.2.1 - MIT +https://github.com/ljharb/es-to-primitive#readme + +Copyright (c) 2015 Jordan Harband -(c) 2011 by Jerry Sievert -Copyright 2012 Twitter, Inc. -Copyright 2013 Twitter, Inc. -(c) 2005, 2013 jQuery Foundation, Inc. +The MIT License (MIT) -© 2011 by Jerry Sievert +Copyright (c) 2015 Jordan Harband Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -6023,312 +4341,155 @@ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - - - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - END OF TERMS AND CONDITIONS - APPENDIX: How to apply the Apache License to your work. +--------------------------------------------------------- - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. +--------------------------------------------------------- - Copyright [yyyy] [name of copyright owner] +etag 1.8.1 - MIT +https://github.com/jshttp/etag#readme - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at +Copyright (c) 2014-2016 Douglas Christopher Wilson - http://www.apache.org/licenses/LICENSE-2.0 +(The MIT License) - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. +Copyright (c) 2014-2016 Douglas Christopher Wilson +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ---------------------------------------------------------- --------------------------------------------------------- -debug 2.6.9 - MIT -https://github.com/visionmedia/debug#readme +--------------------------------------------------------- -Copyright (c) 2014 TJ Holowaychuk -Copyright (c) 2014-2016 TJ Holowaychuk +events 3.1.0 - MIT +https://github.com/Gozala/events#readme -(The MIT License) +Copyright Joyent, Inc. and other Node contributors. -Copyright (c) 2014 TJ Holowaychuk +MIT -Permission is hereby granted, free of charge, to any person obtaining a copy of this software -and associated documentation files (the 'Software'), to deal in the Software without restriction, -including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, -and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: +Copyright Joyent, Inc. and other Node contributors. -The above copyright notice and this permission notice shall be included in all copies or substantial -portions of the Software. +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to permit +persons to whom the Software is furnished to do so, subject to the +following conditions: -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT -LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +USE OR OTHER DEALINGS IN THE SOFTWARE. --------------------------------------------------------- --------------------------------------------------------- -debug 3.1.0 - MIT -https://github.com/visionmedia/debug#readme +express 4.18.1 - MIT +http://expressjs.com/ -Copyright (c) 2014 TJ Holowaychuk -Copyright (c) 2014-2017 TJ Holowaychuk +Copyright (c) 2013 Roman Shtylman +Copyright (c) 2009-2013 TJ Holowaychuk +Copyright (c) 2014-2015 Douglas Christopher Wilson +Copyright (c) 2009-2014 TJ Holowaychuk +Copyright (c) 2013-2014 Roman Shtylman +Copyright (c) 2014-2015 Douglas Christopher Wilson (The MIT License) -Copyright (c) 2014 TJ Holowaychuk +Copyright (c) 2009-2014 TJ Holowaychuk +Copyright (c) 2013-2014 Roman Shtylman +Copyright (c) 2014-2015 Douglas Christopher Wilson -Permission is hereby granted, free of charge, to any person obtaining a copy of this software -and associated documentation files (the 'Software'), to deal in the Software without restriction, -including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, -and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: -The above copyright notice and this permission notice shall be included in all copies or substantial -portions of the Software. +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT -LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - --------------------------------------------------------- --------------------------------------------------------- -debug 4.3.2 - MIT -https://github.com/visionmedia/debug#readme +fecha 4.2.1 - MIT +https://github.com/taylorhakes/fecha -Copyright (c) 2014 TJ Holowaychuk -Copyright (c) 2014-2017 TJ Holowaychuk +Copyright (c) 2015 Taylor Hakes -(The MIT License) +The MIT License (MIT) -Copyright (c) 2014 TJ Holowaychuk +Copyright (c) 2015 Taylor Hakes -Permission is hereby granted, free of charge, to any person obtaining a copy of this software -and associated documentation files (the 'Software'), to deal in the Software without restriction, -including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, -and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: -The above copyright notice and this permission notice shall be included in all copies or substantial -portions of the Software. +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT -LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. @@ -6336,156 +4497,165 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. --------------------------------------------------------- -debug 4.3.1 - MIT -https://github.com/visionmedia/debug#readme +finalhandler 1.2.0 - MIT +https://github.com/pillarjs/finalhandler#readme -Copyright (c) 2014 TJ Holowaychuk -Copyright (c) 2014-2017 TJ Holowaychuk +Copyright (c) 2014-2022 Douglas Christopher Wilson +Copyright (c) 2014-2022 Douglas Christopher Wilson (The MIT License) -Copyright (c) 2014 TJ Holowaychuk +Copyright (c) 2014-2022 Douglas Christopher Wilson -Permission is hereby granted, free of charge, to any person obtaining a copy of this software -and associated documentation files (the 'Software'), to deal in the Software without restriction, -including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, -and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: -The above copyright notice and this permission notice shall be included in all copies or substantial -portions of the Software. +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT -LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - --------------------------------------------------------- --------------------------------------------------------- -decompress-response 4.2.1 - MIT -https://github.com/sindresorhus/decompress-response#readme +fn.name 1.1.0 - MIT +https://github.com/3rd-Eden/fn.name -Copyright (c) Sindre Sorhus (sindresorhus.com) +Copyright (c) 2015 Arnout Kazemier, Martijn Swaagman -MIT License +The MIT License (MIT) -Copyright (c) Sindre Sorhus (sindresorhus.com) +Copyright (c) 2015 Arnout Kazemier, Martijn Swaagman, the Contributors. -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. ---------------------------------------------------------- --------------------------------------------------------- -deep-extend 0.6.0 - MIT -https://github.com/unclechu/node-deep-extend +--------------------------------------------------------- -Copyright (c) 2013-2018 Viacheslav Lotsmanov -Copyright (c) 2013-2018, Viacheslav Lotsmanov +follow-redirects 1.14.9 - MIT +https://github.com/follow-redirects/follow-redirects -The MIT License (MIT) +Copyright 2014-present Olivier Lalonde , James Talmage , Ruben Verborgh -Copyright (c) 2013-2018, Viacheslav Lotsmanov +Copyright 2014–present Olivier Lalonde , James Talmage , Ruben Verborgh Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR +IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. --------------------------------------------------------- --------------------------------------------------------- -delayed-stream 1.0.0 - MIT -https://github.com/felixge/node-delayed-stream +form-data 2.5.1 - MIT +https://github.com/form-data/form-data#readme -Copyright (c) 2011 Debuggable Limited +Copyright (c) 2012 Felix Geisendorfer (felix@debuggable.com) and contributors -Copyright (c) 2011 Debuggable Limited +Copyright (c) 2012 Felix Geisendörfer (felix@debuggable.com) and contributors -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. --------------------------------------------------------- --------------------------------------------------------- -delegates 1.0.0 - MIT -https://github.com/visionmedia/node-delegates#readme +form-data 4.0.0 - MIT +https://github.com/form-data/form-data#readme -Copyright (c) 2015 TJ Holowaychuk +Copyright (c) 2012 Felix Geisendorfer (felix@debuggable.com) and contributors -Copyright (c) 2015 TJ Holowaychuk +Copyright (c) 2012 Felix Geisendörfer (felix@debuggable.com) and contributors -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. --------------------------------------------------------- --------------------------------------------------------- -depd 1.1.2 - MIT -https://github.com/dougwilson/nodejs-depd#readme +forwarded 0.2.0 - MIT +https://github.com/jshttp/forwarded#readme -Copyright (c) 2014 Douglas Christopher Wilson -Copyright (c) 2015 Douglas Christopher Wilson -Copyright (c) 2014-2015 Douglas Christopher Wilson Copyright (c) 2014-2017 Douglas Christopher Wilson (The MIT License) @@ -6516,15 +4686,18 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. --------------------------------------------------------- -depd 2.0.0 - MIT -https://github.com/dougwilson/nodejs-depd#readme +fresh 0.5.2 - MIT +https://github.com/jshttp/fresh#readme -Copyright (c) 2015 Douglas Christopher Wilson -Copyright (c) 2014-2018 Douglas Christopher Wilson +Copyright (c) 2012 TJ Holowaychuk +Copyright (c) 2016-2017 Douglas Christopher Wilson +Copyright (c) 2012 TJ Holowaychuk +Copyright (c) 2016-2017 Douglas Christopher Wilson (The MIT License) -Copyright (c) 2014-2018 Douglas Christopher Wilson +Copyright (c) 2012 TJ Holowaychuk +Copyright (c) 2016-2017 Douglas Christopher Wilson Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the @@ -6550,16 +4723,41 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. --------------------------------------------------------- -destroy 1.0.4 - MIT -https://github.com/stream-utils/destroy +fs-extra 10.1.0 - MIT +https://github.com/jprichardson/node-fs-extra -Copyright (c) 2014 Jonathan Ong -Copyright (c) 2014 Jonathan Ong me@jongleberry.com +Copyright (c) 2011-2017 JP Richardson +Copyright (c) 2011-2017 JP Richardson (https://github.com/jprichardson) +Copyright (c) Sindre Sorhus (sindresorhus.com) +Copyright (c) 2014-2016 Jonathan Ong me@jongleberry.com and Contributors +(The MIT License) -The MIT License (MIT) +Copyright (c) 2011-2017 JP Richardson -Copyright (c) 2014 Jonathan Ong me@jongleberry.com +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files +(the 'Software'), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, + merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE +WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS +OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +--------------------------------------------------------- + +--------------------------------------------------------- + +function-bind 1.1.1 - MIT +https://github.com/Raynos/function-bind + +Copyright (c) 2013 Raynos + +Copyright (c) 2013 Raynos. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -6580,49 +4778,51 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + --------------------------------------------------------- --------------------------------------------------------- -diagnostics 1.1.1 - MIT -https://github.com/bigpipe/diagnostics +functions-have-names 1.2.3 - MIT +https://github.com/inspect-js/functions-have-names#readme -Copyright (c) 2015 Arnout Kazemier, Martijn Swaagman +Copyright (c) 2019 Jordan Harband -The MIT License (MIT) +MIT License -Copyright (c) 2015 Arnout Kazemier, Martijn Swaagman, the Contributors. +Copyright (c) 2019 Jordan Harband -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. --------------------------------------------------------- --------------------------------------------------------- -dottie 2.0.2 - MIT -https://github.com/mickhansen/dottie.js#readme +generate-function 2.3.1 - MIT +https://github.com/mafintosh/generate-function -Copyright (c) 2013-2014 Mick Hansen. http://mhansen.io +Copyright (c) 2014 Mathias Buus -The MIT License +The MIT License (MIT) -Copyright (c) 2013-2014 Mick Hansen. http://mhansen.io +Copyright (c) 2014 Mathias Buus Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -6642,23 +4842,147 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +--------------------------------------------------------- + +--------------------------------------------------------- + +get-intrinsic 1.1.1 - MIT +https://github.com/ljharb/get-intrinsic#readme + +Copyright (c) 2020 Jordan Harband + +MIT License + +Copyright (c) 2020 Jordan Harband + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +--------------------------------------------------------- + +--------------------------------------------------------- + +get-symbol-description 1.0.0 - MIT +https://github.com/inspect-js/get-symbol-description#readme + +Copyright (c) 2021 Inspect JS + +MIT License + +Copyright (c) 2021 Inspect JS + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +--------------------------------------------------------- + +--------------------------------------------------------- + +globalthis 1.0.2 - MIT +https://github.com/ljharb/System.global#readme + +Copyright (c) 2016 Jordan Harband + +The MIT License (MIT) + +Copyright (c) 2016 Jordan Harband + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +--------------------------------------------------------- + +--------------------------------------------------------- + +has 1.0.3 - MIT +https://github.com/tarruda/has + +Copyright (c) 2013 Thiago de Arruda + +Copyright (c) 2013 Thiago de Arruda + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. --------------------------------------------------------- --------------------------------------------------------- -ee-first 1.1.1 - MIT -https://github.com/jonathanong/ee-first - -Copyright (c) 2014 Jonathan Ong -Copyright (c) 2014 Jonathan Ong me@jongleberry.com +has-bigints 1.0.2 - MIT +https://github.com/ljharb/has-bigints#readme +Copyright (c) 2019 Jordan Harband -The MIT License (MIT) +MIT License -Copyright (c) 2014 Jonathan Ong me@jongleberry.com +Copyright (c) 2019 Jordan Harband Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -6667,94 +4991,83 @@ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. --------------------------------------------------------- --------------------------------------------------------- -enabled 1.0.2 - MIT -https://github.com/bigpipe/enabled#readme +has-flag 3.0.0 - MIT +https://github.com/sindresorhus/has-flag#readme -Copyright (c) 2015 Arnout Kazemier, Martijn Swaagman +(c) Sindre Sorhus (https://sindresorhus.com) +Copyright (c) Sindre Sorhus (sindresorhus.com) -The MIT License (MIT) +MIT License -Copyright (c) 2015 Arnout Kazemier, Martijn Swaagman, the Contributors. +Copyright (c) Sindre Sorhus (sindresorhus.com) -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. --------------------------------------------------------- --------------------------------------------------------- -encodeurl 1.0.2 - MIT -https://github.com/pillarjs/encodeurl#readme +has-property-descriptors 1.0.0 - MIT +https://github.com/inspect-js/has-property-descriptors#readme -Copyright (c) 2016 Douglas Christopher Wilson +Copyright (c) 2022 Inspect JS -(The MIT License) +MIT License -Copyright (c) 2016 Douglas Christopher Wilson +Copyright (c) 2022 Inspect JS -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. --------------------------------------------------------- --------------------------------------------------------- -end-of-stream 1.4.1 - MIT -https://github.com/mafintosh/end-of-stream +has-symbols 1.0.3 - MIT +https://github.com/ljharb/has-symbols#readme -Copyright (c) 2014 Mathias Buus +Copyright (c) 2016 Jordan Harband -The MIT License (MIT) +MIT License -Copyright (c) 2014 Mathias Buus +Copyright (c) 2016 Jordan Harband Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -6763,85 +5076,67 @@ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - ---------------------------------------------------------- - ---------------------------------------------------------- - -env-variable 0.0.5 - MIT -https://github.com/3rd-Eden/env-variable - -Copyright 2014 Arnout Kazemier - -Copyright 2014 Arnout Kazemier - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. --------------------------------------------------------- --------------------------------------------------------- -escape-html 1.0.3 - MIT -https://github.com/component/escape-html +has-tostringtag 1.0.0 - MIT +https://github.com/inspect-js/has-tostringtag#readme -Copyright (c) 2015 Andreas Lubbe -Copyright (c) 2012-2013 TJ Holowaychuk -Copyright (c) 2015 Tiancheng Timothy Gu +Copyright (c) 2021 Inspect JS -(The MIT License) +MIT License -Copyright (c) 2012-2013 TJ Holowaychuk -Copyright (c) 2015 Andreas Lubbe -Copyright (c) 2015 Tiancheng "Timothy" Gu +Copyright (c) 2021 Inspect JS -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. --------------------------------------------------------- --------------------------------------------------------- -escape-string-regexp 1.0.5 - MIT -https://github.com/sindresorhus/escape-string-regexp +http-errors 2.0.0 - MIT +https://github.com/jshttp/http-errors#readme + +Copyright (c) 2014 Jonathan Ong +Copyright (c) 2016 Douglas Christopher Wilson +Copyright (c) 2014 Jonathan Ong me@jongleberry.com +Copyright (c) 2016 Douglas Christopher Wilson doug@somethingdoug.com -(c) Sindre Sorhus (http://sindresorhus.com) -Copyright (c) Sindre Sorhus (sindresorhus.com) The MIT License (MIT) -Copyright (c) Sindre Sorhus (sindresorhus.com) +Copyright (c) 2014 Jonathan Ong me@jongleberry.com +Copyright (c) 2016 Douglas Christopher Wilson doug@somethingdoug.com Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -6866,99 +5161,70 @@ THE SOFTWARE. --------------------------------------------------------- -etag 1.8.1 - MIT -https://github.com/jshttp/etag#readme - -Copyright (c) 2014-2016 Douglas Christopher Wilson +http-proxy-agent 5.0.0 - MIT +https://github.com/TooTallNate/node-http-proxy-agent#readme -(The MIT License) +Copyright (c) 2013 Nathan Rajlich -Copyright (c) 2014-2016 Douglas Christopher Wilson +MIT License -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: +Copyright (c) -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. --------------------------------------------------------- --------------------------------------------------------- -events 3.1.0 - MIT -https://github.com/Gozala/events#readme - -Copyright Joyent, Inc. and other Node contributors. +https-proxy-agent 5.0.0 - MIT +https://github.com/TooTallNate/node-https-proxy-agent#readme -MIT +Copyright (c) 2013 Nathan Rajlich -Copyright Joyent, Inc. and other Node contributors. +MIT License -Permission is hereby granted, free of charge, to any person obtaining a -copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to permit -persons to whom the Software is furnished to do so, subject to the -following conditions: +Copyright (c) -The above copyright notice and this permission notice shall be included -in all copies or substantial portions of the Software. +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN -NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE -USE OR OTHER DEALINGS IN THE SOFTWARE. +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. --------------------------------------------------------- --------------------------------------------------------- -event-target-shim 5.0.1 - MIT -https://github.com/mysticatea/event-target-shim - -copyright 2015 Toru Nagashima. -Copyright (c) 2015 Toru Nagashima +iconv-lite 0.4.24 - MIT +https://github.com/ashtuchkin/iconv-lite -The MIT License (MIT) +Copyright (c) Microsoft Corporation +Copyright (c) 2011 Alexander Shtuchkin -Copyright (c) 2015 Toru Nagashima +Copyright (c) 2011 Alexander Shtuchkin -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. @@ -6966,25 +5232,17 @@ SOFTWARE. --------------------------------------------------------- -express 4.17.1 - MIT -http://expressjs.com/ - -Copyright (c) 2013 Roman Shtylman -Copyright (c) 2009-2013 TJ Holowaychuk -Copyright (c) 2014-2015 Douglas Christopher Wilson -Copyright (c) 2009-2014 TJ Holowaychuk -Copyright (c) 2013-2014 Roman Shtylman -Copyright (c) 2014-2015 Douglas Christopher Wilson +iconv-lite 0.6.3 - MIT +https://github.com/ashtuchkin/iconv-lite -(The MIT License) +Copyright (c) Microsoft Corporation +Copyright (c) 2011 Alexander Shtuchkin -Copyright (c) 2009-2014 TJ Holowaychuk -Copyright (c) 2013-2014 Roman Shtylman -Copyright (c) 2014-2015 Douglas Christopher Wilson +Copyright (c) 2011 Alexander Shtuchkin Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including +"Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to @@ -6993,31 +5251,29 @@ the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + --------------------------------------------------------- --------------------------------------------------------- -fast-safe-stringify 2.0.7 - MIT -https://github.com/davidmarkclements/fast-safe-stringify#readme +inflection 1.13.1 - MIT +https://github.com/dreamerslab/node.inflection#readme -Copyright (c) 2016 David Mark Clements -Copyright (c) 2017 David Mark Clements & Matteo Collina -Copyright (c) 2018 David Mark Clements, Matteo Collina & Ruben Bridgewater +Copyright (c) 2011 +Copyright (c) 2011 Ben Lin -The MIT License (MIT) +MIT License -Copyright (c) 2016 David Mark Clements -Copyright (c) 2017 David Mark Clements & Matteo Collina -Copyright (c) 2018 David Mark Clements, Matteo Collina & Ruben Bridgewater +Copyright (c) 2021 dreamerslab Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -7042,14 +5298,14 @@ SOFTWARE. --------------------------------------------------------- -fecha 2.3.3 - MIT -https://github.com/taylorhakes/fecha +internal-slot 1.0.3 - MIT +https://github.com/ljharb/internal-slot#readme -Copyright (c) 2015 Taylor Hakes +Copyright (c) 2019 Jordan Harband -The MIT License (MIT) +MIT License -Copyright (c) 2015 Taylor Hakes +Copyright (c) 2019 Jordan Harband Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -7070,242 +5326,164 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - ---------------------------------------------------------- - ---------------------------------------------------------- - -finalhandler 1.1.2 - MIT -https://github.com/pillarjs/finalhandler#readme - -Copyright (c) 2014-2017 Douglas Christopher Wilson -Copyright (c) 2014-2017 Douglas Christopher Wilson - -(The MIT License) - -Copyright (c) 2014-2017 Douglas Christopher Wilson - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - --------------------------------------------------------- --------------------------------------------------------- -follow-redirects 1.13.3 - MIT -https://github.com/follow-redirects/follow-redirects +ipaddr.js 1.9.1 - MIT +https://github.com/whitequark/ipaddr.js#readme -Copyright 2014-present Olivier Lalonde , James Talmage , Ruben Verborgh +Copyright (c) 2011-2017 whitequark -Copyright 2014–present Olivier Lalonde , James Talmage , Ruben Verborgh +Copyright (C) 2011-2017 whitequark -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR -IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. --------------------------------------------------------- --------------------------------------------------------- -form-data 2.5.1 - MIT -https://github.com/form-data/form-data#readme - -Copyright (c) 2012 Felix Geisendorfer (felix@debuggable.com) and contributors +isarray 1.0.0 - MIT +https://github.com/juliangruber/isarray -Copyright (c) 2012 Felix Geisendörfer (felix@debuggable.com) and contributors +Copyright (c) 2013 Julian Gruber - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: +MIT License - The above copyright notice and this permission notice shall be included in - all copies or substantial portions of the Software. +Copyright (c) - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - THE SOFTWARE. +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. ---------------------------------------------------------- +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. --------------------------------------------------------- -form-data 3.0.0 - MIT -https://github.com/form-data/form-data#readme - -Copyright (c) 2012 Felix Geisendorfer (felix@debuggable.com) and contributors - -Copyright (c) 2012 Felix Geisendörfer (felix@debuggable.com) and contributors - - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in - all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - THE SOFTWARE. - - --------------------------------------------------------- ---------------------------------------------------------- +is-arrayish 0.3.2 - MIT +https://github.com/qix-/node-is-arrayish#readme -form-data 3.0.1 - MIT -https://github.com/form-data/form-data#readme +Copyright (c) 2015 JD Ballard -Copyright (c) 2012 Felix Geisendorfer (felix@debuggable.com) and contributors +The MIT License (MIT) -Copyright (c) 2012 Felix Geisendörfer (felix@debuggable.com) and contributors +Copyright (c) 2015 JD Ballard - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: - The above copyright notice and this permission notice shall be included in - all copies or substantial portions of the Software. +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - THE SOFTWARE. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. --------------------------------------------------------- --------------------------------------------------------- -forwarded 0.1.2 - MIT -https://github.com/jshttp/forwarded#readme +is-bigint 1.0.4 - MIT +https://github.com/inspect-js/is-bigint#readme -Copyright (c) 2014-2017 Douglas Christopher Wilson +Copyright (c) 2018 Jordan Harband -(The MIT License) +MIT License -Copyright (c) 2014-2017 Douglas Christopher Wilson +Copyright (c) 2018 Jordan Harband -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. --------------------------------------------------------- --------------------------------------------------------- -fresh 0.5.2 - MIT -https://github.com/jshttp/fresh#readme +is-boolean-object 1.1.2 - MIT +https://github.com/inspect-js/is-boolean-object#readme -Copyright (c) 2012 TJ Holowaychuk -Copyright (c) 2016-2017 Douglas Christopher Wilson -Copyright (c) 2012 TJ Holowaychuk -Copyright (c) 2016-2017 Douglas Christopher Wilson +Copyright (c) 2015 Jordan Harband -(The MIT License) +The MIT License (MIT) -Copyright (c) 2012 TJ Holowaychuk -Copyright (c) 2016-2017 Douglas Christopher Wilson +Copyright (c) 2015 Jordan Harband -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. --------------------------------------------------------- --------------------------------------------------------- -fs-constants 1.0.0 - MIT -https://github.com/mafintosh/fs-constants +is-callable 1.2.4 - MIT +https://github.com/inspect-js/is-callable#readme -Copyright (c) 2018 Mathias Buus +Copyright (c) 2015 Jordan Harband The MIT License (MIT) -Copyright (c) 2018 Mathias Buus +Copyright (c) 2015 Jordan Harband Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -7314,30 +5492,31 @@ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + --------------------------------------------------------- --------------------------------------------------------- -generate-function 2.3.1 - MIT -https://github.com/mafintosh/generate-function +is-date-object 1.0.5 - MIT +https://github.com/inspect-js/is-date-object#readme -Copyright (c) 2014 Mathias Buus +Copyright (c) 2015 Jordan Harband The MIT License (MIT) -Copyright (c) 2014 Mathias Buus +Copyright (c) 2015 Jordan Harband Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -7346,26 +5525,51 @@ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + --------------------------------------------------------- --------------------------------------------------------- -github-from-package 0.0.0 - MIT -https://github.com/substack/github-from-package +is-docker 2.2.1 - MIT +https://github.com/sindresorhus/is-docker#readme +Copyright (c) Sindre Sorhus (https://sindresorhus.com) -This software is released under the MIT license: +MIT License + +Copyright (c) Sindre Sorhus (https://sindresorhus.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +--------------------------------------------------------- + +--------------------------------------------------------- + +is-negative-zero 2.0.2 - MIT +https://github.com/inspect-js/is-negative-zero + +Copyright (c) 2014 Jordan Harband + +The MIT License (MIT) + +Copyright (c) 2014 Jordan Harband Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in @@ -7389,40 +5593,49 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. --------------------------------------------------------- -has-flag 3.0.0 - MIT -https://github.com/sindresorhus/has-flag#readme +is-number-object 1.0.7 - MIT +https://github.com/inspect-js/is-number-object#readme -(c) Sindre Sorhus (https://sindresorhus.com) -Copyright (c) Sindre Sorhus (sindresorhus.com) +Copyright (c) 2015 Jordan Harband -MIT License +The MIT License (MIT) -Copyright (c) Sindre Sorhus (sindresorhus.com) +Copyright (c) 2015 Jordan Harband -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. --------------------------------------------------------- --------------------------------------------------------- -http-errors 1.7.2 - MIT -https://github.com/jshttp/http-errors#readme +is-property 1.0.2 - MIT +https://github.com/mikolalysenko/is-property -Copyright (c) 2014 Jonathan Ong -Copyright (c) 2016 Douglas Christopher Wilson -Copyright (c) 2014 Jonathan Ong me@jongleberry.com -Copyright (c) 2016 Douglas Christopher Wilson doug@somethingdoug.com +(c) 2013 Mikola Lysenko. +Copyright (c) 2013 Mikola Lysenko The MIT License (MIT) -Copyright (c) 2014 Jonathan Ong me@jongleberry.com -Copyright (c) 2016 Douglas Christopher Wilson doug@somethingdoug.com +Copyright (c) 2013 Mikola Lysenko Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -7447,149 +5660,130 @@ THE SOFTWARE. --------------------------------------------------------- -http-proxy-agent 4.0.1 - MIT -https://github.com/TooTallNate/node-http-proxy-agent#readme - -Copyright (c) 2013 Nathan Rajlich - -MIT License - -Copyright (c) - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - ---------------------------------------------------------- - ---------------------------------------------------------- +is-regex 1.1.4 - MIT +https://github.com/inspect-js/is-regex -https-proxy-agent 5.0.0 - MIT -https://github.com/TooTallNate/node-https-proxy-agent#readme +Copyright (c) 2014 Jordan Harband -Copyright (c) 2013 Nathan Rajlich +The MIT License (MIT) -MIT License +Copyright (c) 2014 Jordan Harband -Copyright (c) +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. --------------------------------------------------------- --------------------------------------------------------- -iconv-lite 0.6.3 - MIT -https://github.com/ashtuchkin/iconv-lite +is-shared-array-buffer 1.0.2 - MIT +https://github.com/inspect-js/is-shared-array-buffer#readme -Copyright (c) Microsoft Corporation. -Copyright (c) 2011 Alexander Shtuchkin +Copyright (c) 2021 Inspect JS -Copyright (c) 2011 Alexander Shtuchkin +MIT License -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: +Copyright (c) 2021 Inspect JS -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. --------------------------------------------------------- --------------------------------------------------------- -iconv-lite 0.4.24 - MIT -https://github.com/ashtuchkin/iconv-lite +is-stream 1.1.0 - MIT +https://github.com/sindresorhus/is-stream#readme -Copyright (c) Microsoft Corporation. -Copyright (c) 2011 Alexander Shtuchkin +(c) Sindre Sorhus (https://sindresorhus.com) +Copyright (c) Sindre Sorhus (sindresorhus.com) -Copyright (c) 2011 Alexander Shtuchkin +The MIT License (MIT) -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: +Copyright (c) Sindre Sorhus (sindresorhus.com) -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. --------------------------------------------------------- --------------------------------------------------------- -inflection 1.13.1 - MIT -https://github.com/dreamerslab/node.inflection#readme +is-stream 2.0.1 - MIT +https://github.com/sindresorhus/is-stream#readme -Copyright (c) 2011 -Copyright (c) 2011 Ben Lin +Copyright (c) Sindre Sorhus (https://sindresorhus.com) MIT License -Copyright (c) 2021 dreamerslab +Copyright (c) Sindre Sorhus (https://sindresorhus.com) -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. --------------------------------------------------------- --------------------------------------------------------- -ipaddr.js 1.9.0 - MIT -https://github.com/whitequark/ipaddr.js#readme +is-string 1.0.7 - MIT +https://github.com/ljharb/is-string#readme -Copyright (c) 2011-2017 +Copyright (c) 2015 Jordan Harband -Copyright (C) 2011-2017 whitequark +The MIT License (MIT) + +Copyright (c) 2015 Jordan Harband Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -7598,31 +5792,31 @@ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + --------------------------------------------------------- --------------------------------------------------------- -ip-regex 2.1.0 - MIT -https://github.com/sindresorhus/ip-regex#readme +is-symbol 1.0.4 - MIT +https://github.com/inspect-js/is-symbol#readme -(c) Sindre Sorhus (https://sindresorhus.com) -Copyright (c) Sindre Sorhus (sindresorhus.com) +Copyright (c) 2015 Jordan Harband The MIT License (MIT) -Copyright (c) Sindre Sorhus (sindresorhus.com) +Copyright (c) 2015 Jordan Harband Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -7631,49 +5825,31 @@ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - - ---------------------------------------------------------- - ---------------------------------------------------------- - -isarray 1.0.0 - MIT -https://github.com/juliangruber/isarray - -Copyright (c) 2013 Julian Gruber - -MIT License - -Copyright (c) - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. --------------------------------------------------------- --------------------------------------------------------- -is-arrayish 0.3.2 - MIT -https://github.com/qix-/node-is-arrayish#readme +is-weakref 1.0.2 - MIT +https://github.com/inspect-js/is-weakref#readme -Copyright (c) 2015 JD Ballard +Copyright (c) 2020 Inspect JS -The MIT License (MIT) +MIT License -Copyright (c) 2015 JD Ballard +Copyright (c) 2020 Inspect JS Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -7682,30 +5858,30 @@ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. --------------------------------------------------------- --------------------------------------------------------- -is-docker 2.2.1 - MIT -https://github.com/sindresorhus/is-docker#readme +is-wsl 2.2.0 - MIT +https://github.com/sindresorhus/is-wsl#readme -Copyright (c) Sindre Sorhus (https://sindresorhus.com) +Copyright (c) Sindre Sorhus (sindresorhus.com) MIT License -Copyright (c) Sindre Sorhus (https://sindresorhus.com) +Copyright (c) Sindre Sorhus (sindresorhus.com) Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: @@ -7718,120 +5894,263 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI --------------------------------------------------------- -is-fullwidth-code-point 1.0.0 - MIT -https://github.com/sindresorhus/is-fullwidth-code-point +js-md4 0.3.2 - MIT +https://github.com/emn178/js-md4 -(c) Sindre Sorhus (http://sindresorhus.com) -Copyright (c) Sindre Sorhus (sindresorhus.com) +copyright Yi-Cyuan Chen +Copyright 2015-2017 Yi-Cyuan Chen -The MIT License (MIT) +Copyright 2015-2017 Yi-Cyuan Chen -Copyright (c) Sindre Sorhus (sindresorhus.com) +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. ---------------------------------------------------------- + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ ---------------------------------------------------------- + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION -is-property 1.0.2 - MIT -https://github.com/mikolalysenko/is-property + 1. Definitions. -(c) 2013 Mikola Lysenko. -Copyright (c) 2013 Mikola Lysenko + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. -The MIT License (MIT) + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. -Copyright (c) 2013 Mikola Lysenko + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. ---------------------------------------------------------- + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. ---------------------------------------------------------- + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. -is-stream 1.1.0 - MIT -https://github.com/sindresorhus/is-stream#readme + END OF TERMS AND CONDITIONS -(c) Sindre Sorhus (https://sindresorhus.com) -Copyright (c) Sindre Sorhus (sindresorhus.com) + APPENDIX: How to apply the Apache License to your work. -The MIT License (MIT) + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. -Copyright (c) Sindre Sorhus (sindresorhus.com) + Copyright [yyyy] [name of copyright owner] -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. + http://www.apache.org/licenses/LICENSE-2.0 -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. --------------------------------------------------------- --------------------------------------------------------- -is-wsl 2.2.0 - MIT -https://github.com/sindresorhus/is-wsl#readme +jsonfile 6.1.0 - MIT +https://github.com/jprichardson/node-jsonfile#readme -Copyright (c) Sindre Sorhus (sindresorhus.com) +Copyright 2012-2016, JP Richardson +Copyright (c) 2012-2015, JP Richardson -MIT License +(The MIT License) -Copyright (c) Sindre Sorhus (sindresorhus.com) +Copyright (c) 2012-2015, JP Richardson -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files +(the 'Software'), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, + merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE +WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS +OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. --------------------------------------------------------- @@ -7926,7 +6245,7 @@ ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEAL --------------------------------------------------------- -jws 4.0.0 - MIT +jws 3.2.2 - MIT https://github.com/brianloveswords/node-jws#readme Copyright (c) 2013 Brian J. Brennan @@ -7955,7 +6274,7 @@ ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEAL --------------------------------------------------------- -jws 3.2.2 - MIT +jws 4.0.0 - MIT https://github.com/brianloveswords/node-jws#readme Copyright (c) 2013 Brian J. Brennan @@ -7984,38 +6303,7 @@ ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEAL --------------------------------------------------------- -keytar 7.7.0 - MIT -http://atom.github.io/node-keytar - -Copyright (c) 2013 GitHub Inc. - -Copyright (c) 2013 GitHub Inc. - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - ---------------------------------------------------------- - ---------------------------------------------------------- - -kuler 1.0.1 - MIT +kuler 2.0.0 - MIT https://github.com/3rd-Eden/kuler Copyright 2014 Arnout Kazemier @@ -8471,10 +6759,10 @@ terms above. --------------------------------------------------------- -logform 2.1.2 - MIT +logform 2.4.0 - MIT https://github.com/winstonjs/logform#readme -Copyright (c) 2017 Charlie Robbins & the Contributors. +Copyright (c) 2017 Charlie Robbins & the Contributors MIT License @@ -8690,6 +6978,40 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +--------------------------------------------------------- + +--------------------------------------------------------- + +mime-db 1.51.0 - MIT +https://github.com/jshttp/mime-db#readme + +Copyright (c) 2014 Jonathan Ong +Copyright (c) 2014 Jonathan Ong me@jongleberry.com + + +The MIT License (MIT) + +Copyright (c) 2014 Jonathan Ong me@jongleberry.com + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + + --------------------------------------------------------- --------------------------------------------------------- @@ -8731,86 +7053,44 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. --------------------------------------------------------- -mimic-response 2.1.0 - MIT -https://github.com/sindresorhus/mimic-response#readme - -Copyright (c) Sindre Sorhus (https://sindresorhus.com) - -MIT License - -Copyright (c) Sindre Sorhus (https://sindresorhus.com) - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - ---------------------------------------------------------- - ---------------------------------------------------------- - -minimist 1.2.5 - MIT -https://github.com/substack/minimist - - -This software is released under the MIT license: - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - ---------------------------------------------------------- - ---------------------------------------------------------- - -mkdirp-classic 0.5.3 - MIT -https://github.com/mafintosh/mkdirp-classic +mime-types 2.1.34 - MIT +https://github.com/jshttp/mime-types#readme +Copyright (c) 2014 Jonathan Ong +Copyright (c) 2015 Douglas Christopher Wilson +Copyright (c) 2014 Jonathan Ong +Copyright (c) 2015 Douglas Christopher Wilson -The MIT License (MIT) +(The MIT License) -Copyright (c) 2020 James Halliday (mail@substack.net) and Mathias Buus +Copyright (c) 2014 Jonathan Ong +Copyright (c) 2015 Douglas Christopher Wilson -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. --------------------------------------------------------- --------------------------------------------------------- -moment 2.29.1 - MIT +moment 2.29.4 - MIT https://momentjs.com/ Copyright (c) JS Foundation and other contributors @@ -8843,7 +7123,7 @@ OTHER DEALINGS IN THE SOFTWARE. --------------------------------------------------------- -moment-timezone 0.5.33 - MIT +moment-timezone 0.5.34 - MIT http://momentjs.com/timezone/ Copyright (c) JS Foundation and other contributors @@ -8937,47 +7217,15 @@ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - - ---------------------------------------------------------- - ---------------------------------------------------------- - -ms 2.0.0 - MIT -https://github.com/zeit/ms#readme - -Copyright (c) 2016 Zeit, Inc. - -The MIT License (MIT) - -Copyright (c) 2016 Zeit, Inc. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. --------------------------------------------------------- --------------------------------------------------------- -ms 2.1.1 - MIT +ms 2.0.0 - MIT https://github.com/zeit/ms#readme Copyright (c) 2016 Zeit, Inc. @@ -9041,14 +7289,14 @@ SOFTWARE. --------------------------------------------------------- -msal 1.4.12 - MIT -https://github.com/AzureAD/microsoft-authentication-library-for-js#readme +ms 2.1.3 - MIT +https://github.com/vercel/ms#readme -Copyright (c) Microsoft Corporation. +Copyright (c) 2020 Vercel, Inc. -MIT License +The MIT License (MIT) -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) 2020 Vercel, Inc. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -9066,7 +7314,7 @@ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE +SOFTWARE. --------------------------------------------------------- @@ -9105,11 +7353,9 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. --------------------------------------------------------- -mysql2 2.2.5 - MIT +mysql2 2.3.2 - MIT https://github.com/sidorares/node-mysql2#readme -Copyright (c) 2016, Felix Frederick Becker -Copyright (c) 2016 Andrey Sidorov (sidorares@yandex.ru) and contributors Copyright (c) 2016 Andrey Sidorov (sidorares@yandex.ru) and contributors @@ -9132,23 +7378,6 @@ Copyright (c) 2016 Andrey Sidorov (sidorares@yandex.ru) and contributors THE SOFTWARE. -ISC License - -Copyright (c) 2016, Felix Frederick Becker - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted, provided that the above -copyright notice and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF -OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - --------------------------------------------------------- --------------------------------------------------------- @@ -9181,38 +7410,6 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ---------------------------------------------------------- - ---------------------------------------------------------- - -napi-build-utils 1.0.2 - MIT -https://github.com/inspiredware/napi-build-utils#readme - -Copyright (c) 2018 - -MIT License - -Copyright (c) 2018 inspiredware - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - - --------------------------------------------------------- --------------------------------------------------------- @@ -9250,7 +7447,7 @@ SOFTWARE. --------------------------------------------------------- -negotiator 0.6.2 - MIT +negotiator 0.6.3 - MIT https://github.com/jshttp/negotiator#readme Copyright (c) 2012 Federico Romero @@ -9291,13 +7488,13 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. --------------------------------------------------------- -node-abi 2.30.0 - MIT -https://github.com/lgeiger/node-abi#readme +node-abort-controller 3.0.1 - MIT +https://github.com/southpolesteve/node-abort-controller#readme MIT License -Copyright (c) 2016 Lukas Geiger +Copyright (c) 2019 Steve Faulkner Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -9322,14 +7519,14 @@ SOFTWARE. --------------------------------------------------------- -node-abort-controller 2.0.0 - MIT -https://github.com/southpolesteve/node-abort-controller#readme +node-fetch 2.6.7 - MIT +https://github.com/bitinn/node-fetch -Copyright (c) 2019 Steve Faulkner +Copyright (c) 2016 David Frank -MIT License +The MIT License (MIT) -Copyright (c) 2019 Steve Faulkner +Copyright (c) 2016 David Frank Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -9350,40 +7547,19 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ---------------------------------------------------------- - ---------------------------------------------------------- - -node-addon-api 3.2.1 - MIT -https://github.com/nodejs/node-addon-api - - -The MIT License (MIT) -===================== - -Copyright (c) 2017 Node.js API collaborators ------------------------------------ - -*Node.js API collaborators listed at * - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. --------------------------------------------------------- --------------------------------------------------------- -node-fetch 2.6.1 - MIT -https://github.com/bitinn/node-fetch +object.assign 4.1.2 - MIT +https://github.com/ljharb/object.assign#readme -Copyright (c) 2016 David Frank +Copyright (c) 2014 Jordan Harband The MIT License (MIT) -Copyright (c) 2016 David Frank +Copyright (c) 2014 Jordan Harband Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -9403,21 +7579,18 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - --------------------------------------------------------- --------------------------------------------------------- -number-is-nan 1.0.1 - MIT -https://github.com/sindresorhus/number-is-nan#readme +object-inspect 1.12.2 - MIT +https://github.com/inspect-js/object-inspect -(c) Sindre Sorhus (http://sindresorhus.com) -Copyright (c) Sindre Sorhus (sindresorhus.com) +Copyright (c) 2013 James Halliday -The MIT License (MIT) +MIT License -Copyright (c) Sindre Sorhus (sindresorhus.com) +Copyright (c) 2013 James Halliday Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -9426,32 +7599,30 @@ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. --------------------------------------------------------- --------------------------------------------------------- -object-assign 4.1.1 - MIT -https://github.com/sindresorhus/object-assign#readme +object-keys 1.1.1 - MIT +https://github.com/ljharb/object-keys#readme -(c) Sindre Sorhus -(c) Sindre Sorhus (https://sindresorhus.com) -Copyright (c) Sindre Sorhus (sindresorhus.com) +Copyright (c) 2013 Jordan Harband The MIT License (MIT) -Copyright (c) Sindre Sorhus (sindresorhus.com) +Copyright (C) 2013 Jordan Harband Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -9471,13 +7642,12 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - --------------------------------------------------------- --------------------------------------------------------- -one-time 0.0.4 - MIT -https://github.com/unshiftio/one-time +one-time 1.0.0 - MIT +https://github.com/3rd-Eden/one-time#readme Copyright (c) 2015 Unshift.io, Arnout Kazemier @@ -9542,6 +7712,43 @@ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +--------------------------------------------------------- + +--------------------------------------------------------- + +on-finished 2.4.1 - MIT +https://github.com/jshttp/on-finished#readme + +Copyright (c) 2013 Jonathan Ong +Copyright (c) 2014 Douglas Christopher Wilson +Copyright (c) 2013 Jonathan Ong +Copyright (c) 2014 Douglas Christopher Wilson + +(The MIT License) + +Copyright (c) 2013 Jonathan Ong +Copyright (c) 2014 Douglas Christopher Wilson + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + --------------------------------------------------------- --------------------------------------------------------- @@ -9579,7 +7786,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. --------------------------------------------------------- -open 7.4.2 - MIT +open 8.4.0 - MIT https://github.com/sindresorhus/open#readme Copyright 2006, Kevin Krammer @@ -9670,59 +7877,6 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ---------------------------------------------------------- - ---------------------------------------------------------- - -path-key 2.0.1 - MIT -https://github.com/sindresorhus/path-key#readme - -(c) Sindre Sorhus (https://sindresorhus.com) -Copyright (c) Sindre Sorhus (sindresorhus.com) - -The MIT License (MIT) - -Copyright (c) Sindre Sorhus (sindresorhus.com) - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - - ---------------------------------------------------------- - ---------------------------------------------------------- - -path-key 3.1.1 - MIT -https://github.com/sindresorhus/path-key#readme - -Copyright (c) Sindre Sorhus (sindresorhus.com) - -MIT License - -Copyright (c) Sindre Sorhus (sindresorhus.com) - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - --------------------------------------------------------- --------------------------------------------------------- @@ -9759,14 +7913,15 @@ THE SOFTWARE. --------------------------------------------------------- -prebuild-install 6.1.3 - MIT -https://github.com/prebuild/prebuild-install +pg-connection-string 2.5.0 - MIT +https://github.com/brianc/node-postgres/tree/master/packages/pg-connection-string -Copyright (c) 2015 Mathias Buus +Copyright (c) 2014 Iced Development +Copyright (c) 2010-2014 Brian Carlson (brian.m.carlson@gmail.com) The MIT License (MIT) -Copyright (c) 2015 Mathias Buus +Copyright (c) 2014 Iced Development Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -9775,17 +7930,16 @@ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. --------------------------------------------------------- @@ -9854,7 +8008,7 @@ SOFTWARE.** --------------------------------------------------------- -proxy-addr 2.0.5 - MIT +proxy-addr 2.0.7 - MIT https://github.com/jshttp/proxy-addr#readme Copyright (c) 2014-2016 Douglas Christopher Wilson @@ -9904,37 +8058,6 @@ The above copyright notice and this permission notice shall be included in all c THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ---------------------------------------------------------- - ---------------------------------------------------------- - -pump 3.0.0 - MIT -https://github.com/mafintosh/pump#readme - -Copyright (c) 2014 Mathias Buus - -The MIT License (MIT) - -Copyright (c) 2014 Mathias Buus - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - --------------------------------------------------------- --------------------------------------------------------- @@ -10007,18 +8130,18 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. --------------------------------------------------------- -raw-body 2.4.0 - MIT +raw-body 2.5.1 - MIT https://github.com/stream-utils/raw-body#readme Copyright (c) 2013-2014 Jonathan Ong -Copyright (c) 2014-2015 Douglas Christopher Wilson +Copyright (c) 2014-2022 Douglas Christopher Wilson Copyright (c) 2013-2014 Jonathan Ong -Copyright (c) 2014-2015 Douglas Christopher Wilson +Copyright (c) 2014-2022 Douglas Christopher Wilson The MIT License (MIT) Copyright (c) 2013-2014 Jonathan Ong -Copyright (c) 2014-2015 Douglas Christopher Wilson +Copyright (c) 2014-2022 Douglas Christopher Wilson Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -10028,47 +8151,15 @@ copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - - ---------------------------------------------------------- - ---------------------------------------------------------- - -rcedit 3.0.1 - MIT -https://github.com/electron/node-rcedit#readme - -Copyright (c) by P.J. Plauger -Copyright (c) 2013 GitHub, Inc. - -The MIT License (MIT) - -Copyright (c) 2013 GitHub, Inc. - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. +all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. --------------------------------------------------------- @@ -10078,7 +8169,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. readable-stream 2.3.6 - MIT https://github.com/nodejs/readable-stream#readme -Copyright Joyent, Inc. and other Node contributors. +Copyright Joyent, Inc. and other Node contributors Node.js is licensed for use as follows: @@ -10133,10 +8224,10 @@ IN THE SOFTWARE. --------------------------------------------------------- -readable-stream 3.4.0 - MIT +readable-stream 3.6.0 - MIT https://github.com/nodejs/readable-stream#readme -Copyright Joyent, Inc. and other Node contributors. +Copyright Joyent, Inc. and other Node contributors Node.js is licensed for use as follows: @@ -10191,21 +8282,20 @@ IN THE SOFTWARE. --------------------------------------------------------- -readable-stream 3.6.0 - MIT -https://github.com/nodejs/readable-stream#readme +retry-as-promised 5.0.0 - MIT +https://github.com/mickhansen/retry-as-promised -Copyright Joyent, Inc. and other Node contributors. +Copyright (c) 2015-2016 Mick Hansen. http://mhansen.io -Node.js is licensed for use as follows: +The MIT License -""" -Copyright Node.js contributors. All rights reserved. +Copyright (c) 2015-2016 Mick Hansen. http://mhansen.io Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to -deal in the Software without restriction, including without limitation the -rights to use, copy, modify, merge, publish, distribute, sublicense, and/or -sell copies of the Software, and to permit persons to whom the Software is +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in @@ -10215,48 +8305,26 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS -IN THE SOFTWARE. -""" - -This license applies to parts of Node.js originating from the -https://github.com/joyent/node repository: - -""" -Copyright Joyent, Inc. and other Node contributors. All rights reserved. -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to -deal in the Software without restriction, including without limitation the -rights to use, copy, modify, merge, publish, distribute, sublicense, and/or -sell copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS -IN THE SOFTWARE. -""" --------------------------------------------------------- --------------------------------------------------------- -retry-as-promised 3.2.0 - MIT -https://github.com/mickhansen/retry-as-promised +safe-buffer 5.1.2 - MIT +https://github.com/feross/safe-buffer -Copyright (c) 2015-2016 Mick Hansen. http://mhansen.io +Copyright (c) Feross Aboukhadijeh +Copyright (c) Feross Aboukhadijeh (http://feross.org) -The MIT License +The MIT License (MIT) -Copyright (c) 2015-2016 Mick Hansen. http://mhansen.io +Copyright (c) Feross Aboukhadijeh Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -10277,13 +8345,11 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - --------------------------------------------------------- --------------------------------------------------------- -safe-buffer 5.1.2 - MIT +safe-buffer 5.2.1 - MIT https://github.com/feross/safe-buffer Copyright (c) Feross Aboukhadijeh @@ -10348,16 +8414,48 @@ SOFTWARE. --------------------------------------------------------- -send 0.17.1 - MIT +safe-stable-stringify 2.3.1 - MIT +https://github.com/BridgeAR/safe-stable-stringify#readme + +Copyright (c) Ruben Bridgewater + +The MIT License (MIT) + +Copyright (c) Ruben Bridgewater + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +--------------------------------------------------------- + +--------------------------------------------------------- + +send 0.18.0 - MIT https://github.com/pillarjs/send#readme Copyright (c) 2012 TJ Holowaychuk -Copyright (c) 2014-2016 Douglas Christopher Wilson +Copyright (c) 2014-2022 Douglas Christopher Wilson (The MIT License) Copyright (c) 2012 TJ Holowaychuk -Copyright (c) 2014-2016 Douglas Christopher Wilson +Copyright (c) 2014-2022 Douglas Christopher Wilson Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the @@ -10416,7 +8514,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. --------------------------------------------------------- -sequelize 6.6.5 - MIT +sequelize 6.12.4 - MIT https://sequelize.org/ Copyright (c) 2014-present Sequelize @@ -10448,7 +8546,7 @@ SOFTWARE. --------------------------------------------------------- -sequelize-pool 6.1.0 - MIT +sequelize-pool 7.1.0 - MIT https://github.com/sushantdhiman/sequelize-pool#readme Copyright (c) 2010-2016 James Cooper @@ -10469,251 +8567,112 @@ the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - --------------------------------- - -(Original Fork License) - -[generic-pool@2.5] - -Copyright (c) 2010-2016 James Cooper - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - ---------------------------------------------------------- - ---------------------------------------------------------- - -serve-static 1.14.1 - MIT -https://github.com/expressjs/serve-static#readme - -Copyright (c) 2011 LearnBoost -Copyright (c) 2010 Sencha Inc. -Copyright (c) 2011 TJ Holowaychuk -Copyright (c) 2014-2016 Douglas Christopher Wilson - -(The MIT License) - -Copyright (c) 2010 Sencha Inc. -Copyright (c) 2011 LearnBoost -Copyright (c) 2011 TJ Holowaychuk -Copyright (c) 2014-2016 Douglas Christopher Wilson - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - ---------------------------------------------------------- - ---------------------------------------------------------- - -shebang-command 1.2.0 - MIT -https://github.com/kevva/shebang-command#readme - -(c) Kevin Martensson (http://github.com/kevva) -Copyright (c) Kevin Martensson - -The MIT License (MIT) - -Copyright (c) Kevin Martensson (github.com/kevva) - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - - ---------------------------------------------------------- - ---------------------------------------------------------- - -shebang-command 2.0.0 - MIT -https://github.com/kevva/shebang-command#readme - -Copyright (c) Kevin Martensson - -MIT License - -Copyright (c) Kevin Mårtensson (github.com/kevva) - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - ---------------------------------------------------------- - ---------------------------------------------------------- - -shebang-regex 1.0.0 - MIT -https://github.com/sindresorhus/shebang-regex - -(c) Sindre Sorhus (http://sindresorhus.com) -Copyright (c) Sindre Sorhus (sindresorhus.com) - -The MIT License (MIT) - -Copyright (c) Sindre Sorhus (sindresorhus.com) - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - - ---------------------------------------------------------- +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ---------------------------------------------------------- -shebang-regex 3.0.0 - MIT -https://github.com/sindresorhus/shebang-regex#readme +-------------------------------- -(c) Sindre Sorhus (https://sindresorhus.com) -Copyright (c) Sindre Sorhus (sindresorhus.com) +(Original Fork License) -MIT License +[generic-pool@2.5] -Copyright (c) Sindre Sorhus (sindresorhus.com) +Copyright (c) 2010-2016 James Cooper -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. --------------------------------------------------------- --------------------------------------------------------- -simple-concat 1.0.1 - MIT -https://github.com/feross/simple-concat +serve-static 1.15.0 - MIT +https://github.com/expressjs/serve-static#readme -Copyright (c) Feross Aboukhadijeh -Copyright (c) Feross Aboukhadijeh (http://feross.org). +Copyright (c) 2011 LearnBoost +Copyright (c) 2010 Sencha Inc. +Copyright (c) 2011 TJ Holowaychuk +Copyright (c) 2014-2016 Douglas Christopher Wilson -The MIT License (MIT) +(The MIT License) -Copyright (c) Feross Aboukhadijeh +Copyright (c) 2010 Sencha Inc. +Copyright (c) 2011 LearnBoost +Copyright (c) 2011 TJ Holowaychuk +Copyright (c) 2014-2016 Douglas Christopher Wilson -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. --------------------------------------------------------- --------------------------------------------------------- -simple-get 3.1.0 - MIT -https://github.com/feross/simple-get +side-channel 1.0.4 - MIT +https://github.com/ljharb/side-channel#readme -Copyright (c) Feross Aboukhadijeh -Copyright (c) Feross Aboukhadijeh (http://feross.org). +Copyright (c) 2019 Jordan Harband -The MIT License (MIT) +MIT License -Copyright (c) Feross Aboukhadijeh +Copyright (c) 2019 Jordan Harband -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. --------------------------------------------------------- @@ -10812,7 +8771,7 @@ Copyright (c) 2011 Felix Geisendörfer (felix@debuggable.com) --------------------------------------------------------- -statuses 1.5.0 - MIT +statuses 2.0.1 - MIT https://github.com/jshttp/statuses#readme Copyright (c) 2014 Jonathan Ong @@ -10881,74 +8840,14 @@ THE SOFTWARE. --------------------------------------------------------- -string_decoder 1.1.1 - MIT -https://github.com/nodejs/string_decoder - -Copyright Joyent, Inc. and other Node contributors. - -Node.js is licensed for use as follows: - -""" -Copyright Node.js contributors. All rights reserved. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to -deal in the Software without restriction, including without limitation the -rights to use, copy, modify, merge, publish, distribute, sublicense, and/or -sell copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS -IN THE SOFTWARE. -""" - -This license applies to parts of Node.js originating from the -https://github.com/joyent/node repository: - -""" -Copyright Joyent, Inc. and other Node contributors. All rights reserved. -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to -deal in the Software without restriction, including without limitation the -rights to use, copy, modify, merge, publish, distribute, sublicense, and/or -sell copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS -IN THE SOFTWARE. -""" - - - ---------------------------------------------------------- - ---------------------------------------------------------- - -string-width 1.0.2 - MIT -https://github.com/sindresorhus/string-width#readme +string.prototype.trimend 1.0.5 - MIT +https://github.com/es-shims/String.prototype.trimEnd#readme -(c) Sindre Sorhus (https://sindresorhus.com) -Copyright (c) Sindre Sorhus (sindresorhus.com) +Copyright (c) 2017 Khaled Al-Ansari -The MIT License (MIT) +MIT License -Copyright (c) Sindre Sorhus (sindresorhus.com) +Copyright (c) 2017 Khaled Al-Ansari Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -10957,31 +8856,30 @@ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. --------------------------------------------------------- --------------------------------------------------------- -strip-ansi 3.0.1 - MIT -https://github.com/chalk/strip-ansi +string.prototype.trimstart 1.0.5 - MIT +https://github.com/es-shims/String.prototype.trimStart#readme -(c) Sindre Sorhus (http://sindresorhus.com) -Copyright (c) Sindre Sorhus (sindresorhus.com) +Copyright (c) 2017 Khaled Al-Ansari -The MIT License (MIT) +MIT License -Copyright (c) Sindre Sorhus (sindresorhus.com) +Copyright (c) 2017 Khaled Al-Ansari Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -10990,37 +8888,37 @@ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. --------------------------------------------------------- --------------------------------------------------------- -strip-json-comments 2.0.1 - MIT -https://github.com/sindresorhus/strip-json-comments#readme +string_decoder 1.1.1 - MIT +https://github.com/nodejs/string_decoder -(c) Sindre Sorhus (http://sindresorhus.com) -Copyright (c) Sindre Sorhus (sindresorhus.com) +Copyright Joyent, Inc. and other Node contributors -The MIT License (MIT) +Node.js is licensed for use as follows: -Copyright (c) Sindre Sorhus (sindresorhus.com) +""" +Copyright Node.js contributors. All rights reserved. Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is +of this software and associated documentation files (the "Software"), to +deal in the Software without restriction, including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in @@ -11030,49 +8928,21 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - - ---------------------------------------------------------- - ---------------------------------------------------------- - -supports-color 5.5.0 - MIT -https://github.com/chalk/supports-color#readme - -Copyright (c) Sindre Sorhus (sindresorhus.com) - -MIT License - -Copyright (c) Sindre Sorhus (sindresorhus.com) - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - ---------------------------------------------------------- - ---------------------------------------------------------- - -tar-fs 2.1.1 - MIT -https://github.com/mafintosh/tar-fs - -Copyright (c) 2014 Mathias Buus - -The MIT License (MIT) +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +IN THE SOFTWARE. +""" -Copyright (c) 2014 Mathias Buus +This license applies to parts of Node.js originating from the +https://github.com/joyent/node repository: +""" +Copyright Joyent, Inc. and other Node contributors. All rights reserved. Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is +of this software and associated documentation files (the "Software"), to +deal in the Software without restriction, including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in @@ -11082,49 +8952,42 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +IN THE SOFTWARE. +""" + + --------------------------------------------------------- --------------------------------------------------------- -tar-stream 2.2.0 - MIT -https://github.com/mafintosh/tar-stream +supports-color 5.5.0 - MIT +https://github.com/chalk/supports-color#readme -Copyright (c) 2014 Mathias Buus +Copyright (c) Sindre Sorhus (sindresorhus.com) -The MIT License (MIT) +MIT License -Copyright (c) 2014 Mathias Buus +Copyright (c) Sindre Sorhus (sindresorhus.com) -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. --------------------------------------------------------- --------------------------------------------------------- -tedious 11.4.0 - MIT +tedious 15.1.0 - MIT https://github.com/tediousjs/tedious Copyright (c) 2010-2018 Mike D Pilsbury +Copyright (c) 2010-2021 Mike D Pilsbury Copyright (c) 2019 Microsoft Corporation Copyright (c) 2019 Microsoft Corporation let SQLServerEncryptionType exports.SQLServerEncryptionType SQLServerEncryptionType @@ -11187,7 +9050,7 @@ SOFTWARE. --------------------------------------------------------- -toidentifier 1.0.0 - MIT +toidentifier 1.0.1 - MIT https://github.com/component/toidentifier#readme Copyright (c) 2016 Douglas Christopher Wilson @@ -11269,6 +9132,24 @@ The above copyright notice and this permission notice shall be included in all c THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +--------------------------------------------------------- + +--------------------------------------------------------- + +tr46 0.0.3 - MIT +https://github.com/Sebmaster/tr46.js#readme + + +MIT License + +Copyright (c) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + --------------------------------------------------------- --------------------------------------------------------- @@ -11276,8 +9157,8 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI triple-beam 1.3.0 - MIT https://github.com/winstonjs/triple-beam#readme -Copyright (c) 2017 (c) 2010 Charlie Robbins +Copyright (c) 2017 winstonjs MIT License @@ -11375,35 +9256,32 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. --------------------------------------------------------- -underscore 1.8.3 - MIT -http://underscorejs.org/ +unbox-primitive 1.0.2 - MIT +https://github.com/ljharb/unbox-primitive#readme -Copyright (c) 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors -(c) 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors Underscore +Copyright (c) 2019 Jordan Harband -Copyright (c) 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative -Reporters & Editors +MIT License -Permission is hereby granted, free of charge, to any person -obtaining a copy of this software and associated documentation -files (the "Software"), to deal in the Software without -restriction, including without limitation the rights to use, -copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following -conditions: +Copyright (c) 2019 Jordan Harband -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES -OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT -HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -OTHER DEALINGS IN THE SOFTWARE. +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. --------------------------------------------------------- @@ -11437,6 +9315,37 @@ IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +--------------------------------------------------------- + +--------------------------------------------------------- + +universalify 2.0.0 - MIT +https://github.com/RyanZim/universalify#readme + +Copyright (c) 2017, Ryan Zimmerman + +(The MIT License) + +Copyright (c) 2017, Ryan Zimmerman + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the 'Software'), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + --------------------------------------------------------- --------------------------------------------------------- @@ -11580,27 +9489,7 @@ uuid 8.3.2 - MIT https://github.com/uuidjs/uuid#readme Copyright 2011, Sebastian Tschan https://blueimp.net -Copyright (c) Paul Johnston 1999 - 2009 Other contributors Greg Holt, Andrew Kepert, Ydnar, Lostinet - -The MIT License (MIT) - Copyright (c) 2010-2020 Robert Kieffer and other contributors - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - ---------------------------------------------------------- - ---------------------------------------------------------- - -uuid 8.2.0 - MIT -https://github.com/uuidjs/uuid#readme - -Copyright 2011, Sebastian Tschan https://blueimp.net Copyright (c) Paul Johnston 1999 - 2009 Other contributors Greg Holt, Andrew Kepert, Ydnar, Lostinet The MIT License (MIT) @@ -11618,9 +9507,10 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI --------------------------------------------------------- -validator 13.6.0 - MIT +validator 13.7.0 - MIT https://github.com/validatorjs/validator.js +Copyright (c) 2018 Chris O'Hara Copyright (c) 2018 Chris O'Hara @@ -11681,13 +9571,75 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. --------------------------------------------------------- -winston 3.2.1 - MIT +whatwg-url 5.0.0 - MIT +https://github.com/jsdom/whatwg-url#readme + +(c) extraPathPercentEncodeSet.has +Copyright (c) 2015-2016 Sebastian Mayr + +The MIT License (MIT) + +Copyright (c) 2015–2016 Sebastian Mayr + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + + +--------------------------------------------------------- + +--------------------------------------------------------- + +which-boxed-primitive 1.0.2 - MIT +https://github.com/inspect-js/which-boxed-primitive#readme + +Copyright (c) 2019 Jordan Harband + +MIT License + +Copyright (c) 2019 Jordan Harband + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +--------------------------------------------------------- + +--------------------------------------------------------- + +winston 3.8.1 - MIT https://github.com/winstonjs/winston#readme -(c) 2015 Nimrod Becker (c) 2010 Charlie Robbins -(c) 2016 Charlie Robbins -(c) 2011 Daniel Aristizabal Copyright (c) 2010 Charlie Robbins Copyright (c) 2010 Charlie Robbins @@ -11714,10 +9666,10 @@ THE SOFTWARE. --------------------------------------------------------- -winston-transport 4.3.0 - MIT +winston-transport 4.5.0 - MIT https://github.com/winstonjs/winston-transport#readme -Copyright (c) 2015 Charlie Robbins & the contributors. +Copyright (c) 2015 Charlie Robbins & the contributors The MIT License (MIT) @@ -11841,82 +9793,11 @@ THE SOFTWARE. --------------------------------------------------------- -xmldom 0.6.0 - MIT -https://github.com/xmldom/xmldom - -Copyright 2019 - present Christopher J. Brody -https://github.com/xmldom/xmldom/graphs/contributors Copyright 2012 - 2017 - -Copyright 2019 - present Christopher J. Brody and other contributors, as listed in: https://github.com/xmldom/xmldom/graphs/contributors -Copyright 2012 - 2017 @jindw and other contributors, as listed in: https://github.com/jindw/xmldom/graphs/contributors - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - ---------------------------------------------------------- - ---------------------------------------------------------- - -xpath.js 1.1.0 - MIT -https://github.com/yaronn/xpath.js#readme - - -MIT License - -Copyright (c) - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - ---------------------------------------------------------- - ---------------------------------------------------------- - -expand-template 2.0.3 - MIT OR WTFPL -https://github.com/ralphtheninja/expand-template - -Copyright (c) 2018 Lars-Magnus Skog - -The MIT License (MIT) - -Copyright (c) 2018 Lars-Magnus Skog - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - ---------------------------------------------------------- - ---------------------------------------------------------- - -uri-templates 0.2.0 - OTHER +uri-templates 0.2.0 Copyright 2011-2012 Copyright (c) 2011 TJ Holowaychuk -OTHER - --------------------------------------------------------- From de882333854f8cbc211be2b8cd0b6ad102f33b93 Mon Sep 17 00:00:00 2001 From: Emma Zhu Date: Fri, 6 Jan 2023 10:21:29 +0800 Subject: [PATCH 017/297] Bump package version to 3.21.0 --- ChangeLog.md | 2 ++ README.md | 2 +- package-lock.json | 4 ++-- package.json | 2 +- src/blob/utils/constants.ts | 2 +- src/queue/utils/constants.ts | 2 +- src/table/utils/constants.ts | 2 +- 7 files changed, 9 insertions(+), 7 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index 6c279786b..a51e1c071 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -4,6 +4,8 @@ ## Upcoming Release +## 2023.01 Version 3.21.0 + General: - Fixed shared key authentication failure when request uri contains "+" diff --git a/README.md b/README.md index 8247afebe..db6607435 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,7 @@ | Version | Azure Storage API Version | Service Support | Description | Reference Links | | ------------------------------------------------------------------ | ------------------------- | ------------------------------ | ------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| 3.20.1 | 2021-10-04 | Blob, Queue and Table(preview) | Azurite V3 based on TypeScript & New Architecture | [NPM](https://www.npmjs.com/package/azurite) - [Docker](https://hub.docker.com/_/microsoft-azure-storage-azurite) - [Visual Studio Code Extension](https://marketplace.visualstudio.com/items?itemName=Azurite.azurite) | +| 3.21.0 | 2021-10-04 | Blob, Queue and Table(preview) | Azurite V3 based on TypeScript & New Architecture | [NPM](https://www.npmjs.com/package/azurite) - [Docker](https://hub.docker.com/_/microsoft-azure-storage-azurite) - [Visual Studio Code Extension](https://marketplace.visualstudio.com/items?itemName=Azurite.azurite) | | [Legacy (v2)](https://github.com/Azure/Azurite/tree/legacy-master) | 2016-05-31 | Blob, Queue and Table | Legacy Azurite V2 | [NPM](https://www.npmjs.com/package/azurite) | - [Azurite V3](#azurite-v3) diff --git a/package-lock.json b/package-lock.json index 3e8f91c02..f9be0a58e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "azurite", - "version": "3.20.1", + "version": "3.21.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "azurite", - "version": "3.20.1", + "version": "3.21.0", "license": "MIT", "dependencies": { "@azure/ms-rest-js": "^1.5.0", diff --git a/package.json b/package.json index 4f3f74a12..0d7a5d22b 100644 --- a/package.json +++ b/package.json @@ -3,7 +3,7 @@ "displayName": "Azurite", "description": "An open source Azure Storage API compatible server", "icon": "icon.png", - "version": "3.20.1", + "version": "3.21.0", "publisher": "Azurite", "categories": [ "Other" diff --git a/src/blob/utils/constants.ts b/src/blob/utils/constants.ts index 49a8aa6e8..9e48b4e79 100644 --- a/src/blob/utils/constants.ts +++ b/src/blob/utils/constants.ts @@ -1,7 +1,7 @@ import { StoreDestinationArray } from "../../common/persistence/IExtentStore"; import * as Models from "../generated/artifacts/models"; -export const VERSION = "3.20.1"; +export const VERSION = "3.21.0"; export const BLOB_API_VERSION = "2021-10-04"; export const DEFAULT_BLOB_SERVER_HOST_NAME = "127.0.0.1"; // Change to 0.0.0.0 when needs external access export const DEFAULT_LIST_BLOBS_MAX_RESULTS = 5000; diff --git a/src/queue/utils/constants.ts b/src/queue/utils/constants.ts index 174e61e9b..94a503884 100644 --- a/src/queue/utils/constants.ts +++ b/src/queue/utils/constants.ts @@ -1,6 +1,6 @@ import { StoreDestinationArray } from "../../common/persistence/IExtentStore"; -export const VERSION = "3.20.1"; +export const VERSION = "3.21.0"; export const QUEUE_API_VERSION = "2021-10-04"; export const DEFAULT_QUEUE_SERVER_HOST_NAME = "127.0.0.1"; // Change to 0.0.0.0 when needs external access export const DEFAULT_QUEUE_LISTENING_PORT = 10001; diff --git a/src/table/utils/constants.ts b/src/table/utils/constants.ts index feb02cbec..ef8c59910 100644 --- a/src/table/utils/constants.ts +++ b/src/table/utils/constants.ts @@ -18,7 +18,7 @@ export enum TABLE_STATUSCODE { export const DEFAULT_TABLE_CONTEXT_PATH = "azurite_table_context"; export const TABLE_API_VERSION = "2021-10-04"; -export const VERSION = "3.20.1"; +export const VERSION = "3.21.0"; // Max Body size is 4 MB export const BODY_SIZE_MAX = 1024 * 1024 * 4; From 239a5347a5a4f70f32c5787eb9a4e609943de59b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 8 Jan 2023 11:11:30 +0800 Subject: [PATCH 018/297] Bump @azure/core-rest-pipeline from 1.9.2 to 1.10.1 (#1784) Bumps [@azure/core-rest-pipeline](https://github.com/Azure/azure-sdk-for-js) from 1.9.2 to 1.10.1. - [Release notes](https://github.com/Azure/azure-sdk-for-js/releases) - [Changelog](https://github.com/Azure/azure-sdk-for-js/blob/main/documentation/Changelog-for-next-generation.md) - [Commits](https://github.com/Azure/azure-sdk-for-js/compare/@azure/core-rest-pipeline_1.9.2...@azure/core-rest-pipeline_1.10.1) --- updated-dependencies: - dependency-name: "@azure/core-rest-pipeline" dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/package-lock.json b/package-lock.json index f9be0a58e..9c5df5679 100644 --- a/package-lock.json +++ b/package-lock.json @@ -216,9 +216,9 @@ } }, "node_modules/@azure/core-rest-pipeline": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/@azure/core-rest-pipeline/-/core-rest-pipeline-1.9.2.tgz", - "integrity": "sha512-8rXI6ircjenaLp+PkOFpo37tQ1PQfztZkfVj97BIF3RPxHAsoVSgkJtu3IK/bUEWcb7HzXSoyBe06M7ODRkRyw==", + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/@azure/core-rest-pipeline/-/core-rest-pipeline-1.10.1.tgz", + "integrity": "sha512-Kji9k6TOFRDB5ZMTw8qUf2IJ+CeJtsuMdAHox9eqpTf1cefiNMpzrfnF6sINEBZJsaVaWgQ0o48B6kcUH68niA==", "dependencies": { "@azure/abort-controller": "^1.0.0", "@azure/core-auth": "^1.4.0", @@ -232,7 +232,7 @@ "uuid": "^8.3.0" }, "engines": { - "node": ">=12.0.0" + "node": ">=14.0.0" } }, "node_modules/@azure/core-rest-pipeline/node_modules/@azure/core-tracing": { @@ -11145,9 +11145,9 @@ } }, "@azure/core-rest-pipeline": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/@azure/core-rest-pipeline/-/core-rest-pipeline-1.9.2.tgz", - "integrity": "sha512-8rXI6ircjenaLp+PkOFpo37tQ1PQfztZkfVj97BIF3RPxHAsoVSgkJtu3IK/bUEWcb7HzXSoyBe06M7ODRkRyw==", + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/@azure/core-rest-pipeline/-/core-rest-pipeline-1.10.1.tgz", + "integrity": "sha512-Kji9k6TOFRDB5ZMTw8qUf2IJ+CeJtsuMdAHox9eqpTf1cefiNMpzrfnF6sINEBZJsaVaWgQ0o48B6kcUH68niA==", "requires": { "@azure/abort-controller": "^1.0.0", "@azure/core-auth": "^1.4.0", From e383fc08c64d3f59c089dc7e338a86ec300c636a Mon Sep 17 00:00:00 2001 From: Wei Wei Date: Mon, 9 Jan 2023 07:16:19 +0000 Subject: [PATCH 019/297] remove supported feature from not supported feature list (#1785) --- README.md | 3 --- 1 file changed, 3 deletions(-) diff --git a/README.md b/README.md index db6607435..4195810a1 100644 --- a/README.md +++ b/README.md @@ -957,11 +957,9 @@ Detailed support matrix: - Following features or REST APIs are NOT supported or limited supported in this release (will support more features per customers feedback in future releases) - SharedKey Lite - - Delegation SAS - Static Website - Soft delete & Undelete Blob - Incremental Copy Blob - - Batch - Blob Tags - Blob Query - Blob Versions @@ -1003,7 +1001,6 @@ Detailed support matrix: - Clear Message - Following features or REST APIs are NOT supported or limited supported in this release (will support more features per customers feedback in future releases) - SharedKey Lite - - Delegation SAS Latest version supports for **2021-10-04** API version **table** service (preview). Detailed support matrix: From 9615e2e8d09b773f70cdced2cfef4214b9584f84 Mon Sep 17 00:00:00 2001 From: Wei Wei Date: Fri, 13 Jan 2023 10:17:57 +0000 Subject: [PATCH 020/297] fix 1787: table query with true/false failure (#1792) --- ChangeLog.md | 4 ++ .../StatePredicateFinished.ts | 5 ++- tests/table/apis/table.entity.query.test.ts | 38 +++++++++++++++++++ 3 files changed, 46 insertions(+), 1 deletion(-) diff --git a/ChangeLog.md b/ChangeLog.md index a51e1c071..aa5dcc799 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -4,6 +4,10 @@ ## Upcoming Release +Table: + +- Fixed issue that True/False in table query will fail the request. + ## 2023.01 Version 3.21.0 General: diff --git a/src/table/persistence/QueryTranscriber/StatePredicateFinished.ts b/src/table/persistence/QueryTranscriber/StatePredicateFinished.ts index c58ba37bf..31960ce74 100644 --- a/src/table/persistence/QueryTranscriber/StatePredicateFinished.ts +++ b/src/table/persistence/QueryTranscriber/StatePredicateFinished.ts @@ -348,10 +348,13 @@ export default class StatePredicateFinished // on it's own in a predicate; const predicateType = context.taggedPredicates[offset].tokenMap.tokens[0].type; + const predicateValue = + context.taggedPredicates[offset].tokenMap.tokens[0].token; if ( predicateType.isParensOpen() || predicateType.isParensClose() || - predicateType.isOperator() + predicateType.isOperator()|| + (predicateType.isValue() && this.isBooleanValue(predicateValue)) ) { return; } diff --git a/tests/table/apis/table.entity.query.test.ts b/tests/table/apis/table.entity.query.test.ts index dc841f4f6..b779c4cc8 100644 --- a/tests/table/apis/table.entity.query.test.ts +++ b/tests/table/apis/table.entity.query.test.ts @@ -908,5 +908,43 @@ describe("table Entity APIs test - using Azure/data-tables", () => { } assert.strictEqual(testsCompleted, queriesAndExpectedResult.length); await tableClient.deleteTable(); + }); + + it("should work correctly when query filter contains true or false, @loki", async () => { + const tableClient = createAzureDataTablesClient( + testLocalAzuriteInstance, + getUniqueName("querywithbool") + ); + const partitionKeyForQueryTest = createUniquePartitionKey(""); + const totalItems = 5; + await tableClient.createTable(); + + for (let i = 0; i < totalItems; i++) { + const result = await tableClient.createEntity({ + partitionKey: `${partitionKeyForQueryTest}${i}`, + rowKey: `${i}`, + foo: "testEntity" + }); + assert.notStrictEqual(result.etag, undefined); + } + + const maxPageSize = 5; + const entities = tableClient.listEntities>({ + queryOptions: { + filter: odata`(true and RowKey eq '1') and ((false or PartitionKey eq '${partitionKeyForQueryTest}1') or PartitionKey eq '${partitionKeyForQueryTest}2') or PartitionKey eq '${partitionKeyForQueryTest}3'` + } + }); + let all: TableEntity<{ foo: string }>[] = []; + for await (const entity of entities.byPage({ + maxPageSize + })) { + all = [...all, ...entity]; + } + assert.strictEqual(all.length, 2); + all.forEach((entity) => + { + assert.ok(entity.partitionKey === `${partitionKeyForQueryTest}3` || ((entity.partitionKey === `${partitionKeyForQueryTest}1` || entity.partitionKey === `${partitionKeyForQueryTest}2`) && entity.rowKey === '1' )) + }) + await tableClient.deleteTable(); }); }); From 9225ba46429fd78aa1a4df7b247f649e91fd15f8 Mon Sep 17 00:00:00 2001 From: Emma Zhu Date: Wed, 11 Jan 2023 10:16:54 +0800 Subject: [PATCH 021/297] Fix issue when querying table entity whose properties includes a special char. --- ChangeLog.md | 1 + src/table/persistence/QueryTranscriber/StateQueryFinished.ts | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/ChangeLog.md b/ChangeLog.md index aa5dcc799..344aa09bb 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -7,6 +7,7 @@ Table: - Fixed issue that True/False in table query will fail the request. +- Fixed an issue: it cannot return result correctly when querying for a table entity with filters including some special characters. ## 2023.01 Version 3.21.0 diff --git a/src/table/persistence/QueryTranscriber/StateQueryFinished.ts b/src/table/persistence/QueryTranscriber/StateQueryFinished.ts index 7f70acda8..227d0b496 100644 --- a/src/table/persistence/QueryTranscriber/StateQueryFinished.ts +++ b/src/table/persistence/QueryTranscriber/StateQueryFinished.ts @@ -29,7 +29,7 @@ export default class StateQueryFinished implements IQPState { const convertedPredicate = taggedPredicate.convertPredicateForLokiJS(); for (const taggedPredicateToken of convertedPredicate.tokenMap.tokens) { predicate += " "; - predicate += taggedPredicateToken.token; + predicate += taggedPredicateToken.token.replace(/\\/g, "\\\\"); } } From 4319acd8b1d0444fb8a59ad93d8590cdabb3e921 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 30 Jan 2023 11:16:24 +0800 Subject: [PATCH 022/297] Bump tslib from 2.4.0 to 2.5.0 (#1799) Bumps [tslib](https://github.com/Microsoft/tslib) from 2.4.0 to 2.5.0. - [Release notes](https://github.com/Microsoft/tslib/releases) - [Commits](https://github.com/Microsoft/tslib/compare/2.4.0...2.5.0) --- updated-dependencies: - dependency-name: tslib dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 9c5df5679..21d292299 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10179,9 +10179,9 @@ } }, "node_modules/tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==" }, "node_modules/tslint": { "version": "6.1.3", @@ -19002,9 +19002,9 @@ } }, "tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==" }, "tslint": { "version": "6.1.3", From a22d584adf9e9f94028f86d9cc6633ac991842ee Mon Sep 17 00:00:00 2001 From: Emma Zhu Date: Fri, 10 Feb 2023 14:49:06 +0800 Subject: [PATCH 023/297] Bump package verion to 3.22.0, Bump service API version to 2021-12-02 --- ChangeLog.md | 6 ++++++ README.md | 16 ++++++++-------- package-lock.json | 4 ++-- package.json | 2 +- src/blob/utils/constants.ts | 5 +++-- src/queue/utils/constants.ts | 3 ++- src/table/utils/constants.ts | 5 +++-- 7 files changed, 25 insertions(+), 16 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index 344aa09bb..d5bffa5dc 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -4,6 +4,12 @@ ## Upcoming Release +## 2023.02 Version 3.22.0 + +General: + +- Bump up service API version to 2021-12-02 + Table: - Fixed issue that True/False in table query will fail the request. diff --git a/README.md b/README.md index 4195810a1..5989a1d7e 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,7 @@ | Version | Azure Storage API Version | Service Support | Description | Reference Links | | ------------------------------------------------------------------ | ------------------------- | ------------------------------ | ------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| 3.21.0 | 2021-10-04 | Blob, Queue and Table(preview) | Azurite V3 based on TypeScript & New Architecture | [NPM](https://www.npmjs.com/package/azurite) - [Docker](https://hub.docker.com/_/microsoft-azure-storage-azurite) - [Visual Studio Code Extension](https://marketplace.visualstudio.com/items?itemName=Azurite.azurite) | +| 3.22.0 | 2021-12-02 | Blob, Queue and Table(preview) | Azurite V3 based on TypeScript & New Architecture | [NPM](https://www.npmjs.com/package/azurite) - [Docker](https://hub.docker.com/_/microsoft-azure-storage-azurite) - [Visual Studio Code Extension](https://marketplace.visualstudio.com/items?itemName=Azurite.azurite) | | [Legacy (v2)](https://github.com/Azure/Azurite/tree/legacy-master) | 2016-05-31 | Blob, Queue and Table | Legacy Azurite V2 | [NPM](https://www.npmjs.com/package/azurite) | - [Azurite V3](#azurite-v3) @@ -76,19 +76,19 @@ Compared to V2, Azurite V3 implements a new architecture leveraging code generat ## Features & Key Changes in Azurite V3 -- Blob storage features align with Azure Storage API version 2021-10-04 (Refer to support matrix section below) +- Blob storage features align with Azure Storage API version 2021-12-02 (Refer to support matrix section below) - SharedKey/Account SAS/Service SAS/Public Access Authentications/OAuth - Get/Set Blob Service Properties - Create/List/Delete Containers - Create/Read/List/Update/Delete Block Blobs - Create/Read/List/Update/Delete Page Blobs -- Queue storage features align with Azure Storage API version 2021-10-04 (Refer to support matrix section below) +- Queue storage features align with Azure Storage API version 2021-12-02 (Refer to support matrix section below) - SharedKey/Account SAS/Service SAS/OAuth - Get/Set Queue Service Properties - Preflight Request - Create/List/Delete Queues - Put/Get/Peek/Updata/Deleta/Clear Messages -- Table storage features align with Azure Storage API version 2021-10-04 (Refer to support matrix section below) +- Table storage features align with Azure Storage API version 2021-12-02 (Refer to support matrix section below) - SharedKey/Account SAS/Service SAS/OAuth - Create/List/Delete Tables - Insert/Update/Query/Delete Table Entities @@ -904,7 +904,7 @@ Legacy Azurite V2 supports Azure Storage Blob, Queue and Table services. Azurite V3 currently only supports Azure Storage blob service. Queue service is supported after V3.2.0-preview. Table service support is currently under discussion. -Azurite V3 supports features from Azure Storage API version 2021-10-04, and will maintain parity with the latest API versions, in a more frequent update frequency than legacy Azurite V2. +Azurite V3 supports features from Azure Storage API version 2021-12-02, and will maintain parity with the latest API versions, in a more frequent update frequency than legacy Azurite V2. ## TypeScript Server Code Generator @@ -915,7 +915,7 @@ All the generated code is kept in `generated` folder, including the generated mi ## Support Matrix -Latest release targets **2021-10-04** API version **blob** service. +Latest release targets **2021-12-02** API version **blob** service. Detailed support matrix: @@ -973,7 +973,7 @@ Detailed support matrix: - Encryption Scope - Get Page Ranges Continuation Token -Latest version supports for **2021-10-04** API version **queue** service. +Latest version supports for **2021-12-02** API version **queue** service. Detailed support matrix: - Supported Vertical Features @@ -1002,7 +1002,7 @@ Detailed support matrix: - Following features or REST APIs are NOT supported or limited supported in this release (will support more features per customers feedback in future releases) - SharedKey Lite -Latest version supports for **2021-10-04** API version **table** service (preview). +Latest version supports for **2021-12-02** API version **table** service (preview). Detailed support matrix: - Supported Vertical Features diff --git a/package-lock.json b/package-lock.json index 21d292299..56e088b20 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "azurite", - "version": "3.21.0", + "version": "3.22.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "azurite", - "version": "3.21.0", + "version": "3.22.0", "license": "MIT", "dependencies": { "@azure/ms-rest-js": "^1.5.0", diff --git a/package.json b/package.json index 0d7a5d22b..d22161fae 100644 --- a/package.json +++ b/package.json @@ -3,7 +3,7 @@ "displayName": "Azurite", "description": "An open source Azure Storage API compatible server", "icon": "icon.png", - "version": "3.21.0", + "version": "3.22.0", "publisher": "Azurite", "categories": [ "Other" diff --git a/src/blob/utils/constants.ts b/src/blob/utils/constants.ts index 9e48b4e79..0de227d1d 100644 --- a/src/blob/utils/constants.ts +++ b/src/blob/utils/constants.ts @@ -1,8 +1,8 @@ import { StoreDestinationArray } from "../../common/persistence/IExtentStore"; import * as Models from "../generated/artifacts/models"; -export const VERSION = "3.21.0"; -export const BLOB_API_VERSION = "2021-10-04"; +export const VERSION = "3.22.0"; +export const BLOB_API_VERSION = "2021-12-02"; export const DEFAULT_BLOB_SERVER_HOST_NAME = "127.0.0.1"; // Change to 0.0.0.0 when needs external access export const DEFAULT_LIST_BLOBS_MAX_RESULTS = 5000; export const DEFAULT_LIST_CONTAINERS_MAX_RESULTS = 5000; @@ -96,6 +96,7 @@ export const DEFAULT_BLOB_PERSISTENCE_ARRAY: StoreDestinationArray = [ ]; export const ValidAPIVersions = [ + "2021-12-02", "2021-10-04", "2021-08-06", "2021-06-08", diff --git a/src/queue/utils/constants.ts b/src/queue/utils/constants.ts index 94a503884..bd4f74a2e 100644 --- a/src/queue/utils/constants.ts +++ b/src/queue/utils/constants.ts @@ -1,6 +1,6 @@ import { StoreDestinationArray } from "../../common/persistence/IExtentStore"; -export const VERSION = "3.21.0"; +export const VERSION = "3.22.0"; export const QUEUE_API_VERSION = "2021-10-04"; export const DEFAULT_QUEUE_SERVER_HOST_NAME = "127.0.0.1"; // Change to 0.0.0.0 when needs external access export const DEFAULT_QUEUE_LISTENING_PORT = 10001; @@ -90,6 +90,7 @@ export const DEFAULT_QUEUE_PERSISTENCE_ARRAY: StoreDestinationArray = [ ]; export const ValidAPIVersions = [ + "2021-12-02", "2021-10-04", "2021-08-06", "2021-06-08", diff --git a/src/table/utils/constants.ts b/src/table/utils/constants.ts index ef8c59910..709edea21 100644 --- a/src/table/utils/constants.ts +++ b/src/table/utils/constants.ts @@ -17,8 +17,8 @@ export enum TABLE_STATUSCODE { } export const DEFAULT_TABLE_CONTEXT_PATH = "azurite_table_context"; -export const TABLE_API_VERSION = "2021-10-04"; -export const VERSION = "3.21.0"; +export const TABLE_API_VERSION = "2021-12-02"; +export const VERSION = "3.22.0"; // Max Body size is 4 MB export const BODY_SIZE_MAX = 1024 * 1024 * 4; @@ -71,6 +71,7 @@ export const DEFAULT_TABLE_PERSISTENCE_ARRAY: StoreDestinationArray = [ export const QUERY_RESULT_MAX_NUM = 1000; export const ValidAPIVersions = [ + "2021-12-02", "2021-10-04", "2021-08-06", "2021-06-08", From 9ce4852ab6fbdf85952a9a5da434847bb8ffe9a5 Mon Sep 17 00:00:00 2001 From: Emma Zhu Date: Fri, 10 Feb 2023 15:02:01 +0800 Subject: [PATCH 024/297] Add unsupported feature of: blob cold tier --- README.md | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 5989a1d7e..78db58752 100644 --- a/README.md +++ b/README.md @@ -264,10 +264,12 @@ Above command will try to start Azurite image with configurations: > Will support more release channels for Azurite V3 in the future. #### Docker Compose + To run Azurite in Docker Compose, you can start with the following configuration: + ```yml --- -version: '3.9' +version: "3.9" services: azurite: image: mcr.microsoft.com/azure-storage/azurite @@ -277,7 +279,7 @@ services: ports: - "10000:10000" - "10001:10001" - - "10002:10002" + - "10002:10002" ``` ### NuGet @@ -972,6 +974,7 @@ Detailed support matrix: - Sync copy blob by access source with oauth - Encryption Scope - Get Page Ranges Continuation Token + - Cold Tier Latest version supports for **2021-12-02** API version **queue** service. Detailed support matrix: From 40b4d4b491a2cf954a86be74360e3b883abd5831 Mon Sep 17 00:00:00 2001 From: Edwin Huber Date: Thu, 16 Feb 2023 11:15:05 +0100 Subject: [PATCH 025/297] Support batch request formatting from Azure-Storage/9.3.2 (#1801) * updated and refactored tests to cover the different cases for encoding seen across the different SDKs --- ChangeLog.md | 1 + src/table/batch/TableBatchOrchestrator.ts | 21 +- src/table/batch/TableBatchSerialization.ts | 10 +- src/table/errors/StorageErrorFactory.ts | 13 +- src/table/handlers/TableHandler.ts | 20 +- src/table/utils/constants.ts | 2 + .../apis/table.batch.errorhandling.test.ts | 171 ++++---- .../table.entity.azure.data-tables.test.ts | 386 ++++++++++++++---- tests/table/apis/table.entity.issues.test.ts | 46 +-- tests/table/apis/table.entity.query.test.ts | 169 +++++--- tests/table/apis/table.entity.rest.test.ts | 45 ++ tests/table/apis/table.entity.test.ts | 264 ++++++++---- .../table/models/AzureDataTablesTestEntity.ts | 43 -- .../AzureDataTablesTestEntityFactory.ts | 63 +++ .../table/models/LargeDataTablesTestEntity.ts | 169 -------- .../LargeDataTablesTestEntityFactory.ts | 161 ++++++++ tests/table/models/TestEntity.ts | 4 +- tests/table/unit/deserialization.unit.test.ts | 8 +- .../utils/AzureStorageSDKEntityFactory.ts | 14 + tests/table/utils/table.entity.test.utils.ts | 30 +- 20 files changed, 1060 insertions(+), 580 deletions(-) delete mode 100644 tests/table/models/AzureDataTablesTestEntity.ts create mode 100644 tests/table/models/AzureDataTablesTestEntityFactory.ts delete mode 100644 tests/table/models/LargeDataTablesTestEntity.ts create mode 100644 tests/table/models/LargeDataTablesTestEntityFactory.ts create mode 100644 tests/table/utils/AzureStorageSDKEntityFactory.ts diff --git a/ChangeLog.md b/ChangeLog.md index d5bffa5dc..b3f596655 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -14,6 +14,7 @@ Table: - Fixed issue that True/False in table query will fail the request. - Fixed an issue: it cannot return result correctly when querying for a table entity with filters including some special characters. +- Fixed issue with decoding URIs from batch request submitted by old Azure Storage SDK. ## 2023.01 Version 3.21.0 diff --git a/src/table/batch/TableBatchOrchestrator.ts b/src/table/batch/TableBatchOrchestrator.ts index d3ce0225a..bf25539b0 100644 --- a/src/table/batch/TableBatchOrchestrator.ts +++ b/src/table/batch/TableBatchOrchestrator.ts @@ -582,8 +582,8 @@ export default class TableBatchOrchestrator { request: BatchRequest ): string | undefined { let partitionKey: string | undefined; - - const url = decodeURI(request.getUrl()); + const originalUrl = request.getUrl(); + const url = decodeURIComponent(originalUrl); const partKeyMatch = url.match(/(?<=PartitionKey=')(.*)(?=',)/gi); if (partKeyMatch === null) { @@ -594,8 +594,9 @@ export default class TableBatchOrchestrator { partitionKey = jsonBody.PartitionKey; } } else { - // keys can have more complex values which are URI encoded - partitionKey = decodeURIComponent(partKeyMatch[0]); + // keys can have more complex values which are URI encoded if they come from the URL + // we decode above. + partitionKey = partKeyMatch[0]; } return partitionKey; } @@ -610,22 +611,20 @@ export default class TableBatchOrchestrator { */ private extractRequestRowKey(request: BatchRequest): string { let rowKey: string; - - const url = decodeURI(request.getUrl()); - + // problem: sometimes the ticks are encoded, sometimes not! + // this is a difference between Azure Data-Tables and the deprecated + // Azure Storage SDK + const url = decodeURIComponent(request.getUrl()); const rowKeyMatch = url.match(/(?<=RowKey=')(.+)(?='\))/gi); rowKey = rowKeyMatch ? rowKeyMatch[0] : ""; - if (rowKey === "") { + if (rowKeyMatch === null) { // row key not in URL, must be in body const body = request.getBody(); if (body !== "") { const jsonBody = JSON.parse(body ? body : "{}"); rowKey = jsonBody.RowKey; } - } else { - // keys can have more complex values which are URI encoded - rowKey = decodeURIComponent(rowKey); } return rowKey; } diff --git a/src/table/batch/TableBatchSerialization.ts b/src/table/batch/TableBatchSerialization.ts index ee3165e36..c28e315d2 100644 --- a/src/table/batch/TableBatchSerialization.ts +++ b/src/table/batch/TableBatchSerialization.ts @@ -122,7 +122,7 @@ export class TableBatchSerialization extends BatchSerialization { operation.httpMethod = requestType[0] as HttpMethod; } operation.path = path[1]; - operation.uri = decodeURI(fullRequestURI[0]); + operation.uri = fullRequestURI[0]; operation.jsonRequestBody = jsonBody; return operation; } @@ -538,10 +538,14 @@ export class TableBatchSerialization extends BatchSerialization { } const trimmedUrl: string = request.getUrl().substring(0, offsetPosition); let entityPath = trimmedUrl + "(PartitionKey='"; - entityPath += request.params.tableEntityProperties!.PartitionKey; + entityPath += encodeURIComponent( + request.params.tableEntityProperties!.PartitionKey + ); entityPath += "',"; entityPath += "RowKey='"; - entityPath += request.params.tableEntityProperties!.RowKey; + entityPath += encodeURIComponent( + request.params.tableEntityProperties!.RowKey + ); entityPath += "')\r\n"; return entityPath; } diff --git a/src/table/errors/StorageErrorFactory.ts b/src/table/errors/StorageErrorFactory.ts index 8d2fdefc3..25c410d66 100644 --- a/src/table/errors/StorageErrorFactory.ts +++ b/src/table/errors/StorageErrorFactory.ts @@ -29,7 +29,7 @@ export default class StorageErrorFactory { public static getInvalidAPIVersion( context: Context, - apiVersion?: string, + apiVersion?: string ): StorageError { return new StorageError( 400, @@ -418,4 +418,15 @@ export default class StorageErrorFactory { context ); } + + public static getEntityTooLarge(context: Context): StorageError { + return new StorageError( + 400, + "EntityTooLarge", + `The entity is larger than the maximum allowed size (1MB).`, + context.contextID || defaultID, + undefined, + context + ); + } } diff --git a/src/table/handlers/TableHandler.ts b/src/table/handlers/TableHandler.ts index 99678b1ba..7a7d80e82 100644 --- a/src/table/handlers/TableHandler.ts +++ b/src/table/handlers/TableHandler.ts @@ -28,7 +28,8 @@ import { RETURN_NO_CONTENT, TABLE_API_VERSION, TABLE_SERVICE_PERMISSION, - ODATA_TYPE + ODATA_TYPE, + ENTITY_SIZE_MAX } from "../utils/constants"; import { getEntityOdataAnnotationsForResponse, @@ -359,7 +360,7 @@ export default class TableHandler extends BaseHandler implements ITableHandler { const tableContext = new TableStorageContext(context); const account = this.getAndCheckAccountName(tableContext); const table = this.getAndCheckTableName(tableContext); - this.checkBodyLimit(context, context.request?.getBody()); + this.checkEntityLimit(context, context.request?.getBody()); [partitionKey, rowKey] = TableHandler.getAndCheckKeys( partitionKey, @@ -451,7 +452,7 @@ export default class TableHandler extends BaseHandler implements ITableHandler { const tableContext = new TableStorageContext(context); const account = this.getAndCheckAccountName(tableContext); const table = this.getAndCheckTableName(tableContext); - this.checkBodyLimit(context, context.request?.getBody()); + this.checkEntityLimit(context, context.request?.getBody()); [partitionKey, rowKey] = TableHandler.getAndCheckKeys( partitionKey, @@ -1070,9 +1071,10 @@ export default class TableHandler extends BaseHandler implements ITableHandler { } } else if (properties[prop].length > 32 * 1024) { throw StorageErrorFactory.getPropertyValueTooLargeError(context); - } - else if (properties[prop] === undefined || properties[prop] === "") - { + } else if ( + properties[prop] === undefined || + properties[prop] === "" + ) { const propertyType = properties[`${prop}${ODATA_TYPE}`]; if (propertyType !== undefined && propertyType === "Edm.DateTime") { throw StorageErrorFactory.getInvalidInput(context); @@ -1097,4 +1099,10 @@ export default class TableHandler extends BaseHandler implements ITableHandler { throw StorageErrorFactory.getRequestBodyTooLarge(context); } } + + private checkEntityLimit(context: Context, body: string | undefined) { + if (undefined !== body && getUTF8ByteSize(body) > ENTITY_SIZE_MAX) { + throw StorageErrorFactory.getEntityTooLarge(context); + } + } } diff --git a/src/table/utils/constants.ts b/src/table/utils/constants.ts index 709edea21..e834ec019 100644 --- a/src/table/utils/constants.ts +++ b/src/table/utils/constants.ts @@ -21,6 +21,8 @@ export const TABLE_API_VERSION = "2021-12-02"; export const VERSION = "3.22.0"; // Max Body size is 4 MB export const BODY_SIZE_MAX = 1024 * 1024 * 4; +// Max Entity sizxe is 1 MB +export const ENTITY_SIZE_MAX = 1024 * 1024; export const HeaderConstants = { SERVER: "Server", diff --git a/tests/table/apis/table.batch.errorhandling.test.ts b/tests/table/apis/table.batch.errorhandling.test.ts index d16652c67..545eeb015 100644 --- a/tests/table/apis/table.batch.errorhandling.test.ts +++ b/tests/table/apis/table.batch.errorhandling.test.ts @@ -11,9 +11,9 @@ import { getUniqueName } from "../../testutils"; import { - AzureDataTablesTestEntity, - createBasicEntityForTest -} from "../models/AzureDataTablesTestEntity"; + AzureDataTablesTestEntityFactory, + TableTestEntity +} from "../models/AzureDataTablesTestEntityFactory"; import { createAzureDataTablesClient, createTableServerForTestHttps, @@ -32,6 +32,8 @@ configLogger(false); // Azure Storage Connection String (using SAS or Key). const testLocalAzuriteInstance = true; +const entityFactory = new AzureDataTablesTestEntityFactory(); + describe("table Entity APIs test", () => { let server: TableServer; @@ -50,12 +52,12 @@ describe("table Entity APIs test", () => { await server.close(); }); - it("Batch API should serialize errors according to group transaction spec, @loki", async () => { + it("01. Batch API should serialize errors according to group transaction spec, @loki", async () => { const partitionKey = createUniquePartitionKey(""); - const testEntities: AzureDataTablesTestEntity[] = [ - createBasicEntityForTest(partitionKey), - createBasicEntityForTest(partitionKey), - createBasicEntityForTest(partitionKey) + const testEntities: TableTestEntity[] = [ + entityFactory.createBasicEntityForTest(partitionKey), + entityFactory.createBasicEntityForTest(partitionKey), + entityFactory.createBasicEntityForTest(partitionKey) ]; const sharedKeyCredential = new AzureNamedKeyCredential( @@ -83,13 +85,13 @@ describe("table Entity APIs test", () => { } }); - it("Batch API should reject request with more than 100 transactions, @loki", async () => { + it("02. Batch API should reject request with more than 100 transactions, @loki", async () => { const partitionKey = createUniquePartitionKey(""); const tableName100: string = getUniqueName("datatables"); - const testEntities: AzureDataTablesTestEntity[] = []; + const testEntities: TableTestEntity[] = []; const TOO_MANY_REQUESTS = 101; while (testEntities.length < TOO_MANY_REQUESTS) { - testEntities.push(createBasicEntityForTest(partitionKey)); + testEntities.push(entityFactory.createBasicEntityForTest(partitionKey)); } const tooManyRequestsClient = createAzureDataTablesClient( @@ -112,13 +114,13 @@ describe("table Entity APIs test", () => { } }); - it("Batch API should rollback insert Entity transactions, @loki", async () => { + it("03. Batch API should rollback insert Entity transactions, @loki", async () => { const partitionKey = createUniquePartitionKey(""); const tableNameBatchError: string = getUniqueName("datatables"); - const testEntities: AzureDataTablesTestEntity[] = [ - createBasicEntityForTest(partitionKey), - createBasicEntityForTest(partitionKey), - createBasicEntityForTest(partitionKey) + const testEntities: TableTestEntity[] = [ + entityFactory.createBasicEntityForTest(partitionKey), + entityFactory.createBasicEntityForTest(partitionKey), + entityFactory.createBasicEntityForTest(partitionKey) ]; const tableClientrollback = createAzureDataTablesClient( @@ -133,50 +135,69 @@ describe("table Entity APIs test", () => { transaction.createEntity(testEntity); } - // force "Entity already exists" error - for (const testEntity of testEntities) { - transaction.createEntity(testEntity); - } - try { const result = await tableClientrollback.submitTransaction( transaction.actions ); assert.ok(result.subResponses[0].rowKey); + } catch (err: any) { + const restErr = err as RestError; + assert.strictEqual( + restErr.statusCode, + 202, + `Should not have got status code ${restErr.statusCode} on first transaction.` + ); + } + + testEntities[1].myValue = "ShouldNotHaveChanged"; + const transaction2 = new TableTransaction(); + for (const testEntity of testEntities) { + transaction2.createEntity(testEntity); + } + + try { + const result2 = await tableClientrollback.submitTransaction( + transaction2.actions + ); + assert.ok(result2.subResponses[0].rowKey); } catch (err: any) { const restErr = err as RestError; assert.strictEqual( restErr.statusCode, 409, - "Did not get expected entity already exists error." + "Did not get expected 409 (EntityAlreadyExists) error." ); } try { const shouldNotExist = - await tableClientrollback.getEntity( - testEntities[0].partitionKey, - testEntities[0].rowKey + await tableClientrollback.getEntity( + testEntities[1].partitionKey, + testEntities[1].rowKey ); - assert.strictEqual(shouldNotExist, null, "We should not have an entity."); + assert.strictEqual( + shouldNotExist.myValue, + "value1", + "We should not have changed the value!" + ); } catch (err: any) { const restErr2 = err as RestError; assert.strictEqual( restErr2.statusCode, - 404, - "We expected an entity not found error." + 202, + "We did not expect the entity to have been changed." ); } await tableClientrollback.deleteTable(); }); - it("Batch API should rollback delete Entity transactions, @loki", async () => { + it("04. Batch API should rollback delete Entity transactions, @loki", async () => { const partitionKey = createUniquePartitionKey(""); const tableNameDeleteError: string = getUniqueName("datatables"); - const testEntities: AzureDataTablesTestEntity[] = [ - createBasicEntityForTest(partitionKey), - createBasicEntityForTest(partitionKey), - createBasicEntityForTest(partitionKey) + const testEntities: TableTestEntity[] = [ + entityFactory.createBasicEntityForTest(partitionKey), + entityFactory.createBasicEntityForTest(partitionKey), + entityFactory.createBasicEntityForTest(partitionKey) ]; const tableClientrollback = createAzureDataTablesClient( @@ -227,11 +248,10 @@ describe("table Entity APIs test", () => { } try { - const shouldExist = - await tableClientrollback.getEntity( - testEntities[0].partitionKey, - testEntities[0].rowKey - ); + const shouldExist = await tableClientrollback.getEntity( + testEntities[0].partitionKey, + testEntities[0].rowKey + ); assert.notStrictEqual(shouldExist, null, "We have an entity."); } catch (err: any) { const restErr2 = err as RestError; @@ -244,13 +264,13 @@ describe("table Entity APIs test", () => { await tableClientrollback.deleteTable(); }); - it("Batch API should rollback update Entity transactions, @loki", async () => { + it("05. Batch API should rollback update Entity transactions, @loki", async () => { const partitionKey = createUniquePartitionKey(""); const tableNameDeleteError: string = getUniqueName("datatables"); - const testEntities: AzureDataTablesTestEntity[] = [ - createBasicEntityForTest(partitionKey), - createBasicEntityForTest(partitionKey), - createBasicEntityForTest(partitionKey) + const testEntities: TableTestEntity[] = [ + entityFactory.createBasicEntityForTest(partitionKey), + entityFactory.createBasicEntityForTest(partitionKey), + entityFactory.createBasicEntityForTest(partitionKey) ]; const tableClientrollback = createAzureDataTablesClient( @@ -298,11 +318,10 @@ describe("table Entity APIs test", () => { } try { - const shouldExist = - await tableClientrollback.getEntity( - testEntities[0].partitionKey, - testEntities[0].rowKey - ); + const shouldExist = await tableClientrollback.getEntity( + testEntities[0].partitionKey, + testEntities[0].rowKey + ); assert.notStrictEqual(shouldExist, null, "We have an entity."); assert.notStrictEqual( shouldExist.myValue, @@ -320,13 +339,13 @@ describe("table Entity APIs test", () => { await tableClientrollback.deleteTable(); }); - it("Batch API should rollback upsert Entity transactions, @loki", async () => { + it("06. Batch API should rollback upsert Entity transactions, @loki", async () => { const partitionKey = createUniquePartitionKey(""); const tableNameDeleteError: string = getUniqueName("datatables"); - const testEntities: AzureDataTablesTestEntity[] = [ - createBasicEntityForTest(partitionKey), - createBasicEntityForTest(partitionKey), - createBasicEntityForTest(partitionKey) + const testEntities: TableTestEntity[] = [ + entityFactory.createBasicEntityForTest(partitionKey), + entityFactory.createBasicEntityForTest(partitionKey), + entityFactory.createBasicEntityForTest(partitionKey) ]; const tableClientrollback = createAzureDataTablesClient( @@ -354,7 +373,8 @@ describe("table Entity APIs test", () => { testEntities[0].myValue = "a new value"; testEntities[1].myValue = "a new value"; - const newUpsertEntity = createBasicEntityForTest(partitionKey); + const newUpsertEntity = + entityFactory.createBasicEntityForTest(partitionKey); newUpsertEntity.myValue = "ephemeral"; transactionUpdateThenError.upsertEntity(testEntities[0]); transactionUpdateThenError.upsertEntity(testEntities[1]); @@ -376,11 +396,10 @@ describe("table Entity APIs test", () => { } try { - const shouldExist = - await tableClientrollback.getEntity( - testEntities[0].partitionKey, - testEntities[0].rowKey - ); + const shouldExist = await tableClientrollback.getEntity( + testEntities[0].partitionKey, + testEntities[0].rowKey + ); assert.notStrictEqual(shouldExist, null, "We have an entity."); assert.notStrictEqual( shouldExist.myValue, @@ -398,7 +417,7 @@ describe("table Entity APIs test", () => { try { const shouldNotExist = - await tableClientrollback.getEntity( + await tableClientrollback.getEntity( newUpsertEntity.partitionKey, newUpsertEntity.rowKey ); @@ -414,13 +433,13 @@ describe("table Entity APIs test", () => { await tableClientrollback.deleteTable(); }); - it("Batch API should return valid batch failure index for Azure.Data.Tables, @loki", async () => { + it("07. Batch API should return valid batch failure index for Azure.Data.Tables, @loki", async () => { const partitionKey = createUniquePartitionKey(""); const tableNameDeleteError: string = getUniqueName("datatables"); - const testEntities: AzureDataTablesTestEntity[] = [ - createBasicEntityForTest(partitionKey), - createBasicEntityForTest(partitionKey), - createBasicEntityForTest(partitionKey) + const testEntities: TableTestEntity[] = [ + entityFactory.createBasicEntityForTest(partitionKey), + entityFactory.createBasicEntityForTest(partitionKey), + entityFactory.createBasicEntityForTest(partitionKey) ]; const tableClientrollback = createAzureDataTablesClient( @@ -458,10 +477,11 @@ describe("table Entity APIs test", () => { await tableClientrollback.deleteTable(); }); - it("Batch API Etag should be rolled back after transaction failure on update, @loki", async () => { + it("08. Batch API Etag should be rolled back after transaction failure on update, @loki", async () => { const partitionKey = createUniquePartitionKey(""); const tableNameDeleteError: string = getUniqueName("datatables"); - const singleTestEntity = createBasicEntityForTest(partitionKey); + const singleTestEntity = + entityFactory.createBasicEntityForTest(partitionKey); const tableClientrollback = createAzureDataTablesClient( testLocalAzuriteInstance, @@ -474,10 +494,10 @@ describe("table Entity APIs test", () => { singleTestEntity ); - const testEntities: AzureDataTablesTestEntity[] = [ - createBasicEntityForTest(partitionKey), - createBasicEntityForTest(partitionKey), - createBasicEntityForTest(partitionKey) + const testEntities: TableTestEntity[] = [ + entityFactory.createBasicEntityForTest(partitionKey), + entityFactory.createBasicEntityForTest(partitionKey), + entityFactory.createBasicEntityForTest(partitionKey) ]; const transaction = new TableTransaction(); @@ -520,11 +540,10 @@ describe("table Entity APIs test", () => { } try { - const shouldExist = - await tableClientrollback.getEntity( - testEntities[0].partitionKey, - testEntities[0].rowKey - ); + const shouldExist = await tableClientrollback.getEntity( + testEntities[0].partitionKey, + testEntities[0].rowKey + ); assert.notStrictEqual(shouldExist, null, "We have an entity."); assert.notStrictEqual( shouldExist.myValue, diff --git a/tests/table/apis/table.entity.azure.data-tables.test.ts b/tests/table/apis/table.entity.azure.data-tables.test.ts index 8520f8f7e..7b545ab6d 100644 --- a/tests/table/apis/table.entity.azure.data-tables.test.ts +++ b/tests/table/apis/table.entity.azure.data-tables.test.ts @@ -7,9 +7,9 @@ import { configLogger } from "../../../src/common/Logger"; import TableServer from "../../../src/table/TableServer"; import { getUniqueName } from "../../testutils"; import { - AzureDataTablesTestEntity, - createBasicEntityForTest -} from "../models/AzureDataTablesTestEntity"; + AzureDataTablesTestEntityFactory, + TableTestEntity +} from "../models/AzureDataTablesTestEntityFactory"; import { createAzureDataTablesClient, createTableServerForTestHttps, @@ -17,9 +17,9 @@ import { } from "../utils/table.entity.test.utils"; import { TestBooleanPropEntity } from "../models/TestBooleanPropEntity"; import { - createLargeEntityForTest, - LargeDataTablesTestEntity -} from "../models/LargeDataTablesTestEntity"; + LargeDataTablesTestEntityFactory, + LargeTableTestEntity +} from "../models/LargeDataTablesTestEntityFactory"; // Set true to enable debug log configLogger(false); // For convenience, we have a switch to control the use @@ -29,6 +29,9 @@ configLogger(false); // Azure Storage Connection String (using SAS or Key). const testLocalAzuriteInstance = true; +const entityFactory = new AzureDataTablesTestEntityFactory(); +const largeEntityFactory = new LargeDataTablesTestEntityFactory(); + describe("table Entity APIs test - using Azure/data-tables", () => { let server: TableServer; @@ -48,10 +51,10 @@ describe("table Entity APIs test - using Azure/data-tables", () => { ); await tableClient.createTable(); const partitionKey = createUniquePartitionKey(""); - const testEntities: AzureDataTablesTestEntity[] = [ - createBasicEntityForTest(partitionKey), - createBasicEntityForTest(partitionKey), - createBasicEntityForTest(partitionKey) + const testEntities: TableTestEntity[] = [ + entityFactory.createBasicEntityForTest(partitionKey), + entityFactory.createBasicEntityForTest(partitionKey), + entityFactory.createBasicEntityForTest(partitionKey) ]; const transaction = new TableTransaction(); for (const testEntity of testEntities) { @@ -162,8 +165,8 @@ describe("table Entity APIs test - using Azure/data-tables", () => { ); await tableClient.createTable(); const partitionKey = createUniquePartitionKey(""); - const testEntity: AzureDataTablesTestEntity = - createBasicEntityForTest(partitionKey); + const testEntity: TableTestEntity = + entityFactory.createBasicEntityForTest(partitionKey); const result = await tableClient.createEntity(testEntity); @@ -347,8 +350,8 @@ describe("table Entity APIs test - using Azure/data-tables", () => { getUniqueName("empty") ); const partitionKey = ""; - const testEntity: AzureDataTablesTestEntity = - createBasicEntityForTest(partitionKey); + const testEntity: TableTestEntity = + entityFactory.createBasicEntityForTest(partitionKey); testEntity.rowKey = ""; await tableClient.createTable({ requestOptions: { timeout: 60000 } }); @@ -367,11 +370,10 @@ describe("table Entity APIs test - using Azure/data-tables", () => { getUniqueName("percent") ); await tableClient.createTable(); - const percentPartitionEntity = createBasicEntityForTest("%percent"); + const percentPartitionEntity = + entityFactory.createBasicEntityForTest("%percent"); const insertedEntityHeaders = - await tableClient.createEntity( - percentPartitionEntity - ); + await tableClient.createEntity(percentPartitionEntity); assert.notStrictEqual( insertedEntityHeaders.etag, undefined, @@ -391,8 +393,8 @@ describe("table Entity APIs test - using Azure/data-tables", () => { const iterations = 99; await tableClient.createTable(); const partitionKey = createUniquePartitionKey(""); - const testEntities: AzureDataTablesTestEntity[] = []; - const testEntity = createBasicEntityForTest(partitionKey); + const testEntities: TableTestEntity[] = []; + const testEntity = entityFactory.createBasicEntityForTest(partitionKey); const mergeResults: any[] = []; const replaceResults: any[] = []; for (let i = 0; i < iterations; i++) { @@ -447,11 +449,10 @@ describe("table Entity APIs test - using Azure/data-tables", () => { getUniqueName("percent") ); await tableClient.createTable(); - const percentPartitionEntity = createBasicEntityForTest("%percent"); + const percentPartitionEntity = + entityFactory.createBasicEntityForTest("%percent"); const insertedEntityHeaders = - await tableClient.createEntity( - percentPartitionEntity - ); + await tableClient.createEntity(percentPartitionEntity); assert.notStrictEqual(insertedEntityHeaders.etag, undefined); const deleteEntityHeaders = await tableClient.deleteEntity( @@ -492,8 +493,8 @@ describe("table Entity APIs test - using Azure/data-tables", () => { ); await tableClient.createTable(); const partitionKey = createUniquePartitionKey(""); - const testEntity: AzureDataTablesTestEntity = - createBasicEntityForTest(partitionKey); + const testEntity: TableTestEntity = + entityFactory.createBasicEntityForTest(partitionKey); testEntity.binaryField = Buffer.alloc(64 * 1024 - delta); @@ -512,8 +513,8 @@ describe("table Entity APIs test - using Azure/data-tables", () => { ); await tableClient.createTable(); const partitionKey = createUniquePartitionKey(""); - const testEntity: AzureDataTablesTestEntity = - createBasicEntityForTest(partitionKey); + const testEntity: TableTestEntity = + entityFactory.createBasicEntityForTest(partitionKey); testEntity.binaryField = Buffer.alloc(64 * 1024 + delta); try { @@ -547,8 +548,8 @@ describe("table Entity APIs test - using Azure/data-tables", () => { ); await tableClient.createTable(); const partitionKey = createUniquePartitionKey(""); - const testEntity: AzureDataTablesTestEntity = - createBasicEntityForTest(partitionKey); + const testEntity: TableTestEntity = + entityFactory.createBasicEntityForTest(partitionKey); testEntity.myValue = testEntity.myValue.padEnd(1024 * 32 + 1, "a"); try { @@ -581,8 +582,8 @@ describe("table Entity APIs test - using Azure/data-tables", () => { ); await tableClient.createTable(); const partitionKey = createUniquePartitionKey(""); - const testEntity: AzureDataTablesTestEntity = - createBasicEntityForTest(partitionKey); + const testEntity: TableTestEntity = + entityFactory.createBasicEntityForTest(partitionKey); try { const result1 = await tableClient.createEntity(testEntity); @@ -620,12 +621,10 @@ describe("table Entity APIs test - using Azure/data-tables", () => { getUniqueName("percent") ); await tableClient.createTable(); - const percentRowEntity = createBasicEntityForTest("percent"); + const percentRowEntity = entityFactory.createBasicEntityForTest("percent"); percentRowEntity.rowKey = "%" + percentRowEntity.rowKey; const insertedEntityHeaders = - await tableClient.createEntity( - percentRowEntity - ); + await tableClient.createEntity(percentRowEntity); assert.notStrictEqual( insertedEntityHeaders.etag, undefined, @@ -642,8 +641,8 @@ describe("table Entity APIs test - using Azure/data-tables", () => { ); await tableClient.createTable(); const partitionKey = createUniquePartitionKey(""); - const testEntity: AzureDataTablesTestEntity = - createBasicEntityForTest(partitionKey); + const testEntity: TableTestEntity = + entityFactory.createBasicEntityForTest(partitionKey); try { const result1 = await tableClient.createEntity(testEntity); @@ -681,12 +680,11 @@ describe("table Entity APIs test - using Azure/data-tables", () => { getUniqueName("percent") ); await tableClient.createTable(); - const percentRowEntity = createBasicEntityForTest("percentRow"); + const percentRowEntity = + entityFactory.createBasicEntityForTest("percentRow"); percentRowEntity.rowKey = "%" + percentRowEntity.rowKey; const insertedEntityHeaders = - await tableClient.createEntity( - percentRowEntity - ); + await tableClient.createEntity(percentRowEntity); assert.notStrictEqual(insertedEntityHeaders.etag, undefined); const deleteEntityHeaders = await tableClient.deleteEntity( @@ -726,8 +724,8 @@ describe("table Entity APIs test - using Azure/data-tables", () => { ); await tableClient.createTable(); const partitionKey = createUniquePartitionKey(""); - const testEntity: LargeDataTablesTestEntity = - createLargeEntityForTest(partitionKey); + const testEntity: LargeTableTestEntity = + largeEntityFactory.createLargeEntityForTest(partitionKey); try { const result = await tableClient.createEntity(testEntity); @@ -801,10 +799,10 @@ describe("table Entity APIs test - using Azure/data-tables", () => { ); await tableClient.createTable(); const percentPartition = "%partition"; - const testEntities: AzureDataTablesTestEntity[] = [ - createBasicEntityForTest(percentPartition), - createBasicEntityForTest(percentPartition), - createBasicEntityForTest(percentPartition) + const testEntities: TableTestEntity[] = [ + entityFactory.createBasicEntityForTest(percentPartition), + entityFactory.createBasicEntityForTest(percentPartition), + entityFactory.createBasicEntityForTest(percentPartition) ]; const transaction = new TableTransaction(); for (const testEntity of testEntities) { @@ -821,15 +819,15 @@ describe("table Entity APIs test - using Azure/data-tables", () => { await tableClient.deleteTable(); }); - it("20. Should not merge entities with request body greater than 4 MB, @loki", async () => { + it("20. Should not merge entities with a size greater than 1 MB, @loki", async () => { const tableClient = createAzureDataTablesClient( testLocalAzuriteInstance, getUniqueName("longstrings") ); await tableClient.createTable(); const partitionKey = createUniquePartitionKey(""); - const testEntity: LargeDataTablesTestEntity = - createLargeEntityForTest(partitionKey); + const testEntity: LargeTableTestEntity = + largeEntityFactory.createLargeEntityForTest(partitionKey); testEntity.bigString01a = ""; try { @@ -847,15 +845,18 @@ describe("table Entity APIs test - using Azure/data-tables", () => { "We should not have updated the entity!" ); } catch (err: any) { + // the service returns HTTP Status 400 + // and + // "{\"odata.error\":{\"code\":\"EntityTooLarge\",\"message\":{\"lang\":\"en-US\",\"value\":\"The entity is larger than the maximum allowed size (1MB).\\nRequestId:fa37b1b6-e002-002e-3021-412111000000\\nTime:2023-02-15T09:37:02.4207423Z\"}}}" assert.strictEqual( err.statusCode, - 413, + 400, "We did not get the expected 413 error" ); assert.strictEqual( - err.message.match(/RequestBodyTooLarge/gi).length, + err.message.match(/EntityTooLarge/gi).length, 1, - "Did not match RequestBodyTooLarge" + "Did not match EntityTooLarge" ); } @@ -863,17 +864,17 @@ describe("table Entity APIs test - using Azure/data-tables", () => { }); // https://github.com/Azure/Azurite/issues/754 - it("21. Should create and delete entity using batch and RowKey starting with %, @loki", async () => { + it("21. Should create entities using batch and RowKey starting with %, @loki", async () => { const tableClient = createAzureDataTablesClient( testLocalAzuriteInstance, getUniqueName("percentBatch") ); await tableClient.createTable(); const percentPartition = "percentRowBatch"; - const testEntities: AzureDataTablesTestEntity[] = [ - createBasicEntityForTest(percentPartition), - createBasicEntityForTest(percentPartition), - createBasicEntityForTest(percentPartition) + const testEntities: TableTestEntity[] = [ + entityFactory.createBasicEntityForTest(percentPartition), + entityFactory.createBasicEntityForTest(percentPartition), + entityFactory.createBasicEntityForTest(percentPartition) ]; testEntities[0].rowKey = "%" + testEntities[0].rowKey; testEntities[1].rowKey = "%" + testEntities[1].rowKey; @@ -900,8 +901,8 @@ describe("table Entity APIs test - using Azure/data-tables", () => { ); await tableClient.createTable(); const partitionKey = createUniquePartitionKey(""); - const testEntity: LargeDataTablesTestEntity = - createLargeEntityForTest(partitionKey); + const testEntity: LargeTableTestEntity = + largeEntityFactory.createLargeEntityForTest(partitionKey); testEntity.bigString01a = ""; try { @@ -921,13 +922,13 @@ describe("table Entity APIs test - using Azure/data-tables", () => { } catch (err: any) { assert.strictEqual( err.statusCode, - 413, - "We did not get the expected 413 error" + 400, + "We did not get the expected 400 error" ); assert.strictEqual( - err.message.match(/RequestBodyTooLarge/gi).length, + err.message.match(/EntityTooLarge/gi).length, 1, - "Did not match RequestBodyTooLarge" + "Did not match EntityTooLarge" ); } @@ -940,10 +941,10 @@ describe("table Entity APIs test - using Azure/data-tables", () => { getUniqueName("comma") ); await tableClient.createTable(); - const commaRowEntity = createBasicEntityForTest("comma"); + const commaRowEntity = entityFactory.createBasicEntityForTest("comma"); commaRowEntity.rowKey = "Commas,InRow,Keys"; const insertedEntityHeaders = - await tableClient.createEntity(commaRowEntity); + await tableClient.createEntity(commaRowEntity); assert.notStrictEqual( insertedEntityHeaders.etag, undefined, @@ -960,7 +961,7 @@ describe("table Entity APIs test - using Azure/data-tables", () => { ); await tableClient.createTable(); const partitionKey = createUniquePartitionKey("nullable"); - const testEntity = createBasicEntityForTest(partitionKey); + const testEntity = entityFactory.createBasicEntityForTest(partitionKey); testEntity.nullableString = null; try { @@ -978,8 +979,8 @@ describe("table Entity APIs test - using Azure/data-tables", () => { ); } - const entity: AzureDataTablesTestEntity = - await tableClient.getEntity( + const entity: TableTestEntity = + await tableClient.getEntity( testEntity.partitionKey, testEntity.rowKey ); @@ -1000,7 +1001,7 @@ describe("table Entity APIs test - using Azure/data-tables", () => { ); await tableClient.createTable(); const partitionKey = createUniquePartitionKey("odatadate"); - const testEntity = createBasicEntityForTest(partitionKey); + const testEntity = entityFactory.createBasicEntityForTest(partitionKey); testEntity.nullableString = null; try { @@ -1018,7 +1019,7 @@ describe("table Entity APIs test - using Azure/data-tables", () => { ); } - const entity: any = await tableClient.getEntity( + const entity: any = await tableClient.getEntity( testEntity.partitionKey, testEntity.rowKey, { @@ -1038,4 +1039,245 @@ describe("table Entity APIs test - using Azure/data-tables", () => { await tableClient.deleteTable(); }); + + it("26. Should create, get and delete entities using batch and RowKey containing numbers and %, @loki", async () => { + const tableClient = createAzureDataTablesClient( + testLocalAzuriteInstance, + getUniqueName("percentBatch") + ); + await tableClient.createTable(); + const percentPartition = "percentRowBatch"; + const testEntities: TableTestEntity[] = [ + // { rowKey: "@r%25o%0123512512356", partitionKey: percentPartition }, + // { rowKey: "r%25131463146346", partitionKey: percentPartition }, + // { rowKey: "@r%25o%21235136314613", partitionKey: percentPartition } + entityFactory.createBasicEntityForTest(percentPartition), + entityFactory.createBasicEntityForTest(percentPartition), + entityFactory.createBasicEntityForTest(percentPartition) + ]; + testEntities[0].rowKey = testEntities[0].rowKey.replace("row", "@r%25o%"); + testEntities[1].rowKey = testEntities[1].rowKey.replace("row", "r%25"); + testEntities[2].rowKey = testEntities[2].rowKey.replace("row", "@r%25o%"); + const transaction = new TableTransaction(); + for (const testEntity of testEntities) { + transaction.createEntity(testEntity); + } + + try { + const result = await tableClient.submitTransaction(transaction.actions); + assert.ok(result.subResponses[0].rowKey); + } catch (err: any) { + assert.strictEqual(err, undefined, `We failed to create with ${err}`); + } + + // validate that we successfully created each entity, + // and that the format of the row key was not changed by serialization + try { + const entity0 = await tableClient.getEntity( + testEntities[0].partitionKey, + testEntities[0].rowKey + ); + const entity1 = await tableClient.getEntity( + testEntities[1].partitionKey, + testEntities[1].rowKey + ); + const entity2 = await tableClient.getEntity( + testEntities[2].partitionKey, + testEntities[2].rowKey + ); + assert.strictEqual(entity0.rowKey, testEntities[0].rowKey); + assert.strictEqual(entity1.rowKey, testEntities[1].rowKey); + assert.strictEqual(entity2.rowKey, testEntities[2].rowKey); + } catch (err: any) { + assert.strictEqual(err, undefined, `We failed to retrieve with ${err}`); + } + + // now delete the entities and ensure that delete path is valid + const transaction2 = new TableTransaction(); + transaction2.deleteEntity( + testEntities[0].partitionKey, + testEntities[0].rowKey + ); + transaction2.deleteEntity( + testEntities[1].partitionKey, + testEntities[1].rowKey + ); + transaction2.deleteEntity( + testEntities[2].partitionKey, + testEntities[2].rowKey + ); + + try { + const result = await tableClient.submitTransaction(transaction2.actions); + assert.notStrictEqual(result, undefined); + assert.strictEqual( + result.status, + 202, + "We did not get a 202 on batch delete" + ); + } catch (err: any) { + assert.strictEqual(err, undefined, `We failed to delete with ${err}`); + } + + await tableClient.deleteTable(); + }); + + it("27. Should create, get and delete entities using batch and PartitionKey containing numbers and %, @loki", async () => { + const tableClient = createAzureDataTablesClient( + testLocalAzuriteInstance, + getUniqueName("percentBatch") + ); + await tableClient.createTable(); + const percentPartition = "percent%25Batch"; + const testEntities: TableTestEntity[] = [ + entityFactory.createBasicEntityForTest(percentPartition), + entityFactory.createBasicEntityForTest(percentPartition), + entityFactory.createBasicEntityForTest(percentPartition) + ]; + testEntities[0].rowKey = testEntities[0].rowKey.replace("row", "row%"); + testEntities[1].rowKey = testEntities[1].rowKey.replace("row", "row%"); + testEntities[2].rowKey = testEntities[2].rowKey.replace("row", "r%25"); + const transaction = new TableTransaction(); + for (const testEntity of testEntities) { + transaction.createEntity(testEntity); + } + + try { + const result = await tableClient.submitTransaction(transaction.actions); + assert.ok(result.subResponses[0].rowKey); + } catch (err: any) { + assert.strictEqual(err, undefined, `We failed to create with ${err}`); + } + + // validate that we successfully created each entity, + // and that the format of the row key was not changed by serialization + try { + const entity0 = await tableClient.getEntity( + testEntities[0].partitionKey, + testEntities[0].rowKey + ); + const entity1 = await tableClient.getEntity( + testEntities[1].partitionKey, + testEntities[1].rowKey + ); + const entity2 = await tableClient.getEntity( + testEntities[2].partitionKey, + testEntities[2].rowKey + ); + assert.strictEqual(entity0.rowKey, testEntities[0].rowKey); + assert.strictEqual(entity1.rowKey, testEntities[1].rowKey); + assert.strictEqual(entity2.rowKey, testEntities[2].rowKey); + } catch (err: any) { + assert.strictEqual(err, undefined, `We failed to retrieve with ${err}`); + } + + // now delete the entities and ensure that delete path is valid + const transaction2 = new TableTransaction(); + transaction2.deleteEntity( + testEntities[0].partitionKey, + testEntities[0].rowKey + ); + transaction2.deleteEntity( + testEntities[1].partitionKey, + testEntities[1].rowKey + ); + transaction2.deleteEntity( + testEntities[2].partitionKey, + testEntities[2].rowKey + ); + + try { + const result = await tableClient.submitTransaction(transaction2.actions); + assert.notStrictEqual(result, undefined); + assert.strictEqual( + result.status, + 202, + "We did not get a 202 on batch delete" + ); + } catch (err: any) { + assert.strictEqual(err, undefined, `We failed to delete with ${err}`); + } + + await tableClient.deleteTable(); + }); + + it("28. Should create, get and delete entities using batch and PartitionKey with complex form, @loki", async () => { + const tableClient = createAzureDataTablesClient( + testLocalAzuriteInstance, + getUniqueName("percentBatch") + ); + await tableClient.createTable(); + const percentPartition = + "@DurableTask.AzureStorage.Tests.AzureStorageScenarioTests+Orchestrations+AutoStartOrchestration+Responder"; + const testEntities: TableTestEntity[] = [ + entityFactory.createBasicEntityForTest(percentPartition), + entityFactory.createBasicEntityForTest(percentPartition), + entityFactory.createBasicEntityForTest(percentPartition) + ]; + testEntities[0].rowKey = testEntities[0].rowKey.replace("row", "row%"); + testEntities[1].rowKey = testEntities[1].rowKey.replace("row", "row%"); + testEntities[2].rowKey = testEntities[2].rowKey.replace("row", "r%25"); + const transaction = new TableTransaction(); + for (const testEntity of testEntities) { + transaction.createEntity(testEntity); + } + + try { + const result = await tableClient.submitTransaction(transaction.actions); + assert.ok(result.subResponses[0].rowKey); + } catch (err: any) { + assert.strictEqual(err, undefined, `We failed to create with ${err}`); + } + + // validate that we successfully created each entity, + // and that the format of the row key was not changed by serialization + try { + const entity0 = await tableClient.getEntity( + testEntities[0].partitionKey, + testEntities[0].rowKey + ); + const entity1 = await tableClient.getEntity( + testEntities[1].partitionKey, + testEntities[1].rowKey + ); + const entity2 = await tableClient.getEntity( + testEntities[2].partitionKey, + testEntities[2].rowKey + ); + assert.strictEqual(entity0.rowKey, testEntities[0].rowKey); + assert.strictEqual(entity1.rowKey, testEntities[1].rowKey); + assert.strictEqual(entity2.rowKey, testEntities[2].rowKey); + } catch (err: any) { + assert.strictEqual(err, undefined, `We failed to retrieve with ${err}`); + } + + // now delete the entities and ensure that delete path is valid + const transaction2 = new TableTransaction(); + transaction2.deleteEntity( + testEntities[0].partitionKey, + testEntities[0].rowKey + ); + transaction2.deleteEntity( + testEntities[1].partitionKey, + testEntities[1].rowKey + ); + transaction2.deleteEntity( + testEntities[2].partitionKey, + testEntities[2].rowKey + ); + + try { + const result = await tableClient.submitTransaction(transaction2.actions); + assert.notStrictEqual(result, undefined); + assert.strictEqual( + result.status, + 202, + "We did not get a 202 on batch delete" + ); + } catch (err: any) { + assert.strictEqual(err, undefined, `We failed to delete with ${err}`); + } + + await tableClient.deleteTable(); + }); }); diff --git a/tests/table/apis/table.entity.issues.test.ts b/tests/table/apis/table.entity.issues.test.ts index bc6af96a6..6e4b91a1e 100644 --- a/tests/table/apis/table.entity.issues.test.ts +++ b/tests/table/apis/table.entity.issues.test.ts @@ -15,9 +15,9 @@ import { createUniquePartitionKey } from "../utils/table.entity.test.utils"; import { - AzureDataTablesTestEntity, - createBasicEntityForTest -} from "../models/AzureDataTablesTestEntity"; + AzureDataTablesTestEntityFactory, + TableTestEntity +} from "../models/AzureDataTablesTestEntityFactory"; // Set true to enable debug log configLogger(false); @@ -28,6 +28,8 @@ configLogger(false); // Azure Storage Connection String (using SAS or Key). const testLocalAzuriteInstance = true; +const entityFactory = new AzureDataTablesTestEntityFactory(); + describe("table Entity APIs test : Issues", () => { let server: TableServer; const tableName: string = getUniqueName("datatables"); @@ -49,11 +51,11 @@ describe("table Entity APIs test : Issues", () => { // from issue #1229 [ - "W/\"wrong\"", + 'W/"wrong"', "W/\"datetime'2015-01-01T23%3A14%3A33.4980000Z'\"", - "w/\"wrong\"", - "w/\"datetime'2015-01-01T23%3A14%3A33.4980000Z'\"", - ].forEach(etag => { + 'w/"wrong"', + "w/\"datetime'2015-01-01T23%3A14%3A33.4980000Z'\"" + ].forEach((etag) => { it(`should allow any valid weak etag <${etag}>, @loki`, async () => { const partitionKey = createUniquePartitionKey(); const tableClient = createAzureDataTablesClient( @@ -87,12 +89,12 @@ describe("table Entity APIs test : Issues", () => { // from issue #1229 [ - "\"wrong\"", + '"wrong"', "\"datetime'2015-01-01T23%3A14%3A33.4980000Z'\"", "wrong", "datetime'2015-01-01T23%3A14%3A33.4980000Z'", - "\"", - ].forEach(etag => { + '"' + ].forEach((etag) => { it(`should reject invalid or strong etag <${etag}>, @loki`, async () => { const partitionKey = createUniquePartitionKey(); const tableClient = createAzureDataTablesClient( @@ -304,15 +306,15 @@ describe("table Entity APIs test : Issues", () => { ); await tableClient.createTable(); const entityWithEmptyPartitionKey = - createBasicEntityForTest(emptyPartitionKey); + entityFactory.createBasicEntityForTest(emptyPartitionKey); - const result = await tableClient.createEntity( + const result = await tableClient.createEntity( entityWithEmptyPartitionKey ); assert.notStrictEqual(result.etag, undefined); const entityWithEmptyPartitionKeyRes = - await tableClient.getEntity( + await tableClient.getEntity( "", entityWithEmptyPartitionKey.rowKey ); @@ -335,14 +337,12 @@ describe("table Entity APIs test : Issues", () => { }); // deliberately being more explicit in the resolution of the promise and errors - let res: AzureDataTablesTestEntity | undefined; + let res: TableTestEntity | undefined; try { res = (await tableClient.getEntity( "", entityWithEmptyPartitionKey.rowKey - )) as GetTableEntityResponse< - TableEntityResult - >; + )) as GetTableEntityResponse>; } catch (deleteError: any) { assert.strictEqual(deleteError.statusCode, 404); } finally { @@ -363,19 +363,19 @@ describe("table Entity APIs test : Issues", () => { tableName ); await tableClient.createTable(); - const entityWithEmptyRowKey = createBasicEntityForTest( + const entityWithEmptyRowKey = entityFactory.createBasicEntityForTest( partitionKeyForEmptyRowKey ); entityWithEmptyRowKey.rowKey = ""; - const result = await tableClient.createEntity( + const result = await tableClient.createEntity( entityWithEmptyRowKey ); assert.notStrictEqual(result.etag, undefined); const entityWithEmptyRowKeyRes = - await tableClient.getEntity( + await tableClient.getEntity( partitionKeyForEmptyRowKey, "" ); @@ -398,14 +398,12 @@ describe("table Entity APIs test : Issues", () => { }); // deliberately being more explicit in the resolution of the promise and errors - let res: AzureDataTablesTestEntity | undefined; + let res: TableTestEntity | undefined; try { res = (await tableClient.getEntity( partitionKeyForEmptyRowKey, "" - )) as GetTableEntityResponse< - TableEntityResult - >; + )) as GetTableEntityResponse>; } catch (deleteError: any) { assert.strictEqual(deleteError.statusCode, 404); } finally { diff --git a/tests/table/apis/table.entity.query.test.ts b/tests/table/apis/table.entity.query.test.ts index b779c4cc8..09a0062ca 100644 --- a/tests/table/apis/table.entity.query.test.ts +++ b/tests/table/apis/table.entity.query.test.ts @@ -6,9 +6,9 @@ import { configLogger } from "../../../src/common/Logger"; import TableServer from "../../../src/table/TableServer"; import { getUniqueName } from "../../testutils"; import { - AzureDataTablesTestEntity, - createBasicEntityForTest -} from "../models/AzureDataTablesTestEntity"; + AzureDataTablesTestEntityFactory, + TableTestEntity +} from "../models/AzureDataTablesTestEntityFactory"; import { createAzureDataTablesClient, createTableServerForQueryTestHttps, @@ -25,6 +25,8 @@ configLogger(false); // Azure Storage Connection String (using SAS or Key). const testLocalAzuriteInstance = true; +const entityFactory = new AzureDataTablesTestEntityFactory(); + describe("table Entity APIs test - using Azure/data-tables", () => { let server: TableServer; @@ -40,24 +42,28 @@ describe("table Entity APIs test - using Azure/data-tables", () => { }); after(async () => { - await server.close(); + try { + await server.close(); + } catch { + // we don't care + } }); - it("should find an int as a number, @loki", async () => { + it("01. should find an int as a number, @loki", async () => { const tableClient = createAzureDataTablesClient( testLocalAzuriteInstance, getUniqueName("int") ); const partitionKey = createUniquePartitionKey(""); - const testEntity: AzureDataTablesTestEntity = - createBasicEntityForTest(partitionKey); + const testEntity: TableTestEntity = + entityFactory.createBasicEntityForTest(partitionKey); await tableClient.createTable({ requestOptions: { timeout: 60000 } }); const result = await tableClient.createEntity(testEntity); assert.ok(result.etag); const queryResult = await tableClient - .listEntities({ + .listEntities({ queryOptions: { filter: `PartitionKey eq '${partitionKey}' and int32Field eq 54321` } @@ -67,21 +73,21 @@ describe("table Entity APIs test - using Azure/data-tables", () => { await tableClient.deleteTable(); }); - it("should find a long int, @loki", async () => { + it("02. should find a long int, @loki", async () => { const tableClient = createAzureDataTablesClient( testLocalAzuriteInstance, getUniqueName("longint") ); const partitionKey = createUniquePartitionKey(""); - const testEntity: AzureDataTablesTestEntity = - createBasicEntityForTest(partitionKey); + const testEntity: TableTestEntity = + entityFactory.createBasicEntityForTest(partitionKey); await tableClient.createTable({ requestOptions: { timeout: 60000 } }); const result = await tableClient.createEntity(testEntity); assert.ok(result.etag); const queryResult = await tableClient - .listEntities({ + .listEntities({ queryOptions: { filter: `PartitionKey eq '${partitionKey}' and int64Field eq 12345L` } @@ -92,21 +98,21 @@ describe("table Entity APIs test - using Azure/data-tables", () => { await tableClient.deleteTable(); }); - it("should find an entity using a partition key with multiple spaces, @loki", async () => { + it("03. should find an entity using a partition key with multiple spaces, @loki", async () => { const tableClient = createAzureDataTablesClient( testLocalAzuriteInstance, getUniqueName("query1s") ); const partitionKey = createUniquePartitionKey("") + " with spaces"; - const testEntity: AzureDataTablesTestEntity = - createBasicEntityForTest(partitionKey); + const testEntity: TableTestEntity = + entityFactory.createBasicEntityForTest(partitionKey); await tableClient.createTable({ requestOptions: { timeout: 60000 } }); const result = await tableClient.createEntity(testEntity); assert.ok(result.etag); const queryResult = await tableClient - .listEntities({ + .listEntities({ queryOptions: { filter: `PartitionKey eq '${partitionKey}'` } @@ -117,7 +123,7 @@ describe("table Entity APIs test - using Azure/data-tables", () => { await tableClient.deleteTable(); }); - it("should provide a complete query result when using query entities by page, @loki", async () => { + it("04. should provide a complete query result when using query entities by page, @loki", async () => { const tableClient = createAzureDataTablesClient( testLocalAzuriteInstance, getUniqueName("querybypage") @@ -165,7 +171,7 @@ describe("table Entity APIs test - using Azure/data-tables", () => { await tableClient.deleteTable(); }); - it("should return the correct number of results querying with a timestamp or different SDK whitespacing behaviours, @loki", async () => { + it("05. should return the correct number of results querying with a timestamp or different SDK whitespacing behaviours, @loki", async () => { const tableClient = createAzureDataTablesClient( testLocalAzuriteInstance, getUniqueName("sdkspace") @@ -256,7 +262,7 @@ describe("table Entity APIs test - using Azure/data-tables", () => { await tableClient.deleteTable(); }); - it("should return the correct number of results querying with a boolean field regardless of whitespacing behaviours, @loki", async () => { + it("06. should return the correct number of results querying with a boolean field regardless of whitespacing behaviours, @loki", async () => { const tableClient = createAzureDataTablesClient( testLocalAzuriteInstance, getUniqueName("bool") @@ -341,7 +347,7 @@ describe("table Entity APIs test - using Azure/data-tables", () => { await tableClient.deleteTable(); }); - it("should return the correct number of results querying with an int64 field regardless of whitespacing behaviours, @loki", async () => { + it("07. should return the correct number of results querying with an int64 field regardless of whitespacing behaviours, @loki", async () => { const tableClient = createAzureDataTablesClient( testLocalAzuriteInstance, getUniqueName("int64") @@ -352,9 +358,8 @@ describe("table Entity APIs test - using Azure/data-tables", () => { const timestamp = new Date(); timestamp.setDate(timestamp.getDate() + 1); for (let i = 0; i < totalItems; i++) { - const testEntity: AzureDataTablesTestEntity = createBasicEntityForTest( - partitionKeyForQueryTest - ); + const testEntity: TableTestEntity = + entityFactory.createBasicEntityForTest(partitionKeyForQueryTest); testEntity.int64Field = { value: `${i}`, type: "Int64" }; const result = await tableClient.createEntity(testEntity); assert.notStrictEqual(result.etag, undefined); @@ -391,11 +396,11 @@ describe("table Entity APIs test - using Azure/data-tables", () => { ]; for (const queryTest of queriesAndExpectedResult) { - const entities = tableClient.listEntities({ + const entities = tableClient.listEntities({ queryOptions: queryTest.queryOptions, disableTypeConversion: true }); - let all: AzureDataTablesTestEntity[] = []; + let all: TableTestEntity[] = []; for await (const entity of entities.byPage({ maxPageSize })) { @@ -418,7 +423,7 @@ describe("table Entity APIs test - using Azure/data-tables", () => { await tableClient.deleteTable(); }); - it("should return the correct number of results querying with a double field regardless of whitespacing behaviours, @loki", async () => { + it("08. should return the correct number of results querying with a double field regardless of whitespacing behaviours, @loki", async () => { const tableClient = createAzureDataTablesClient( testLocalAzuriteInstance, getUniqueName("datatables") @@ -429,9 +434,8 @@ describe("table Entity APIs test - using Azure/data-tables", () => { const timestamp = new Date(); timestamp.setDate(timestamp.getDate() + 1); for (let i = 0; i < totalItems; i++) { - const testEntity: AzureDataTablesTestEntity = createBasicEntityForTest( - partitionKeyForQueryTest - ); + const testEntity: TableTestEntity = + entityFactory.createBasicEntityForTest(partitionKeyForQueryTest); const result = await tableClient.createEntity(testEntity); assert.notStrictEqual(result.etag, undefined); } @@ -471,10 +475,10 @@ describe("table Entity APIs test - using Azure/data-tables", () => { } ]; for (const queryTest of queriesAndExpectedResult) { - const entities = tableClient.listEntities({ + const entities = tableClient.listEntities({ queryOptions: queryTest.queryOptions }); - let all: AzureDataTablesTestEntity[] = []; + let all: TableTestEntity[] = []; for await (const entity of entities.byPage({ maxPageSize })) { @@ -496,7 +500,7 @@ describe("table Entity APIs test - using Azure/data-tables", () => { await tableClient.deleteTable(); }); - it("should return the correct number of results querying with a double field containing a single digit number regardless of whitespacing behaviours, @loki", async () => { + it("09. should return the correct number of results querying with a double field containing a single digit number regardless of whitespacing behaviours, @loki", async () => { const tableClient = createAzureDataTablesClient( testLocalAzuriteInstance, getUniqueName("datatables") @@ -507,9 +511,8 @@ describe("table Entity APIs test - using Azure/data-tables", () => { const timestamp = new Date(); timestamp.setDate(timestamp.getDate() + 1); for (let i = 0; i < totalItems; i++) { - const testEntity: AzureDataTablesTestEntity = createBasicEntityForTest( - partitionKeyForQueryTest - ); + const testEntity: TableTestEntity = + entityFactory.createBasicEntityForTest(partitionKeyForQueryTest); testEntity.doubleField = { value: 5, type: "Double" }; const result = await tableClient.createEntity(testEntity); assert.notStrictEqual(result.etag, undefined); @@ -556,10 +559,10 @@ describe("table Entity APIs test - using Azure/data-tables", () => { } ]; for (const queryTest of queriesAndExpectedResult) { - const entities = tableClient.listEntities({ + const entities = tableClient.listEntities({ queryOptions: queryTest.queryOptions }); - let all: AzureDataTablesTestEntity[] = []; + let all: TableTestEntity[] = []; for await (const entity of entities.byPage({ maxPageSize })) { @@ -581,7 +584,7 @@ describe("table Entity APIs test - using Azure/data-tables", () => { await tableClient.deleteTable(); }); - it("should error on query with invalid filter string, @loki", async () => { + it("10. should error on query with invalid filter string, @loki", async () => { const tableClient = createAzureDataTablesClient( testLocalAzuriteInstance, getUniqueName("dataTables") @@ -592,9 +595,8 @@ describe("table Entity APIs test - using Azure/data-tables", () => { const timestamp = new Date(); timestamp.setDate(timestamp.getDate() + 1); for (let i = 0; i < totalItems; i++) { - const testEntity: AzureDataTablesTestEntity = createBasicEntityForTest( - partitionKeyForQueryTest - ); + const testEntity: TableTestEntity = + entityFactory.createBasicEntityForTest(partitionKeyForQueryTest); testEntity.doubleField = { value: 5, type: "Double" }; const result = await tableClient.createEntity(testEntity); assert.notStrictEqual(result.etag, undefined); @@ -648,12 +650,12 @@ describe("table Entity APIs test - using Azure/data-tables", () => { } ]; for (const queryTest of queriesAndExpectedResult) { - const entities = tableClient.listEntities({ + const entities = tableClient.listEntities({ queryOptions: queryTest.queryOptions }); try { - let all: AzureDataTablesTestEntity[] = []; + let all: TableTestEntity[] = []; for await (const entity of entities.byPage({ maxPageSize })) { @@ -679,7 +681,7 @@ describe("table Entity APIs test - using Azure/data-tables", () => { await tableClient.deleteTable(); }); - it("should correctly insert and query entities using special values using batch api", async () => { + it("11. should correctly insert and query entities using special values using batch api", async () => { const tableClient = createAzureDataTablesClient( testLocalAzuriteInstance, getUniqueName("decodeURI") @@ -698,9 +700,8 @@ describe("table Entity APIs test - using Azure/data-tables", () => { ]; let testsCompleted = 0; for (const valToTest of valuesForTest) { - const testEntity: AzureDataTablesTestEntity = createBasicEntityForTest( - partitionKeyForQueryTest - ); + const testEntity: TableTestEntity = + entityFactory.createBasicEntityForTest(partitionKeyForQueryTest); testEntity.myValue = valToTest; const transaction = new TableTransaction(); transaction.createEntity(testEntity); @@ -714,12 +715,12 @@ describe("table Entity APIs test - using Azure/data-tables", () => { const maxPageSize = 10; - const entities = tableClient.listEntities({ + const entities = tableClient.listEntities({ queryOptions: { filter: odata`(PartitionKey eq ${partitionKeyForQueryTest}) and (myValue eq ${valToTest})` } }); - let all: AzureDataTablesTestEntity[] = []; + let all: TableTestEntity[] = []; for await (const entity of entities.byPage({ maxPageSize })) { @@ -741,7 +742,7 @@ describe("table Entity APIs test - using Azure/data-tables", () => { await tableClient.deleteTable(); }); - it("should correctly return results for query on a binary property, @loki", async () => { + it("12. should correctly return results for query on a binary property, @loki", async () => { const tableClient = createAzureDataTablesClient( testLocalAzuriteInstance, getUniqueName("binquery") @@ -752,7 +753,9 @@ describe("table Entity APIs test - using Azure/data-tables", () => { const timestamp = new Date(); timestamp.setDate(timestamp.getDate() + 1); for (let i = 0; i < totalItems; i++) { - const entity = createBasicEntityForTest(partitionKeyForQueryTest); + const entity = entityFactory.createBasicEntityForTest( + partitionKeyForQueryTest + ); if (i % 2 === 0) { entity.binaryField = Buffer.from("binaryData"); // should equal YmluYXJ5RGF0YQ== } @@ -799,7 +802,7 @@ describe("table Entity APIs test - using Azure/data-tables", () => { await tableClient.deleteTable(); }); - it("should find both old and new guids (backwards compatible) when using guid type, @loki", async () => { + it("13. should find both old and new guids (backwards compatible) when using guid type, @loki", async () => { const tableClient = createAzureDataTablesClient( testLocalAzuriteInstance, "reproTable" @@ -809,24 +812,45 @@ describe("table Entity APIs test - using Azure/data-tables", () => { await tableClient.createTable(); const timestamp = new Date(); timestamp.setDate(timestamp.getDate() + 1); - const guidEntities: AzureDataTablesTestEntity[] = []; + const guidEntities: TableTestEntity[] = []; const guidFromOldDB = "5d62a508-f0f7-45bc-be10-4b192d7fed2d"; - const dupOldGuid = createBasicEntityForTest(partitionKeyForQueryTest); + const getResult1 = await tableClient.getEntity( + partitionKeyForQueryTest, + "1" + ); + assert.notStrictEqual(getResult1.etag, undefined); + assert.strictEqual( + getResult1.timestamp, + "2022-06-24T15:50:57.055Z", + "Did not match the timestamp on the legacy schema entity!" + ); + + const dupOldGuid = entityFactory.createBasicEntityForTest( + partitionKeyForQueryTest + ); dupOldGuid.guidField.value = guidFromOldDB; + dupOldGuid.myValue = "I am the new format GUID entry!"; const dupResult = await tableClient.createEntity(dupOldGuid); assert.notStrictEqual(dupResult.etag, undefined); - /// Edwin quick test remove afterwards! - const getResult = await tableClient.getEntity( + + const getResult = await tableClient.getEntity( dupOldGuid.partitionKey, dupOldGuid.rowKey ); assert.notStrictEqual(getResult.etag, undefined); - /// Edwin quick test remove afterwards! + assert.strictEqual( + getResult.myValue, + "I am the new format GUID entry!", + "New Guid entity not created as expected!" + ); + guidEntities.push(dupOldGuid); for (let i = 1; i < totalItems; i++) { - const entity = createBasicEntityForTest(partitionKeyForQueryTest); + const entity = entityFactory.createBasicEntityForTest( + partitionKeyForQueryTest + ); entity.guidField.value = uuid.v4(); // The chances of hitting a duplicate GUID are extremely low // will only affect our pipelines in dev @@ -838,14 +862,16 @@ describe("table Entity APIs test - using Azure/data-tables", () => { let testsCompleted = 0; const queriesAndExpectedResult = [ { + index: 0, queryOptions: { filter: odata`(PartitionKey eq ${partitionKeyForQueryTest}) and (guidField eq guid'${guidFromOldDB}')` }, expectedResult: 2, // we expect the old GUID to be found for backwards compatability and the one we just inserted // not sure that this is the right behavior - expectedValue: guidEntities[0].guidField.value + expectedValue: guidFromOldDB }, { + index: 1, queryOptions: { filter: odata`(PartitionKey eq ${partitionKeyForQueryTest}) and (guidField eq guid'${guidEntities[1].guidField.value}')` }, @@ -853,6 +879,7 @@ describe("table Entity APIs test - using Azure/data-tables", () => { expectedValue: guidEntities[1].guidField.value }, { + index: 2, queryOptions: { filter: odata`(PartitionKey eq ${partitionKeyForQueryTest})and (guidField eq ${guidEntities[1].guidField.value})` }, @@ -860,6 +887,7 @@ describe("table Entity APIs test - using Azure/data-tables", () => { expectedValue: undefined }, { + index: 3, queryOptions: { filter: odata`(PartitionKey eq ${partitionKeyForQueryTest}) and(guidField eq guid'${guidEntities[8].guidField.value}')` }, @@ -867,6 +895,7 @@ describe("table Entity APIs test - using Azure/data-tables", () => { expectedValue: guidEntities[8].guidField.value }, { + index: 4, queryOptions: { filter: odata`(PartitionKey eq ${partitionKeyForQueryTest})and(guidField eq '${guidEntities[8].guidField.value}')` }, @@ -876,10 +905,10 @@ describe("table Entity APIs test - using Azure/data-tables", () => { ]; for (const queryTest of queriesAndExpectedResult) { - const entities = tableClient.listEntities({ + const entities = tableClient.listEntities({ queryOptions: queryTest.queryOptions }); - let all: AzureDataTablesTestEntity[] = []; + let all: TableTestEntity[] = []; for await (const entity of entities.byPage({ maxPageSize })) { @@ -894,7 +923,7 @@ describe("table Entity APIs test - using Azure/data-tables", () => { assert.strictEqual( all[0].guidField.value, queryTest.expectedValue, - `Value ${all[0].guidField.value} was not equal to ${queryTest.expectedValue} with query ${queryTest.queryOptions.filter}` + `Test ${queryTest.index}: Guid value ${all[0].guidField.value} was not equal to ${queryTest.expectedValue} with query ${queryTest.queryOptions.filter}` ); } else { assert.strictEqual( @@ -908,9 +937,9 @@ describe("table Entity APIs test - using Azure/data-tables", () => { } assert.strictEqual(testsCompleted, queriesAndExpectedResult.length); await tableClient.deleteTable(); - }); + }); - it("should work correctly when query filter contains true or false, @loki", async () => { + it("14. should work correctly when query filter contains true or false, @loki", async () => { const tableClient = createAzureDataTablesClient( testLocalAzuriteInstance, getUniqueName("querywithbool") @@ -941,10 +970,14 @@ describe("table Entity APIs test - using Azure/data-tables", () => { all = [...all, ...entity]; } assert.strictEqual(all.length, 2); - all.forEach((entity) => - { - assert.ok(entity.partitionKey === `${partitionKeyForQueryTest}3` || ((entity.partitionKey === `${partitionKeyForQueryTest}1` || entity.partitionKey === `${partitionKeyForQueryTest}2`) && entity.rowKey === '1' )) - }) + all.forEach((entity) => { + assert.ok( + entity.partitionKey === `${partitionKeyForQueryTest}3` || + ((entity.partitionKey === `${partitionKeyForQueryTest}1` || + entity.partitionKey === `${partitionKeyForQueryTest}2`) && + entity.rowKey === "1") + ); + }); await tableClient.deleteTable(); }); }); diff --git a/tests/table/apis/table.entity.rest.test.ts b/tests/table/apis/table.entity.rest.test.ts index a7610e761..fa6df95b6 100644 --- a/tests/table/apis/table.entity.rest.test.ts +++ b/tests/table/apis/table.entity.rest.test.ts @@ -979,6 +979,51 @@ describe("table Entity APIs REST tests", () => { "Etag and Timestamp value must match" ); }); + + it("Should be able to handle a batch request format from Azure-Storage/9.3.2, @loki", async () => { + const body = JSON.stringify({ + TableName: reproFlowsTableName + }); + const createTableHeaders = { + "Content-Type": "application/json", + Accept: "application/json;odata=nometadata" + }; + const createTableResult = await postToAzurite( + "Tables", + body, + createTableHeaders + ); + assert.strictEqual(createTableResult.status, 201); + + // raw request from issue 1798 debug log ln 5368 + + const batchWithFailingRequestString = `--batch_5ba88789-f5e2-415a-b48a-f2d3c3062937\r\nContent-Type: multipart/mixed; boundary=changeset_c71314eb-b086-4e81-a14b-668f8cbdbc12\r\n\r\n--changeset_c71314eb-b086-4e81-a14b-668f8cbdbc12\r\nContent-Type: application/http\r\nContent-Transfer-Encoding: binary\r\n\r\nPUT http://127.0.0.1:10002/devstoreaccount1/${reproFlowsTableName}(PartitionKey='0',RowKey='port_0_test-06gmr-cis-1_0_tengigabitethernet0%25fs3%25fs0') HTTP/1.1\r\nAccept: application/json;odata=minimalmetadata\r\nContent-Type: application/json\r\nDataServiceVersion: 3.0;\r\nIf-Match: W/\"datetime'2023-01-23T19%3A39%3A54.978799Z'\"\r\n\r\n{\"DeviceName\":\"test-06gmr-cis-1\",\"PortId\":\"port_0_test-06gmr-cis-1_0_tengigabitethernet0%fs3%fs0\",\"Bandwidth\":10000,\"AvailableBandwidth\":-1,\"Direction\":\"ToServiceProvider\",\"AzurePortName\":\"TenGigabitEthernet0/3/0\",\"ServiceProviderName\":\"microsoft er test\",\"ServiceProviderPortName\":\"A51-TEST-06GMR-CIS-1-PRI-A\",\"AuthorizedUsers\":\"\",\"PortpairId\":\"ppport_0_test-06gmr-cis-1_0_tengigabitethernet0%fs3%fs0\",\"TunnelInterfaceNames\":\"\",\"RackId\":\"\",\"PatchPanelId\":\"\",\"ConnectorType\":\"\",\"AdminState\":\"\",\"Description\":\"\",\"ExtendedLocationProperty\":\"\"}\r\n--changeset_c71314eb-b086-4e81-a14b-668f8cbdbc12\r\nContent-Type: application/http\r\nContent-Transfer-Encoding: binary\r\n\r\nPUT http://127.0.0.1:10002/devstoreaccount1/${reproFlowsTableName}(PartitionKey='0',RowKey='port_0_test-06gmr-cis-2_0_tengigabitethernet0%25fs3%25fs0') HTTP/1.1\r\nAccept: application/json;odata=minimalmetadata\r\nContent-Type: application/json\r\nDataServiceVersion: 3.0;\r\nIf-Match: W/\"datetime'2023-01-23T19%3A39%3A54.978799Z'\"\r\n\r\n{\"DeviceName\":\"test-06gmr-cis-2\",\"PortId\":\"port_0_test-06gmr-cis-2_0_tengigabitethernet0%fs3%fs0\",\"Bandwidth\":10000,\"AvailableBandwidth\":-1,\"Direction\":\"ToServiceProvider\",\"AzurePortName\":\"TenGigabitEthernet0/3/0\",\"ServiceProviderName\":\"microsoft er test\",\"ServiceProviderPortName\":\"A51-TEST-06GMR-CIS-2-SEC-A\",\"AuthorizedUsers\":\"\",\"PortpairId\":\"ppport_0_test-06gmr-cis-1_0_tengigabitethernet0%fs3%fs0\",\"TunnelInterfaceNames\":\"\",\"RackId\":\"\",\"PatchPanelId\":\"\",\"ConnectorType\":\"\",\"AdminState\":\"\",\"Description\":\"\",\"ExtendedLocationProperty\":\"\"}\r\n--changeset_c71314eb-b086-4e81-a14b-668f8cbdbc12\r\nContent-Type: application/http\r\nContent-Transfer-Encoding: binary\r\n\r\nPOST http://127.0.0.1:10002/devstoreaccount1/${reproFlowsTableName}() HTTP/1.1\r\nAccept: application/json;odata=minimalmetadata\r\nContent-Type: application/json\r\nPrefer: return-no-content\r\nDataServiceVersion: 3.0;\r\n\r\n{\"PartitionKey\":\"0\",\"RowKey\":\"portpair_0_microsoft er test_a51-test-06gmr-cis-1-pri-a\",\"PortPairName\":\"microsoft er test_A51-TEST-06GMR-CIS-1-PRI-A\",\"PortPairId\":\"ppport_0_test-06gmr-cis-1_0_tengigabitethernet0%fs3%fs0\",\"PrimaryDeviceName\":\"test-06gmr-cis-1\",\"PrimaryDevicePortId\":\"port_0_test-06gmr-cis-1_0_tengigabitethernet0%fs3%fs0\",\"PrimaryDevicePortName\":\"TenGigabitEthernet0/3/0\",\"SecondaryDeviceName\":\"test-06gmr-cis-2\",\"SecondaryDevicePortId\":\"port_0_test-06gmr-cis-2_0_tengigabitethernet0%fs3%fs0\",\"SecondaryDevicePortName\":\"TenGigabitEthernet0/3/0\",\"Description\":\"A51-TEST-06GMR-CIS-1-PRI-A\",\"ExtendedLocationProperty\":\"\",\"OverprovisionFactor\":4,\"AvailableBandwidth\":40000,\"ServiceProviderName\":\"microsoft er test\",\"AuthorizedUsers\":\"\",\"Stags\":\"\",\"PortPairUsabilityStatus\":true,\"AllowedSubscriptionsList\":\"\",\"SkipBilling\":false,\"PortpairEncapType\":\"\",\"PortpairType\":\"\",\"AllocationStatus\":\"\",\"AllocationDate\":\"\",\"PeeringLocation\":\"\",\"OwnerSubscriptionId\":\"00000000-0000-0000-0000-000000000000\",\"OwnerSubscriptionId@odata.type\":\"Edm.Guid\"}\r\n--changeset_c71314eb-b086-4e81-a14b-668f8cbdbc12--\r\n--batch_5ba88789-f5e2-415a-b48a-f2d3c3062937--\r\n`; + + const patchRequestResult = await postToAzurite( + `$batch`, + batchWithFailingRequestString, + { + version: "2019-02-02", + options: { + requestId: "5c43f514-9598-421a-a8d3-7b55a08a10c9", + dataServiceVersion: "3.0" + }, + multipartContentType: + "multipart/mixed; boundary=batch_a10acba3-03e0-4200-b4da-a0cd4f0017f6", + contentLength: 791, + body: "ReadableStream" + } + ); + + assert.strictEqual(patchRequestResult.status, 202); + // we respond with a 404 inside the batch request for the + // resources being modified, but that is irrelevant for the test. + // https://docs.microsoft.com/en-us/rest/api/storageservices/merge-entity + const resourceNotFound = patchRequestResult.data.match( + "HTTP/1.1 404 Not Found" + ).length; + assert.strictEqual(resourceNotFound, 1); + }); }); /** diff --git a/tests/table/apis/table.entity.test.ts b/tests/table/apis/table.entity.test.ts index 150d9002d..539cfc5fa 100644 --- a/tests/table/apis/table.entity.test.ts +++ b/tests/table/apis/table.entity.test.ts @@ -11,11 +11,11 @@ import { restoreBuildRequestOptions } from "../../testutils"; import { - createBasicEntityForTest, createConnectionStringForTest, createTableServerForTest } from "../utils/table.entity.test.utils"; import { TestEntity } from "../models/TestEntity"; +import { AzureStorageSDKEntityFactory } from "../utils/AzureStorageSDKEntityFactory"; // Set true to enable debug log configLogger(false); @@ -26,6 +26,8 @@ configLogger(false); // Azure Storage Connection String (using SAS or Key). const testLocalAzuriteInstance = true; +const entityFactory = new AzureStorageSDKEntityFactory(); + describe("table Entity APIs test - using Azure-Storage", () => { let server: TableServer; const tableService = Azure.createTableService( @@ -73,9 +75,9 @@ describe("table Entity APIs test - using Azure-Storage", () => { // Simple test in here until we have the full set checked in, as we need // a starting point for delete and query entity APIs - it("Should insert new Entity, @loki", (done) => { + it("01. Should insert new Entity, @loki", (done) => { // https://docs.microsoft.com/en-us/rest/api/storageservices/insert-entity - const entity = createBasicEntityForTest(); + const entity = entityFactory.createBasicEntityForTest(); tableService.insertEntity( tableName, entity, @@ -99,7 +101,7 @@ describe("table Entity APIs test - using Azure-Storage", () => { }); // Insert entity property with type "Edm.DateTime", server will convert to UTC time - it("Insert new Entity property with type Edm.DateTime will convert to UTC, @loki", (done) => { + it("02. Insert new Entity property with type Edm.DateTime will convert to UTC, @loki", (done) => { const timeValue = "2012-01-02T23:00:00"; const entity = { PartitionKey: "part1", @@ -135,7 +137,7 @@ describe("table Entity APIs test - using Azure-Storage", () => { }); // Insert empty entity property with type "Edm.DateTime", server will return error - it("Insert new Entity property with type Edm.DateTime will convert to UTC, @loki", (done) => { + it("03. Insert new Entity property with type Edm.DateTime will convert to UTC, @loki", (done) => { const timeValue = ""; const entity = { PartitionKey: "part1", @@ -149,9 +151,16 @@ describe("table Entity APIs test - using Azure-Storage", () => { entity, (insertError, insertResult, insertResponse) => { if (!insertError) { - assert.fail("Insert should fail with DataTime type property has empty value."); + assert.fail( + "Insert should fail with DataTime type property has empty value." + ); } else { - assert.strictEqual(true, insertError.message.startsWith("An error occurred while processing this request.")); + assert.strictEqual( + true, + insertError.message.startsWith( + "An error occurred while processing this request." + ) + ); done(); } } @@ -160,9 +169,9 @@ describe("table Entity APIs test - using Azure-Storage", () => { // Simple test in here until we have the full set checked in, as we need // a starting point for delete and query entity APIs - it("Should insert new Entity with empty RowKey, @loki", (done) => { + it("04. Should insert new Entity with empty RowKey, @loki", (done) => { // https://docs.microsoft.com/en-us/rest/api/storageservices/insert-entity - const entity = createBasicEntityForTest(); + const entity = entityFactory.createBasicEntityForTest(); entity.RowKey._ = ""; tableService.insertEntity( tableName, @@ -186,8 +195,8 @@ describe("table Entity APIs test - using Azure-Storage", () => { ); }); - it("Should retrieve entity with empty RowKey, @loki", (done) => { - const entityInsert = createBasicEntityForTest(); + it("05. Should retrieve entity with empty RowKey, @loki", (done) => { + const entityInsert = entityFactory.createBasicEntityForTest(); entityInsert.RowKey._ = ""; entityInsert.myValue._ = getUniqueName("uniqueValue"); tableService.insertOrReplaceEntity( @@ -225,10 +234,10 @@ describe("table Entity APIs test - using Azure-Storage", () => { ); }); - it("Should delete an Entity using etag wildcard, @loki", (done) => { + it("06. Should delete an Entity using etag wildcard, @loki", (done) => { // https://docs.microsoft.com/en-us/rest/api/storageservices/delete-entity1 - const entity = createBasicEntityForTest(); + const entity = entityFactory.createBasicEntityForTest(); tableService.insertEntity( tableName, entity, @@ -254,9 +263,9 @@ describe("table Entity APIs test - using Azure-Storage", () => { ); }); - it("Should not delete an Entity not matching Etag, @loki", (done) => { + it("07. Should not delete an Entity not matching Etag, @loki", (done) => { // https://docs.microsoft.com/en-us/rest/api/storageservices/delete-entity1 - const entityInsert = createBasicEntityForTest(); + const entityInsert = entityFactory.createBasicEntityForTest(); requestOverride.headers = { Prefer: "return-content", accept: "application/json;odata=fullmetadata" @@ -286,9 +295,9 @@ describe("table Entity APIs test - using Azure-Storage", () => { ); }); - it("Should delete a matching Etag, @loki", (done) => { + it("08. Should delete a matching Etag, @loki", (done) => { // https://docs.microsoft.com/en-us/rest/api/storageservices/delete-entity1 - const entityInsert = createBasicEntityForTest(); + const entityInsert = entityFactory.createBasicEntityForTest(); requestOverride.headers = { Prefer: "return-content", accept: "application/json;odata=fullmetadata" @@ -320,8 +329,8 @@ describe("table Entity APIs test - using Azure-Storage", () => { ); }); - it("Update an Entity that exists, @loki", (done) => { - const entityInsert = createBasicEntityForTest(); + it("09. Update an Entity that exists, @loki", (done) => { + const entityInsert = entityFactory.createBasicEntityForTest(); tableService.insertEntity( tableName, entityInsert, @@ -353,8 +362,8 @@ describe("table Entity APIs test - using Azure-Storage", () => { ); }); - it("Upserts when an Entity does not exist using replaceEntity(), @loki", (done) => { - const entityToUpdate = createBasicEntityForTest(); + it("10. Upserts when an Entity does not exist using replaceEntity(), @loki", (done) => { + const entityToUpdate = entityFactory.createBasicEntityForTest(); // this is submitting an update with if-match == * tableService.replaceEntity( tableName, @@ -370,8 +379,8 @@ describe("table Entity APIs test - using Azure-Storage", () => { ); }); - it("Should not update an Entity not matching Etag, @loki", (done) => { - const entityInsert = createBasicEntityForTest(); + it("11. Should not update an Entity not matching Etag, @loki", (done) => { + const entityInsert = entityFactory.createBasicEntityForTest(); requestOverride.headers = { Prefer: "return-content", accept: "application/json;odata=fullmetadata" @@ -404,8 +413,8 @@ describe("table Entity APIs test - using Azure-Storage", () => { ); }); - it("Should update, if Etag matches, @loki", (done) => { - const entityTemplate = createBasicEntityForTest(); + it("12. Should update, if Etag matches, @loki", (done) => { + const entityTemplate = entityFactory.createBasicEntityForTest(); const entityInsert = { PartitionKey: entityTemplate.PartitionKey, RowKey: entityTemplate.RowKey, @@ -452,8 +461,8 @@ describe("table Entity APIs test - using Azure-Storage", () => { }); // https://docs.microsoft.com/en-us/rest/api/storageservices/insert-or-replace-entity - it("Insert or Replace (upsert) on an Entity that does not exist, @loki", (done) => { - const entityToInsert = createBasicEntityForTest(); + it("13. Insert or Replace (upsert) on an Entity that does not exist, @loki", (done) => { + const entityToInsert = entityFactory.createBasicEntityForTest(); tableService.insertOrReplaceEntity( tableName, entityToInsert, @@ -483,8 +492,8 @@ describe("table Entity APIs test - using Azure-Storage", () => { }); // https://docs.microsoft.com/en-us/rest/api/storageservices/insert-or-replace-entity - it("Insert or Replace (upsert) on an Entity that exists, @loki", (done) => { - const upsertEntity = createBasicEntityForTest(); + it("14. Insert or Replace (upsert) on an Entity that exists, @loki", (done) => { + const upsertEntity = entityFactory.createBasicEntityForTest(); tableService.insertEntity(tableName, upsertEntity, () => { upsertEntity.myValue._ = "updated"; tableService.insertOrReplaceEntity( @@ -516,8 +525,8 @@ describe("table Entity APIs test - using Azure-Storage", () => { }); // https://docs.microsoft.com/en-us/rest/api/storageservices/insert-or-merge-entity - it("Insert or Merge on an Entity that exists, @loki", (done) => { - const entityInsert = createBasicEntityForTest(); + it("15. Insert or Merge on an Entity that exists, @loki", (done) => { + const entityInsert = entityFactory.createBasicEntityForTest(); tableService.insertEntity( tableName, entityInsert, @@ -558,8 +567,8 @@ describe("table Entity APIs test - using Azure-Storage", () => { ); }); - it("Insert or Merge on an Entity that does not exist, @loki", (done) => { - const entityToInsertOrMerge = createBasicEntityForTest(); + it("16. Insert or Merge on an Entity that does not exist, @loki", (done) => { + const entityToInsertOrMerge = entityFactory.createBasicEntityForTest(); tableService.insertOrMergeEntity( tableName, entityToInsertOrMerge, @@ -588,13 +597,13 @@ describe("table Entity APIs test - using Azure-Storage", () => { }); // Start of Batch Tests: - it("Simple Insert Or Replace of a SINGLE entity as a BATCH, @loki", (done) => { + it("17. Simple Insert Or Replace of a SINGLE entity as a BATCH, @loki", (done) => { requestOverride.headers = { Prefer: "return-content", accept: "application/json;odata=fullmetadata" }; - const batchEntity1 = createBasicEntityForTest(); + const batchEntity1 = entityFactory.createBasicEntityForTest(); const entityBatch: Azure.TableBatch = new Azure.TableBatch(); entityBatch.addOperation("INSERT_OR_REPLACE", batchEntity1); // resulting in PUT @@ -633,7 +642,7 @@ describe("table Entity APIs test - using Azure-Storage", () => { { pk: "pk", rk: "", label: "empty row key" } ].forEach(({ pk, rk, label }) => { ["INSERT", "INSERT_OR_MERGE", "INSERT_OR_REPLACE"].forEach((operation) => { - it(`${operation} entity with ${label} in a BATCH, @loki`, (done) => { + it(`18. ${operation} entity with ${label} in a BATCH, @loki`, (done) => { requestOverride.headers = { Prefer: "return-content", accept: "application/json;odata=fullmetadata" @@ -681,12 +690,11 @@ describe("table Entity APIs test - using Azure-Storage", () => { }); ["MERGE", "REPLACE"].forEach((operation) => { - it(`${operation} of entity with ${label} in a BATCH, @loki`, (done) => { + it(`19. ${operation} of entity with ${label} in a BATCH, @loki`, (done) => { requestOverride.headers = { Prefer: "return-content", accept: "application/json;odata=fullmetadata" }; - const batchEntity1 = new TestEntity( !pk ? pk : getUniqueName(pk), !rk ? rk : getUniqueName(rk), @@ -720,7 +728,7 @@ describe("table Entity APIs test - using Azure-Storage", () => { }); }); - it(`DELETE of entity with ${label} in a BATCH, @loki`, (done) => { + it("20. DELETE of entity with ${label} in a BATCH, @loki", (done) => { requestOverride.headers = { Prefer: "return-content", accept: "application/json;odata=fullmetadata" @@ -767,14 +775,14 @@ describe("table Entity APIs test - using Azure-Storage", () => { }); }); - it("Simple batch test: Inserts multiple entities as a batch, @loki", (done) => { + it("21. Simple batch test: Inserts multiple entities as a batch, @loki", (done) => { requestOverride.headers = { Prefer: "return-content", accept: "application/json;odata=fullmetadata" }; - const batchEntity1 = createBasicEntityForTest(); - const batchEntity2 = createBasicEntityForTest(); - const batchEntity3 = createBasicEntityForTest(); + const batchEntity1 = entityFactory.createBasicEntityForTest(); + const batchEntity2 = entityFactory.createBasicEntityForTest(); + const batchEntity3 = entityFactory.createBasicEntityForTest(); const entityBatch: Azure.TableBatch = new Azure.TableBatch(); entityBatch.addOperation("INSERT", batchEntity1, { echoContent: true }); @@ -806,15 +814,15 @@ describe("table Entity APIs test - using Azure-Storage", () => { ); }); - it("Simple batch test: Delete multiple entities as a batch, @loki", (done) => { + it("22. Simple batch test: Delete multiple entities as a batch, @loki", (done) => { requestOverride.headers = { Prefer: "return-content", accept: "application/json;odata=fullmetadata" }; // First insert multiple entities to delete - const batchEntity1 = createBasicEntityForTest(); - const batchEntity2 = createBasicEntityForTest(); - const batchEntity3 = createBasicEntityForTest(); + const batchEntity1 = entityFactory.createBasicEntityForTest(); + const batchEntity2 = entityFactory.createBasicEntityForTest(); + const batchEntity3 = entityFactory.createBasicEntityForTest(); assert.notDeepEqual( batchEntity1.RowKey, @@ -905,15 +913,15 @@ describe("table Entity APIs test - using Azure-Storage", () => { ); }); - it("Insert Or Replace multiple entities as a batch, @loki", (done) => { + it("23. Insert Or Replace multiple entities as a batch, @loki", (done) => { requestOverride.headers = { Prefer: "return-content", accept: "application/json;odata=fullmetadata" }; - const batchEntity1 = createBasicEntityForTest(); - const batchEntity2 = createBasicEntityForTest(); - const batchEntity3 = createBasicEntityForTest(); + const batchEntity1 = entityFactory.createBasicEntityForTest(); + const batchEntity2 = entityFactory.createBasicEntityForTest(); + const batchEntity3 = entityFactory.createBasicEntityForTest(); const entityBatch: Azure.TableBatch = new Azure.TableBatch(); entityBatch.addOperation("INSERT_OR_REPLACE", batchEntity1); @@ -948,14 +956,14 @@ describe("table Entity APIs test - using Azure-Storage", () => { ); }); - it("Insert Or Merge multiple entities as a batch, @loki", (done) => { + it("24. Insert Or Merge multiple entities as a batch, @loki", (done) => { requestOverride.headers = { Prefer: "return-content", accept: "application/json;odata=fullmetadata" }; - const batchEntity1 = createBasicEntityForTest(); - const batchEntity2 = createBasicEntityForTest(); - const batchEntity3 = createBasicEntityForTest(); + const batchEntity1 = entityFactory.createBasicEntityForTest(); + const batchEntity2 = entityFactory.createBasicEntityForTest(); + const batchEntity3 = entityFactory.createBasicEntityForTest(); const entityBatch: Azure.TableBatch = new Azure.TableBatch(); entityBatch.addOperation("INSERT_OR_MERGE", batchEntity1); @@ -990,19 +998,19 @@ describe("table Entity APIs test - using Azure-Storage", () => { ); }); - it("Insert and Update entity via a batch, @loki", (done) => { + it("25. Insert and Update entity via a batch, @loki", (done) => { requestOverride.headers = { Prefer: "return-content", accept: "application/json;odata=fullmetadata" }; - const batchEntity1 = createBasicEntityForTest(); + const batchEntity1 = entityFactory.createBasicEntityForTest(); tableService.insertEntity( tableName, batchEntity1, (initialInsertError, initialInsertResult) => { assert.ifError(initialInsertError); - const batchEntity2 = createBasicEntityForTest(); + const batchEntity2 = entityFactory.createBasicEntityForTest(); const entityBatch: Azure.TableBatch = new Azure.TableBatch(); entityBatch.addOperation("INSERT", batchEntity2, { echoContent: true }); batchEntity1.myValue._ = "value2"; @@ -1042,18 +1050,18 @@ describe("table Entity APIs test - using Azure-Storage", () => { ); }); - it("Insert and Merge entity via a batch, @loki", (done) => { + it("26. Insert and Merge entity via a batch, @loki", (done) => { requestOverride.headers = { Prefer: "return-content", accept: "application/json;odata=fullmetadata" }; - const batchEntity1 = createBasicEntityForTest(); + const batchEntity1 = entityFactory.createBasicEntityForTest(); tableService.insertEntity( tableName, batchEntity1, (initialInsertError, initialInsertResult) => { assert.ifError(initialInsertError); - const batchEntity2 = createBasicEntityForTest(); + const batchEntity2 = entityFactory.createBasicEntityForTest(); const entityBatch: Azure.TableBatch = new Azure.TableBatch(); entityBatch.addOperation("INSERT", batchEntity2, { echoContent: true }); batchEntity1.myValue._ = "value2"; @@ -1092,19 +1100,19 @@ describe("table Entity APIs test - using Azure-Storage", () => { ); }); - it("Insert and Delete entity via a batch, @loki", (done) => { + it("27. Insert and Delete entity via a batch, @loki", (done) => { requestOverride.headers = { Prefer: "return-content", accept: "application/json;odata=fullmetadata" }; - const batchEntity1 = createBasicEntityForTest(); + const batchEntity1 = entityFactory.createBasicEntityForTest(); tableService.insertEntity( tableName, batchEntity1, (initialInsertError, initialInsertResult) => { assert.ifError(initialInsertError); - const batchEntity2 = createBasicEntityForTest(); + const batchEntity2 = entityFactory.createBasicEntityForTest(); // Should fail // The batch request contains multiple changes with same row key. An entity can appear only once in a batch request. const entityBatch: Azure.TableBatch = new Azure.TableBatch(); @@ -1141,12 +1149,12 @@ describe("table Entity APIs test - using Azure-Storage", () => { ); }); - it("Query / Retrieve single entity via a batch, requestion Options undefined / default @loki", (done) => { + it("28. Query / Retrieve single entity via a batch, requestion Options undefined / default @loki", (done) => { requestOverride.headers = { Prefer: "return-content", accept: "application/json;odata=fullmetadata" }; - const batchEntity1 = createBasicEntityForTest(); + const batchEntity1 = entityFactory.createBasicEntityForTest(); tableService.insertEntity(tableName, batchEntity1, (error, result) => { const entityBatch: Azure.TableBatch = new Azure.TableBatch(); @@ -1175,12 +1183,12 @@ describe("table Entity APIs test - using Azure-Storage", () => { }); }); - it("Single Delete entity via a batch, @loki", (done) => { + it("29. Single Delete entity via a batch, @loki", (done) => { requestOverride.headers = { Prefer: "return-content", accept: "application/json;odata=fullmetadata" }; - const batchEntity1 = createBasicEntityForTest(); + const batchEntity1 = entityFactory.createBasicEntityForTest(); tableService.insertEntity(tableName, batchEntity1, () => { const entityBatch: Azure.TableBatch = new Azure.TableBatch(); @@ -1218,18 +1226,18 @@ describe("table Entity APIs test - using Azure-Storage", () => { // https://github.com/Azure/Azurite/issues/750 // https://github.com/Azure/Azurite/issues/733 // https://github.com/Azure/Azurite/issues/745 - it("Operates on batch items with complex row keys, @loki", (done) => { + it("30. Operates on batch items with complex row keys, @loki", (done) => { requestOverride.headers = { Prefer: "return-content", accept: "application/json;odata=fullmetadata" }; - const insertEntity1 = createBasicEntityForTest(); + const insertEntity1 = entityFactory.createBasicEntityForTest(); insertEntity1.RowKey._ = "8b0a63c8-9542-49d8-9dd2-d7af9fa8790f_0B"; - const insertEntity2 = createBasicEntityForTest(); + const insertEntity2 = entityFactory.createBasicEntityForTest(); insertEntity2.RowKey._ = "8b0a63c8-9542-49d8-9dd2-d7af9fa8790f_0C"; - const insertEntity3 = createBasicEntityForTest(); + const insertEntity3 = entityFactory.createBasicEntityForTest(); insertEntity3.RowKey._ = "8b0a63c8-9542-49d8-9dd2-d7af9fa8790f_0D"; - const insertEntity4 = createBasicEntityForTest(); + const insertEntity4 = entityFactory.createBasicEntityForTest(); insertEntity4.RowKey._ = "8b0a63c8-9542-49d8-9dd2-d7af9fa8790f_0E"; tableService.insertEntity(tableName, insertEntity1, () => { @@ -1305,21 +1313,21 @@ describe("table Entity APIs test - using Azure-Storage", () => { }); // this covers https://github.com/Azure/Azurite/issues/741 - it("Operates on batch items with complex partition keys, @loki", (done) => { + it("31. Operates on batch items with complex partition keys, @loki", (done) => { requestOverride.headers = { Prefer: "return-content", accept: "application/json;odata=fullmetadata" }; - const insertEntity1 = createBasicEntityForTest(); + const insertEntity1 = entityFactory.createBasicEntityForTest(); insertEntity1.PartitionKey._ = "@DurableTask.AzureStorage.Tests.AzureStorageScenarioTests+Orchestrations+AutoStartOrchestration+Responder"; - const insertEntity2 = createBasicEntityForTest(); + const insertEntity2 = entityFactory.createBasicEntityForTest(); insertEntity2.PartitionKey._ = "@DurableTask.AzureStorage.Tests.AzureStorageScenarioTests+Orchestrations+AutoStartOrchestration+Responder"; - const insertEntity3 = createBasicEntityForTest(); + const insertEntity3 = entityFactory.createBasicEntityForTest(); insertEntity3.PartitionKey._ = "@DurableTask.AzureStorage.Tests.AzureStorageScenarioTests+Orchestrations+AutoStartOrchestration+Responder"; - const insertEntity4 = createBasicEntityForTest(); + const insertEntity4 = entityFactory.createBasicEntityForTest(); insertEntity4.PartitionKey._ = "@DurableTask.AzureStorage.Tests.AzureStorageScenarioTests+Orchestrations+AutoStartOrchestration+Responder"; @@ -1395,15 +1403,15 @@ describe("table Entity APIs test - using Azure-Storage", () => { }); }); - it("Ensure Valid Etag format from Batch, @loki", (done) => { + it("32. Ensure Valid Etag format from Batch, @loki", (done) => { requestOverride.headers = { Prefer: "return-content", accept: "application/json;odata=fullmetadata" }; - const batchEntity1 = createBasicEntityForTest(); + const batchEntity1 = entityFactory.createBasicEntityForTest(); tableService.insertEntity(tableName, batchEntity1, () => { - const batchEntity2 = createBasicEntityForTest(); + const batchEntity2 = entityFactory.createBasicEntityForTest(); const entityBatch: Azure.TableBatch = new Azure.TableBatch(); entityBatch.addOperation("INSERT", batchEntity2, { echoContent: true }); batchEntity1.myValue._ = "value2"; @@ -1450,9 +1458,9 @@ describe("table Entity APIs test - using Azure-Storage", () => { }); }); - it("Should have a valid OData Metadata value when inserting an entity, @loki", (done) => { + it("33. Should have a valid OData Metadata value when inserting an entity, @loki", (done) => { // https://docs.microsoft.com/en-us/rest/api/storageservices/insert-entity - const entityInsert = createBasicEntityForTest(); + const entityInsert = entityFactory.createBasicEntityForTest(); requestOverride.headers = { Prefer: "return-content", accept: "application/json;odata=fullmetadata" @@ -1478,12 +1486,12 @@ describe("table Entity APIs test - using Azure-Storage", () => { ); }); - it("Can create entities with empty string for row and partition key, @loki", (done) => { + it("34. Can create entities with empty string for row and partition key, @loki", (done) => { requestOverride.headers = { Prefer: "return-content", accept: "application/json;odata=fullmetadata" }; - const emptyKeysEntity = createBasicEntityForTest(); + const emptyKeysEntity = entityFactory.createBasicEntityForTest(); emptyKeysEntity.PartitionKey._ = ""; emptyKeysEntity.RowKey._ = ""; @@ -1514,4 +1522,90 @@ describe("table Entity APIs test - using Azure-Storage", () => { } ); }); + + it("35. Operates on batch items with partition keys with %25 in the middle, @loki", (done) => { + requestOverride.headers = { + Prefer: "return-content", + accept: "application/json;odata=fullmetadata" + }; + const insertEntity1 = entityFactory.createBasicEntityForTest(); + insertEntity1.PartitionKey._ = "percent2%25batch"; + const insertEntity2 = entityFactory.createBasicEntityForTest(); + insertEntity2.PartitionKey._ = "percent2%25batch"; + const insertEntity3 = entityFactory.createBasicEntityForTest(); + insertEntity3.PartitionKey._ = "percent2%25batch"; + const insertEntity4 = entityFactory.createBasicEntityForTest(); + insertEntity4.PartitionKey._ = "percent2%25batch"; + + tableService.insertEntity(tableName, insertEntity1, () => { + tableService.insertEntity(tableName, insertEntity2, () => { + const entityBatch: Azure.TableBatch = new Azure.TableBatch(); + entityBatch.insertEntity(insertEntity3, { echoContent: true }); + entityBatch.insertEntity(insertEntity4, { echoContent: true }); + entityBatch.deleteEntity(insertEntity1); + entityBatch.deleteEntity(insertEntity2); + tableService.executeBatch( + tableName, + entityBatch, + (batchError, batchResult, batchResponse) => { + if (batchError) { + assert.ifError(batchError); + done(); + } else { + assert.strictEqual(batchResponse.statusCode, 202); + tableService.retrieveEntity( + tableName, + insertEntity3.PartitionKey._, + insertEntity3.RowKey._, + (error: any, result, response) => { + assert.strictEqual( + response.statusCode, + 200, + "We did not find the 3rd entity!" + ); + tableService.retrieveEntity( + tableName, + insertEntity4.PartitionKey._, + insertEntity4.RowKey._, + (error2: any, result2, response2) => { + assert.strictEqual( + response2.statusCode, + 200, + "We did not find the 4th entity!" + ); + tableService.retrieveEntity( + tableName, + insertEntity1.PartitionKey._, + insertEntity1.RowKey._, + (error3: any, result3, response3) => { + assert.strictEqual( + response3.statusCode, + 404, + "We did not delete the 1st entity!" + ); + tableService.retrieveEntity( + tableName, + insertEntity2.PartitionKey._, + insertEntity2.RowKey._, + (error4: any, result4, response4) => { + assert.strictEqual( + response4.statusCode, + 404, + "We did not delete the 2nd entity!" + ); + done(); + } + ); + } + ); + } + ); + } + ); + } + } + ); + }); + }); + }); }); diff --git a/tests/table/models/AzureDataTablesTestEntity.ts b/tests/table/models/AzureDataTablesTestEntity.ts deleted file mode 100644 index bed93e68e..000000000 --- a/tests/table/models/AzureDataTablesTestEntity.ts +++ /dev/null @@ -1,43 +0,0 @@ -import { Edm } from "@azure/data-tables"; -import { getUniqueName } from "../../testutils"; - -/** - * Creates an entity for tests, with a randomized row key, - * to avoid conflicts on inserts. - * - * @return {*} {TestEntity} - */ -export function createBasicEntityForTest( - partitionKey: string -): AzureDataTablesTestEntity { - return new AzureDataTablesTestEntity( - partitionKey, - getUniqueName("row"), - "value1" - ); -} - -/** - * This is the Entity Class used by Azure Data-Tables SDK tests - * https://docs.microsoft.com/en-us/rest/api/storageservices/payload-format-for-table-service-operations - * @export - * @class AzureDataTablesTestEntity - */ -export class AzureDataTablesTestEntity { - public partitionKey: string; - public rowKey: string; - public myValue: string; - public int32Field: number = 54321; - public int64Field: Edm<"Int64"> = { value: "12345", type: "Int64" }; - public doubleField: Edm<"Double"> = { value: 54.321, type: "Double" }; - public guidField: Edm<"Guid"> = { value: "", type: "Guid" }; - public nullableString: string | null = "notNull"; - public binaryField: Buffer = Buffer.from("11111111"); - public booleanField: boolean = true; - public dateField: Edm<"DateTime"> = { value: "2023-01-01T23:00:00", type: "DateTime" }; - constructor(part: string, row: string, value: string) { - this.partitionKey = part; - this.rowKey = row; - this.myValue = value; - } -} diff --git a/tests/table/models/AzureDataTablesTestEntityFactory.ts b/tests/table/models/AzureDataTablesTestEntityFactory.ts new file mode 100644 index 000000000..c601ed1d0 --- /dev/null +++ b/tests/table/models/AzureDataTablesTestEntityFactory.ts @@ -0,0 +1,63 @@ +import { Edm } from "@azure/data-tables"; +import { getUniqueName } from "../../testutils"; + +/** + * This is the Entity Factory used by Azure Data-Tables SDK tests + * https://docs.microsoft.com/en-us/rest/api/storageservices/payload-format-for-table-service-operations + * @class AzureDataTablesTestEntityFactory + */ +export class AzureDataTablesTestEntityFactory { + private int32Field: number = 54321; + private int64Field: Edm<"Int64"> = { value: "12345", type: "Int64" }; + private doubleField: Edm<"Double"> = { value: 54.321, type: "Double" }; + private guidField: Edm<"Guid"> = { + value: "d3365292-0f33-4e13-9ec6-2ea5053c32ad", + type: "Guid" + }; + private nullableString: string | null = "notNull"; + private binaryField: Buffer = Buffer.from("11111111"); + private booleanField: boolean = true; + private dateField: Edm<"DateTime"> = { + value: "2023-01-01T23:00:00", + type: "DateTime" + }; + public Create(part: string, row: string, value: string): TableTestEntity { + return { + partitionKey: part, + rowKey: row, + myValue: value, + int32Field: this.int32Field, + int64Field: this.int64Field, + doubleField: this.doubleField, + guidField: this.guidField, + nullableString: this.nullableString, + binaryField: this.binaryField, + booleanField: this.booleanField, + dateField: this.dateField + }; + } + + /** + * Creates an entity for tests, with a randomized row key, + * to avoid conflicts on inserts. + * + * @return {*} {TestEntity} + */ + public createBasicEntityForTest(partitionKey: string): TableTestEntity { + return this.Create(partitionKey, getUniqueName("row"), "value1"); + } +} + +export interface TableTestEntity { + partitionKey: string; + rowKey: string; + myValue: string; + int32Field: number; + int64Field: Edm<"Int64">; + doubleField: Edm<"Double">; + guidField: Edm<"Guid">; + nullableString: string | null; + binaryField: Buffer; + booleanField: boolean; + dateField: Edm<"DateTime">; +} diff --git a/tests/table/models/LargeDataTablesTestEntity.ts b/tests/table/models/LargeDataTablesTestEntity.ts deleted file mode 100644 index 938ab374e..000000000 --- a/tests/table/models/LargeDataTablesTestEntity.ts +++ /dev/null @@ -1,169 +0,0 @@ -import { getUniqueName } from "../../testutils"; -import { AzureDataTablesTestEntity } from "./AzureDataTablesTestEntity"; - -/** - * Creates an entity for tests, with a randomized row key, - * to avoid conflicts on inserts. - * - * @return {*} {TestEntity} - */ -export function createLargeEntityForTest( - partitionKey: string -): LargeDataTablesTestEntity { - return new LargeDataTablesTestEntity( - partitionKey, - getUniqueName("row"), - "value1" - ); -} - -/** - * This is the Entity Class used by Azure Data-Tables SDK tests - * It represents an entity whose body will be too large to send - * in a single request. - * - * @export - * @class AzureDataTablesTestEntity - */ -export class LargeDataTablesTestEntity extends AzureDataTablesTestEntity { - public partitionKey: string; - public rowKey: string; - public myValue: string; - // unable to use a record type to make this look more elegant, as - // Record Type is incompatible with Table Storage EDM entity - // https://docs.microsoft.com/en-us/rest/api/storageservices/understanding-the-table-service-data-model#property-types - public bigString01a: string = "".padEnd(1024 * 32, "01"); - public bigString02a: string = "".padEnd(1024 * 32, "02"); - public bigString03a: string = "".padEnd(1024 * 32, "03"); - public bigString04a: string = "".padEnd(1024 * 32, "04"); - public bigString05a: string = "".padEnd(1024 * 32, "05"); - public bigString06a: string = "".padEnd(1024 * 32, "06"); - public bigString07a: string = "".padEnd(1024 * 32, "07"); - public bigString08a: string = "".padEnd(1024 * 32, "08"); - public bigString09a: string = "".padEnd(1024 * 32, "09"); - public bigString10a: string = "".padEnd(1024 * 32, "10"); - public bigString11a: string = "".padEnd(1024 * 32, "11"); - public bigString12a: string = "".padEnd(1024 * 32, "12"); - public bigString13a: string = "".padEnd(1024 * 32, "13"); - public bigString14a: string = "".padEnd(1024 * 32, "14"); - public bigString15a: string = "".padEnd(1024 * 32, "15"); - public bigString16a: string = "".padEnd(1024 * 32, "16"); - public bigString01b: string = "".padEnd(1024 * 32, "01"); - public bigString02b: string = "".padEnd(1024 * 32, "02"); - public bigString03b: string = "".padEnd(1024 * 32, "03"); - public bigString04b: string = "".padEnd(1024 * 32, "04"); - public bigString05b: string = "".padEnd(1024 * 32, "05"); - public bigString06b: string = "".padEnd(1024 * 32, "06"); - public bigString07b: string = "".padEnd(1024 * 32, "07"); - public bigString08b: string = "".padEnd(1024 * 32, "08"); - public bigString09b: string = "".padEnd(1024 * 32, "09"); - public bigString10b: string = "".padEnd(1024 * 32, "10"); - public bigString11b: string = "".padEnd(1024 * 32, "11"); - public bigString12b: string = "".padEnd(1024 * 32, "12"); - public bigString13b: string = "".padEnd(1024 * 32, "13"); - public bigString14b: string = "".padEnd(1024 * 32, "14"); - public bigString15b: string = "".padEnd(1024 * 32, "15"); - public bigString16b: string = "".padEnd(1024 * 32, "16"); - public bigString01c: string = "".padEnd(1024 * 32, "01"); - public bigString02c: string = "".padEnd(1024 * 32, "02"); - public bigString03c: string = "".padEnd(1024 * 32, "03"); - public bigString04c: string = "".padEnd(1024 * 32, "04"); - public bigString05c: string = "".padEnd(1024 * 32, "05"); - public bigString06c: string = "".padEnd(1024 * 32, "06"); - public bigString07c: string = "".padEnd(1024 * 32, "07"); - public bigString08c: string = "".padEnd(1024 * 32, "08"); - public bigString09c: string = "".padEnd(1024 * 32, "09"); - public bigString10c: string = "".padEnd(1024 * 32, "10"); - public bigString11c: string = "".padEnd(1024 * 32, "11"); - public bigString12c: string = "".padEnd(1024 * 32, "12"); - public bigString13c: string = "".padEnd(1024 * 32, "13"); - public bigString14c: string = "".padEnd(1024 * 32, "14"); - public bigString15c: string = "".padEnd(1024 * 32, "15"); - public bigString16c: string = "".padEnd(1024 * 32, "16"); - public bigString01d: string = "".padEnd(1024 * 32, "01"); - public bigString02d: string = "".padEnd(1024 * 32, "02"); - public bigString03d: string = "".padEnd(1024 * 32, "03"); - public bigString04d: string = "".padEnd(1024 * 32, "04"); - public bigString05d: string = "".padEnd(1024 * 32, "05"); - public bigString06d: string = "".padEnd(1024 * 32, "06"); - public bigString07d: string = "".padEnd(1024 * 32, "07"); - public bigString08d: string = "".padEnd(1024 * 32, "08"); - public bigString09d: string = "".padEnd(1024 * 32, "09"); - public bigString10d: string = "".padEnd(1024 * 32, "10"); - public bigString11d: string = "".padEnd(1024 * 32, "11"); - public bigString12d: string = "".padEnd(1024 * 32, "12"); - public bigString13d: string = "".padEnd(1024 * 32, "13"); - public bigString14d: string = "".padEnd(1024 * 32, "14"); - public bigString15d: string = "".padEnd(1024 * 32, "15"); - public bigString16d: string = "".padEnd(1024 * 32, "16"); - public bigString01aa: string = "".padEnd(1024 * 32, "01"); - public bigString02aa: string = "".padEnd(1024 * 32, "02"); - public bigString03aa: string = "".padEnd(1024 * 32, "03"); - public bigString04aa: string = "".padEnd(1024 * 32, "04"); - public bigString05aa: string = "".padEnd(1024 * 32, "05"); - public bigString06aa: string = "".padEnd(1024 * 32, "06"); - public bigString07aa: string = "".padEnd(1024 * 32, "07"); - public bigString08aa: string = "".padEnd(1024 * 32, "08"); - public bigString09aa: string = "".padEnd(1024 * 32, "09"); - public bigString10aa: string = "".padEnd(1024 * 32, "10"); - public bigString11aa: string = "".padEnd(1024 * 32, "11"); - public bigString12aa: string = "".padEnd(1024 * 32, "12"); - public bigString13aa: string = "".padEnd(1024 * 32, "13"); - public bigString14aa: string = "".padEnd(1024 * 32, "14"); - public bigString15aa: string = "".padEnd(1024 * 32, "15"); - public bigString16aa: string = "".padEnd(1024 * 32, "16"); - public bigString01ba: string = "".padEnd(1024 * 32, "01"); - public bigString02ba: string = "".padEnd(1024 * 32, "02"); - public bigString03ba: string = "".padEnd(1024 * 32, "03"); - public bigString04ba: string = "".padEnd(1024 * 32, "04"); - public bigString05ba: string = "".padEnd(1024 * 32, "05"); - public bigString06ba: string = "".padEnd(1024 * 32, "06"); - public bigString07ba: string = "".padEnd(1024 * 32, "07"); - public bigString08ba: string = "".padEnd(1024 * 32, "08"); - public bigString09ba: string = "".padEnd(1024 * 32, "09"); - public bigString10ba: string = "".padEnd(1024 * 32, "10"); - public bigString11ba: string = "".padEnd(1024 * 32, "11"); - public bigString12ba: string = "".padEnd(1024 * 32, "12"); - public bigString13ba: string = "".padEnd(1024 * 32, "13"); - public bigString14ba: string = "".padEnd(1024 * 32, "14"); - public bigString15ba: string = "".padEnd(1024 * 32, "15"); - public bigString16ba: string = "".padEnd(1024 * 32, "16"); - public bigString01ca: string = "".padEnd(1024 * 32, "01"); - public bigString02ca: string = "".padEnd(1024 * 32, "02"); - public bigString03ca: string = "".padEnd(1024 * 32, "03"); - public bigString04ca: string = "".padEnd(1024 * 32, "04"); - public bigString05ca: string = "".padEnd(1024 * 32, "05"); - public bigString06ca: string = "".padEnd(1024 * 32, "06"); - public bigString07ca: string = "".padEnd(1024 * 32, "07"); - public bigString08ca: string = "".padEnd(1024 * 32, "08"); - public bigString09ca: string = "".padEnd(1024 * 32, "09"); - public bigString10ca: string = "".padEnd(1024 * 32, "10"); - public bigString11ca: string = "".padEnd(1024 * 32, "11"); - public bigString12ca: string = "".padEnd(1024 * 32, "12"); - public bigString13ca: string = "".padEnd(1024 * 32, "13"); - public bigString14ca: string = "".padEnd(1024 * 32, "14"); - public bigString15ca: string = "".padEnd(1024 * 32, "15"); - public bigString16ca: string = "".padEnd(1024 * 32, "16"); - public bigString01da: string = "".padEnd(1024 * 32, "01"); - public bigString02da: string = "".padEnd(1024 * 32, "02"); - public bigString03da: string = "".padEnd(1024 * 32, "03"); - public bigString04da: string = "".padEnd(1024 * 32, "04"); - public bigString05da: string = "".padEnd(1024 * 32, "05"); - public bigString06da: string = "".padEnd(1024 * 32, "06"); - public bigString07da: string = "".padEnd(1024 * 32, "07"); - public bigString08da: string = "".padEnd(1024 * 32, "08"); - public bigString09da: string = "".padEnd(1024 * 32, "09"); - public bigString10da: string = "".padEnd(1024 * 32, "10"); - public bigString11da: string = "".padEnd(1024 * 32, "11"); - public bigString12da: string = "".padEnd(1024 * 32, "12"); - public bigString13da: string = "".padEnd(1024 * 32, "13"); - public bigString14da: string = "".padEnd(1024 * 32, "14"); - public bigString15da: string = "".padEnd(1024 * 32, "15"); - public bigString16da: string = "".padEnd(1024 * 32, "16"); - constructor(part: string, row: string, value: string) { - super(part, row, value); - this.partitionKey = part; - this.rowKey = row; - this.myValue = value; - } -} diff --git a/tests/table/models/LargeDataTablesTestEntityFactory.ts b/tests/table/models/LargeDataTablesTestEntityFactory.ts new file mode 100644 index 000000000..9938ea048 --- /dev/null +++ b/tests/table/models/LargeDataTablesTestEntityFactory.ts @@ -0,0 +1,161 @@ +import { getUniqueName } from "../../testutils"; +import { + AzureDataTablesTestEntityFactory, + TableTestEntity +} from "./AzureDataTablesTestEntityFactory"; + +/** + * This is the Entity Class used by Azure Data-Tables SDK tests + * It represents an entity whose body will be too large to send + * in a single request. + * + * @export + * @class AzureDataTablesTestEntity + */ +export class LargeDataTablesTestEntityFactory extends AzureDataTablesTestEntityFactory { + // unable to use a record type to make this look more elegant, as + // Record Type is incompatible with Table Storage EDM entity + // https://docs.microsoft.com/en-us/rest/api/storageservices/understanding-the-table-service-data-model#property-types + largeEntityProps = { + bigString01a: "".padEnd(1024 * 32, "01"), + bigString02a: "".padEnd(1024 * 32, "02"), + bigString03a: "".padEnd(1024 * 32, "03"), + bigString04a: "".padEnd(1024 * 32, "04"), + bigString05a: "".padEnd(1024 * 32, "05"), + bigString06a: "".padEnd(1024 * 32, "06"), + bigString07a: "".padEnd(1024 * 32, "07"), + bigString08a: "".padEnd(1024 * 32, "08"), + bigString09a: "".padEnd(1024 * 32, "09"), + bigString10a: "".padEnd(1024 * 32, "10"), + bigString11a: "".padEnd(1024 * 32, "11"), + bigString12a: "".padEnd(1024 * 32, "12"), + bigString13a: "".padEnd(1024 * 32, "13"), + bigString14a: "".padEnd(1024 * 32, "14"), + bigString15a: "".padEnd(1024 * 32, "15"), + bigString16a: "".padEnd(1024 * 32, "16"), + bigString01b: "".padEnd(1024 * 32, "01"), + bigString02b: "".padEnd(1024 * 32, "02"), + bigString03b: "".padEnd(1024 * 32, "03"), + bigString04b: "".padEnd(1024 * 32, "04"), + bigString05b: "".padEnd(1024 * 32, "05"), + bigString06b: "".padEnd(1024 * 32, "06"), + bigString07b: "".padEnd(1024 * 32, "07"), + bigString08b: "".padEnd(1024 * 32, "08"), + bigString09b: "".padEnd(1024 * 32, "09"), + bigString10b: "".padEnd(1024 * 32, "10"), + bigString11b: "".padEnd(1024 * 32, "11"), + bigString12b: "".padEnd(1024 * 32, "12"), + bigString13b: "".padEnd(1024 * 32, "13"), + bigString14b: "".padEnd(1024 * 32, "14"), + bigString15b: "".padEnd(1024 * 32, "15"), + bigString16b: "".padEnd(1024 * 32, "16"), + bigString01c: "".padEnd(1024 * 32, "01"), + bigString02c: "".padEnd(1024 * 32, "02"), + bigString03c: "".padEnd(1024 * 32, "03"), + bigString04c: "".padEnd(1024 * 32, "04"), + bigString05c: "".padEnd(1024 * 32, "05"), + bigString06c: "".padEnd(1024 * 32, "06"), + bigString07c: "".padEnd(1024 * 32, "07"), + bigString08c: "".padEnd(1024 * 32, "08"), + bigString09c: "".padEnd(1024 * 32, "09"), + bigString10c: "".padEnd(1024 * 32, "10"), + bigString11c: "".padEnd(1024 * 32, "11"), + bigString12c: "".padEnd(1024 * 32, "12"), + bigString13c: "".padEnd(1024 * 32, "13"), + bigString14c: "".padEnd(1024 * 32, "14"), + bigString15c: "".padEnd(1024 * 32, "15"), + bigString16c: "".padEnd(1024 * 32, "16"), + bigString01d: "".padEnd(1024 * 32, "01"), + bigString02d: "".padEnd(1024 * 32, "02"), + bigString03d: "".padEnd(1024 * 32, "03"), + bigString04d: "".padEnd(1024 * 32, "04"), + bigString05d: "".padEnd(1024 * 32, "05"), + bigString06d: "".padEnd(1024 * 32, "06"), + bigString07d: "".padEnd(1024 * 32, "07"), + bigString08d: "".padEnd(1024 * 32, "08"), + bigString09d: "".padEnd(1024 * 32, "09"), + bigString10d: "".padEnd(1024 * 32, "10"), + bigString11d: "".padEnd(1024 * 32, "11"), + bigString12d: "".padEnd(1024 * 32, "12"), + bigString13d: "".padEnd(1024 * 32, "13"), + bigString14d: "".padEnd(1024 * 32, "14"), + bigString15d: "".padEnd(1024 * 32, "15"), + bigString16d: "".padEnd(1024 * 32, "16"), + bigString01aa: "".padEnd(1024 * 32, "01"), + bigString02aa: "".padEnd(1024 * 32, "02"), + bigString03aa: "".padEnd(1024 * 32, "03"), + bigString04aa: "".padEnd(1024 * 32, "04"), + bigString05aa: "".padEnd(1024 * 32, "05"), + bigString06aa: "".padEnd(1024 * 32, "06"), + bigString07aa: "".padEnd(1024 * 32, "07"), + bigString08aa: "".padEnd(1024 * 32, "08"), + bigString09aa: "".padEnd(1024 * 32, "09"), + bigString10aa: "".padEnd(1024 * 32, "10"), + bigString11aa: "".padEnd(1024 * 32, "11"), + bigString12aa: "".padEnd(1024 * 32, "12"), + bigString13aa: "".padEnd(1024 * 32, "13"), + bigString14aa: "".padEnd(1024 * 32, "14"), + bigString15aa: "".padEnd(1024 * 32, "15"), + bigString16aa: "".padEnd(1024 * 32, "16"), + bigString01ba: "".padEnd(1024 * 32, "01"), + bigString02ba: "".padEnd(1024 * 32, "02"), + bigString03ba: "".padEnd(1024 * 32, "03"), + bigString04ba: "".padEnd(1024 * 32, "04"), + bigString05ba: "".padEnd(1024 * 32, "05"), + bigString06ba: "".padEnd(1024 * 32, "06"), + bigString07ba: "".padEnd(1024 * 32, "07"), + bigString08ba: "".padEnd(1024 * 32, "08"), + bigString09ba: "".padEnd(1024 * 32, "09"), + bigString10ba: "".padEnd(1024 * 32, "10"), + bigString11ba: "".padEnd(1024 * 32, "11"), + bigString12ba: "".padEnd(1024 * 32, "12"), + bigString13ba: "".padEnd(1024 * 32, "13"), + bigString14ba: "".padEnd(1024 * 32, "14"), + bigString15ba: "".padEnd(1024 * 32, "15"), + bigString16ba: "".padEnd(1024 * 32, "16"), + bigString01ca: "".padEnd(1024 * 32, "01"), + bigString02ca: "".padEnd(1024 * 32, "02"), + bigString03ca: "".padEnd(1024 * 32, "03"), + bigString04ca: "".padEnd(1024 * 32, "04"), + bigString05ca: "".padEnd(1024 * 32, "05"), + bigString06ca: "".padEnd(1024 * 32, "06"), + bigString07ca: "".padEnd(1024 * 32, "07"), + bigString08ca: "".padEnd(1024 * 32, "08"), + bigString09ca: "".padEnd(1024 * 32, "09"), + bigString10ca: "".padEnd(1024 * 32, "10"), + bigString11ca: "".padEnd(1024 * 32, "11"), + bigString12ca: "".padEnd(1024 * 32, "12"), + bigString13ca: "".padEnd(1024 * 32, "13"), + bigString14ca: "".padEnd(1024 * 32, "14"), + bigString15ca: "".padEnd(1024 * 32, "15"), + bigString16ca: "".padEnd(1024 * 32, "16"), + bigString01da: "".padEnd(1024 * 32, "01"), + bigString02da: "".padEnd(1024 * 32, "02"), + bigString03da: "".padEnd(1024 * 32, "03"), + bigString04da: "".padEnd(1024 * 32, "04"), + bigString05da: "".padEnd(1024 * 32, "05"), + bigString06da: "".padEnd(1024 * 32, "06"), + bigString07da: "".padEnd(1024 * 32, "07"), + bigString08da: "".padEnd(1024 * 32, "08"), + bigString09da: "".padEnd(1024 * 32, "09"), + bigString10da: "".padEnd(1024 * 32, "10"), + bigString11da: "".padEnd(1024 * 32, "11"), + bigString12da: "".padEnd(1024 * 32, "12"), + bigString13da: "".padEnd(1024 * 32, "13"), + bigString14da: "".padEnd(1024 * 32, "14"), + bigString15da: "".padEnd(1024 * 32, "15"), + bigString16da: "".padEnd(1024 * 32, "16") + }; + constructor() { + super(); + } + + createLargeEntityForTest(partitionKey: string): LargeTableTestEntity { + const initial = this.Create(partitionKey, getUniqueName("row"), "value1"); + return { ...initial, ...this.largeEntityProps }; + } +} + +export interface LargeTableTestEntity extends TableTestEntity { + bigString01a: string; +} diff --git a/tests/table/models/TestEntity.ts b/tests/table/models/TestEntity.ts index 156406241..6828501a1 100644 --- a/tests/table/models/TestEntity.ts +++ b/tests/table/models/TestEntity.ts @@ -8,9 +8,7 @@ const eg = Azure.TableUtilities.entityGenerator; * @class TestEntity */ export class TestEntity { - public PartitionKey: Azure.TableUtilities.entityGenerator.EntityProperty< - string - >; + public PartitionKey: Azure.TableUtilities.entityGenerator.EntityProperty; public RowKey: Azure.TableUtilities.entityGenerator.EntityProperty; public myValue: Azure.TableUtilities.entityGenerator.EntityProperty; constructor(part: string, row: string, value: string) { diff --git a/tests/table/unit/deserialization.unit.test.ts b/tests/table/unit/deserialization.unit.test.ts index bb6059d77..0a7bcc5d8 100644 --- a/tests/table/unit/deserialization.unit.test.ts +++ b/tests/table/unit/deserialization.unit.test.ts @@ -108,7 +108,7 @@ describe("batch deserialization unit tests, these are not the API integration te ); assert.strictEqual( batchOperationArray[0].uri, - "http://127.0.0.1:11002/devstoreaccount1/table160837567141205013(PartitionKey='part1',RowKey='row160837567145205850')", + "http://127.0.0.1:11002/devstoreaccount1/table160837567141205013(PartitionKey=%27part1%27,RowKey=%27row160837567145205850%27)", "wrong url parsed" ); assert.strictEqual( @@ -162,7 +162,7 @@ describe("batch deserialization unit tests, these are not the API integration te ); assert.strictEqual( batchOperationArray[1].uri, - "http://127.0.0.1:11002/devstoreaccount1/table160837770303307822(PartitionKey='part1',RowKey='row160837770307508823')", + "http://127.0.0.1:11002/devstoreaccount1/table160837770303307822(PartitionKey=%27part1%27,RowKey=%27row160837770307508823%27)", "wrong url parsed" ); assert.strictEqual( @@ -194,7 +194,7 @@ describe("batch deserialization unit tests, these are not the API integration te ); assert.strictEqual( batchOperationArray[0].uri, - "http://127.0.0.1:11002/devstoreaccount1/table161216830457901592(PartitionKey='part1',RowKey='row161216830462208585')", + "http://127.0.0.1:11002/devstoreaccount1/table161216830457901592(PartitionKey=%27part1%27,RowKey=%27row161216830462208585%27)", "wrong url parsed" ); assert.strictEqual( @@ -216,7 +216,7 @@ describe("batch deserialization unit tests, these are not the API integration te ); assert.strictEqual( batchOperationArray[1].uri, - "http://127.0.0.1:11002/devstoreaccount1/table161216830457901592(PartitionKey='part1',RowKey='row161216830462204546')", + "http://127.0.0.1:11002/devstoreaccount1/table161216830457901592(PartitionKey=%27part1%27,RowKey=%27row161216830462204546%27)", "wrong url parsed" ); assert.strictEqual( diff --git a/tests/table/utils/AzureStorageSDKEntityFactory.ts b/tests/table/utils/AzureStorageSDKEntityFactory.ts new file mode 100644 index 000000000..2f6fc9836 --- /dev/null +++ b/tests/table/utils/AzureStorageSDKEntityFactory.ts @@ -0,0 +1,14 @@ +import { getUniqueName } from "../../testutils"; +import { TestEntity } from "../models/TestEntity"; + +export class AzureStorageSDKEntityFactory { + /** + * Creates an entity for tests, with a randomized row key, + * to avoid conflicts on inserts. + * + * @return {*} {TestEntity} + */ + public createBasicEntityForTest(): TestEntity { + return new TestEntity("part1", getUniqueName("row"), "value1"); + } +} diff --git a/tests/table/utils/table.entity.test.utils.ts b/tests/table/utils/table.entity.test.utils.ts index 95fe25af8..c18ed8ed8 100644 --- a/tests/table/utils/table.entity.test.utils.ts +++ b/tests/table/utils/table.entity.test.utils.ts @@ -3,10 +3,14 @@ import { EMULATOR_ACCOUNT_NAME, getUniqueName } from "../../testutils"; -import { TestEntity } from "../models/TestEntity"; + import TableServer from "../../../src/table/TableServer"; import TableConfiguration from "../../../src/table/TableConfiguration"; -import { AzureNamedKeyCredential, TableClient } from "@azure/data-tables"; +import { + AzureNamedKeyCredential, + AzureSASCredential, + TableClient +} from "@azure/data-tables"; import { copyFile } from "fs"; export const PROTOCOL = "http"; @@ -52,16 +56,6 @@ const httpsConfig = new TableConfiguration( "tests/server.key" ); -/** - * Creates an entity for tests, with a randomized row key, - * to avoid conflicts on inserts. - * - * @return {*} {TestEntity} - */ -export function createBasicEntityForTest(): TestEntity { - return new TestEntity("part1", getUniqueName("row"), "value1"); -} - /** * Creates the Azurite TableServer used in Table API tests * @@ -193,10 +187,16 @@ export function createAzureDataTablesClient( sharedKeyCredential ); } else { + // return new TableClient( + // process.env[AZURE_DATATABLES_STORAGE_STRING]! + + // process.env[AZURE_DATATABLES_SAS]!, + // tableName + // ); + return new TableClient( - process.env[AZURE_DATATABLES_STORAGE_STRING]! + - process.env[AZURE_DATATABLES_SAS]!, - tableName + process.env[AZURE_DATATABLES_STORAGE_STRING]!, + tableName, + new AzureSASCredential(process.env[AZURE_DATATABLES_SAS]!) ); } } From a28d226695314a15912a94ae6e91103bc7dc2359 Mon Sep 17 00:00:00 2001 From: Wei Wei Date: Fri, 24 Feb 2023 10:09:38 +0800 Subject: [PATCH 026/297] Fix issue 1811: queue service sas without Start time fail request (#1812) --- ChangeLog.md | 4 +++ .../authentication/QueueSASAuthenticator.ts | 4 +-- tests/queue/queueSas.test.ts | 35 +++++++++++++++++++ 3 files changed, 41 insertions(+), 2 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index b3f596655..3359b9499 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -4,6 +4,10 @@ ## Upcoming Release +Queue: + +- Fixed issue that queue service SAS without start time not work. + ## 2023.02 Version 3.22.0 General: diff --git a/src/queue/authentication/QueueSASAuthenticator.ts b/src/queue/authentication/QueueSASAuthenticator.ts index a81e68e01..1d13d993f 100644 --- a/src/queue/authentication/QueueSASAuthenticator.ts +++ b/src/queue/authentication/QueueSASAuthenticator.ts @@ -325,8 +325,8 @@ export default class QueueSASAuthenticator implements IAuthenticator { } private validateTime(expiry?: Date | string, start?: Date | string): boolean { - // The same as Azure storage, each part is required. - if (expiry === undefined || start === undefined) { + // start is optional, expire is required, per https://learn.microsoft.com/en-us/rest/api/storageservices/create-service-sas#specify-the-access-policy + if (expiry === undefined) { return false; } diff --git a/tests/queue/queueSas.test.ts b/tests/queue/queueSas.test.ts index 720fdbaa0..582d19093 100644 --- a/tests/queue/queueSas.test.ts +++ b/tests/queue/queueSas.test.ts @@ -681,5 +681,40 @@ describe("Queue SAS test", () => { dResult.receivedMessageItems[0].popReceipt ); assert.ok(deleteResult.requestId); + }); + + it("generateQueueSASQueryParameters should work without startTime @loki", async () => { + const now = new Date(); + now.setMinutes(now.getMinutes() - 5); // Skip clock skew with server + + const tmr = new Date(); + tmr.setDate(tmr.getDate() + 1); + + // By default, credential is always the last element of pipeline factories + const factories = (serviceClient as any).pipeline.factories; + const storageSharedKeyCredential = factories[factories.length - 1]; + + const queueName = getUniqueName("queue"); + const queueClient = serviceClient.getQueueClient(queueName); + await queueClient.create(); + + const queueSAS = generateQueueSASQueryParameters( + { + queueName, + expiresOn: tmr, + permissions: QueueSASPermissions.parse("raup"), + version: "2019-02-02" + }, + storageSharedKeyCredential as StorageSharedKeyCredential + ); + + const sasURL = `${queueClient.url}?${queueSAS}`; + const queueClientWithSAS = new QueueClient( + sasURL, + newPipeline(new AnonymousCredential()) + ); + + await queueClientWithSAS.getProperties(); + await queueClient.delete(); }); }); From d58432d8f581250595039b092cc91afdc4ed5b63 Mon Sep 17 00:00:00 2001 From: Edwin Huber Date: Fri, 24 Feb 2023 09:43:51 +0100 Subject: [PATCH 027/297] add support for and test querying identifiers starting with underscore (#1807) --- ChangeLog.md | 4 ++++ .../persistence/QueryTranscriber/QPState.ts | 2 +- tests/table/apis/table.entity.query.test.ts | 23 +++++++++++++++++++ .../LokiJsQueryTranscriber.unit.test.2.ts | 4 ++++ 4 files changed, 32 insertions(+), 1 deletion(-) diff --git a/ChangeLog.md b/ChangeLog.md index 3359b9499..41647df84 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -4,6 +4,10 @@ ## Upcoming Release +Table: + +- Fixed issue for querying on identifiers starting with underscore. + Queue: - Fixed issue that queue service SAS without start time not work. diff --git a/src/table/persistence/QueryTranscriber/QPState.ts b/src/table/persistence/QueryTranscriber/QPState.ts index 2e9b6e2cd..c95b26c47 100644 --- a/src/table/persistence/QueryTranscriber/QPState.ts +++ b/src/table/persistence/QueryTranscriber/QPState.ts @@ -309,7 +309,7 @@ export default class QPState implements IQPState { */ isIdentifier(token: string): boolean { const match = token.match( - /^(?!true$)(?!false$)(?!guid')(?!binary')(?!X')(?!datetime')[a-zA-Z]/ + /^(?!true$)(?!false$)(?!guid')(?!binary')(?!X')(?!datetime')[_a-zA-Z]/ ); if (match !== null && match!.length > 0) { return true; diff --git a/tests/table/apis/table.entity.query.test.ts b/tests/table/apis/table.entity.query.test.ts index 09a0062ca..6b525f58d 100644 --- a/tests/table/apis/table.entity.query.test.ts +++ b/tests/table/apis/table.entity.query.test.ts @@ -980,4 +980,27 @@ describe("table Entity APIs test - using Azure/data-tables", () => { }); await tableClient.deleteTable(); }); + + it("should find a property identifier starting with underscore, @loki", async () => { + const tableClient = createAzureDataTablesClient( + testLocalAzuriteInstance, + getUniqueName("under") + ); + const partitionKey = createUniquePartitionKey(""); + const testEntity = { partitionKey, rowKey: "1", _foo: "bar" }; + + await tableClient.createTable({ requestOptions: { timeout: 60000 } }); + const result = await tableClient.createEntity(testEntity); + assert.ok(result.etag); + + const queryResult = await tableClient + .listEntities({ + queryOptions: { + filter: `PartitionKey eq '${partitionKey}' and _foo eq 'bar'` + } + }) + .next(); + assert.notStrictEqual(queryResult.value, undefined); + await tableClient.deleteTable(); + }); }); diff --git a/tests/table/unit/LokiJsQueryTranscriber.unit.test.2.ts b/tests/table/unit/LokiJsQueryTranscriber.unit.test.2.ts index 09c2a085e..0c4ac60c6 100644 --- a/tests/table/unit/LokiJsQueryTranscriber.unit.test.2.ts +++ b/tests/table/unit/LokiJsQueryTranscriber.unit.test.2.ts @@ -133,6 +133,10 @@ const entityQueries = [ { input: "PartitionKey eq 'I am ''good'' at TypeScript'", expected: "return ( item.PartitionKey === `I am 'good' at TypeScript` )" + }, + { + input: "_foo eq 'bar'", + expected: "return ( _foo === `bar` )" } ]; From 7f31f5dc26cc4d3cc522502114753bdf4e421744 Mon Sep 17 00:00:00 2001 From: Wei Wei Date: Tue, 14 Mar 2023 12:36:50 +0800 Subject: [PATCH 028/297] Change error code to 404 when account not exist (#1825) * Change error code to 404 when account not exist * Fix test failure --- ChangeLog.md | 4 + .../authentication/AccountSASAuthenticator.ts | 5 +- .../authentication/BlobSASAuthenticator.ts | 5 +- .../BlobSharedKeyAuthenticator.ts | 5 +- .../authentication/BlobTokenAuthenticator.ts | 5 +- src/blob/errors/StorageErrorFactory.ts | 9 ++ .../authentication/AccountSASAuthenticator.ts | 5 +- .../authentication/QueueSASAuthenticator.ts | 5 +- .../QueueSharedKeyAuthenticator.ts | 5 +- .../authentication/QueueTokenAuthenticator.ts | 5 +- src/queue/errors/StorageErrorFactory.ts | 11 ++ .../authentication/AccountSASAuthenticator.ts | 5 +- .../authentication/TableSASAuthenticator.ts | 5 +- .../TableSharedKeyAuthenticator.ts | 5 +- .../TableSharedKeyLiteAuthenticator.ts | 5 +- .../authentication/TableTokenAuthenticator.ts | 5 +- tests/blob/oauth.test.ts | 126 ++++++++++++++++- tests/queue/oauth.test.ts | 129 +++++++++++++++++- tests/table/auth/oauth.test.ts | 108 ++++++++++++++- 19 files changed, 408 insertions(+), 44 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index 41647df84..0bfb8d023 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -4,6 +4,10 @@ ## Upcoming Release +General: + +- Return 404 StatusCode when Storage account not exist + Table: - Fixed issue for querying on identifiers starting with underscore. diff --git a/src/blob/authentication/AccountSASAuthenticator.ts b/src/blob/authentication/AccountSASAuthenticator.ts index e376922e3..0cce278b1 100644 --- a/src/blob/authentication/AccountSASAuthenticator.ts +++ b/src/blob/authentication/AccountSASAuthenticator.ts @@ -50,9 +50,8 @@ export default class AccountSASAuthenticator implements IAuthenticator { // TODO: Make following async const accountProperties = this.accountDataStore.getAccount(account); if (accountProperties === undefined) { - throw StorageErrorFactory.getInvalidOperation( - context.contextId!, - "Invalid storage account." + throw StorageErrorFactory.ResourceNotFound( + context.contextId! ); } this.logger.debug( diff --git a/src/blob/authentication/BlobSASAuthenticator.ts b/src/blob/authentication/BlobSASAuthenticator.ts index 6c7b54887..d61f43ce8 100644 --- a/src/blob/authentication/BlobSASAuthenticator.ts +++ b/src/blob/authentication/BlobSASAuthenticator.ts @@ -71,9 +71,8 @@ export default class BlobSASAuthenticator implements IAuthenticator { // TODO: Make following async const accountProperties = this.accountDataStore.getAccount(account); if (accountProperties === undefined) { - throw StorageErrorFactory.getInvalidOperation( - context.contextId!, - "Invalid storage account." + throw StorageErrorFactory.ResourceNotFound( + blobContext.contextId! ); } this.logger.debug( diff --git a/src/blob/authentication/BlobSharedKeyAuthenticator.ts b/src/blob/authentication/BlobSharedKeyAuthenticator.ts index a2e5783c1..f762d5438 100644 --- a/src/blob/authentication/BlobSharedKeyAuthenticator.ts +++ b/src/blob/authentication/BlobSharedKeyAuthenticator.ts @@ -52,9 +52,8 @@ export default class BlobSharedKeyAuthenticator implements IAuthenticator { `BlobSharedKeyAuthenticator:validate() Invalid storage account ${account}.`, blobContext.contextId ); - throw StorageErrorFactory.getInvalidOperation( - blobContext.contextId!, - "Invalid storage account." + throw StorageErrorFactory.ResourceNotFound( + blobContext.contextId! ); } diff --git a/src/blob/authentication/BlobTokenAuthenticator.ts b/src/blob/authentication/BlobTokenAuthenticator.ts index 5167fb271..d81b9d82e 100644 --- a/src/blob/authentication/BlobTokenAuthenticator.ts +++ b/src/blob/authentication/BlobTokenAuthenticator.ts @@ -41,9 +41,8 @@ export default class BlobTokenAuthenticator implements IAuthenticator { `BlobTokenAuthenticator:validate() Invalid storage account ${account}.`, blobContext.contextId ); - throw StorageErrorFactory.getInvalidOperation( - blobContext.contextId!, - "Invalid storage account." + throw StorageErrorFactory.ResourceNotFound( + blobContext.contextId! ); } diff --git a/src/blob/errors/StorageErrorFactory.ts b/src/blob/errors/StorageErrorFactory.ts index 620ab2054..48a99b13d 100644 --- a/src/blob/errors/StorageErrorFactory.ts +++ b/src/blob/errors/StorageErrorFactory.ts @@ -73,6 +73,15 @@ export default class StorageErrorFactory { ); } + public static ResourceNotFound(contextID: string = DefaultID): StorageError { + return new StorageError( + 404, + "ResourceNotFound", + "The specified resource does not exist.", + contextID + ); + } + public static getInvalidQueryParameterValue( contextID: string = DefaultID, parameterName?: string, diff --git a/src/queue/authentication/AccountSASAuthenticator.ts b/src/queue/authentication/AccountSASAuthenticator.ts index 6cfdc3056..348103fb2 100644 --- a/src/queue/authentication/AccountSASAuthenticator.ts +++ b/src/queue/authentication/AccountSASAuthenticator.ts @@ -42,9 +42,8 @@ export default class AccountSASAuthenticator implements IAuthenticator { // TODO: Make following async const accountProperties = this.accountDataStore.getAccount(account); if (accountProperties === undefined) { - throw StorageErrorFactory.getInvalidOperation( - context.contextID!, - "Invalid storage account." + throw StorageErrorFactory.ResourceNotFound( + context.contextID! ); } this.logger.debug( diff --git a/src/queue/authentication/QueueSASAuthenticator.ts b/src/queue/authentication/QueueSASAuthenticator.ts index 1d13d993f..235e06f3d 100644 --- a/src/queue/authentication/QueueSASAuthenticator.ts +++ b/src/queue/authentication/QueueSASAuthenticator.ts @@ -61,9 +61,8 @@ export default class QueueSASAuthenticator implements IAuthenticator { // TODO: Make following async const accountProperties = this.accountDataStore.getAccount(account); if (accountProperties === undefined) { - throw StorageErrorFactory.getInvalidOperation( - context.contextID!, - "Invalid storage account." + throw StorageErrorFactory.ResourceNotFound( + context.contextID! ); } this.logger.debug( diff --git a/src/queue/authentication/QueueSharedKeyAuthenticator.ts b/src/queue/authentication/QueueSharedKeyAuthenticator.ts index fca635fa8..a6dc36378 100644 --- a/src/queue/authentication/QueueSharedKeyAuthenticator.ts +++ b/src/queue/authentication/QueueSharedKeyAuthenticator.ts @@ -43,9 +43,8 @@ export default class QueueSharedKeyAuthenticator implements IAuthenticator { `QueueSharedKeyAuthenticator:validate() Invalid storage account ${account}.`, queueContext.contextID ); - throw StorageErrorFactory.getInvalidOperation( - queueContext.contextID!, - "Invalid storage account." + throw StorageErrorFactory.ResourceNotFound( + context.contextID! ); } diff --git a/src/queue/authentication/QueueTokenAuthenticator.ts b/src/queue/authentication/QueueTokenAuthenticator.ts index 60c181ba5..f2b0a0879 100644 --- a/src/queue/authentication/QueueTokenAuthenticator.ts +++ b/src/queue/authentication/QueueTokenAuthenticator.ts @@ -41,9 +41,8 @@ export default class QueueTokenAuthenticator implements IAuthenticator { `QueueTokenAuthenticator:validate() Invalid storage account ${account}.`, queueContext.contextID ); - throw StorageErrorFactory.getInvalidOperation( - queueContext.contextID!, - "Invalid storage account." + throw StorageErrorFactory.ResourceNotFound( + context.contextID! ); } diff --git a/src/queue/errors/StorageErrorFactory.ts b/src/queue/errors/StorageErrorFactory.ts index fa2d826b3..e2b26d7a3 100644 --- a/src/queue/errors/StorageErrorFactory.ts +++ b/src/queue/errors/StorageErrorFactory.ts @@ -149,6 +149,17 @@ export default class StorageErrorFactory { return new StorageError(400, "InvalidOperation", message, contextID); } + public static ResourceNotFound( + contextID: string + ): StorageError { + return new StorageError( + 404, + "ResourceNotFound", + "The specified resource does not exist.", + contextID + ) + } + public static getAuthorizationSourceIPMismatch( contextID: string ): StorageError { diff --git a/src/table/authentication/AccountSASAuthenticator.ts b/src/table/authentication/AccountSASAuthenticator.ts index 6457e6de8..26c3c75b3 100644 --- a/src/table/authentication/AccountSASAuthenticator.ts +++ b/src/table/authentication/AccountSASAuthenticator.ts @@ -42,9 +42,8 @@ export default class AccountSASAuthenticator implements IAuthenticator { // TODO: Make following async const accountProperties = this.accountDataStore.getAccount(account); if (accountProperties === undefined) { - throw StorageErrorFactory.getInvalidOperation( - context, - "Invalid storage account." + throw StorageErrorFactory.ResourceNotFound( + context ); } this.logger.debug( diff --git a/src/table/authentication/TableSASAuthenticator.ts b/src/table/authentication/TableSASAuthenticator.ts index 7e179db30..aed9a367a 100644 --- a/src/table/authentication/TableSASAuthenticator.ts +++ b/src/table/authentication/TableSASAuthenticator.ts @@ -62,9 +62,8 @@ export default class TableSASAuthenticator implements IAuthenticator { // TODO: Make following async const accountProperties = this.accountDataStore.getAccount(account); if (accountProperties === undefined) { - throw StorageErrorFactory.getInvalidOperation( - context, - "Invalid storage account." + throw StorageErrorFactory.ResourceNotFound( + context ); } this.logger.debug( diff --git a/src/table/authentication/TableSharedKeyAuthenticator.ts b/src/table/authentication/TableSharedKeyAuthenticator.ts index f62f10a5f..7f98ab67f 100644 --- a/src/table/authentication/TableSharedKeyAuthenticator.ts +++ b/src/table/authentication/TableSharedKeyAuthenticator.ts @@ -43,9 +43,8 @@ export default class TableSharedKeyAuthenticator implements IAuthenticator { `TableSharedKeyAuthenticator:validate() Invalid storage account ${account}.`, tableContext.contextID ); - throw StorageErrorFactory.getInvalidOperation( - tableContext, - "Invalid storage account." + throw StorageErrorFactory.ResourceNotFound( + context ); } diff --git a/src/table/authentication/TableSharedKeyLiteAuthenticator.ts b/src/table/authentication/TableSharedKeyLiteAuthenticator.ts index 1dcda4195..8c3a6d9c4 100644 --- a/src/table/authentication/TableSharedKeyLiteAuthenticator.ts +++ b/src/table/authentication/TableSharedKeyLiteAuthenticator.ts @@ -46,9 +46,8 @@ export default class TableSharedKeyLiteAuthenticator implements IAuthenticator { `TableSharedKeyLiteAuthenticator:validate() Invalid storage account ${account}.`, tableContext.contextID ); - throw StorageErrorFactory.getInvalidOperation( - tableContext, - "Invalid storage account." + throw StorageErrorFactory.ResourceNotFound( + context ); } diff --git a/src/table/authentication/TableTokenAuthenticator.ts b/src/table/authentication/TableTokenAuthenticator.ts index 086da375c..548900de8 100644 --- a/src/table/authentication/TableTokenAuthenticator.ts +++ b/src/table/authentication/TableTokenAuthenticator.ts @@ -41,9 +41,8 @@ export default class TableTokenAuthenticator implements IAuthenticator { `TableTokenAuthenticator:validate() Invalid storage account ${account}.`, tableContext.contextID ); - throw StorageErrorFactory.getInvalidOperation( - tableContext, - "Invalid storage account." + throw StorageErrorFactory.ResourceNotFound( + context ); } diff --git a/tests/blob/oauth.test.ts b/tests/blob/oauth.test.ts index 651c9a69d..a6ce726a4 100644 --- a/tests/blob/oauth.test.ts +++ b/tests/blob/oauth.test.ts @@ -1,4 +1,4 @@ -import { AnonymousCredential, BlobServiceClient, ContainerClient, ContainerSASPermissions, generateBlobSASQueryParameters, newPipeline } from "@azure/storage-blob"; +import { AccountSASPermissions, AccountSASResourceTypes, AccountSASServices, AnonymousCredential, BlobServiceClient, ContainerClient, ContainerSASPermissions, generateAccountSASQueryParameters, generateBlobSASQueryParameters, newPipeline, SASProtocol } from "@azure/storage-blob"; import * as assert from "assert"; @@ -755,6 +755,130 @@ describe("Blob OAuth Basic", () => { assert.fail(); }); + it("Create container with not exist Account, return 404 @loki @sql", async () => { + const accountNameNotExist = "devstoreaccountnotexist"; + const baseURL = `https://${server.config.host}:${server.config.port}/${accountNameNotExist}`; + const containerName: string = getUniqueName("1container-with-dash"); + + // Shared key + const sharedKeyCredential = new StorageSharedKeyCredential( + accountNameNotExist, + EMULATOR_ACCOUNT_KEY + ); + let serviceClient = new BlobServiceClient( + baseURL, + newPipeline( + sharedKeyCredential, + { + retryOptions: { maxTries: 1 }, + // Make sure socket is closed once the operation is done. + keepAliveOptions: { enable: false } + } + ) + ); + let containerClientNotExist = serviceClient.getContainerClient(containerName); + try { + await containerClientNotExist.create(); + } catch (err) { + if (err.statusCode !== 404 && err.code !== 'ResourceNotFound'){ + assert.fail( "Create queue with shared key not fail as expected." + err.toString()); + } + } + + // Oauth + const token = generateJWTToken( + new Date("2019/01/01"), + new Date("2019/01/01"), + new Date("2100/01/01"), + "https://sts.windows-ppe.net/ab1f708d-50f6-404c-a006-d71b2ac7a606/", + "https://storage.azure.com", + "user_impersonation", + "23657296-5cd5-45b0-a809-d972a7f4dfe1", + "dd0d0df1-06c3-436c-8034-4b9a153097ce" + ); + + serviceClient = new BlobServiceClient( + baseURL, + newPipeline(new SimpleTokenCredential(token), { + retryOptions: { maxTries: 1 }, + // Make sure socket is closed once the operation is done. + keepAliveOptions: { enable: false } + }) + ); + containerClientNotExist = serviceClient.getContainerClient(containerName); + try { + await containerClientNotExist.create(); + } catch (err) { + if (err.statusCode !== 404 && err.code !== 'ResourceNotFound'){ + assert.fail( "Create queue with oauth not fail as expected." + err.toString()); + } + } + // Account SAS + const now = new Date(); + now.setMinutes(now.getMinutes() - 5); + const tmr = new Date(); + tmr.setDate(tmr.getDate() + 1); + const sas = generateAccountSASQueryParameters( + { + expiresOn: tmr, + ipRange: { start: "0.0.0.0", end: "255.255.255.255" }, + permissions: AccountSASPermissions.parse("rwdlacup"), + protocol: SASProtocol.HttpsAndHttp, + resourceTypes: AccountSASResourceTypes.parse("sco").toString(), + services: AccountSASServices.parse("btqf").toString(), + startsOn: now, + version: "2016-05-31" + }, + sharedKeyCredential + ).toString(); + let sasURL = `${serviceClient.url}?${sas}`; + serviceClient = new BlobServiceClient( + sasURL, + newPipeline(new AnonymousCredential(), { + // Make sure socket is closed once the operation is done. + keepAliveOptions: { enable: false } + }) + ); + containerClientNotExist = serviceClient.getContainerClient(containerName); + try { + await containerClientNotExist.create(); + } catch (err) { + if (err.statusCode !== 404 && err.code !== 'ResourceNotFound'){ + assert.fail( "Create queue with account sas not fail as expected." + err.toString()); + } + } + + // Service SAS + const containerSAS = generateBlobSASQueryParameters( + { + containerName, + expiresOn: tmr, + ipRange: { start: "0.0.0.0", end: "255.255.255.255" }, + permissions: ContainerSASPermissions.parse("racwdl"), + protocol: SASProtocol.HttpsAndHttp, + startsOn: now, + version: "2016-05-31" + }, + sharedKeyCredential + ); + sasURL = `${serviceClient.url}?${containerSAS}`; + serviceClient = new BlobServiceClient( + sasURL, + newPipeline(new AnonymousCredential(), { + // Make sure socket is closed once the operation is done. + keepAliveOptions: { enable: false } + }) + ); + containerClientNotExist = serviceClient.getContainerClient(containerName); + try { + await containerClientNotExist.create(); + } catch (err) { + if (err.statusCode !== 404 && err.code !== 'ResourceNotFound'){ + assert.fail( "Create queue with service sas not fail as expected." + err.toString()); + } + } + }); + it(`Should not work with HTTP @loki @sql`, async () => { await server.close(); await server.clean(); diff --git a/tests/queue/oauth.test.ts b/tests/queue/oauth.test.ts index fac9495f5..7494e0b37 100644 --- a/tests/queue/oauth.test.ts +++ b/tests/queue/oauth.test.ts @@ -1,4 +1,4 @@ -import { QueueServiceClient, newPipeline } from "@azure/storage-queue"; +import { QueueServiceClient, newPipeline, generateAccountSASQueryParameters, AccountSASPermissions, SASProtocol, AccountSASResourceTypes, AccountSASServices, AnonymousCredential, generateQueueSASQueryParameters, QueueSASPermissions, StorageSharedKeyCredential } from "@azure/storage-queue"; import * as assert from "assert"; import Server from "../../src/queue/QueueServer"; @@ -6,7 +6,7 @@ import Server from "../../src/queue/QueueServer"; import { configLogger } from "../../src/common/Logger"; import { StoreDestinationArray } from "../../src/common/persistence/IExtentStore"; import QueueConfiguration from "../../src/queue/QueueConfiguration"; -import { generateJWTToken, getUniqueName } from "../testutils"; +import { EMULATOR_ACCOUNT_KEY, generateJWTToken, getUniqueName } from "../testutils"; import { SimpleTokenCredential } from "../simpleTokenCredential"; // Set true to enable debug log @@ -405,6 +405,131 @@ describe("Queue OAuth Basic", () => { assert.fail(); }); + it("Create Queue with not exist Account, return 404 @loki @sql", async () => { + const accountNameNotExist = "devstoreaccountnotexist"; + const invalidBaseURL = `https://${server.config.host}:${port}/${accountNameNotExist}`; + const queueName: string = getUniqueName("queue"); + + // Shared key + const sharedKeyCredential = new StorageSharedKeyCredential( + accountNameNotExist, + EMULATOR_ACCOUNT_KEY + ); + let serviceClient = new QueueServiceClient( + invalidBaseURL, + newPipeline( + sharedKeyCredential, + { + retryOptions: { maxTries: 1 }, + // Make sure socket is closed once the operation is done. + keepAliveOptions: { enable: false } + } + ) + ); + let queueClientNotExist = serviceClient.getQueueClient(queueName); + try { + await queueClientNotExist.create(); + } catch (err) { + if (err.statusCode !== 404 && err.code !== 'ResourceNotFound'){ + assert.fail( "Create Queue with shared key not fail as expected." + err.toString()); + } + } + + // Oauth + const token = generateJWTToken( + new Date("2019/01/01"), + new Date("2019/01/01"), + new Date("2100/01/01"), + "https://sts.windows-ppe.net/ab1f708d-50f6-404c-a006-d71b2ac7a606/", + "https://storage.azure.com", + "user_impersonation", + "23657296-5cd5-45b0-a809-d972a7f4dfe1", + "dd0d0df1-06c3-436c-8034-4b9a153097ce" + ); + + serviceClient = new QueueServiceClient( + invalidBaseURL, + newPipeline(new SimpleTokenCredential(token), { + retryOptions: { maxTries: 1 }, + // Make sure socket is closed once the operation is done. + keepAliveOptions: { enable: false } + }) + ); + queueClientNotExist = serviceClient.getQueueClient(queueName); + try { + await queueClientNotExist.create(); + } catch (err) { + if (err.statusCode !== 404 && err.code !== 'ResourceNotFound'){ + assert.fail( "Create queue with oauth not fail as expected." + err.toString()); + } + } + + // Account SAS + const now = new Date(); + now.setMinutes(now.getMinutes() - 5); + const tmr = new Date(); + tmr.setDate(tmr.getDate() + 1); + const sas = generateAccountSASQueryParameters( + { + expiresOn: tmr, + ipRange: { start: "0.0.0.0", end: "255.255.255.255" }, + permissions: AccountSASPermissions.parse("rwdlacup"), + protocol: SASProtocol.HttpsAndHttp, + resourceTypes: AccountSASResourceTypes.parse("sco").toString(), + services: AccountSASServices.parse("btqf").toString(), + startsOn: now, + version: "2016-05-31" + }, + sharedKeyCredential + ).toString(); + let sasURL = `${serviceClient.url}?${sas}`; + let serviceClientSas = new QueueServiceClient( + sasURL, + newPipeline(new AnonymousCredential(), { + // Make sure socket is closed once the operation is done. + keepAliveOptions: { enable: false } + }) + ); + queueClientNotExist = serviceClientSas.getQueueClient(queueName); + try { + await queueClientNotExist.create(); + } catch (err) { + if (err.statusCode !== 404 && err.code !== 'ResourceNotFound'){ + assert.fail( "Create queue with account sas not fail as expected." + err.toString()); + } + } + + // Service SAS + const queueSAS = generateQueueSASQueryParameters( + { + queueName, + expiresOn: tmr, + ipRange: { start: "0.0.0.0", end: "255.255.255.255" }, + permissions: QueueSASPermissions.parse("raup"), + protocol: SASProtocol.HttpsAndHttp, + startsOn: now, + version: "2019-02-02" + }, + sharedKeyCredential + ); + sasURL = `${serviceClient.url}?${queueSAS}`; + serviceClientSas = new QueueServiceClient( + sasURL, + newPipeline(new AnonymousCredential(), { + // Make sure socket is closed once the operation is done. + keepAliveOptions: { enable: false } + }) + ); + queueClientNotExist = serviceClientSas.getQueueClient(queueName); + try { + await queueClientNotExist.create(); + } catch (err) { + if (err.statusCode !== 404 && err.code !== 'ResourceNotFound'){ + assert.fail( "Create queue with service sas not fail as expected." + err.toString()); + } + } + }); + it(`Should not work with HTTP @loki @sql`, async () => { await server.close(); await server.clean(); diff --git a/tests/table/auth/oauth.test.ts b/tests/table/auth/oauth.test.ts index 9c3ab73a7..a2648d9fc 100644 --- a/tests/table/auth/oauth.test.ts +++ b/tests/table/auth/oauth.test.ts @@ -1,11 +1,12 @@ -import { TableClient } from "@azure/data-tables"; +import { AzureNamedKeyCredential, AzureSASCredential, generateTableSas, TableClient } from "@azure/data-tables"; import * as assert from "assert"; import { configLogger } from "../../../src/common/Logger"; import TableTestServerFactory from "../utils/TableTestServerFactory"; -import { generateJWTToken, getUniqueName } from "../../testutils"; +import { EMULATOR_ACCOUNT_KEY, generateJWTToken, getUniqueName } from "../../testutils"; import { SimpleTokenCredential } from "../../simpleTokenCredential"; +import { AccountSASPermissions, AccountSASResourceTypes, AccountSASServices, generateAccountSASQueryParameters, SASProtocol, StorageSharedKeyCredential } from "@azure/storage-blob"; // Set true to enable debug log configLogger(false); @@ -424,4 +425,107 @@ describe("Table OAuth Basic", () => { } assert.fail(); }); + + it("Create Table with not exist Account, return 404 @loki @sql", async () => { + const accountNameNotExist = "devstoreaccountnotexist"; + const baseURL = `https://${server.config.host}:${server.config.port}/${accountNameNotExist}`; + const tableName: string = getUniqueName("table"); + + // Shared key + const sharedKeyCredential = new AzureNamedKeyCredential( + accountNameNotExist, + EMULATOR_ACCOUNT_KEY + ); + let tableClient = new TableClient( + baseURL, + tableName, + sharedKeyCredential + ); + try { + await tableClient.createTable(); + } catch (err) { + if (err.statusCode !== 404 || err.response.parsedBody.Code !== 'ResourceNotFound'){ + assert.fail( "Create Table with shared key not fail as expected." + err.toString()); + } + } + + // Oauth + const token = generateJWTToken( + new Date("2019/01/01"), + new Date("2019/01/01"), + new Date("2100/01/01"), + "https://sts.windows-ppe.net/ab1f708d-50f6-404c-a006-d71b2ac7a606/", + "https://storage.azure.com", + "user_impersonation", + "23657296-5cd5-45b0-a809-d972a7f4dfe1", + "dd0d0df1-06c3-436c-8034-4b9a153097ce" + ); + tableClient = new TableClient( + baseURL, + tableName, + new SimpleTokenCredential(token), + { + redirectOptions: { maxRetries: 1 } + } + ); + try { + await tableClient.createTable(); + } catch (err) { + if (err.statusCode !== 404 || err.response.parsedBody.Code !== 'ResourceNotFound'){ + assert.fail( "Create Table with oauth not fail as expected." + err.toString()); + } + } + + // Account SAS + const now = new Date(); + now.setMinutes(now.getMinutes() - 5); + const tmr = new Date(); + tmr.setDate(tmr.getDate() + 1); + let sas = generateAccountSASQueryParameters( + { + expiresOn: tmr, + ipRange: { start: "0.0.0.0", end: "255.255.255.255" }, + permissions: AccountSASPermissions.parse("rwdlacup"), + protocol: SASProtocol.HttpsAndHttp, + resourceTypes: AccountSASResourceTypes.parse("sco").toString(), + services: AccountSASServices.parse("btqf").toString(), + startsOn: now, + version: "2016-05-31" + }, + new StorageSharedKeyCredential( + accountNameNotExist, + EMULATOR_ACCOUNT_KEY + ) + ).toString(); + tableClient = new TableClient( + baseURL, + tableName, + new AzureSASCredential(sas) + ); + try { + await tableClient.createTable(); + } catch (err) { + if (err.statusCode !== 404 || err.response.parsedBody.Code !== 'ResourceNotFound'){ + assert.fail( "Create Table with account sas not fail as expected." + err.toString()); + } + } + + // Service SAS + sas = generateTableSas( + tableName, + sharedKeyCredential, + ).toString(); + tableClient = new TableClient( + baseURL, + tableName, + new AzureSASCredential(sas) + ); + try { + await tableClient.createTable(); + } catch (err) { + if (err.statusCode !== 404 || err.response.parsedBody.Code !== 'ResourceNotFound'){ + assert.fail( "Create Table with service sas not fail as expected." + err.toString()); + } + } + }); }); From f171b5a8af70efb4ef9bbc6facfa95cc60743910 Mon Sep 17 00:00:00 2001 From: Wei Wei Date: Wed, 15 Mar 2023 15:03:46 +0800 Subject: [PATCH 029/297] migrate tslint to eslint, and typescript 4.2.4->4.9.5 (#1831) * migrate tslint to eslint * move pipeline from node 10/12 to node 14/16/18 * Fix test run timeout * Add change log * Add back prettier --- .eslintrc.js | 31 + ChangeLog.md | 3 + azure-pipelines.yml | 72 +- package-lock.json | 6263 ++++++----------- package.json | 21 +- .../persistence/LokiQueueMetadataStore.ts | 6 +- src/table/batch/TableBatchSerialization.ts | 3 +- tsconfig.json | 4 +- 8 files changed, 2313 insertions(+), 4090 deletions(-) create mode 100644 .eslintrc.js diff --git a/.eslintrc.js b/.eslintrc.js new file mode 100644 index 000000000..02be4f512 --- /dev/null +++ b/.eslintrc.js @@ -0,0 +1,31 @@ +module.exports = { + extends: ['eslint:recommended', 'plugin:@typescript-eslint/recommended'], + "rules": { + // For source code, disable now, might enable in the future + "no-useless-escape": "off", + "prefer-const": "off", + "no-prototype-builtins": "off", + "no-useless-catch": "off", + "no-case-declarations": "off", + "no-fallthrough": "off", + "no-control-regex": "off", + "no-self-assign": "off", + "@typescript-eslint/no-var-requires": "off", + "@typescript-eslint/no-non-null-assertion": "off", + "@typescript-eslint/no-inferrable-types": "off", + "@typescript-eslint/no-explicit-any": "off", + "@typescript-eslint/no-unused-vars": "off", + "@typescript-eslint/no-extra-semi": "off", + + // For other code, might enable in the future + //"no-unreachable": "off", + //"no-empty": "off", + //"no-fallthrough": "off", + //"no-unsafe-finally": "off", + //"no-undef": "off", + //"@typescript-eslint/ban-types": "off", + }, + parser: '@typescript-eslint/parser', + plugins: ['@typescript-eslint'], + root: true, +}; \ No newline at end of file diff --git a/ChangeLog.md b/ChangeLog.md index 0bfb8d023..e7e0442f3 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -7,6 +7,9 @@ General: - Return 404 StatusCode when Storage account not exist +- Migrated tslint to eslint. +- Typescript upgraded from 4.2.4 to 4.9.5. +- Migrated test pipeline from Node.js 10/12 to Node.js 14/16/18. Table: diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 42081551a..b159421dc 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -14,13 +14,13 @@ jobs: - job: blobtestubuntu20_04 displayName: Blob Test Linux Ubuntu 20.04 LTS pool: - vmImage: "ubuntu-latest" + vmImage: "ubuntu-20.04" strategy: matrix: - node_10_x: - node_version: 10.x node_12_x: node_version: 12.x + node_14_x: + node_version: 14.x steps: - task: NodeTool@0 inputs: @@ -38,16 +38,16 @@ jobs: displayName: "npm run test:blob" env: {} - - job: blobtestubuntu18_04 - displayName: Blob Test Linux Ubuntu 18.04 + - job: blobtestubuntu22_04 + displayName: Blob Test Linux Ubuntu 22.04 pool: vmImage: "ubuntu-latest" strategy: matrix: - node_10_x: - node_version: 10.x - node_12_x: - node_version: 12.x + node_16_x: + node_version: 16.x + node_18_x: + node_version: 18.x steps: - task: NodeTool@0 inputs: @@ -71,10 +71,10 @@ jobs: vmImage: "windows-latest" strategy: matrix: - node_10_x: - node_version: 10.x - node_12_x: - node_version: 12.x + node_14_x: + node_version: 14.x + node_16_x: + node_version: 16.x steps: - task: NodeTool@0 inputs: @@ -98,10 +98,10 @@ jobs: vmImage: "macOS-latest" strategy: matrix: - node_10_x: - node_version: 10.x - node_12_x: - node_version: 12.x + node_14_x: + node_version: 14.x + node_16_x: + node_version: 16.x steps: - task: NodeTool@0 inputs: @@ -125,10 +125,10 @@ jobs: vmImage: "ubuntu-latest" strategy: matrix: - node_10_x: - node_version: 10.x - node_12_x: - node_version: 12.x + node_14_x: + node_version: 14.x + node_16_x: + node_version: 16.x steps: - task: NodeTool@0 inputs: @@ -160,10 +160,10 @@ jobs: vmImage: "ubuntu-latest" strategy: matrix: - node_10_x: - node_version: 10.x - node_12_x: - node_version: 12.x + node_14_x: + node_version: 14.x + node_16_x: + node_version: 16.x steps: - task: NodeTool@0 inputs: @@ -187,10 +187,10 @@ jobs: vmImage: "windows-latest" strategy: matrix: - node_10_x: - node_version: 10.x - node_12_x: - node_version: 12.x + node_16_x: + node_version: 16.x + node_18_x: + node_version: 18.x steps: - task: NodeTool@0 inputs: @@ -214,10 +214,10 @@ jobs: vmImage: "macOS-latest" strategy: matrix: - node_10_x: - node_version: 10.x - node_12_x: - node_version: 12.x + node_14_x: + node_version: 14.x + node_16_x: + node_version: 16.x steps: - task: NodeTool@0 inputs: @@ -298,10 +298,10 @@ jobs: strategy: matrix: # Table tests no longer suport older node versions - node_14_x: - node_version: 14.x node_16_x: node_version: 16.x + node_18_x: + node_version: 18.x steps: - task: NodeTool@0 inputs: @@ -511,7 +511,7 @@ jobs: # our .exe build program is currently incompatible with node 10 # node_10_x: # node_version: 10.x - node_12_x: + node_14_x: node_version: 14.x steps: - task: NodeTool@0 diff --git a/package-lock.json b/package-lock.json index 56e088b20..d60e584d2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -64,22 +64,23 @@ "@types/validator": "^13.1.4", "@types/vscode": "^1.39.0", "@types/xml2js": "^0.4.3", + "@typescript-eslint/eslint-plugin": "^5.54.1", + "@typescript-eslint/parser": "^5.54.1", "autorest": "^3.6.0", "azure-storage": "^2.10.3", "cross-env": "^6.0.3", "cross-var": "^1.1.0", + "eslint": "^8.35.0", "find-process": "^1.4.4", "husky": "^8.0.1", "lint-staged": "^13.0.0", "mocha": "^5.2.0", "pkg": "^5.3.0", "prettier": "^2.2.1", - "prettier-tslint": "^0.4.2", "rcedit": "^3.0.1", "ts-mockito": "^2.6.1", "ts-node": "^10.0.0", - "tslint": "^6.1.3", - "typescript": "^4.2.4", + "typescript": "^4.9.5", "vsce": "^2.7.0" }, "engines": { @@ -629,15 +630,6 @@ "node": ">=12.0.0" } }, - "node_modules/@babel/code-frame": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", - "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", - "dev": true, - "dependencies": { - "@babel/highlight": "^7.10.4" - } - }, "node_modules/@babel/generator": { "version": "7.18.2", "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.2.tgz", @@ -673,23 +665,6 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/highlight": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", - "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", - "dev": true, - "dependencies": { - "@babel/helper-validator-identifier": "^7.10.4", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "node_modules/@babel/highlight/node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, "node_modules/@babel/parser": { "version": "7.18.4", "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.4.tgz", @@ -754,6 +729,198 @@ "kuler": "^2.0.0" } }, + "node_modules/@eslint/eslintrc": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.0.tgz", + "integrity": "sha512-fluIaaV+GyV24CCu/ggiHdV+j4RNh85yQnAYS/G2mZODZgGmmlrgCydjUcV3YvxCm9x8nMAfThsqTni4KiXT4A==", + "dev": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.4.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/@eslint/eslintrc/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "13.20.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", + "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/eslintrc/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@eslint/eslintrc/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@eslint/eslintrc/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/@eslint/eslintrc/node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/eslintrc/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/js": { + "version": "8.35.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.35.0.tgz", + "integrity": "sha512-JXdzbRiWclLVoD8sNUjR443VVlYqiYmDVT6rGUEIEHU5YJW0gaVZwV2xgM7D4arkvASqD0IlLUVjHiFuxaftRw==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.8", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz", + "integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==", + "dev": true, + "dependencies": { + "@humanwhocodes/object-schema": "^1.2.1", + "debug": "^4.1.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/config-array/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@humanwhocodes/config-array/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@humanwhocodes/config-array/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "dev": true + }, "node_modules/@jridgewell/gen-mapping": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", @@ -888,25 +1055,6 @@ "node": ">= 8" } }, - "node_modules/@mrmlnc/readdir-enhanced": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz", - "integrity": "sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==", - "dev": true, - "dependencies": { - "call-me-maybe": "^1.0.1", - "glob-to-regexp": "^0.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@mrmlnc/readdir-enhanced/node_modules/glob-to-regexp": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz", - "integrity": "sha512-Iozmtbqv0noj0uDDqoL0zNq0VBEfK2YFoMAZoxJe4cwphvLR+JskfF30QhXHOR4m3KrE6NLRYw+U9MRXvifyig==", - "dev": true - }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -929,15 +1077,6 @@ "node": ">= 8" } }, - "node_modules/@nodelib/fs.stat": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz", - "integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, "node_modules/@nodelib/fs.walk": { "version": "1.2.8", "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", @@ -1099,6 +1238,12 @@ "integrity": "sha512-S0mIukll6fbF0tvrKic/jj+jI8SHoSvGU+Cs95b/jzZEnBYCbj+7aJtQ9yeABuK3xP1okwA3jEH9qIRayijnvQ==", "dev": true }, + "node_modules/@types/json-schema": { + "version": "7.0.11", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", + "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", + "dev": true + }, "node_modules/@types/jsonwebtoken": { "version": "8.5.9", "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-8.5.9.tgz", @@ -1184,6 +1329,12 @@ "@types/node": "*" } }, + "node_modules/@types/semver": { + "version": "7.3.13", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.13.tgz", + "integrity": "sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==", + "dev": true + }, "node_modules/@types/serve-static": { "version": "1.13.3", "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.3.tgz", @@ -1247,73 +1398,95 @@ "@types/node": "*" } }, - "node_modules/accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "5.54.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.54.1.tgz", + "integrity": "sha512-a2RQAkosH3d3ZIV08s3DcL/mcGc2M/UC528VkPULFxR9VnVPT8pBu0IyBAJJmVsCmhVfwQX1v6q+QGnmSe1bew==", + "dev": true, "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" + "@typescript-eslint/scope-manager": "5.54.1", + "@typescript-eslint/type-utils": "5.54.1", + "@typescript-eslint/utils": "5.54.1", + "debug": "^4.3.4", + "grapheme-splitter": "^1.0.4", + "ignore": "^5.2.0", + "natural-compare-lite": "^1.4.0", + "regexpp": "^3.2.0", + "semver": "^7.3.7", + "tsutils": "^3.21.0" }, "engines": { - "node": ">= 0.6" - } - }, - "node_modules/accepts/node_modules/mime-db": { - "version": "1.51.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz", - "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/accepts/node_modules/mime-types": { - "version": "2.1.34", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz", - "integrity": "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==", - "dependencies": { - "mime-db": "1.51.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, - "engines": { - "node": ">= 0.6" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^5.0.0", + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/acorn": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.5.0.tgz", - "integrity": "sha512-yXbYeFy+jUuYd3/CDcg2NkIYE991XYX/bje7LmjJigUciaeO1JR4XxXgCIV1/Zc/dRuFEyw1L0pbA+qynJkW5Q==", + "node_modules/@typescript-eslint/eslint-plugin/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dev": true, - "bin": { - "acorn": "bin/acorn" + "dependencies": { + "ms": "2.1.2" }, "engines": { - "node": ">=0.4.0" + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "node_modules/acorn-walk": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", - "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } + "node_modules/@typescript-eslint/eslint-plugin/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true }, - "node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "node_modules/@typescript-eslint/parser": { + "version": "5.54.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.54.1.tgz", + "integrity": "sha512-8zaIXJp/nG9Ff9vQNh7TI+C3nA6q6iIsGJ4B4L6MhZ7mHnTMR4YP5vp2xydmFXIy8rpyIVbNAG44871LMt6ujg==", + "dev": true, "dependencies": { - "debug": "4" + "@typescript-eslint/scope-manager": "5.54.1", + "@typescript-eslint/types": "5.54.1", + "@typescript-eslint/typescript-estree": "5.54.1", + "debug": "^4.3.4" }, "engines": { - "node": ">= 6.0.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/agent-base/node_modules/debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "node_modules/@typescript-eslint/parser/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, "dependencies": { "ms": "2.1.2" }, @@ -1326,15 +1499,282 @@ } } }, - "node_modules/agent-base/node_modules/ms": { + "node_modules/@typescript-eslint/parser/node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true }, - "node_modules/aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "node_modules/@typescript-eslint/scope-manager": { + "version": "5.54.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.54.1.tgz", + "integrity": "sha512-zWKuGliXxvuxyM71UA/EcPxaviw39dB2504LqAmFDjmkpO8qNLHcmzlh6pbHs1h/7YQ9bnsO8CCcYCSA8sykUg==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.54.1", + "@typescript-eslint/visitor-keys": "5.54.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "5.54.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.54.1.tgz", + "integrity": "sha512-WREHsTz0GqVYLIbzIZYbmUUr95DKEKIXZNH57W3s+4bVnuF1TKe2jH8ZNH8rO1CeMY3U4j4UQeqPNkHMiGem3g==", + "dev": true, + "dependencies": { + "@typescript-eslint/typescript-estree": "5.54.1", + "@typescript-eslint/utils": "5.54.1", + "debug": "^4.3.4", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/@typescript-eslint/types": { + "version": "5.54.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.54.1.tgz", + "integrity": "sha512-G9+1vVazrfAfbtmCapJX8jRo2E4MDXxgm/IMOF4oGh3kq7XuK3JRkOg6y2Qu1VsTRmWETyTkWt1wxy7X7/yLkw==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "5.54.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.54.1.tgz", + "integrity": "sha512-bjK5t+S6ffHnVwA0qRPTZrxKSaFYocwFIkZx5k7pvWfsB1I57pO/0M0Skatzzw1sCkjJ83AfGTL0oFIFiDX3bg==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.54.1", + "@typescript-eslint/visitor-keys": "5.54.1", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/@typescript-eslint/utils": { + "version": "5.54.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.54.1.tgz", + "integrity": "sha512-IY5dyQM8XD1zfDe5X8jegX6r2EVU5o/WJnLu/znLPWCBF7KNGC+adacXnt5jEYS9JixDcoccI6CvE4RCjHMzCQ==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.9", + "@types/semver": "^7.3.12", + "@typescript-eslint/scope-manager": "5.54.1", + "@typescript-eslint/types": "5.54.1", + "@typescript-eslint/typescript-estree": "5.54.1", + "eslint-scope": "^5.1.1", + "eslint-utils": "^3.0.0", + "semver": "^7.3.7" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "5.54.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.54.1.tgz", + "integrity": "sha512-q8iSoHTgwCfgcRJ2l2x+xCbu8nBlRAlsQ33k24Adj8eoVBE0f8dUeI+bAa8F84Mv05UGbAx57g2zrRsYIooqQg==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.54.1", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/accepts/node_modules/mime-db": { + "version": "1.51.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz", + "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/accepts/node_modules/mime-types": { + "version": "2.1.34", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz", + "integrity": "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==", + "dependencies": { + "mime-db": "1.51.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.8.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", + "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/agent-base/node_modules/debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/agent-base/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", "dev": true, "dependencies": { "clean-stack": "^2.0.0", @@ -1417,15 +1857,6 @@ "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", "dev": true }, - "node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, "node_modules/args": { "version": "5.0.3", "resolved": "https://registry.npmjs.org/args/-/args-5.0.3.tgz", @@ -1440,77 +1871,11 @@ "node": ">= 6.0.0" } }, - "node_modules/arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/arr-flatten": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/arr-union": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/array-flatten": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" }, - "node_modules/array-union": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", - "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", - "dev": true, - "dependencies": { - "array-uniq": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/array-uniq": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/asn1": { "version": "0.2.6", "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", @@ -1529,15 +1894,6 @@ "node": ">=0.8" } }, - "node_modules/assign-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/astral-regex": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", @@ -1566,18 +1922,6 @@ "node": ">= 4.0.0" } }, - "node_modules/atob": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", - "dev": true, - "bin": { - "atob": "bin/atob.js" - }, - "engines": { - "node": ">= 4.5.0" - } - }, "node_modules/autorest": { "version": "3.6.2", "resolved": "https://registry.npmjs.org/autorest/-/autorest-3.6.2.tgz", @@ -2600,74 +2944,6 @@ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" }, - "node_modules/base": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", - "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", - "dev": true, - "dependencies": { - "cache-base": "^1.0.1", - "class-utils": "^0.3.5", - "component-emitter": "^1.2.1", - "define-property": "^1.0.0", - "isobject": "^3.0.1", - "mixin-deep": "^1.2.0", - "pascalcase": "^0.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/base/node_modules/define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "dependencies": { - "is-descriptor": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/base/node_modules/is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/base/node_modules/is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/base/node_modules/is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "dependencies": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/base64-js": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", @@ -2810,39 +3086,6 @@ "concat-map": "0.0.1" } }, - "node_modules/braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "dependencies": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/braces/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/browser-stdout": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", @@ -2893,15 +3136,6 @@ "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", "integrity": "sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk=" }, - "node_modules/builtin-modules": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", - "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/bytes": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", @@ -2910,26 +3144,6 @@ "node": ">= 0.8" } }, - "node_modules/cache-base": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", - "dev": true, - "dependencies": { - "collection-visit": "^1.0.0", - "component-emitter": "^1.2.1", - "get-value": "^2.0.6", - "has-value": "^1.0.0", - "isobject": "^3.0.1", - "set-value": "^2.0.0", - "to-object-path": "^0.3.0", - "union-value": "^1.0.0", - "unset-value": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/call-bind": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", @@ -2942,11 +3156,14 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/call-me-maybe": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz", - "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=", - "dev": true + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } }, "node_modules/camelcase": { "version": "5.0.0", @@ -3018,33 +3235,6 @@ "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", "dev": true }, - "node_modules/class-utils": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", - "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", - "dev": true, - "dependencies": { - "arr-union": "^3.1.0", - "define-property": "^0.2.5", - "isobject": "^3.0.0", - "static-extend": "^0.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/class-utils/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "dependencies": { - "is-descriptor": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/clean-stack": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", @@ -3132,120 +3322,6 @@ "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "node_modules/cliui": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", - "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", - "dev": true, - "dependencies": { - "string-width": "^2.1.1", - "strip-ansi": "^4.0.0", - "wrap-ansi": "^2.0.0" - } - }, - "node_modules/cliui/node_modules/ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/cliui/node_modules/is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/cliui/node_modules/string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "dependencies": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/cliui/node_modules/strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "dependencies": { - "ansi-regex": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/cliui/node_modules/wrap-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", - "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", - "dev": true, - "dependencies": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/cliui/node_modules/wrap-ansi/node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/cliui/node_modules/wrap-ansi/node_modules/is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "dependencies": { - "number-is-nan": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/cliui/node_modules/wrap-ansi/node_modules/string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "dependencies": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/cliui/node_modules/wrap-ansi/node_modules/strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "dependencies": { - "ansi-regex": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/code-point-at": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", @@ -3255,19 +3331,6 @@ "node": ">=0.10.0" } }, - "node_modules/collection-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", - "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", - "dev": true, - "dependencies": { - "map-visit": "^1.0.0", - "object-visit": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/color": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/color/-/color-3.2.1.tgz", @@ -3325,18 +3388,6 @@ "node": ">= 0.8" } }, - "node_modules/commander": { - "version": "2.20.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz", - "integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==", - "dev": true - }, - "node_modules/component-emitter": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", - "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", - "dev": true - }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -3408,15 +3459,6 @@ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" }, - "node_modules/copy-descriptor": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/core-js": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.9.tgz", @@ -3626,24 +3668,6 @@ "ms": "2.0.0" } }, - "node_modules/decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/decode-uri-component": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", - "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==", - "dev": true, - "engines": { - "node": ">=0.10" - } - }, "node_modules/decompress-response": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-4.2.1.tgz", @@ -3665,6 +3689,12 @@ "node": ">=4.0.0" } }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, "node_modules/define-lazy-prop": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", @@ -3688,57 +3718,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", - "dev": true, - "dependencies": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/define-property/node_modules/is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/define-property/node_modules/is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/define-property/node_modules/is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "dependencies": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -3811,17 +3790,16 @@ "node": ">=0.3.1" } }, - "node_modules/dir-glob": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.0.0.tgz", - "integrity": "sha512-37qirFDz8cA5fimp9feo43fSuRo2gHwaIn6dXL8Ber1dGwUosDrGZeCCXq57WnIqE4aQ+u3eQZzsk1yOzhdwag==", + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", "dev": true, "dependencies": { - "arrify": "^1.0.1", - "path-type": "^3.0.0" + "esutils": "^2.0.2" }, "engines": { - "node": ">=4" + "node": ">=6.0.0" } }, "node_modules/dom-serializer": { @@ -4041,147 +4019,502 @@ "node": ">=0.8.0" } }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "node_modules/eslint": { + "version": "8.35.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.35.0.tgz", + "integrity": "sha512-BxAf1fVL7w+JLRQhWl2pzGeSiGqbWumV4WNvc9Rhp6tiCtm4oHnyPBSEtMGZwrQgudFQ+otqzWoPB7x+hxoWsw==", "dev": true, + "dependencies": { + "@eslint/eslintrc": "^2.0.0", + "@eslint/js": "8.35.0", + "@humanwhocodes/config-array": "^0.11.8", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.1.1", + "eslint-utils": "^3.0.0", + "eslint-visitor-keys": "^3.3.0", + "espree": "^9.4.0", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "grapheme-splitter": "^1.0.4", + "ignore": "^5.2.0", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-sdsl": "^4.1.4", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "regexpp": "^3.2.0", + "strip-ansi": "^6.0.1", + "strip-json-comments": "^3.1.0", + "text-table": "^0.2.0" + }, "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" + "eslint": "bin/eslint.js" }, "engines": { - "node": ">=4" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, "engines": { - "node": ">=0.10.0" + "node": ">=8.0.0" } }, - "node_modules/etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", + "node_modules/eslint-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^2.0.0" + }, "engines": { - "node": ">= 0.6" + "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=5" } }, - "node_modules/events": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.1.0.tgz", - "integrity": "sha512-Rv+u8MLHNOdMjTAFeT3nCjHn2aGlx435FP/sDHNaRhDEMwyI/aB22Kj2qIN8R0cw3z28psEQLYwxVKLsKrMgWg==", + "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "dev": true, "engines": { - "node": ">=0.8.x" + "node": ">=10" } }, - "node_modules/execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "node_modules/eslint-visitor-keys": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", + "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/eslint/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "dependencies": { - "cross-spawn": "^6.0.0", - "get-stream": "^4.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" + "color-convert": "^2.0.1" }, "engines": { - "node": ">=6" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/execa/node_modules/cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "node_modules/eslint/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/eslint/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "dependencies": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": ">=4.8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/execa/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "node_modules/eslint/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/eslint/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/eslint/node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/eslint/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/eslint/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/eslint-scope": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", + "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/eslint/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/eslint/node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/eslint/node_modules/globals": { + "version": "13.20.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", + "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, "bin": { - "semver": "bin/semver" + "js-yaml": "bin/js-yaml.js" } }, - "node_modules/exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", + "node_modules/eslint/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, "engines": { - "node": ">= 0.8.0" + "node": "*" + } + }, + "node_modules/eslint/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/eslint/node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" } }, - "node_modules/expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "node_modules/eslint/node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, "dependencies": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" + "shebang-regex": "^3.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/expand-brackets/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "node_modules/eslint/node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "dependencies": { - "ms": "2.0.0" + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/expand-brackets/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "node_modules/eslint/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "dependencies": { - "is-descriptor": "^0.1.0" + "has-flag": "^4.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/expand-brackets/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "node_modules/eslint/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, "dependencies": { - "is-extendable": "^0.1.0" + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/espree": { + "version": "9.4.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.1.tgz", + "integrity": "sha512-XwctdmTO6SIvCzd9810yyNzIrOrqNYV9Koizx4C/mRhf9uq0o4yHoCEU/670pOxOL/MSraektvSAji79kX90Vg==", + "dev": true, + "dependencies": { + "acorn": "^8.8.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "dev": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esquery/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, "engines": { "node": ">=0.10.0" } }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/events": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.1.0.tgz", + "integrity": "sha512-Rv+u8MLHNOdMjTAFeT3nCjHn2aGlx435FP/sDHNaRhDEMwyI/aB22Kj2qIN8R0cw3z28psEQLYwxVKLsKrMgWg==", + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/expand-template": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", @@ -4276,112 +4609,6 @@ "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", "dev": true }, - "node_modules/extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, - "dependencies": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extend-shallow/node_modules/is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "dependencies": { - "is-plain-object": "^2.0.4" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "dev": true, - "dependencies": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extglob/node_modules/define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "dependencies": { - "is-descriptor": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extglob/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extglob/node_modules/is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extglob/node_modules/is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extglob/node_modules/is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "dependencies": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/extsprintf": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", @@ -4397,29 +4624,18 @@ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", "dev": true }, - "node_modules/fast-glob": { - "version": "2.2.7", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.7.tgz", - "integrity": "sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw==", - "dev": true, - "dependencies": { - "@mrmlnc/readdir-enhanced": "^2.2.1", - "@nodelib/fs.stat": "^1.1.2", - "glob-parent": "^3.1.0", - "is-glob": "^4.0.0", - "merge2": "^1.2.3", - "micromatch": "^3.1.10" - }, - "engines": { - "node": ">=4.0.0" - } - }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", "dev": true }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, "node_modules/fast-xml-parser": { "version": "4.0.7", "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.0.7.tgz", @@ -4459,31 +4675,16 @@ "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.1.tgz", "integrity": "sha512-MMMQ0ludy/nBs1/o0zVOiKTpG7qMbonKUzjJgQFEuvq6INZ1OraKPRAWkBq5vlKLOUMpmNYG1JoN3oDPUQ9m3Q==" }, - "node_modules/fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "dependencies": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/fill-range/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", "dev": true, "dependencies": { - "is-extendable": "^0.1.0" + "flat-cache": "^3.0.4" }, "engines": { - "node": ">=0.10.0" + "node": "^10.12.0 || >=12.0.0" } }, "node_modules/finalhandler": { @@ -4638,6 +4839,50 @@ "node": ">=8" } }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/find-up/node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "dev": true, + "dependencies": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", + "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", + "dev": true + }, "node_modules/fn.name": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz", @@ -4662,15 +4907,6 @@ } } }, - "node_modules/for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/forever-agent": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", @@ -4701,18 +4937,6 @@ "node": ">= 0.6" } }, - "node_modules/fragment-cache": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", - "dev": true, - "dependencies": { - "map-cache": "^0.2.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/fresh": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", @@ -4800,12 +5024,6 @@ "is-property": "^1.0.2" } }, - "node_modules/get-caller-file": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", - "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", - "dev": true - }, "node_modules/get-intrinsic": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", @@ -4819,18 +5037,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "dev": true, - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/get-symbol-description": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", @@ -4846,15 +5052,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/get-value": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/getpass": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", @@ -4886,28 +5083,6 @@ "node": "*" } }, - "node_modules/glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", - "dev": true, - "dependencies": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" - } - }, - "node_modules/glob-parent/node_modules/is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dev": true, - "dependencies": { - "is-extglob": "^2.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/glob-to-regexp": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", @@ -5038,15 +5213,6 @@ "node": ">= 6" } }, - "node_modules/globby/node_modules/ignore": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", - "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, "node_modules/globby/node_modules/is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", @@ -5113,6 +5279,12 @@ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==" }, + "node_modules/grapheme-splitter": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", + "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", + "dev": true + }, "node_modules/growl": { "version": "1.10.5", "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", @@ -5226,51 +5398,6 @@ "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", "dev": true }, - "node_modules/has-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", - "dev": true, - "dependencies": { - "get-value": "^2.0.6", - "has-values": "^1.0.0", - "isobject": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/has-values": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", - "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", - "dev": true, - "dependencies": { - "is-number": "^3.0.0", - "kind-of": "^4.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/has-values/node_modules/is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "node_modules/has-values/node_modules/kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/hash-base": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", @@ -5542,10 +5669,38 @@ ] }, "node_modules/ignore": { - "version": "3.3.10", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", - "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==", - "dev": true + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "engines": { + "node": ">=0.8.19" + } }, "node_modules/indent-string": { "version": "4.0.0", @@ -5631,15 +5786,6 @@ "loose-envify": "^1.0.0" } }, - "node_modules/invert-kv": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", - "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/ipaddr.js": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", @@ -5648,36 +5794,6 @@ "node": ">= 0.10" } }, - "node_modules/is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-accessor-descriptor/node_modules/is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "node_modules/is-accessor-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/is-arrayish": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", @@ -5732,36 +5848,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-data-descriptor/node_modules/is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "node_modules/is-data-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/is-date-object": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", @@ -5776,29 +5862,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "dependencies": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-descriptor/node_modules/kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/is-docker": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", @@ -5813,15 +5876,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -5856,9 +5910,9 @@ } }, "node_modules/is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dev": true, "dependencies": { "is-extglob": "^2.1.1" @@ -5878,18 +5932,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/is-number-object": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", @@ -5904,34 +5946,13 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-number/node_modules/is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "node_modules/is-number/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", "dev": true, - "dependencies": { - "isobject": "^3.0.1" - }, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, "node_modules/is-property": { @@ -5965,15 +5986,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/is-string": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", @@ -6019,15 +6031,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/is-wsl": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", @@ -6050,15 +6053,6 @@ "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", "dev": true }, - "node_modules/isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/isstream": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", @@ -6070,25 +6064,22 @@ "resolved": "https://registry.npmjs.org/js-md4/-/js-md4-0.3.2.tgz", "integrity": "sha512-/GDnfQYsltsjRswQhN9fhv3EMw2sCpUdrdxyWDOUK7eyD++r3gRhzgiQgc/x4MAv2i1iuQ4lxO5mvqM3vj4bwA==" }, + "node_modules/js-sdsl": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.3.0.tgz", + "integrity": "sha512-mifzlm2+5nZ+lEcLJMoBK0/IH/bDg8XnJfd/Wq6IP+xoCjLZsTOnV2QpxlVbX9bMnkl5PdEjNtBJ9Cj1NjifhQ==", + "dev": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/js-sdsl" + } + }, "node_modules/js-tokens": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", "dev": true }, - "node_modules/js-yaml": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", - "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", - "dev": true, - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, "node_modules/jsbi": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/jsbi/-/jsbi-4.3.0.tgz", @@ -6130,6 +6121,12 @@ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true + }, "node_modules/json-stringify-safe": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", @@ -6352,32 +6349,11 @@ "simple-concat": "^1.0.0" } }, - "node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/kuler": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz", "integrity": "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==" }, - "node_modules/lcid": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", - "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", - "dev": true, - "dependencies": { - "invert-kv": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/leven": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/leven/-/leven-2.1.0.tgz", @@ -6386,6 +6362,19 @@ "node": ">=0.10.0" } }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/lilconfig": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.5.tgz", @@ -6818,6 +6807,21 @@ "node": ">=8" } }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/lodash": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", @@ -6853,6 +6857,12 @@ "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE=" }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, "node_modules/lodash.once": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", @@ -7028,49 +7038,16 @@ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", "dependencies": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - }, - "node_modules/make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true - }, - "node_modules/map-age-cleaner": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", - "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", - "dev": true, - "dependencies": { - "p-defer": "^1.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/map-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", - "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", - "dev": true, - "dependencies": { - "object-visit": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" } }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, "node_modules/markdown-it": { "version": "12.3.2", "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-12.3.2.tgz", @@ -7126,20 +7103,6 @@ "node": ">= 0.6" } }, - "node_modules/mem": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz", - "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==", - "dev": true, - "dependencies": { - "map-age-cleaner": "^0.1.1", - "mimic-fn": "^2.0.0", - "p-is-promise": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/merge-descriptors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", @@ -7151,15 +7114,6 @@ "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", "dev": true }, - "node_modules/merge2": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.3.0.tgz", - "integrity": "sha512-2j4DAdlBOkiSZIsaXk4mTE3sRS02yBHAtfy127xRV3bQUFqXkjHCHLW6Scv7DwNRbIWNHH8zpnz9zMaKXIdvYw==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, "node_modules/methods": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", @@ -7168,30 +7122,6 @@ "node": ">= 0.6" } }, - "node_modules/micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "dependencies": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/mime": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", @@ -7260,31 +7190,6 @@ "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", "dev": true }, - "node_modules/mixin-deep": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", - "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", - "dev": true, - "dependencies": { - "for-in": "^1.0.2", - "is-extendable": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/mixin-deep/node_modules/is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "dependencies": { - "is-plain-object": "^2.0.4" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/mkdirp": { "version": "0.5.5", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", @@ -7509,28 +7414,6 @@ "node": ">=6.0.0" } }, - "node_modules/nanomatch": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", - "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", - "dev": true, - "dependencies": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "fragment-cache": "^0.2.1", - "is-windows": "^1.0.2", - "kind-of": "^6.0.2", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/napi-build-utils": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", @@ -7542,6 +7425,18 @@ "resolved": "https://registry.npmjs.org/native-duplexpair/-/native-duplexpair-1.0.0.tgz", "integrity": "sha1-eJkHjmS/PIo9cyYBs9QP8F21j6A=" }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "node_modules/natural-compare-lite": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", + "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", + "dev": true + }, "node_modules/negotiator": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", @@ -7550,12 +7445,6 @@ "node": ">= 0.6" } }, - "node_modules/nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", - "dev": true - }, "node_modules/node-abi": { "version": "2.30.1", "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-2.30.1.tgz", @@ -7613,18 +7502,6 @@ "node": ">=0.10.0" } }, - "node_modules/npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", - "dev": true, - "dependencies": { - "path-key": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/npmlog": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", @@ -7676,50 +7553,6 @@ "node": ">=0.10.0" } }, - "node_modules/object-copy": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", - "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", - "dev": true, - "dependencies": { - "copy-descriptor": "^0.1.0", - "define-property": "^0.2.5", - "kind-of": "^3.0.3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-copy/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "dependencies": { - "is-descriptor": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-copy/node_modules/is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "node_modules/object-copy/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/object-inspect": { "version": "1.12.2", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", @@ -7736,18 +7569,6 @@ "node": ">= 0.4" } }, - "node_modules/object-visit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", - "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", - "dev": true, - "dependencies": { - "isobject": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/object.assign": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", @@ -7765,18 +7586,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", - "dev": true, - "dependencies": { - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/on-finished": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", @@ -7843,6 +7652,23 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/optionator": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "dev": true, + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/os-homedir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", @@ -7852,20 +7678,6 @@ "node": ">=0.10.0" } }, - "node_modules/os-locale": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", - "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", - "dev": true, - "dependencies": { - "execa": "^1.0.0", - "lcid": "^2.0.0", - "mem": "^4.0.0" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/os-tmpdir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", @@ -7875,31 +7687,34 @@ "node": ">=0.10.0" } }, - "node_modules/p-defer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", - "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, "engines": { - "node": ">=4" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/p-is-promise": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.1.0.tgz", - "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==", + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, "engines": { - "node": ">=6" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/p-map": { @@ -7917,6 +7732,18 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/parse-semver": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/parse-semver/-/parse-semver-1.1.1.tgz", @@ -7958,30 +7785,6 @@ "node": ">= 0.8" } }, - "node_modules/pascalcase": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-dirname": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", - "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", - "dev": true - }, - "node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", @@ -7990,15 +7793,6 @@ "node": ">=0.10.0" } }, - "node_modules/path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/path-parse": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", @@ -8010,18 +7804,6 @@ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" }, - "node_modules/path-type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", - "dev": true, - "dependencies": { - "pify": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/pend": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", @@ -8063,15 +7845,6 @@ "node": ">=0.10" } }, - "node_modules/pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/pkg": { "version": "5.8.0", "resolved": "https://registry.npmjs.org/pkg/-/pkg-5.8.0.tgz", @@ -8467,15 +8240,6 @@ "node": ">= 10.0.0" } }, - "node_modules/posix-character-classes": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", - "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/prebuild-install": { "version": "6.1.4", "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-6.1.4.tgz", @@ -8503,113 +8267,29 @@ "node": ">=6" } }, - "node_modules/prettier": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.7.1.tgz", - "integrity": "sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g==", - "dev": true, - "bin": { - "prettier": "bin-prettier.js" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" - } - }, - "node_modules/prettier-tslint": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/prettier-tslint/-/prettier-tslint-0.4.2.tgz", - "integrity": "sha512-urhX7U/F+fu8sztEs/Z7CxNS8PdEytEwGKhQaH5fxxCdRmHGT45FoClyDlcZrMk9cK/8JpX/asFmTOHtSGJfLg==", - "dev": true, - "dependencies": { - "chalk": "^2.4.0", - "globby": "^8.0.1", - "ignore": "^3.3.7", - "require-relative": "^0.8.7", - "tslint": "^5.9.1", - "yargs": "^11.0.0" - }, - "bin": { - "prettier-tslint": "bin/prettier-tslint.js" - }, - "peerDependencies": { - "prettier": "^1.7.4", - "typescript": "^2.5.3 || ^3.0.0" - } - }, - "node_modules/prettier-tslint/node_modules/diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true, - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/prettier-tslint/node_modules/globby": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-8.0.2.tgz", - "integrity": "sha512-yTzMmKygLp8RUpG1Ymu2VXPSJQZjNAZPD4ywgYEaG7e4tBJeUQBO8OpXrf1RCNcEs5alsoJYPAMiIHP0cmeC7w==", + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true, - "dependencies": { - "array-union": "^1.0.1", - "dir-glob": "2.0.0", - "fast-glob": "^2.0.2", - "glob": "^7.1.2", - "ignore": "^3.3.5", - "pify": "^3.0.0", - "slash": "^1.0.0" - }, "engines": { - "node": ">=4" - } - }, - "node_modules/prettier-tslint/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true, - "bin": { - "semver": "bin/semver" + "node": ">= 0.8.0" } }, - "node_modules/prettier-tslint/node_modules/tslint": { - "version": "5.20.1", - "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.20.1.tgz", - "integrity": "sha512-EcMxhzCFt8k+/UP5r8waCf/lzmeSyVlqxqMEDQE7rWYiQky8KpIBz1JAoYXfROHrPZ1XXd43q8yQnULOLiBRQg==", + "node_modules/prettier": { + "version": "2.8.4", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.4.tgz", + "integrity": "sha512-vIS4Rlc2FNh0BySk3Wkd6xmwxB0FpOndW5fisM5H8hsZSxU2VWVB5CWIkIjWvrHjIhxk2g3bfMKM87zNTrZddw==", "dev": true, - "dependencies": { - "@babel/code-frame": "^7.0.0", - "builtin-modules": "^1.1.1", - "chalk": "^2.3.0", - "commander": "^2.12.1", - "diff": "^4.0.1", - "glob": "^7.1.1", - "js-yaml": "^3.13.1", - "minimatch": "^3.0.4", - "mkdirp": "^0.5.1", - "resolve": "^1.3.2", - "semver": "^5.3.0", - "tslib": "^1.8.0", - "tsutils": "^2.29.0" - }, "bin": { - "tslint": "bin/tslint" + "prettier": "bin-prettier.js" }, "engines": { - "node": ">=4.8.0" + "node": ">=10.13.0" }, - "peerDependencies": { - "typescript": ">=2.3.0-dev || >=2.4.0-dev || >=2.5.0-dev || >=2.6.0-dev || >=2.7.0-dev || >=2.8.0-dev || >=2.9.0-dev || >=3.0.0-dev || >= 3.1.0-dev || >= 3.2.0-dev" - } - }, - "node_modules/prettier-tslint/node_modules/tslint/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } }, "node_modules/private": { "version": "0.1.8", @@ -8814,17 +8494,16 @@ "private": "^0.1.6" } }, - "node_modules/regex-not": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", - "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "node_modules/regexpp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", "dev": true, - "dependencies": { - "extend-shallow": "^3.0.2", - "safe-regex": "^1.1.0" - }, "engines": { - "node": ">=0.10.0" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" } }, "node_modules/regexpu-core": { @@ -8856,24 +8535,6 @@ "regjsparser": "bin/parser" } }, - "node_modules/repeat-element": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", - "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", - "dev": true, - "engines": { - "node": ">=0.10" - } - }, "node_modules/repeating": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", @@ -8950,34 +8611,15 @@ "node": ">=0.10.0" } }, - "node_modules/require-main-filename": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", - "dev": true - }, - "node_modules/require-relative": { - "version": "0.8.7", - "resolved": "https://registry.npmjs.org/require-relative/-/require-relative-0.8.7.tgz", - "integrity": "sha1-eZlTn8ngR6N5KPoZb44VY9q9Nt4=", - "dev": true - }, - "node_modules/resolve": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.12.0.tgz", - "integrity": "sha512-B/dOmuoAik5bKcD6s6nXDCjzUKnaDvdkRyAk6rsmsKLipWj4797iothd7jmmUhWTfinVMU+wc56rYKsit2Qy4w==", + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true, - "dependencies": { - "path-parse": "^1.0.6" + "engines": { + "node": ">=4" } }, - "node_modules/resolve-url": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", - "deprecated": "https://github.com/lydell/resolve-url#deprecated", - "dev": true - }, "node_modules/restore-cursor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", @@ -8991,15 +8633,6 @@ "node": ">=8" } }, - "node_modules/ret": { - "version": "0.1.15", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", - "dev": true, - "engines": { - "node": ">=0.12" - } - }, "node_modules/retry-as-promised": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/retry-as-promised/-/retry-as-promised-5.0.0.tgz", @@ -9072,15 +8705,6 @@ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, - "node_modules/safe-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", - "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", - "dev": true, - "dependencies": { - "ret": "~0.1.10" - } - }, "node_modules/safe-stable-stringify": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.3.1.tgz", @@ -9100,9 +8724,9 @@ "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" }, "node_modules/semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", "dependencies": { "lru-cache": "^6.0.0" }, @@ -9300,33 +8924,6 @@ "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", "dev": true }, - "node_modules/set-value": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", - "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", - "dev": true, - "dependencies": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.3", - "split-string": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/set-value/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/setprototypeof": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", @@ -9460,152 +9057,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/snapdragon": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", - "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", - "dev": true, - "dependencies": { - "base": "^0.11.1", - "debug": "^2.2.0", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "map-cache": "^0.2.2", - "source-map": "^0.5.6", - "source-map-resolve": "^0.5.0", - "use": "^3.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon-node": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", - "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", - "dev": true, - "dependencies": { - "define-property": "^1.0.0", - "isobject": "^3.0.0", - "snapdragon-util": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon-node/node_modules/define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "dependencies": { - "is-descriptor": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon-node/node_modules/is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon-node/node_modules/is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon-node/node_modules/is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "dependencies": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon-util": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", - "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", - "dev": true, - "dependencies": { - "kind-of": "^3.2.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon-util/node_modules/is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "node_modules/snapdragon-util/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/snapdragon/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "dependencies": { - "is-descriptor": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", @@ -9615,20 +9066,6 @@ "node": ">=0.10.0" } }, - "node_modules/source-map-resolve": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz", - "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", - "deprecated": "See https://github.com/lydell/source-map-resolve#deprecated", - "dev": true, - "dependencies": { - "atob": "^2.1.1", - "decode-uri-component": "^0.2.0", - "resolve-url": "^0.2.1", - "source-map-url": "^0.4.0", - "urix": "^0.1.0" - } - }, "node_modules/source-map-support": { "version": "0.4.18", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", @@ -9638,31 +9075,6 @@ "source-map": "^0.5.6" } }, - "node_modules/source-map-url": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", - "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", - "deprecated": "See https://github.com/lydell/source-map-url#deprecated", - "dev": true - }, - "node_modules/split-string": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", - "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", - "dev": true, - "dependencies": { - "extend-shallow": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true - }, "node_modules/sqlstring": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.2.tgz", @@ -9704,31 +9116,6 @@ "node": "*" } }, - "node_modules/static-extend": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", - "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", - "dev": true, - "dependencies": { - "define-property": "^0.2.5", - "object-copy": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/static-extend/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "dependencies": { - "is-descriptor": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/statuses": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", @@ -9824,15 +9211,6 @@ "node": ">=0.10.0" } }, - "node_modules/strip-eof": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/strip-final-newline": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", @@ -9980,6 +9358,12 @@ "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz", "integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==" }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true + }, "node_modules/through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", @@ -10007,36 +9391,6 @@ "node": ">=0.10.0" } }, - "node_modules/to-object-path": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", - "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/to-object-path/node_modules/is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "node_modules/to-object-path/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/to-readable-stream": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-2.1.0.tgz", @@ -10045,34 +9399,6 @@ "node": ">=8" } }, - "node_modules/to-regex": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", - "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", - "dev": true, - "dependencies": { - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "regex-not": "^1.0.2", - "safe-regex": "^1.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "dev": true, - "dependencies": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/toidentifier": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", @@ -10172,82 +9498,30 @@ "node_modules/ts-node/node_modules/diff": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true, - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/tslib": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", - "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==" - }, - "node_modules/tslint": { - "version": "6.1.3", - "resolved": "https://registry.npmjs.org/tslint/-/tslint-6.1.3.tgz", - "integrity": "sha512-IbR4nkT96EQOvKE2PW/djGz8iGNeJ4rF2mBfiYaR/nvUWYKJhLwimoJKgjIFEIDibBtOevj7BqCRL4oHeWWUCg==", - "deprecated": "TSLint has been deprecated in favor of ESLint. Please see https://github.com/palantir/tslint/issues/4534 for more information.", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.0.0", - "builtin-modules": "^1.1.1", - "chalk": "^2.3.0", - "commander": "^2.12.1", - "diff": "^4.0.1", - "glob": "^7.1.1", - "js-yaml": "^3.13.1", - "minimatch": "^3.0.4", - "mkdirp": "^0.5.3", - "resolve": "^1.3.2", - "semver": "^5.3.0", - "tslib": "^1.13.0", - "tsutils": "^2.29.0" - }, - "bin": { - "tslint": "bin/tslint" - }, - "engines": { - "node": ">=4.8.0" - }, - "peerDependencies": { - "typescript": ">=2.3.0-dev || >=2.4.0-dev || >=2.5.0-dev || >=2.6.0-dev || >=2.7.0-dev || >=2.8.0-dev || >=2.9.0-dev || >=3.0.0-dev || >= 3.1.0-dev || >= 3.2.0-dev || >= 4.0.0-dev" - } - }, - "node_modules/tslint/node_modules/diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true, - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/tslint/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", "dev": true, - "bin": { - "semver": "bin/semver" + "engines": { + "node": ">=0.3.1" } }, - "node_modules/tslint/node_modules/tslib": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", - "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==", - "dev": true + "node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==" }, "node_modules/tsutils": { - "version": "2.29.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", - "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", "dev": true, "dependencies": { "tslib": "^1.8.1" }, + "engines": { + "node": ">= 6" + }, "peerDependencies": { - "typescript": ">=2.1.0 || >=2.1.0-dev || >=2.2.0-dev || >=2.3.0-dev || >=2.4.0-dev || >=2.5.0-dev || >=2.6.0-dev || >=2.7.0-dev || >=2.8.0-dev || >=2.9.0-dev || >= 3.0.0-dev || >= 3.1.0-dev" + "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" } }, "node_modules/tsutils/node_modules/tslib": { @@ -10282,6 +9556,18 @@ "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", "dev": true }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/type-fest": { "version": "0.21.3", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", @@ -10318,9 +9604,9 @@ } }, "node_modules/typescript": { - "version": "4.3.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.3.5.tgz", - "integrity": "sha512-DqQgihaQ9cUrskJo9kIyW/+g0Vxsk8cDtZ52a3NGh0YNTfpUSArXSohyUGnvbPazEPLu398C0UxmKSOrPumUzA==", + "version": "4.9.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", + "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", "dev": true, "bin": { "tsc": "bin/tsc", @@ -10356,21 +9642,6 @@ "integrity": "sha512-ekY1NhRzq0B08g4bGuX4wd2jZx5GnKz6mKSqFL4nqBlfyMGiG10gDFhDTMEfYmDL6Jy0FUIZp7wiRB+0BP7J2g==", "dev": true }, - "node_modules/union-value": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", - "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", - "dev": true, - "dependencies": { - "arr-union": "^3.1.0", - "get-value": "^2.0.6", - "is-extendable": "^0.1.1", - "set-value": "^2.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/universalify": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", @@ -10387,54 +9658,6 @@ "node": ">= 0.8" } }, - "node_modules/unset-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", - "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", - "dev": true, - "dependencies": { - "has-value": "^0.3.1", - "isobject": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/unset-value/node_modules/has-value": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", - "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", - "dev": true, - "dependencies": { - "get-value": "^2.0.3", - "has-values": "^0.1.4", - "isobject": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/unset-value/node_modules/has-value/node_modules/isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "dev": true, - "dependencies": { - "isarray": "1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/unset-value/node_modules/has-values": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", @@ -10449,28 +9672,12 @@ "resolved": "https://registry.npmjs.org/uri-templates/-/uri-templates-0.2.0.tgz", "integrity": "sha1-K1eEURzJCYaHMekjPCaAl9ELSZ8=" }, - "node_modules/urix": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", - "deprecated": "Please see https://github.com/lydell/urix#deprecated", - "dev": true - }, "node_modules/url-join": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.1.tgz", "integrity": "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==", "dev": true }, - "node_modules/use": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", - "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -10632,12 +9839,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", - "dev": true - }, "node_modules/wide-align": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", @@ -10725,6 +9926,15 @@ "@types/node": "*" } }, + "node_modules/word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/wrap-ansi": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", @@ -10844,12 +10054,6 @@ "node": ">=4.0" } }, - "node_modules/y18n": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.2.tgz", - "integrity": "sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==", - "dev": true - }, "node_modules/yallist": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", @@ -10864,145 +10068,6 @@ "node": ">= 14" } }, - "node_modules/yargs": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-11.1.1.tgz", - "integrity": "sha512-PRU7gJrJaXv3q3yQZ/+/X6KBswZiaQ+zOmdprZcouPYtQgvNU35i+68M4b1ZHLZtYFT5QObFLV+ZkmJYcwKdiw==", - "dev": true, - "dependencies": { - "cliui": "^4.0.0", - "decamelize": "^1.1.1", - "find-up": "^2.1.0", - "get-caller-file": "^1.0.1", - "os-locale": "^3.1.0", - "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", - "set-blocking": "^2.0.0", - "string-width": "^2.0.0", - "which-module": "^2.0.0", - "y18n": "^3.2.1", - "yargs-parser": "^9.0.2" - } - }, - "node_modules/yargs-parser": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-9.0.2.tgz", - "integrity": "sha1-nM9qQ0YP5O1Aqbto9I1DuKaMwHc=", - "dev": true, - "dependencies": { - "camelcase": "^4.1.0" - } - }, - "node_modules/yargs-parser/node_modules/camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/yargs/node_modules/ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/yargs/node_modules/find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "dependencies": { - "locate-path": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/yargs/node_modules/is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/yargs/node_modules/locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "dev": true, - "dependencies": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/yargs/node_modules/p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dev": true, - "dependencies": { - "p-try": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/yargs/node_modules/p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "dev": true, - "dependencies": { - "p-limit": "^1.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/yargs/node_modules/p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/yargs/node_modules/string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "dependencies": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/yargs/node_modules/strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "dependencies": { - "ansi-regex": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/yauzl": { "version": "2.10.0", "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", @@ -11030,6 +10095,18 @@ "engines": { "node": ">=6" } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } } }, "dependencies": { @@ -11487,15 +10564,6 @@ "tslib": "^2.2.0" } }, - "@babel/code-frame": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", - "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", - "dev": true, - "requires": { - "@babel/highlight": "^7.10.4" - } - }, "@babel/generator": { "version": "7.18.2", "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.2.tgz", @@ -11521,25 +10589,6 @@ "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==", "dev": true }, - "@babel/highlight": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", - "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - }, - "dependencies": { - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - } - } - }, "@babel/parser": { "version": "7.18.4", "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.4.tgz", @@ -11588,6 +10637,140 @@ "kuler": "^2.0.0" } }, + "@eslint/eslintrc": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.0.tgz", + "integrity": "sha512-fluIaaV+GyV24CCu/ggiHdV+j4RNh85yQnAYS/G2mZODZgGmmlrgCydjUcV3YvxCm9x8nMAfThsqTni4KiXT4A==", + "dev": true, + "requires": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.4.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "dependencies": { + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "globals": { + "version": "13.20.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", + "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", + "dev": true, + "requires": { + "type-fest": "^0.20.2" + } + }, + "js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "requires": { + "argparse": "^2.0.1" + } + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true + }, + "type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true + } + } + }, + "@eslint/js": { + "version": "8.35.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.35.0.tgz", + "integrity": "sha512-JXdzbRiWclLVoD8sNUjR443VVlYqiYmDVT6rGUEIEHU5YJW0gaVZwV2xgM7D4arkvASqD0IlLUVjHiFuxaftRw==", + "dev": true + }, + "@humanwhocodes/config-array": { + "version": "0.11.8", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz", + "integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==", + "dev": true, + "requires": { + "@humanwhocodes/object-schema": "^1.2.1", + "debug": "^4.1.1", + "minimatch": "^3.0.5" + }, + "dependencies": { + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true + }, + "@humanwhocodes/object-schema": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "dev": true + }, "@jridgewell/gen-mapping": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", @@ -11684,24 +10867,6 @@ } } }, - "@mrmlnc/readdir-enhanced": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz", - "integrity": "sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==", - "dev": true, - "requires": { - "call-me-maybe": "^1.0.1", - "glob-to-regexp": "^0.3.0" - }, - "dependencies": { - "glob-to-regexp": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz", - "integrity": "sha512-Iozmtbqv0noj0uDDqoL0zNq0VBEfK2YFoMAZoxJe4cwphvLR+JskfF30QhXHOR4m3KrE6NLRYw+U9MRXvifyig==", - "dev": true - } - } - }, "@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -11720,12 +10885,6 @@ } } }, - "@nodelib/fs.stat": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz", - "integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==", - "dev": true - }, "@nodelib/fs.walk": { "version": "1.2.8", "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", @@ -11878,6 +11037,12 @@ "integrity": "sha512-S0mIukll6fbF0tvrKic/jj+jI8SHoSvGU+Cs95b/jzZEnBYCbj+7aJtQ9yeABuK3xP1okwA3jEH9qIRayijnvQ==", "dev": true }, + "@types/json-schema": { + "version": "7.0.11", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", + "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", + "dev": true + }, "@types/jsonwebtoken": { "version": "8.5.9", "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-8.5.9.tgz", @@ -11963,6 +11128,12 @@ "@types/node": "*" } }, + "@types/semver": { + "version": "7.3.13", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.13.tgz", + "integrity": "sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==", + "dev": true + }, "@types/serve-static": { "version": "1.13.3", "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.3.tgz", @@ -12026,6 +11197,173 @@ "@types/node": "*" } }, + "@typescript-eslint/eslint-plugin": { + "version": "5.54.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.54.1.tgz", + "integrity": "sha512-a2RQAkosH3d3ZIV08s3DcL/mcGc2M/UC528VkPULFxR9VnVPT8pBu0IyBAJJmVsCmhVfwQX1v6q+QGnmSe1bew==", + "dev": true, + "requires": { + "@typescript-eslint/scope-manager": "5.54.1", + "@typescript-eslint/type-utils": "5.54.1", + "@typescript-eslint/utils": "5.54.1", + "debug": "^4.3.4", + "grapheme-splitter": "^1.0.4", + "ignore": "^5.2.0", + "natural-compare-lite": "^1.4.0", + "regexpp": "^3.2.0", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "dependencies": { + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "@typescript-eslint/parser": { + "version": "5.54.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.54.1.tgz", + "integrity": "sha512-8zaIXJp/nG9Ff9vQNh7TI+C3nA6q6iIsGJ4B4L6MhZ7mHnTMR4YP5vp2xydmFXIy8rpyIVbNAG44871LMt6ujg==", + "dev": true, + "requires": { + "@typescript-eslint/scope-manager": "5.54.1", + "@typescript-eslint/types": "5.54.1", + "@typescript-eslint/typescript-estree": "5.54.1", + "debug": "^4.3.4" + }, + "dependencies": { + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "@typescript-eslint/scope-manager": { + "version": "5.54.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.54.1.tgz", + "integrity": "sha512-zWKuGliXxvuxyM71UA/EcPxaviw39dB2504LqAmFDjmkpO8qNLHcmzlh6pbHs1h/7YQ9bnsO8CCcYCSA8sykUg==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.54.1", + "@typescript-eslint/visitor-keys": "5.54.1" + } + }, + "@typescript-eslint/type-utils": { + "version": "5.54.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.54.1.tgz", + "integrity": "sha512-WREHsTz0GqVYLIbzIZYbmUUr95DKEKIXZNH57W3s+4bVnuF1TKe2jH8ZNH8rO1CeMY3U4j4UQeqPNkHMiGem3g==", + "dev": true, + "requires": { + "@typescript-eslint/typescript-estree": "5.54.1", + "@typescript-eslint/utils": "5.54.1", + "debug": "^4.3.4", + "tsutils": "^3.21.0" + }, + "dependencies": { + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "@typescript-eslint/types": { + "version": "5.54.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.54.1.tgz", + "integrity": "sha512-G9+1vVazrfAfbtmCapJX8jRo2E4MDXxgm/IMOF4oGh3kq7XuK3JRkOg6y2Qu1VsTRmWETyTkWt1wxy7X7/yLkw==", + "dev": true + }, + "@typescript-eslint/typescript-estree": { + "version": "5.54.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.54.1.tgz", + "integrity": "sha512-bjK5t+S6ffHnVwA0qRPTZrxKSaFYocwFIkZx5k7pvWfsB1I57pO/0M0Skatzzw1sCkjJ83AfGTL0oFIFiDX3bg==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.54.1", + "@typescript-eslint/visitor-keys": "5.54.1", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "dependencies": { + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "@typescript-eslint/utils": { + "version": "5.54.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.54.1.tgz", + "integrity": "sha512-IY5dyQM8XD1zfDe5X8jegX6r2EVU5o/WJnLu/znLPWCBF7KNGC+adacXnt5jEYS9JixDcoccI6CvE4RCjHMzCQ==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.9", + "@types/semver": "^7.3.12", + "@typescript-eslint/scope-manager": "5.54.1", + "@typescript-eslint/types": "5.54.1", + "@typescript-eslint/typescript-estree": "5.54.1", + "eslint-scope": "^5.1.1", + "eslint-utils": "^3.0.0", + "semver": "^7.3.7" + } + }, + "@typescript-eslint/visitor-keys": { + "version": "5.54.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.54.1.tgz", + "integrity": "sha512-q8iSoHTgwCfgcRJ2l2x+xCbu8nBlRAlsQ33k24Adj8eoVBE0f8dUeI+bAa8F84Mv05UGbAx57g2zrRsYIooqQg==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.54.1", + "eslint-visitor-keys": "^3.3.0" + } + }, "accepts": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", @@ -12051,11 +11389,18 @@ } }, "acorn": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.5.0.tgz", - "integrity": "sha512-yXbYeFy+jUuYd3/CDcg2NkIYE991XYX/bje7LmjJigUciaeO1JR4XxXgCIV1/Zc/dRuFEyw1L0pbA+qynJkW5Q==", + "version": "8.8.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", + "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", "dev": true }, + "acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "requires": {} + }, "acorn-walk": { "version": "8.2.0", "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", @@ -12152,15 +11497,6 @@ "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", "dev": true }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, "args": { "version": "5.0.3", "resolved": "https://registry.npmjs.org/args/-/args-5.0.3.tgz", @@ -12172,56 +11508,11 @@ "mri": "1.1.4" } }, - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", - "dev": true - }, - "arr-flatten": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", - "dev": true - }, - "arr-union": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", - "dev": true - }, "array-flatten": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" }, - "array-union": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", - "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", - "dev": true, - "requires": { - "array-uniq": "^1.0.1" - } - }, - "array-uniq": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", - "dev": true - }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", - "dev": true - }, - "arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", - "dev": true - }, "asn1": { "version": "0.2.6", "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", @@ -12237,12 +11528,6 @@ "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", "dev": true }, - "assign-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", - "dev": true - }, "astral-regex": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", @@ -12265,12 +11550,6 @@ "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", "dev": true }, - "atob": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", - "dev": true - }, "autorest": { "version": "3.6.2", "resolved": "https://registry.npmjs.org/autorest/-/autorest-3.6.2.tgz", @@ -13269,61 +12548,6 @@ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" }, - "base": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", - "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", - "dev": true, - "requires": { - "cache-base": "^1.0.1", - "class-utils": "^0.3.5", - "component-emitter": "^1.2.1", - "define-property": "^1.0.0", - "isobject": "^3.0.1", - "mixin-deep": "^1.2.0", - "pascalcase": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, "base64-js": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", @@ -13429,35 +12653,6 @@ "concat-map": "0.0.1" } }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, "browser-stdout": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", @@ -13491,34 +12686,11 @@ "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", "integrity": "sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk=" }, - "builtin-modules": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", - "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", - "dev": true - }, "bytes": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" }, - "cache-base": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", - "dev": true, - "requires": { - "collection-visit": "^1.0.0", - "component-emitter": "^1.2.1", - "get-value": "^2.0.6", - "has-value": "^1.0.0", - "isobject": "^3.0.1", - "set-value": "^2.0.0", - "to-object-path": "^0.3.0", - "union-value": "^1.0.0", - "unset-value": "^1.0.0" - } - }, "call-bind": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", @@ -13528,10 +12700,10 @@ "get-intrinsic": "^1.0.2" } }, - "call-me-maybe": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz", - "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=", + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true }, "camelcase": { @@ -13589,29 +12761,6 @@ "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", "dev": true }, - "class-utils": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", - "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", - "dev": true, - "requires": { - "arr-union": "^3.1.0", - "define-property": "^0.2.5", - "isobject": "^3.0.0", - "static-extend": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - } - } - }, "clean-stack": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", @@ -13657,107 +12806,16 @@ "requires": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - } - }, - "strip-ansi": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", - "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", - "dev": true, - "requires": { - "ansi-regex": "^6.0.1" - } - } - } - }, - "cliui": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", - "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", - "dev": true, - "requires": { - "string-width": "^2.1.1", - "strip-ansi": "^4.0.0", - "wrap-ansi": "^2.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - } - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" + "strip-ansi": "^7.0.1" } }, - "wrap-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", - "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "strip-ansi": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", + "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", "dev": true, "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - } + "ansi-regex": "^6.0.1" } } } @@ -13768,16 +12826,6 @@ "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", "dev": true }, - "collection-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", - "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", - "dev": true, - "requires": { - "map-visit": "^1.0.0", - "object-visit": "^1.0.0" - } - }, "color": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/color/-/color-3.2.1.tgz", @@ -13832,18 +12880,6 @@ "delayed-stream": "~1.0.0" } }, - "commander": { - "version": "2.20.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz", - "integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==", - "dev": true - }, - "component-emitter": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", - "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", - "dev": true - }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -13894,12 +12930,6 @@ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" }, - "copy-descriptor": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", - "dev": true - }, "core-js": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.9.tgz", @@ -14052,18 +13082,6 @@ "ms": "2.0.0" } }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true - }, - "decode-uri-component": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", - "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==", - "dev": true - }, "decompress-response": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-4.2.1.tgz", @@ -14079,6 +13097,12 @@ "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", "dev": true }, + "deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, "define-lazy-prop": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", @@ -14093,47 +13117,6 @@ "object-keys": "^1.1.1" } }, - "define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", - "dev": true, - "requires": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - }, - "dependencies": { - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, "delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -14181,14 +13164,13 @@ "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", "dev": true }, - "dir-glob": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.0.0.tgz", - "integrity": "sha512-37qirFDz8cA5fimp9feo43fSuRo2gHwaIn6dXL8Ber1dGwUosDrGZeCCXq57WnIqE4aQ+u3eQZzsk1yOzhdwag==", + "doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", "dev": true, "requires": { - "arrify": "^1.0.1", - "path-type": "^3.0.0" + "esutils": "^2.0.2" } }, "dom-serializer": { @@ -14360,10 +13342,334 @@ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "eslint": { + "version": "8.35.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.35.0.tgz", + "integrity": "sha512-BxAf1fVL7w+JLRQhWl2pzGeSiGqbWumV4WNvc9Rhp6tiCtm4oHnyPBSEtMGZwrQgudFQ+otqzWoPB7x+hxoWsw==", + "dev": true, + "requires": { + "@eslint/eslintrc": "^2.0.0", + "@eslint/js": "8.35.0", + "@humanwhocodes/config-array": "^0.11.8", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.1.1", + "eslint-utils": "^3.0.0", + "eslint-visitor-keys": "^3.3.0", + "espree": "^9.4.0", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "grapheme-splitter": "^1.0.4", + "ignore": "^5.2.0", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-sdsl": "^4.1.4", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "regexpp": "^3.2.0", + "strip-ansi": "^6.0.1", + "strip-json-comments": "^3.1.0", + "text-table": "^0.2.0" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true + }, + "eslint-scope": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", + "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + } + }, + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + }, + "glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "requires": { + "is-glob": "^4.0.3" + } + }, + "globals": { + "version": "13.20.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", + "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", + "dev": true, + "requires": { + "type-fest": "^0.20.2" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "requires": { + "argparse": "^2.0.1" + } + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + } + }, + "eslint-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^2.0.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "dev": true + } + } + }, + "eslint-visitor-keys": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", + "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", + "dev": true + }, + "espree": { + "version": "9.4.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.1.tgz", + "integrity": "sha512-XwctdmTO6SIvCzd9810yyNzIrOrqNYV9Koizx4C/mRhf9uq0o4yHoCEU/670pOxOL/MSraektvSAji79kX90Vg==", + "dev": true, + "requires": { + "acorn": "^8.8.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.3.0" + } + }, + "esquery": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "dev": true, + "requires": { + "estraverse": "^5.1.0" + }, + "dependencies": { + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + } + } + }, + "esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "requires": { + "estraverse": "^5.2.0" + }, + "dependencies": { + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + } + } + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", "dev": true }, "esutils": { @@ -14382,92 +13688,12 @@ "resolved": "https://registry.npmjs.org/events/-/events-3.1.0.tgz", "integrity": "sha512-Rv+u8MLHNOdMjTAFeT3nCjHn2aGlx435FP/sDHNaRhDEMwyI/aB22Kj2qIN8R0cw3z28psEQLYwxVKLsKrMgWg==" }, - "execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", - "dev": true, - "requires": { - "cross-spawn": "^6.0.0", - "get-stream": "^4.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - }, - "dependencies": { - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dev": true, - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } - } - }, "exit": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", "dev": true }, - "expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", - "dev": true, - "requires": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, "expand-template": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", @@ -14541,92 +13767,6 @@ "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", "dev": true }, - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "dev": true, - "requires": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, "extsprintf": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", @@ -14639,26 +13779,18 @@ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", "dev": true }, - "fast-glob": { - "version": "2.2.7", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.7.tgz", - "integrity": "sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw==", - "dev": true, - "requires": { - "@mrmlnc/readdir-enhanced": "^2.2.1", - "@nodelib/fs.stat": "^1.1.2", - "glob-parent": "^3.1.0", - "is-glob": "^4.0.0", - "merge2": "^1.2.3", - "micromatch": "^3.1.10" - } - }, "fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", "dev": true }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, "fast-xml-parser": { "version": "4.0.7", "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.0.7.tgz", @@ -14691,27 +13823,13 @@ "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.1.tgz", "integrity": "sha512-MMMQ0ludy/nBs1/o0zVOiKTpG7qMbonKUzjJgQFEuvq6INZ1OraKPRAWkBq5vlKLOUMpmNYG1JoN3oDPUQ9m3Q==" }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", "dev": true, "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } + "flat-cache": "^3.0.4" } }, "finalhandler": { @@ -14829,6 +13947,40 @@ } } }, + "find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "requires": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "dependencies": { + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + } + } + }, + "flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "dev": true, + "requires": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + } + }, + "flatted": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", + "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", + "dev": true + }, "fn.name": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz", @@ -14839,12 +13991,6 @@ "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.9.tgz", "integrity": "sha512-MQDfihBQYMcyy5dhRDJUHcw7lb2Pv/TuE6xP1vyraLukNDHKbDxDNaOE3NbCAdKQApno+GPRyo1YAp89yCjK4w==" }, - "for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", - "dev": true - }, "forever-agent": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", @@ -14866,15 +14012,6 @@ "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==" }, - "fragment-cache": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", - "dev": true, - "requires": { - "map-cache": "^0.2.2" - } - }, "fresh": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", @@ -14952,12 +14089,6 @@ "is-property": "^1.0.2" } }, - "get-caller-file": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", - "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", - "dev": true - }, "get-intrinsic": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", @@ -14968,15 +14099,6 @@ "has-symbols": "^1.0.1" } }, - "get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - }, "get-symbol-description": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", @@ -14986,12 +14108,6 @@ "get-intrinsic": "^1.1.1" } }, - "get-value": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", - "dev": true - }, "getpass": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", @@ -15020,27 +14136,6 @@ "path-is-absolute": "^1.0.0" } }, - "glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", - "dev": true, - "requires": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" - }, - "dependencies": { - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dev": true, - "requires": { - "is-extglob": "^2.1.0" - } - } - } - }, "glob-to-regexp": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", @@ -15135,12 +14230,6 @@ "is-glob": "^4.0.1" } }, - "ignore": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", - "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", - "dev": true - }, "is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", @@ -15191,6 +14280,12 @@ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==" }, + "grapheme-splitter": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", + "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", + "dev": true + }, "growl": { "version": "1.10.5", "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", @@ -15267,44 +14362,6 @@ "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", "dev": true }, - "has-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", - "dev": true, - "requires": { - "get-value": "^2.0.6", - "has-values": "^1.0.0", - "isobject": "^3.0.0" - } - }, - "has-values": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", - "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "kind-of": "^4.0.0" - }, - "dependencies": { - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, "hash-base": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", @@ -15487,9 +14544,25 @@ "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" }, "ignore": { - "version": "3.3.10", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", - "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==", + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "dev": true + }, + "import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "dev": true }, "indent-string": { @@ -15560,43 +14633,11 @@ "loose-envify": "^1.0.0" } }, - "invert-kv": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", - "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", - "dev": true - }, "ipaddr.js": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, "is-arrayish": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", @@ -15633,32 +14674,6 @@ "has": "^1.0.3" } }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, "is-date-object": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", @@ -15667,36 +14682,11 @@ "has-tostringtag": "^1.0.0" } }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - }, "is-docker": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==" }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true - }, "is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -15722,9 +14712,9 @@ } }, "is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dev": true, "requires": { "is-extglob": "^2.1.1" @@ -15735,32 +14725,6 @@ "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==" }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, "is-number-object": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", @@ -15769,14 +14733,11 @@ "has-tostringtag": "^1.0.0" } }, - "is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dev": true, - "requires": { - "isobject": "^3.0.1" - } + "is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true }, "is-property": { "version": "1.0.2", @@ -15797,14 +14758,8 @@ "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", "requires": { - "call-bind": "^1.0.2" - } - }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", - "dev": true + "call-bind": "^1.0.2" + } }, "is-string": { "version": "1.0.7", @@ -15836,12 +14791,6 @@ "call-bind": "^1.0.2" } }, - "is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "dev": true - }, "is-wsl": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", @@ -15861,12 +14810,6 @@ "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", "dev": true }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - }, "isstream": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", @@ -15878,22 +14821,18 @@ "resolved": "https://registry.npmjs.org/js-md4/-/js-md4-0.3.2.tgz", "integrity": "sha512-/GDnfQYsltsjRswQhN9fhv3EMw2sCpUdrdxyWDOUK7eyD++r3gRhzgiQgc/x4MAv2i1iuQ4lxO5mvqM3vj4bwA==" }, + "js-sdsl": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.3.0.tgz", + "integrity": "sha512-mifzlm2+5nZ+lEcLJMoBK0/IH/bDg8XnJfd/Wq6IP+xoCjLZsTOnV2QpxlVbX9bMnkl5PdEjNtBJ9Cj1NjifhQ==", + "dev": true + }, "js-tokens": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", "dev": true }, - "js-yaml": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", - "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, "jsbi": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/jsbi/-/jsbi-4.3.0.tgz", @@ -15932,6 +14871,12 @@ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true + }, "json-stringify-safe": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", @@ -16100,31 +15045,26 @@ } } }, - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true - }, "kuler": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz", "integrity": "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==" }, - "lcid": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", - "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", - "dev": true, - "requires": { - "invert-kv": "^2.0.0" - } - }, "leven": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/leven/-/leven-2.1.0.tgz", "integrity": "sha1-wuep93IJTe6dNCAq6KzORoeHVYA=" }, + "levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + } + }, "lilconfig": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.5.tgz", @@ -16424,6 +15364,15 @@ } } }, + "locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "requires": { + "p-locate": "^5.0.0" + } + }, "lodash": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", @@ -16459,6 +15408,12 @@ "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE=" }, + "lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, "lodash.once": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", @@ -16609,30 +15564,6 @@ "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", "dev": true }, - "map-age-cleaner": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", - "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", - "dev": true, - "requires": { - "p-defer": "^1.0.0" - } - }, - "map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", - "dev": true - }, - "map-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", - "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", - "dev": true, - "requires": { - "object-visit": "^1.0.0" - } - }, "markdown-it": { "version": "12.3.2", "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-12.3.2.tgz", @@ -16681,17 +15612,6 @@ "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" }, - "mem": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz", - "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==", - "dev": true, - "requires": { - "map-age-cleaner": "^0.1.1", - "mimic-fn": "^2.0.0", - "p-is-promise": "^2.0.0" - } - }, "merge-descriptors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", @@ -16703,38 +15623,11 @@ "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", "dev": true }, - "merge2": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.3.0.tgz", - "integrity": "sha512-2j4DAdlBOkiSZIsaXk4mTE3sRS02yBHAtfy127xRV3bQUFqXkjHCHLW6Scv7DwNRbIWNHH8zpnz9zMaKXIdvYw==", - "dev": true - }, "methods": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - } - }, "mime": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", @@ -16779,27 +15672,6 @@ "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", "dev": true }, - "mixin-deep": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", - "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", - "dev": true, - "requires": { - "for-in": "^1.0.2", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, "mkdirp": { "version": "0.5.5", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", @@ -16986,25 +15858,6 @@ "lru-cache": "^4.1.3" } }, - "nanomatch": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", - "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "fragment-cache": "^0.2.1", - "is-windows": "^1.0.2", - "kind-of": "^6.0.2", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - } - }, "napi-build-utils": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", @@ -17016,17 +15869,23 @@ "resolved": "https://registry.npmjs.org/native-duplexpair/-/native-duplexpair-1.0.0.tgz", "integrity": "sha1-eJkHjmS/PIo9cyYBs9QP8F21j6A=" }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "natural-compare-lite": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", + "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", + "dev": true + }, "negotiator": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==" }, - "nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", - "dev": true - }, "node-abi": { "version": "2.30.1", "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-2.30.1.tgz", @@ -17069,15 +15928,6 @@ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "dev": true }, - "npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", - "dev": true, - "requires": { - "path-key": "^2.0.0" - } - }, "npmlog": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", @@ -17117,43 +15967,6 @@ "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", "dev": true }, - "object-copy": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", - "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", - "dev": true, - "requires": { - "copy-descriptor": "^0.1.0", - "define-property": "^0.2.5", - "kind-of": "^3.0.3" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, "object-inspect": { "version": "1.12.2", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", @@ -17164,15 +15977,6 @@ "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" }, - "object-visit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", - "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", - "dev": true, - "requires": { - "isobject": "^3.0.0" - } - }, "object.assign": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", @@ -17184,15 +15988,6 @@ "object-keys": "^1.1.1" } }, - "object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", - "dev": true, - "requires": { - "isobject": "^3.0.1" - } - }, "on-finished": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", @@ -17241,46 +16036,49 @@ "is-wsl": "^2.2.0" } }, + "optionator": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "dev": true, + "requires": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" + } + }, "os-homedir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", "dev": true }, - "os-locale": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", - "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", - "dev": true, - "requires": { - "execa": "^1.0.0", - "lcid": "^2.0.0", - "mem": "^4.0.0" - } - }, "os-tmpdir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", "dev": true }, - "p-defer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", - "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=", - "dev": true - }, - "p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", - "dev": true + "p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "requires": { + "yocto-queue": "^0.1.0" + } }, - "p-is-promise": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.1.0.tgz", - "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==", - "dev": true + "p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "requires": { + "p-limit": "^3.0.2" + } }, "p-map": { "version": "4.0.0", @@ -17291,6 +16089,15 @@ "aggregate-error": "^3.0.0" } }, + "parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "requires": { + "callsites": "^3.0.0" + } + }, "parse-semver": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/parse-semver/-/parse-semver-1.1.1.tgz", @@ -17328,35 +16135,11 @@ "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" }, - "pascalcase": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", - "dev": true - }, - "path-dirname": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", - "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", - "dev": true - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - }, "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", - "dev": true - }, "path-parse": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", @@ -17368,15 +16151,6 @@ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" }, - "path-type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", - "dev": true, - "requires": { - "pify": "^3.0.0" - } - }, "pend": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", @@ -17406,12 +16180,6 @@ "integrity": "sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==", "dev": true }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - }, "pkg": { "version": "5.8.0", "resolved": "https://registry.npmjs.org/pkg/-/pkg-5.8.0.tgz", @@ -17696,12 +16464,6 @@ } } }, - "posix-character-classes": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", - "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", - "dev": true - }, "prebuild-install": { "version": "6.1.4", "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-6.1.4.tgz", @@ -17723,83 +16485,17 @@ "tunnel-agent": "^0.6.0" } }, - "prettier": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.7.1.tgz", - "integrity": "sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g==", + "prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true }, - "prettier-tslint": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/prettier-tslint/-/prettier-tslint-0.4.2.tgz", - "integrity": "sha512-urhX7U/F+fu8sztEs/Z7CxNS8PdEytEwGKhQaH5fxxCdRmHGT45FoClyDlcZrMk9cK/8JpX/asFmTOHtSGJfLg==", - "dev": true, - "requires": { - "chalk": "^2.4.0", - "globby": "^8.0.1", - "ignore": "^3.3.7", - "require-relative": "^0.8.7", - "tslint": "^5.9.1", - "yargs": "^11.0.0" - }, - "dependencies": { - "diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true - }, - "globby": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-8.0.2.tgz", - "integrity": "sha512-yTzMmKygLp8RUpG1Ymu2VXPSJQZjNAZPD4ywgYEaG7e4tBJeUQBO8OpXrf1RCNcEs5alsoJYPAMiIHP0cmeC7w==", - "dev": true, - "requires": { - "array-union": "^1.0.1", - "dir-glob": "2.0.0", - "fast-glob": "^2.0.2", - "glob": "^7.1.2", - "ignore": "^3.3.5", - "pify": "^3.0.0", - "slash": "^1.0.0" - } - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - }, - "tslint": { - "version": "5.20.1", - "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.20.1.tgz", - "integrity": "sha512-EcMxhzCFt8k+/UP5r8waCf/lzmeSyVlqxqMEDQE7rWYiQky8KpIBz1JAoYXfROHrPZ1XXd43q8yQnULOLiBRQg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "builtin-modules": "^1.1.1", - "chalk": "^2.3.0", - "commander": "^2.12.1", - "diff": "^4.0.1", - "glob": "^7.1.1", - "js-yaml": "^3.13.1", - "minimatch": "^3.0.4", - "mkdirp": "^0.5.1", - "resolve": "^1.3.2", - "semver": "^5.3.0", - "tslib": "^1.8.0", - "tsutils": "^2.29.0" - }, - "dependencies": { - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - } - } - } - } + "prettier": { + "version": "2.8.4", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.4.tgz", + "integrity": "sha512-vIS4Rlc2FNh0BySk3Wkd6xmwxB0FpOndW5fisM5H8hsZSxU2VWVB5CWIkIjWvrHjIhxk2g3bfMKM87zNTrZddw==", + "dev": true }, "private": { "version": "0.1.8", @@ -17954,15 +16650,11 @@ "private": "^0.1.6" } }, - "regex-not": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", - "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", - "dev": true, - "requires": { - "extend-shallow": "^3.0.2", - "safe-regex": "^1.1.0" - } + "regexpp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", + "dev": true }, "regexpu-core": { "version": "2.0.0", @@ -17990,18 +16682,6 @@ "jsesc": "~0.5.0" } }, - "repeat-element": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", - "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", - "dev": true - }, - "repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", - "dev": true - }, "repeating": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", @@ -18064,31 +16744,10 @@ "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", "dev": true }, - "require-main-filename": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", - "dev": true - }, - "require-relative": { - "version": "0.8.7", - "resolved": "https://registry.npmjs.org/require-relative/-/require-relative-0.8.7.tgz", - "integrity": "sha1-eZlTn8ngR6N5KPoZb44VY9q9Nt4=", - "dev": true - }, - "resolve": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.12.0.tgz", - "integrity": "sha512-B/dOmuoAik5bKcD6s6nXDCjzUKnaDvdkRyAk6rsmsKLipWj4797iothd7jmmUhWTfinVMU+wc56rYKsit2Qy4w==", - "dev": true, - "requires": { - "path-parse": "^1.0.6" - } - }, - "resolve-url": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true }, "restore-cursor": { @@ -18101,12 +16760,6 @@ "signal-exit": "^3.0.2" } }, - "ret": { - "version": "0.1.15", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", - "dev": true - }, "retry-as-promised": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/retry-as-promised/-/retry-as-promised-5.0.0.tgz", @@ -18155,15 +16808,6 @@ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, - "safe-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", - "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", - "dev": true, - "requires": { - "ret": "~0.1.10" - } - }, "safe-stable-stringify": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.3.1.tgz", @@ -18180,9 +16824,9 @@ "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" }, "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", "requires": { "lru-cache": "^6.0.0" }, @@ -18308,42 +16952,19 @@ "version": "1.15.0", "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", - "requires": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.18.0" - } - }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true - }, - "set-value": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", - "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.3", - "split-string": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" } }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true + }, "setprototypeof": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", @@ -18435,147 +17056,12 @@ } } }, - "snapdragon": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", - "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", - "dev": true, - "requires": { - "base": "^0.11.1", - "debug": "^2.2.0", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "map-cache": "^0.2.2", - "source-map": "^0.5.6", - "source-map-resolve": "^0.5.0", - "use": "^3.1.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "snapdragon-node": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", - "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", - "dev": true, - "requires": { - "define-property": "^1.0.0", - "isobject": "^3.0.0", - "snapdragon-util": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "snapdragon-util": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", - "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", - "dev": true, - "requires": { - "kind-of": "^3.2.0" - }, - "dependencies": { - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, "source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", "dev": true }, - "source-map-resolve": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz", - "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", - "dev": true, - "requires": { - "atob": "^2.1.1", - "decode-uri-component": "^0.2.0", - "resolve-url": "^0.2.1", - "source-map-url": "^0.4.0", - "urix": "^0.1.0" - } - }, "source-map-support": { "version": "0.4.18", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", @@ -18585,27 +17071,6 @@ "source-map": "^0.5.6" } }, - "source-map-url": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", - "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", - "dev": true - }, - "split-string": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", - "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", - "dev": true, - "requires": { - "extend-shallow": "^3.0.0" - } - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true - }, "sqlstring": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.2.tgz", @@ -18633,27 +17098,6 @@ "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=" }, - "static-extend": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", - "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", - "dev": true, - "requires": { - "define-property": "^0.2.5", - "object-copy": "^0.1.0" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - } - } - }, "statuses": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", @@ -18727,12 +17171,6 @@ "ansi-regex": "^2.0.0" } }, - "strip-eof": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", - "dev": true - }, "strip-final-newline": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", @@ -18854,6 +17292,12 @@ "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz", "integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==" }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true + }, "through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", @@ -18875,59 +17319,11 @@ "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", "dev": true }, - "to-object-path": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", - "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, "to-readable-stream": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-2.1.0.tgz", "integrity": "sha512-o3Qa6DGg1CEXshSdvWNX2sN4QHqg03SPq7U6jPXRahlQdl5dK8oXjkU/2/sGrnOZKeGV1zLSO8qPwyKklPPE7w==" }, - "to-regex": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", - "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", - "dev": true, - "requires": { - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "regex-not": "^1.0.2", - "safe-regex": "^1.1.0" - } - }, - "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - } - }, "toidentifier": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", @@ -19006,51 +17402,10 @@ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==" }, - "tslint": { - "version": "6.1.3", - "resolved": "https://registry.npmjs.org/tslint/-/tslint-6.1.3.tgz", - "integrity": "sha512-IbR4nkT96EQOvKE2PW/djGz8iGNeJ4rF2mBfiYaR/nvUWYKJhLwimoJKgjIFEIDibBtOevj7BqCRL4oHeWWUCg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "builtin-modules": "^1.1.1", - "chalk": "^2.3.0", - "commander": "^2.12.1", - "diff": "^4.0.1", - "glob": "^7.1.1", - "js-yaml": "^3.13.1", - "minimatch": "^3.0.4", - "mkdirp": "^0.5.3", - "resolve": "^1.3.2", - "semver": "^5.3.0", - "tslib": "^1.13.0", - "tsutils": "^2.29.0" - }, - "dependencies": { - "diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - }, - "tslib": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", - "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==", - "dev": true - } - } - }, "tsutils": { - "version": "2.29.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", - "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", "dev": true, "requires": { "tslib": "^1.8.1" @@ -19084,6 +17439,15 @@ "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", "dev": true }, + "type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1" + } + }, "type-fest": { "version": "0.21.3", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", @@ -19111,9 +17475,9 @@ } }, "typescript": { - "version": "4.3.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.3.5.tgz", - "integrity": "sha512-DqQgihaQ9cUrskJo9kIyW/+g0Vxsk8cDtZ52a3NGh0YNTfpUSArXSohyUGnvbPazEPLu398C0UxmKSOrPumUzA==", + "version": "4.9.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", + "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", "dev": true }, "uc.micro": { @@ -19139,18 +17503,6 @@ "integrity": "sha512-ekY1NhRzq0B08g4bGuX4wd2jZx5GnKz6mKSqFL4nqBlfyMGiG10gDFhDTMEfYmDL6Jy0FUIZp7wiRB+0BP7J2g==", "dev": true }, - "union-value": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", - "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", - "dev": true, - "requires": { - "arr-union": "^3.1.0", - "get-value": "^2.0.6", - "is-extendable": "^0.1.1", - "set-value": "^2.0.1" - } - }, "universalify": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", @@ -19161,46 +17513,6 @@ "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" }, - "unset-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", - "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", - "dev": true, - "requires": { - "has-value": "^0.3.1", - "isobject": "^3.0.0" - }, - "dependencies": { - "has-value": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", - "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", - "dev": true, - "requires": { - "get-value": "^2.0.3", - "has-values": "^0.1.4", - "isobject": "^2.0.0" - }, - "dependencies": { - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "dev": true, - "requires": { - "isarray": "1.0.0" - } - } - } - }, - "has-values": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", - "dev": true - } - } - }, "uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", @@ -19215,24 +17527,12 @@ "resolved": "https://registry.npmjs.org/uri-templates/-/uri-templates-0.2.0.tgz", "integrity": "sha1-K1eEURzJCYaHMekjPCaAl9ELSZ8=" }, - "urix": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", - "dev": true - }, "url-join": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.1.tgz", "integrity": "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==", "dev": true }, - "use": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", - "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", - "dev": true - }, "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -19358,12 +17658,6 @@ "is-symbol": "^1.0.3" } }, - "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", - "dev": true - }, "wide-align": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", @@ -19437,6 +17731,12 @@ "@types/node": "*" } }, + "word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true + }, "wrap-ansi": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", @@ -19525,12 +17825,6 @@ "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==" }, - "y18n": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.2.tgz", - "integrity": "sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==", - "dev": true - }, "yallist": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", @@ -19542,119 +17836,6 @@ "integrity": "sha512-o96x3OPo8GjWeSLF+wOAbrPfhFOGY0W00GNaxCDv+9hkcDJEnev1yh8S7pgHF0ik6zc8sQLuL8hjHjJULZp8bw==", "dev": true }, - "yargs": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-11.1.1.tgz", - "integrity": "sha512-PRU7gJrJaXv3q3yQZ/+/X6KBswZiaQ+zOmdprZcouPYtQgvNU35i+68M4b1ZHLZtYFT5QObFLV+ZkmJYcwKdiw==", - "dev": true, - "requires": { - "cliui": "^4.0.0", - "decamelize": "^1.1.1", - "find-up": "^2.1.0", - "get-caller-file": "^1.0.1", - "os-locale": "^3.1.0", - "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", - "set-blocking": "^2.0.0", - "string-width": "^2.0.0", - "which-module": "^2.0.0", - "y18n": "^3.2.1", - "yargs-parser": "^9.0.2" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "requires": { - "locate-path": "^2.0.0" - } - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "dev": true, - "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - } - }, - "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dev": true, - "requires": { - "p-try": "^1.0.0" - } - }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "dev": true, - "requires": { - "p-limit": "^1.1.0" - } - }, - "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", - "dev": true - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - } - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - } - } - }, - "yargs-parser": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-9.0.2.tgz", - "integrity": "sha1-nM9qQ0YP5O1Aqbto9I1DuKaMwHc=", - "dev": true, - "requires": { - "camelcase": "^4.1.0" - }, - "dependencies": { - "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", - "dev": true - } - } - }, "yauzl": { "version": "2.10.0", "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", @@ -19679,6 +17860,12 @@ "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", "dev": true + }, + "yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true } } } diff --git a/package.json b/package.json index d22161fae..64c36c0e3 100644 --- a/package.json +++ b/package.json @@ -69,22 +69,23 @@ "@types/validator": "^13.1.4", "@types/vscode": "^1.39.0", "@types/xml2js": "^0.4.3", + "@typescript-eslint/eslint-plugin": "^5.54.1", + "@typescript-eslint/parser": "^5.54.1", "autorest": "^3.6.0", "azure-storage": "^2.10.3", "cross-env": "^6.0.3", "cross-var": "^1.1.0", + "eslint": "^8.35.0", "find-process": "^1.4.4", "husky": "^8.0.1", "lint-staged": "^13.0.0", "mocha": "^5.2.0", "pkg": "^5.3.0", "prettier": "^2.2.1", - "prettier-tslint": "^0.4.2", "rcedit": "^3.0.1", "ts-mockito": "^2.6.1", "ts-node": "^10.0.0", - "tslint": "^6.1.3", - "typescript": "^4.2.4", + "typescript": "^4.9.5", "vsce": "^2.7.0" }, "activationEvents": [ @@ -283,12 +284,12 @@ "queue": "node -r ts-node/register src/queue/main.ts", "table": "node -r ts-node/register src/table/main.ts", "azurite": "node -r ts-node/register src/azurite.ts", - "lint": "tslint -p tsconfig.json -c tslint.json src/**/*.ts", - "test": "npm run lint && cross-env NODE_TLS_REJECT_UNAUTHORIZED=0 mocha --compilers ts-node/register --no-timeouts --grep @loki --recursive tests/**/*.test.ts tests/**/**/*.test.ts", - "test:blob": "npm run lint && cross-env NODE_TLS_REJECT_UNAUTHORIZED=0 mocha --compilers ts-node/register --no-timeouts --grep @loki --recursive tests/blob/*.test.ts tests/blob/**/*.test.ts", - "test:blob:sql": "npm run lint && cross-env cross-env NODE_TLS_REJECT_UNAUTHORIZED=0 AZURITE_TEST_DB=mysql://root:my-secret-pw@127.0.0.1:3306/azurite_blob_test mocha --compilers ts-node/register --no-timeouts --grep @sql --recursive tests/blob/*.test.ts tests/blob/**/*.test.ts", - "test:blob:sql:ci": "npm run lint && cross-env cross-env NODE_TLS_REJECT_UNAUTHORIZED=0 AZURITE_TEST_DB=mysql://root:my-secret-pw@127.0.0.1:13306/azurite_blob_test mocha --compilers ts-node/register --no-timeouts --grep @sql --recursive tests/blob/*.test.ts tests/blob/**/*.test.ts", - "test:queue": "npm run lint && cross-env NODE_TLS_REJECT_UNAUTHORIZED=0 mocha --compilers ts-node/register --no-timeouts --recursive tests/queue/*.test.ts tests/queue/**/*.test.ts", + "lint": "npx eslint src/**/*.ts", + "test": "npm run lint && cross-env NODE_TLS_REJECT_UNAUTHORIZED=0 mocha --compilers ts-node/register --no-timeouts --grep @loki --recursive --exit tests/**/*.test.ts tests/**/**/*.test.ts", + "test:blob": "npm run lint && cross-env NODE_TLS_REJECT_UNAUTHORIZED=0 mocha --compilers ts-node/register --no-timeouts --grep @loki --recursive --exit tests/blob/*.test.ts tests/blob/**/*.test.ts", + "test:blob:sql": "npm run lint && cross-env cross-env NODE_TLS_REJECT_UNAUTHORIZED=0 AZURITE_TEST_DB=mysql://root:my-secret-pw@127.0.0.1:3306/azurite_blob_test mocha --compilers ts-node/register --no-timeouts --grep @sql --recursive --exit tests/blob/*.test.ts tests/blob/**/*.test.ts", + "test:blob:sql:ci": "npm run lint && cross-env cross-env NODE_TLS_REJECT_UNAUTHORIZED=0 AZURITE_TEST_DB=mysql://root:my-secret-pw@127.0.0.1:13306/azurite_blob_test mocha --compilers ts-node/register --no-timeouts --grep @sql --recursive --exit tests/blob/*.test.ts tests/blob/**/*.test.ts", + "test:queue": "npm run lint && cross-env NODE_TLS_REJECT_UNAUTHORIZED=0 mocha --compilers ts-node/register --no-timeouts --recursive --exit tests/queue/*.test.ts tests/queue/**/*.test.ts", "test:table": "npm run lint && cross-env NODE_TLS_REJECT_UNAUTHORIZED=0 mocha --compilers ts-node/register --no-timeouts --recursive --exit tests/table/**/*.test.ts", "test:exe": "npm run lint && cross-env NODE_TLS_REJECT_UNAUTHORIZED=0 mocha --compilers ts-node/register --no-timeouts tests/exe.test.ts --exit", "test:linux": "npm run lint && cross-env NODE_TLS_REJECT_UNAUTHORIZED=0 mocha --compilers ts-node/register --no-timeouts tests/linuxbinary.test.ts --exit", @@ -319,4 +320,4 @@ "url": "https://github.com/azure/azurite/issues" }, "homepage": "https://github.com/azure/azurite#readme" -} \ No newline at end of file +} diff --git a/src/queue/persistence/LokiQueueMetadataStore.ts b/src/queue/persistence/LokiQueueMetadataStore.ts index 2d463030f..e4f6630dc 100644 --- a/src/queue/persistence/LokiQueueMetadataStore.ts +++ b/src/queue/persistence/LokiQueueMetadataStore.ts @@ -299,8 +299,8 @@ export default class LokiQueueMetadataStore implements IQueueMetadataStore { const queueMeta = queue.metadata; // Check if both metadata is empty. - if (queueMeta === undefined || queueMeta === {}) { - if (docMeta !== undefined && docMeta.length !== {}) { + if (queueMeta === undefined) { + if (docMeta !== undefined) { throw StorageErrorFactory.getQueueAlreadyExists( context ? context.contextID : undefined ); @@ -309,7 +309,7 @@ export default class LokiQueueMetadataStore implements IQueueMetadataStore { } } - if (docMeta === undefined || docMeta.length === {}) { + if (docMeta === undefined) { throw StorageErrorFactory.getQueueAlreadyExists( context ? context.contextID : undefined ); diff --git a/src/table/batch/TableBatchSerialization.ts b/src/table/batch/TableBatchSerialization.ts index c28e315d2..af508d6b8 100644 --- a/src/table/batch/TableBatchSerialization.ts +++ b/src/table/batch/TableBatchSerialization.ts @@ -58,8 +58,7 @@ export class TableBatchSerialization extends BatchSerialization { // of the request by deserializing it into a BatchOperation Type const batchOperations: TableBatchOperation[] = subRequests.map( (subRequest) => { - let requestType: RegExpMatchArray | null = []; - requestType = subRequest.match( + let requestType: RegExpMatchArray | null = subRequest.match( "(GET|PATCH|POST|PUT|MERGE|INSERT|DELETE)" ); if (requestType === null || requestType.length < 2) { diff --git a/tsconfig.json b/tsconfig.json index a7cad8dc9..42a2e39db 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -18,7 +18,9 @@ "declarationDir": "./typings", "lib": ["es5", "es6", "es7", "esnext", "dom"], "esModuleInterop": true, - "downlevelIteration": true + "downlevelIteration": true, + "useUnknownInCatchVariables": false, + "skipLibCheck": true, }, "compileOnSave": true, "exclude": ["node_modules"], From 6cc36cce671d7f84669b541923694b6a32bead33 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 15 Mar 2023 16:29:06 +0800 Subject: [PATCH 030/297] Bump husky from 8.0.2 to 8.0.3 (#1786) Bumps [husky](https://github.com/typicode/husky) from 8.0.2 to 8.0.3. - [Release notes](https://github.com/typicode/husky/releases) - [Commits](https://github.com/typicode/husky/compare/v8.0.2...v8.0.3) --- updated-dependencies: - dependency-name: husky dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index d60e584d2..ecc310fcf 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5624,9 +5624,9 @@ } }, "node_modules/husky": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/husky/-/husky-8.0.2.tgz", - "integrity": "sha512-Tkv80jtvbnkK3mYWxPZePGFpQ/tT3HNSs/sasF9P2YfkMezDl3ON37YN6jUUI4eTg5LcyVynlb6r4eyvOmspvg==", + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/husky/-/husky-8.0.3.tgz", + "integrity": "sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg==", "dev": true, "bin": { "husky": "lib/bin.js" @@ -14525,9 +14525,9 @@ "dev": true }, "husky": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/husky/-/husky-8.0.2.tgz", - "integrity": "sha512-Tkv80jtvbnkK3mYWxPZePGFpQ/tT3HNSs/sasF9P2YfkMezDl3ON37YN6jUUI4eTg5LcyVynlb6r4eyvOmspvg==", + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/husky/-/husky-8.0.3.tgz", + "integrity": "sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg==", "dev": true }, "iconv-lite": { From eeea4d551709da97b3ac03cafdd23e21f4fae4b9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 16 Mar 2023 10:46:42 +0800 Subject: [PATCH 031/297] Bump @types/async from 3.2.16 to 3.2.18 (#1838) Bumps [@types/async](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/async) from 3.2.16 to 3.2.18. - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/async) --- updated-dependencies: - dependency-name: "@types/async" dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index ecc310fcf..87f32b358 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1137,9 +1137,9 @@ "dev": true }, "node_modules/@types/async": { - "version": "3.2.16", - "resolved": "https://registry.npmjs.org/@types/async/-/async-3.2.16.tgz", - "integrity": "sha512-jnlGp5Z/cAZ7JVYyLnSDuYJ+YyYm0o2yzL8Odv6ckWmGMow3j/P/wgfziybB044cXXA93lEuymJyxVR8Iz2amQ==", + "version": "3.2.18", + "resolved": "https://registry.npmjs.org/@types/async/-/async-3.2.18.tgz", + "integrity": "sha512-/IsuXp3B9R//uRLi40VlIYoMp7OzhkunPe2fDu7jGfQXI9y3CDCx6FC4juRLSqrpmLst3vgsiK536AAGJFl4Ww==", "dev": true }, "node_modules/@types/bluebird": { @@ -10936,9 +10936,9 @@ "dev": true }, "@types/async": { - "version": "3.2.16", - "resolved": "https://registry.npmjs.org/@types/async/-/async-3.2.16.tgz", - "integrity": "sha512-jnlGp5Z/cAZ7JVYyLnSDuYJ+YyYm0o2yzL8Odv6ckWmGMow3j/P/wgfziybB044cXXA93lEuymJyxVR8Iz2amQ==", + "version": "3.2.18", + "resolved": "https://registry.npmjs.org/@types/async/-/async-3.2.18.tgz", + "integrity": "sha512-/IsuXp3B9R//uRLi40VlIYoMp7OzhkunPe2fDu7jGfQXI9y3CDCx6FC4juRLSqrpmLst3vgsiK536AAGJFl4Ww==", "dev": true }, "@types/bluebird": { From e99e74f6a561c2eec2ae1af17c737a174b2f0085 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 17 Mar 2023 13:43:28 +0800 Subject: [PATCH 032/297] Bump @typescript-eslint/parser from 5.54.1 to 5.55.0 (#1841) Bumps [@typescript-eslint/parser](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/parser) from 5.54.1 to 5.55.0. - [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases) - [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/parser/CHANGELOG.md) - [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v5.55.0/packages/parser) --- updated-dependencies: - dependency-name: "@typescript-eslint/parser" dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 139 ++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 127 insertions(+), 12 deletions(-) diff --git a/package-lock.json b/package-lock.json index 87f32b358..e178689e4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1456,14 +1456,14 @@ "dev": true }, "node_modules/@typescript-eslint/parser": { - "version": "5.54.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.54.1.tgz", - "integrity": "sha512-8zaIXJp/nG9Ff9vQNh7TI+C3nA6q6iIsGJ4B4L6MhZ7mHnTMR4YP5vp2xydmFXIy8rpyIVbNAG44871LMt6ujg==", + "version": "5.55.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.55.0.tgz", + "integrity": "sha512-ppvmeF7hvdhUUZWSd2EEWfzcFkjJzgNQzVST22nzg958CR+sphy8A6K7LXQZd6V75m1VKjp+J4g/PCEfSCmzhw==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "5.54.1", - "@typescript-eslint/types": "5.54.1", - "@typescript-eslint/typescript-estree": "5.54.1", + "@typescript-eslint/scope-manager": "5.55.0", + "@typescript-eslint/types": "5.55.0", + "@typescript-eslint/typescript-estree": "5.55.0", "debug": "^4.3.4" }, "engines": { @@ -1482,6 +1482,80 @@ } } }, + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/scope-manager": { + "version": "5.55.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.55.0.tgz", + "integrity": "sha512-OK+cIO1ZGhJYNCL//a3ROpsd83psf4dUJ4j7pdNVzd5DmIk+ffkuUIX2vcZQbEW/IR41DYsfJTB19tpCboxQuw==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.55.0", + "@typescript-eslint/visitor-keys": "5.55.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/types": { + "version": "5.55.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.55.0.tgz", + "integrity": "sha512-M4iRh4AG1ChrOL6Y+mETEKGeDnT7Sparn6fhZ5LtVJF1909D5O4uqK+C5NPbLmpfZ0XIIxCdwzKiijpZUOvOug==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/typescript-estree": { + "version": "5.55.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.55.0.tgz", + "integrity": "sha512-I7X4A9ovA8gdpWMpr7b1BN9eEbvlEtWhQvpxp/yogt48fy9Lj3iE3ild/1H3jKBBIYj5YYJmS2+9ystVhC7eaQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.55.0", + "@typescript-eslint/visitor-keys": "5.55.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/visitor-keys": { + "version": "5.55.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.55.0.tgz", + "integrity": "sha512-q2dlHHwWgirKh1D3acnuApXG+VNXpEY5/AwRxDVuEQpxWaB0jCDe0jFMVMALJ3ebSfuOVE8/rMS+9ZOYGg1GWw==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.55.0", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, "node_modules/@typescript-eslint/parser/node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -11233,17 +11307,58 @@ } }, "@typescript-eslint/parser": { - "version": "5.54.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.54.1.tgz", - "integrity": "sha512-8zaIXJp/nG9Ff9vQNh7TI+C3nA6q6iIsGJ4B4L6MhZ7mHnTMR4YP5vp2xydmFXIy8rpyIVbNAG44871LMt6ujg==", + "version": "5.55.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.55.0.tgz", + "integrity": "sha512-ppvmeF7hvdhUUZWSd2EEWfzcFkjJzgNQzVST22nzg958CR+sphy8A6K7LXQZd6V75m1VKjp+J4g/PCEfSCmzhw==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "5.54.1", - "@typescript-eslint/types": "5.54.1", - "@typescript-eslint/typescript-estree": "5.54.1", + "@typescript-eslint/scope-manager": "5.55.0", + "@typescript-eslint/types": "5.55.0", + "@typescript-eslint/typescript-estree": "5.55.0", "debug": "^4.3.4" }, "dependencies": { + "@typescript-eslint/scope-manager": { + "version": "5.55.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.55.0.tgz", + "integrity": "sha512-OK+cIO1ZGhJYNCL//a3ROpsd83psf4dUJ4j7pdNVzd5DmIk+ffkuUIX2vcZQbEW/IR41DYsfJTB19tpCboxQuw==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.55.0", + "@typescript-eslint/visitor-keys": "5.55.0" + } + }, + "@typescript-eslint/types": { + "version": "5.55.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.55.0.tgz", + "integrity": "sha512-M4iRh4AG1ChrOL6Y+mETEKGeDnT7Sparn6fhZ5LtVJF1909D5O4uqK+C5NPbLmpfZ0XIIxCdwzKiijpZUOvOug==", + "dev": true + }, + "@typescript-eslint/typescript-estree": { + "version": "5.55.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.55.0.tgz", + "integrity": "sha512-I7X4A9ovA8gdpWMpr7b1BN9eEbvlEtWhQvpxp/yogt48fy9Lj3iE3ild/1H3jKBBIYj5YYJmS2+9ystVhC7eaQ==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.55.0", + "@typescript-eslint/visitor-keys": "5.55.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + } + }, + "@typescript-eslint/visitor-keys": { + "version": "5.55.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.55.0.tgz", + "integrity": "sha512-q2dlHHwWgirKh1D3acnuApXG+VNXpEY5/AwRxDVuEQpxWaB0jCDe0jFMVMALJ3ebSfuOVE8/rMS+9ZOYGg1GWw==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.55.0", + "eslint-visitor-keys": "^3.3.0" + } + }, "debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", From e65593256ee4cec075703992be9afb1231b0aad6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 17 Mar 2023 13:57:42 +0800 Subject: [PATCH 033/297] Bump @azure/storage-blob from 12.12.0 to 12.13.0 (#1837) * Bump @azure/storage-blob from 12.12.0 to 12.13.0 Bumps [@azure/storage-blob](https://github.com/Azure/azure-sdk-for-js) from 12.12.0 to 12.13.0. - [Release notes](https://github.com/Azure/azure-sdk-for-js/releases) - [Changelog](https://github.com/Azure/azure-sdk-for-js/blob/main/documentation/Changelog-for-next-generation.md) - [Commits](https://github.com/Azure/azure-sdk-for-js/compare/@azure/storage-blob_12.12.0...@azure/storage-blob_12.13.0) --- updated-dependencies: - dependency-name: "@azure/storage-blob" dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] * Fix test failure --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Wei Wei --- package-lock.json | 123 +++++++++++++++++++++++++---- tests/blob/blobCorsRequest.test.ts | 4 +- 2 files changed, 109 insertions(+), 18 deletions(-) diff --git a/package-lock.json b/package-lock.json index e178689e4..422414b7c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -281,14 +281,15 @@ } }, "node_modules/@azure/core-util": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@azure/core-util/-/core-util-1.0.0.tgz", - "integrity": "sha512-yWshY9cdPthlebnb3Zuz/j0Lv4kjU6u7PR5sW7A9FF7EX+0irMRJAtyTq5TPiDHJfjH8gTSlnIYFj9m7Ed76IQ==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@azure/core-util/-/core-util-1.2.0.tgz", + "integrity": "sha512-ffGIw+Qs8bNKNLxz5UPkz4/VBM/EZY07mPve1ZYFqYUdPwFqRj0RPk0U7LZMOfT7GCck9YjuT1Rfp1PApNl1ng==", "dependencies": { + "@azure/abort-controller": "^1.0.0", "tslib": "^2.2.0" }, "engines": { - "node": ">=12.0.0" + "node": ">=14.0.0" } }, "node_modules/@azure/core-xml": { @@ -595,13 +596,13 @@ } }, "node_modules/@azure/storage-blob": { - "version": "12.12.0", - "resolved": "https://registry.npmjs.org/@azure/storage-blob/-/storage-blob-12.12.0.tgz", - "integrity": "sha512-o/Mf6lkyYG/eBW4/hXB9864RxVNmAkcKHjsGR6Inlp5hupa3exjSyH2KjO3tLO//YGA+tS+17hM2bxRl9Sn16g==", + "version": "12.13.0", + "resolved": "https://registry.npmjs.org/@azure/storage-blob/-/storage-blob-12.13.0.tgz", + "integrity": "sha512-t3Q2lvBMJucgTjQcP5+hvEJMAsJSk0qmAnjDLie2td017IiduZbbC9BOcFfmwzR6y6cJdZOuewLCNFmEx9IrXA==", "dev": true, "dependencies": { "@azure/abort-controller": "^1.0.0", - "@azure/core-http": "^2.0.0", + "@azure/core-http": "^3.0.0", "@azure/core-lro": "^2.2.0", "@azure/core-paging": "^1.1.1", "@azure/core-tracing": "1.0.0-preview.13", @@ -610,7 +611,55 @@ "tslib": "^2.2.0" }, "engines": { - "node": ">=12.0.0" + "node": ">=14.0.0" + } + }, + "node_modules/@azure/storage-blob/node_modules/@azure/core-http": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@azure/core-http/-/core-http-3.0.0.tgz", + "integrity": "sha512-BxI2SlGFPPz6J1XyZNIVUf0QZLBKFX+ViFjKOkzqD18J1zOINIQ8JSBKKr+i+v8+MB6LacL6Nn/sP/TE13+s2Q==", + "dev": true, + "dependencies": { + "@azure/abort-controller": "^1.0.0", + "@azure/core-auth": "^1.3.0", + "@azure/core-tracing": "1.0.0-preview.13", + "@azure/core-util": "^1.1.1", + "@azure/logger": "^1.0.0", + "@types/node-fetch": "^2.5.0", + "@types/tunnel": "^0.0.3", + "form-data": "^4.0.0", + "node-fetch": "^2.6.7", + "process": "^0.11.10", + "tslib": "^2.2.0", + "tunnel": "^0.0.6", + "uuid": "^8.3.0", + "xml2js": "^0.4.19" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@azure/storage-blob/node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dev": true, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@azure/storage-blob/node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "dev": true, + "bin": { + "uuid": "dist/bin/uuid" } }, "node_modules/@azure/storage-queue": { @@ -10347,10 +10396,11 @@ } }, "@azure/core-util": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@azure/core-util/-/core-util-1.0.0.tgz", - "integrity": "sha512-yWshY9cdPthlebnb3Zuz/j0Lv4kjU6u7PR5sW7A9FF7EX+0irMRJAtyTq5TPiDHJfjH8gTSlnIYFj9m7Ed76IQ==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@azure/core-util/-/core-util-1.2.0.tgz", + "integrity": "sha512-ffGIw+Qs8bNKNLxz5UPkz4/VBM/EZY07mPve1ZYFqYUdPwFqRj0RPk0U7LZMOfT7GCck9YjuT1Rfp1PApNl1ng==", "requires": { + "@azure/abort-controller": "^1.0.0", "tslib": "^2.2.0" } }, @@ -10609,19 +10659,60 @@ } }, "@azure/storage-blob": { - "version": "12.12.0", - "resolved": "https://registry.npmjs.org/@azure/storage-blob/-/storage-blob-12.12.0.tgz", - "integrity": "sha512-o/Mf6lkyYG/eBW4/hXB9864RxVNmAkcKHjsGR6Inlp5hupa3exjSyH2KjO3tLO//YGA+tS+17hM2bxRl9Sn16g==", + "version": "12.13.0", + "resolved": "https://registry.npmjs.org/@azure/storage-blob/-/storage-blob-12.13.0.tgz", + "integrity": "sha512-t3Q2lvBMJucgTjQcP5+hvEJMAsJSk0qmAnjDLie2td017IiduZbbC9BOcFfmwzR6y6cJdZOuewLCNFmEx9IrXA==", "dev": true, "requires": { "@azure/abort-controller": "^1.0.0", - "@azure/core-http": "^2.0.0", + "@azure/core-http": "^3.0.0", "@azure/core-lro": "^2.2.0", "@azure/core-paging": "^1.1.1", "@azure/core-tracing": "1.0.0-preview.13", "@azure/logger": "^1.0.0", "events": "^3.0.0", "tslib": "^2.2.0" + }, + "dependencies": { + "@azure/core-http": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@azure/core-http/-/core-http-3.0.0.tgz", + "integrity": "sha512-BxI2SlGFPPz6J1XyZNIVUf0QZLBKFX+ViFjKOkzqD18J1zOINIQ8JSBKKr+i+v8+MB6LacL6Nn/sP/TE13+s2Q==", + "dev": true, + "requires": { + "@azure/abort-controller": "^1.0.0", + "@azure/core-auth": "^1.3.0", + "@azure/core-tracing": "1.0.0-preview.13", + "@azure/core-util": "^1.1.1", + "@azure/logger": "^1.0.0", + "@types/node-fetch": "^2.5.0", + "@types/tunnel": "^0.0.3", + "form-data": "^4.0.0", + "node-fetch": "^2.6.7", + "process": "^0.11.10", + "tslib": "^2.2.0", + "tunnel": "^0.0.6", + "uuid": "^8.3.0", + "xml2js": "^0.4.19" + } + }, + "form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } + }, + "uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "dev": true + } } }, "@azure/storage-queue": { diff --git a/tests/blob/blobCorsRequest.test.ts b/tests/blob/blobCorsRequest.test.ts index 7fc25f36c..a2daa1188 100644 --- a/tests/blob/blobCorsRequest.test.ts +++ b/tests/blob/blobCorsRequest.test.ts @@ -1,13 +1,13 @@ import { newPipeline, BlobServiceClient, - StorageSharedKeyCredential + StorageSharedKeyCredential, + RestError } from "@azure/storage-blob"; import * as assert from "assert"; import { configLogger } from "../../src/common/Logger"; import BlobTestServerFactory from "../BlobTestServerFactory"; -import { RestError } from "@azure/core-http"; import { EMULATOR_ACCOUNT_KEY, EMULATOR_ACCOUNT_NAME, From 53e9a5de1ef837d69fb92a1cb2904ef3c5818041 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 20 Mar 2023 09:57:34 +0800 Subject: [PATCH 034/297] Bump mysql2 from 2.3.2 to 3.2.0 (#1846) Bumps [mysql2](https://github.com/sidorares/node-mysql2) from 2.3.2 to 3.2.0. - [Release notes](https://github.com/sidorares/node-mysql2/releases) - [Changelog](https://github.com/sidorares/node-mysql2/blob/master/Changelog.md) - [Commits](https://github.com/sidorares/node-mysql2/compare/v2.3.2...v3.2.0) --- updated-dependencies: - dependency-name: mysql2 dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 131 ++++++++++++++++++++++++---------------------- package.json | 2 +- 2 files changed, 69 insertions(+), 64 deletions(-) diff --git a/package-lock.json b/package-lock.json index 422414b7c..1b9d38b2e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -20,7 +20,7 @@ "lokijs": "^1.5.6", "morgan": "^1.9.1", "multistream": "^2.1.1", - "mysql2": "^2.1.0", + "mysql2": "^3.2.0", "rimraf": "^3.0.2", "sequelize": "^6.3.0", "stoppable": "^1.1.0", @@ -3856,9 +3856,9 @@ "dev": true }, "node_modules/denque": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/denque/-/denque-2.0.1.tgz", - "integrity": "sha512-tfiWc6BQLXNLpNiR5iGd0Ocu3P3VpxfzFiqubLgMfhfOw9WyvgJBd46CClNn9k3qfbjvT//0cf7AlYRX/OslMQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/denque/-/denque-2.1.0.tgz", + "integrity": "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==", "engines": { "node": ">=0.10" } @@ -7140,9 +7140,9 @@ "integrity": "sha512-Q5ALD6JiS6xAUWCwX3taQmgwxyveCtIIuL08+ml0nHwT3k0S/GIFJN+Hd38b1qYIMaE5X++iqsqWVksz7SYW+Q==" }, "node_modules/long": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", - "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/long/-/long-5.2.1.tgz", + "integrity": "sha512-GKSNGeNAtw8IryjjkhZxuKB3JzlcLTwjtiQCHKvqQet81I93kXslhDQruGI/QsddO83mcDToBVy7GqGS/zYf/A==" }, "node_modules/loose-envify": { "version": "1.4.0", @@ -7160,6 +7160,7 @@ "version": "4.1.5", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "dev": true, "dependencies": { "pseudomap": "^1.0.2", "yallist": "^2.1.2" @@ -7482,16 +7483,16 @@ "dev": true }, "node_modules/mysql2": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-2.3.2.tgz", - "integrity": "sha512-JUSA50rt/nSew8aq8xe3pRk5Q4y/M5QdSJn7Ey3ndOlPp2KXuialQ0sS35DNhPT5Z5PnOiIwSSQvKkl1WorqRA==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.2.0.tgz", + "integrity": "sha512-0Vn6a9WSrq6fWwvPgrvIwnOCldiEcgbzapVRDAtDZ4cMTxN7pnGqCTx8EG32S/NYXl6AXkdO+9hV1tSIi/LigA==", "dependencies": { - "denque": "^2.0.1", + "denque": "^2.1.0", "generate-function": "^2.3.1", "iconv-lite": "^0.6.3", - "long": "^4.0.0", - "lru-cache": "^6.0.0", - "named-placeholders": "^1.1.2", + "long": "^5.2.1", + "lru-cache": "^7.14.1", + "named-placeholders": "^1.1.3", "seq-queue": "^0.0.5", "sqlstring": "^2.3.2" }, @@ -7511,30 +7512,30 @@ } }, "node_modules/mysql2/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dependencies": { - "yallist": "^4.0.0" - }, + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", "engines": { - "node": ">=10" + "node": ">=12" } }, - "node_modules/mysql2/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, "node_modules/named-placeholders": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/named-placeholders/-/named-placeholders-1.1.2.tgz", - "integrity": "sha512-wiFWqxoLL3PGVReSZpjLVxyJ1bRqe+KKJVbr4hGs1KWfTZTQyezHFBbuKj9hsizHyGV2ne7EMjHdxEGAybD5SA==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/named-placeholders/-/named-placeholders-1.1.3.tgz", + "integrity": "sha512-eLoBxg6wE/rZkJPhU/xRX1WTpkFEwDJEN96oxFrTsqBdbT5ec295Q+CoHrL9IT0DipqKhmGcaZmwOt8OON5x1w==", "dependencies": { - "lru-cache": "^4.1.3" + "lru-cache": "^7.14.1" }, "engines": { - "node": ">=6.0.0" + "node": ">=12.0.0" + } + }, + "node_modules/named-placeholders/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "engines": { + "node": ">=12" } }, "node_modules/napi-build-utils": { @@ -8460,7 +8461,8 @@ "node_modules/pseudomap": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", + "dev": true }, "node_modules/psl": { "version": "1.4.0", @@ -10180,7 +10182,8 @@ "node_modules/yallist": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true }, "node_modules/yaml": { "version": "2.1.1", @@ -13335,9 +13338,9 @@ "dev": true }, "denque": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/denque/-/denque-2.0.1.tgz", - "integrity": "sha512-tfiWc6BQLXNLpNiR5iGd0Ocu3P3VpxfzFiqubLgMfhfOw9WyvgJBd46CClNn9k3qfbjvT//0cf7AlYRX/OslMQ==" + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/denque/-/denque-2.1.0.tgz", + "integrity": "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==" }, "depd": { "version": "2.0.0", @@ -15742,9 +15745,9 @@ "integrity": "sha512-Q5ALD6JiS6xAUWCwX3taQmgwxyveCtIIuL08+ml0nHwT3k0S/GIFJN+Hd38b1qYIMaE5X++iqsqWVksz7SYW+Q==" }, "long": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", - "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/long/-/long-5.2.1.tgz", + "integrity": "sha512-GKSNGeNAtw8IryjjkhZxuKB3JzlcLTwjtiQCHKvqQet81I93kXslhDQruGI/QsddO83mcDToBVy7GqGS/zYf/A==" }, "loose-envify": { "version": "1.4.0", @@ -15759,6 +15762,7 @@ "version": "4.1.5", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "dev": true, "requires": { "pseudomap": "^1.0.2", "yallist": "^2.1.2" @@ -16019,16 +16023,16 @@ "dev": true }, "mysql2": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-2.3.2.tgz", - "integrity": "sha512-JUSA50rt/nSew8aq8xe3pRk5Q4y/M5QdSJn7Ey3ndOlPp2KXuialQ0sS35DNhPT5Z5PnOiIwSSQvKkl1WorqRA==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.2.0.tgz", + "integrity": "sha512-0Vn6a9WSrq6fWwvPgrvIwnOCldiEcgbzapVRDAtDZ4cMTxN7pnGqCTx8EG32S/NYXl6AXkdO+9hV1tSIi/LigA==", "requires": { - "denque": "^2.0.1", + "denque": "^2.1.0", "generate-function": "^2.3.1", "iconv-lite": "^0.6.3", - "long": "^4.0.0", - "lru-cache": "^6.0.0", - "named-placeholders": "^1.1.2", + "long": "^5.2.1", + "lru-cache": "^7.14.1", + "named-placeholders": "^1.1.3", "seq-queue": "^0.0.5", "sqlstring": "^2.3.2" }, @@ -16042,26 +16046,25 @@ } }, "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "requires": { - "yallist": "^4.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==" } } }, "named-placeholders": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/named-placeholders/-/named-placeholders-1.1.2.tgz", - "integrity": "sha512-wiFWqxoLL3PGVReSZpjLVxyJ1bRqe+KKJVbr4hGs1KWfTZTQyezHFBbuKj9hsizHyGV2ne7EMjHdxEGAybD5SA==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/named-placeholders/-/named-placeholders-1.1.3.tgz", + "integrity": "sha512-eLoBxg6wE/rZkJPhU/xRX1WTpkFEwDJEN96oxFrTsqBdbT5ec295Q+CoHrL9IT0DipqKhmGcaZmwOt8OON5x1w==", "requires": { - "lru-cache": "^4.1.3" + "lru-cache": "^7.14.1" + }, + "dependencies": { + "lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==" + } } }, "napi-build-utils": { @@ -16737,7 +16740,8 @@ "pseudomap": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", + "dev": true }, "psl": { "version": "1.4.0", @@ -18034,7 +18038,8 @@ "yallist": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true }, "yaml": { "version": "2.1.1", diff --git a/package.json b/package.json index 64c36c0e3..30f1957dd 100644 --- a/package.json +++ b/package.json @@ -31,7 +31,7 @@ "lokijs": "^1.5.6", "morgan": "^1.9.1", "multistream": "^2.1.1", - "mysql2": "^2.1.0", + "mysql2": "^3.2.0", "rimraf": "^3.0.2", "sequelize": "^6.3.0", "stoppable": "^1.1.0", From 38764d524132a7de6177e62806c772598c949517 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 20 Mar 2023 10:01:37 +0800 Subject: [PATCH 035/297] Bump @types/vscode from 1.74.0 to 1.76.0 (#1844) Bumps [@types/vscode](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/vscode) from 1.74.0 to 1.76.0. - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/vscode) --- updated-dependencies: - dependency-name: "@types/vscode" dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 1b9d38b2e..f97627433 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1433,9 +1433,9 @@ "dev": true }, "node_modules/@types/vscode": { - "version": "1.74.0", - "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.74.0.tgz", - "integrity": "sha512-LyeCIU3jb9d38w0MXFwta9r0Jx23ugujkAxdwLTNCyspdZTKUc43t7ppPbCiPoQ/Ivd/pnDFZrb4hWd45wrsgA==", + "version": "1.76.0", + "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.76.0.tgz", + "integrity": "sha512-CQcY3+Fe5hNewHnOEAVYj4dd1do/QHliXaknAEYSXx2KEHUzFibDZSKptCon+HPgK55xx20pR+PBJjf0MomnBA==", "dev": true }, "node_modules/@types/xml2js": { @@ -11351,9 +11351,9 @@ "dev": true }, "@types/vscode": { - "version": "1.74.0", - "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.74.0.tgz", - "integrity": "sha512-LyeCIU3jb9d38w0MXFwta9r0Jx23ugujkAxdwLTNCyspdZTKUc43t7ppPbCiPoQ/Ivd/pnDFZrb4hWd45wrsgA==", + "version": "1.76.0", + "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.76.0.tgz", + "integrity": "sha512-CQcY3+Fe5hNewHnOEAVYj4dd1do/QHliXaknAEYSXx2KEHUzFibDZSKptCon+HPgK55xx20pR+PBJjf0MomnBA==", "dev": true }, "@types/xml2js": { From 184557b48f1ff6f276bf53f07e7d54c2d0254f5b Mon Sep 17 00:00:00 2001 From: EmmaZhu Date: Thu, 15 Sep 2022 03:48:07 +0000 Subject: [PATCH 036/297] Update swagger spec to 2021-10-04 --- ChangeLog.md | 4 + src/blob/BlobRequestListenerFactory.ts | 3 +- src/blob/generated/Context.ts | 6 +- .../generated/ExpressMiddlewareFactory.ts | 26 +- src/blob/generated/ExpressRequestAdapter.ts | 4 +- src/blob/generated/ExpressResponseAdapter.ts | 6 +- src/blob/generated/IResponse.ts | 2 +- src/blob/generated/MiddlewareFactory.ts | 4 +- src/blob/generated/artifacts/mappers.ts | 3306 ++-- src/blob/generated/artifacts/models.ts | 4461 ++++-- src/blob/generated/artifacts/operation.ts | 21 +- src/blob/generated/artifacts/parameters.ts | 651 +- .../generated/artifacts/specifications.ts | 1273 +- .../generated/errors/DeserializationError.ts | 2 +- src/blob/generated/errors/MiddlewareError.ts | 2 +- .../errors/OperationMismatchError.ts | 2 +- .../errors/UnsupportedRequestError.ts | 2 +- .../generated/handlers/IAppendBlobHandler.ts | 5 +- src/blob/generated/handlers/IBlobHandler.ts | 15 +- .../generated/handlers/IBlockBlobHandler.ts | 5 +- .../generated/handlers/IContainerHandler.ts | 12 +- .../generated/handlers/IDirectoryHandler.ts | 21 - src/blob/generated/handlers/IHandlers.ts | 14 +- .../generated/handlers/IPageBlobHandler.ts | 6 +- .../generated/handlers/IServiceHandler.ts | 6 +- src/blob/generated/handlers/handlerMappers.ts | 155 +- .../middleware/HandlerMiddlewareFactory.ts | 16 +- .../middleware/deserializer.middleware.ts | 18 +- .../middleware/dispatch.middleware.ts | 20 +- .../generated/middleware/end.middleware.ts | 6 +- .../generated/middleware/error.middleware.ts | 12 +- .../middleware/serializer.middleware.ts | 16 +- src/blob/generated/utils/serializer.ts | 16 +- src/blob/generated/utils/utils.ts | 2 +- src/blob/generated/utils/xml.ts | 2 +- src/blob/handlers/AppendBlobHandler.ts | 6 + src/blob/handlers/BlobBatchHandler.ts | 3 +- src/blob/handlers/BlobHandler.ts | 73 +- src/blob/handlers/BlockBlobHandler.ts | 11 +- src/blob/handlers/ContainerHandler.ts | 29 +- src/blob/handlers/PageBlobHandler.ts | 3 +- src/blob/handlers/ServiceHandler.ts | 8 + src/blob/persistence/IBlobMetadataStore.ts | 30 +- src/blob/persistence/LokiBlobMetadataStore.ts | 26 +- src/blob/persistence/SqlBlobMetadataStore.ts | 22 +- swagger/blob-storage-2021-10-04.json | 12699 ++++++++++++++++ swagger/blob.md | 41 +- tests/blob/handlers/AppendBlobHandler.test.ts | 2 +- 48 files changed, 19685 insertions(+), 3390 deletions(-) delete mode 100644 src/blob/generated/handlers/IDirectoryHandler.ts create mode 100644 swagger/blob-storage-2021-10-04.json diff --git a/ChangeLog.md b/ChangeLog.md index e7e0442f3..f25d71ccd 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -11,6 +11,10 @@ General: - Typescript upgraded from 4.2.4 to 4.9.5. - Migrated test pipeline from Node.js 10/12 to Node.js 14/16/18. +Blob: + +- Upgraded swagger spec to API version 2021-10-04. + Table: - Fixed issue for querying on identifiers starting with underscore. diff --git a/src/blob/BlobRequestListenerFactory.ts b/src/blob/BlobRequestListenerFactory.ts index 8618d4ed3..97bd2036e 100644 --- a/src/blob/BlobRequestListenerFactory.ts +++ b/src/blob/BlobRequestListenerFactory.ts @@ -113,8 +113,7 @@ export default class BlobRequestListenerFactory this.extentStore, logger, loose - ), - directoryHandler: {} as any + ) }; // CORS request handling, preflight request and the corresponding actual request diff --git a/src/blob/generated/Context.ts b/src/blob/generated/Context.ts index af180ed54..243763cfd 100644 --- a/src/blob/generated/Context.ts +++ b/src/blob/generated/Context.ts @@ -1,6 +1,6 @@ -import Operation from "./artifacts/operation"; -import IRequest from "./IRequest"; -import IResponse from "./IResponse"; +import Operation from './artifacts/operation'; +import IRequest from './IRequest'; +import IResponse from './IResponse'; export interface IHandlerParameters { [key: string]: any; diff --git a/src/blob/generated/ExpressMiddlewareFactory.ts b/src/blob/generated/ExpressMiddlewareFactory.ts index d92c5ee42..8ece08df0 100644 --- a/src/blob/generated/ExpressMiddlewareFactory.ts +++ b/src/blob/generated/ExpressMiddlewareFactory.ts @@ -1,17 +1,17 @@ -import { ErrorRequestHandler, NextFunction, Request, RequestHandler, Response } from "express"; +import { ErrorRequestHandler, NextFunction, Request, RequestHandler, Response } from 'express'; -import Context from "./Context"; -import ExpressRequestAdapter from "./ExpressRequestAdapter"; -import ExpressResponseAdapter from "./ExpressResponseAdapter"; -import IHandlers from "./handlers/IHandlers"; -import deserializerMiddleware from "./middleware/deserializer.middleware"; -import dispatchMiddleware from "./middleware/dispatch.middleware"; -import endMiddleware from "./middleware/end.middleware"; -import errorMiddleware from "./middleware/error.middleware"; -import HandlerMiddlewareFactory from "./middleware/HandlerMiddlewareFactory"; -import serializerMiddleware from "./middleware/serializer.middleware"; -import MiddlewareFactory from "./MiddlewareFactory"; -import ILogger from "./utils/ILogger"; +import Context from './Context'; +import ExpressRequestAdapter from './ExpressRequestAdapter'; +import ExpressResponseAdapter from './ExpressResponseAdapter'; +import IHandlers from './handlers/IHandlers'; +import deserializerMiddleware from './middleware/deserializer.middleware'; +import dispatchMiddleware from './middleware/dispatch.middleware'; +import endMiddleware from './middleware/end.middleware'; +import errorMiddleware from './middleware/error.middleware'; +import HandlerMiddlewareFactory from './middleware/HandlerMiddlewareFactory'; +import serializerMiddleware from './middleware/serializer.middleware'; +import MiddlewareFactory from './MiddlewareFactory'; +import ILogger from './utils/ILogger'; /** * ExpressMiddlewareFactory will generate Express compatible middleware according to swagger definitions. diff --git a/src/blob/generated/ExpressRequestAdapter.ts b/src/blob/generated/ExpressRequestAdapter.ts index c37abcb31..75861cb5a 100644 --- a/src/blob/generated/ExpressRequestAdapter.ts +++ b/src/blob/generated/ExpressRequestAdapter.ts @@ -1,6 +1,6 @@ -import { Request } from "express"; +import { Request } from 'express'; -import IRequest, { HttpMethod } from "./IRequest"; +import IRequest, { HttpMethod } from './IRequest'; export default class ExpressRequestAdapter implements IRequest { public constructor(private readonly req: Request) {} diff --git a/src/blob/generated/ExpressResponseAdapter.ts b/src/blob/generated/ExpressResponseAdapter.ts index fd9bece7d..01a12bc23 100644 --- a/src/blob/generated/ExpressResponseAdapter.ts +++ b/src/blob/generated/ExpressResponseAdapter.ts @@ -1,7 +1,7 @@ -import { Response } from "express"; -import { OutgoingHttpHeaders } from "http"; +import { Response } from 'express'; +import { OutgoingHttpHeaders } from 'http'; -import IResponse from "./IResponse"; +import IResponse from './IResponse'; export default class ExpressResponseAdapter implements IResponse { public constructor(private readonly res: Response) {} diff --git a/src/blob/generated/IResponse.ts b/src/blob/generated/IResponse.ts index 71e5df921..0998329de 100644 --- a/src/blob/generated/IResponse.ts +++ b/src/blob/generated/IResponse.ts @@ -1,4 +1,4 @@ -import { OutgoingHttpHeaders } from "http"; +import { OutgoingHttpHeaders } from 'http'; export default interface IResponse { setStatusCode(code: number): IResponse; diff --git a/src/blob/generated/MiddlewareFactory.ts b/src/blob/generated/MiddlewareFactory.ts index 8883be2e7..048a63f0e 100644 --- a/src/blob/generated/MiddlewareFactory.ts +++ b/src/blob/generated/MiddlewareFactory.ts @@ -1,5 +1,5 @@ -import IHandlers from "./handlers/IHandlers"; -import ILogger from "./utils/ILogger"; +import IHandlers from './handlers/IHandlers'; +import ILogger from './utils/ILogger'; export type Callback = (...args: any[]) => any; export type MiddlewareTypes = Callback; diff --git a/src/blob/generated/artifacts/mappers.ts b/src/blob/generated/artifacts/mappers.ts index 5a338e647..ffd7cd416 100644 --- a/src/blob/generated/artifacts/mappers.ts +++ b/src/blob/generated/artifacts/mappers.ts @@ -7,7 +7,7 @@ */ // tslint:disable:object-literal-sort-keys -import * as msRest from "@azure/ms-rest-js"; +import * as msRest from '@azure/ms-rest-js'; export const KeyInfo: msRest.CompositeMapper = { serializedName: "KeyInfo", @@ -118,48 +118,6 @@ export const StorageError: msRest.CompositeMapper = { } }; -export const DataLakeStorageErrorError: msRest.CompositeMapper = { - serializedName: "DataLakeStorageError_error", - type: { - name: "Composite", - className: "DataLakeStorageErrorError", - modelProperties: { - code: { - xmlName: "Code", - serializedName: "Code", - type: { - name: "String" - } - }, - message: { - xmlName: "Message", - serializedName: "Message", - type: { - name: "String" - } - } - } - } -}; - -export const DataLakeStorageError: msRest.CompositeMapper = { - serializedName: "DataLakeStorageError", - type: { - name: "Composite", - className: "DataLakeStorageError", - modelProperties: { - error: { - xmlName: "error", - serializedName: "error", - type: { - name: "Composite", - className: "DataLakeStorageErrorError" - } - } - } - } -}; - export const AccessPolicy: msRest.CompositeMapper = { serializedName: "AccessPolicy", type: { @@ -182,7 +140,6 @@ export const AccessPolicy: msRest.CompositeMapper = { }, permission: { xmlName: "Permission", - required: true, serializedName: "Permission", type: { name: "String" @@ -192,12 +149,12 @@ export const AccessPolicy: msRest.CompositeMapper = { } }; -export const BlobProperties: msRest.CompositeMapper = { +export const BlobPropertiesInternal: msRest.CompositeMapper = { xmlName: "Properties", - serializedName: "BlobProperties", + serializedName: "BlobPropertiesInternal", type: { name: "Composite", - className: "BlobProperties", + className: "BlobPropertiesInternal", modelProperties: { creationTime: { xmlName: "Creation-Time", @@ -437,12 +394,80 @@ export const BlobProperties: msRest.CompositeMapper = { name: "String" } }, + encryptionScope: { + xmlName: "EncryptionScope", + serializedName: "EncryptionScope", + type: { + name: "String" + } + }, accessTierChangeTime: { xmlName: "AccessTierChangeTime", serializedName: "AccessTierChangeTime", type: { name: "DateTimeRfc1123" } + }, + tagCount: { + xmlName: "TagCount", + serializedName: "TagCount", + type: { + name: "Number" + } + }, + expiresOn: { + xmlName: "Expiry-Time", + serializedName: "Expiry-Time", + type: { + name: "DateTimeRfc1123" + } + }, + isSealed: { + xmlName: "Sealed", + serializedName: "Sealed", + type: { + name: "Boolean" + } + }, + rehydratePriority: { + xmlName: "RehydratePriority", + serializedName: "RehydratePriority", + type: { + name: "String" + } + }, + lastAccessedOn: { + xmlName: "LastAccessTime", + serializedName: "LastAccessTime", + type: { + name: "DateTimeRfc1123" + } + }, + immutabilityPolicyExpiresOn: { + xmlName: "ImmutabilityPolicyUntilDate", + serializedName: "ImmutabilityPolicyUntilDate", + type: { + name: "DateTimeRfc1123" + } + }, + immutabilityPolicyMode: { + xmlName: "ImmutabilityPolicyMode", + serializedName: "ImmutabilityPolicyMode", + type: { + name: "Enum", + allowedValues: [ + "Mutable", + "Unlocked", + "Locked" + ] + } + }, + legalHold: { + xmlName: "LegalHold", + serializedName: "LegalHold", + type: { + name: "Boolean" + } } } } @@ -472,12 +497,66 @@ export const BlobMetadata: msRest.CompositeMapper = { } }; -export const BlobItem: msRest.CompositeMapper = { +export const BlobTag: msRest.CompositeMapper = { + xmlName: "Tag", + serializedName: "BlobTag", + type: { + name: "Composite", + className: "BlobTag", + modelProperties: { + key: { + xmlName: "Key", + required: true, + serializedName: "Key", + type: { + name: "String" + } + }, + value: { + xmlName: "Value", + required: true, + serializedName: "Value", + type: { + name: "String" + } + } + } + } +}; + +export const BlobTags: msRest.CompositeMapper = { + xmlName: "Tags", + serializedName: "BlobTags", + type: { + name: "Composite", + className: "BlobTags", + modelProperties: { + blobTagSet: { + xmlIsWrapped: true, + xmlName: "TagSet", + xmlElementName: "Tag", + required: true, + serializedName: "BlobTagSet", + type: { + name: "Sequence", + element: { + type: { + name: "Composite", + className: "BlobTag" + } + } + } + } + } + } +}; + +export const BlobItemInternal: msRest.CompositeMapper = { xmlName: "Blob", - serializedName: "BlobItem", + serializedName: "BlobItemInternal", type: { name: "Composite", - className: "BlobItem", + className: "BlobItemInternal", modelProperties: { name: { xmlName: "Name", @@ -501,13 +580,27 @@ export const BlobItem: msRest.CompositeMapper = { name: "String" } }, + versionId: { + xmlName: "VersionId", + serializedName: "VersionId", + type: { + name: "String" + } + }, + isCurrentVersion: { + xmlName: "IsCurrentVersion", + serializedName: "IsCurrentVersion", + type: { + name: "Boolean" + } + }, properties: { xmlName: "Properties", required: true, serializedName: "Properties", type: { name: "Composite", - className: "BlobProperties" + className: "BlobPropertiesInternal" } }, metadata: { @@ -522,6 +615,33 @@ export const BlobItem: msRest.CompositeMapper = { } } } + }, + blobTags: { + xmlName: "Tags", + serializedName: "BlobTags", + type: { + name: "Composite", + className: "BlobTags" + } + }, + objectReplicationMetadata: { + xmlName: "OrMetadata", + serializedName: "ObjectReplicationMetadata", + type: { + name: "Dictionary", + value: { + type: { + name: "String" + } + } + } + }, + hasVersionsOnly: { + xmlName: "HasVersionsOnly", + serializedName: "HasVersionsOnly", + type: { + name: "Boolean" + } } } } @@ -544,7 +664,7 @@ export const BlobFlatListSegment: msRest.CompositeMapper = { element: { type: { name: "Composite", - className: "BlobItem" + className: "BlobItemInternal" } } } @@ -599,13 +719,6 @@ export const ListBlobsFlatSegmentResponse: msRest.CompositeMapper = { name: "Number" } }, - delimiter: { - xmlName: "Delimiter", - serializedName: "Delimiter", - type: { - name: "String" - } - }, segment: { xmlName: "Blobs", required: true, @@ -675,7 +788,7 @@ export const BlobHierarchyListSegment: msRest.CompositeMapper = { element: { type: { name: "Composite", - className: "BlobItem" + className: "BlobItemInternal" } } } @@ -757,6 +870,31 @@ export const ListBlobsHierarchySegmentResponse: msRest.CompositeMapper = { } }; +export const BlobName: msRest.CompositeMapper = { + serializedName: "BlobName", + type: { + name: "Composite", + className: "BlobName", + modelProperties: { + encoded: { + xmlIsAttribute: true, + xmlName: "Encoded", + serializedName: "Encoded", + type: { + name: "Boolean" + } + }, + content: { + xmlName: "content", + serializedName: "content", + type: { + name: "String" + } + } + } + } +}; + export const Block: msRest.CompositeMapper = { serializedName: "Block", type: { @@ -951,6 +1089,41 @@ export const ContainerProperties: msRest.CompositeMapper = { type: { name: "Boolean" } + }, + defaultEncryptionScope: { + xmlName: "DefaultEncryptionScope", + serializedName: "DefaultEncryptionScope", + type: { + name: "String" + } + }, + preventEncryptionScopeOverride: { + xmlName: "DenyEncryptionScopeOverride", + serializedName: "DenyEncryptionScopeOverride", + type: { + name: "Boolean" + } + }, + deletedTime: { + xmlName: "DeletedTime", + serializedName: "DeletedTime", + type: { + name: "DateTimeRfc1123" + } + }, + remainingRetentionDays: { + xmlName: "RemainingRetentionDays", + serializedName: "RemainingRetentionDays", + type: { + name: "Number" + } + }, + isImmutableStorageWithVersioningEnabled: { + xmlName: "ImmutableStorageWithVersioningEnabled", + serializedName: "ImmutableStorageWithVersioningEnabled", + type: { + name: "Boolean" + } } } } @@ -971,6 +1144,20 @@ export const ContainerItem: msRest.CompositeMapper = { name: "String" } }, + deleted: { + xmlName: "Deleted", + serializedName: "Deleted", + type: { + name: "Boolean" + } + }, + version: { + xmlName: "Version", + serializedName: "Version", + type: { + name: "String" + } + }, properties: { xmlName: "Properties", required: true, @@ -996,62 +1183,60 @@ export const ContainerItem: msRest.CompositeMapper = { } }; -export const ListContainersSegmentResponse: msRest.CompositeMapper = { - xmlName: "EnumerationResults", - serializedName: "ListContainersSegmentResponse", +export const DelimitedTextConfiguration: msRest.CompositeMapper = { + serializedName: "DelimitedTextConfiguration", type: { name: "Composite", - className: "ListContainersSegmentResponse", + className: "DelimitedTextConfiguration", modelProperties: { - serviceEndpoint: { - xmlIsAttribute: true, - xmlName: "ServiceEndpoint", - required: true, - serializedName: "ServiceEndpoint", + columnSeparator: { + xmlName: "ColumnSeparator", + serializedName: "ColumnSeparator", type: { name: "String" } }, - prefix: { - xmlName: "Prefix", - serializedName: "Prefix", + fieldQuote: { + xmlName: "FieldQuote", + serializedName: "FieldQuote", type: { name: "String" } }, - marker: { - xmlName: "Marker", - serializedName: "Marker", + recordSeparator: { + xmlName: "RecordSeparator", + serializedName: "RecordSeparator", type: { name: "String" } }, - maxResults: { - xmlName: "MaxResults", - serializedName: "MaxResults", + escapeChar: { + xmlName: "EscapeChar", + serializedName: "EscapeChar", type: { - name: "Number" + name: "String" } }, - containerItems: { - xmlIsWrapped: true, - xmlName: "Containers", - xmlElementName: "Container", - required: true, - serializedName: "ContainerItems", + headersPresent: { + xmlName: "HasHeaders", + serializedName: "HeadersPresent", type: { - name: "Sequence", - element: { - type: { - name: "Composite", - className: "ContainerItem" - } - } + name: "Boolean" } - }, - nextMarker: { - xmlName: "NextMarker", - serializedName: "NextMarker", + } + } + } +}; + +export const JsonTextConfiguration: msRest.CompositeMapper = { + serializedName: "JsonTextConfiguration", + type: { + name: "Composite", + className: "JsonTextConfiguration", + modelProperties: { + recordSeparator: { + xmlName: "RecordSeparator", + serializedName: "RecordSeparator", type: { name: "String" } @@ -1060,30 +1245,161 @@ export const ListContainersSegmentResponse: msRest.CompositeMapper = { } }; -export const CorsRule: msRest.CompositeMapper = { - serializedName: "CorsRule", +export const ArrowField: msRest.CompositeMapper = { + xmlName: "Field", + serializedName: "ArrowField", type: { name: "Composite", - className: "CorsRule", + className: "ArrowField", modelProperties: { - allowedOrigins: { - xmlName: "AllowedOrigins", + type: { + xmlName: "Type", required: true, - serializedName: "AllowedOrigins", + serializedName: "Type", type: { name: "String" } }, - allowedMethods: { - xmlName: "AllowedMethods", - required: true, - serializedName: "AllowedMethods", + name: { + xmlName: "Name", + serializedName: "Name", type: { name: "String" } }, - allowedHeaders: { - xmlName: "AllowedHeaders", + precision: { + xmlName: "Precision", + serializedName: "Precision", + type: { + name: "Number" + } + }, + scale: { + xmlName: "Scale", + serializedName: "Scale", + type: { + name: "Number" + } + } + } + } +}; + +export const ArrowConfiguration: msRest.CompositeMapper = { + serializedName: "ArrowConfiguration", + type: { + name: "Composite", + className: "ArrowConfiguration", + modelProperties: { + schema: { + xmlIsWrapped: true, + xmlName: "Schema", + xmlElementName: "Field", + required: true, + serializedName: "Schema", + type: { + name: "Sequence", + element: { + type: { + name: "Composite", + className: "ArrowField" + } + } + } + } + } + } +}; + +export const ListContainersSegmentResponse: msRest.CompositeMapper = { + xmlName: "EnumerationResults", + serializedName: "ListContainersSegmentResponse", + type: { + name: "Composite", + className: "ListContainersSegmentResponse", + modelProperties: { + serviceEndpoint: { + xmlIsAttribute: true, + xmlName: "ServiceEndpoint", + required: true, + serializedName: "ServiceEndpoint", + type: { + name: "String" + } + }, + prefix: { + xmlName: "Prefix", + serializedName: "Prefix", + type: { + name: "String" + } + }, + marker: { + xmlName: "Marker", + serializedName: "Marker", + type: { + name: "String" + } + }, + maxResults: { + xmlName: "MaxResults", + serializedName: "MaxResults", + type: { + name: "Number" + } + }, + containerItems: { + xmlIsWrapped: true, + xmlName: "Containers", + xmlElementName: "Container", + required: true, + serializedName: "ContainerItems", + type: { + name: "Sequence", + element: { + type: { + name: "Composite", + className: "ContainerItem" + } + } + } + }, + nextMarker: { + xmlName: "NextMarker", + serializedName: "NextMarker", + type: { + name: "String" + } + } + } + } +}; + +export const CorsRule: msRest.CompositeMapper = { + serializedName: "CorsRule", + type: { + name: "Composite", + className: "CorsRule", + modelProperties: { + allowedOrigins: { + xmlName: "AllowedOrigins", + required: true, + serializedName: "AllowedOrigins", + type: { + name: "String" + } + }, + allowedMethods: { + xmlName: "AllowedMethods", + required: true, + serializedName: "AllowedMethods", + type: { + name: "String" + } + }, + allowedHeaders: { + xmlName: "AllowedHeaders", + required: false, serializedName: "AllowedHeaders", type: { name: "String" @@ -1091,6 +1407,7 @@ export const CorsRule: msRest.CompositeMapper = { }, exposedHeaders: { xmlName: "ExposedHeaders", + required: false, serializedName: "ExposedHeaders", type: { name: "String" @@ -1111,6 +1428,106 @@ export const CorsRule: msRest.CompositeMapper = { } }; +export const FilterBlobItem: msRest.CompositeMapper = { + xmlName: "Blob", + serializedName: "FilterBlobItem", + type: { + name: "Composite", + className: "FilterBlobItem", + modelProperties: { + name: { + xmlName: "Name", + required: true, + serializedName: "Name", + type: { + name: "String" + } + }, + containerName: { + xmlName: "ContainerName", + required: true, + serializedName: "ContainerName", + type: { + name: "String" + } + }, + tags: { + xmlName: "Tags", + serializedName: "Tags", + type: { + name: "Composite", + className: "BlobTags" + } + }, + versionId: { + xmlName: "VersionId", + serializedName: "VersionId", + type: { + name: "String" + } + }, + isCurrentVersion: { + xmlName: "IsCurrentVersion", + serializedName: "IsCurrentVersion", + type: { + name: "Boolean" + } + } + } + } +}; + +export const FilterBlobSegment: msRest.CompositeMapper = { + xmlName: "EnumerationResults", + serializedName: "FilterBlobSegment", + type: { + name: "Composite", + className: "FilterBlobSegment", + modelProperties: { + serviceEndpoint: { + xmlIsAttribute: true, + xmlName: "ServiceEndpoint", + required: true, + serializedName: "ServiceEndpoint", + type: { + name: "String" + } + }, + where: { + xmlName: "Where", + required: true, + serializedName: "Where", + type: { + name: "String" + } + }, + blobs: { + xmlIsWrapped: true, + xmlName: "Blobs", + xmlElementName: "Blob", + required: true, + serializedName: "Blobs", + type: { + name: "Sequence", + element: { + type: { + name: "Composite", + className: "FilterBlobItem" + } + } + } + }, + nextMarker: { + xmlName: "NextMarker", + serializedName: "NextMarker", + type: { + name: "String" + } + } + } + } +}; + export const GeoReplication: msRest.CompositeMapper = { serializedName: "GeoReplication", type: { @@ -1160,6 +1577,13 @@ export const RetentionPolicy: msRest.CompositeMapper = { type: { name: "Number" } + }, + allowPermanentDelete: { + xmlName: "AllowPermanentDelete", + serializedName: "AllowPermanentDelete", + type: { + name: "Boolean" + } } } } @@ -1341,55 +1765,180 @@ export const PageList: msRest.CompositeMapper = { } } } + }, + nextMarker: { + xmlName: "NextMarker", + serializedName: "NextMarker", + type: { + name: "String" + } } } } }; -export const SignedIdentifier: msRest.CompositeMapper = { - serializedName: "SignedIdentifier", +export const QueryFormat: msRest.CompositeMapper = { + serializedName: "QueryFormat", type: { name: "Composite", - className: "SignedIdentifier", + className: "QueryFormat", modelProperties: { - id: { - xmlName: "Id", + type: { + xmlName: "Type", required: true, - serializedName: "Id", + serializedName: "Type", type: { - name: "String" + name: "Enum", + allowedValues: [ + "delimited", + "json", + "arrow", + "parquet" + ] } }, - accessPolicy: { - xmlName: "AccessPolicy", + delimitedTextConfiguration: { + xmlName: "DelimitedTextConfiguration", + serializedName: "DelimitedTextConfiguration", + type: { + name: "Composite", + className: "DelimitedTextConfiguration" + } + }, + jsonTextConfiguration: { + xmlName: "JsonTextConfiguration", + serializedName: "JsonTextConfiguration", + type: { + name: "Composite", + className: "JsonTextConfiguration" + } + }, + arrowConfiguration: { + xmlName: "ArrowConfiguration", + serializedName: "ArrowConfiguration", + type: { + name: "Composite", + className: "ArrowConfiguration" + } + }, + parquetTextConfiguration: { + xmlName: "ParquetTextConfiguration", + serializedName: "ParquetTextConfiguration", + type: { + name: "Object" + } + } + } + } +}; + +export const QuerySerialization: msRest.CompositeMapper = { + serializedName: "QuerySerialization", + type: { + name: "Composite", + className: "QuerySerialization", + modelProperties: { + format: { + xmlName: "Format", required: true, - serializedName: "AccessPolicy", + serializedName: "Format", type: { name: "Composite", - className: "AccessPolicy" + className: "QueryFormat" } } } } }; -export const StaticWebsite: msRest.CompositeMapper = { - serializedName: "StaticWebsite", +export const QueryRequest: msRest.CompositeMapper = { + serializedName: "QueryRequest", type: { name: "Composite", - className: "StaticWebsite", + className: "QueryRequest", modelProperties: { - enabled: { - xmlName: "Enabled", + queryType: { + xmlName: "QueryType", required: true, - serializedName: "Enabled", + isConstant: true, + serializedName: "QueryType", + defaultValue: 'SQL', type: { - name: "Boolean" + name: "String" } }, - indexDocument: { - xmlName: "IndexDocument", - serializedName: "IndexDocument", + expression: { + xmlName: "Expression", + required: true, + serializedName: "Expression", + type: { + name: "String" + } + }, + inputSerialization: { + xmlName: "InputSerialization", + serializedName: "InputSerialization", + type: { + name: "Composite", + className: "QuerySerialization" + } + }, + outputSerialization: { + xmlName: "OutputSerialization", + serializedName: "OutputSerialization", + type: { + name: "Composite", + className: "QuerySerialization" + } + } + } + } +}; + +export const SignedIdentifier: msRest.CompositeMapper = { + serializedName: "SignedIdentifier", + type: { + name: "Composite", + className: "SignedIdentifier", + modelProperties: { + id: { + xmlName: "Id", + required: true, + serializedName: "Id", + type: { + name: "String" + } + }, + accessPolicy: { + xmlName: "AccessPolicy", + required: true, + serializedName: "AccessPolicy", + type: { + name: "Composite", + className: "AccessPolicy" + } + } + } + } +}; + +export const StaticWebsite: msRest.CompositeMapper = { + serializedName: "StaticWebsite", + type: { + name: "Composite", + className: "StaticWebsite", + modelProperties: { + enabled: { + xmlName: "Enabled", + required: true, + serializedName: "Enabled", + type: { + name: "Boolean" + } + }, + indexDocument: { + xmlName: "IndexDocument", + serializedName: "IndexDocument", type: { name: "String" } @@ -1400,6 +1949,13 @@ export const StaticWebsite: msRest.CompositeMapper = { type: { name: "String" } + }, + defaultIndexDocumentPath: { + xmlName: "DefaultIndexDocumentPath", + serializedName: "DefaultIndexDocumentPath", + type: { + name: "String" + } } } } @@ -1495,6 +2051,28 @@ export const StorageServiceStats: msRest.CompositeMapper = { } }; +export const ContainerCpkScopeInfo: msRest.CompositeMapper = { + xmlName: "container-cpk-scope-info", + type: { + name: "Composite", + className: "ContainerCpkScopeInfo", + modelProperties: { + defaultEncryptionScope: { + xmlName: "defaultEncryptionScope", + type: { + name: "String" + } + }, + preventEncryptionScopeOverride: { + xmlName: "preventEncryptionScopeOverride", + type: { + name: "Boolean" + } + } + } + } +}; + export const LeaseAccessConditions: msRest.CompositeMapper = { xmlName: "lease-access-conditions", type: { @@ -1540,77 +2118,9 @@ export const ModifiedAccessConditions: msRest.CompositeMapper = { type: { name: "String" } - } - } - } -}; - -export const DirectoryHttpHeaders: msRest.CompositeMapper = { - xmlName: "directory-http-headers", - type: { - name: "Composite", - className: "DirectoryHttpHeaders", - modelProperties: { - cacheControl: { - xmlName: "cacheControl", - type: { - name: "String" - } - }, - contentType: { - xmlName: "contentType", - type: { - name: "String" - } - }, - contentEncoding: { - xmlName: "contentEncoding", - type: { - name: "String" - } - }, - contentLanguage: { - xmlName: "contentLanguage", - type: { - name: "String" - } - }, - contentDisposition: { - xmlName: "contentDisposition", - type: { - name: "String" - } - } - } - } -}; - -export const SourceModifiedAccessConditions: msRest.CompositeMapper = { - xmlName: "source-modified-access-conditions", - type: { - name: "Composite", - className: "SourceModifiedAccessConditions", - modelProperties: { - sourceIfModifiedSince: { - xmlName: "sourceIfModifiedSince", - type: { - name: "DateTimeRfc1123" - } - }, - sourceIfUnmodifiedSince: { - xmlName: "sourceIfUnmodifiedSince", - type: { - name: "DateTimeRfc1123" - } - }, - sourceIfMatches: { - xmlName: "sourceIfMatches", - type: { - name: "String" - } }, - sourceIfNoneMatch: { - xmlName: "sourceIfNoneMatch", + ifTags: { + xmlName: "ifTags", type: { name: "String" } @@ -1696,6 +2206,62 @@ export const BlobHTTPHeaders: msRest.CompositeMapper = { } }; +export const CpkScopeInfo: msRest.CompositeMapper = { + xmlName: "cpk-scope-info", + type: { + name: "Composite", + className: "CpkScopeInfo", + modelProperties: { + encryptionScope: { + xmlName: "encryptionScope", + type: { + name: "String" + } + } + } + } +}; + +export const SourceModifiedAccessConditions: msRest.CompositeMapper = { + xmlName: "source-modified-access-conditions", + type: { + name: "Composite", + className: "SourceModifiedAccessConditions", + modelProperties: { + sourceIfModifiedSince: { + xmlName: "sourceIfModifiedSince", + type: { + name: "DateTimeRfc1123" + } + }, + sourceIfUnmodifiedSince: { + xmlName: "sourceIfUnmodifiedSince", + type: { + name: "DateTimeRfc1123" + } + }, + sourceIfMatch: { + xmlName: "sourceIfMatch", + type: { + name: "String" + } + }, + sourceIfNoneMatch: { + xmlName: "sourceIfNoneMatch", + type: { + name: "String" + } + }, + sourceIfTags: { + xmlName: "sourceIfTags", + type: { + name: "String" + } + } + } + } +}; + export const SequenceNumberAccessConditions: msRest.CompositeMapper = { xmlName: "sequence-number-access-conditions", type: { @@ -1978,10 +2544,18 @@ export const ServiceGetAccountInfoHeaders: msRest.CompositeMapper = { allowedValues: [ "Storage", "BlobStorage", - "StorageV2" + "StorageV2", + "FileStorage", + "BlockBlobStorage" ] } }, + isHierarchicalNamespaceEnabled: { + serializedName: "x-ms-is-hns-enabled", + type: { + name: "Boolean" + } + }, errorCode: { serializedName: "x-ms-error-code", type: { @@ -1992,14 +2566,14 @@ export const ServiceGetAccountInfoHeaders: msRest.CompositeMapper = { } }; -export const ServiceGetAccountInfoWithHeadHeaders: msRest.CompositeMapper = { - serializedName: "service-getaccountinfowithhead-headers", +export const ServiceSubmitBatchHeaders: msRest.CompositeMapper = { + serializedName: "service-submitbatch-headers", type: { name: "Composite", - className: "ServiceGetAccountInfoWithHeadHeaders", + className: "ServiceSubmitBatchHeaders", modelProperties: { - clientRequestId: { - serializedName: "x-ms-client-request-id", + contentType: { + serializedName: "content-type", type: { name: "String" } @@ -2016,36 +2590,6 @@ export const ServiceGetAccountInfoWithHeadHeaders: msRest.CompositeMapper = { name: "String" } }, - date: { - serializedName: "date", - type: { - name: "DateTimeRfc1123" - } - }, - skuName: { - serializedName: "x-ms-sku-name", - type: { - name: "Enum", - allowedValues: [ - "Standard_LRS", - "Standard_GRS", - "Standard_RAGRS", - "Standard_ZRS", - "Premium_LRS" - ] - } - }, - accountKind: { - serializedName: "x-ms-account-kind", - type: { - name: "Enum", - allowedValues: [ - "Storage", - "BlobStorage", - "StorageV2" - ] - } - }, errorCode: { serializedName: "x-ms-error-code", type: { @@ -2056,14 +2600,14 @@ export const ServiceGetAccountInfoWithHeadHeaders: msRest.CompositeMapper = { } }; -export const ServiceSubmitBatchHeaders: msRest.CompositeMapper = { - serializedName: "service-submitbatch-headers", +export const ServiceFilterBlobsHeaders: msRest.CompositeMapper = { + serializedName: "service-filterblobs-headers", type: { name: "Composite", - className: "ServiceSubmitBatchHeaders", + className: "ServiceFilterBlobsHeaders", modelProperties: { - contentType: { - serializedName: "content-type", + clientRequestId: { + serializedName: "x-ms-client-request-id", type: { name: "String" } @@ -2080,6 +2624,12 @@ export const ServiceSubmitBatchHeaders: msRest.CompositeMapper = { name: "String" } }, + date: { + serializedName: "date", + type: { + name: "DateTimeRfc1123" + } + }, errorCode: { serializedName: "x-ms-error-code", type: { @@ -2247,6 +2797,24 @@ export const ContainerGetPropertiesHeaders: msRest.CompositeMapper = { name: "Boolean" } }, + defaultEncryptionScope: { + serializedName: "x-ms-default-encryption-scope", + type: { + name: "String" + } + }, + denyEncryptionScopeOverride: { + serializedName: "x-ms-deny-encryption-scope-override", + type: { + name: "Boolean" + } + }, + isImmutableStorageWithVersioningEnabled: { + serializedName: "x-ms-immutable-storage-with-versioning-enabled", + type: { + name: "Boolean" + } + }, errorCode: { serializedName: "x-ms-error-code", type: { @@ -2257,11 +2825,11 @@ export const ContainerGetPropertiesHeaders: msRest.CompositeMapper = { } }; -export const ContainerGetPropertiesWithHeadHeaders: msRest.CompositeMapper = { - serializedName: "container-getpropertieswithhead-headers", +export const ContainerGetPropertiesHeaders1: msRest.CompositeMapper = { + serializedName: "container-getproperties-headers", type: { name: "Composite", - className: "ContainerGetPropertiesWithHeadHeaders", + className: "ContainerGetPropertiesHeaders1", modelProperties: { metadata: { serializedName: "x-ms-meta", @@ -2362,13 +2930,31 @@ export const ContainerGetPropertiesWithHeadHeaders: msRest.CompositeMapper = { name: "Boolean" } }, - errorCode: { - serializedName: "x-ms-error-code", + defaultEncryptionScope: { + serializedName: "x-ms-default-encryption-scope", type: { name: "String" } - } - } + }, + denyEncryptionScopeOverride: { + serializedName: "x-ms-deny-encryption-scope-override", + type: { + name: "Boolean" + } + }, + isImmutableStorageWithVersioningEnabled: { + serializedName: "x-ms-immutable-storage-with-versioning-enabled", + type: { + name: "Boolean" + } + }, + errorCode: { + serializedName: "x-ms-error-code", + type: { + name: "String" + } + } + } } }; @@ -2574,6 +3160,86 @@ export const ContainerSetAccessPolicyHeaders: msRest.CompositeMapper = { } }; +export const ContainerRestoreHeaders: msRest.CompositeMapper = { + serializedName: "container-restore-headers", + type: { + name: "Composite", + className: "ContainerRestoreHeaders", + modelProperties: { + clientRequestId: { + serializedName: "x-ms-client-request-id", + type: { + name: "String" + } + }, + requestId: { + serializedName: "x-ms-request-id", + type: { + name: "String" + } + }, + version: { + serializedName: "x-ms-version", + type: { + name: "String" + } + }, + date: { + serializedName: "date", + type: { + name: "DateTimeRfc1123" + } + }, + errorCode: { + serializedName: "x-ms-error-code", + type: { + name: "String" + } + } + } + } +}; + +export const ContainerRenameHeaders: msRest.CompositeMapper = { + serializedName: "container-rename-headers", + type: { + name: "Composite", + className: "ContainerRenameHeaders", + modelProperties: { + clientRequestId: { + serializedName: "x-ms-client-request-id", + type: { + name: "String" + } + }, + requestId: { + serializedName: "x-ms-request-id", + type: { + name: "String" + } + }, + version: { + serializedName: "x-ms-version", + type: { + name: "String" + } + }, + date: { + serializedName: "date", + type: { + name: "DateTimeRfc1123" + } + }, + errorCode: { + serializedName: "x-ms-error-code", + type: { + name: "String" + } + } + } + } +}; + export const ContainerSubmitBatchHeaders: msRest.CompositeMapper = { serializedName: "container-submitbatch-headers", type: { @@ -2608,6 +3274,46 @@ export const ContainerSubmitBatchHeaders: msRest.CompositeMapper = { } }; +export const ContainerFilterBlobsHeaders: msRest.CompositeMapper = { + serializedName: "container-filterblobs-headers", + type: { + name: "Composite", + className: "ContainerFilterBlobsHeaders", + modelProperties: { + clientRequestId: { + serializedName: "x-ms-client-request-id", + type: { + name: "String" + } + }, + requestId: { + serializedName: "x-ms-request-id", + type: { + name: "String" + } + }, + version: { + serializedName: "x-ms-version", + type: { + name: "String" + } + }, + date: { + serializedName: "date", + type: { + name: "DateTimeRfc1123" + } + }, + errorCode: { + serializedName: "x-ms-error-code", + type: { + name: "String" + } + } + } + } +}; + export const ContainerAcquireLeaseHeaders: msRest.CompositeMapper = { serializedName: "container-acquirelease-headers", type: { @@ -3034,7 +3740,9 @@ export const ContainerGetAccountInfoHeaders: msRest.CompositeMapper = { allowedValues: [ "Storage", "BlobStorage", - "StorageV2" + "StorageV2", + "FileStorage", + "BlockBlobStorage" ] } }, @@ -3048,190 +3756,198 @@ export const ContainerGetAccountInfoHeaders: msRest.CompositeMapper = { } }; -export const ContainerGetAccountInfoWithHeadHeaders: msRest.CompositeMapper = { - serializedName: "container-getaccountinfowithhead-headers", +export const BlobDownloadHeaders: msRest.CompositeMapper = { + serializedName: "blob-download-headers", type: { name: "Composite", - className: "ContainerGetAccountInfoWithHeadHeaders", + className: "BlobDownloadHeaders", modelProperties: { - clientRequestId: { - serializedName: "x-ms-client-request-id", + lastModified: { + serializedName: "last-modified", type: { - name: "String" + name: "DateTimeRfc1123" } }, - requestId: { - serializedName: "x-ms-request-id", + metadata: { + serializedName: "x-ms-meta", type: { - name: "String" + name: "Dictionary", + value: { + type: { + name: "String" + } + } + }, + headerCollectionPrefix: "x-ms-meta-" + }, + creationTime: { + serializedName: "x-ms-creation-time", + type: { + name: "DateTimeRfc1123" } }, - version: { - serializedName: "x-ms-version", + objectReplicationPolicyId: { + serializedName: "x-ms-or-policy-id", type: { name: "String" } }, - date: { - serializedName: "date", + objectReplicationRules: { + serializedName: "x-ms-or", type: { - name: "DateTimeRfc1123" - } + name: "Dictionary", + value: { + type: { + name: "String" + } + } + }, + headerCollectionPrefix: "x-ms-or-" }, - skuName: { - serializedName: "x-ms-sku-name", + contentLength: { + serializedName: "content-length", type: { - name: "Enum", - allowedValues: [ - "Standard_LRS", - "Standard_GRS", - "Standard_RAGRS", - "Standard_ZRS", - "Premium_LRS" - ] + name: "Number" } }, - accountKind: { - serializedName: "x-ms-account-kind", + contentType: { + serializedName: "content-type", type: { - name: "Enum", - allowedValues: [ - "Storage", - "BlobStorage", - "StorageV2" - ] + name: "String" } }, - errorCode: { - serializedName: "x-ms-error-code", + contentRange: { + serializedName: "content-range", type: { name: "String" } - } - } - } -}; - -export const DirectoryCreateHeaders: msRest.CompositeMapper = { - serializedName: "directory-create-headers", - type: { - name: "Composite", - className: "DirectoryCreateHeaders", - modelProperties: { + }, eTag: { serializedName: "etag", type: { name: "String" } }, - lastModified: { - serializedName: "last-modified", + contentMD5: { + serializedName: "content-md5", type: { - name: "DateTimeRfc1123" + name: "ByteArray" } }, - clientRequestId: { - serializedName: "x-ms-client-request-id", + contentEncoding: { + serializedName: "content-encoding", type: { name: "String" } }, - requestId: { - serializedName: "x-ms-request-id", + cacheControl: { + serializedName: "cache-control", type: { name: "String" } }, - version: { - serializedName: "x-ms-version", + contentDisposition: { + serializedName: "content-disposition", type: { name: "String" } }, - contentLength: { - serializedName: "content-length", + contentLanguage: { + serializedName: "content-language", type: { - name: "Number" + name: "String" } }, - date: { - serializedName: "date", - type: { - name: "DateTimeRfc1123" - } - } - } - } -}; - -export const DirectoryRenameHeaders: msRest.CompositeMapper = { - serializedName: "directory-rename-headers", - type: { - name: "Composite", - className: "DirectoryRenameHeaders", - modelProperties: { - marker: { - serializedName: "x-ms-continuation", + blobSequenceNumber: { + serializedName: "x-ms-blob-sequence-number", type: { - name: "String" + name: "Number" } }, - eTag: { - serializedName: "etag", + blobType: { + serializedName: "x-ms-blob-type", type: { - name: "String" + name: "Enum", + allowedValues: [ + "BlockBlob", + "PageBlob", + "AppendBlob" + ] } }, - lastModified: { - serializedName: "last-modified", + copyCompletionTime: { + serializedName: "x-ms-copy-completion-time", type: { name: "DateTimeRfc1123" } }, - clientRequestId: { - serializedName: "x-ms-client-request-id", + copyStatusDescription: { + serializedName: "x-ms-copy-status-description", type: { name: "String" } }, - requestId: { - serializedName: "x-ms-request-id", + copyId: { + serializedName: "x-ms-copy-id", type: { name: "String" } }, - version: { - serializedName: "x-ms-version", + copyProgress: { + serializedName: "x-ms-copy-progress", type: { name: "String" } }, - contentLength: { - serializedName: "content-length", + copySource: { + serializedName: "x-ms-copy-source", type: { - name: "Number" + name: "String" } }, - date: { - serializedName: "date", + copyStatus: { + serializedName: "x-ms-copy-status", type: { - name: "DateTimeRfc1123" + name: "Enum", + allowedValues: [ + "pending", + "success", + "aborted", + "failed" + ] } - } - } - } -}; - -export const DirectoryDeleteHeaders: msRest.CompositeMapper = { - serializedName: "directory-delete-headers", - type: { - name: "Composite", - className: "DirectoryDeleteHeaders", - modelProperties: { - marker: { - serializedName: "x-ms-continuation", + }, + leaseDuration: { + serializedName: "x-ms-lease-duration", type: { - name: "String" + name: "Enum", + allowedValues: [ + "infinite", + "fixed" + ] + } + }, + leaseState: { + serializedName: "x-ms-lease-state", + type: { + name: "Enum", + allowedValues: [ + "available", + "leased", + "expired", + "breaking", + "broken" + ] + } + }, + leaseStatus: { + serializedName: "x-ms-lease-status", + type: { + name: "Enum", + allowedValues: [ + "locked", + "unlocked" + ] } }, clientRequestId: { @@ -3252,124 +3968,104 @@ export const DirectoryDeleteHeaders: msRest.CompositeMapper = { name: "String" } }, - date: { - serializedName: "date", + versionId: { + serializedName: "x-ms-version-id", type: { - name: "DateTimeRfc1123" + name: "String" } - } - } - } -}; - -export const DirectorySetAccessControlHeaders: msRest.CompositeMapper = { - serializedName: "directory-setaccesscontrol-headers", - type: { - name: "Composite", - className: "DirectorySetAccessControlHeaders", - modelProperties: { - date: { - serializedName: "date", + }, + isCurrentVersion: { + serializedName: "x-ms-is-current-version", type: { - name: "DateTimeRfc1123" + name: "Boolean" } }, - eTag: { - serializedName: "etag", + acceptRanges: { + serializedName: "accept-ranges", type: { name: "String" } }, - lastModified: { - serializedName: "last-modified", + date: { + serializedName: "date", type: { name: "DateTimeRfc1123" } }, - requestId: { - serializedName: "x-ms-request-id", + blobCommittedBlockCount: { + serializedName: "x-ms-blob-committed-block-count", type: { - name: "String" + name: "Number" } }, - version: { - serializedName: "x-ms-version", + isServerEncrypted: { + serializedName: "x-ms-server-encrypted", type: { - name: "String" + name: "Boolean" } }, - clientRequestId: { - serializedName: "x-ms-client-request-id", + encryptionKeySha256: { + serializedName: "x-ms-encryption-key-sha256", type: { name: "String" } - } - } - } -}; - -export const DirectoryGetAccessControlHeaders: msRest.CompositeMapper = { - serializedName: "directory-getaccesscontrol-headers", - type: { - name: "Composite", - className: "DirectoryGetAccessControlHeaders", - modelProperties: { - date: { - serializedName: "date", + }, + encryptionScope: { + serializedName: "x-ms-encryption-scope", type: { - name: "DateTimeRfc1123" + name: "String" } }, - eTag: { - serializedName: "etag", + blobContentMD5: { + serializedName: "x-ms-blob-content-md5", type: { - name: "String" + name: "ByteArray" } }, - lastModified: { - serializedName: "last-modified", + tagCount: { + serializedName: "x-ms-tag-count", type: { - name: "DateTimeRfc1123" + name: "Number" } }, - xMsOwner: { - serializedName: "x-ms-owner", + isSealed: { + serializedName: "x-ms-blob-sealed", type: { - name: "String" + name: "Boolean" } }, - xMsGroup: { - serializedName: "x-ms-group", + lastAccessed: { + serializedName: "x-ms-last-access-time", type: { - name: "String" + name: "DateTimeRfc1123" } }, - xMsPermissions: { - serializedName: "x-ms-permissions", + immutabilityPolicyExpiresOn: { + serializedName: "x-ms-immutability-policy-until-date", type: { - name: "String" + name: "DateTimeRfc1123" } }, - xMsAcl: { - serializedName: "x-ms-acl", + immutabilityPolicyMode: { + serializedName: "x-ms-immutability-policy-mode", type: { name: "String" } }, - requestId: { - serializedName: "x-ms-request-id", + legalHold: { + serializedName: "x-ms-legal-hold", type: { - name: "String" + name: "Boolean" } }, - version: { - serializedName: "x-ms-version", + contentCrc64: { + serializedName: "x-ms-content-crc64", type: { - name: "String" + name: "ByteArray" } }, - clientRequestId: { - serializedName: "x-ms-client-request-id", + errorCode: { + serializedName: "x-ms-error-code", type: { name: "String" } @@ -3378,11 +4074,11 @@ export const DirectoryGetAccessControlHeaders: msRest.CompositeMapper = { } }; -export const BlobDownloadHeaders: msRest.CompositeMapper = { - serializedName: "blob-download-headers", +export const BlobGetPropertiesHeaders: msRest.CompositeMapper = { + serializedName: "blob-getproperties-headers", type: { name: "Composite", - className: "BlobDownloadHeaders", + className: "BlobGetPropertiesHeaders", modelProperties: { lastModified: { serializedName: "last-modified", @@ -3390,6 +4086,12 @@ export const BlobDownloadHeaders: msRest.CompositeMapper = { name: "DateTimeRfc1123" } }, + creationTime: { + serializedName: "x-ms-creation-time", + type: { + name: "DateTimeRfc1123" + } + }, metadata: { serializedName: "x-ms-meta", type: { @@ -3402,71 +4104,23 @@ export const BlobDownloadHeaders: msRest.CompositeMapper = { }, headerCollectionPrefix: "x-ms-meta-" }, - creationTime: { - serializedName: "x-ms-creation-time", - type: { - name: "DateTimeRfc1123" - } - }, - contentLength: { - serializedName: "content-length", - type: { - name: "Number" - } - }, - contentType: { - serializedName: "content-type", - type: { - name: "String" - } - }, - contentRange: { - serializedName: "content-range", - type: { - name: "String" - } - }, - eTag: { - serializedName: "etag", - type: { - name: "String" - } - }, - contentMD5: { - serializedName: "content-md5", - type: { - name: "ByteArray" - } - }, - contentEncoding: { - serializedName: "content-encoding", - type: { - name: "String" - } - }, - cacheControl: { - serializedName: "cache-control", - type: { - name: "String" - } - }, - contentDisposition: { - serializedName: "content-disposition", - type: { - name: "String" - } - }, - contentLanguage: { - serializedName: "content-language", + objectReplicationPolicyId: { + serializedName: "x-ms-or-policy-id", type: { name: "String" } }, - blobSequenceNumber: { - serializedName: "x-ms-blob-sequence-number", + objectReplicationRules: { + serializedName: "x-ms-or", type: { - name: "Number" - } + name: "Dictionary", + value: { + type: { + name: "String" + } + } + }, + headerCollectionPrefix: "x-ms-or-" }, blobType: { serializedName: "x-ms-blob-type", @@ -3521,6 +4175,18 @@ export const BlobDownloadHeaders: msRest.CompositeMapper = { ] } }, + isIncrementalCopy: { + serializedName: "x-ms-incremental-copy", + type: { + name: "Boolean" + } + }, + destinationSnapshot: { + serializedName: "x-ms-copy-destination-snapshot", + type: { + name: "String" + } + }, leaseDuration: { serializedName: "x-ms-lease-duration", type: { @@ -3554,208 +4220,10 @@ export const BlobDownloadHeaders: msRest.CompositeMapper = { ] } }, - clientRequestId: { - serializedName: "x-ms-client-request-id", + contentLength: { + serializedName: "content-length", type: { - name: "String" - } - }, - requestId: { - serializedName: "x-ms-request-id", - type: { - name: "String" - } - }, - version: { - serializedName: "x-ms-version", - type: { - name: "String" - } - }, - acceptRanges: { - serializedName: "accept-ranges", - type: { - name: "String" - } - }, - date: { - serializedName: "date", - type: { - name: "DateTimeRfc1123" - } - }, - blobCommittedBlockCount: { - serializedName: "x-ms-blob-committed-block-count", - type: { - name: "Number" - } - }, - isServerEncrypted: { - serializedName: "x-ms-server-encrypted", - type: { - name: "Boolean" - } - }, - encryptionKeySha256: { - serializedName: "x-ms-encryption-key-sha256", - type: { - name: "String" - } - }, - blobContentMD5: { - serializedName: "x-ms-blob-content-md5", - type: { - name: "ByteArray" - } - }, - contentCrc64: { - serializedName: "x-ms-content-crc64", - type: { - name: "ByteArray" - } - }, - errorCode: { - serializedName: "x-ms-error-code", - type: { - name: "String" - } - } - } - } -}; - -export const BlobGetPropertiesHeaders: msRest.CompositeMapper = { - serializedName: "blob-getproperties-headers", - type: { - name: "Composite", - className: "BlobGetPropertiesHeaders", - modelProperties: { - lastModified: { - serializedName: "last-modified", - type: { - name: "DateTimeRfc1123" - } - }, - creationTime: { - serializedName: "x-ms-creation-time", - type: { - name: "DateTimeRfc1123" - } - }, - metadata: { - serializedName: "x-ms-meta", - type: { - name: "Dictionary", - value: { - type: { - name: "String" - } - } - }, - headerCollectionPrefix: "x-ms-meta-" - }, - blobType: { - serializedName: "x-ms-blob-type", - type: { - name: "Enum", - allowedValues: [ - "BlockBlob", - "PageBlob", - "AppendBlob" - ] - } - }, - copyCompletionTime: { - serializedName: "x-ms-copy-completion-time", - type: { - name: "DateTimeRfc1123" - } - }, - copyStatusDescription: { - serializedName: "x-ms-copy-status-description", - type: { - name: "String" - } - }, - copyId: { - serializedName: "x-ms-copy-id", - type: { - name: "String" - } - }, - copyProgress: { - serializedName: "x-ms-copy-progress", - type: { - name: "String" - } - }, - copySource: { - serializedName: "x-ms-copy-source", - type: { - name: "String" - } - }, - copyStatus: { - serializedName: "x-ms-copy-status", - type: { - name: "Enum", - allowedValues: [ - "pending", - "success", - "aborted", - "failed" - ] - } - }, - isIncrementalCopy: { - serializedName: "x-ms-incremental-copy", - type: { - name: "Boolean" - } - }, - destinationSnapshot: { - serializedName: "x-ms-copy-destination-snapshot", - type: { - name: "String" - } - }, - leaseDuration: { - serializedName: "x-ms-lease-duration", - type: { - name: "Enum", - allowedValues: [ - "infinite", - "fixed" - ] - } - }, - leaseState: { - serializedName: "x-ms-lease-state", - type: { - name: "Enum", - allowedValues: [ - "available", - "leased", - "expired", - "breaking", - "broken" - ] - } - }, - leaseStatus: { - serializedName: "x-ms-lease-status", - type: { - name: "Enum", - allowedValues: [ - "locked", - "unlocked" - ] - } - }, - contentLength: { - serializedName: "content-length", - type: { - name: "Number" + name: "Number" } }, contentType: { @@ -3854,6 +4322,12 @@ export const BlobGetPropertiesHeaders: msRest.CompositeMapper = { name: "String" } }, + encryptionScope: { + serializedName: "x-ms-encryption-scope", + type: { + name: "String" + } + }, accessTier: { serializedName: "x-ms-access-tier", type: { @@ -3878,6 +4352,71 @@ export const BlobGetPropertiesHeaders: msRest.CompositeMapper = { name: "DateTimeRfc1123" } }, + versionId: { + serializedName: "x-ms-version-id", + type: { + name: "String" + } + }, + isCurrentVersion: { + serializedName: "x-ms-is-current-version", + type: { + name: "Boolean" + } + }, + tagCount: { + serializedName: "x-ms-tag-count", + type: { + name: "Number" + } + }, + expiresOn: { + serializedName: "x-ms-expiry-time", + type: { + name: "DateTimeRfc1123" + } + }, + isSealed: { + serializedName: "x-ms-blob-sealed", + type: { + name: "Boolean" + } + }, + rehydratePriority: { + serializedName: "x-ms-rehydrate-priority", + type: { + name: "String" + } + }, + lastAccessed: { + serializedName: "x-ms-last-access-time", + type: { + name: "DateTimeRfc1123" + } + }, + immutabilityPolicyExpiresOn: { + serializedName: "x-ms-immutability-policy-until-date", + type: { + name: "DateTimeRfc1123" + } + }, + immutabilityPolicyMode: { + serializedName: "x-ms-immutability-policy-mode", + type: { + name: "Enum", + allowedValues: [ + "Mutable", + "Unlocked", + "Locked" + ] + } + }, + legalHold: { + serializedName: "x-ms-legal-hold", + type: { + name: "Boolean" + } + }, errorCode: { serializedName: "x-ms-error-code", type: { @@ -3928,18 +4467,12 @@ export const BlobDeleteHeaders: msRest.CompositeMapper = { } }; -export const BlobSetAccessControlHeaders: msRest.CompositeMapper = { - serializedName: "blob-setaccesscontrol-headers", +export const PageBlobCreateHeaders: msRest.CompositeMapper = { + serializedName: "pageblob-create-headers", type: { name: "Composite", - className: "BlobSetAccessControlHeaders", + className: "PageBlobCreateHeaders", modelProperties: { - date: { - serializedName: "date", - type: { - name: "DateTimeRfc1123" - } - }, eTag: { serializedName: "etag", type: { @@ -3952,6 +4485,18 @@ export const BlobSetAccessControlHeaders: msRest.CompositeMapper = { name: "DateTimeRfc1123" } }, + contentMD5: { + serializedName: "content-md5", + type: { + name: "ByteArray" + } + }, + clientRequestId: { + serializedName: "x-ms-client-request-id", + type: { + name: "String" + } + }, requestId: { serializedName: "x-ms-request-id", type: { @@ -3964,8 +4509,38 @@ export const BlobSetAccessControlHeaders: msRest.CompositeMapper = { name: "String" } }, - clientRequestId: { - serializedName: "x-ms-client-request-id", + versionId: { + serializedName: "x-ms-version-id", + type: { + name: "String" + } + }, + date: { + serializedName: "date", + type: { + name: "DateTimeRfc1123" + } + }, + isServerEncrypted: { + serializedName: "x-ms-request-server-encrypted", + type: { + name: "Boolean" + } + }, + encryptionKeySha256: { + serializedName: "x-ms-encryption-key-sha256", + type: { + name: "String" + } + }, + encryptionScope: { + serializedName: "x-ms-encryption-scope", + type: { + name: "String" + } + }, + errorCode: { + serializedName: "x-ms-error-code", type: { name: "String" } @@ -3974,18 +4549,12 @@ export const BlobSetAccessControlHeaders: msRest.CompositeMapper = { } }; -export const BlobGetAccessControlHeaders: msRest.CompositeMapper = { - serializedName: "blob-getaccesscontrol-headers", +export const AppendBlobCreateHeaders: msRest.CompositeMapper = { + serializedName: "appendblob-create-headers", type: { name: "Composite", - className: "BlobGetAccessControlHeaders", + className: "AppendBlobCreateHeaders", modelProperties: { - date: { - serializedName: "date", - type: { - name: "DateTimeRfc1123" - } - }, eTag: { serializedName: "etag", type: { @@ -3998,44 +4567,62 @@ export const BlobGetAccessControlHeaders: msRest.CompositeMapper = { name: "DateTimeRfc1123" } }, - xMsOwner: { - serializedName: "x-ms-owner", + contentMD5: { + serializedName: "content-md5", + type: { + name: "ByteArray" + } + }, + clientRequestId: { + serializedName: "x-ms-client-request-id", type: { name: "String" } }, - xMsGroup: { - serializedName: "x-ms-group", + requestId: { + serializedName: "x-ms-request-id", type: { name: "String" } }, - xMsPermissions: { - serializedName: "x-ms-permissions", + version: { + serializedName: "x-ms-version", type: { name: "String" } }, - xMsAcl: { - serializedName: "x-ms-acl", + versionId: { + serializedName: "x-ms-version-id", type: { name: "String" } }, - requestId: { - serializedName: "x-ms-request-id", + date: { + serializedName: "date", + type: { + name: "DateTimeRfc1123" + } + }, + isServerEncrypted: { + serializedName: "x-ms-request-server-encrypted", + type: { + name: "Boolean" + } + }, + encryptionKeySha256: { + serializedName: "x-ms-encryption-key-sha256", type: { name: "String" } }, - version: { - serializedName: "x-ms-version", + encryptionScope: { + serializedName: "x-ms-encryption-scope", type: { name: "String" } }, - clientRequestId: { - serializedName: "x-ms-client-request-id", + errorCode: { + serializedName: "x-ms-error-code", type: { name: "String" } @@ -4044,11 +4631,11 @@ export const BlobGetAccessControlHeaders: msRest.CompositeMapper = { } }; -export const BlobRenameHeaders: msRest.CompositeMapper = { - serializedName: "blob-rename-headers", +export const BlockBlobUploadHeaders: msRest.CompositeMapper = { + serializedName: "blockblob-upload-headers", type: { name: "Composite", - className: "BlobRenameHeaders", + className: "BlockBlobUploadHeaders", modelProperties: { eTag: { serializedName: "etag", @@ -4062,6 +4649,12 @@ export const BlobRenameHeaders: msRest.CompositeMapper = { name: "DateTimeRfc1123" } }, + contentMD5: { + serializedName: "content-md5", + type: { + name: "ByteArray" + } + }, clientRequestId: { serializedName: "x-ms-client-request-id", type: { @@ -4080,10 +4673,10 @@ export const BlobRenameHeaders: msRest.CompositeMapper = { name: "String" } }, - contentLength: { - serializedName: "content-length", + versionId: { + serializedName: "x-ms-version-id", type: { - name: "Number" + name: "String" } }, date: { @@ -4091,16 +4684,40 @@ export const BlobRenameHeaders: msRest.CompositeMapper = { type: { name: "DateTimeRfc1123" } + }, + isServerEncrypted: { + serializedName: "x-ms-request-server-encrypted", + type: { + name: "Boolean" + } + }, + encryptionKeySha256: { + serializedName: "x-ms-encryption-key-sha256", + type: { + name: "String" + } + }, + encryptionScope: { + serializedName: "x-ms-encryption-scope", + type: { + name: "String" + } + }, + errorCode: { + serializedName: "x-ms-error-code", + type: { + name: "String" + } } } } }; -export const PageBlobCreateHeaders: msRest.CompositeMapper = { - serializedName: "pageblob-create-headers", +export const BlockBlobPutBlobFromUrlHeaders: msRest.CompositeMapper = { + serializedName: "blockblob-putblobfromurl-headers", type: { name: "Composite", - className: "PageBlobCreateHeaders", + className: "BlockBlobPutBlobFromUrlHeaders", modelProperties: { eTag: { serializedName: "etag", @@ -4138,6 +4755,12 @@ export const PageBlobCreateHeaders: msRest.CompositeMapper = { name: "String" } }, + versionId: { + serializedName: "x-ms-version-id", + type: { + name: "String" + } + }, date: { serializedName: "date", type: { @@ -4156,6 +4779,12 @@ export const PageBlobCreateHeaders: msRest.CompositeMapper = { name: "String" } }, + encryptionScope: { + serializedName: "x-ms-encryption-scope", + type: { + name: "String" + } + }, errorCode: { serializedName: "x-ms-error-code", type: { @@ -4166,11 +4795,51 @@ export const PageBlobCreateHeaders: msRest.CompositeMapper = { } }; -export const AppendBlobCreateHeaders: msRest.CompositeMapper = { - serializedName: "appendblob-create-headers", +export const BlobUndeleteHeaders: msRest.CompositeMapper = { + serializedName: "blob-undelete-headers", type: { name: "Composite", - className: "AppendBlobCreateHeaders", + className: "BlobUndeleteHeaders", + modelProperties: { + clientRequestId: { + serializedName: "x-ms-client-request-id", + type: { + name: "String" + } + }, + requestId: { + serializedName: "x-ms-request-id", + type: { + name: "String" + } + }, + version: { + serializedName: "x-ms-version", + type: { + name: "String" + } + }, + date: { + serializedName: "date", + type: { + name: "DateTimeRfc1123" + } + }, + errorCode: { + serializedName: "x-ms-error-code", + type: { + name: "String" + } + } + } + } +}; + +export const BlobSetExpiryHeaders: msRest.CompositeMapper = { + serializedName: "blob-setexpiry-headers", + type: { + name: "Composite", + className: "BlobSetExpiryHeaders", modelProperties: { eTag: { serializedName: "etag", @@ -4184,12 +4853,6 @@ export const AppendBlobCreateHeaders: msRest.CompositeMapper = { name: "DateTimeRfc1123" } }, - contentMD5: { - serializedName: "content-md5", - type: { - name: "ByteArray" - } - }, clientRequestId: { serializedName: "x-ms-client-request-id", type: { @@ -4214,18 +4877,6 @@ export const AppendBlobCreateHeaders: msRest.CompositeMapper = { name: "DateTimeRfc1123" } }, - isServerEncrypted: { - serializedName: "x-ms-request-server-encrypted", - type: { - name: "Boolean" - } - }, - encryptionKeySha256: { - serializedName: "x-ms-encryption-key-sha256", - type: { - name: "String" - } - }, errorCode: { serializedName: "x-ms-error-code", type: { @@ -4236,11 +4887,11 @@ export const AppendBlobCreateHeaders: msRest.CompositeMapper = { } }; -export const BlockBlobUploadHeaders: msRest.CompositeMapper = { - serializedName: "blockblob-upload-headers", +export const BlobSetHTTPHeadersHeaders: msRest.CompositeMapper = { + serializedName: "blob-sethttpheaders-headers", type: { name: "Composite", - className: "BlockBlobUploadHeaders", + className: "BlobSetHTTPHeadersHeaders", modelProperties: { eTag: { serializedName: "etag", @@ -4254,10 +4905,10 @@ export const BlockBlobUploadHeaders: msRest.CompositeMapper = { name: "DateTimeRfc1123" } }, - contentMD5: { - serializedName: "content-md5", + blobSequenceNumber: { + serializedName: "x-ms-blob-sequence-number", type: { - name: "ByteArray" + name: "Number" } }, clientRequestId: { @@ -4284,18 +4935,6 @@ export const BlockBlobUploadHeaders: msRest.CompositeMapper = { name: "DateTimeRfc1123" } }, - isServerEncrypted: { - serializedName: "x-ms-request-server-encrypted", - type: { - name: "Boolean" - } - }, - encryptionKeySha256: { - serializedName: "x-ms-encryption-key-sha256", - type: { - name: "String" - } - }, errorCode: { serializedName: "x-ms-error-code", type: { @@ -4306,11 +4945,11 @@ export const BlockBlobUploadHeaders: msRest.CompositeMapper = { } }; -export const BlobUndeleteHeaders: msRest.CompositeMapper = { - serializedName: "blob-undelete-headers", +export const BlobSetImmutabilityPolicyHeaders: msRest.CompositeMapper = { + serializedName: "blob-setimmutabilitypolicy-headers", type: { name: "Composite", - className: "BlobUndeleteHeaders", + className: "BlobSetImmutabilityPolicyHeaders", modelProperties: { clientRequestId: { serializedName: "x-ms-client-request-id", @@ -4336,6 +4975,23 @@ export const BlobUndeleteHeaders: msRest.CompositeMapper = { name: "DateTimeRfc1123" } }, + immutabilityPolicyExpiry: { + serializedName: "x-ms-immutability-policy-until-date", + type: { + name: "DateTimeRfc1123" + } + }, + immutabilityPolicyMode: { + serializedName: "x-ms-immutability-policy-mode", + type: { + name: "Enum", + allowedValues: [ + "Mutable", + "Unlocked", + "Locked" + ] + } + }, errorCode: { serializedName: "x-ms-error-code", type: { @@ -4346,30 +5002,52 @@ export const BlobUndeleteHeaders: msRest.CompositeMapper = { } }; -export const BlobSetHTTPHeadersHeaders: msRest.CompositeMapper = { - serializedName: "blob-sethttpheaders-headers", +export const BlobDeleteImmutabilityPolicyHeaders: msRest.CompositeMapper = { + serializedName: "blob-deleteimmutabilitypolicy-headers", type: { name: "Composite", - className: "BlobSetHTTPHeadersHeaders", + className: "BlobDeleteImmutabilityPolicyHeaders", modelProperties: { - eTag: { - serializedName: "etag", + clientRequestId: { + serializedName: "x-ms-client-request-id", type: { name: "String" } }, - lastModified: { - serializedName: "last-modified", + requestId: { + serializedName: "x-ms-request-id", + type: { + name: "String" + } + }, + version: { + serializedName: "x-ms-version", + type: { + name: "String" + } + }, + date: { + serializedName: "date", type: { name: "DateTimeRfc1123" } }, - blobSequenceNumber: { - serializedName: "x-ms-blob-sequence-number", + errorCode: { + serializedName: "x-ms-error-code", type: { - name: "Number" + name: "String" } - }, + } + } + } +}; + +export const BlobSetLegalHoldHeaders: msRest.CompositeMapper = { + serializedName: "blob-setlegalhold-headers", + type: { + name: "Composite", + className: "BlobSetLegalHoldHeaders", + modelProperties: { clientRequestId: { serializedName: "x-ms-client-request-id", type: { @@ -4394,6 +5072,12 @@ export const BlobSetHTTPHeadersHeaders: msRest.CompositeMapper = { name: "DateTimeRfc1123" } }, + legalHold: { + serializedName: "x-ms-legal-hold", + type: { + name: "Boolean" + } + }, errorCode: { serializedName: "x-ms-error-code", type: { @@ -4440,6 +5124,12 @@ export const BlobSetMetadataHeaders: msRest.CompositeMapper = { name: "String" } }, + versionId: { + serializedName: "x-ms-version-id", + type: { + name: "String" + } + }, date: { serializedName: "date", type: { @@ -4458,6 +5148,12 @@ export const BlobSetMetadataHeaders: msRest.CompositeMapper = { name: "String" } }, + encryptionScope: { + serializedName: "x-ms-encryption-scope", + type: { + name: "String" + } + }, errorCode: { serializedName: "x-ms-error-code", type: { @@ -4794,6 +5490,12 @@ export const BlobCreateSnapshotHeaders: msRest.CompositeMapper = { name: "String" } }, + versionId: { + serializedName: "x-ms-version-id", + type: { + name: "String" + } + }, date: { serializedName: "date", type: { @@ -4852,6 +5554,12 @@ export const BlobStartCopyFromURLHeaders: msRest.CompositeMapper = { name: "String" } }, + versionId: { + serializedName: "x-ms-version-id", + type: { + name: "String" + } + }, date: { serializedName: "date", type: { @@ -4922,25 +5630,259 @@ export const BlobCopyFromURLHeaders: msRest.CompositeMapper = { name: "String" } }, + versionId: { + serializedName: "x-ms-version-id", + type: { + name: "String" + } + }, + date: { + serializedName: "date", + type: { + name: "DateTimeRfc1123" + } + }, + copyId: { + serializedName: "x-ms-copy-id", + type: { + name: "String" + } + }, + copyStatus: { + serializedName: "x-ms-copy-status", + type: { + name: "Enum", + allowedValues: [ + "success" + ] + } + }, + contentMD5: { + serializedName: "content-md5", + type: { + name: "ByteArray" + } + }, + xMsContentCrc64: { + serializedName: "x-ms-content-crc64", + type: { + name: "ByteArray" + } + }, + encryptionScope: { + serializedName: "x-ms-encryption-scope", + type: { + name: "String" + } + }, + errorCode: { + serializedName: "x-ms-error-code", + type: { + name: "String" + } + } + } + } +}; + +export const BlobAbortCopyFromURLHeaders: msRest.CompositeMapper = { + serializedName: "blob-abortcopyfromurl-headers", + type: { + name: "Composite", + className: "BlobAbortCopyFromURLHeaders", + modelProperties: { + clientRequestId: { + serializedName: "x-ms-client-request-id", + type: { + name: "String" + } + }, + requestId: { + serializedName: "x-ms-request-id", + type: { + name: "String" + } + }, + version: { + serializedName: "x-ms-version", + type: { + name: "String" + } + }, + date: { + serializedName: "date", + type: { + name: "DateTimeRfc1123" + } + }, + errorCode: { + serializedName: "x-ms-error-code", + type: { + name: "String" + } + } + } + } +}; + +export const BlobSetTierHeaders: msRest.CompositeMapper = { + serializedName: "blob-settier-headers", + type: { + name: "Composite", + className: "BlobSetTierHeaders", + modelProperties: { + clientRequestId: { + serializedName: "x-ms-client-request-id", + type: { + name: "String" + } + }, + requestId: { + serializedName: "x-ms-request-id", + type: { + name: "String" + } + }, + version: { + serializedName: "x-ms-version", + type: { + name: "String" + } + }, + errorCode: { + serializedName: "x-ms-error-code", + type: { + name: "String" + } + } + } + } +}; + +export const BlobGetAccountInfoHeaders: msRest.CompositeMapper = { + serializedName: "blob-getaccountinfo-headers", + type: { + name: "Composite", + className: "BlobGetAccountInfoHeaders", + modelProperties: { + clientRequestId: { + serializedName: "x-ms-client-request-id", + type: { + name: "String" + } + }, + requestId: { + serializedName: "x-ms-request-id", + type: { + name: "String" + } + }, + version: { + serializedName: "x-ms-version", + type: { + name: "String" + } + }, + date: { + serializedName: "date", + type: { + name: "DateTimeRfc1123" + } + }, + skuName: { + serializedName: "x-ms-sku-name", + type: { + name: "Enum", + allowedValues: [ + "Standard_LRS", + "Standard_GRS", + "Standard_RAGRS", + "Standard_ZRS", + "Premium_LRS" + ] + } + }, + accountKind: { + serializedName: "x-ms-account-kind", + type: { + name: "Enum", + allowedValues: [ + "Storage", + "BlobStorage", + "StorageV2", + "FileStorage", + "BlockBlobStorage" + ] + } + }, + errorCode: { + serializedName: "x-ms-error-code", + type: { + name: "String" + } + } + } + } +}; + +export const BlockBlobStageBlockHeaders: msRest.CompositeMapper = { + serializedName: "blockblob-stageblock-headers", + type: { + name: "Composite", + className: "BlockBlobStageBlockHeaders", + modelProperties: { + contentMD5: { + serializedName: "content-md5", + type: { + name: "ByteArray" + } + }, + clientRequestId: { + serializedName: "x-ms-client-request-id", + type: { + name: "String" + } + }, + requestId: { + serializedName: "x-ms-request-id", + type: { + name: "String" + } + }, + version: { + serializedName: "x-ms-version", + type: { + name: "String" + } + }, date: { serializedName: "date", type: { name: "DateTimeRfc1123" } }, - copyId: { - serializedName: "x-ms-copy-id", + xMsContentCrc64: { + serializedName: "x-ms-content-crc64", + type: { + name: "ByteArray" + } + }, + isServerEncrypted: { + serializedName: "x-ms-request-server-encrypted", + type: { + name: "Boolean" + } + }, + encryptionKeySha256: { + serializedName: "x-ms-encryption-key-sha256", type: { name: "String" } }, - copyStatus: { - serializedName: "x-ms-copy-status", + encryptionScope: { + serializedName: "x-ms-encryption-scope", type: { - name: "Enum", - allowedValues: [ - "success" - ] + name: "String" } }, errorCode: { @@ -4953,12 +5895,24 @@ export const BlobCopyFromURLHeaders: msRest.CompositeMapper = { } }; -export const BlobAbortCopyFromURLHeaders: msRest.CompositeMapper = { - serializedName: "blob-abortcopyfromurl-headers", +export const BlockBlobStageBlockFromURLHeaders: msRest.CompositeMapper = { + serializedName: "blockblob-stageblockfromurl-headers", type: { name: "Composite", - className: "BlobAbortCopyFromURLHeaders", + className: "BlockBlobStageBlockFromURLHeaders", modelProperties: { + contentMD5: { + serializedName: "content-md5", + type: { + name: "ByteArray" + } + }, + xMsContentCrc64: { + serializedName: "x-ms-content-crc64", + type: { + name: "ByteArray" + } + }, clientRequestId: { serializedName: "x-ms-client-request-id", type: { @@ -4983,6 +5937,24 @@ export const BlobAbortCopyFromURLHeaders: msRest.CompositeMapper = { name: "DateTimeRfc1123" } }, + isServerEncrypted: { + serializedName: "x-ms-request-server-encrypted", + type: { + name: "Boolean" + } + }, + encryptionKeySha256: { + serializedName: "x-ms-encryption-key-sha256", + type: { + name: "String" + } + }, + encryptionScope: { + serializedName: "x-ms-encryption-scope", + type: { + name: "String" + } + }, errorCode: { serializedName: "x-ms-error-code", type: { @@ -4993,46 +5965,36 @@ export const BlobAbortCopyFromURLHeaders: msRest.CompositeMapper = { } }; -export const BlobSetTierHeaders: msRest.CompositeMapper = { - serializedName: "blob-settier-headers", +export const BlockBlobCommitBlockListHeaders: msRest.CompositeMapper = { + serializedName: "blockblob-commitblocklist-headers", type: { name: "Composite", - className: "BlobSetTierHeaders", + className: "BlockBlobCommitBlockListHeaders", modelProperties: { - clientRequestId: { - serializedName: "x-ms-client-request-id", + eTag: { + serializedName: "etag", type: { name: "String" } }, - requestId: { - serializedName: "x-ms-request-id", + lastModified: { + serializedName: "last-modified", type: { - name: "String" + name: "DateTimeRfc1123" } }, - version: { - serializedName: "x-ms-version", + contentMD5: { + serializedName: "content-md5", type: { - name: "String" + name: "ByteArray" } }, - errorCode: { - serializedName: "x-ms-error-code", + xMsContentCrc64: { + serializedName: "x-ms-content-crc64", type: { - name: "String" + name: "ByteArray" } - } - } - } -}; - -export const BlobGetAccountInfoHeaders: msRest.CompositeMapper = { - serializedName: "blob-getaccountinfo-headers", - type: { - name: "Composite", - className: "BlobGetAccountInfoHeaders", - modelProperties: { + }, clientRequestId: { serializedName: "x-ms-client-request-id", type: { @@ -5051,34 +6013,34 @@ export const BlobGetAccountInfoHeaders: msRest.CompositeMapper = { name: "String" } }, + versionId: { + serializedName: "x-ms-version-id", + type: { + name: "String" + } + }, date: { serializedName: "date", type: { name: "DateTimeRfc1123" } }, - skuName: { - serializedName: "x-ms-sku-name", + isServerEncrypted: { + serializedName: "x-ms-request-server-encrypted", type: { - name: "Enum", - allowedValues: [ - "Standard_LRS", - "Standard_GRS", - "Standard_RAGRS", - "Standard_ZRS", - "Premium_LRS" - ] + name: "Boolean" } }, - accountKind: { - serializedName: "x-ms-account-kind", + encryptionKeySha256: { + serializedName: "x-ms-encryption-key-sha256", type: { - name: "Enum", - allowedValues: [ - "Storage", - "BlobStorage", - "StorageV2" - ] + name: "String" + } + }, + encryptionScope: { + serializedName: "x-ms-encryption-scope", + type: { + name: "String" } }, errorCode: { @@ -5091,12 +6053,36 @@ export const BlobGetAccountInfoHeaders: msRest.CompositeMapper = { } }; -export const BlobGetAccountInfoWithHeadHeaders: msRest.CompositeMapper = { - serializedName: "blob-getaccountinfowithhead-headers", +export const BlockBlobGetBlockListHeaders: msRest.CompositeMapper = { + serializedName: "blockblob-getblocklist-headers", type: { name: "Composite", - className: "BlobGetAccountInfoWithHeadHeaders", + className: "BlockBlobGetBlockListHeaders", modelProperties: { + lastModified: { + serializedName: "last-modified", + type: { + name: "DateTimeRfc1123" + } + }, + eTag: { + serializedName: "etag", + type: { + name: "String" + } + }, + contentType: { + serializedName: "content-type", + type: { + name: "String" + } + }, + blobContentLength: { + serializedName: "x-ms-blob-content-length", + type: { + name: "Number" + } + }, clientRequestId: { serializedName: "x-ms-client-request-id", type: { @@ -5121,30 +6107,6 @@ export const BlobGetAccountInfoWithHeadHeaders: msRest.CompositeMapper = { name: "DateTimeRfc1123" } }, - skuName: { - serializedName: "x-ms-sku-name", - type: { - name: "Enum", - allowedValues: [ - "Standard_LRS", - "Standard_GRS", - "Standard_RAGRS", - "Standard_ZRS", - "Premium_LRS" - ] - } - }, - accountKind: { - serializedName: "x-ms-account-kind", - type: { - name: "Enum", - allowedValues: [ - "Storage", - "BlobStorage", - "StorageV2" - ] - } - }, errorCode: { serializedName: "x-ms-error-code", type: { @@ -5155,18 +6117,42 @@ export const BlobGetAccountInfoWithHeadHeaders: msRest.CompositeMapper = { } }; -export const BlockBlobStageBlockHeaders: msRest.CompositeMapper = { - serializedName: "blockblob-stageblock-headers", +export const PageBlobUploadPagesHeaders: msRest.CompositeMapper = { + serializedName: "pageblob-uploadpages-headers", type: { name: "Composite", - className: "BlockBlobStageBlockHeaders", + className: "PageBlobUploadPagesHeaders", modelProperties: { + eTag: { + serializedName: "etag", + type: { + name: "String" + } + }, + lastModified: { + serializedName: "last-modified", + type: { + name: "DateTimeRfc1123" + } + }, contentMD5: { serializedName: "content-md5", type: { name: "ByteArray" } }, + xMsContentCrc64: { + serializedName: "x-ms-content-crc64", + type: { + name: "ByteArray" + } + }, + blobSequenceNumber: { + serializedName: "x-ms-blob-sequence-number", + type: { + name: "Number" + } + }, clientRequestId: { serializedName: "x-ms-client-request-id", type: { @@ -5191,12 +6177,6 @@ export const BlockBlobStageBlockHeaders: msRest.CompositeMapper = { name: "DateTimeRfc1123" } }, - xMsContentCrc64: { - serializedName: "x-ms-content-crc64", - type: { - name: "ByteArray" - } - }, isServerEncrypted: { serializedName: "x-ms-request-server-encrypted", type: { @@ -5209,6 +6189,12 @@ export const BlockBlobStageBlockHeaders: msRest.CompositeMapper = { name: "String" } }, + encryptionScope: { + serializedName: "x-ms-encryption-scope", + type: { + name: "String" + } + }, errorCode: { serializedName: "x-ms-error-code", type: { @@ -5219,12 +6205,24 @@ export const BlockBlobStageBlockHeaders: msRest.CompositeMapper = { } }; -export const BlockBlobStageBlockFromURLHeaders: msRest.CompositeMapper = { - serializedName: "blockblob-stageblockfromurl-headers", +export const PageBlobClearPagesHeaders: msRest.CompositeMapper = { + serializedName: "pageblob-clearpages-headers", type: { name: "Composite", - className: "BlockBlobStageBlockFromURLHeaders", + className: "PageBlobClearPagesHeaders", modelProperties: { + eTag: { + serializedName: "etag", + type: { + name: "String" + } + }, + lastModified: { + serializedName: "last-modified", + type: { + name: "DateTimeRfc1123" + } + }, contentMD5: { serializedName: "content-md5", type: { @@ -5237,6 +6235,12 @@ export const BlockBlobStageBlockFromURLHeaders: msRest.CompositeMapper = { name: "ByteArray" } }, + blobSequenceNumber: { + serializedName: "x-ms-blob-sequence-number", + type: { + name: "Number" + } + }, clientRequestId: { serializedName: "x-ms-client-request-id", type: { @@ -5255,22 +6259,10 @@ export const BlockBlobStageBlockFromURLHeaders: msRest.CompositeMapper = { name: "String" } }, - date: { - serializedName: "date", - type: { - name: "DateTimeRfc1123" - } - }, - isServerEncrypted: { - serializedName: "x-ms-request-server-encrypted", - type: { - name: "Boolean" - } - }, - encryptionKeySha256: { - serializedName: "x-ms-encryption-key-sha256", + date: { + serializedName: "date", type: { - name: "String" + name: "DateTimeRfc1123" } }, errorCode: { @@ -5283,11 +6275,11 @@ export const BlockBlobStageBlockFromURLHeaders: msRest.CompositeMapper = { } }; -export const BlockBlobCommitBlockListHeaders: msRest.CompositeMapper = { - serializedName: "blockblob-commitblocklist-headers", +export const PageBlobUploadPagesFromURLHeaders: msRest.CompositeMapper = { + serializedName: "pageblob-uploadpagesfromurl-headers", type: { name: "Composite", - className: "BlockBlobCommitBlockListHeaders", + className: "PageBlobUploadPagesFromURLHeaders", modelProperties: { eTag: { serializedName: "etag", @@ -5313,10 +6305,10 @@ export const BlockBlobCommitBlockListHeaders: msRest.CompositeMapper = { name: "ByteArray" } }, - clientRequestId: { - serializedName: "x-ms-client-request-id", + blobSequenceNumber: { + serializedName: "x-ms-blob-sequence-number", type: { - name: "String" + name: "Number" } }, requestId: { @@ -5349,6 +6341,12 @@ export const BlockBlobCommitBlockListHeaders: msRest.CompositeMapper = { name: "String" } }, + encryptionScope: { + serializedName: "x-ms-encryption-scope", + type: { + name: "String" + } + }, errorCode: { serializedName: "x-ms-error-code", type: { @@ -5359,11 +6357,11 @@ export const BlockBlobCommitBlockListHeaders: msRest.CompositeMapper = { } }; -export const BlockBlobGetBlockListHeaders: msRest.CompositeMapper = { - serializedName: "blockblob-getblocklist-headers", +export const PageBlobGetPageRangesHeaders: msRest.CompositeMapper = { + serializedName: "pageblob-getpageranges-headers", type: { name: "Composite", - className: "BlockBlobGetBlockListHeaders", + className: "PageBlobGetPageRangesHeaders", modelProperties: { lastModified: { serializedName: "last-modified", @@ -5377,12 +6375,6 @@ export const BlockBlobGetBlockListHeaders: msRest.CompositeMapper = { name: "String" } }, - contentType: { - serializedName: "content-type", - type: { - name: "String" - } - }, blobContentLength: { serializedName: "x-ms-blob-content-length", type: { @@ -5423,38 +6415,26 @@ export const BlockBlobGetBlockListHeaders: msRest.CompositeMapper = { } }; -export const PageBlobUploadPagesHeaders: msRest.CompositeMapper = { - serializedName: "pageblob-uploadpages-headers", +export const PageBlobGetPageRangesDiffHeaders: msRest.CompositeMapper = { + serializedName: "pageblob-getpagerangesdiff-headers", type: { name: "Composite", - className: "PageBlobUploadPagesHeaders", + className: "PageBlobGetPageRangesDiffHeaders", modelProperties: { - eTag: { - serializedName: "etag", - type: { - name: "String" - } - }, lastModified: { serializedName: "last-modified", type: { name: "DateTimeRfc1123" } }, - contentMD5: { - serializedName: "content-md5", - type: { - name: "ByteArray" - } - }, - xMsContentCrc64: { - serializedName: "x-ms-content-crc64", + eTag: { + serializedName: "etag", type: { - name: "ByteArray" + name: "String" } }, - blobSequenceNumber: { - serializedName: "x-ms-blob-sequence-number", + blobContentLength: { + serializedName: "x-ms-blob-content-length", type: { name: "Number" } @@ -5483,18 +6463,6 @@ export const PageBlobUploadPagesHeaders: msRest.CompositeMapper = { name: "DateTimeRfc1123" } }, - isServerEncrypted: { - serializedName: "x-ms-request-server-encrypted", - type: { - name: "Boolean" - } - }, - encryptionKeySha256: { - serializedName: "x-ms-encryption-key-sha256", - type: { - name: "String" - } - }, errorCode: { serializedName: "x-ms-error-code", type: { @@ -5505,11 +6473,11 @@ export const PageBlobUploadPagesHeaders: msRest.CompositeMapper = { } }; -export const PageBlobClearPagesHeaders: msRest.CompositeMapper = { - serializedName: "pageblob-clearpages-headers", +export const PageBlobResizeHeaders: msRest.CompositeMapper = { + serializedName: "pageblob-resize-headers", type: { name: "Composite", - className: "PageBlobClearPagesHeaders", + className: "PageBlobResizeHeaders", modelProperties: { eTag: { serializedName: "etag", @@ -5523,18 +6491,6 @@ export const PageBlobClearPagesHeaders: msRest.CompositeMapper = { name: "DateTimeRfc1123" } }, - contentMD5: { - serializedName: "content-md5", - type: { - name: "ByteArray" - } - }, - xMsContentCrc64: { - serializedName: "x-ms-content-crc64", - type: { - name: "ByteArray" - } - }, blobSequenceNumber: { serializedName: "x-ms-blob-sequence-number", type: { @@ -5575,11 +6531,11 @@ export const PageBlobClearPagesHeaders: msRest.CompositeMapper = { } }; -export const PageBlobUploadPagesFromURLHeaders: msRest.CompositeMapper = { - serializedName: "pageblob-uploadpagesfromurl-headers", +export const PageBlobUpdateSequenceNumberHeaders: msRest.CompositeMapper = { + serializedName: "pageblob-updatesequencenumber-headers", type: { name: "Composite", - className: "PageBlobUploadPagesFromURLHeaders", + className: "PageBlobUpdateSequenceNumberHeaders", modelProperties: { eTag: { serializedName: "etag", @@ -5593,24 +6549,18 @@ export const PageBlobUploadPagesFromURLHeaders: msRest.CompositeMapper = { name: "DateTimeRfc1123" } }, - contentMD5: { - serializedName: "content-md5", - type: { - name: "ByteArray" - } - }, - xMsContentCrc64: { - serializedName: "x-ms-content-crc64", - type: { - name: "ByteArray" - } - }, blobSequenceNumber: { serializedName: "x-ms-blob-sequence-number", type: { name: "Number" } }, + clientRequestId: { + serializedName: "x-ms-client-request-id", + type: { + name: "String" + } + }, requestId: { serializedName: "x-ms-request-id", type: { @@ -5629,12 +6579,6 @@ export const PageBlobUploadPagesFromURLHeaders: msRest.CompositeMapper = { name: "DateTimeRfc1123" } }, - isServerEncrypted: { - serializedName: "x-ms-request-server-encrypted", - type: { - name: "Boolean" - } - }, errorCode: { serializedName: "x-ms-error-code", type: { @@ -5645,28 +6589,22 @@ export const PageBlobUploadPagesFromURLHeaders: msRest.CompositeMapper = { } }; -export const PageBlobGetPageRangesHeaders: msRest.CompositeMapper = { - serializedName: "pageblob-getpageranges-headers", +export const PageBlobCopyIncrementalHeaders: msRest.CompositeMapper = { + serializedName: "pageblob-copyincremental-headers", type: { name: "Composite", - className: "PageBlobGetPageRangesHeaders", + className: "PageBlobCopyIncrementalHeaders", modelProperties: { - lastModified: { - serializedName: "last-modified", - type: { - name: "DateTimeRfc1123" - } - }, eTag: { serializedName: "etag", type: { name: "String" } }, - blobContentLength: { - serializedName: "x-ms-blob-content-length", + lastModified: { + serializedName: "last-modified", type: { - name: "Number" + name: "DateTimeRfc1123" } }, clientRequestId: { @@ -5693,6 +6631,24 @@ export const PageBlobGetPageRangesHeaders: msRest.CompositeMapper = { name: "DateTimeRfc1123" } }, + copyId: { + serializedName: "x-ms-copy-id", + type: { + name: "String" + } + }, + copyStatus: { + serializedName: "x-ms-copy-status", + type: { + name: "Enum", + allowedValues: [ + "pending", + "success", + "aborted", + "failed" + ] + } + }, errorCode: { serializedName: "x-ms-error-code", type: { @@ -5703,28 +6659,34 @@ export const PageBlobGetPageRangesHeaders: msRest.CompositeMapper = { } }; -export const PageBlobGetPageRangesDiffHeaders: msRest.CompositeMapper = { - serializedName: "pageblob-getpagerangesdiff-headers", +export const AppendBlobAppendBlockHeaders: msRest.CompositeMapper = { + serializedName: "appendblob-appendblock-headers", type: { name: "Composite", - className: "PageBlobGetPageRangesDiffHeaders", + className: "AppendBlobAppendBlockHeaders", modelProperties: { + eTag: { + serializedName: "etag", + type: { + name: "String" + } + }, lastModified: { serializedName: "last-modified", type: { name: "DateTimeRfc1123" } }, - eTag: { - serializedName: "etag", + contentMD5: { + serializedName: "content-md5", type: { - name: "String" + name: "ByteArray" } }, - blobContentLength: { - serializedName: "x-ms-blob-content-length", + xMsContentCrc64: { + serializedName: "x-ms-content-crc64", type: { - name: "Number" + name: "ByteArray" } }, clientRequestId: { @@ -5751,6 +6713,36 @@ export const PageBlobGetPageRangesDiffHeaders: msRest.CompositeMapper = { name: "DateTimeRfc1123" } }, + blobAppendOffset: { + serializedName: "x-ms-blob-append-offset", + type: { + name: "String" + } + }, + blobCommittedBlockCount: { + serializedName: "x-ms-blob-committed-block-count", + type: { + name: "Number" + } + }, + isServerEncrypted: { + serializedName: "x-ms-request-server-encrypted", + type: { + name: "Boolean" + } + }, + encryptionKeySha256: { + serializedName: "x-ms-encryption-key-sha256", + type: { + name: "String" + } + }, + encryptionScope: { + serializedName: "x-ms-encryption-scope", + type: { + name: "String" + } + }, errorCode: { serializedName: "x-ms-error-code", type: { @@ -5761,11 +6753,11 @@ export const PageBlobGetPageRangesDiffHeaders: msRest.CompositeMapper = { } }; -export const PageBlobResizeHeaders: msRest.CompositeMapper = { - serializedName: "pageblob-resize-headers", +export const AppendBlobAppendBlockFromUrlHeaders: msRest.CompositeMapper = { + serializedName: "appendblob-appendblockfromurl-headers", type: { name: "Composite", - className: "PageBlobResizeHeaders", + className: "AppendBlobAppendBlockFromUrlHeaders", modelProperties: { eTag: { serializedName: "etag", @@ -5779,16 +6771,16 @@ export const PageBlobResizeHeaders: msRest.CompositeMapper = { name: "DateTimeRfc1123" } }, - blobSequenceNumber: { - serializedName: "x-ms-blob-sequence-number", + contentMD5: { + serializedName: "content-md5", type: { - name: "Number" + name: "ByteArray" } }, - clientRequestId: { - serializedName: "x-ms-client-request-id", + xMsContentCrc64: { + serializedName: "x-ms-content-crc64", type: { - name: "String" + name: "ByteArray" } }, requestId: { @@ -5809,6 +6801,36 @@ export const PageBlobResizeHeaders: msRest.CompositeMapper = { name: "DateTimeRfc1123" } }, + blobAppendOffset: { + serializedName: "x-ms-blob-append-offset", + type: { + name: "String" + } + }, + blobCommittedBlockCount: { + serializedName: "x-ms-blob-committed-block-count", + type: { + name: "Number" + } + }, + encryptionKeySha256: { + serializedName: "x-ms-encryption-key-sha256", + type: { + name: "String" + } + }, + encryptionScope: { + serializedName: "x-ms-encryption-scope", + type: { + name: "String" + } + }, + isServerEncrypted: { + serializedName: "x-ms-request-server-encrypted", + type: { + name: "Boolean" + } + }, errorCode: { serializedName: "x-ms-error-code", type: { @@ -5819,11 +6841,11 @@ export const PageBlobResizeHeaders: msRest.CompositeMapper = { } }; -export const PageBlobUpdateSequenceNumberHeaders: msRest.CompositeMapper = { - serializedName: "pageblob-updatesequencenumber-headers", +export const AppendBlobSealHeaders: msRest.CompositeMapper = { + serializedName: "appendblob-seal-headers", type: { name: "Composite", - className: "PageBlobUpdateSequenceNumberHeaders", + className: "AppendBlobSealHeaders", modelProperties: { eTag: { serializedName: "etag", @@ -5837,12 +6859,6 @@ export const PageBlobUpdateSequenceNumberHeaders: msRest.CompositeMapper = { name: "DateTimeRfc1123" } }, - blobSequenceNumber: { - serializedName: "x-ms-blob-sequence-number", - type: { - name: "Number" - } - }, clientRequestId: { serializedName: "x-ms-client-request-id", type: { @@ -5867,6 +6883,12 @@ export const PageBlobUpdateSequenceNumberHeaders: msRest.CompositeMapper = { name: "DateTimeRfc1123" } }, + isSealed: { + serializedName: "x-ms-blob-sealed", + type: { + name: "Boolean" + } + }, errorCode: { serializedName: "x-ms-error-code", type: { @@ -5877,54 +6899,131 @@ export const PageBlobUpdateSequenceNumberHeaders: msRest.CompositeMapper = { } }; -export const PageBlobCopyIncrementalHeaders: msRest.CompositeMapper = { - serializedName: "pageblob-copyincremental-headers", +export const BlobQueryHeaders: msRest.CompositeMapper = { + serializedName: "blob-query-headers", type: { name: "Composite", - className: "PageBlobCopyIncrementalHeaders", + className: "BlobQueryHeaders", modelProperties: { + lastModified: { + serializedName: "last-modified", + type: { + name: "DateTimeRfc1123" + } + }, + metadata: { + serializedName: "x-ms-meta", + type: { + name: "Dictionary", + value: { + type: { + name: "String" + } + } + }, + headerCollectionPrefix: "x-ms-meta-" + }, + contentLength: { + serializedName: "content-length", + type: { + name: "Number" + } + }, + contentType: { + serializedName: "content-type", + type: { + name: "String" + } + }, + contentRange: { + serializedName: "content-range", + type: { + name: "String" + } + }, eTag: { serializedName: "etag", type: { name: "String" } }, - lastModified: { - serializedName: "last-modified", + contentMD5: { + serializedName: "content-md5", type: { - name: "DateTimeRfc1123" + name: "ByteArray" } }, - clientRequestId: { - serializedName: "x-ms-client-request-id", + contentEncoding: { + serializedName: "content-encoding", type: { name: "String" } }, - requestId: { - serializedName: "x-ms-request-id", + cacheControl: { + serializedName: "cache-control", type: { name: "String" } }, - version: { - serializedName: "x-ms-version", + contentDisposition: { + serializedName: "content-disposition", type: { name: "String" } }, - date: { - serializedName: "date", + contentLanguage: { + serializedName: "content-language", + type: { + name: "String" + } + }, + blobSequenceNumber: { + serializedName: "x-ms-blob-sequence-number", + type: { + name: "Number" + } + }, + blobType: { + serializedName: "x-ms-blob-type", + type: { + name: "Enum", + allowedValues: [ + "BlockBlob", + "PageBlob", + "AppendBlob" + ] + } + }, + copyCompletionTime: { + serializedName: "x-ms-copy-completion-time", type: { name: "DateTimeRfc1123" } }, + copyStatusDescription: { + serializedName: "x-ms-copy-status-description", + type: { + name: "String" + } + }, copyId: { serializedName: "x-ms-copy-id", type: { name: "String" } }, + copyProgress: { + serializedName: "x-ms-copy-progress", + type: { + name: "String" + } + }, + copySource: { + serializedName: "x-ms-copy-source", + type: { + name: "String" + } + }, copyStatus: { serializedName: "x-ms-copy-status", type: { @@ -5937,44 +7036,37 @@ export const PageBlobCopyIncrementalHeaders: msRest.CompositeMapper = { ] } }, - errorCode: { - serializedName: "x-ms-error-code", - type: { - name: "String" - } - } - } - } -}; - -export const AppendBlobAppendBlockHeaders: msRest.CompositeMapper = { - serializedName: "appendblob-appendblock-headers", - type: { - name: "Composite", - className: "AppendBlobAppendBlockHeaders", - modelProperties: { - eTag: { - serializedName: "etag", - type: { - name: "String" - } - }, - lastModified: { - serializedName: "last-modified", + leaseDuration: { + serializedName: "x-ms-lease-duration", type: { - name: "DateTimeRfc1123" + name: "Enum", + allowedValues: [ + "infinite", + "fixed" + ] } }, - contentMD5: { - serializedName: "content-md5", + leaseState: { + serializedName: "x-ms-lease-state", type: { - name: "ByteArray" + name: "Enum", + allowedValues: [ + "available", + "leased", + "expired", + "breaking", + "broken" + ] } }, - xMsContentCrc64: { - serializedName: "x-ms-content-crc64", + leaseStatus: { + serializedName: "x-ms-lease-status", type: { - name: "ByteArray" + name: "Enum", + allowedValues: [ + "locked", + "unlocked" + ] } }, clientRequestId: { @@ -5995,16 +7087,16 @@ export const AppendBlobAppendBlockHeaders: msRest.CompositeMapper = { name: "String" } }, - date: { - serializedName: "date", + acceptRanges: { + serializedName: "accept-ranges", type: { - name: "DateTimeRfc1123" + name: "String" } }, - blobAppendOffset: { - serializedName: "x-ms-blob-append-offset", + date: { + serializedName: "date", type: { - name: "String" + name: "DateTimeRfc1123" } }, blobCommittedBlockCount: { @@ -6014,7 +7106,7 @@ export const AppendBlobAppendBlockHeaders: msRest.CompositeMapper = { } }, isServerEncrypted: { - serializedName: "x-ms-request-server-encrypted", + serializedName: "x-ms-server-encrypted", type: { name: "Boolean" } @@ -6025,6 +7117,24 @@ export const AppendBlobAppendBlockHeaders: msRest.CompositeMapper = { name: "String" } }, + encryptionScope: { + serializedName: "x-ms-encryption-scope", + type: { + name: "String" + } + }, + blobContentMD5: { + serializedName: "x-ms-blob-content-md5", + type: { + name: "ByteArray" + } + }, + contentCrc64: { + serializedName: "x-ms-content-crc64", + type: { + name: "ByteArray" + } + }, errorCode: { serializedName: "x-ms-error-code", type: { @@ -6035,36 +7145,18 @@ export const AppendBlobAppendBlockHeaders: msRest.CompositeMapper = { } }; -export const AppendBlobAppendBlockFromUrlHeaders: msRest.CompositeMapper = { - serializedName: "appendblob-appendblockfromurl-headers", +export const BlobGetTagsHeaders: msRest.CompositeMapper = { + serializedName: "blob-gettags-headers", type: { name: "Composite", - className: "AppendBlobAppendBlockFromUrlHeaders", + className: "BlobGetTagsHeaders", modelProperties: { - eTag: { - serializedName: "etag", + clientRequestId: { + serializedName: "x-ms-client-request-id", type: { name: "String" } }, - lastModified: { - serializedName: "last-modified", - type: { - name: "DateTimeRfc1123" - } - }, - contentMD5: { - serializedName: "content-md5", - type: { - name: "ByteArray" - } - }, - xMsContentCrc64: { - serializedName: "x-ms-content-crc64", - type: { - name: "ByteArray" - } - }, requestId: { serializedName: "x-ms-request-id", type: { @@ -6083,24 +7175,46 @@ export const AppendBlobAppendBlockFromUrlHeaders: msRest.CompositeMapper = { name: "DateTimeRfc1123" } }, - blobAppendOffset: { - serializedName: "x-ms-blob-append-offset", + errorCode: { + serializedName: "x-ms-error-code", + type: { + name: "String" + } + } + } + } +}; + +export const BlobSetTagsHeaders: msRest.CompositeMapper = { + serializedName: "blob-settags-headers", + type: { + name: "Composite", + className: "BlobSetTagsHeaders", + modelProperties: { + clientRequestId: { + serializedName: "x-ms-client-request-id", type: { name: "String" } }, - blobCommittedBlockCount: { - serializedName: "x-ms-blob-committed-block-count", + requestId: { + serializedName: "x-ms-request-id", type: { - name: "Number" + name: "String" } }, - encryptionKeySha256: { - serializedName: "x-ms-encryption-key-sha256", + version: { + serializedName: "x-ms-version", type: { name: "String" } }, + date: { + serializedName: "date", + type: { + name: "DateTimeRfc1123" + } + }, errorCode: { serializedName: "x-ms-error-code", type: { diff --git a/src/blob/generated/artifacts/models.ts b/src/blob/generated/artifacts/models.ts index 81e527189..373d75a0d 100644 --- a/src/blob/generated/artifacts/models.ts +++ b/src/blob/generated/artifacts/models.ts @@ -69,30 +69,6 @@ export interface StorageError { message?: string; } -/** - * The service error response object. - */ -export interface DataLakeStorageErrorError { - /** - * The service error code. - */ - code?: string; - /** - * The service error message. - */ - message?: string; -} - -/** - * An interface representing DataLakeStorageError. - */ -export interface DataLakeStorageError { - /** - * The service error response object. - */ - error?: DataLakeStorageErrorError; -} - /** * An Access policy */ @@ -112,13 +88,13 @@ export interface AccessPolicy { /** * the permissions for the acl policy */ - permission: string; + permission?: string; } /** * Properties of a blob */ -export interface BlobProperties { +export interface BlobPropertiesInternal { creationTime?: Date; lastModified: Date; etag: string; @@ -165,7 +141,7 @@ export interface BlobProperties { remainingRetentionDays?: number; /** * Possible values include: 'P4', 'P6', 'P10', 'P15', 'P20', 'P30', 'P40', 'P50', 'P60', 'P70', - * 'P80', 'Hot', 'Cool', 'Archive' + * 'P80', 'Hot', 'Cool', 'Archive', 'Premium' */ accessTier?: AccessTier; accessTierInferred?: boolean; @@ -174,7 +150,25 @@ export interface BlobProperties { */ archiveStatus?: ArchiveStatus; customerProvidedKeySha256?: string; + /** + * The name of the encryption scope under which the blob is encrypted. + */ + encryptionScope?: string; accessTierChangeTime?: Date; + tagCount?: number; + expiresOn?: Date; + isSealed?: boolean; + /** + * Possible values include: 'High', 'Standard' + */ + rehydratePriority?: RehydratePriority; + lastAccessedOn?: Date; + immutabilityPolicyExpiresOn?: Date; + /** + * Possible values include: 'Mutable', 'Unlocked', 'Locked' + */ + immutabilityPolicyMode?: BlobImmutabilityPolicyMode; + legalHold?: boolean; } /** @@ -189,22 +183,42 @@ export interface BlobMetadata { [property: string]: string | any; } +/** + * An interface representing BlobTag. + */ +export interface BlobTag { + key: string; + value: string; +} + +/** + * Blob tags + */ +export interface BlobTags { + blobTagSet: BlobTag[]; +} + /** * An Azure Storage blob */ -export interface BlobItem { +export interface BlobItemInternal { name: string; deleted?: boolean; snapshot?: string; - properties: BlobProperties; + versionId?: string; + isCurrentVersion?: boolean; + properties: BlobPropertiesInternal; metadata?: BlobMetadata; + blobTags?: BlobTags; + objectReplicationMetadata?: { [propertyName: string]: string }; + hasVersionsOnly?: boolean; } /** * An interface representing BlobFlatListSegment. */ export interface BlobFlatListSegment { - blobItems: BlobItem[]; + blobItems: BlobItemInternal[]; } /** @@ -216,7 +230,6 @@ export interface ListBlobsFlatSegmentResponse { prefix?: string; marker?: string; maxResults?: number; - delimiter?: string; segment: BlobFlatListSegment; nextMarker?: string; } @@ -233,7 +246,7 @@ export interface BlobPrefix { */ export interface BlobHierarchyListSegment { blobPrefixes?: BlobPrefix[]; - blobItems: BlobItem[]; + blobItems: BlobItemInternal[]; } /** @@ -250,6 +263,20 @@ export interface ListBlobsHierarchySegmentResponse { nextMarker?: string; } +/** + * An interface representing BlobName. + */ +export interface BlobName { + /** + * Indicates if the blob name is encoded. + */ + encoded?: boolean; + /** + * The name of the blob. + */ + content?: string; +} + /** * Represents a single block in a block blob. It describes the block's ID and size. */ @@ -305,6 +332,14 @@ export interface ContainerProperties { publicAccess?: PublicAccessType; hasImmutabilityPolicy?: boolean; hasLegalHold?: boolean; + defaultEncryptionScope?: string; + preventEncryptionScopeOverride?: boolean; + deletedTime?: Date; + remainingRetentionDays?: number; + /** + * Indicates if version level worm is enabled on this container. + */ + isImmutableStorageWithVersioningEnabled?: boolean; } /** @@ -312,10 +347,65 @@ export interface ContainerProperties { */ export interface ContainerItem { name: string; + deleted?: boolean; + version?: string; properties: ContainerProperties; metadata?: { [propertyName: string]: string }; } +/** + * Groups the settings used for interpreting the blob data if the blob is delimited text formatted. + */ +export interface DelimitedTextConfiguration { + /** + * The string used to separate columns. + */ + columnSeparator?: string; + /** + * The string used to quote a specific field. + */ + fieldQuote?: string; + /** + * The string used to separate records. + */ + recordSeparator?: string; + /** + * The string used as an escape character. + */ + escapeChar?: string; + /** + * Represents whether the data has headers. + */ + headersPresent?: boolean; +} + +/** + * json text configuration + */ +export interface JsonTextConfiguration { + /** + * The string used to separate records. + */ + recordSeparator?: string; +} + +/** + * Groups settings regarding specific field of an arrow schema + */ +export interface ArrowField { + type: string; + name?: string; + precision?: number; + scale?: number; +} + +/** + * Groups the settings used for formatting the response if the response should be Arrow formatted. + */ +export interface ArrowConfiguration { + schema: ArrowField[]; +} + /** * An enumeration of containers */ @@ -350,18 +440,39 @@ export interface CorsRule { /** * the request headers that the origin domain may specify on the CORS request. */ - allowedHeaders?: string; + allowedHeaders: string; /** * The response headers that may be sent in the response to the CORS request and exposed by the * browser to the request issuer */ - exposedHeaders?: string; + exposedHeaders: string; /** * The maximum amount time that a browser should cache the preflight OPTIONS request. */ maxAgeInSeconds: number; } +/** + * Blob info from a Filter Blobs API call + */ +export interface FilterBlobItem { + name: string; + containerName: string; + tags?: BlobTags; + versionId?: string; + isCurrentVersion?: boolean; +} + +/** + * The result of a Filter Blobs API call + */ +export interface FilterBlobSegment { + serviceEndpoint: string; + where: string; + blobs: FilterBlobItem[]; + nextMarker?: string; +} + /** * Geo-Replication information for the Secondary Storage Service */ @@ -392,6 +503,10 @@ export interface RetentionPolicy { * All data older than this value will be deleted */ days?: number; + /** + * Indicates whether permanent delete is allowed on this storage account. + */ + allowPermanentDelete?: boolean; } /** @@ -458,6 +573,40 @@ export interface ClearRange { export interface PageList { pageRange?: PageRange[]; clearRange?: ClearRange[]; + nextMarker?: string; +} + +/** + * An interface representing QueryFormat. + */ +export interface QueryFormat { + /** + * Possible values include: 'delimited', 'json', 'arrow', 'parquet' + */ + type: QueryFormatType; + delimitedTextConfiguration?: DelimitedTextConfiguration; + jsonTextConfiguration?: JsonTextConfiguration; + arrowConfiguration?: ArrowConfiguration; + parquetTextConfiguration?: any; +} + +/** + * An interface representing QuerySerialization. + */ +export interface QuerySerialization { + format: QueryFormat; +} + +/** + * Groups the set of query request settings. + */ +export interface QueryRequest { + /** + * The query expression in SQL. The maximum size of the query expression is 256KiB. + */ + expression: string; + inputSerialization?: QuerySerialization; + outputSerialization?: QuerySerialization; } /** @@ -487,6 +636,10 @@ export interface StaticWebsite { * The absolute path of the custom 404 page */ errorDocument404Path?: string; + /** + * Absolute path of the default index page + */ + defaultIndexDocumentPath?: string; } /** @@ -516,12 +669,28 @@ export interface StorageServiceStats { geoReplication?: GeoReplication; } +/** + * Additional parameters for create operation. + */ +export interface ContainerCpkScopeInfo { + /** + * Optional. Version 2019-07-07 and later. Specifies the default encryption scope to set on the + * container and use for all future writes. + */ + defaultEncryptionScope?: string; + /** + * Optional. Version 2019-07-07 and newer. If true, prevents any request from specifying a + * different encryption scope than the scope set on the container. + */ + preventEncryptionScopeOverride?: boolean; +} + /** * Additional parameters for a set of operations. */ export interface LeaseAccessConditions { /** - * If specified, the operation only succeeds if the container's lease is active and matches this + * If specified, the operation only succeeds if the resource's lease is active and matches this * ID. */ leaseId?: string; @@ -549,57 +718,10 @@ export interface ModifiedAccessConditions { * Specify an ETag value to operate only on blobs without a matching value. */ ifNoneMatch?: string; -} - -/** - * Additional parameters for a set of operations, such as: Directory_create, Directory_rename, - * Blob_rename. - */ -export interface DirectoryHttpHeaders { - /** - * Cache control for given resource - */ - cacheControl?: string; - /** - * Content type for given resource - */ - contentType?: string; - /** - * Content encoding for given resource - */ - contentEncoding?: string; /** - * Content language for given resource + * Specify a SQL where clause on blob tags to operate only on blobs with a matching value. */ - contentLanguage?: string; - /** - * Content disposition for given resource - */ - contentDisposition?: string; -} - -/** - * Additional parameters for a set of operations. - */ -export interface SourceModifiedAccessConditions { - /** - * Specify this header value to operate only on a blob if it has been modified since the - * specified date/time. - */ - sourceIfModifiedSince?: Date; - /** - * Specify this header value to operate only on a blob if it has not been modified since the - * specified date/time. - */ - sourceIfUnmodifiedSince?: Date; - /** - * Specify an ETag value to operate only on blobs with a matching value. - */ - sourceIfMatches?: string; - /** - * Specify an ETag value to operate only on blobs without a matching value. - */ - sourceIfNoneMatch?: string; + ifTags?: string; } /** @@ -660,6 +782,47 @@ export interface BlobHTTPHeaders { blobContentDisposition?: string; } +/** + * Additional parameters for a set of operations. + */ +export interface CpkScopeInfo { + /** + * Optional. Version 2019-07-07 and later. Specifies the name of the encryption scope to use to + * encrypt the data provided in the request. If not specified, encryption is performed with the + * default account encryption scope. For more information, see Encryption at Rest for Azure + * Storage Services. + */ + encryptionScope?: string; +} + +/** + * Additional parameters for a set of operations. + */ +export interface SourceModifiedAccessConditions { + /** + * Specify this header value to operate only on a blob if it has been modified since the + * specified date/time. + */ + sourceIfModifiedSince?: Date; + /** + * Specify this header value to operate only on a blob if it has not been modified since the + * specified date/time. + */ + sourceIfUnmodifiedSince?: Date; + /** + * Specify an ETag value to operate only on blobs with a matching value. + */ + sourceIfMatch?: string; + /** + * Specify an ETag value to operate only on blobs without a matching value. + */ + sourceIfNoneMatch?: string; + /** + * Specify a SQL where clause on blob tags to operate only on blobs with a matching value. + */ + sourceIfTags?: string; +} + /** * Additional parameters for a set of operations, such as: PageBlob_uploadPages, * PageBlob_clearPages, PageBlob_uploadPagesFromURL. @@ -683,7 +846,7 @@ export interface SequenceNumberAccessConditions { /** * Additional parameters for a set of operations, such as: AppendBlob_appendBlock, - * AppendBlob_appendBlockFromUrl. + * AppendBlob_appendBlockFromUrl, AppendBlob_seal. */ export interface AppendPositionAccessConditions { /** @@ -707,13 +870,10 @@ export interface AppendPositionAccessConditions { */ export interface AzuriteServerBlobOptions { /** - * Specifies the version of the operation to use for this request. - */ - version?: string; - /** - * Determines the behavior of the rename operation. Possible values include: 'legacy', 'posix' + * Specifies the version of the operation to use for this request. Possible values include: + * '2021-10-04' */ - pathRenameMode?: PathRenameMode; + version?: Version; } /** @@ -794,9 +954,9 @@ export interface ServiceListContainersSegmentOptionalParams { maxresults?: number; /** * Include this parameter to specify that the container's metadata be returned as part of the - * response body. Possible values include: '', 'metadata', 'deleted' + * response body. */ - include?: ListContainersIncludeType; + include?: ListContainersIncludeType[]; /** * The timeout parameter is expressed in seconds. For more information, see Setting @@ -844,6 +1004,49 @@ export interface ServiceSubmitBatchOptionalParams { requestId?: string; } +/** + * Optional Parameters. + */ +export interface ServiceFilterBlobsOptionalParams { + /** + * The timeout parameter is expressed in seconds. For more information, see Setting + * Timeouts for Blob Service Operations. + */ + timeout?: number; + /** + * Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the + * analytics logs when storage analytics logging is enabled. + */ + requestId?: string; + /** + * Filters the results to return only to return only blobs whose tags match the specified + * expression. + */ + where?: string; + /** + * A string value that identifies the portion of the list of containers to be returned with the + * next listing operation. The operation returns the NextMarker value within the response body if + * the listing operation did not return all containers remaining to be listed with the current + * page. The NextMarker value can be used as the value for the marker parameter in a subsequent + * call to request the next page of list items. The marker value is opaque to the client. + */ + marker?: string; + /** + * Specifies the maximum number of containers to return. If the request does not specify + * maxresults, or specifies a value greater than 5000, the server will return up to 5000 items. + * Note that if the listing operation crosses a partition boundary, then the service will return + * a continuation token for retrieving the remainder of the results. For this reason, it is + * possible that the service will return fewer results than specified by maxresults, or than the + * default of 5000. + */ + maxresults?: number; + /** + * Include this parameter to specify one or more datasets to include in the response. + */ + include?: FilterBlobsIncludeItem[]; +} + /** * Optional Parameters. */ @@ -874,6 +1077,10 @@ export interface ContainerCreateOptionalParams { * analytics logs when storage analytics logging is enabled. */ requestId?: string; + /** + * Additional parameters for the operation + */ + containerCpkScopeInfo?: ContainerCpkScopeInfo; } /** @@ -900,7 +1107,7 @@ export interface ContainerGetPropertiesOptionalParams { /** * Optional Parameters. */ -export interface ContainerGetPropertiesWithHeadOptionalParams { +export interface ContainerGetProperties1OptionalParams { /** * The timeout parameter is expressed in seconds. For more information, see Setting @@ -1036,7 +1243,7 @@ export interface ContainerSetAccessPolicyOptionalParams { /** * Optional Parameters. */ -export interface ContainerSubmitBatchOptionalParams { +export interface ContainerRestoreOptionalParams { /** * The timeout parameter is expressed in seconds. For more information, see Setting @@ -1048,45 +1255,44 @@ export interface ContainerSubmitBatchOptionalParams { * analytics logs when storage analytics logging is enabled. */ requestId?: string; + /** + * Optional. Version 2019-12-12 and later. Specifies the name of the deleted container to + * restore. + */ + deletedContainerName?: string; + /** + * Optional. Version 2019-12-12 and later. Specifies the version of the deleted container to + * restore. + */ + deletedContainerVersion?: string; } /** * Optional Parameters. */ -export interface ContainerAcquireLeaseOptionalParams { +export interface ContainerRenameOptionalParams { /** * The timeout parameter is expressed in seconds. For more information, see Setting * Timeouts for Blob Service Operations. */ timeout?: number; - /** - * Specifies the duration of the lease, in seconds, or negative one (-1) for a lease that never - * expires. A non-infinite lease can be between 15 and 60 seconds. A lease duration cannot be - * changed using renew or change. - */ - duration?: number; - /** - * Proposed lease ID, in a GUID string format. The Blob service returns 400 (Invalid request) if - * the proposed lease ID is not in the correct format. See Guid Constructor (String) for a list - * of valid GUID string formats. - */ - proposedLeaseId?: string; /** * Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the * analytics logs when storage analytics logging is enabled. */ requestId?: string; /** - * Additional parameters for the operation + * A lease ID for the source path. If specified, the source path must have an active lease and + * the lease ID must match. */ - modifiedAccessConditions?: ModifiedAccessConditions; + sourceLeaseId?: string; } /** * Optional Parameters. */ -export interface ContainerReleaseLeaseOptionalParams { +export interface ContainerSubmitBatchOptionalParams { /** * The timeout parameter is expressed in seconds. For more information, see Setting @@ -1098,7 +1304,100 @@ export interface ContainerReleaseLeaseOptionalParams { * analytics logs when storage analytics logging is enabled. */ requestId?: string; - /** +} + +/** + * Optional Parameters. + */ +export interface ContainerFilterBlobsOptionalParams { + /** + * The timeout parameter is expressed in seconds. For more information, see Setting + * Timeouts for Blob Service Operations. + */ + timeout?: number; + /** + * Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the + * analytics logs when storage analytics logging is enabled. + */ + requestId?: string; + /** + * Filters the results to return only to return only blobs whose tags match the specified + * expression. + */ + where?: string; + /** + * A string value that identifies the portion of the list of containers to be returned with the + * next listing operation. The operation returns the NextMarker value within the response body if + * the listing operation did not return all containers remaining to be listed with the current + * page. The NextMarker value can be used as the value for the marker parameter in a subsequent + * call to request the next page of list items. The marker value is opaque to the client. + */ + marker?: string; + /** + * Specifies the maximum number of containers to return. If the request does not specify + * maxresults, or specifies a value greater than 5000, the server will return up to 5000 items. + * Note that if the listing operation crosses a partition boundary, then the service will return + * a continuation token for retrieving the remainder of the results. For this reason, it is + * possible that the service will return fewer results than specified by maxresults, or than the + * default of 5000. + */ + maxresults?: number; + /** + * Include this parameter to specify one or more datasets to include in the response. + */ + include?: FilterBlobsIncludeItem[]; +} + +/** + * Optional Parameters. + */ +export interface ContainerAcquireLeaseOptionalParams { + /** + * The timeout parameter is expressed in seconds. For more information, see Setting + * Timeouts for Blob Service Operations. + */ + timeout?: number; + /** + * Specifies the duration of the lease, in seconds, or negative one (-1) for a lease that never + * expires. A non-infinite lease can be between 15 and 60 seconds. A lease duration cannot be + * changed using renew or change. + */ + duration?: number; + /** + * Proposed lease ID, in a GUID string format. The Blob service returns 400 (Invalid request) if + * the proposed lease ID is not in the correct format. See Guid Constructor (String) for a list + * of valid GUID string formats. + */ + proposedLeaseId?: string; + /** + * Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the + * analytics logs when storage analytics logging is enabled. + */ + requestId?: string; + /** + * Additional parameters for the operation + */ + modifiedAccessConditions?: ModifiedAccessConditions; +} + +/** + * Optional Parameters. + */ +export interface ContainerReleaseLeaseOptionalParams { + /** + * The timeout parameter is expressed in seconds. For more information, see Setting + * Timeouts for Blob Service Operations. + */ + timeout?: number; + /** + * Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the + * analytics logs when storage analytics logging is enabled. + */ + requestId?: string; + /** * Additional parameters for the operation */ modifiedAccessConditions?: ModifiedAccessConditions; @@ -1264,7 +1563,19 @@ export interface ContainerListBlobHierarchySegmentOptionalParams { /** * Optional Parameters. */ -export interface DirectoryCreateOptionalParams { +export interface BlobDownloadOptionalParams { + /** + * The snapshot parameter is an opaque DateTime value that, when present, specifies the blob + * snapshot to retrieve. For more information on working with blob snapshots, see Creating + * a Snapshot of a Blob. + */ + snapshot?: string; + /** + * The version id parameter is an opaque DateTime value that, when present, specifies the version + * of the blob to operate on. It's for service version 2019-10-10 and newer. + */ + versionId?: string; /** * The timeout parameter is expressed in seconds. For more information, see Setting @@ -1272,27 +1583,19 @@ export interface DirectoryCreateOptionalParams { */ timeout?: number; /** - * Optional. User-defined properties to be stored with the file or directory, in the format of a - * comma-separated list of name and value pairs "n1=v1, n2=v2, ...", where each value is base64 - * encoded. + * Return only the bytes of the blob in the specified range. */ - directoryProperties?: string; + range?: string; /** - * Optional and only valid if Hierarchical Namespace is enabled for the account. Sets POSIX - * access permissions for the file owner, the file owning group, and others. Each class may be - * granted read, write, or execute permission. The sticky bit is also supported. Both symbolic - * (rwxrw-rw-) and 4-digit octal notation (e.g. 0766) are supported. + * When set to true and specified together with the Range, the service returns the MD5 hash for + * the range, as long as the range is less than or equal to 4 MB in size. */ - posixPermissions?: string; + rangeGetContentMD5?: boolean; /** - * Only valid if Hierarchical Namespace is enabled for the account. This umask restricts - * permission settings for file and directory, and will only be applied when default Acl does not - * exist in parent directory. If the umask bit has set, it means that the corresponding - * permission will be disabled. Otherwise the corresponding permission will be determined by the - * permission. A 4-digit octal notation (e.g. 0022) is supported here. If no umask was specified, - * a default umask - 0027 will be used. + * When set to true and specified together with the Range, the service returns the CRC64 hash for + * the range, as long as the range is less than or equal to 4 MB in size. */ - posixUmask?: string; + rangeGetContentCRC64?: boolean; /** * Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the * analytics logs when storage analytics logging is enabled. @@ -1301,11 +1604,11 @@ export interface DirectoryCreateOptionalParams { /** * Additional parameters for the operation */ - directoryHttpHeaders?: DirectoryHttpHeaders; + leaseAccessConditions?: LeaseAccessConditions; /** * Additional parameters for the operation */ - leaseAccessConditions?: LeaseAccessConditions; + cpkInfo?: CpkInfo; /** * Additional parameters for the operation */ @@ -1315,57 +1618,30 @@ export interface DirectoryCreateOptionalParams { /** * Optional Parameters. */ -export interface DirectoryRenameOptionalParams { - /** - * The timeout parameter is expressed in seconds. For more information, see Setting - * Timeouts for Blob Service Operations. - */ - timeout?: number; - /** - * When renaming a directory, the number of paths that are renamed with each invocation is - * limited. If the number of paths to be renamed exceeds this limit, a continuation token is - * returned in this response header. When a continuation token is returned in the response, it - * must be specified in a subsequent invocation of the rename operation to continue renaming the - * directory. - */ - marker?: string; - /** - * Optional. User-defined properties to be stored with the file or directory, in the format of a - * comma-separated list of name and value pairs "n1=v1, n2=v2, ...", where each value is base64 - * encoded. - */ - directoryProperties?: string; +export interface BlobGetPropertiesOptionalParams { /** - * Optional and only valid if Hierarchical Namespace is enabled for the account. Sets POSIX - * access permissions for the file owner, the file owning group, and others. Each class may be - * granted read, write, or execute permission. The sticky bit is also supported. Both symbolic - * (rwxrw-rw-) and 4-digit octal notation (e.g. 0766) are supported. + * The snapshot parameter is an opaque DateTime value that, when present, specifies the blob + * snapshot to retrieve. For more information on working with blob snapshots, see Creating + * a Snapshot of a Blob. */ - posixPermissions?: string; + snapshot?: string; /** - * Only valid if Hierarchical Namespace is enabled for the account. This umask restricts - * permission settings for file and directory, and will only be applied when default Acl does not - * exist in parent directory. If the umask bit has set, it means that the corresponding - * permission will be disabled. Otherwise the corresponding permission will be determined by the - * permission. A 4-digit octal notation (e.g. 0022) is supported here. If no umask was specified, - * a default umask - 0027 will be used. + * The version id parameter is an opaque DateTime value that, when present, specifies the version + * of the blob to operate on. It's for service version 2019-10-10 and newer. */ - posixUmask?: string; + versionId?: string; /** - * A lease ID for the source path. If specified, the source path must have an active lease and - * the leaase ID must match. + * The timeout parameter is expressed in seconds. For more information, see Setting + * Timeouts for Blob Service Operations. */ - sourceLeaseId?: string; + timeout?: number; /** * Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the * analytics logs when storage analytics logging is enabled. */ requestId?: string; - /** - * Additional parameters for the operation - */ - directoryHttpHeaders?: DirectoryHttpHeaders; /** * Additional parameters for the operation */ @@ -1373,17 +1649,29 @@ export interface DirectoryRenameOptionalParams { /** * Additional parameters for the operation */ - modifiedAccessConditions?: ModifiedAccessConditions; + cpkInfo?: CpkInfo; /** * Additional parameters for the operation */ - sourceModifiedAccessConditions?: SourceModifiedAccessConditions; + modifiedAccessConditions?: ModifiedAccessConditions; } /** * Optional Parameters. */ -export interface DirectoryDeleteMethodOptionalParams { +export interface BlobDeleteMethodOptionalParams { + /** + * The snapshot parameter is an opaque DateTime value that, when present, specifies the blob + * snapshot to retrieve. For more information on working with blob snapshots, see Creating + * a Snapshot of a Blob. + */ + snapshot?: string; + /** + * The version id parameter is an opaque DateTime value that, when present, specifies the version + * of the blob to operate on. It's for service version 2019-10-10 and newer. + */ + versionId?: string; /** * The timeout parameter is expressed in seconds. For more information, see Setting @@ -1391,18 +1679,21 @@ export interface DirectoryDeleteMethodOptionalParams { */ timeout?: number; /** - * When renaming a directory, the number of paths that are renamed with each invocation is - * limited. If the number of paths to be renamed exceeds this limit, a continuation token is - * returned in this response header. When a continuation token is returned in the response, it - * must be specified in a subsequent invocation of the rename operation to continue renaming the - * directory. + * Required if the blob has associated snapshots. Specify one of the following two options: + * include: Delete the base blob and all of its snapshots. only: Delete only the blob's snapshots + * and not the blob itself. Possible values include: 'include', 'only' */ - marker?: string; + deleteSnapshots?: DeleteSnapshotsOptionType; /** * Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the * analytics logs when storage analytics logging is enabled. */ requestId?: string; + /** + * Optional. Only possible value is 'permanent', which specifies to permanently delete a blob if + * blob soft delete is enabled. Possible values include: 'Permanent' + */ + blobDeleteType?: BlobDeleteType; /** * Additional parameters for the operation */ @@ -1416,112 +1707,51 @@ export interface DirectoryDeleteMethodOptionalParams { /** * Optional Parameters. */ -export interface DirectorySetAccessControlOptionalParams { +export interface BlobUndeleteOptionalParams { /** * The timeout parameter is expressed in seconds. For more information, see Setting * Timeouts for Blob Service Operations. */ timeout?: number; - /** - * Optional. The owner of the blob or directory. - */ - owner?: string; - /** - * Optional. The owning group of the blob or directory. - */ - group?: string; - /** - * Optional and only valid if Hierarchical Namespace is enabled for the account. Sets POSIX - * access permissions for the file owner, the file owning group, and others. Each class may be - * granted read, write, or execute permission. The sticky bit is also supported. Both symbolic - * (rwxrw-rw-) and 4-digit octal notation (e.g. 0766) are supported. - */ - posixPermissions?: string; - /** - * Sets POSIX access control rights on files and directories. The value is a comma-separated list - * of access control entries. Each access control entry (ACE) consists of a scope, a type, a user - * or group identifier, and permissions in the format "[scope:][type]:[id]:[permissions]". - */ - posixAcl?: string; /** * Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the * analytics logs when storage analytics logging is enabled. */ requestId?: string; - /** - * Additional parameters for the operation - */ - leaseAccessConditions?: LeaseAccessConditions; - /** - * Additional parameters for the operation - */ - modifiedAccessConditions?: ModifiedAccessConditions; } /** * Optional Parameters. */ -export interface DirectoryGetAccessControlOptionalParams { +export interface BlobSetExpiryOptionalParams { /** * The timeout parameter is expressed in seconds. For more information, see Setting * Timeouts for Blob Service Operations. */ timeout?: number; - /** - * Optional. Valid only when Hierarchical Namespace is enabled for the account. If "true", the - * identity values returned in the x-ms-owner, x-ms-group, and x-ms-acl response headers will be - * transformed from Azure Active Directory Object IDs to User Principal Names. If "false", the - * values will be returned as Azure Active Directory Object IDs. The default value is false. - */ - upn?: boolean; /** * Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the * analytics logs when storage analytics logging is enabled. */ requestId?: string; /** - * Additional parameters for the operation - */ - leaseAccessConditions?: LeaseAccessConditions; - /** - * Additional parameters for the operation + * The time to set the blob to expiry */ - modifiedAccessConditions?: ModifiedAccessConditions; + expiresOn?: string; } /** * Optional Parameters. */ -export interface BlobDownloadOptionalParams { - /** - * The snapshot parameter is an opaque DateTime value that, when present, specifies the blob - * snapshot to retrieve. For more information on working with blob snapshots, see Creating - * a Snapshot of a Blob. - */ - snapshot?: string; +export interface BlobSetHTTPHeadersOptionalParams { /** * The timeout parameter is expressed in seconds. For more information, see Setting * Timeouts for Blob Service Operations. */ timeout?: number; - /** - * Return only the bytes of the blob in the specified range. - */ - range?: string; - /** - * When set to true and specified together with the Range, the service returns the MD5 hash for - * the range, as long as the range is less than or equal to 4 MB in size. - */ - rangeGetContentMD5?: boolean; - /** - * When set to true and specified together with the Range, the service returns the CRC64 hash for - * the range, as long as the range is less than or equal to 4 MB in size. - */ - rangeGetContentCRC64?: boolean; /** * Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the * analytics logs when storage analytics logging is enabled. @@ -1530,11 +1760,11 @@ export interface BlobDownloadOptionalParams { /** * Additional parameters for the operation */ - leaseAccessConditions?: LeaseAccessConditions; + blobHTTPHeaders?: BlobHTTPHeaders; /** * Additional parameters for the operation */ - cpkInfo?: CpkInfo; + leaseAccessConditions?: LeaseAccessConditions; /** * Additional parameters for the operation */ @@ -1544,14 +1774,7 @@ export interface BlobDownloadOptionalParams { /** * Optional Parameters. */ -export interface BlobGetPropertiesOptionalParams { - /** - * The snapshot parameter is an opaque DateTime value that, when present, specifies the blob - * snapshot to retrieve. For more information on working with blob snapshots, see Creating - * a Snapshot of a Blob. - */ - snapshot?: string; +export interface BlobSetImmutabilityPolicyOptionalParams { /** * The timeout parameter is expressed in seconds. For more information, see Setting @@ -1564,13 +1787,14 @@ export interface BlobGetPropertiesOptionalParams { */ requestId?: string; /** - * Additional parameters for the operation + * Specifies the date time when the blobs immutability policy is set to expire. */ - leaseAccessConditions?: LeaseAccessConditions; + immutabilityPolicyExpiry?: Date; /** - * Additional parameters for the operation + * Specifies the immutability policy mode to set on the blob. Possible values include: 'Mutable', + * 'Unlocked', 'Locked' */ - cpkInfo?: CpkInfo; + immutabilityPolicyMode?: BlobImmutabilityPolicyMode; /** * Additional parameters for the operation */ @@ -1580,223 +1804,35 @@ export interface BlobGetPropertiesOptionalParams { /** * Optional Parameters. */ -export interface BlobDeleteMethodOptionalParams { - /** - * The snapshot parameter is an opaque DateTime value that, when present, specifies the blob - * snapshot to retrieve. For more information on working with blob snapshots, see Creating - * a Snapshot of a Blob. - */ - snapshot?: string; +export interface BlobDeleteImmutabilityPolicyOptionalParams { /** * The timeout parameter is expressed in seconds. For more information, see Setting * Timeouts for Blob Service Operations. */ timeout?: number; - /** - * Required if the blob has associated snapshots. Specify one of the following two options: - * include: Delete the base blob and all of its snapshots. only: Delete only the blob's snapshots - * and not the blob itself. Possible values include: 'include', 'only' - */ - deleteSnapshots?: DeleteSnapshotsOptionType; /** * Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the * analytics logs when storage analytics logging is enabled. */ requestId?: string; - /** - * Additional parameters for the operation - */ - leaseAccessConditions?: LeaseAccessConditions; - /** - * Additional parameters for the operation - */ - modifiedAccessConditions?: ModifiedAccessConditions; } /** * Optional Parameters. */ -export interface BlobSetAccessControlOptionalParams { +export interface BlobSetLegalHoldOptionalParams { /** * The timeout parameter is expressed in seconds. For more information, see Setting * Timeouts for Blob Service Operations. */ timeout?: number; - /** - * Optional. The owner of the blob or directory. - */ - owner?: string; - /** - * Optional. The owning group of the blob or directory. - */ - group?: string; - /** - * Optional and only valid if Hierarchical Namespace is enabled for the account. Sets POSIX - * access permissions for the file owner, the file owning group, and others. Each class may be - * granted read, write, or execute permission. The sticky bit is also supported. Both symbolic - * (rwxrw-rw-) and 4-digit octal notation (e.g. 0766) are supported. - */ - posixPermissions?: string; - /** - * Sets POSIX access control rights on files and directories. The value is a comma-separated list - * of access control entries. Each access control entry (ACE) consists of a scope, a type, a user - * or group identifier, and permissions in the format "[scope:][type]:[id]:[permissions]". - */ - posixAcl?: string; /** * Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the * analytics logs when storage analytics logging is enabled. */ requestId?: string; - /** - * Additional parameters for the operation - */ - leaseAccessConditions?: LeaseAccessConditions; - /** - * Additional parameters for the operation - */ - modifiedAccessConditions?: ModifiedAccessConditions; -} - -/** - * Optional Parameters. - */ -export interface BlobGetAccessControlOptionalParams { - /** - * The timeout parameter is expressed in seconds. For more information, see Setting - * Timeouts for Blob Service Operations. - */ - timeout?: number; - /** - * Optional. Valid only when Hierarchical Namespace is enabled for the account. If "true", the - * identity values returned in the x-ms-owner, x-ms-group, and x-ms-acl response headers will be - * transformed from Azure Active Directory Object IDs to User Principal Names. If "false", the - * values will be returned as Azure Active Directory Object IDs. The default value is false. - */ - upn?: boolean; - /** - * Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the - * analytics logs when storage analytics logging is enabled. - */ - requestId?: string; - /** - * Additional parameters for the operation - */ - leaseAccessConditions?: LeaseAccessConditions; - /** - * Additional parameters for the operation - */ - modifiedAccessConditions?: ModifiedAccessConditions; -} - -/** - * Optional Parameters. - */ -export interface BlobRenameOptionalParams { - /** - * The timeout parameter is expressed in seconds. For more information, see Setting - * Timeouts for Blob Service Operations. - */ - timeout?: number; - /** - * Optional. User-defined properties to be stored with the file or directory, in the format of a - * comma-separated list of name and value pairs "n1=v1, n2=v2, ...", where each value is base64 - * encoded. - */ - directoryProperties?: string; - /** - * Optional and only valid if Hierarchical Namespace is enabled for the account. Sets POSIX - * access permissions for the file owner, the file owning group, and others. Each class may be - * granted read, write, or execute permission. The sticky bit is also supported. Both symbolic - * (rwxrw-rw-) and 4-digit octal notation (e.g. 0766) are supported. - */ - posixPermissions?: string; - /** - * Only valid if Hierarchical Namespace is enabled for the account. This umask restricts - * permission settings for file and directory, and will only be applied when default Acl does not - * exist in parent directory. If the umask bit has set, it means that the corresponding - * permission will be disabled. Otherwise the corresponding permission will be determined by the - * permission. A 4-digit octal notation (e.g. 0022) is supported here. If no umask was specified, - * a default umask - 0027 will be used. - */ - posixUmask?: string; - /** - * A lease ID for the source path. If specified, the source path must have an active lease and - * the leaase ID must match. - */ - sourceLeaseId?: string; - /** - * Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the - * analytics logs when storage analytics logging is enabled. - */ - requestId?: string; - /** - * Additional parameters for the operation - */ - directoryHttpHeaders?: DirectoryHttpHeaders; - /** - * Additional parameters for the operation - */ - leaseAccessConditions?: LeaseAccessConditions; - /** - * Additional parameters for the operation - */ - modifiedAccessConditions?: ModifiedAccessConditions; - /** - * Additional parameters for the operation - */ - sourceModifiedAccessConditions?: SourceModifiedAccessConditions; -} - -/** - * Optional Parameters. - */ -export interface BlobUndeleteOptionalParams { - /** - * The timeout parameter is expressed in seconds. For more information, see Setting - * Timeouts for Blob Service Operations. - */ - timeout?: number; - /** - * Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the - * analytics logs when storage analytics logging is enabled. - */ - requestId?: string; -} - -/** - * Optional Parameters. - */ -export interface BlobSetHTTPHeadersOptionalParams { - /** - * The timeout parameter is expressed in seconds. For more information, see Setting - * Timeouts for Blob Service Operations. - */ - timeout?: number; - /** - * Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the - * analytics logs when storage analytics logging is enabled. - */ - requestId?: string; - /** - * Additional parameters for the operation - */ - blobHTTPHeaders?: BlobHTTPHeaders; - /** - * Additional parameters for the operation - */ - leaseAccessConditions?: LeaseAccessConditions; - /** - * Additional parameters for the operation - */ - modifiedAccessConditions?: ModifiedAccessConditions; } /** @@ -1832,6 +1868,10 @@ export interface BlobSetMetadataOptionalParams { * Additional parameters for the operation */ cpkInfo?: CpkInfo; + /** + * Additional parameters for the operation + */ + cpkScopeInfo?: CpkScopeInfo; /** * Additional parameters for the operation */ @@ -1994,6 +2034,10 @@ export interface BlobCreateSnapshotOptionalParams { * Additional parameters for the operation */ cpkInfo?: CpkInfo; + /** + * Additional parameters for the operation + */ + cpkScopeInfo?: CpkScopeInfo; /** * Additional parameters for the operation */ @@ -2026,7 +2070,8 @@ export interface BlobStartCopyFromURLOptionalParams { metadata?: { [propertyName: string]: string }; /** * Optional. Indicates the tier to be set on the blob. Possible values include: 'P4', 'P6', - * 'P10', 'P15', 'P20', 'P30', 'P40', 'P50', 'P60', 'P70', 'P80', 'Hot', 'Cool', 'Archive' + * 'P10', 'P15', 'P20', 'P30', 'P40', 'P50', 'P60', 'P70', 'P80', 'Hot', 'Cool', 'Archive', + * 'Premium' */ tier?: AccessTier; /** @@ -2039,6 +2084,27 @@ export interface BlobStartCopyFromURLOptionalParams { * analytics logs when storage analytics logging is enabled. */ requestId?: string; + /** + * Optional. Used to set blob tags in various blob operations. + */ + blobTagsString?: string; + /** + * Overrides the sealed state of the destination blob. Service version 2019-12-12 and newer. + */ + sealBlob?: boolean; + /** + * Specifies the date time when the blobs immutability policy is set to expire. + */ + immutabilityPolicyExpiry?: Date; + /** + * Specifies the immutability policy mode to set on the blob. Possible values include: 'Mutable', + * 'Unlocked', 'Locked' + */ + immutabilityPolicyMode?: BlobImmutabilityPolicyMode; + /** + * Specified if a legal hold should be set on the blob. + */ + legalHold?: boolean; /** * Additional parameters for the operation */ @@ -2075,7 +2141,8 @@ export interface BlobCopyFromURLOptionalParams { metadata?: { [propertyName: string]: string }; /** * Optional. Indicates the tier to be set on the blob. Possible values include: 'P4', 'P6', - * 'P10', 'P15', 'P20', 'P30', 'P40', 'P50', 'P60', 'P70', 'P80', 'Hot', 'Cool', 'Archive' + * 'P10', 'P15', 'P20', 'P30', 'P40', 'P50', 'P60', 'P70', 'P80', 'Hot', 'Cool', 'Archive', + * 'Premium' */ tier?: AccessTier; /** @@ -2083,6 +2150,37 @@ export interface BlobCopyFromURLOptionalParams { * analytics logs when storage analytics logging is enabled. */ requestId?: string; + /** + * Specify the md5 calculated for the range of bytes that must be read from the copy source. + */ + sourceContentMD5?: Uint8Array; + /** + * Optional. Used to set blob tags in various blob operations. + */ + blobTagsString?: string; + /** + * Specifies the date time when the blobs immutability policy is set to expire. + */ + immutabilityPolicyExpiry?: Date; + /** + * Specifies the immutability policy mode to set on the blob. Possible values include: 'Mutable', + * 'Unlocked', 'Locked' + */ + immutabilityPolicyMode?: BlobImmutabilityPolicyMode; + /** + * Specified if a legal hold should be set on the blob. + */ + legalHold?: boolean; + /** + * Only Bearer type is supported. Credentials should be a valid OAuth access token to copy + * source. + */ + copySourceAuthorization?: string; + /** + * Optional, default 'replace'. Indicates if source tags should be copied or replaced with the + * tags specified by x-ms-tags. Possible values include: 'REPLACE', 'COPY' + */ + copySourceTags?: BlobCopySourceTags; /** * Additional parameters for the operation */ @@ -2095,6 +2193,10 @@ export interface BlobCopyFromURLOptionalParams { * Additional parameters for the operation */ leaseAccessConditions?: LeaseAccessConditions; + /** + * Additional parameters for the operation + */ + cpkScopeInfo?: CpkScopeInfo; } /** @@ -2122,6 +2224,18 @@ export interface BlobAbortCopyFromURLOptionalParams { * Optional Parameters. */ export interface BlobSetTierOptionalParams { + /** + * The snapshot parameter is an opaque DateTime value that, when present, specifies the blob + * snapshot to retrieve. For more information on working with blob snapshots, see Creating + * a Snapshot of a Blob. + */ + snapshot?: string; + /** + * The version id parameter is an opaque DateTime value that, when present, specifies the version + * of the blob to operate on. It's for service version 2019-10-10 and newer. + */ + versionId?: string; /** * The timeout parameter is expressed in seconds. For more information, see Setting @@ -2142,49 +2256,38 @@ export interface BlobSetTierOptionalParams { * Additional parameters for the operation */ leaseAccessConditions?: LeaseAccessConditions; + /** + * Additional parameters for the operation + */ + modifiedAccessConditions?: ModifiedAccessConditions; } /** * Optional Parameters. */ -export interface PageBlobCreateOptionalParams { - /** - * The timeout parameter is expressed in seconds. For more information, see Setting - * Timeouts for Blob Service Operations. - */ - timeout?: number; +export interface BlobQueryOptionalParams { /** - * Optional. Specifies a user-defined name-value pair associated with the blob. If no name-value - * pairs are specified, the operation will copy the metadata from the source blob or file to the - * destination blob. If one or more name-value pairs are specified, the destination blob is - * created with the specified metadata, and metadata is not copied from the source blob or file. - * Note that beginning with version 2009-09-19, metadata names must adhere to the naming rules - * for C# identifiers. See Naming and Referencing Containers, Blobs, and Metadata for more - * information. + * the query request */ - metadata?: { [propertyName: string]: string }; + queryRequest?: QueryRequest; /** - * Set for page blobs only. The sequence number is a user-controlled value that you can use to - * track requests. The value of the sequence number must be between 0 and 2^63 - 1. Default - * value: 0. + * The snapshot parameter is an opaque DateTime value that, when present, specifies the blob + * snapshot to retrieve. For more information on working with blob snapshots, see Creating + * a Snapshot of a Blob. */ - blobSequenceNumber?: number; + snapshot?: string; /** - * Set for page blobs only. For page blobs on a premium storage account only. Specifies the tier - * to be set on the blob. Possible values include: 'P4', 'P6', 'P10', 'P15', 'P20', 'P30', 'P40', - * 'P50', 'P60', 'P70', 'P80' + * The timeout parameter is expressed in seconds. For more information, see Setting + * Timeouts for Blob Service Operations. */ - pageBlobAccessTier?: PageBlobAccessTier; + timeout?: number; /** * Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the * analytics logs when storage analytics logging is enabled. */ requestId?: string; - /** - * Additional parameters for the operation - */ - blobHTTPHeaders?: BlobHTTPHeaders; /** * Additional parameters for the operation */ @@ -2202,48 +2305,44 @@ export interface PageBlobCreateOptionalParams { /** * Optional Parameters. */ -export interface PageBlobUploadPagesOptionalParams { - /** - * Specify the transactional crc64 for the body, to be validated by the service. - */ - transactionalContentCrc64?: Uint8Array; +export interface BlobGetTagsOptionalParams { /** * The timeout parameter is expressed in seconds. For more information, see Setting * Timeouts for Blob Service Operations. */ timeout?: number; - /** - * Return only the bytes of the blob in the specified range. - */ - range?: string; /** * Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the * analytics logs when storage analytics logging is enabled. */ requestId?: string; /** - * Additional parameters for the operation + * The snapshot parameter is an opaque DateTime value that, when present, specifies the blob + * snapshot to retrieve. For more information on working with blob snapshots, see Creating + * a Snapshot of a Blob. */ - leaseAccessConditions?: LeaseAccessConditions; + snapshot?: string; /** - * Additional parameters for the operation + * The version id parameter is an opaque DateTime value that, when present, specifies the version + * of the blob to operate on. It's for service version 2019-10-10 and newer. */ - cpkInfo?: CpkInfo; + versionId?: string; /** * Additional parameters for the operation */ - sequenceNumberAccessConditions?: SequenceNumberAccessConditions; + modifiedAccessConditions?: ModifiedAccessConditions; /** * Additional parameters for the operation */ - modifiedAccessConditions?: ModifiedAccessConditions; + leaseAccessConditions?: LeaseAccessConditions; } /** * Optional Parameters. */ -export interface PageBlobClearPagesOptionalParams { +export interface BlobSetTagsOptionalParams { /** * The timeout parameter is expressed in seconds. For more information, see Setting @@ -2251,44 +2350,41 @@ export interface PageBlobClearPagesOptionalParams { */ timeout?: number; /** - * Return only the bytes of the blob in the specified range. + * The version id parameter is an opaque DateTime value that, when present, specifies the version + * of the blob to operate on. It's for service version 2019-10-10 and newer. */ - range?: string; + versionId?: string; + /** + * Specify the transactional md5 for the body, to be validated by the service. + */ + transactionalContentMD5?: Uint8Array; + /** + * Specify the transactional crc64 for the body, to be validated by the service. + */ + transactionalContentCrc64?: Uint8Array; /** * Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the * analytics logs when storage analytics logging is enabled. */ requestId?: string; /** - * Additional parameters for the operation - */ - leaseAccessConditions?: LeaseAccessConditions; - /** - * Additional parameters for the operation + * Blob tags */ - cpkInfo?: CpkInfo; + tags?: BlobTags; /** * Additional parameters for the operation */ - sequenceNumberAccessConditions?: SequenceNumberAccessConditions; + modifiedAccessConditions?: ModifiedAccessConditions; /** * Additional parameters for the operation */ - modifiedAccessConditions?: ModifiedAccessConditions; + leaseAccessConditions?: LeaseAccessConditions; } /** * Optional Parameters. */ -export interface PageBlobUploadPagesFromURLOptionalParams { - /** - * Specify the md5 calculated for the range of bytes that must be read from the copy source. - */ - sourceContentMD5?: Uint8Array; - /** - * Specify the crc64 calculated for the range of bytes that must be read from the copy source. - */ - sourceContentcrc64?: Uint8Array; +export interface PageBlobCreateOptionalParams { /** * The timeout parameter is expressed in seconds. For more information, see Setting @@ -2296,17 +2392,199 @@ export interface PageBlobUploadPagesFromURLOptionalParams { */ timeout?: number; /** - * Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the - * analytics logs when storage analytics logging is enabled. - */ - requestId?: string; - /** - * Additional parameters for the operation + * Optional. Indicates the tier to be set on the page blob. Possible values include: 'P4', 'P6', + * 'P10', 'P15', 'P20', 'P30', 'P40', 'P50', 'P60', 'P70', 'P80' */ - cpkInfo?: CpkInfo; + tier?: PremiumPageBlobAccessTier; /** - * Additional parameters for the operation - */ + * Optional. Specifies a user-defined name-value pair associated with the blob. If no name-value + * pairs are specified, the operation will copy the metadata from the source blob or file to the + * destination blob. If one or more name-value pairs are specified, the destination blob is + * created with the specified metadata, and metadata is not copied from the source blob or file. + * Note that beginning with version 2009-09-19, metadata names must adhere to the naming rules + * for C# identifiers. See Naming and Referencing Containers, Blobs, and Metadata for more + * information. + */ + metadata?: { [propertyName: string]: string }; + /** + * Set for page blobs only. The sequence number is a user-controlled value that you can use to + * track requests. The value of the sequence number must be between 0 and 2^63 - 1. Default + * value: 0. + */ + blobSequenceNumber?: number; + /** + * Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the + * analytics logs when storage analytics logging is enabled. + */ + requestId?: string; + /** + * Optional. Used to set blob tags in various blob operations. + */ + blobTagsString?: string; + /** + * Specifies the date time when the blobs immutability policy is set to expire. + */ + immutabilityPolicyExpiry?: Date; + /** + * Specifies the immutability policy mode to set on the blob. Possible values include: 'Mutable', + * 'Unlocked', 'Locked' + */ + immutabilityPolicyMode?: BlobImmutabilityPolicyMode; + /** + * Specified if a legal hold should be set on the blob. + */ + legalHold?: boolean; + /** + * Additional parameters for the operation + */ + blobHTTPHeaders?: BlobHTTPHeaders; + /** + * Additional parameters for the operation + */ + leaseAccessConditions?: LeaseAccessConditions; + /** + * Additional parameters for the operation + */ + cpkInfo?: CpkInfo; + /** + * Additional parameters for the operation + */ + cpkScopeInfo?: CpkScopeInfo; + /** + * Additional parameters for the operation + */ + modifiedAccessConditions?: ModifiedAccessConditions; +} + +/** + * Optional Parameters. + */ +export interface PageBlobUploadPagesOptionalParams { + /** + * Specify the transactional md5 for the body, to be validated by the service. + */ + transactionalContentMD5?: Uint8Array; + /** + * Specify the transactional crc64 for the body, to be validated by the service. + */ + transactionalContentCrc64?: Uint8Array; + /** + * The timeout parameter is expressed in seconds. For more information, see Setting + * Timeouts for Blob Service Operations. + */ + timeout?: number; + /** + * Return only the bytes of the blob in the specified range. + */ + range?: string; + /** + * Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the + * analytics logs when storage analytics logging is enabled. + */ + requestId?: string; + /** + * Additional parameters for the operation + */ + leaseAccessConditions?: LeaseAccessConditions; + /** + * Additional parameters for the operation + */ + cpkInfo?: CpkInfo; + /** + * Additional parameters for the operation + */ + cpkScopeInfo?: CpkScopeInfo; + /** + * Additional parameters for the operation + */ + sequenceNumberAccessConditions?: SequenceNumberAccessConditions; + /** + * Additional parameters for the operation + */ + modifiedAccessConditions?: ModifiedAccessConditions; +} + +/** + * Optional Parameters. + */ +export interface PageBlobClearPagesOptionalParams { + /** + * The timeout parameter is expressed in seconds. For more information, see Setting + * Timeouts for Blob Service Operations. + */ + timeout?: number; + /** + * Return only the bytes of the blob in the specified range. + */ + range?: string; + /** + * Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the + * analytics logs when storage analytics logging is enabled. + */ + requestId?: string; + /** + * Additional parameters for the operation + */ + leaseAccessConditions?: LeaseAccessConditions; + /** + * Additional parameters for the operation + */ + cpkInfo?: CpkInfo; + /** + * Additional parameters for the operation + */ + cpkScopeInfo?: CpkScopeInfo; + /** + * Additional parameters for the operation + */ + sequenceNumberAccessConditions?: SequenceNumberAccessConditions; + /** + * Additional parameters for the operation + */ + modifiedAccessConditions?: ModifiedAccessConditions; +} + +/** + * Optional Parameters. + */ +export interface PageBlobUploadPagesFromURLOptionalParams { + /** + * Specify the md5 calculated for the range of bytes that must be read from the copy source. + */ + sourceContentMD5?: Uint8Array; + /** + * Specify the crc64 calculated for the range of bytes that must be read from the copy source. + */ + sourceContentcrc64?: Uint8Array; + /** + * The timeout parameter is expressed in seconds. For more information, see Setting + * Timeouts for Blob Service Operations. + */ + timeout?: number; + /** + * Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the + * analytics logs when storage analytics logging is enabled. + */ + requestId?: string; + /** + * Only Bearer type is supported. Credentials should be a valid OAuth access token to copy + * source. + */ + copySourceAuthorization?: string; + /** + * Additional parameters for the operation + */ + cpkInfo?: CpkInfo; + /** + * Additional parameters for the operation + */ + cpkScopeInfo?: CpkScopeInfo; + /** + * Additional parameters for the operation + */ leaseAccessConditions?: LeaseAccessConditions; /** * Additional parameters for the operation @@ -2348,6 +2626,23 @@ export interface PageBlobGetPageRangesOptionalParams { * analytics logs when storage analytics logging is enabled. */ requestId?: string; + /** + * A string value that identifies the portion of the list of containers to be returned with the + * next listing operation. The operation returns the NextMarker value within the response body if + * the listing operation did not return all containers remaining to be listed with the current + * page. The NextMarker value can be used as the value for the marker parameter in a subsequent + * call to request the next page of list items. The marker value is opaque to the client. + */ + marker?: string; + /** + * Specifies the maximum number of containers to return. If the request does not specify + * maxresults, or specifies a value greater than 5000, the server will return up to 5000 items. + * Note that if the listing operation crosses a partition boundary, then the service will return + * a continuation token for retrieving the remainder of the results. For this reason, it is + * possible that the service will return fewer results than specified by maxresults, or than the + * default of 5000. + */ + maxresults?: number; /** * Additional parameters for the operation */ @@ -2375,6 +2670,21 @@ export interface PageBlobGetPageRangesDiffOptionalParams { * Timeouts for Blob Service Operations. */ timeout?: number; + /** + * Optional in version 2015-07-08 and newer. The prevsnapshot parameter is a DateTime value that + * specifies that the response will contain only pages that were changed between target blob and + * previous snapshot. Changed pages include both updated and cleared pages. The target blob may + * be a snapshot, as long as the snapshot specified by prevsnapshot is the older of the two. Note + * that incremental snapshots are currently supported only for blobs created on or after January + * 1, 2016. + */ + prevsnapshot?: string; + /** + * Optional. This header is only supported in service versions 2019-04-19 and after and specifies + * the URL of a previous snapshot of the target blob. The response will only contain pages that + * were changed between the target blob and its previous snapshot. + */ + prevSnapshotUrl?: string; /** * Return only the bytes of the blob in the specified range. */ @@ -2384,6 +2694,23 @@ export interface PageBlobGetPageRangesDiffOptionalParams { * analytics logs when storage analytics logging is enabled. */ requestId?: string; + /** + * A string value that identifies the portion of the list of containers to be returned with the + * next listing operation. The operation returns the NextMarker value within the response body if + * the listing operation did not return all containers remaining to be listed with the current + * page. The NextMarker value can be used as the value for the marker parameter in a subsequent + * call to request the next page of list items. The marker value is opaque to the client. + */ + marker?: string; + /** + * Specifies the maximum number of containers to return. If the request does not specify + * maxresults, or specifies a value greater than 5000, the server will return up to 5000 items. + * Note that if the listing operation crosses a partition boundary, then the service will return + * a continuation token for retrieving the remainder of the results. For this reason, it is + * possible that the service will return fewer results than specified by maxresults, or than the + * default of 5000. + */ + maxresults?: number; /** * Additional parameters for the operation */ @@ -2417,6 +2744,10 @@ export interface PageBlobResizeOptionalParams { * Additional parameters for the operation */ cpkInfo?: CpkInfo; + /** + * Additional parameters for the operation + */ + cpkScopeInfo?: CpkScopeInfo; /** * Additional parameters for the operation */ @@ -2464,16 +2795,6 @@ export interface PageBlobCopyIncrementalOptionalParams { * Timeouts for Blob Service Operations. */ timeout?: number; - /** - * Optional. Specifies a user-defined name-value pair associated with the blob. If no name-value - * pairs are specified, the operation will copy the metadata from the source blob or file to the - * destination blob. If one or more name-value pairs are specified, the destination blob is - * created with the specified metadata, and metadata is not copied from the source blob or file. - * Note that beginning with version 2009-09-19, metadata names must adhere to the naming rules - * for C# identifiers. See Naming and Referencing Containers, Blobs, and Metadata for more - * information. - */ - metadata?: { [propertyName: string]: string }; /** * Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the * analytics logs when storage analytics logging is enabled. @@ -2510,6 +2831,23 @@ export interface AppendBlobCreateOptionalParams { * analytics logs when storage analytics logging is enabled. */ requestId?: string; + /** + * Optional. Used to set blob tags in various blob operations. + */ + blobTagsString?: string; + /** + * Specifies the date time when the blobs immutability policy is set to expire. + */ + immutabilityPolicyExpiry?: Date; + /** + * Specifies the immutability policy mode to set on the blob. Possible values include: 'Mutable', + * 'Unlocked', 'Locked' + */ + immutabilityPolicyMode?: BlobImmutabilityPolicyMode; + /** + * Specified if a legal hold should be set on the blob. + */ + legalHold?: boolean; /** * Additional parameters for the operation */ @@ -2522,6 +2860,10 @@ export interface AppendBlobCreateOptionalParams { * Additional parameters for the operation */ cpkInfo?: CpkInfo; + /** + * Additional parameters for the operation + */ + cpkScopeInfo?: CpkScopeInfo; /** * Additional parameters for the operation */ @@ -2538,6 +2880,10 @@ export interface AppendBlobAppendBlockOptionalParams { * Timeouts for Blob Service Operations. */ timeout?: number; + /** + * Specify the transactional md5 for the body, to be validated by the service. + */ + transactionalContentMD5?: Uint8Array; /** * Specify the transactional crc64 for the body, to be validated by the service. */ @@ -2559,6 +2905,10 @@ export interface AppendBlobAppendBlockOptionalParams { * Additional parameters for the operation */ cpkInfo?: CpkInfo; + /** + * Additional parameters for the operation + */ + cpkScopeInfo?: CpkScopeInfo; /** * Additional parameters for the operation */ @@ -2587,15 +2937,28 @@ export interface AppendBlobAppendBlockFromUrlOptionalParams { * Timeouts for Blob Service Operations. */ timeout?: number; + /** + * Specify the transactional md5 for the body, to be validated by the service. + */ + transactionalContentMD5?: Uint8Array; /** * Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the * analytics logs when storage analytics logging is enabled. */ requestId?: string; + /** + * Only Bearer type is supported. Credentials should be a valid OAuth access token to copy + * source. + */ + copySourceAuthorization?: string; /** * Additional parameters for the operation */ cpkInfo?: CpkInfo; + /** + * Additional parameters for the operation + */ + cpkScopeInfo?: CpkScopeInfo; /** * Additional parameters for the operation */ @@ -2617,7 +2980,7 @@ export interface AppendBlobAppendBlockFromUrlOptionalParams { /** * Optional Parameters. */ -export interface BlockBlobUploadOptionalParams { +export interface AppendBlobSealOptionalParams { /** * The timeout parameter is expressed in seconds. For more information, see Setting @@ -2625,18 +2988,130 @@ export interface BlockBlobUploadOptionalParams { */ timeout?: number; /** - * Optional. Specifies a user-defined name-value pair associated with the blob. If no name-value - * pairs are specified, the operation will copy the metadata from the source blob or file to the - * destination blob. If one or more name-value pairs are specified, the destination blob is - * created with the specified metadata, and metadata is not copied from the source blob or file. - * Note that beginning with version 2009-09-19, metadata names must adhere to the naming rules - * for C# identifiers. See Naming and Referencing Containers, Blobs, and Metadata for more - * information. + * Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the + * analytics logs when storage analytics logging is enabled. */ - metadata?: { [propertyName: string]: string }; + requestId?: string; + /** + * Additional parameters for the operation + */ + leaseAccessConditions?: LeaseAccessConditions; + /** + * Additional parameters for the operation + */ + modifiedAccessConditions?: ModifiedAccessConditions; + /** + * Additional parameters for the operation + */ + appendPositionAccessConditions?: AppendPositionAccessConditions; +} + +/** + * Optional Parameters. + */ +export interface BlockBlobUploadOptionalParams { + /** + * The timeout parameter is expressed in seconds. For more information, see Setting + * Timeouts for Blob Service Operations. + */ + timeout?: number; + /** + * Specify the transactional md5 for the body, to be validated by the service. + */ + transactionalContentMD5?: Uint8Array; + /** + * Optional. Specifies a user-defined name-value pair associated with the blob. If no name-value + * pairs are specified, the operation will copy the metadata from the source blob or file to the + * destination blob. If one or more name-value pairs are specified, the destination blob is + * created with the specified metadata, and metadata is not copied from the source blob or file. + * Note that beginning with version 2009-09-19, metadata names must adhere to the naming rules + * for C# identifiers. See Naming and Referencing Containers, Blobs, and Metadata for more + * information. + */ + metadata?: { [propertyName: string]: string }; + /** + * Optional. Indicates the tier to be set on the blob. Possible values include: 'P4', 'P6', + * 'P10', 'P15', 'P20', 'P30', 'P40', 'P50', 'P60', 'P70', 'P80', 'Hot', 'Cool', 'Archive', + * 'Premium' + */ + tier?: AccessTier; + /** + * Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the + * analytics logs when storage analytics logging is enabled. + */ + requestId?: string; + /** + * Optional. Used to set blob tags in various blob operations. + */ + blobTagsString?: string; + /** + * Specifies the date time when the blobs immutability policy is set to expire. + */ + immutabilityPolicyExpiry?: Date; + /** + * Specifies the immutability policy mode to set on the blob. Possible values include: 'Mutable', + * 'Unlocked', 'Locked' + */ + immutabilityPolicyMode?: BlobImmutabilityPolicyMode; + /** + * Specified if a legal hold should be set on the blob. + */ + legalHold?: boolean; + /** + * Specify the transactional crc64 for the body, to be validated by the service. + */ + transactionalContentCrc64?: Uint8Array; + /** + * Additional parameters for the operation + */ + blobHTTPHeaders?: BlobHTTPHeaders; + /** + * Additional parameters for the operation + */ + leaseAccessConditions?: LeaseAccessConditions; + /** + * Additional parameters for the operation + */ + cpkInfo?: CpkInfo; + /** + * Additional parameters for the operation + */ + cpkScopeInfo?: CpkScopeInfo; + /** + * Additional parameters for the operation + */ + modifiedAccessConditions?: ModifiedAccessConditions; +} + +/** + * Optional Parameters. + */ +export interface BlockBlobPutBlobFromUrlOptionalParams { + /** + * The timeout parameter is expressed in seconds. For more information, see Setting + * Timeouts for Blob Service Operations. + */ + timeout?: number; + /** + * Specify the transactional md5 for the body, to be validated by the service. + */ + transactionalContentMD5?: Uint8Array; + /** + * Optional. Specifies a user-defined name-value pair associated with the blob. If no name-value + * pairs are specified, the operation will copy the metadata from the source blob or file to the + * destination blob. If one or more name-value pairs are specified, the destination blob is + * created with the specified metadata, and metadata is not copied from the source blob or file. + * Note that beginning with version 2009-09-19, metadata names must adhere to the naming rules + * for C# identifiers. See Naming and Referencing Containers, Blobs, and Metadata for more + * information. + */ + metadata?: { [propertyName: string]: string }; /** * Optional. Indicates the tier to be set on the blob. Possible values include: 'P4', 'P6', - * 'P10', 'P15', 'P20', 'P30', 'P40', 'P50', 'P60', 'P70', 'P80', 'Hot', 'Cool', 'Archive' + * 'P10', 'P15', 'P20', 'P30', 'P40', 'P50', 'P60', 'P70', 'P80', 'Hot', 'Cool', 'Archive', + * 'Premium' */ tier?: AccessTier; /** @@ -2644,6 +3119,28 @@ export interface BlockBlobUploadOptionalParams { * analytics logs when storage analytics logging is enabled. */ requestId?: string; + /** + * Specify the md5 calculated for the range of bytes that must be read from the copy source. + */ + sourceContentMD5?: Uint8Array; + /** + * Optional. Used to set blob tags in various blob operations. + */ + blobTagsString?: string; + /** + * Optional, default is true. Indicates if properties from the source blob should be copied. + */ + copySourceBlobProperties?: boolean; + /** + * Only Bearer type is supported. Credentials should be a valid OAuth access token to copy + * source. + */ + copySourceAuthorization?: string; + /** + * Optional, default 'replace'. Indicates if source tags should be copied or replaced with the + * tags specified by x-ms-tags. Possible values include: 'REPLACE', 'COPY' + */ + copySourceTags?: BlobCopySourceTags; /** * Additional parameters for the operation */ @@ -2656,16 +3153,28 @@ export interface BlockBlobUploadOptionalParams { * Additional parameters for the operation */ cpkInfo?: CpkInfo; + /** + * Additional parameters for the operation + */ + cpkScopeInfo?: CpkScopeInfo; /** * Additional parameters for the operation */ modifiedAccessConditions?: ModifiedAccessConditions; + /** + * Additional parameters for the operation + */ + sourceModifiedAccessConditions?: SourceModifiedAccessConditions; } /** * Optional Parameters. */ export interface BlockBlobStageBlockOptionalParams { + /** + * Specify the transactional md5 for the body, to be validated by the service. + */ + transactionalContentMD5?: Uint8Array; /** * Specify the transactional crc64 for the body, to be validated by the service. */ @@ -2692,7 +3201,7 @@ export interface BlockBlobStageBlockOptionalParams { /** * Additional parameters for the operation */ - blobHTTPHeaders?: BlobHTTPHeaders; + cpkScopeInfo?: CpkScopeInfo; } /** @@ -2722,10 +3231,19 @@ export interface BlockBlobStageBlockFromURLOptionalParams { * analytics logs when storage analytics logging is enabled. */ requestId?: string; + /** + * Only Bearer type is supported. Credentials should be a valid OAuth access token to copy + * source. + */ + copySourceAuthorization?: string; /** * Additional parameters for the operation */ cpkInfo?: CpkInfo; + /** + * Additional parameters for the operation + */ + cpkScopeInfo?: CpkScopeInfo; /** * Additional parameters for the operation */ @@ -2746,6 +3264,10 @@ export interface BlockBlobCommitBlockListOptionalParams { * Timeouts for Blob Service Operations. */ timeout?: number; + /** + * Specify the transactional md5 for the body, to be validated by the service. + */ + transactionalContentMD5?: Uint8Array; /** * Specify the transactional crc64 for the body, to be validated by the service. */ @@ -2762,7 +3284,8 @@ export interface BlockBlobCommitBlockListOptionalParams { metadata?: { [propertyName: string]: string }; /** * Optional. Indicates the tier to be set on the blob. Possible values include: 'P4', 'P6', - * 'P10', 'P15', 'P20', 'P30', 'P40', 'P50', 'P60', 'P70', 'P80', 'Hot', 'Cool', 'Archive' + * 'P10', 'P15', 'P20', 'P30', 'P40', 'P50', 'P60', 'P70', 'P80', 'Hot', 'Cool', 'Archive', + * 'Premium' */ tier?: AccessTier; /** @@ -2770,6 +3293,23 @@ export interface BlockBlobCommitBlockListOptionalParams { * analytics logs when storage analytics logging is enabled. */ requestId?: string; + /** + * Optional. Used to set blob tags in various blob operations. + */ + blobTagsString?: string; + /** + * Specifies the date time when the blobs immutability policy is set to expire. + */ + immutabilityPolicyExpiry?: Date; + /** + * Specifies the immutability policy mode to set on the blob. Possible values include: 'Mutable', + * 'Unlocked', 'Locked' + */ + immutabilityPolicyMode?: BlobImmutabilityPolicyMode; + /** + * Specified if a legal hold should be set on the blob. + */ + legalHold?: boolean; /** * Additional parameters for the operation */ @@ -2782,6 +3322,10 @@ export interface BlockBlobCommitBlockListOptionalParams { * Additional parameters for the operation */ cpkInfo?: CpkInfo; + /** + * Additional parameters for the operation + */ + cpkScopeInfo?: CpkScopeInfo; /** * Additional parameters for the operation */ @@ -2820,6 +3364,10 @@ export interface BlockBlobGetBlockListOptionalParams { * Additional parameters for the operation */ leaseAccessConditions?: LeaseAccessConditions; + /** + * Additional parameters for the operation + */ + modifiedAccessConditions?: ModifiedAccessConditions; } /** @@ -2972,21 +3520,26 @@ export interface ServiceGetAccountInfoHeaders { */ skuName?: SkuName; /** - * Identifies the account kind. Possible values include: 'Storage', 'BlobStorage', 'StorageV2' + * Identifies the account kind. Possible values include: 'Storage', 'BlobStorage', 'StorageV2', + * 'FileStorage', 'BlockBlobStorage' */ accountKind?: AccountKind; + /** + * Version 2019-07-07 and newer. Indicates if the account has a hierarchical namespace enabled. + */ + isHierarchicalNamespaceEnabled?: boolean; errorCode?: string; } /** - * Defines headers for GetAccountInfoWithHead operation. + * Defines headers for SubmitBatch operation. */ -export interface ServiceGetAccountInfoWithHeadHeaders { +export interface ServiceSubmitBatchHeaders { /** - * If a client request id header is sent in the request, this header will be present in the - * response with the same value. + * The media type of the body of the response. For batch requests, this is multipart/mixed; + * boundary=batchresponse_GUID */ - clientRequestId?: string; + contentType?: string; /** * This header uniquely identifies the request that was made and can be used for troubleshooting * the request. @@ -2997,32 +3550,18 @@ export interface ServiceGetAccountInfoWithHeadHeaders { * for requests made against version 2009-09-19 and above. */ version?: string; - /** - * UTC date/time value generated by the service that indicates the time at which the response was - * initiated - */ - date?: Date; - /** - * Identifies the sku name of the account. Possible values include: 'Standard_LRS', - * 'Standard_GRS', 'Standard_RAGRS', 'Standard_ZRS', 'Premium_LRS' - */ - skuName?: SkuName; - /** - * Identifies the account kind. Possible values include: 'Storage', 'BlobStorage', 'StorageV2' - */ - accountKind?: AccountKind; errorCode?: string; } /** - * Defines headers for SubmitBatch operation. + * Defines headers for FilterBlobs operation. */ -export interface ServiceSubmitBatchHeaders { +export interface ServiceFilterBlobsHeaders { /** - * The media type of the body of the response. For batch requests, this is multipart/mixed; - * boundary=batchresponse_GUID + * If a client request id header is sent in the request, this header will be present in the + * response with the same value. */ - contentType?: string; + clientRequestId?: string; /** * This header uniquely identifies the request that was made and can be used for troubleshooting * the request. @@ -3033,6 +3572,11 @@ export interface ServiceSubmitBatchHeaders { * for requests made against version 2009-09-19 and above. */ version?: string; + /** + * UTC date/time value generated by the service that indicates the time at which the response was + * initiated + */ + date?: Date; errorCode?: string; } @@ -3137,13 +3681,25 @@ export interface ContainerGetPropertiesHeaders { * Indicates whether the container has a legal hold. */ hasLegalHold?: boolean; + /** + * The default encryption scope for the container. + */ + defaultEncryptionScope?: string; + /** + * Indicates whether the container's default encryption scope can be overriden. + */ + denyEncryptionScopeOverride?: boolean; + /** + * Indicates whether version level worm is enabled on a container. + */ + isImmutableStorageWithVersioningEnabled?: boolean; errorCode?: string; } /** - * Defines headers for GetPropertiesWithHead operation. + * Defines headers for GetProperties operation. */ -export interface ContainerGetPropertiesWithHeadHeaders { +export interface ContainerGetPropertiesHeaders1 { metadata?: { [propertyName: string]: string }; /** * The ETag contains a value that you can use to perform operations conditionally. If the request @@ -3203,6 +3759,18 @@ export interface ContainerGetPropertiesWithHeadHeaders { * Indicates whether the container has a legal hold. */ hasLegalHold?: boolean; + /** + * The default encryption scope for the container. + */ + defaultEncryptionScope?: string; + /** + * Indicates whether the container's default encryption scope can be overriden. + */ + denyEncryptionScopeOverride?: boolean; + /** + * Indicates whether version level worm is enabled on a container. + */ + isImmutableStorageWithVersioningEnabled?: boolean; errorCode?: string; } @@ -3353,14 +3921,14 @@ export interface ContainerSetAccessPolicyHeaders { } /** - * Defines headers for SubmitBatch operation. + * Defines headers for Restore operation. */ -export interface ContainerSubmitBatchHeaders { +export interface ContainerRestoreHeaders { /** - * The media type of the body of the response. For batch requests, this is multipart/mixed; - * boundary=batchresponse_GUID + * If a client request id header is sent in the request, this header will be present in the + * response with the same value. */ - contentType?: string; + clientRequestId?: string; /** * This header uniquely identifies the request that was made and can be used for troubleshooting * the request. @@ -3371,28 +3939,18 @@ export interface ContainerSubmitBatchHeaders { * for requests made against version 2009-09-19 and above. */ version?: string; + /** + * UTC date/time value generated by the service that indicates the time at which the response was + * initiated + */ + date?: Date; errorCode?: string; } /** - * Defines headers for AcquireLease operation. + * Defines headers for Rename operation. */ -export interface ContainerAcquireLeaseHeaders { - /** - * The ETag contains a value that you can use to perform operations conditionally. If the request - * version is 2011-08-18 or newer, the ETag value will be in quotes. - */ - eTag?: string; - /** - * Returns the date and time the container was last modified. Any operation that modifies the - * blob, including an update of the blob's metadata or properties, changes the last-modified time - * of the blob. - */ - lastModified?: Date; - /** - * Uniquely identifies a container's lease - */ - leaseId?: string; +export interface ContainerRenameHeaders { /** * If a client request id header is sent in the request, this header will be present in the * response with the same value. @@ -3417,20 +3975,31 @@ export interface ContainerAcquireLeaseHeaders { } /** - * Defines headers for ReleaseLease operation. + * Defines headers for SubmitBatch operation. */ -export interface ContainerReleaseLeaseHeaders { +export interface ContainerSubmitBatchHeaders { /** - * The ETag contains a value that you can use to perform operations conditionally. If the request - * version is 2011-08-18 or newer, the ETag value will be in quotes. + * The media type of the body of the response. For batch requests, this is multipart/mixed; + * boundary=batchresponse_GUID */ - eTag?: string; + contentType?: string; /** - * Returns the date and time the container was last modified. Any operation that modifies the - * blob, including an update of the blob's metadata or properties, changes the last-modified time - * of the blob. + * This header uniquely identifies the request that was made and can be used for troubleshooting + * the request. */ - lastModified?: Date; + requestId?: string; + /** + * Indicates the version of the Blob service used to execute the request. This header is returned + * for requests made against version 2009-09-19 and above. + */ + version?: string; + errorCode?: string; +} + +/** + * Defines headers for FilterBlobs operation. + */ +export interface ContainerFilterBlobsHeaders { /** * If a client request id header is sent in the request, this header will be present in the * response with the same value. @@ -3455,9 +4024,9 @@ export interface ContainerReleaseLeaseHeaders { } /** - * Defines headers for RenewLease operation. + * Defines headers for AcquireLease operation. */ -export interface ContainerRenewLeaseHeaders { +export interface ContainerAcquireLeaseHeaders { /** * The ETag contains a value that you can use to perform operations conditionally. If the request * version is 2011-08-18 or newer, the ETag value will be in quotes. @@ -3497,9 +4066,9 @@ export interface ContainerRenewLeaseHeaders { } /** - * Defines headers for BreakLease operation. + * Defines headers for ReleaseLease operation. */ -export interface ContainerBreakLeaseHeaders { +export interface ContainerReleaseLeaseHeaders { /** * The ETag contains a value that you can use to perform operations conditionally. If the request * version is 2011-08-18 or newer, the ETag value will be in quotes. @@ -3511,10 +4080,6 @@ export interface ContainerBreakLeaseHeaders { * of the blob. */ lastModified?: Date; - /** - * Approximate time remaining in the lease period, in seconds. - */ - leaseTime?: number; /** * If a client request id header is sent in the request, this header will be present in the * response with the same value. @@ -3539,9 +4104,9 @@ export interface ContainerBreakLeaseHeaders { } /** - * Defines headers for ChangeLease operation. + * Defines headers for RenewLease operation. */ -export interface ContainerChangeLeaseHeaders { +export interface ContainerRenewLeaseHeaders { /** * The ETag contains a value that you can use to perform operations conditionally. If the request * version is 2011-08-18 or newer, the ETag value will be in quotes. @@ -3581,13 +4146,24 @@ export interface ContainerChangeLeaseHeaders { } /** - * Defines headers for ListBlobFlatSegment operation. + * Defines headers for BreakLease operation. */ -export interface ContainerListBlobFlatSegmentHeaders { +export interface ContainerBreakLeaseHeaders { /** - * The media type of the body of the response. For List Blobs this is 'application/xml' + * The ETag contains a value that you can use to perform operations conditionally. If the request + * version is 2011-08-18 or newer, the ETag value will be in quotes. */ - contentType?: string; + eTag?: string; + /** + * Returns the date and time the container was last modified. Any operation that modifies the + * blob, including an update of the blob's metadata or properties, changes the last-modified time + * of the blob. + */ + lastModified?: Date; + /** + * Approximate time remaining in the lease period, in seconds. + */ + leaseTime?: number; /** * If a client request id header is sent in the request, this header will be present in the * response with the same value. @@ -3612,13 +4188,24 @@ export interface ContainerListBlobFlatSegmentHeaders { } /** - * Defines headers for ListBlobHierarchySegment operation. + * Defines headers for ChangeLease operation. */ -export interface ContainerListBlobHierarchySegmentHeaders { +export interface ContainerChangeLeaseHeaders { /** - * The media type of the body of the response. For List Blobs this is 'application/xml' + * The ETag contains a value that you can use to perform operations conditionally. If the request + * version is 2011-08-18 or newer, the ETag value will be in quotes. */ - contentType?: string; + eTag?: string; + /** + * Returns the date and time the container was last modified. Any operation that modifies the + * blob, including an update of the blob's metadata or properties, changes the last-modified time + * of the blob. + */ + lastModified?: Date; + /** + * Uniquely identifies a container's lease + */ + leaseId?: string; /** * If a client request id header is sent in the request, this header will be present in the * response with the same value. @@ -3643,9 +4230,13 @@ export interface ContainerListBlobHierarchySegmentHeaders { } /** - * Defines headers for GetAccountInfo operation. + * Defines headers for ListBlobFlatSegment operation. */ -export interface ContainerGetAccountInfoHeaders { +export interface ContainerListBlobFlatSegmentHeaders { + /** + * The media type of the body of the response. For List Blobs this is 'application/xml' + */ + contentType?: string; /** * If a client request id header is sent in the request, this header will be present in the * response with the same value. @@ -3666,22 +4257,17 @@ export interface ContainerGetAccountInfoHeaders { * initiated */ date?: Date; - /** - * Identifies the sku name of the account. Possible values include: 'Standard_LRS', - * 'Standard_GRS', 'Standard_RAGRS', 'Standard_ZRS', 'Premium_LRS' - */ - skuName?: SkuName; - /** - * Identifies the account kind. Possible values include: 'Storage', 'BlobStorage', 'StorageV2' - */ - accountKind?: AccountKind; errorCode?: string; } /** - * Defines headers for GetAccountInfoWithHead operation. + * Defines headers for ListBlobHierarchySegment operation. */ -export interface ContainerGetAccountInfoWithHeadHeaders { +export interface ContainerListBlobHierarchySegmentHeaders { + /** + * The media type of the body of the response. For List Blobs this is 'application/xml' + */ + contentType?: string; /** * If a client request id header is sent in the request, this header will be present in the * response with the same value. @@ -3702,216 +4288,44 @@ export interface ContainerGetAccountInfoWithHeadHeaders { * initiated */ date?: Date; - /** - * Identifies the sku name of the account. Possible values include: 'Standard_LRS', - * 'Standard_GRS', 'Standard_RAGRS', 'Standard_ZRS', 'Premium_LRS' - */ - skuName?: SkuName; - /** - * Identifies the account kind. Possible values include: 'Storage', 'BlobStorage', 'StorageV2' - */ - accountKind?: AccountKind; errorCode?: string; } /** - * Defines headers for Create operation. - */ -export interface DirectoryCreateHeaders { - /** - * An HTTP entity tag associated with the file or directory. - */ - eTag?: string; - /** - * The data and time the file or directory was last modified. Write operations on the file or - * directory update the last modified time. - */ - lastModified?: Date; - /** - * If a client request id header is sent in the request, this header will be present in the - * response with the same value. - */ - clientRequestId?: string; - /** - * A server-generated UUID recorded in the analytics logs for troubleshooting and correlation. - */ - requestId?: string; - /** - * The version of the REST protocol used to process the request. - */ - version?: string; - /** - * The size of the resource in bytes. - */ - contentLength?: number; - /** - * A UTC date/time value generated by the service that indicates the time at which the response - * was initiated. - */ - date?: Date; -} - -/** - * Defines headers for Rename operation. - */ -export interface DirectoryRenameHeaders { - /** - * When renaming a directory, the number of paths that are renamed with each invocation is - * limited. If the number of paths to be renamed exceeds this limit, a continuation token is - * returned in this response header. When a continuation token is returned in the response, it - * must be specified in a subsequent invocation of the rename operation to continue renaming the - * directory. - */ - marker?: string; - /** - * An HTTP entity tag associated with the file or directory. - */ - eTag?: string; - /** - * The data and time the file or directory was last modified. Write operations on the file or - * directory update the last modified time. - */ - lastModified?: Date; - /** - * If a client request id header is sent in the request, this header will be present in the - * response with the same value. - */ - clientRequestId?: string; - /** - * A server-generated UUID recorded in the analytics logs for troubleshooting and correlation. - */ - requestId?: string; - /** - * The version of the REST protocol used to process the request. - */ - version?: string; - /** - * The size of the resource in bytes. - */ - contentLength?: number; - /** - * A UTC date/time value generated by the service that indicates the time at which the response - * was initiated. - */ - date?: Date; -} - -/** - * Defines headers for Delete operation. + * Defines headers for GetAccountInfo operation. */ -export interface DirectoryDeleteHeaders { - /** - * When renaming a directory, the number of paths that are renamed with each invocation is - * limited. If the number of paths to be renamed exceeds this limit, a continuation token is - * returned in this response header. When a continuation token is returned in the response, it - * must be specified in a subsequent invocation of the rename operation to continue renaming the - * directory. - */ - marker?: string; +export interface ContainerGetAccountInfoHeaders { /** * If a client request id header is sent in the request, this header will be present in the * response with the same value. */ clientRequestId?: string; /** - * A server-generated UUID recorded in the analytics logs for troubleshooting and correlation. - */ - requestId?: string; - /** - * The version of the REST protocol used to process the request. - */ - version?: string; - /** - * A UTC date/time value generated by the service that indicates the time at which the response - * was initiated. - */ - date?: Date; -} - -/** - * Defines headers for SetAccessControl operation. - */ -export interface DirectorySetAccessControlHeaders { - /** - * A UTC date/time value generated by the service that indicates the time at which the response - * was initiated. - */ - date?: Date; - /** - * An HTTP entity tag associated with the file or directory. - */ - eTag?: string; - /** - * The data and time the file or directory was last modified. Write operations on the file or - * directory update the last modified time. - */ - lastModified?: Date; - /** - * A server-generated UUID recorded in the analytics logs for troubleshooting and correlation. + * This header uniquely identifies the request that was made and can be used for troubleshooting + * the request. */ requestId?: string; /** - * The version of the REST protocol used to process the request. + * Indicates the version of the Blob service used to execute the request. This header is returned + * for requests made against version 2009-09-19 and above. */ version?: string; /** - * If a client request id header is sent in the request, this header will be present in the - * response with the same value. - */ - clientRequestId?: string; -} - -/** - * Defines headers for GetAccessControl operation. - */ -export interface DirectoryGetAccessControlHeaders { - /** - * A UTC date/time value generated by the service that indicates the time at which the response - * was initiated. + * UTC date/time value generated by the service that indicates the time at which the response was + * initiated */ date?: Date; /** - * An HTTP entity tag associated with the file or directory. - */ - eTag?: string; - /** - * The data and time the file or directory was last modified. Write operations on the file or - * directory update the last modified time. - */ - lastModified?: Date; - /** - * The owner of the file or directory. Included in the response if Hierarchical Namespace is - * enabled for the account. - */ - xMsOwner?: string; - /** - * The owning group of the file or directory. Included in the response if Hierarchical Namespace - * is enabled for the account. - */ - xMsGroup?: string; - /** - * The POSIX access permissions for the file owner, the file owning group, and others. Included - * in the response if Hierarchical Namespace is enabled for the account. - */ - xMsPermissions?: string; - /** - * The POSIX access control list for the file or directory. Included in the response only if the - * action is "getAccessControl" and Hierarchical Namespace is enabled for the account. - */ - xMsAcl?: string; - /** - * A server-generated UUID recorded in the analytics logs for troubleshooting and correlation. - */ - requestId?: string; - /** - * The version of the REST protocol used to process the request. + * Identifies the sku name of the account. Possible values include: 'Standard_LRS', + * 'Standard_GRS', 'Standard_RAGRS', 'Standard_ZRS', 'Premium_LRS' */ - version?: string; + skuName?: SkuName; /** - * If a client request id header is sent in the request, this header will be present in the - * response with the same value. + * Identifies the account kind. Possible values include: 'Storage', 'BlobStorage', 'StorageV2', + * 'FileStorage', 'BlockBlobStorage' */ - clientRequestId?: string; + accountKind?: AccountKind; + errorCode?: string; } /** @@ -3929,6 +4343,12 @@ export interface BlobDownloadHeaders { * Returns the date and time the blob was created. */ creationTime?: Date; + /** + * Optional. Only valid when Object Replication is enabled for the storage container and on the + * destination blob of the replication. + */ + objectReplicationPolicyId?: string; + objectReplicationRules?: { [propertyName: string]: string }; /** * The number of bytes present in the response body. */ @@ -4053,6 +4473,17 @@ export interface BlobDownloadHeaders { * for requests made against version 2009-09-19 and above. */ version?: string; + /** + * A DateTime value returned by the service that uniquely identifies the blob. The value of this + * header indicates the blob version, and may be used in subsequent requests to access this + * version of the blob. + */ + versionId?: string; + /** + * The value of this header indicates whether version of this blob is a current version, see also + * x-ms-version-id header. + */ + isCurrentVersion?: boolean; /** * Indicates that the service supports requests for partial blob content. */ @@ -4078,6 +4509,12 @@ export interface BlobDownloadHeaders { * when the blob was encrypted with a customer-provided key. */ encryptionKeySha256?: string; + /** + * Returns the name of the encryption scope used to encrypt the blob contents and application + * metadata. Note that the absence of this header implies use of the default account encryption + * scope. + */ + encryptionScope?: string; /** * If the blob has a MD5 hash, and if request contains range header (Range or x-ms-range), this * response header is returned with the value of the whole blob's MD5 value. This value may or @@ -4085,6 +4522,32 @@ export interface BlobDownloadHeaders { * the requested range */ blobContentMD5?: Uint8Array; + /** + * The number of tags associated with the blob + */ + tagCount?: number; + /** + * If this blob has been sealed + */ + isSealed?: boolean; + /** + * UTC date/time value generated by the service that indicates the time at which the blob was + * last read or written to + */ + lastAccessed?: Date; + /** + * UTC date/time value generated by the service that indicates the time at which the blob + * immutability policy will expire. + */ + immutabilityPolicyExpiresOn?: Date; + /** + * Indicates immutability policy mode. + */ + immutabilityPolicyMode?: string; + /** + * Indicates if a legal hold is present on the blob. + */ + legalHold?: boolean; /** * If the request is to read a specified range and the x-ms-range-get-content-crc64 is set to * true, then the request returns a crc64 for the range, as long as the range size is less than @@ -4110,6 +4573,12 @@ export interface BlobGetPropertiesHeaders { */ creationTime?: Date; metadata?: { [propertyName: string]: string }; + /** + * Optional. Only valid when Object Replication is enabled for the storage container and on the + * destination blob of the replication. + */ + objectReplicationPolicyId?: string; + objectReplicationRules?: { [propertyName: string]: string }; /** * The blob's type. Possible values include: 'BlockBlob', 'PageBlob', 'AppendBlob' */ @@ -4264,6 +4733,12 @@ export interface BlobGetPropertiesHeaders { * returned when the metadata was encrypted with a customer-provided key. */ encryptionKeySha256?: string; + /** + * Returns the name of the encryption scope used to encrypt the blob contents and application + * metadata. Note that the absence of this header implies use of the default account encryption + * scope. + */ + encryptionScope?: string; /** * The tier of page blob on a premium storage account or tier of block blob on blob storage LRS * accounts. For a list of allowed premium page blob tiers, see @@ -4289,6 +4764,52 @@ export interface BlobGetPropertiesHeaders { * blob was ever set. */ accessTierChangeTime?: Date; + /** + * A DateTime value returned by the service that uniquely identifies the blob. The value of this + * header indicates the blob version, and may be used in subsequent requests to access this + * version of the blob. + */ + versionId?: string; + /** + * The value of this header indicates whether version of this blob is a current version, see also + * x-ms-version-id header. + */ + isCurrentVersion?: boolean; + /** + * The number of tags associated with the blob + */ + tagCount?: number; + /** + * The time this blob will expire. + */ + expiresOn?: Date; + /** + * If this blob has been sealed + */ + isSealed?: boolean; + /** + * If an object is in rehydrate pending state then this header is returned with priority of + * rehydrate. Valid values are High and Standard. + */ + rehydratePriority?: string; + /** + * UTC date/time value generated by the service that indicates the time at which the blob was + * last read or written to + */ + lastAccessed?: Date; + /** + * UTC date/time value generated by the service that indicates the time at which the blob + * immutability policy will expire. + */ + immutabilityPolicyExpiresOn?: Date; + /** + * Indicates immutability policy mode. Possible values include: 'Mutable', 'Unlocked', 'Locked' + */ + immutabilityPolicyMode?: BlobImmutabilityPolicyMode; + /** + * Indicates if a legal hold is present on the blob. + */ + legalHold?: boolean; errorCode?: string; } @@ -4320,132 +4841,74 @@ export interface BlobDeleteHeaders { } /** - * Defines headers for SetAccessControl operation. + * Defines headers for Create operation. */ -export interface BlobSetAccessControlHeaders { +export interface PageBlobCreateHeaders { /** - * A UTC date/time value generated by the service that indicates the time at which the response - * was initiated. + * The ETag contains a value that you can use to perform operations conditionally. If the request + * version is 2011-08-18 or newer, the ETag value will be in quotes. */ - date?: Date; + eTag?: string; /** - * An HTTP entity tag associated with the file or directory. - */ - eTag?: string; - /** - * The data and time the file or directory was last modified. Write operations on the file or - * directory update the last modified time. + * Returns the date and time the container was last modified. Any operation that modifies the + * blob, including an update of the blob's metadata or properties, changes the last-modified time + * of the blob. */ lastModified?: Date; /** - * A server-generated UUID recorded in the analytics logs for troubleshooting and correlation. - */ - requestId?: string; - /** - * The version of the REST protocol used to process the request. + * If the blob has an MD5 hash and this operation is to read the full blob, this response header + * is returned so that the client can check for message content integrity. */ - version?: string; + contentMD5?: Uint8Array; /** * If a client request id header is sent in the request, this header will be present in the * response with the same value. */ clientRequestId?: string; -} - -/** - * Defines headers for GetAccessControl operation. - */ -export interface BlobGetAccessControlHeaders { - /** - * A UTC date/time value generated by the service that indicates the time at which the response - * was initiated. - */ - date?: Date; - /** - * An HTTP entity tag associated with the file or directory. - */ - eTag?: string; - /** - * The data and time the file or directory was last modified. Write operations on the file or - * directory update the last modified time. - */ - lastModified?: Date; - /** - * The owner of the file or directory. Included in the response if Hierarchical Namespace is - * enabled for the account. - */ - xMsOwner?: string; - /** - * The owning group of the file or directory. Included in the response if Hierarchical Namespace - * is enabled for the account. - */ - xMsGroup?: string; - /** - * The POSIX access permissions for the file owner, the file owning group, and others. Included - * in the response if Hierarchical Namespace is enabled for the account. - */ - xMsPermissions?: string; /** - * The POSIX access control list for the file or directory. Included in the response only if the - * action is "getAccessControl" and Hierarchical Namespace is enabled for the account. - */ - xMsAcl?: string; - /** - * A server-generated UUID recorded in the analytics logs for troubleshooting and correlation. + * This header uniquely identifies the request that was made and can be used for troubleshooting + * the request. */ requestId?: string; /** - * The version of the REST protocol used to process the request. + * Indicates the version of the Blob service used to execute the request. This header is returned + * for requests made against version 2009-09-19 and above. */ version?: string; /** - * If a client request id header is sent in the request, this header will be present in the - * response with the same value. - */ - clientRequestId?: string; -} - -/** - * Defines headers for Rename operation. - */ -export interface BlobRenameHeaders { - /** - * An HTTP entity tag associated with the file or directory. + * A DateTime value returned by the service that uniquely identifies the blob. The value of this + * header indicates the blob version, and may be used in subsequent requests to access this + * version of the blob. */ - eTag?: string; - /** - * The data and time the file or directory was last modified. Write operations on the file or - * directory update the last modified time. - */ - lastModified?: Date; - /** - * If a client request id header is sent in the request, this header will be present in the - * response with the same value. - */ - clientRequestId?: string; + versionId?: string; /** - * A server-generated UUID recorded in the analytics logs for troubleshooting and correlation. + * UTC date/time value generated by the service that indicates the time at which the response was + * initiated */ - requestId?: string; + date?: Date; /** - * The version of the REST protocol used to process the request. + * The value of this header is set to true if the contents of the request are successfully + * encrypted using the specified algorithm, and false otherwise. */ - version?: string; + isServerEncrypted?: boolean; /** - * The size of the resource in bytes. + * The SHA-256 hash of the encryption key used to encrypt the blob. This header is only returned + * when the blob was encrypted with a customer-provided key. */ - contentLength?: number; + encryptionKeySha256?: string; /** - * A UTC date/time value generated by the service that indicates the time at which the response - * was initiated. + * Returns the name of the encryption scope used to encrypt the blob contents and application + * metadata. Note that the absence of this header implies use of the default account encryption + * scope. */ - date?: Date; + encryptionScope?: string; + errorCode?: string; } /** * Defines headers for Create operation. */ -export interface PageBlobCreateHeaders { +export interface AppendBlobCreateHeaders { /** * The ETag contains a value that you can use to perform operations conditionally. If the request * version is 2011-08-18 or newer, the ETag value will be in quotes. @@ -4477,6 +4940,12 @@ export interface PageBlobCreateHeaders { * for requests made against version 2009-09-19 and above. */ version?: string; + /** + * A DateTime value returned by the service that uniquely identifies the blob. The value of this + * header indicates the blob version, and may be used in subsequent requests to access this + * version of the blob. + */ + versionId?: string; /** * UTC date/time value generated by the service that indicates the time at which the response was * initiated @@ -4492,13 +4961,19 @@ export interface PageBlobCreateHeaders { * when the blob was encrypted with a customer-provided key. */ encryptionKeySha256?: string; + /** + * Returns the name of the encryption scope used to encrypt the blob contents and application + * metadata. Note that the absence of this header implies use of the default account encryption + * scope. + */ + encryptionScope?: string; errorCode?: string; } /** - * Defines headers for Create operation. + * Defines headers for Upload operation. */ -export interface AppendBlobCreateHeaders { +export interface BlockBlobUploadHeaders { /** * The ETag contains a value that you can use to perform operations conditionally. If the request * version is 2011-08-18 or newer, the ETag value will be in quotes. @@ -4530,6 +5005,12 @@ export interface AppendBlobCreateHeaders { * for requests made against version 2009-09-19 and above. */ version?: string; + /** + * A DateTime value returned by the service that uniquely identifies the blob. The value of this + * header indicates the blob version, and may be used in subsequent requests to access this + * version of the blob. + */ + versionId?: string; /** * UTC date/time value generated by the service that indicates the time at which the response was * initiated @@ -4545,13 +5026,19 @@ export interface AppendBlobCreateHeaders { * when the blob was encrypted with a customer-provided key. */ encryptionKeySha256?: string; + /** + * Returns the name of the encryption scope used to encrypt the blob contents and application + * metadata. Note that the absence of this header implies use of the default account encryption + * scope. + */ + encryptionScope?: string; errorCode?: string; } /** - * Defines headers for Upload operation. + * Defines headers for PutBlobFromUrl operation. */ -export interface BlockBlobUploadHeaders { +export interface BlockBlobPutBlobFromUrlHeaders { /** * The ETag contains a value that you can use to perform operations conditionally. If the request * version is 2011-08-18 or newer, the ETag value will be in quotes. @@ -4583,6 +5070,12 @@ export interface BlockBlobUploadHeaders { * for requests made against version 2009-09-19 and above. */ version?: string; + /** + * A DateTime value returned by the service that uniquely identifies the blob. The value of this + * header indicates the blob version, and may be used in subsequent requests to access this + * version of the blob. + */ + versionId?: string; /** * UTC date/time value generated by the service that indicates the time at which the response was * initiated @@ -4598,6 +5091,12 @@ export interface BlockBlobUploadHeaders { * when the blob was encrypted with a customer-provided key. */ encryptionKeySha256?: string; + /** + * Returns the name of the encryption scope used to encrypt the blob contents and application + * metadata. Note that the absence of this header implies use of the default account encryption + * scope. + */ + encryptionScope?: string; errorCode?: string; } @@ -4628,6 +5127,44 @@ export interface BlobUndeleteHeaders { errorCode?: string; } +/** + * Defines headers for SetExpiry operation. + */ +export interface BlobSetExpiryHeaders { + /** + * The ETag contains a value that you can use to perform operations conditionally. If the request + * version is 2011-08-18 or newer, the ETag value will be in quotes. + */ + eTag?: string; + /** + * Returns the date and time the container was last modified. Any operation that modifies the + * blob, including an update of the blob's metadata or properties, changes the last-modified time + * of the blob. + */ + lastModified?: Date; + /** + * If a client request id header is sent in the request, this header will be present in the + * response with the same value. + */ + clientRequestId?: string; + /** + * This header uniquely identifies the request that was made and can be used for troubleshooting + * the request. + */ + requestId?: string; + /** + * Indicates the version of the Blob service used to execute the request. This header is returned + * for requests made against version 2009-09-19 and above. + */ + version?: string; + /** + * UTC date/time value generated by the service that indicates the time at which the response was + * initiated. + */ + date?: Date; + errorCode?: string; +} + /** * Defines headers for SetHTTPHeaders operation. */ @@ -4671,6 +5208,99 @@ export interface BlobSetHTTPHeadersHeaders { errorCode?: string; } +/** + * Defines headers for SetImmutabilityPolicy operation. + */ +export interface BlobSetImmutabilityPolicyHeaders { + /** + * If a client request id header is sent in the request, this header will be present in the + * response with the same value. + */ + clientRequestId?: string; + /** + * This header uniquely identifies the request that was made and can be used for troubleshooting + * the request. + */ + requestId?: string; + /** + * Indicates the version of the Blob service used to execute the request. This header is returned + * for requests made against version 2009-09-19 and above. + */ + version?: string; + /** + * UTC date/time value generated by the service that indicates the time at which the response was + * initiated + */ + date?: Date; + /** + * Indicates the time the immutability policy will expire. + */ + immutabilityPolicyExpiry?: Date; + /** + * Indicates immutability policy mode. Possible values include: 'Mutable', 'Unlocked', 'Locked' + */ + immutabilityPolicyMode?: BlobImmutabilityPolicyMode; + errorCode?: string; +} + +/** + * Defines headers for DeleteImmutabilityPolicy operation. + */ +export interface BlobDeleteImmutabilityPolicyHeaders { + /** + * If a client request id header is sent in the request, this header will be present in the + * response with the same value. + */ + clientRequestId?: string; + /** + * This header uniquely identifies the request that was made and can be used for troubleshooting + * the request. + */ + requestId?: string; + /** + * Indicates the version of the Blob service used to execute the request. This header is returned + * for requests made against version 2009-09-19 and above. + */ + version?: string; + /** + * UTC date/time value generated by the service that indicates the time at which the response was + * initiated + */ + date?: Date; + errorCode?: string; +} + +/** + * Defines headers for SetLegalHold operation. + */ +export interface BlobSetLegalHoldHeaders { + /** + * If a client request id header is sent in the request, this header will be present in the + * response with the same value. + */ + clientRequestId?: string; + /** + * This header uniquely identifies the request that was made and can be used for troubleshooting + * the request. + */ + requestId?: string; + /** + * Indicates the version of the Blob service used to execute the request. This header is returned + * for requests made against version 2009-09-19 and above. + */ + version?: string; + /** + * UTC date/time value generated by the service that indicates the time at which the response was + * initiated + */ + date?: Date; + /** + * Indicates if the blob has a legal hold. + */ + legalHold?: boolean; + errorCode?: string; +} + /** * Defines headers for SetMetadata operation. */ @@ -4701,6 +5331,12 @@ export interface BlobSetMetadataHeaders { * for requests made against version 2009-09-19 and above. */ version?: string; + /** + * A DateTime value returned by the service that uniquely identifies the blob. The value of this + * header indicates the blob version, and may be used in subsequent requests to access this + * version of the blob. + */ + versionId?: string; /** * UTC date/time value generated by the service that indicates the time at which the response was * initiated @@ -4716,6 +5352,12 @@ export interface BlobSetMetadataHeaders { * returned when the metadata was encrypted with a customer-provided key. */ encryptionKeySha256?: string; + /** + * Returns the name of the encryption scope used to encrypt the blob contents and application + * metadata. Note that the absence of this header implies use of the default account encryption + * scope. + */ + encryptionScope?: string; errorCode?: string; } @@ -4735,7 +5377,7 @@ export interface BlobAcquireLeaseHeaders { */ lastModified?: Date; /** - * Uniquely identifies a blobs's lease + * Uniquely identifies a blobs' lease */ leaseId?: string; /** @@ -4815,7 +5457,7 @@ export interface BlobRenewLeaseHeaders { */ lastModified?: Date; /** - * Uniquely identifies a blobs's lease + * Uniquely identifies a blobs' lease */ leaseId?: string; /** @@ -4867,7 +5509,7 @@ export interface BlobChangeLeaseHeaders { */ requestId?: string; /** - * Uniquely identifies a blobs's lease + * Uniquely identifies a blobs' lease */ leaseId?: string; /** @@ -4960,6 +5602,12 @@ export interface BlobCreateSnapshotHeaders { * for requests made against version 2009-09-19 and above. */ version?: string; + /** + * A DateTime value returned by the service that uniquely identifies the blob. The value of this + * header indicates the blob version, and may be used in subsequent requests to access this + * version of the blob. + */ + versionId?: string; /** * UTC date/time value generated by the service that indicates the time at which the response was * initiated @@ -5004,6 +5652,12 @@ export interface BlobStartCopyFromURLHeaders { * for requests made against version 2009-09-19 and above. */ version?: string; + /** + * A DateTime value returned by the service that uniquely identifies the blob. The value of this + * header indicates the blob version, and may be used in subsequent requests to access this + * version of the blob. + */ + versionId?: string; /** * UTC date/time value generated by the service that indicates the time at which the response was * initiated @@ -5052,6 +5706,12 @@ export interface BlobCopyFromURLHeaders { * for requests made against version 2009-09-19 and above. */ version?: string; + /** + * A DateTime value returned by the service that uniquely identifies the blob. The value of this + * header indicates the blob version, and may be used in subsequent requests to access this + * version of the blob. + */ + versionId?: string; /** * UTC date/time value generated by the service that indicates the time at which the response was * initiated @@ -5065,6 +5725,22 @@ export interface BlobCopyFromURLHeaders { * State of the copy operation identified by x-ms-copy-id. Possible values include: 'success' */ copyStatus?: SyncCopyStatusType; + /** + * This response header is returned so that the client can check for the integrity of the copied + * content. This header is only returned if the source content MD5 was specified. + */ + contentMD5?: Uint8Array; + /** + * This response header is returned so that the client can check for the integrity of the copied + * content. + */ + xMsContentCrc64?: Uint8Array; + /** + * Returns the name of the encryption scope used to encrypt the blob contents and application + * metadata. Note that the absence of this header implies use of the default account encryption + * scope. + */ + encryptionScope?: string; errorCode?: string; } @@ -5147,16 +5823,23 @@ export interface BlobGetAccountInfoHeaders { */ skuName?: SkuName; /** - * Identifies the account kind. Possible values include: 'Storage', 'BlobStorage', 'StorageV2' + * Identifies the account kind. Possible values include: 'Storage', 'BlobStorage', 'StorageV2', + * 'FileStorage', 'BlockBlobStorage' */ accountKind?: AccountKind; errorCode?: string; } /** - * Defines headers for GetAccountInfoWithHead operation. + * Defines headers for StageBlock operation. */ -export interface BlobGetAccountInfoWithHeadHeaders { +export interface BlockBlobStageBlockHeaders { + /** + * This header is returned so that the client can check for message content integrity. The value + * of this header is computed by the Blob service; it is not necessarily the same value specified + * in the request headers. + */ + contentMD5?: Uint8Array; /** * If a client request id header is sent in the request, this header will be present in the * response with the same value. @@ -5178,70 +5861,34 @@ export interface BlobGetAccountInfoWithHeadHeaders { */ date?: Date; /** - * Identifies the sku name of the account. Possible values include: 'Standard_LRS', - * 'Standard_GRS', 'Standard_RAGRS', 'Standard_ZRS', 'Premium_LRS' + * This header is returned so that the client can check for message content integrity. The value + * of this header is computed by the Blob service; it is not necessarily the same value specified + * in the request headers. */ - skuName?: SkuName; + xMsContentCrc64?: Uint8Array; /** - * Identifies the account kind. Possible values include: 'Storage', 'BlobStorage', 'StorageV2' + * The value of this header is set to true if the contents of the request are successfully + * encrypted using the specified algorithm, and false otherwise. */ - accountKind?: AccountKind; + isServerEncrypted?: boolean; + /** + * The SHA-256 hash of the encryption key used to encrypt the block. This header is only returned + * when the block was encrypted with a customer-provided key. + */ + encryptionKeySha256?: string; + /** + * Returns the name of the encryption scope used to encrypt the blob contents and application + * metadata. Note that the absence of this header implies use of the default account encryption + * scope. + */ + encryptionScope?: string; errorCode?: string; } /** - * Defines headers for StageBlock operation. + * Defines headers for StageBlockFromURL operation. */ -export interface BlockBlobStageBlockHeaders { - /** - * This header is returned so that the client can check for message content integrity. The value - * of this header is computed by the Blob service; it is not necessarily the same value specified - * in the request headers. - */ - contentMD5?: Uint8Array; - /** - * If a client request id header is sent in the request, this header will be present in the - * response with the same value. - */ - clientRequestId?: string; - /** - * This header uniquely identifies the request that was made and can be used for troubleshooting - * the request. - */ - requestId?: string; - /** - * Indicates the version of the Blob service used to execute the request. This header is returned - * for requests made against version 2009-09-19 and above. - */ - version?: string; - /** - * UTC date/time value generated by the service that indicates the time at which the response was - * initiated - */ - date?: Date; - /** - * This header is returned so that the client can check for message content integrity. The value - * of this header is computed by the Blob service; it is not necessarily the same value specified - * in the request headers. - */ - xMsContentCrc64?: Uint8Array; - /** - * The value of this header is set to true if the contents of the request are successfully - * encrypted using the specified algorithm, and false otherwise. - */ - isServerEncrypted?: boolean; - /** - * The SHA-256 hash of the encryption key used to encrypt the block. This header is only returned - * when the block was encrypted with a customer-provided key. - */ - encryptionKeySha256?: string; - errorCode?: string; -} - -/** - * Defines headers for StageBlockFromURL operation. - */ -export interface BlockBlobStageBlockFromURLHeaders { +export interface BlockBlobStageBlockFromURLHeaders { /** * This header is returned so that the client can check for message content integrity. The value * of this header is computed by the Blob service; it is not necessarily the same value specified @@ -5284,6 +5931,12 @@ export interface BlockBlobStageBlockFromURLHeaders { * when the block was encrypted with a customer-provided key. */ encryptionKeySha256?: string; + /** + * Returns the name of the encryption scope used to encrypt the blob contents and application + * metadata. Note that the absence of this header implies use of the default account encryption + * scope. + */ + encryptionScope?: string; errorCode?: string; } @@ -5329,6 +5982,12 @@ export interface BlockBlobCommitBlockListHeaders { * for requests made against version 2009-09-19 and above. */ version?: string; + /** + * A DateTime value returned by the service that uniquely identifies the blob. The value of this + * header indicates the blob version, and may be used in subsequent requests to access this + * version of the blob. + */ + versionId?: string; /** * UTC date/time value generated by the service that indicates the time at which the response was * initiated @@ -5344,6 +6003,12 @@ export interface BlockBlobCommitBlockListHeaders { * when the blob was encrypted with a customer-provided key. */ encryptionKeySha256?: string; + /** + * Returns the name of the encryption scope used to encrypt the blob contents and application + * metadata. Note that the absence of this header implies use of the default account encryption + * scope. + */ + encryptionScope?: string; errorCode?: string; } @@ -5453,6 +6118,12 @@ export interface PageBlobUploadPagesHeaders { * when the pages were encrypted with a customer-provided key. */ encryptionKeySha256?: string; + /** + * Returns the name of the encryption scope used to encrypt the blob contents and application + * metadata. Note that the absence of this header implies use of the default account encryption + * scope. + */ + encryptionScope?: string; errorCode?: string; } @@ -5559,6 +6230,17 @@ export interface PageBlobUploadPagesFromURLHeaders { * encrypted using the specified algorithm, and false otherwise. */ isServerEncrypted?: boolean; + /** + * The SHA-256 hash of the encryption key used to encrypt the blob. This header is only returned + * when the blob was encrypted with a customer-provided key. + */ + encryptionKeySha256?: string; + /** + * Returns the name of the encryption scope used to encrypt the blob contents and application + * metadata. Note that the absence of this header implies use of the default account encryption + * scope. + */ + encryptionScope?: string; errorCode?: string; } @@ -5846,6 +6528,12 @@ export interface AppendBlobAppendBlockHeaders { * when the block was encrypted with a customer-provided key. */ encryptionKeySha256?: string; + /** + * Returns the name of the encryption scope used to encrypt the blob contents and application + * metadata. Note that the absence of this header implies use of the default account encryption + * scope. + */ + encryptionScope?: string; errorCode?: string; } @@ -5905,191 +6593,511 @@ export interface AppendBlobAppendBlockFromUrlHeaders { * when the block was encrypted with a customer-provided key. */ encryptionKeySha256?: string; + /** + * Returns the name of the encryption scope used to encrypt the blob contents and application + * metadata. Note that the absence of this header implies use of the default account encryption + * scope. + */ + encryptionScope?: string; + /** + * The value of this header is set to true if the contents of the request are successfully + * encrypted using the specified algorithm, and false otherwise. + */ + isServerEncrypted?: boolean; errorCode?: string; } /** - * Defines values for PublicAccessType. - * Possible values include: 'container', 'blob' - * @readonly - * @enum {string} - */ -export enum PublicAccessType { - Container = 'container', - Blob = 'blob', -} - -/** - * Defines values for CopyStatusType. - * Possible values include: 'pending', 'success', 'aborted', 'failed' - * @readonly - * @enum {string} - */ -export enum CopyStatusType { - Pending = 'pending', - Success = 'success', - Aborted = 'aborted', - Failed = 'failed', -} - -/** - * Defines values for LeaseDurationType. - * Possible values include: 'infinite', 'fixed' - * @readonly - * @enum {string} - */ -export enum LeaseDurationType { - Infinite = 'infinite', - Fixed = 'fixed', -} - -/** - * Defines values for LeaseStateType. - * Possible values include: 'available', 'leased', 'expired', 'breaking', 'broken' - * @readonly - * @enum {string} - */ -export enum LeaseStateType { - Available = 'available', - Leased = 'leased', - Expired = 'expired', - Breaking = 'breaking', - Broken = 'broken', -} - -/** - * Defines values for LeaseStatusType. - * Possible values include: 'locked', 'unlocked' - * @readonly - * @enum {string} - */ -export enum LeaseStatusType { - Locked = 'locked', - Unlocked = 'unlocked', -} - -/** - * Defines values for AccessTier. - * Possible values include: 'P4', 'P6', 'P10', 'P15', 'P20', 'P30', 'P40', 'P50', 'P60', 'P70', - * 'P80', 'Hot', 'Cool', 'Archive' - * @readonly - * @enum {string} - */ -export enum AccessTier { - P4 = 'P4', - P6 = 'P6', - P10 = 'P10', - P15 = 'P15', - P20 = 'P20', - P30 = 'P30', - P40 = 'P40', - P50 = 'P50', - P60 = 'P60', - P70 = 'P70', - P80 = 'P80', - Hot = 'Hot', - Cool = 'Cool', - Archive = 'Archive', -} - -/** - * Defines values for ArchiveStatus. - * Possible values include: 'rehydrate-pending-to-hot', 'rehydrate-pending-to-cool' - * @readonly - * @enum {string} - */ -export enum ArchiveStatus { - RehydratePendingToHot = 'rehydrate-pending-to-hot', - RehydratePendingToCool = 'rehydrate-pending-to-cool', -} - -/** - * Defines values for BlobType. - * Possible values include: 'BlockBlob', 'PageBlob', 'AppendBlob' - * @readonly - * @enum {string} + * Defines headers for Seal operation. */ -export enum BlobType { - BlockBlob = 'BlockBlob', - PageBlob = 'PageBlob', - AppendBlob = 'AppendBlob', +export interface AppendBlobSealHeaders { + /** + * The ETag contains a value that you can use to perform operations conditionally. If the request + * version is 2011-08-18 or newer, the ETag value will be in quotes. + */ + eTag?: string; + /** + * Returns the date and time the container was last modified. Any operation that modifies the + * blob, including an update of the blob's metadata or properties, changes the last-modified time + * of the blob. + */ + lastModified?: Date; + /** + * If a client request id header is sent in the request, this header will be present in the + * response with the same value. + */ + clientRequestId?: string; + /** + * This header uniquely identifies the request that was made and can be used for troubleshooting + * the request. + */ + requestId?: string; + /** + * Indicates the version of the Blob service used to execute the request. This header is returned + * for requests made against version 2009-09-19 and above. + */ + version?: string; + /** + * UTC date/time value generated by the service that indicates the time at which the response was + * initiated + */ + date?: Date; + /** + * If this blob has been sealed + */ + isSealed?: boolean; + errorCode?: string; } /** - * Defines values for StorageErrorCode. - * Possible values include: 'AccountAlreadyExists', 'AccountBeingCreated', 'AccountIsDisabled', - * 'AuthenticationFailed', 'ConditionHeadersNotSupported', 'ConditionNotMet', 'EmptyMetadataKey', - * 'InsufficientAccountPermissions', 'InternalError', 'InvalidAuthenticationInfo', - * 'InvalidHeaderValue', 'InvalidHttpVerb', 'InvalidInput', 'InvalidMd5', 'InvalidMetadata', - * 'InvalidQueryParameterValue', 'InvalidRange', 'InvalidResourceName', 'InvalidUri', - * 'InvalidXmlDocument', 'InvalidXmlNodeValue', 'Md5Mismatch', 'MetadataTooLarge', - * 'MissingContentLengthHeader', 'MissingRequiredQueryParameter', 'MissingRequiredHeader', - * 'MissingRequiredXmlNode', 'MultipleConditionHeadersNotSupported', 'OperationTimedOut', - * 'OutOfRangeInput', 'OutOfRangeQueryParameterValue', 'RequestBodyTooLarge', - * 'ResourceTypeMismatch', 'RequestUrlFailedToParse', 'ResourceAlreadyExists', 'ResourceNotFound', - * 'ServerBusy', 'UnsupportedHeader', 'UnsupportedXmlNode', 'UnsupportedQueryParameter', - * 'UnsupportedHttpVerb', 'AppendPositionConditionNotMet', 'BlobAlreadyExists', 'BlobNotFound', - * 'BlobOverwritten', 'BlobTierInadequateForContentLength', 'BlockCountExceedsLimit', - * 'BlockListTooLong', 'CannotChangeToLowerTier', 'CannotVerifyCopySource', - * 'ContainerAlreadyExists', 'ContainerBeingDeleted', 'ContainerDisabled', 'ContainerNotFound', - * 'ContentLengthLargerThanTierLimit', 'CopyAcrossAccountsNotSupported', 'CopyIdMismatch', - * 'FeatureVersionMismatch', 'IncrementalCopyBlobMismatch', - * 'IncrementalCopyOfEralierVersionSnapshotNotAllowed', 'IncrementalCopySourceMustBeSnapshot', - * 'InfiniteLeaseDurationRequired', 'InvalidBlobOrBlock', 'InvalidBlobTier', 'InvalidBlobType', - * 'InvalidBlockId', 'InvalidBlockList', 'InvalidOperation', 'InvalidPageRange', - * 'InvalidSourceBlobType', 'InvalidSourceBlobUrl', 'InvalidVersionForPageBlobOperation', - * 'LeaseAlreadyPresent', 'LeaseAlreadyBroken', 'LeaseIdMismatchWithBlobOperation', - * 'LeaseIdMismatchWithContainerOperation', 'LeaseIdMismatchWithLeaseOperation', 'LeaseIdMissing', - * 'LeaseIsBreakingAndCannotBeAcquired', 'LeaseIsBreakingAndCannotBeChanged', - * 'LeaseIsBrokenAndCannotBeRenewed', 'LeaseLost', 'LeaseNotPresentWithBlobOperation', - * 'LeaseNotPresentWithContainerOperation', 'LeaseNotPresentWithLeaseOperation', - * 'MaxBlobSizeConditionNotMet', 'NoPendingCopyOperation', - * 'OperationNotAllowedOnIncrementalCopyBlob', 'PendingCopyOperation', - * 'PreviousSnapshotCannotBeNewer', 'PreviousSnapshotNotFound', - * 'PreviousSnapshotOperationNotSupported', 'SequenceNumberConditionNotMet', - * 'SequenceNumberIncrementTooLarge', 'SnapshotCountExceeded', 'SnaphotOperationRateExceeded', - * 'SnapshotsPresent', 'SourceConditionNotMet', 'SystemInUse', 'TargetConditionNotMet', - * 'UnauthorizedBlobOverwrite', 'BlobBeingRehydrated', 'BlobArchived', 'BlobNotArchived' - * @readonly - * @enum {string} + * Defines headers for Query operation. */ -export enum StorageErrorCode { - AccountAlreadyExists = 'AccountAlreadyExists', - AccountBeingCreated = 'AccountBeingCreated', - AccountIsDisabled = 'AccountIsDisabled', - AuthenticationFailed = 'AuthenticationFailed', - ConditionHeadersNotSupported = 'ConditionHeadersNotSupported', - ConditionNotMet = 'ConditionNotMet', - EmptyMetadataKey = 'EmptyMetadataKey', - InsufficientAccountPermissions = 'InsufficientAccountPermissions', - InternalError = 'InternalError', - InvalidAuthenticationInfo = 'InvalidAuthenticationInfo', - InvalidHeaderValue = 'InvalidHeaderValue', - InvalidHttpVerb = 'InvalidHttpVerb', - InvalidInput = 'InvalidInput', - InvalidMd5 = 'InvalidMd5', - InvalidMetadata = 'InvalidMetadata', - InvalidQueryParameterValue = 'InvalidQueryParameterValue', - InvalidRange = 'InvalidRange', - InvalidResourceName = 'InvalidResourceName', - InvalidUri = 'InvalidUri', - InvalidXmlDocument = 'InvalidXmlDocument', - InvalidXmlNodeValue = 'InvalidXmlNodeValue', - Md5Mismatch = 'Md5Mismatch', - MetadataTooLarge = 'MetadataTooLarge', - MissingContentLengthHeader = 'MissingContentLengthHeader', - MissingRequiredQueryParameter = 'MissingRequiredQueryParameter', - MissingRequiredHeader = 'MissingRequiredHeader', - MissingRequiredXmlNode = 'MissingRequiredXmlNode', - MultipleConditionHeadersNotSupported = 'MultipleConditionHeadersNotSupported', - OperationTimedOut = 'OperationTimedOut', - OutOfRangeInput = 'OutOfRangeInput', - OutOfRangeQueryParameterValue = 'OutOfRangeQueryParameterValue', - RequestBodyTooLarge = 'RequestBodyTooLarge', - ResourceTypeMismatch = 'ResourceTypeMismatch', - RequestUrlFailedToParse = 'RequestUrlFailedToParse', - ResourceAlreadyExists = 'ResourceAlreadyExists', - ResourceNotFound = 'ResourceNotFound', +export interface BlobQueryHeaders { + /** + * Returns the date and time the container was last modified. Any operation that modifies the + * blob, including an update of the blob's metadata or properties, changes the last-modified time + * of the blob. + */ + lastModified?: Date; + metadata?: { [propertyName: string]: string }; + /** + * The number of bytes present in the response body. + */ + contentLength?: number; + /** + * The media type of the body of the response. For Download Blob this is + * 'application/octet-stream' + */ + contentType?: string; + /** + * Indicates the range of bytes returned in the event that the client requested a subset of the + * blob by setting the 'Range' request header. + */ + contentRange?: string; + /** + * The ETag contains a value that you can use to perform operations conditionally. If the request + * version is 2011-08-18 or newer, the ETag value will be in quotes. + */ + eTag?: string; + /** + * If the blob has an MD5 hash and this operation is to read the full blob, this response header + * is returned so that the client can check for message content integrity. + */ + contentMD5?: Uint8Array; + /** + * This header returns the value that was specified for the Content-Encoding request header + */ + contentEncoding?: string; + /** + * This header is returned if it was previously specified for the blob. + */ + cacheControl?: string; + /** + * This header returns the value that was specified for the 'x-ms-blob-content-disposition' + * header. The Content-Disposition response header field conveys additional information about how + * to process the response payload, and also can be used to attach additional metadata. For + * example, if set to attachment, it indicates that the user-agent should not display the + * response, but instead show a Save As dialog with a filename other than the blob name + * specified. + */ + contentDisposition?: string; + /** + * This header returns the value that was specified for the Content-Language request header. + */ + contentLanguage?: string; + /** + * The current sequence number for a page blob. This header is not returned for block blobs or + * append blobs + */ + blobSequenceNumber?: number; + /** + * The blob's type. Possible values include: 'BlockBlob', 'PageBlob', 'AppendBlob' + */ + blobType?: BlobType; + /** + * Conclusion time of the last attempted Copy Blob operation where this blob was the destination + * blob. This value can specify the time of a completed, aborted, or failed copy attempt. This + * header does not appear if a copy is pending, if this blob has never been the destination in a + * Copy Blob operation, or if this blob has been modified after a concluded Copy Blob operation + * using Set Blob Properties, Put Blob, or Put Block List. + */ + copyCompletionTime?: Date; + /** + * Only appears when x-ms-copy-status is failed or pending. Describes the cause of the last fatal + * or non-fatal copy operation failure. This header does not appear if this blob has never been + * the destination in a Copy Blob operation, or if this blob has been modified after a concluded + * Copy Blob operation using Set Blob Properties, Put Blob, or Put Block List + */ + copyStatusDescription?: string; + /** + * String identifier for this copy operation. Use with Get Blob Properties to check the status of + * this copy operation, or pass to Abort Copy Blob to abort a pending copy. + */ + copyId?: string; + /** + * Contains the number of bytes copied and the total bytes in the source in the last attempted + * Copy Blob operation where this blob was the destination blob. Can show between 0 and + * Content-Length bytes copied. This header does not appear if this blob has never been the + * destination in a Copy Blob operation, or if this blob has been modified after a concluded Copy + * Blob operation using Set Blob Properties, Put Blob, or Put Block List + */ + copyProgress?: string; + /** + * URL up to 2 KB in length that specifies the source blob or file used in the last attempted + * Copy Blob operation where this blob was the destination blob. This header does not appear if + * this blob has never been the destination in a Copy Blob operation, or if this blob has been + * modified after a concluded Copy Blob operation using Set Blob Properties, Put Blob, or Put + * Block List. + */ + copySource?: string; + /** + * State of the copy operation identified by x-ms-copy-id. Possible values include: 'pending', + * 'success', 'aborted', 'failed' + */ + copyStatus?: CopyStatusType; + /** + * When a blob is leased, specifies whether the lease is of infinite or fixed duration. Possible + * values include: 'infinite', 'fixed' + */ + leaseDuration?: LeaseDurationType; + /** + * Lease state of the blob. Possible values include: 'available', 'leased', 'expired', + * 'breaking', 'broken' + */ + leaseState?: LeaseStateType; + /** + * The current lease status of the blob. Possible values include: 'locked', 'unlocked' + */ + leaseStatus?: LeaseStatusType; + /** + * If a client request id header is sent in the request, this header will be present in the + * response with the same value. + */ + clientRequestId?: string; + /** + * This header uniquely identifies the request that was made and can be used for troubleshooting + * the request. + */ + requestId?: string; + /** + * Indicates the version of the Blob service used to execute the request. This header is returned + * for requests made against version 2009-09-19 and above. + */ + version?: string; + /** + * Indicates that the service supports requests for partial blob content. + */ + acceptRanges?: string; + /** + * UTC date/time value generated by the service that indicates the time at which the response was + * initiated + */ + date?: Date; + /** + * The number of committed blocks present in the blob. This header is returned only for append + * blobs. + */ + blobCommittedBlockCount?: number; + /** + * The value of this header is set to true if the blob data and application metadata are + * completely encrypted using the specified algorithm. Otherwise, the value is set to false (when + * the blob is unencrypted, or if only parts of the blob/application metadata are encrypted). + */ + isServerEncrypted?: boolean; + /** + * The SHA-256 hash of the encryption key used to encrypt the blob. This header is only returned + * when the blob was encrypted with a customer-provided key. + */ + encryptionKeySha256?: string; + /** + * Returns the name of the encryption scope used to encrypt the blob contents and application + * metadata. Note that the absence of this header implies use of the default account encryption + * scope. + */ + encryptionScope?: string; + /** + * If the blob has a MD5 hash, and if request contains range header (Range or x-ms-range), this + * response header is returned with the value of the whole blob's MD5 value. This value may or + * may not be equal to the value returned in Content-MD5 header, with the latter calculated from + * the requested range + */ + blobContentMD5?: Uint8Array; + /** + * If the request is to read a specified range and the x-ms-range-get-content-crc64 is set to + * true, then the request returns a crc64 for the range, as long as the range size is less than + * or equal to 4 MB. If both x-ms-range-get-content-crc64 and x-ms-range-get-content-md5 is + * specified in the same request, it will fail with 400(Bad Request) + */ + contentCrc64?: Uint8Array; + errorCode?: string; +} + +/** + * Defines headers for GetTags operation. + */ +export interface BlobGetTagsHeaders { + /** + * If a client request id header is sent in the request, this header will be present in the + * response with the same value. + */ + clientRequestId?: string; + /** + * This header uniquely identifies the request that was made and can be used for troubleshooting + * the request. + */ + requestId?: string; + /** + * Indicates the version of the Blob service used to execute the request. This header is returned + * for requests made against version 2009-09-19 and above. + */ + version?: string; + /** + * UTC date/time value generated by the service that indicates the time at which the response was + * initiated + */ + date?: Date; + errorCode?: string; +} + +/** + * Defines headers for SetTags operation. + */ +export interface BlobSetTagsHeaders { + /** + * If a client request id header is sent in the request, this header will be present in the + * response with the same value. + */ + clientRequestId?: string; + /** + * This header uniquely identifies the request that was made and can be used for troubleshooting + * the request. + */ + requestId?: string; + /** + * Indicates the version of the Blob service used to execute the request. This header is returned + * for requests made against version 2009-09-19 and above. + */ + version?: string; + /** + * UTC date/time value generated by the service that indicates the time at which the response was + * initiated + */ + date?: Date; + errorCode?: string; +} + +/** + * Defines values for PublicAccessType. + * Possible values include: 'container', 'blob' + * @readonly + * @enum {string} + */ +export enum PublicAccessType { + Container = 'container', + Blob = 'blob', +} + +/** + * Defines values for CopyStatusType. + * Possible values include: 'pending', 'success', 'aborted', 'failed' + * @readonly + * @enum {string} + */ +export enum CopyStatusType { + Pending = 'pending', + Success = 'success', + Aborted = 'aborted', + Failed = 'failed', +} + +/** + * Defines values for LeaseDurationType. + * Possible values include: 'infinite', 'fixed' + * @readonly + * @enum {string} + */ +export enum LeaseDurationType { + Infinite = 'infinite', + Fixed = 'fixed', +} + +/** + * Defines values for LeaseStateType. + * Possible values include: 'available', 'leased', 'expired', 'breaking', 'broken' + * @readonly + * @enum {string} + */ +export enum LeaseStateType { + Available = 'available', + Leased = 'leased', + Expired = 'expired', + Breaking = 'breaking', + Broken = 'broken', +} + +/** + * Defines values for LeaseStatusType. + * Possible values include: 'locked', 'unlocked' + * @readonly + * @enum {string} + */ +export enum LeaseStatusType { + Locked = 'locked', + Unlocked = 'unlocked', +} + +/** + * Defines values for AccessTier. + * Possible values include: 'P4', 'P6', 'P10', 'P15', 'P20', 'P30', 'P40', 'P50', 'P60', 'P70', + * 'P80', 'Hot', 'Cool', 'Archive', 'Premium' + * @readonly + * @enum {string} + */ +export enum AccessTier { + P4 = 'P4', + P6 = 'P6', + P10 = 'P10', + P15 = 'P15', + P20 = 'P20', + P30 = 'P30', + P40 = 'P40', + P50 = 'P50', + P60 = 'P60', + P70 = 'P70', + P80 = 'P80', + Hot = 'Hot', + Cool = 'Cool', + Archive = 'Archive', + Premium = 'Premium', +} + +/** + * Defines values for ArchiveStatus. + * Possible values include: 'rehydrate-pending-to-hot', 'rehydrate-pending-to-cool' + * @readonly + * @enum {string} + */ +export enum ArchiveStatus { + RehydratePendingToHot = 'rehydrate-pending-to-hot', + RehydratePendingToCool = 'rehydrate-pending-to-cool', +} + +/** + * Defines values for BlobType. + * Possible values include: 'BlockBlob', 'PageBlob', 'AppendBlob' + * @readonly + * @enum {string} + */ +export enum BlobType { + BlockBlob = 'BlockBlob', + PageBlob = 'PageBlob', + AppendBlob = 'AppendBlob', +} + +/** + * Defines values for RehydratePriority. + * Possible values include: 'High', 'Standard' + * @readonly + * @enum {string} + */ +export enum RehydratePriority { + High = 'High', + Standard = 'Standard', +} + +/** + * Defines values for BlobImmutabilityPolicyMode. + * Possible values include: 'Mutable', 'Unlocked', 'Locked' + * @readonly + * @enum {string} + */ +export enum BlobImmutabilityPolicyMode { + Mutable = 'Mutable', + Unlocked = 'Unlocked', + Locked = 'Locked', +} + +/** + * Defines values for StorageErrorCode. + * Possible values include: 'AccountAlreadyExists', 'AccountBeingCreated', 'AccountIsDisabled', + * 'AuthenticationFailed', 'AuthorizationFailure', 'ConditionHeadersNotSupported', + * 'ConditionNotMet', 'EmptyMetadataKey', 'InsufficientAccountPermissions', 'InternalError', + * 'InvalidAuthenticationInfo', 'InvalidHeaderValue', 'InvalidHttpVerb', 'InvalidInput', + * 'InvalidMd5', 'InvalidMetadata', 'InvalidQueryParameterValue', 'InvalidRange', + * 'InvalidResourceName', 'InvalidUri', 'InvalidXmlDocument', 'InvalidXmlNodeValue', 'Md5Mismatch', + * 'MetadataTooLarge', 'MissingContentLengthHeader', 'MissingRequiredQueryParameter', + * 'MissingRequiredHeader', 'MissingRequiredXmlNode', 'MultipleConditionHeadersNotSupported', + * 'OperationTimedOut', 'OutOfRangeInput', 'OutOfRangeQueryParameterValue', 'RequestBodyTooLarge', + * 'ResourceTypeMismatch', 'RequestUrlFailedToParse', 'ResourceAlreadyExists', 'ResourceNotFound', + * 'ServerBusy', 'UnsupportedHeader', 'UnsupportedXmlNode', 'UnsupportedQueryParameter', + * 'UnsupportedHttpVerb', 'AppendPositionConditionNotMet', 'BlobAlreadyExists', + * 'BlobImmutableDueToPolicy', 'BlobNotFound', 'BlobOverwritten', + * 'BlobTierInadequateForContentLength', 'BlobUsesCustomerSpecifiedEncryption', + * 'BlockCountExceedsLimit', 'BlockListTooLong', 'CannotChangeToLowerTier', + * 'CannotVerifyCopySource', 'ContainerAlreadyExists', 'ContainerBeingDeleted', + * 'ContainerDisabled', 'ContainerNotFound', 'ContentLengthLargerThanTierLimit', + * 'CopyAcrossAccountsNotSupported', 'CopyIdMismatch', 'FeatureVersionMismatch', + * 'IncrementalCopyBlobMismatch', 'IncrementalCopyOfEarlierVersionSnapshotNotAllowed', + * 'IncrementalCopySourceMustBeSnapshot', 'InfiniteLeaseDurationRequired', 'InvalidBlobOrBlock', + * 'InvalidBlobTier', 'InvalidBlobType', 'InvalidBlockId', 'InvalidBlockList', 'InvalidOperation', + * 'InvalidPageRange', 'InvalidSourceBlobType', 'InvalidSourceBlobUrl', + * 'InvalidVersionForPageBlobOperation', 'LeaseAlreadyPresent', 'LeaseAlreadyBroken', + * 'LeaseIdMismatchWithBlobOperation', 'LeaseIdMismatchWithContainerOperation', + * 'LeaseIdMismatchWithLeaseOperation', 'LeaseIdMissing', 'LeaseIsBreakingAndCannotBeAcquired', + * 'LeaseIsBreakingAndCannotBeChanged', 'LeaseIsBrokenAndCannotBeRenewed', 'LeaseLost', + * 'LeaseNotPresentWithBlobOperation', 'LeaseNotPresentWithContainerOperation', + * 'LeaseNotPresentWithLeaseOperation', 'MaxBlobSizeConditionNotMet', + * 'NoAuthenticationInformation', 'NoPendingCopyOperation', + * 'OperationNotAllowedOnIncrementalCopyBlob', 'PendingCopyOperation', + * 'PreviousSnapshotCannotBeNewer', 'PreviousSnapshotNotFound', + * 'PreviousSnapshotOperationNotSupported', 'SequenceNumberConditionNotMet', + * 'SequenceNumberIncrementTooLarge', 'SnapshotCountExceeded', 'SnapshotOperationRateExceeded', + * 'SnapshotsPresent', 'SourceConditionNotMet', 'SystemInUse', 'TargetConditionNotMet', + * 'UnauthorizedBlobOverwrite', 'BlobBeingRehydrated', 'BlobArchived', 'BlobNotArchived', + * 'AuthorizationSourceIPMismatch', 'AuthorizationProtocolMismatch', + * 'AuthorizationPermissionMismatch', 'AuthorizationServiceMismatch', + * 'AuthorizationResourceTypeMismatch' + * @readonly + * @enum {string} + */ +export enum StorageErrorCode { + AccountAlreadyExists = 'AccountAlreadyExists', + AccountBeingCreated = 'AccountBeingCreated', + AccountIsDisabled = 'AccountIsDisabled', + AuthenticationFailed = 'AuthenticationFailed', + AuthorizationFailure = 'AuthorizationFailure', + ConditionHeadersNotSupported = 'ConditionHeadersNotSupported', + ConditionNotMet = 'ConditionNotMet', + EmptyMetadataKey = 'EmptyMetadataKey', + InsufficientAccountPermissions = 'InsufficientAccountPermissions', + InternalError = 'InternalError', + InvalidAuthenticationInfo = 'InvalidAuthenticationInfo', + InvalidHeaderValue = 'InvalidHeaderValue', + InvalidHttpVerb = 'InvalidHttpVerb', + InvalidInput = 'InvalidInput', + InvalidMd5 = 'InvalidMd5', + InvalidMetadata = 'InvalidMetadata', + InvalidQueryParameterValue = 'InvalidQueryParameterValue', + InvalidRange = 'InvalidRange', + InvalidResourceName = 'InvalidResourceName', + InvalidUri = 'InvalidUri', + InvalidXmlDocument = 'InvalidXmlDocument', + InvalidXmlNodeValue = 'InvalidXmlNodeValue', + Md5Mismatch = 'Md5Mismatch', + MetadataTooLarge = 'MetadataTooLarge', + MissingContentLengthHeader = 'MissingContentLengthHeader', + MissingRequiredQueryParameter = 'MissingRequiredQueryParameter', + MissingRequiredHeader = 'MissingRequiredHeader', + MissingRequiredXmlNode = 'MissingRequiredXmlNode', + MultipleConditionHeadersNotSupported = 'MultipleConditionHeadersNotSupported', + OperationTimedOut = 'OperationTimedOut', + OutOfRangeInput = 'OutOfRangeInput', + OutOfRangeQueryParameterValue = 'OutOfRangeQueryParameterValue', + RequestBodyTooLarge = 'RequestBodyTooLarge', + ResourceTypeMismatch = 'ResourceTypeMismatch', + RequestUrlFailedToParse = 'RequestUrlFailedToParse', + ResourceAlreadyExists = 'ResourceAlreadyExists', + ResourceNotFound = 'ResourceNotFound', ServerBusy = 'ServerBusy', UnsupportedHeader = 'UnsupportedHeader', UnsupportedXmlNode = 'UnsupportedXmlNode', @@ -6097,9 +7105,11 @@ export enum StorageErrorCode { UnsupportedHttpVerb = 'UnsupportedHttpVerb', AppendPositionConditionNotMet = 'AppendPositionConditionNotMet', BlobAlreadyExists = 'BlobAlreadyExists', + BlobImmutableDueToPolicy = 'BlobImmutableDueToPolicy', BlobNotFound = 'BlobNotFound', BlobOverwritten = 'BlobOverwritten', BlobTierInadequateForContentLength = 'BlobTierInadequateForContentLength', + BlobUsesCustomerSpecifiedEncryption = 'BlobUsesCustomerSpecifiedEncryption', BlockCountExceedsLimit = 'BlockCountExceedsLimit', BlockListTooLong = 'BlockListTooLong', CannotChangeToLowerTier = 'CannotChangeToLowerTier', @@ -6113,7 +7123,7 @@ export enum StorageErrorCode { CopyIdMismatch = 'CopyIdMismatch', FeatureVersionMismatch = 'FeatureVersionMismatch', IncrementalCopyBlobMismatch = 'IncrementalCopyBlobMismatch', - IncrementalCopyOfEralierVersionSnapshotNotAllowed = 'IncrementalCopyOfEralierVersionSnapshotNotAllowed', + IncrementalCopyOfEarlierVersionSnapshotNotAllowed = 'IncrementalCopyOfEarlierVersionSnapshotNotAllowed', IncrementalCopySourceMustBeSnapshot = 'IncrementalCopySourceMustBeSnapshot', InfiniteLeaseDurationRequired = 'InfiniteLeaseDurationRequired', InvalidBlobOrBlock = 'InvalidBlobOrBlock', @@ -6140,6 +7150,7 @@ export enum StorageErrorCode { LeaseNotPresentWithContainerOperation = 'LeaseNotPresentWithContainerOperation', LeaseNotPresentWithLeaseOperation = 'LeaseNotPresentWithLeaseOperation', MaxBlobSizeConditionNotMet = 'MaxBlobSizeConditionNotMet', + NoAuthenticationInformation = 'NoAuthenticationInformation', NoPendingCopyOperation = 'NoPendingCopyOperation', OperationNotAllowedOnIncrementalCopyBlob = 'OperationNotAllowedOnIncrementalCopyBlob', PendingCopyOperation = 'PendingCopyOperation', @@ -6149,7 +7160,7 @@ export enum StorageErrorCode { SequenceNumberConditionNotMet = 'SequenceNumberConditionNotMet', SequenceNumberIncrementTooLarge = 'SequenceNumberIncrementTooLarge', SnapshotCountExceeded = 'SnapshotCountExceeded', - SnaphotOperationRateExceeded = 'SnaphotOperationRateExceeded', + SnapshotOperationRateExceeded = 'SnapshotOperationRateExceeded', SnapshotsPresent = 'SnapshotsPresent', SourceConditionNotMet = 'SourceConditionNotMet', SystemInUse = 'SystemInUse', @@ -6158,177 +7169,932 @@ export enum StorageErrorCode { BlobBeingRehydrated = 'BlobBeingRehydrated', BlobArchived = 'BlobArchived', BlobNotArchived = 'BlobNotArchived', + AuthorizationSourceIPMismatch = 'AuthorizationSourceIPMismatch', + AuthorizationProtocolMismatch = 'AuthorizationProtocolMismatch', + AuthorizationPermissionMismatch = 'AuthorizationPermissionMismatch', + AuthorizationServiceMismatch = 'AuthorizationServiceMismatch', + AuthorizationResourceTypeMismatch = 'AuthorizationResourceTypeMismatch', +} + +/** + * Defines values for GeoReplicationStatusType. + * Possible values include: 'live', 'bootstrap', 'unavailable' + * @readonly + * @enum {string} + */ +export enum GeoReplicationStatusType { + Live = 'live', + Bootstrap = 'bootstrap', + Unavailable = 'unavailable', +} + +/** + * Defines values for QueryFormatType. + * Possible values include: 'delimited', 'json', 'arrow', 'parquet' + * @readonly + * @enum {string} + */ +export enum QueryFormatType { + Delimited = 'delimited', + Json = 'json', + Arrow = 'arrow', + Parquet = 'parquet', +} + +/** + * Defines values for PremiumPageBlobAccessTier. + * Possible values include: 'P4', 'P6', 'P10', 'P15', 'P20', 'P30', 'P40', 'P50', 'P60', 'P70', + * 'P80' + * @readonly + * @enum {string} + */ +export enum PremiumPageBlobAccessTier { + P4 = 'P4', + P6 = 'P6', + P10 = 'P10', + P15 = 'P15', + P20 = 'P20', + P30 = 'P30', + P40 = 'P40', + P50 = 'P50', + P60 = 'P60', + P70 = 'P70', + P80 = 'P80', +} + +/** + * Defines values for BlobDeleteType. + * Possible values include: 'Permanent' + * @readonly + * @enum {string} + */ +export enum BlobDeleteType { + Permanent = 'Permanent', +} + +/** + * Defines values for BlobExpiryOptions. + * Possible values include: 'NeverExpire', 'RelativeToCreation', 'RelativeToNow', 'Absolute' + * @readonly + * @enum {string} + */ +export enum BlobExpiryOptions { + NeverExpire = 'NeverExpire', + RelativeToCreation = 'RelativeToCreation', + RelativeToNow = 'RelativeToNow', + Absolute = 'Absolute', +} + +/** + * Defines values for BlockListType. + * Possible values include: 'committed', 'uncommitted', 'all' + * @readonly + * @enum {string} + */ +export enum BlockListType { + Committed = 'committed', + Uncommitted = 'uncommitted', + All = 'all', +} + +/** + * Defines values for BlobCopySourceTags. + * Possible values include: 'REPLACE', 'COPY' + * @readonly + * @enum {string} + */ +export enum BlobCopySourceTags { + REPLACE = 'REPLACE', + COPY = 'COPY', +} + +/** + * Defines values for DeleteSnapshotsOptionType. + * Possible values include: 'include', 'only' + * @readonly + * @enum {string} + */ +export enum DeleteSnapshotsOptionType { + Include = 'include', + Only = 'only', +} + +/** + * Defines values for EncryptionAlgorithmType. + * Possible values include: 'AES256' + * @readonly + * @enum {string} + */ +export enum EncryptionAlgorithmType { + AES256 = 'AES256', +} + +/** + * Defines values for FilterBlobsIncludeItem. + * Possible values include: 'none', 'versions' + * @readonly + * @enum {string} + */ +export enum FilterBlobsIncludeItem { + None = 'none', + Versions = 'versions', +} + +/** + * Defines values for ListBlobsIncludeItem. + * Possible values include: '', 'copy', 'deleted', 'metadata', 'snapshots', 'uncommittedblobs', + * 'versions', 'tags', 'immutabilitypolicy', 'legalhold', 'deletedwithversions', 'permissions' + * @readonly + * @enum {string} + */ +export enum ListBlobsIncludeItem { + EmptyString = '', + Copy = 'copy', + Deleted = 'deleted', + Metadata = 'metadata', + Snapshots = 'snapshots', + Uncommittedblobs = 'uncommittedblobs', + Versions = 'versions', + Tags = 'tags', + Immutabilitypolicy = 'immutabilitypolicy', + Legalhold = 'legalhold', + Deletedwithversions = 'deletedwithversions', + Permissions = 'permissions', +} + +/** + * Defines values for ListContainersIncludeType. + * Possible values include: '', 'metadata', 'deleted', 'system' + * @readonly + * @enum {string} + */ +export enum ListContainersIncludeType { + EmptyString = '', + Metadata = 'metadata', + Deleted = 'deleted', + System = 'system', +} + +/** + * Defines values for SequenceNumberActionType. + * Possible values include: 'max', 'update', 'increment' + * @readonly + * @enum {string} + */ +export enum SequenceNumberActionType { + Max = 'max', + Update = 'update', + Increment = 'increment', +} + +/** + * Defines values for SkuName. + * Possible values include: 'Standard_LRS', 'Standard_GRS', 'Standard_RAGRS', 'Standard_ZRS', + * 'Premium_LRS' + * @readonly + * @enum {string} + */ +export enum SkuName { + StandardLRS = 'Standard_LRS', + StandardGRS = 'Standard_GRS', + StandardRAGRS = 'Standard_RAGRS', + StandardZRS = 'Standard_ZRS', + PremiumLRS = 'Premium_LRS', +} + +/** + * Defines values for AccountKind. + * Possible values include: 'Storage', 'BlobStorage', 'StorageV2', 'FileStorage', + * 'BlockBlobStorage' + * @readonly + * @enum {string} + */ +export enum AccountKind { + Storage = 'Storage', + BlobStorage = 'BlobStorage', + StorageV2 = 'StorageV2', + FileStorage = 'FileStorage', + BlockBlobStorage = 'BlockBlobStorage', +} + +/** + * Defines values for SyncCopyStatusType. + * Possible values include: 'success' + * @readonly + * @enum {string} + */ +export enum SyncCopyStatusType { + Success = 'success', +} + +/** + * Defines values for Version. + * Possible values include: '2021-10-04' + * @readonly + * @enum {string} + */ +export enum Version { + TwoZeroTwoOneHyphenMinusOneZeroHyphenMinusZeroFour = '2021-10-04', +} + +/** + * Defines values for Version1. + * Possible values include: '2021-10-04' + * @readonly + * @enum {string} + */ +export enum Version1 { + TwoZeroTwoOneHyphenMinusOneZeroHyphenMinusZeroFour = '2021-10-04', +} + +/** + * Defines values for Version2. + * Possible values include: '2021-10-04' + * @readonly + * @enum {string} + */ +export enum Version2 { + TwoZeroTwoOneHyphenMinusOneZeroHyphenMinusZeroFour = '2021-10-04', +} + +/** + * Defines values for Version3. + * Possible values include: '2021-10-04' + * @readonly + * @enum {string} + */ +export enum Version3 { + TwoZeroTwoOneHyphenMinusOneZeroHyphenMinusZeroFour = '2021-10-04', +} + +/** + * Defines values for Version4. + * Possible values include: '2021-10-04' + * @readonly + * @enum {string} + */ +export enum Version4 { + TwoZeroTwoOneHyphenMinusOneZeroHyphenMinusZeroFour = '2021-10-04', +} + +/** + * Defines values for Version5. + * Possible values include: '2021-10-04' + * @readonly + * @enum {string} + */ +export enum Version5 { + TwoZeroTwoOneHyphenMinusOneZeroHyphenMinusZeroFour = '2021-10-04', +} + +/** + * Defines values for Version6. + * Possible values include: '2021-10-04' + * @readonly + * @enum {string} + */ +export enum Version6 { + TwoZeroTwoOneHyphenMinusOneZeroHyphenMinusZeroFour = '2021-10-04', +} + +/** + * Defines values for Version7. + * Possible values include: '2021-10-04' + * @readonly + * @enum {string} + */ +export enum Version7 { + TwoZeroTwoOneHyphenMinusOneZeroHyphenMinusZeroFour = '2021-10-04', +} + +/** + * Defines values for Version8. + * Possible values include: '2021-10-04' + * @readonly + * @enum {string} + */ +export enum Version8 { + TwoZeroTwoOneHyphenMinusOneZeroHyphenMinusZeroFour = '2021-10-04', +} + +/** + * Defines values for Version9. + * Possible values include: '2021-10-04' + * @readonly + * @enum {string} + */ +export enum Version9 { + TwoZeroTwoOneHyphenMinusOneZeroHyphenMinusZeroFour = '2021-10-04', +} + +/** + * Defines values for Version10. + * Possible values include: '2021-10-04' + * @readonly + * @enum {string} + */ +export enum Version10 { + TwoZeroTwoOneHyphenMinusOneZeroHyphenMinusZeroFour = '2021-10-04', +} + +/** + * Defines values for Version11. + * Possible values include: '2021-10-04' + * @readonly + * @enum {string} + */ +export enum Version11 { + TwoZeroTwoOneHyphenMinusOneZeroHyphenMinusZeroFour = '2021-10-04', +} + +/** + * Defines values for Version12. + * Possible values include: '2021-10-04' + * @readonly + * @enum {string} + */ +export enum Version12 { + TwoZeroTwoOneHyphenMinusOneZeroHyphenMinusZeroFour = '2021-10-04', +} + +/** + * Defines values for Version13. + * Possible values include: '2021-10-04' + * @readonly + * @enum {string} + */ +export enum Version13 { + TwoZeroTwoOneHyphenMinusOneZeroHyphenMinusZeroFour = '2021-10-04', +} + +/** + * Defines values for Version14. + * Possible values include: '2021-10-04' + * @readonly + * @enum {string} + */ +export enum Version14 { + TwoZeroTwoOneHyphenMinusOneZeroHyphenMinusZeroFour = '2021-10-04', +} + +/** + * Defines values for Version15. + * Possible values include: '2021-10-04' + * @readonly + * @enum {string} + */ +export enum Version15 { + TwoZeroTwoOneHyphenMinusOneZeroHyphenMinusZeroFour = '2021-10-04', +} + +/** + * Defines values for Version16. + * Possible values include: '2021-10-04' + * @readonly + * @enum {string} + */ +export enum Version16 { + TwoZeroTwoOneHyphenMinusOneZeroHyphenMinusZeroFour = '2021-10-04', +} + +/** + * Defines values for Version17. + * Possible values include: '2021-10-04' + * @readonly + * @enum {string} + */ +export enum Version17 { + TwoZeroTwoOneHyphenMinusOneZeroHyphenMinusZeroFour = '2021-10-04', +} + +/** + * Defines values for Version18. + * Possible values include: '2021-10-04' + * @readonly + * @enum {string} + */ +export enum Version18 { + TwoZeroTwoOneHyphenMinusOneZeroHyphenMinusZeroFour = '2021-10-04', +} + +/** + * Defines values for Version19. + * Possible values include: '2021-10-04' + * @readonly + * @enum {string} + */ +export enum Version19 { + TwoZeroTwoOneHyphenMinusOneZeroHyphenMinusZeroFour = '2021-10-04', +} + +/** + * Defines values for Version20. + * Possible values include: '2021-10-04' + * @readonly + * @enum {string} + */ +export enum Version20 { + TwoZeroTwoOneHyphenMinusOneZeroHyphenMinusZeroFour = '2021-10-04', +} + +/** + * Defines values for Version21. + * Possible values include: '2021-10-04' + * @readonly + * @enum {string} + */ +export enum Version21 { + TwoZeroTwoOneHyphenMinusOneZeroHyphenMinusZeroFour = '2021-10-04', +} + +/** + * Defines values for Version22. + * Possible values include: '2021-10-04' + * @readonly + * @enum {string} + */ +export enum Version22 { + TwoZeroTwoOneHyphenMinusOneZeroHyphenMinusZeroFour = '2021-10-04', +} + +/** + * Defines values for Version23. + * Possible values include: '2021-10-04' + * @readonly + * @enum {string} + */ +export enum Version23 { + TwoZeroTwoOneHyphenMinusOneZeroHyphenMinusZeroFour = '2021-10-04', +} + +/** + * Defines values for Version24. + * Possible values include: '2021-10-04' + * @readonly + * @enum {string} + */ +export enum Version24 { + TwoZeroTwoOneHyphenMinusOneZeroHyphenMinusZeroFour = '2021-10-04', +} + +/** + * Defines values for Version25. + * Possible values include: '2021-10-04' + * @readonly + * @enum {string} + */ +export enum Version25 { + TwoZeroTwoOneHyphenMinusOneZeroHyphenMinusZeroFour = '2021-10-04', +} + +/** + * Defines values for Version26. + * Possible values include: '2021-10-04' + * @readonly + * @enum {string} + */ +export enum Version26 { + TwoZeroTwoOneHyphenMinusOneZeroHyphenMinusZeroFour = '2021-10-04', +} + +/** + * Defines values for Version27. + * Possible values include: '2021-10-04' + * @readonly + * @enum {string} + */ +export enum Version27 { + TwoZeroTwoOneHyphenMinusOneZeroHyphenMinusZeroFour = '2021-10-04', +} + +/** + * Defines values for Version28. + * Possible values include: '2021-10-04' + * @readonly + * @enum {string} + */ +export enum Version28 { + TwoZeroTwoOneHyphenMinusOneZeroHyphenMinusZeroFour = '2021-10-04', +} + +/** + * Defines values for Version29. + * Possible values include: '2021-10-04' + * @readonly + * @enum {string} + */ +export enum Version29 { + TwoZeroTwoOneHyphenMinusOneZeroHyphenMinusZeroFour = '2021-10-04', +} + +/** + * Defines values for Version30. + * Possible values include: '2021-10-04' + * @readonly + * @enum {string} + */ +export enum Version30 { + TwoZeroTwoOneHyphenMinusOneZeroHyphenMinusZeroFour = '2021-10-04', +} + +/** + * Defines values for Version31. + * Possible values include: '2021-10-04' + * @readonly + * @enum {string} + */ +export enum Version31 { + TwoZeroTwoOneHyphenMinusOneZeroHyphenMinusZeroFour = '2021-10-04', +} + +/** + * Defines values for Version32. + * Possible values include: '2021-10-04' + * @readonly + * @enum {string} + */ +export enum Version32 { + TwoZeroTwoOneHyphenMinusOneZeroHyphenMinusZeroFour = '2021-10-04', +} + +/** + * Defines values for Version33. + * Possible values include: '2021-10-04' + * @readonly + * @enum {string} + */ +export enum Version33 { + TwoZeroTwoOneHyphenMinusOneZeroHyphenMinusZeroFour = '2021-10-04', +} + +/** + * Defines values for Version34. + * Possible values include: '2021-10-04' + * @readonly + * @enum {string} + */ +export enum Version34 { + TwoZeroTwoOneHyphenMinusOneZeroHyphenMinusZeroFour = '2021-10-04', +} + +/** + * Defines values for Version35. + * Possible values include: '2021-10-04' + * @readonly + * @enum {string} + */ +export enum Version35 { + TwoZeroTwoOneHyphenMinusOneZeroHyphenMinusZeroFour = '2021-10-04', +} + +/** + * Defines values for Version36. + * Possible values include: '2021-10-04' + * @readonly + * @enum {string} + */ +export enum Version36 { + TwoZeroTwoOneHyphenMinusOneZeroHyphenMinusZeroFour = '2021-10-04', +} + +/** + * Defines values for Version37. + * Possible values include: '2021-10-04' + * @readonly + * @enum {string} + */ +export enum Version37 { + TwoZeroTwoOneHyphenMinusOneZeroHyphenMinusZeroFour = '2021-10-04', +} + +/** + * Defines values for Version38. + * Possible values include: '2021-10-04' + * @readonly + * @enum {string} + */ +export enum Version38 { + TwoZeroTwoOneHyphenMinusOneZeroHyphenMinusZeroFour = '2021-10-04', +} + +/** + * Defines values for Version39. + * Possible values include: '2021-10-04' + * @readonly + * @enum {string} + */ +export enum Version39 { + TwoZeroTwoOneHyphenMinusOneZeroHyphenMinusZeroFour = '2021-10-04', +} + +/** + * Defines values for Version40. + * Possible values include: '2021-10-04' + * @readonly + * @enum {string} + */ +export enum Version40 { + TwoZeroTwoOneHyphenMinusOneZeroHyphenMinusZeroFour = '2021-10-04', +} + +/** + * Defines values for Version41. + * Possible values include: '2021-10-04' + * @readonly + * @enum {string} + */ +export enum Version41 { + TwoZeroTwoOneHyphenMinusOneZeroHyphenMinusZeroFour = '2021-10-04', +} + +/** + * Defines values for Version42. + * Possible values include: '2021-10-04' + * @readonly + * @enum {string} + */ +export enum Version42 { + TwoZeroTwoOneHyphenMinusOneZeroHyphenMinusZeroFour = '2021-10-04', +} + +/** + * Defines values for Version43. + * Possible values include: '2021-10-04' + * @readonly + * @enum {string} + */ +export enum Version43 { + TwoZeroTwoOneHyphenMinusOneZeroHyphenMinusZeroFour = '2021-10-04', +} + +/** + * Defines values for Version44. + * Possible values include: '2021-10-04' + * @readonly + * @enum {string} + */ +export enum Version44 { + TwoZeroTwoOneHyphenMinusOneZeroHyphenMinusZeroFour = '2021-10-04', +} + +/** + * Defines values for Version45. + * Possible values include: '2021-10-04' + * @readonly + * @enum {string} + */ +export enum Version45 { + TwoZeroTwoOneHyphenMinusOneZeroHyphenMinusZeroFour = '2021-10-04', +} + +/** + * Defines values for Version46. + * Possible values include: '2021-10-04' + * @readonly + * @enum {string} + */ +export enum Version46 { + TwoZeroTwoOneHyphenMinusOneZeroHyphenMinusZeroFour = '2021-10-04', +} + +/** + * Defines values for Version47. + * Possible values include: '2021-10-04' + * @readonly + * @enum {string} + */ +export enum Version47 { + TwoZeroTwoOneHyphenMinusOneZeroHyphenMinusZeroFour = '2021-10-04', +} + +/** + * Defines values for Version48. + * Possible values include: '2021-10-04' + * @readonly + * @enum {string} + */ +export enum Version48 { + TwoZeroTwoOneHyphenMinusOneZeroHyphenMinusZeroFour = '2021-10-04', +} + +/** + * Defines values for Version49. + * Possible values include: '2021-10-04' + * @readonly + * @enum {string} + */ +export enum Version49 { + TwoZeroTwoOneHyphenMinusOneZeroHyphenMinusZeroFour = '2021-10-04', +} + +/** + * Defines values for Version50. + * Possible values include: '2021-10-04' + * @readonly + * @enum {string} + */ +export enum Version50 { + TwoZeroTwoOneHyphenMinusOneZeroHyphenMinusZeroFour = '2021-10-04', +} + +/** + * Defines values for Version51. + * Possible values include: '2021-10-04' + * @readonly + * @enum {string} + */ +export enum Version51 { + TwoZeroTwoOneHyphenMinusOneZeroHyphenMinusZeroFour = '2021-10-04', +} + +/** + * Defines values for Version52. + * Possible values include: '2021-10-04' + * @readonly + * @enum {string} + */ +export enum Version52 { + TwoZeroTwoOneHyphenMinusOneZeroHyphenMinusZeroFour = '2021-10-04', +} + +/** + * Defines values for Version53. + * Possible values include: '2021-10-04' + * @readonly + * @enum {string} + */ +export enum Version53 { + TwoZeroTwoOneHyphenMinusOneZeroHyphenMinusZeroFour = '2021-10-04', } /** - * Defines values for GeoReplicationStatusType. - * Possible values include: 'live', 'bootstrap', 'unavailable' + * Defines values for Version54. + * Possible values include: '2021-10-04' * @readonly * @enum {string} */ -export enum GeoReplicationStatusType { - Live = 'live', - Bootstrap = 'bootstrap', - Unavailable = 'unavailable', +export enum Version54 { + TwoZeroTwoOneHyphenMinusOneZeroHyphenMinusZeroFour = '2021-10-04', } /** - * Defines values for RehydratePriority. - * Possible values include: 'High', 'Standard' + * Defines values for Version55. + * Possible values include: '2021-10-04' * @readonly * @enum {string} */ -export enum RehydratePriority { - High = 'High', - Standard = 'Standard', +export enum Version55 { + TwoZeroTwoOneHyphenMinusOneZeroHyphenMinusZeroFour = '2021-10-04', } /** - * Defines values for PageBlobAccessTier. - * Possible values include: 'P4', 'P6', 'P10', 'P15', 'P20', 'P30', 'P40', 'P50', 'P60', 'P70', - * 'P80' + * Defines values for Version56. + * Possible values include: '2021-10-04' * @readonly * @enum {string} */ -export enum PageBlobAccessTier { - P4 = 'P4', - P6 = 'P6', - P10 = 'P10', - P15 = 'P15', - P20 = 'P20', - P30 = 'P30', - P40 = 'P40', - P50 = 'P50', - P60 = 'P60', - P70 = 'P70', - P80 = 'P80', +export enum Version56 { + TwoZeroTwoOneHyphenMinusOneZeroHyphenMinusZeroFour = '2021-10-04', } /** - * Defines values for BlockListType. - * Possible values include: 'committed', 'uncommitted', 'all' + * Defines values for Version57. + * Possible values include: '2021-10-04' * @readonly * @enum {string} */ -export enum BlockListType { - Committed = 'committed', - Uncommitted = 'uncommitted', - All = 'all', +export enum Version57 { + TwoZeroTwoOneHyphenMinusOneZeroHyphenMinusZeroFour = '2021-10-04', } /** - * Defines values for DeleteSnapshotsOptionType. - * Possible values include: 'include', 'only' + * Defines values for Version58. + * Possible values include: '2021-10-04' * @readonly * @enum {string} */ -export enum DeleteSnapshotsOptionType { - Include = 'include', - Only = 'only', +export enum Version58 { + TwoZeroTwoOneHyphenMinusOneZeroHyphenMinusZeroFour = '2021-10-04', } /** - * Defines values for EncryptionAlgorithmType. - * Possible values include: 'AES256' + * Defines values for Version59. + * Possible values include: '2021-10-04' * @readonly * @enum {string} */ -export enum EncryptionAlgorithmType { - AES256 = 'AES256', +export enum Version59 { + TwoZeroTwoOneHyphenMinusOneZeroHyphenMinusZeroFour = '2021-10-04', } /** - * Defines values for ListBlobsIncludeItem. - * Possible values include: '', 'copy', 'deleted', 'metadata', 'snapshots', 'uncommittedblobs', - * 'tags', 'versions', 'deletedwithversions', 'immutabilitypolicy', 'legalhold', 'permissions' + * Defines values for Version60. + * Possible values include: '2021-10-04' * @readonly * @enum {string} */ -export enum ListBlobsIncludeItem { - EmptyString = '', - Copy = 'copy', - Deleted = 'deleted', - Metadata = 'metadata', - Snapshots = 'snapshots', - Uncommittedblobs = 'uncommittedblobs', - Tags = 'tags', - Versions = 'versions', - Deletedwithversions = 'deletedwithversions', - Immutabilitypolicy = 'immutabilitypolicy', - Legalhold = 'legalhold', - Permissions = 'permissions', +export enum Version60 { + TwoZeroTwoOneHyphenMinusOneZeroHyphenMinusZeroFour = '2021-10-04', } /** - * Defines values for ListContainersIncludeType. - * Possible values include: '', 'metadata', 'deleted' + * Defines values for Version61. + * Possible values include: '2021-10-04' * @readonly * @enum {string} */ -export enum ListContainersIncludeType { - EmptyString = '', - Metadata = 'metadata', - Deleted = 'deleted', +export enum Version61 { + TwoZeroTwoOneHyphenMinusOneZeroHyphenMinusZeroFour = '2021-10-04', } /** - * Defines values for PathRenameMode. - * Possible values include: 'legacy', 'posix' + * Defines values for Version62. + * Possible values include: '2021-10-04' * @readonly * @enum {string} */ -export enum PathRenameMode { - Legacy = 'legacy', - Posix = 'posix', +export enum Version62 { + TwoZeroTwoOneHyphenMinusOneZeroHyphenMinusZeroFour = '2021-10-04', } /** - * Defines values for SequenceNumberActionType. - * Possible values include: 'max', 'update', 'increment' + * Defines values for Version63. + * Possible values include: '2021-10-04' * @readonly * @enum {string} */ -export enum SequenceNumberActionType { - Max = 'max', - Update = 'update', - Increment = 'increment', +export enum Version63 { + TwoZeroTwoOneHyphenMinusOneZeroHyphenMinusZeroFour = '2021-10-04', } /** - * Defines values for SkuName. - * Possible values include: 'Standard_LRS', 'Standard_GRS', 'Standard_RAGRS', 'Standard_ZRS', - * 'Premium_LRS' + * Defines values for Version64. + * Possible values include: '2021-10-04' * @readonly * @enum {string} */ -export enum SkuName { - StandardLRS = 'Standard_LRS', - StandardGRS = 'Standard_GRS', - StandardRAGRS = 'Standard_RAGRS', - StandardZRS = 'Standard_ZRS', - PremiumLRS = 'Premium_LRS', +export enum Version64 { + TwoZeroTwoOneHyphenMinusOneZeroHyphenMinusZeroFour = '2021-10-04', } /** - * Defines values for AccountKind. - * Possible values include: 'Storage', 'BlobStorage', 'StorageV2' + * Defines values for Version65. + * Possible values include: '2021-10-04' * @readonly * @enum {string} */ -export enum AccountKind { - Storage = 'Storage', - BlobStorage = 'BlobStorage', - StorageV2 = 'StorageV2', +export enum Version65 { + TwoZeroTwoOneHyphenMinusOneZeroHyphenMinusZeroFour = '2021-10-04', } /** - * Defines values for SyncCopyStatusType. - * Possible values include: 'success' + * Defines values for Version66. + * Possible values include: '2021-10-04' * @readonly * @enum {string} */ -export enum SyncCopyStatusType { - Success = 'success', +export enum Version66 { + TwoZeroTwoOneHyphenMinusOneZeroHyphenMinusZeroFour = '2021-10-04', +} + +/** + * Defines values for Version67. + * Possible values include: '2021-10-04' + * @readonly + * @enum {string} + */ +export enum Version67 { + TwoZeroTwoOneHyphenMinusOneZeroHyphenMinusZeroFour = '2021-10-04', +} + +/** + * Defines values for Version68. + * Possible values include: '2021-10-04' + * @readonly + * @enum {string} + */ +export enum Version68 { + TwoZeroTwoOneHyphenMinusOneZeroHyphenMinusZeroFour = '2021-10-04', +} + +/** + * Defines values for Version69. + * Possible values include: '2021-10-04' + * @readonly + * @enum {string} + */ +export enum Version69 { + TwoZeroTwoOneHyphenMinusOneZeroHyphenMinusZeroFour = '2021-10-04', +} + +/** + * Defines values for Version70. + * Possible values include: '2021-10-04' + * @readonly + * @enum {string} + */ +export enum Version70 { + TwoZeroTwoOneHyphenMinusOneZeroHyphenMinusZeroFour = '2021-10-04', } /** @@ -6391,16 +8157,6 @@ export type ServiceGetAccountInfoResponse = ServiceGetAccountInfoHeaders & { statusCode: 200; }; -/** - * Contains response data for the getAccountInfoWithHead operation. - */ -export type ServiceGetAccountInfoWithHeadResponse = ServiceGetAccountInfoWithHeadHeaders & { - /** - * The response status code. - */ - statusCode: 200; -}; - /** * Contains response data for the submitBatch operation. */ @@ -6416,6 +8172,16 @@ export type ServiceSubmitBatchResponse = ServiceSubmitBatchHeaders & { statusCode: 202; }; +/** + * Contains response data for the filterBlobs operation. + */ +export type ServiceFilterBlobsResponse = FilterBlobSegment & ServiceFilterBlobsHeaders & { + /** + * The response status code. + */ + statusCode: 200; +}; + /** * Contains response data for the create operation. */ @@ -6437,9 +8203,9 @@ export type ContainerGetPropertiesResponse = ContainerGetPropertiesHeaders & { }; /** - * Contains response data for the getPropertiesWithHead operation. + * Contains response data for the getProperties1 operation. */ -export type ContainerGetPropertiesWithHeadResponse = ContainerGetPropertiesWithHeadHeaders & { +export type ContainerGetPropertiesHeaders12 = ContainerGetPropertiesHeaders1 & { /** * The response status code. */ @@ -6487,24 +8253,9 @@ export type ContainerSetAccessPolicyResponse = ContainerSetAccessPolicyHeaders & }; /** - * Contains response data for the submitBatch operation. - */ -export type ContainerSubmitBatchResponse = ContainerSubmitBatchHeaders & { - /** - * The response body as a node.js Readable stream. - */ - body?: NodeJS.ReadableStream; -} & { - /** - * The response status code. - */ - statusCode: 202; -}; - -/** - * Contains response data for the acquireLease operation. + * Contains response data for the restore operation. */ -export type ContainerAcquireLeaseResponse = ContainerAcquireLeaseHeaders & { +export type ContainerRestoreResponse = ContainerRestoreHeaders & { /** * The response status code. */ @@ -6512,9 +8263,9 @@ export type ContainerAcquireLeaseResponse = ContainerAcquireLeaseHeaders & { }; /** - * Contains response data for the releaseLease operation. + * Contains response data for the rename operation. */ -export type ContainerReleaseLeaseResponse = ContainerReleaseLeaseHeaders & { +export type ContainerRenameResponse = ContainerRenameHeaders & { /** * The response status code. */ @@ -6522,19 +8273,14 @@ export type ContainerReleaseLeaseResponse = ContainerReleaseLeaseHeaders & { }; /** - * Contains response data for the renewLease operation. + * Contains response data for the submitBatch operation. */ -export type ContainerRenewLeaseResponse = ContainerRenewLeaseHeaders & { +export type ContainerSubmitBatchResponse = ContainerSubmitBatchHeaders & { /** - * The response status code. + * The response body as a node.js Readable stream. */ - statusCode: 200; -}; - -/** - * Contains response data for the breakLease operation. - */ -export type ContainerBreakLeaseResponse = ContainerBreakLeaseHeaders & { + body?: NodeJS.ReadableStream; +} & { /** * The response status code. */ @@ -6542,19 +8288,9 @@ export type ContainerBreakLeaseResponse = ContainerBreakLeaseHeaders & { }; /** - * Contains response data for the changeLease operation. - */ -export type ContainerChangeLeaseResponse = ContainerChangeLeaseHeaders & { - /** - * The response status code. - */ - statusCode: 200; -}; - -/** - * Contains response data for the listBlobFlatSegment operation. + * Contains response data for the filterBlobs operation. */ -export type ContainerListBlobFlatSegmentResponse = ListBlobsFlatSegmentResponse & ContainerListBlobFlatSegmentHeaders & { +export type ContainerFilterBlobsResponse = FilterBlobSegment & ContainerFilterBlobsHeaders & { /** * The response status code. */ @@ -6562,19 +8298,19 @@ export type ContainerListBlobFlatSegmentResponse = ListBlobsFlatSegmentResponse }; /** - * Contains response data for the listBlobHierarchySegment operation. + * Contains response data for the acquireLease operation. */ -export type ContainerListBlobHierarchySegmentResponse = ListBlobsHierarchySegmentResponse & ContainerListBlobHierarchySegmentHeaders & { +export type ContainerAcquireLeaseResponse = ContainerAcquireLeaseHeaders & { /** * The response status code. */ - statusCode: 200; + statusCode: 201; }; /** - * Contains response data for the getAccountInfo operation. + * Contains response data for the releaseLease operation. */ -export type ContainerGetAccountInfoResponse = ContainerGetAccountInfoHeaders & { +export type ContainerReleaseLeaseResponse = ContainerReleaseLeaseHeaders & { /** * The response status code. */ @@ -6582,9 +8318,9 @@ export type ContainerGetAccountInfoResponse = ContainerGetAccountInfoHeaders & { }; /** - * Contains response data for the getAccountInfoWithHead operation. + * Contains response data for the renewLease operation. */ -export type ContainerGetAccountInfoWithHeadResponse = ContainerGetAccountInfoWithHeadHeaders & { +export type ContainerRenewLeaseResponse = ContainerRenewLeaseHeaders & { /** * The response status code. */ @@ -6592,29 +8328,29 @@ export type ContainerGetAccountInfoWithHeadResponse = ContainerGetAccountInfoWit }; /** - * Contains response data for the create operation. + * Contains response data for the breakLease operation. */ -export type DirectoryCreateResponse = DirectoryCreateHeaders & { +export type ContainerBreakLeaseResponse = ContainerBreakLeaseHeaders & { /** * The response status code. */ - statusCode: 201; + statusCode: 202; }; /** - * Contains response data for the rename operation. + * Contains response data for the changeLease operation. */ -export type DirectoryRenameResponse = DirectoryRenameHeaders & { +export type ContainerChangeLeaseResponse = ContainerChangeLeaseHeaders & { /** * The response status code. */ - statusCode: 201; + statusCode: 200; }; /** - * Contains response data for the deleteMethod operation. + * Contains response data for the listBlobFlatSegment operation. */ -export type DirectoryDeleteResponse = DirectoryDeleteHeaders & { +export type ContainerListBlobFlatSegmentResponse = ListBlobsFlatSegmentResponse & ContainerListBlobFlatSegmentHeaders & { /** * The response status code. */ @@ -6622,9 +8358,9 @@ export type DirectoryDeleteResponse = DirectoryDeleteHeaders & { }; /** - * Contains response data for the setAccessControl operation. + * Contains response data for the listBlobHierarchySegment operation. */ -export type DirectorySetAccessControlResponse = DirectorySetAccessControlHeaders & { +export type ContainerListBlobHierarchySegmentResponse = ListBlobsHierarchySegmentResponse & ContainerListBlobHierarchySegmentHeaders & { /** * The response status code. */ @@ -6632,9 +8368,9 @@ export type DirectorySetAccessControlResponse = DirectorySetAccessControlHeaders }; /** - * Contains response data for the getAccessControl operation. + * Contains response data for the getAccountInfo operation. */ -export type DirectoryGetAccessControlResponse = DirectoryGetAccessControlHeaders & { +export type ContainerGetAccountInfoResponse = ContainerGetAccountInfoHeaders & { /** * The response status code. */ @@ -6677,9 +8413,9 @@ export type BlobDeleteResponse = BlobDeleteHeaders & { }; /** - * Contains response data for the setAccessControl operation. + * Contains response data for the undelete operation. */ -export type BlobSetAccessControlResponse = BlobSetAccessControlHeaders & { +export type BlobUndeleteResponse = BlobUndeleteHeaders & { /** * The response status code. */ @@ -6687,9 +8423,9 @@ export type BlobSetAccessControlResponse = BlobSetAccessControlHeaders & { }; /** - * Contains response data for the getAccessControl operation. + * Contains response data for the setExpiry operation. */ -export type BlobGetAccessControlResponse = BlobGetAccessControlHeaders & { +export type BlobSetExpiryResponse = BlobSetExpiryHeaders & { /** * The response status code. */ @@ -6697,19 +8433,19 @@ export type BlobGetAccessControlResponse = BlobGetAccessControlHeaders & { }; /** - * Contains response data for the rename operation. + * Contains response data for the setHTTPHeaders operation. */ -export type BlobRenameResponse = BlobRenameHeaders & { +export type BlobSetHTTPHeadersResponse = BlobSetHTTPHeadersHeaders & { /** * The response status code. */ - statusCode: 201; + statusCode: 200; }; /** - * Contains response data for the undelete operation. + * Contains response data for the setImmutabilityPolicy operation. */ -export type BlobUndeleteResponse = BlobUndeleteHeaders & { +export type BlobSetImmutabilityPolicyResponse = BlobSetImmutabilityPolicyHeaders & { /** * The response status code. */ @@ -6717,9 +8453,19 @@ export type BlobUndeleteResponse = BlobUndeleteHeaders & { }; /** - * Contains response data for the setHTTPHeaders operation. + * Contains response data for the deleteImmutabilityPolicy operation. */ -export type BlobSetHTTPHeadersResponse = BlobSetHTTPHeadersHeaders & { +export type BlobDeleteImmutabilityPolicyResponse = BlobDeleteImmutabilityPolicyHeaders & { + /** + * The response status code. + */ + statusCode: 200; +}; + +/** + * Contains response data for the setLegalHold operation. + */ +export type BlobSetLegalHoldResponse = BlobSetLegalHoldHeaders & { /** * The response status code. */ @@ -6847,15 +8593,40 @@ export type BlobGetAccountInfoResponse = BlobGetAccountInfoHeaders & { }; /** - * Contains response data for the getAccountInfoWithHead operation. + * Contains response data for the query operation. + */ +export type BlobQueryResponse = BlobQueryHeaders & { + /** + * The response body as a node.js Readable stream. + */ + body?: NodeJS.ReadableStream; +} & { + /** + * The response status code. + */ + statusCode: 200 | 206; +}; + +/** + * Contains response data for the getTags operation. */ -export type BlobGetAccountInfoWithHeadResponse = BlobGetAccountInfoWithHeadHeaders & { +export type BlobGetTagsResponse = BlobTags & BlobGetTagsHeaders & { /** * The response status code. */ statusCode: 200; }; +/** + * Contains response data for the setTags operation. + */ +export type BlobSetTagsResponse = BlobSetTagsHeaders & { + /** + * The response status code. + */ + statusCode: 204; +}; + /** * Contains response data for the create operation. */ @@ -6976,6 +8747,16 @@ export type AppendBlobAppendBlockFromUrlResponse = AppendBlobAppendBlockFromUrlH statusCode: 201; }; +/** + * Contains response data for the seal operation. + */ +export type AppendBlobSealResponse = AppendBlobSealHeaders & { + /** + * The response status code. + */ + statusCode: 200; +}; + /** * Contains response data for the upload operation. */ @@ -6986,6 +8767,16 @@ export type BlockBlobUploadResponse = BlockBlobUploadHeaders & { statusCode: 201; }; +/** + * Contains response data for the putBlobFromUrl operation. + */ +export type BlockBlobPutBlobFromUrlResponse = BlockBlobPutBlobFromUrlHeaders & { + /** + * The response status code. + */ + statusCode: 201; +}; + /** * Contains response data for the stageBlock operation. */ diff --git a/src/blob/generated/artifacts/operation.ts b/src/blob/generated/artifacts/operation.ts index dfeafa494..386a66be7 100644 --- a/src/blob/generated/artifacts/operation.ts +++ b/src/blob/generated/artifacts/operation.ts @@ -15,6 +15,7 @@ export enum Operation { Service_GetAccountInfo, Service_GetAccountInfoWithHead, Service_SubmitBatch, + Service_FilterBlobs, Container_Create, Container_GetProperties, Container_GetPropertiesWithHead, @@ -22,7 +23,10 @@ export enum Operation { Container_SetMetadata, Container_GetAccessPolicy, Container_SetAccessPolicy, + Container_Restore, + Container_Rename, Container_SubmitBatch, + Container_FilterBlobs, Container_AcquireLease, Container_ReleaseLease, Container_RenewLease, @@ -32,19 +36,15 @@ export enum Operation { Container_ListBlobHierarchySegment, Container_GetAccountInfo, Container_GetAccountInfoWithHead, - Directory_Create, - Directory_Rename, - Directory_Delete, - Directory_SetAccessControl, - Directory_GetAccessControl, Blob_Download, Blob_GetProperties, Blob_Delete, - Blob_SetAccessControl, - Blob_GetAccessControl, - Blob_Rename, Blob_Undelete, + Blob_SetExpiry, Blob_SetHTTPHeaders, + Blob_SetImmutabilityPolicy, + Blob_DeleteImmutabilityPolicy, + Blob_SetLegalHold, Blob_SetMetadata, Blob_AcquireLease, Blob_ReleaseLease, @@ -58,6 +58,9 @@ export enum Operation { Blob_SetTier, Blob_GetAccountInfo, Blob_GetAccountInfoWithHead, + Blob_Query, + Blob_GetTags, + Blob_SetTags, PageBlob_Create, PageBlob_UploadPages, PageBlob_ClearPages, @@ -70,7 +73,9 @@ export enum Operation { AppendBlob_Create, AppendBlob_AppendBlock, AppendBlob_AppendBlockFromUrl, + AppendBlob_Seal, BlockBlob_Upload, + BlockBlob_PutBlobFromUrl, BlockBlob_StageBlock, BlockBlob_StageBlockFromURL, BlockBlob_CommitBlockList, diff --git a/src/blob/generated/artifacts/parameters.ts b/src/blob/generated/artifacts/parameters.ts index db99b2b34..aaa867661 100644 --- a/src/blob/generated/artifacts/parameters.ts +++ b/src/blob/generated/artifacts/parameters.ts @@ -11,7 +11,7 @@ // tslint:disable:quotemark // tslint:disable:object-literal-sort-keys -import * as msRest from "@azure/ms-rest-js"; +import * as msRest from '@azure/ms-rest-js'; export const access: msRest.OperationParameter = { parameterPath: [ @@ -85,30 +85,6 @@ export const action4: msRest.OperationParameter = { } } }; -export const action5: msRest.OperationQueryParameter = { - parameterPath: "action", - mapper: { - required: true, - isConstant: true, - serializedName: "action", - defaultValue: 'setAccessControl', - type: { - name: "String" - } - } -}; -export const action6: msRest.OperationQueryParameter = { - parameterPath: "action", - mapper: { - required: true, - isConstant: true, - serializedName: "action", - defaultValue: 'getAccessControl', - type: { - name: "String" - } - } -}; export const appendPosition: msRest.OperationParameter = { parameterPath: [ "options", @@ -122,6 +98,21 @@ export const appendPosition: msRest.OperationParameter = { } } }; +export const blob: msRest.OperationURLParameter = { + parameterPath: "blob", + mapper: { + required: true, + serializedName: "blob", + constraints: { + MaxLength: 1024, + MinLength: 1, + Pattern: /^[a-zA-Z0-9]+(?:\/[a-zA-Z0-9]+)*(?:\.[a-zA-Z0-9]+){0,1}$/ + }, + type: { + name: "String" + } + } +}; export const blobCacheControl: msRest.OperationParameter = { parameterPath: [ "options", @@ -210,6 +201,21 @@ export const blobContentType: msRest.OperationParameter = { } } }; +export const blobDeleteType: msRest.OperationQueryParameter = { + parameterPath: [ + "options", + "blobDeleteType" + ], + mapper: { + serializedName: "deletetype", + type: { + name: "Enum", + allowedValues: [ + "Permanent" + ] + } + } +}; export const blobSequenceNumber: msRest.OperationParameter = { parameterPath: [ "options", @@ -223,6 +229,18 @@ export const blobSequenceNumber: msRest.OperationParameter = { } } }; +export const blobTagsString: msRest.OperationParameter = { + parameterPath: [ + "options", + "blobTagsString" + ], + mapper: { + serializedName: "x-ms-tags", + type: { + name: "String" + } + } +}; export const blobType0: msRest.OperationParameter = { parameterPath: "blobType", mapper: { @@ -281,19 +299,6 @@ export const breakPeriod: msRest.OperationParameter = { } } }; -export const cacheControl: msRest.OperationParameter = { - parameterPath: [ - "options", - "directoryHttpHeaders", - "cacheControl" - ], - mapper: { - serializedName: "x-ms-cache-control", - type: { - name: "String" - } - } -}; export const comp0: msRest.OperationQueryParameter = { parameterPath: "comp", mapper: { @@ -324,7 +329,7 @@ export const comp10: msRest.OperationQueryParameter = { required: true, isConstant: true, serializedName: "comp", - defaultValue: 'copy', + defaultValue: 'lease', type: { name: "String" } @@ -336,7 +341,7 @@ export const comp11: msRest.OperationQueryParameter = { required: true, isConstant: true, serializedName: "comp", - defaultValue: 'tier', + defaultValue: 'expiry', type: { name: "String" } @@ -348,7 +353,7 @@ export const comp12: msRest.OperationQueryParameter = { required: true, isConstant: true, serializedName: "comp", - defaultValue: 'page', + defaultValue: 'immutabilityPolicies', type: { name: "String" } @@ -360,7 +365,7 @@ export const comp13: msRest.OperationQueryParameter = { required: true, isConstant: true, serializedName: "comp", - defaultValue: 'pagelist', + defaultValue: 'legalhold', type: { name: "String" } @@ -372,7 +377,7 @@ export const comp14: msRest.OperationQueryParameter = { required: true, isConstant: true, serializedName: "comp", - defaultValue: 'incrementalcopy', + defaultValue: 'snapshot', type: { name: "String" } @@ -384,7 +389,7 @@ export const comp15: msRest.OperationQueryParameter = { required: true, isConstant: true, serializedName: "comp", - defaultValue: 'appendblock', + defaultValue: 'copy', type: { name: "String" } @@ -396,7 +401,7 @@ export const comp16: msRest.OperationQueryParameter = { required: true, isConstant: true, serializedName: "comp", - defaultValue: 'block', + defaultValue: 'tier', type: { name: "String" } @@ -408,7 +413,31 @@ export const comp17: msRest.OperationQueryParameter = { required: true, isConstant: true, serializedName: "comp", - defaultValue: 'blocklist', + defaultValue: 'query', + type: { + name: "String" + } + } +}; +export const comp18: msRest.OperationQueryParameter = { + parameterPath: "comp", + mapper: { + required: true, + isConstant: true, + serializedName: "comp", + defaultValue: 'tags', + type: { + name: "String" + } + } +}; +export const comp19: msRest.OperationQueryParameter = { + parameterPath: "comp", + mapper: { + required: true, + isConstant: true, + serializedName: "comp", + defaultValue: 'page', type: { name: "String" } @@ -426,6 +455,78 @@ export const comp2: msRest.OperationQueryParameter = { } } }; +export const comp20: msRest.OperationQueryParameter = { + parameterPath: "comp", + mapper: { + required: true, + isConstant: true, + serializedName: "comp", + defaultValue: 'pagelist', + type: { + name: "String" + } + } +}; +export const comp21: msRest.OperationQueryParameter = { + parameterPath: "comp", + mapper: { + required: true, + isConstant: true, + serializedName: "comp", + defaultValue: 'incrementalcopy', + type: { + name: "String" + } + } +}; +export const comp22: msRest.OperationQueryParameter = { + parameterPath: "comp", + mapper: { + required: true, + isConstant: true, + serializedName: "comp", + defaultValue: 'appendblock', + type: { + name: "String" + } + } +}; +export const comp23: msRest.OperationQueryParameter = { + parameterPath: "comp", + mapper: { + required: true, + isConstant: true, + serializedName: "comp", + defaultValue: 'seal', + type: { + name: "String" + } + } +}; +export const comp24: msRest.OperationQueryParameter = { + parameterPath: "comp", + mapper: { + required: true, + isConstant: true, + serializedName: "comp", + defaultValue: 'block', + type: { + name: "String" + } + } +}; +export const comp25: msRest.OperationQueryParameter = { + parameterPath: "comp", + mapper: { + required: true, + isConstant: true, + serializedName: "comp", + defaultValue: 'blocklist', + type: { + name: "String" + } + } +}; export const comp3: msRest.OperationQueryParameter = { parameterPath: "comp", mapper: { @@ -456,7 +557,7 @@ export const comp5: msRest.OperationQueryParameter = { required: true, isConstant: true, serializedName: "comp", - defaultValue: 'metadata', + defaultValue: 'blobs', type: { name: "String" } @@ -468,7 +569,7 @@ export const comp6: msRest.OperationQueryParameter = { required: true, isConstant: true, serializedName: "comp", - defaultValue: 'acl', + defaultValue: 'metadata', type: { name: "String" } @@ -480,7 +581,7 @@ export const comp7: msRest.OperationQueryParameter = { required: true, isConstant: true, serializedName: "comp", - defaultValue: 'lease', + defaultValue: 'acl', type: { name: "String" } @@ -504,7 +605,7 @@ export const comp9: msRest.OperationQueryParameter = { required: true, isConstant: true, serializedName: "comp", - defaultValue: 'snapshot', + defaultValue: 'rename', type: { name: "String" } @@ -520,95 +621,120 @@ export const containerName: msRest.OperationURLParameter = { } } }; -export const contentDisposition: msRest.OperationParameter = { - parameterPath: [ - "options", - "directoryHttpHeaders", - "contentDisposition" - ], +export const contentLength: msRest.OperationParameter = { + parameterPath: "contentLength", + mapper: { + required: true, + serializedName: "Content-Length", + type: { + name: "Number" + } + } +}; +export const copyActionAbortConstant: msRest.OperationParameter = { + parameterPath: "copyActionAbortConstant", mapper: { - serializedName: "x-ms-content-disposition", + required: true, + isConstant: true, + serializedName: "x-ms-copy-action", + defaultValue: 'abort', type: { name: "String" } } }; -export const contentEncoding: msRest.OperationParameter = { - parameterPath: [ - "options", - "directoryHttpHeaders", - "contentEncoding" - ], +export const copyId: msRest.OperationQueryParameter = { + parameterPath: "copyId", mapper: { - serializedName: "x-ms-content-encoding", + required: true, + serializedName: "copyid", type: { name: "String" } } }; -export const contentLanguage: msRest.OperationParameter = { +export const copySource: msRest.OperationParameter = { + parameterPath: "copySource", + mapper: { + required: true, + serializedName: "x-ms-copy-source", + type: { + name: "String" + } + } +}; +export const copySourceAuthorization: msRest.OperationParameter = { parameterPath: [ "options", - "directoryHttpHeaders", - "contentLanguage" + "copySourceAuthorization" ], mapper: { - serializedName: "x-ms-content-language", + serializedName: "x-ms-copy-source-authorization", type: { name: "String" } } }; -export const contentLength: msRest.OperationParameter = { - parameterPath: "contentLength", +export const copySourceBlobProperties: msRest.OperationParameter = { + parameterPath: [ + "options", + "copySourceBlobProperties" + ], mapper: { - required: true, - serializedName: "Content-Length", + serializedName: "x-ms-copy-source-blob-properties", type: { - name: "Number" + name: "Boolean" } } }; -export const contentType: msRest.OperationParameter = { +export const copySourceTags: msRest.OperationParameter = { parameterPath: [ "options", - "directoryHttpHeaders", - "contentType" + "copySourceTags" ], mapper: { - serializedName: "x-ms-content-type", + serializedName: "x-ms-copy-source-tag-option", type: { - name: "String" + name: "Enum", + allowedValues: [ + "REPLACE", + "COPY" + ] } } }; -export const copyActionAbortConstant: msRest.OperationParameter = { - parameterPath: "copyActionAbortConstant", +export const defaultEncryptionScope: msRest.OperationParameter = { + parameterPath: [ + "options", + "containerCpkScopeInfo", + "defaultEncryptionScope" + ], mapper: { - required: true, - isConstant: true, - serializedName: "x-ms-copy-action", - defaultValue: 'abort', + serializedName: "x-ms-default-encryption-scope", type: { name: "String" } } }; -export const copyId: msRest.OperationQueryParameter = { - parameterPath: "copyId", +export const deletedContainerName: msRest.OperationParameter = { + parameterPath: [ + "options", + "deletedContainerName" + ], mapper: { - required: true, - serializedName: "copyid", + serializedName: "x-ms-deleted-container-name", type: { name: "String" } } }; -export const copySource: msRest.OperationParameter = { - parameterPath: "copySource", +export const deletedContainerVersion: msRest.OperationParameter = { + parameterPath: [ + "options", + "deletedContainerVersion" + ], mapper: { - required: true, - serializedName: "x-ms-copy-source", + serializedName: "x-ms-deleted-container-version", type: { name: "String" } @@ -640,18 +766,6 @@ export const delimiter: msRest.OperationQueryParameter = { } } }; -export const directoryProperties: msRest.OperationParameter = { - parameterPath: [ - "options", - "directoryProperties" - ], - mapper: { - serializedName: "x-ms-properties", - type: { - name: "String" - } - } -}; export const duration: msRest.OperationParameter = { parameterPath: [ "options", @@ -706,13 +820,36 @@ export const encryptionKeySha256: msRest.OperationParameter = { } } }; -export const group: msRest.OperationParameter = { +export const encryptionScope: msRest.OperationParameter = { parameterPath: [ "options", - "group" + "cpkScopeInfo", + "encryptionScope" ], mapper: { - serializedName: "x-ms-group", + serializedName: "x-ms-encryption-scope", + type: { + name: "String" + } + } +}; +export const expiresOn: msRest.OperationParameter = { + parameterPath: [ + "options", + "expiresOn" + ], + mapper: { + serializedName: "x-ms-expiry-time", + type: { + name: "String" + } + } +}; +export const expiryOptions: msRest.OperationParameter = { + parameterPath: "expiryOptions", + mapper: { + required: true, + serializedName: "x-ms-expiry-option", type: { name: "String" } @@ -796,6 +933,19 @@ export const ifSequenceNumberLessThanOrEqualTo: msRest.OperationParameter = { } } }; +export const ifTags: msRest.OperationParameter = { + parameterPath: [ + "options", + "modifiedAccessConditions", + "ifTags" + ], + mapper: { + serializedName: "x-ms-if-tags", + type: { + name: "String" + } + } +}; export const ifUnmodifiedSince: msRest.OperationParameter = { parameterPath: [ "options", @@ -809,24 +959,82 @@ export const ifUnmodifiedSince: msRest.OperationParameter = { } } }; -export const include0: msRest.OperationQueryParameter = { +export const immutabilityPolicyExpiry: msRest.OperationParameter = { parameterPath: [ "options", - "include" + "immutabilityPolicyExpiry" ], mapper: { - serializedName: "include", + serializedName: "x-ms-immutability-policy-until-date", + type: { + name: "DateTimeRfc1123" + } + } +}; +export const immutabilityPolicyMode: msRest.OperationParameter = { + parameterPath: [ + "options", + "immutabilityPolicyMode" + ], + mapper: { + serializedName: "x-ms-immutability-policy-mode", type: { name: "Enum", allowedValues: [ - "", - "metadata", - "deleted" + "Mutable", + "Unlocked", + "Locked" ] } } }; +export const include0: msRest.OperationQueryParameter = { + parameterPath: [ + "options", + "include" + ], + mapper: { + serializedName: "include", + type: { + name: "Sequence", + element: { + type: { + name: "Enum", + allowedValues: [ + "", + "metadata", + "deleted", + "system" + ] + } + } + } + }, + collectionFormat: msRest.QueryCollectionFormat.Csv +}; export const include1: msRest.OperationQueryParameter = { + parameterPath: [ + "options", + "include" + ], + mapper: { + serializedName: "include", + type: { + name: "Sequence", + element: { + type: { + name: "Enum", + allowedValues: [ + "none", + "versions" + ] + } + } + } + }, + collectionFormat: msRest.QueryCollectionFormat.Csv +}; +export const include2: msRest.OperationQueryParameter = { parameterPath: [ "options", "include" @@ -845,11 +1053,11 @@ export const include1: msRest.OperationQueryParameter = { "metadata", "snapshots", "uncommittedblobs", - "tags", "versions", - "deletedwithversions", + "tags", "immutabilitypolicy", "legalhold", + "deletedwithversions", "permissions" ] } @@ -881,6 +1089,28 @@ export const leaseId1: msRest.OperationParameter = { } } }; +export const legalHold0: msRest.OperationParameter = { + parameterPath: "legalHold", + mapper: { + required: true, + serializedName: "x-ms-legal-hold", + type: { + name: "Boolean" + } + } +}; +export const legalHold1: msRest.OperationParameter = { + parameterPath: [ + "options", + "legalHold" + ], + mapper: { + serializedName: "x-ms-legal-hold", + type: { + name: "Boolean" + } + } +}; export const listType: msRest.OperationQueryParameter = { parameterPath: [ "options", @@ -899,7 +1129,7 @@ export const listType: msRest.OperationQueryParameter = { } } }; -export const marker0: msRest.OperationQueryParameter = { +export const marker: msRest.OperationQueryParameter = { parameterPath: [ "options", "marker" @@ -911,18 +1141,6 @@ export const marker0: msRest.OperationQueryParameter = { } } }; -export const marker1: msRest.OperationQueryParameter = { - parameterPath: [ - "options", - "marker" - ], - mapper: { - serializedName: "continuation", - type: { - name: "String" - } - } -}; export const maxresults: msRest.OperationQueryParameter = { parameterPath: [ "options", @@ -979,30 +1197,6 @@ export const multipartContentType: msRest.OperationParameter = { } } }; -export const owner: msRest.OperationParameter = { - parameterPath: [ - "options", - "owner" - ], - mapper: { - serializedName: "x-ms-owner", - type: { - name: "String" - } - } -}; -export const pageBlobAccessTier: msRest.OperationParameter = { - parameterPath: [ - "options", - "pageBlobAccessTier" - ], - mapper: { - serializedName: "x-ms-access-tier", - type: { - name: "String" - } - } -}; export const pageWrite0: msRest.OperationParameter = { parameterPath: "pageWrite", mapper: { @@ -1027,72 +1221,50 @@ export const pageWrite1: msRest.OperationParameter = { } } }; -export const pathRenameMode: msRest.OperationQueryParameter = { - parameterPath: "pathRenameMode", - mapper: { - serializedName: "mode", - type: { - name: "Enum", - allowedValues: [ - "legacy", - "posix" - ] - } - } -}; -export const posixAcl: msRest.OperationParameter = { +export const prefix: msRest.OperationQueryParameter = { parameterPath: [ "options", - "posixAcl" + "prefix" ], mapper: { - serializedName: "x-ms-acl", + serializedName: "prefix", type: { name: "String" } } }; -export const posixPermissions: msRest.OperationParameter = { +export const preventEncryptionScopeOverride: msRest.OperationParameter = { parameterPath: [ "options", - "posixPermissions" + "containerCpkScopeInfo", + "preventEncryptionScopeOverride" ], mapper: { - serializedName: "x-ms-permissions", + serializedName: "x-ms-deny-encryption-scope-override", type: { - name: "String" + name: "Boolean" } } }; -export const posixUmask: msRest.OperationParameter = { +export const prevsnapshot: msRest.OperationQueryParameter = { parameterPath: [ "options", - "posixUmask" + "prevsnapshot" ], mapper: { - serializedName: "x-ms-umask", + serializedName: "prevsnapshot", type: { name: "String" } } }; -export const prefix: msRest.OperationQueryParameter = { +export const prevSnapshotUrl: msRest.OperationParameter = { parameterPath: [ "options", - "prefix" + "prevSnapshotUrl" ], mapper: { - serializedName: "prefix", - type: { - name: "String" - } - } -}; -export const prevsnapshot: msRest.OperationQueryParameter = { - parameterPath: "prevsnapshot", - mapper: { - required: true, - serializedName: "prevsnapshot", + serializedName: "x-ms-previous-snapshot-url", type: { name: "String" } @@ -1166,16 +1338,6 @@ export const rangeGetContentMD5: msRest.OperationParameter = { } } }; -export const recursiveDirectoryDelete: msRest.OperationQueryParameter = { - parameterPath: "recursiveDirectoryDelete", - mapper: { - required: true, - serializedName: "recursive", - type: { - name: "Boolean" - } - } -}; export const rehydratePriority: msRest.OperationParameter = { parameterPath: [ "options", @@ -1188,16 +1350,6 @@ export const rehydratePriority: msRest.OperationParameter = { } } }; -export const renameSource: msRest.OperationParameter = { - parameterPath: "renameSource", - mapper: { - required: true, - serializedName: "x-ms-rename-source", - type: { - name: "String" - } - } -}; export const requestId: msRest.OperationParameter = { parameterPath: [ "options", @@ -1210,18 +1362,6 @@ export const requestId: msRest.OperationParameter = { } } }; -export const resource: msRest.OperationQueryParameter = { - parameterPath: "resource", - mapper: { - required: true, - isConstant: true, - serializedName: "resource", - defaultValue: 'directory', - type: { - name: "String" - } - } -}; export const restype0: msRest.OperationQueryParameter = { parameterPath: "restype", mapper: { @@ -1258,6 +1398,18 @@ export const restype2: msRest.OperationQueryParameter = { } } }; +export const sealBlob: msRest.OperationParameter = { + parameterPath: [ + "options", + "sealBlob" + ], + mapper: { + serializedName: "x-ms-seal-blob", + type: { + name: "Boolean" + } + } +}; export const sequenceNumberAction: msRest.OperationParameter = { parameterPath: "sequenceNumberAction", mapper: { @@ -1285,6 +1437,16 @@ export const snapshot: msRest.OperationQueryParameter = { } } }; +export const sourceContainerName: msRest.OperationParameter = { + parameterPath: "sourceContainerName", + mapper: { + required: true, + serializedName: "x-ms-source-container-name", + type: { + name: "String" + } + } +}; export const sourceContentcrc64: msRest.OperationParameter = { parameterPath: [ "options", @@ -1309,11 +1471,11 @@ export const sourceContentMD5: msRest.OperationParameter = { } } }; -export const sourceIfMatches: msRest.OperationParameter = { +export const sourceIfMatch: msRest.OperationParameter = { parameterPath: [ "options", "sourceModifiedAccessConditions", - "sourceIfMatches" + "sourceIfMatch" ], mapper: { serializedName: "x-ms-source-if-match", @@ -1348,6 +1510,19 @@ export const sourceIfNoneMatch: msRest.OperationParameter = { } } }; +export const sourceIfTags: msRest.OperationParameter = { + parameterPath: [ + "options", + "sourceModifiedAccessConditions", + "sourceIfTags" + ], + mapper: { + serializedName: "x-ms-source-if-tags", + type: { + name: "String" + } + } +}; export const sourceIfUnmodifiedSince: msRest.OperationParameter = { parameterPath: [ "options", @@ -1454,15 +1629,15 @@ export const transactionalContentCrc64: msRest.OperationParameter = { } } }; -export const upn: msRest.OperationQueryParameter = { +export const transactionalContentMD5: msRest.OperationParameter = { parameterPath: [ "options", - "upn" + "transactionalContentMD5" ], mapper: { - serializedName: "upn", + serializedName: "Content-MD5", type: { - name: "Boolean" + name: "ByteArray" } } }; @@ -1487,6 +1662,30 @@ export const version: msRest.OperationParameter = { } } }; +export const versionId: msRest.OperationQueryParameter = { + parameterPath: [ + "options", + "versionId" + ], + mapper: { + serializedName: "versionid", + type: { + name: "String" + } + } +}; +export const where: msRest.OperationQueryParameter = { + parameterPath: [ + "options", + "where" + ], + mapper: { + serializedName: "where", + type: { + name: "String" + } + } +}; export const xMsRequiresSync: msRest.OperationParameter = { parameterPath: "xMsRequiresSync", mapper: { diff --git a/src/blob/generated/artifacts/specifications.ts b/src/blob/generated/artifacts/specifications.ts index 98275f26f..08953f547 100644 --- a/src/blob/generated/artifacts/specifications.ts +++ b/src/blob/generated/artifacts/specifications.ts @@ -9,11 +9,11 @@ */ // tslint:disable:object-literal-sort-keys -import * as msRest from "@azure/ms-rest-js"; +import * as msRest from '@azure/ms-rest-js'; -import * as Mappers from "./mappers"; -import { Operation } from "./operation"; -import * as Parameters from "./parameters"; +import * as Mappers from './mappers'; +import { Operation } from './operation'; +import * as Parameters from './parameters'; const serializer = new msRest.Serializer(Mappers, true); // specifications for new method group start @@ -112,7 +112,7 @@ const serviceListContainersSegmentOperationSpec: msRest.OperationSpec = { ], queryParameters: [ Parameters.prefix, - Parameters.marker0, + Parameters.marker, Parameters.maxresults, Parameters.include0, Parameters.timeout, @@ -195,7 +195,7 @@ const serviceGetAccountInfoOperationSpec: msRest.OperationSpec = { }; const serviceGetAccountInfoWithHeadOperationSpec: msRest.OperationSpec = { - httpMethod: "HEAD", + httpMethod: "GET", urlParameters: [ Parameters.url ], @@ -208,7 +208,7 @@ const serviceGetAccountInfoWithHeadOperationSpec: msRest.OperationSpec = { ], responses: { 200: { - headersMapper: Mappers.ServiceGetAccountInfoWithHeadHeaders + headersMapper: Mappers.ServiceGetAccountInfoHeaders }, default: { bodyMapper: Mappers.StorageError @@ -262,12 +262,43 @@ const serviceSubmitBatchOperationSpec: msRest.OperationSpec = { serializer }; +const serviceFilterBlobsOperationSpec: msRest.OperationSpec = { + httpMethod: "GET", + urlParameters: [ + Parameters.url + ], + queryParameters: [ + Parameters.timeout, + Parameters.where, + Parameters.marker, + Parameters.maxresults, + Parameters.include1, + Parameters.comp5 + ], + headerParameters: [ + Parameters.version, + Parameters.requestId + ], + responses: { + 200: { + bodyMapper: Mappers.FilterBlobSegment, + headersMapper: Mappers.ServiceFilterBlobsHeaders + }, + default: { + bodyMapper: Mappers.StorageError + } + }, + isXML: true, + serializer +}; + // specifications for new method group start const containerCreateOperationSpec: msRest.OperationSpec = { httpMethod: "PUT", path: "{containerName}", urlParameters: [ - Parameters.url + Parameters.url, + Parameters.containerName ], queryParameters: [ Parameters.timeout, @@ -277,7 +308,9 @@ const containerCreateOperationSpec: msRest.OperationSpec = { Parameters.metadata, Parameters.access, Parameters.version, - Parameters.requestId + Parameters.requestId, + Parameters.defaultEncryptionScope, + Parameters.preventEncryptionScopeOverride ], responses: { 201: { @@ -295,7 +328,8 @@ const containerGetPropertiesOperationSpec: msRest.OperationSpec = { httpMethod: "GET", path: "{containerName}", urlParameters: [ - Parameters.url + Parameters.url, + Parameters.containerName ], queryParameters: [ Parameters.timeout, @@ -322,7 +356,8 @@ const containerGetPropertiesWithHeadOperationSpec: msRest.OperationSpec = { httpMethod: "HEAD", path: "{containerName}", urlParameters: [ - Parameters.url + Parameters.url, + Parameters.containerName ], queryParameters: [ Parameters.timeout, @@ -335,7 +370,7 @@ const containerGetPropertiesWithHeadOperationSpec: msRest.OperationSpec = { ], responses: { 200: { - headersMapper: Mappers.ContainerGetPropertiesWithHeadHeaders + headersMapper: Mappers.ContainerGetPropertiesHeaders1 }, default: { bodyMapper: Mappers.StorageError @@ -349,7 +384,8 @@ const containerDeleteOperationSpec: msRest.OperationSpec = { httpMethod: "DELETE", path: "{containerName}", urlParameters: [ - Parameters.url + Parameters.url, + Parameters.containerName ], queryParameters: [ Parameters.timeout, @@ -378,12 +414,13 @@ const containerSetMetadataOperationSpec: msRest.OperationSpec = { httpMethod: "PUT", path: "{containerName}", urlParameters: [ - Parameters.url + Parameters.url, + Parameters.containerName ], queryParameters: [ Parameters.timeout, Parameters.restype2, - Parameters.comp5 + Parameters.comp6 ], headerParameters: [ Parameters.metadata, @@ -408,12 +445,13 @@ const containerGetAccessPolicyOperationSpec: msRest.OperationSpec = { httpMethod: "GET", path: "{containerName}", urlParameters: [ - Parameters.url + Parameters.url, + Parameters.containerName ], queryParameters: [ Parameters.timeout, Parameters.restype2, - Parameters.comp6 + Parameters.comp7 ], headerParameters: [ Parameters.version, @@ -449,12 +487,13 @@ const containerSetAccessPolicyOperationSpec: msRest.OperationSpec = { httpMethod: "PUT", path: "{containerName}", urlParameters: [ - Parameters.url + Parameters.url, + Parameters.containerName ], queryParameters: [ Parameters.timeout, Parameters.restype2, - Parameters.comp6 + Parameters.comp7 ], headerParameters: [ Parameters.access, @@ -497,6 +536,66 @@ const containerSetAccessPolicyOperationSpec: msRest.OperationSpec = { serializer }; +const containerRestoreOperationSpec: msRest.OperationSpec = { + httpMethod: "PUT", + path: "{containerName}", + urlParameters: [ + Parameters.url, + Parameters.containerName + ], + queryParameters: [ + Parameters.timeout, + Parameters.restype2, + Parameters.comp8 + ], + headerParameters: [ + Parameters.version, + Parameters.requestId, + Parameters.deletedContainerName, + Parameters.deletedContainerVersion + ], + responses: { + 201: { + headersMapper: Mappers.ContainerRestoreHeaders + }, + default: { + bodyMapper: Mappers.StorageError + } + }, + isXML: true, + serializer +}; + +const containerRenameOperationSpec: msRest.OperationSpec = { + httpMethod: "PUT", + path: "{containerName}", + urlParameters: [ + Parameters.url, + Parameters.containerName + ], + queryParameters: [ + Parameters.timeout, + Parameters.restype2, + Parameters.comp9 + ], + headerParameters: [ + Parameters.version, + Parameters.requestId, + Parameters.sourceContainerName, + Parameters.sourceLeaseId + ], + responses: { + 200: { + headersMapper: Mappers.ContainerRenameHeaders + }, + default: { + bodyMapper: Mappers.StorageError + } + }, + isXML: true, + serializer +}; + const containerSubmitBatchOperationSpec: msRest.OperationSpec = { httpMethod: "POST", path: "{containerName}", @@ -544,15 +643,49 @@ const containerSubmitBatchOperationSpec: msRest.OperationSpec = { serializer }; +const containerFilterBlobsOperationSpec: msRest.OperationSpec = { + httpMethod: "GET", + path: "{containerName}", + urlParameters: [ + Parameters.url, + Parameters.containerName + ], + queryParameters: [ + Parameters.timeout, + Parameters.where, + Parameters.marker, + Parameters.maxresults, + Parameters.include1, + Parameters.restype2, + Parameters.comp5 + ], + headerParameters: [ + Parameters.version, + Parameters.requestId + ], + responses: { + 200: { + bodyMapper: Mappers.FilterBlobSegment, + headersMapper: Mappers.ContainerFilterBlobsHeaders + }, + default: { + bodyMapper: Mappers.StorageError + } + }, + isXML: true, + serializer +}; + const containerAcquireLeaseOperationSpec: msRest.OperationSpec = { httpMethod: "PUT", path: "{containerName}", urlParameters: [ - Parameters.url + Parameters.url, + Parameters.containerName ], queryParameters: [ Parameters.timeout, - Parameters.comp7, + Parameters.comp10, Parameters.restype2 ], headerParameters: [ @@ -580,11 +713,12 @@ const containerReleaseLeaseOperationSpec: msRest.OperationSpec = { httpMethod: "PUT", path: "{containerName}", urlParameters: [ - Parameters.url + Parameters.url, + Parameters.containerName ], queryParameters: [ Parameters.timeout, - Parameters.comp7, + Parameters.comp10, Parameters.restype2 ], headerParameters: [ @@ -611,11 +745,12 @@ const containerRenewLeaseOperationSpec: msRest.OperationSpec = { httpMethod: "PUT", path: "{containerName}", urlParameters: [ - Parameters.url + Parameters.url, + Parameters.containerName ], queryParameters: [ Parameters.timeout, - Parameters.comp7, + Parameters.comp10, Parameters.restype2 ], headerParameters: [ @@ -642,11 +777,12 @@ const containerBreakLeaseOperationSpec: msRest.OperationSpec = { httpMethod: "PUT", path: "{containerName}", urlParameters: [ - Parameters.url + Parameters.url, + Parameters.containerName ], queryParameters: [ Parameters.timeout, - Parameters.comp7, + Parameters.comp10, Parameters.restype2 ], headerParameters: [ @@ -673,11 +809,12 @@ const containerChangeLeaseOperationSpec: msRest.OperationSpec = { httpMethod: "PUT", path: "{containerName}", urlParameters: [ - Parameters.url + Parameters.url, + Parameters.containerName ], queryParameters: [ Parameters.timeout, - Parameters.comp7, + Parameters.comp10, Parameters.restype2 ], headerParameters: [ @@ -705,13 +842,14 @@ const containerListBlobFlatSegmentOperationSpec: msRest.OperationSpec = { httpMethod: "GET", path: "{containerName}", urlParameters: [ - Parameters.url + Parameters.url, + Parameters.containerName ], queryParameters: [ Parameters.prefix, - Parameters.marker0, + Parameters.marker, Parameters.maxresults, - Parameters.include1, + Parameters.include2, Parameters.timeout, Parameters.restype2, Parameters.comp2 @@ -737,14 +875,15 @@ const containerListBlobHierarchySegmentOperationSpec: msRest.OperationSpec = { httpMethod: "GET", path: "{containerName}", urlParameters: [ - Parameters.url + Parameters.url, + Parameters.containerName ], queryParameters: [ Parameters.prefix, Parameters.delimiter, - Parameters.marker0, + Parameters.marker, Parameters.maxresults, - Parameters.include1, + Parameters.include2, Parameters.timeout, Parameters.restype2, Parameters.comp2 @@ -770,7 +909,8 @@ const containerGetAccountInfoOperationSpec: msRest.OperationSpec = { httpMethod: "GET", path: "{containerName}", urlParameters: [ - Parameters.url + Parameters.url, + Parameters.containerName ], queryParameters: [ Parameters.restype1, @@ -791,11 +931,13 @@ const containerGetAccountInfoOperationSpec: msRest.OperationSpec = { serializer }; + const containerGetAccountInfoWithHeadOperationSpec: msRest.OperationSpec = { httpMethod: "HEAD", path: "{containerName}", urlParameters: [ - Parameters.url + Parameters.url, + Parameters.containerName ], queryParameters: [ Parameters.restype1, @@ -806,7 +948,7 @@ const containerGetAccountInfoWithHeadOperationSpec: msRest.OperationSpec = { ], responses: { 200: { - headersMapper: Mappers.ContainerGetAccountInfoWithHeadHeaders + headersMapper: Mappers.ContainerGetAccountInfoHeaders }, default: { bodyMapper: Mappers.StorageError @@ -817,234 +959,186 @@ const containerGetAccountInfoWithHeadOperationSpec: msRest.OperationSpec = { }; // specifications for new method group start -const directoryCreateOperationSpec: msRest.OperationSpec = { - httpMethod: "PUT", - path: "{filesystem}/{path}", +const blobDownloadOperationSpec: msRest.OperationSpec = { + httpMethod: "GET", + path: "{containerName}/{blob}", urlParameters: [ - Parameters.url + Parameters.url, + Parameters.containerName, + Parameters.blob ], queryParameters: [ - Parameters.timeout, - Parameters.resource + Parameters.snapshot, + Parameters.versionId, + Parameters.timeout ], headerParameters: [ - Parameters.directoryProperties, - Parameters.posixPermissions, - Parameters.posixUmask, + Parameters.range0, + Parameters.rangeGetContentMD5, + Parameters.rangeGetContentCRC64, Parameters.version, Parameters.requestId, - Parameters.cacheControl, - Parameters.contentType, - Parameters.contentEncoding, - Parameters.contentLanguage, - Parameters.contentDisposition, Parameters.leaseId0, + Parameters.encryptionKey, + Parameters.encryptionKeySha256, + Parameters.encryptionAlgorithm, Parameters.ifModifiedSince, Parameters.ifUnmodifiedSince, Parameters.ifMatch, - Parameters.ifNoneMatch + Parameters.ifNoneMatch, + Parameters.ifTags ], responses: { - 201: { - headersMapper: Mappers.DirectoryCreateHeaders + 200: { + bodyMapper: { + serializedName: "Stream", + type: { + name: "Stream" + } + }, + headersMapper: Mappers.BlobDownloadHeaders + }, + 206: { + bodyMapper: { + serializedName: "Stream", + type: { + name: "Stream" + } + }, + headersMapper: Mappers.BlobDownloadHeaders }, default: { - bodyMapper: Mappers.DataLakeStorageError + bodyMapper: Mappers.StorageError } }, isXML: true, serializer }; -const directoryRenameOperationSpec: msRest.OperationSpec = { - httpMethod: "PUT", - path: "{filesystem}/{path}", +const blobGetPropertiesOperationSpec: msRest.OperationSpec = { + httpMethod: "HEAD", + path: "{containerName}/{blob}", urlParameters: [ - Parameters.url + Parameters.url, + Parameters.containerName, + Parameters.blob ], queryParameters: [ - Parameters.timeout, - Parameters.marker1, - Parameters.pathRenameMode + Parameters.snapshot, + Parameters.versionId, + Parameters.timeout ], headerParameters: [ - Parameters.renameSource, - Parameters.directoryProperties, - Parameters.posixPermissions, - Parameters.posixUmask, - Parameters.sourceLeaseId, Parameters.version, Parameters.requestId, - Parameters.cacheControl, - Parameters.contentType, - Parameters.contentEncoding, - Parameters.contentLanguage, - Parameters.contentDisposition, Parameters.leaseId0, + Parameters.encryptionKey, + Parameters.encryptionKeySha256, + Parameters.encryptionAlgorithm, Parameters.ifModifiedSince, Parameters.ifUnmodifiedSince, Parameters.ifMatch, Parameters.ifNoneMatch, - Parameters.sourceIfModifiedSince, - Parameters.sourceIfUnmodifiedSince, - Parameters.sourceIfMatches, - Parameters.sourceIfNoneMatch + Parameters.ifTags ], responses: { - 201: { - headersMapper: Mappers.DirectoryRenameHeaders + 200: { + headersMapper: Mappers.BlobGetPropertiesHeaders }, default: { - bodyMapper: Mappers.DataLakeStorageError + bodyMapper: Mappers.StorageError } }, isXML: true, serializer }; -const directoryDeleteOperationSpec: msRest.OperationSpec = { +const blobDeleteOperationSpec: msRest.OperationSpec = { httpMethod: "DELETE", - path: "{filesystem}/{path}", + path: "{containerName}/{blob}", urlParameters: [ - Parameters.url + Parameters.url, + Parameters.containerName, + Parameters.blob ], queryParameters: [ + Parameters.snapshot, + Parameters.versionId, Parameters.timeout, - Parameters.recursiveDirectoryDelete, - Parameters.marker1 + Parameters.blobDeleteType ], headerParameters: [ + Parameters.deleteSnapshots, Parameters.version, Parameters.requestId, Parameters.leaseId0, Parameters.ifModifiedSince, Parameters.ifUnmodifiedSince, Parameters.ifMatch, - Parameters.ifNoneMatch + Parameters.ifNoneMatch, + Parameters.ifTags ], responses: { - 200: { - headersMapper: Mappers.DirectoryDeleteHeaders + 202: { + headersMapper: Mappers.BlobDeleteHeaders }, default: { - bodyMapper: Mappers.DataLakeStorageError + bodyMapper: Mappers.StorageError } }, isXML: true, serializer }; -const directorySetAccessControlOperationSpec: msRest.OperationSpec = { - httpMethod: "PATCH", - path: "{filesystem}/{path}", +const blobUndeleteOperationSpec: msRest.OperationSpec = { + httpMethod: "PUT", + path: "{containerName}/{blob}", urlParameters: [ - Parameters.url + Parameters.url, + Parameters.containerName, + Parameters.blob ], queryParameters: [ Parameters.timeout, - Parameters.action5 + Parameters.comp8 ], headerParameters: [ - Parameters.owner, - Parameters.group, - Parameters.posixPermissions, - Parameters.posixAcl, - Parameters.requestId, Parameters.version, - Parameters.leaseId0, - Parameters.ifMatch, - Parameters.ifNoneMatch, - Parameters.ifModifiedSince, - Parameters.ifUnmodifiedSince + Parameters.requestId ], responses: { 200: { - headersMapper: Mappers.DirectorySetAccessControlHeaders + headersMapper: Mappers.BlobUndeleteHeaders }, default: { - bodyMapper: Mappers.DataLakeStorageError + bodyMapper: Mappers.StorageError } }, isXML: true, serializer }; -const directoryGetAccessControlOperationSpec: msRest.OperationSpec = { - httpMethod: "HEAD", - path: "{filesystem}/{path}", +const blobSetExpiryOperationSpec: msRest.OperationSpec = { + httpMethod: "PUT", + path: "{containerName}/{blob}", urlParameters: [ - Parameters.url + Parameters.url, + Parameters.containerName, + Parameters.blob ], queryParameters: [ Parameters.timeout, - Parameters.upn, - Parameters.action6 + Parameters.comp11 ], headerParameters: [ - Parameters.requestId, - Parameters.version, - Parameters.leaseId0, - Parameters.ifMatch, - Parameters.ifNoneMatch, - Parameters.ifModifiedSince, - Parameters.ifUnmodifiedSince - ], - responses: { - 200: { - headersMapper: Mappers.DirectoryGetAccessControlHeaders - }, - default: { - bodyMapper: Mappers.DataLakeStorageError - } - }, - isXML: true, - serializer -}; - -// specifications for new method group start -const blobDownloadOperationSpec: msRest.OperationSpec = { - httpMethod: "GET", - path: "{containerName}/{blob}", - urlParameters: [ - Parameters.url - ], - queryParameters: [ - Parameters.snapshot, - Parameters.timeout - ], - headerParameters: [ - Parameters.range0, - Parameters.rangeGetContentMD5, - Parameters.rangeGetContentCRC64, Parameters.version, Parameters.requestId, - Parameters.leaseId0, - Parameters.encryptionKey, - Parameters.encryptionKeySha256, - Parameters.encryptionAlgorithm, - Parameters.ifModifiedSince, - Parameters.ifUnmodifiedSince, - Parameters.ifMatch, - Parameters.ifNoneMatch + Parameters.expiryOptions, + Parameters.expiresOn ], responses: { 200: { - bodyMapper: { - serializedName: "Stream", - type: { - name: "Stream" - } - }, - headersMapper: Mappers.BlobDownloadHeaders - }, - 206: { - bodyMapper: { - serializedName: "Stream", - type: { - name: "Stream" - } - }, - headersMapper: Mappers.BlobDownloadHeaders + headersMapper: Mappers.BlobSetExpiryHeaders }, default: { bodyMapper: Mappers.StorageError @@ -1054,31 +1148,37 @@ const blobDownloadOperationSpec: msRest.OperationSpec = { serializer }; -const blobGetPropertiesOperationSpec: msRest.OperationSpec = { - httpMethod: "HEAD", +const blobSetHTTPHeadersOperationSpec: msRest.OperationSpec = { + httpMethod: "PUT", path: "{containerName}/{blob}", urlParameters: [ - Parameters.url + Parameters.url, + Parameters.containerName, + Parameters.blob ], queryParameters: [ - Parameters.snapshot, - Parameters.timeout + Parameters.timeout, + Parameters.comp0 ], headerParameters: [ Parameters.version, Parameters.requestId, + Parameters.blobCacheControl, + Parameters.blobContentType, + Parameters.blobContentMD5, + Parameters.blobContentEncoding, + Parameters.blobContentLanguage, + Parameters.blobContentDisposition, Parameters.leaseId0, - Parameters.encryptionKey, - Parameters.encryptionKeySha256, - Parameters.encryptionAlgorithm, Parameters.ifModifiedSince, Parameters.ifUnmodifiedSince, Parameters.ifMatch, - Parameters.ifNoneMatch + Parameters.ifNoneMatch, + Parameters.ifTags ], responses: { 200: { - headersMapper: Mappers.BlobGetPropertiesHeaders + headersMapper: Mappers.BlobSetHTTPHeadersHeaders }, default: { bodyMapper: Mappers.StorageError @@ -1088,159 +1188,48 @@ const blobGetPropertiesOperationSpec: msRest.OperationSpec = { serializer }; -const blobDeleteOperationSpec: msRest.OperationSpec = { - httpMethod: "DELETE", +const blobSetImmutabilityPolicyOperationSpec: msRest.OperationSpec = { + httpMethod: "PUT", path: "{containerName}/{blob}", urlParameters: [ - Parameters.url - ], - queryParameters: [ - Parameters.snapshot, - Parameters.timeout - ], - headerParameters: [ - Parameters.deleteSnapshots, - Parameters.version, - Parameters.requestId, - Parameters.leaseId0, - Parameters.ifModifiedSince, - Parameters.ifUnmodifiedSince, - Parameters.ifMatch, - Parameters.ifNoneMatch - ], - responses: { - 202: { - headersMapper: Mappers.BlobDeleteHeaders - }, - default: { - bodyMapper: Mappers.StorageError - } - }, - isXML: true, - serializer -}; - -const blobSetAccessControlOperationSpec: msRest.OperationSpec = { - httpMethod: "PATCH", - path: "{filesystem}/{path}", - urlParameters: [ - Parameters.url + Parameters.url, + Parameters.containerName, + Parameters.blob ], queryParameters: [ Parameters.timeout, - Parameters.action5 + Parameters.comp12 ], headerParameters: [ - Parameters.owner, - Parameters.group, - Parameters.posixPermissions, - Parameters.posixAcl, - Parameters.requestId, Parameters.version, - Parameters.leaseId0, - Parameters.ifMatch, - Parameters.ifNoneMatch, - Parameters.ifModifiedSince, - Parameters.ifUnmodifiedSince - ], - responses: { - 200: { - headersMapper: Mappers.BlobSetAccessControlHeaders - }, - default: { - bodyMapper: Mappers.DataLakeStorageError - } - }, - isXML: true, - serializer -}; - -const blobGetAccessControlOperationSpec: msRest.OperationSpec = { - httpMethod: "HEAD", - path: "{filesystem}/{path}", - urlParameters: [ - Parameters.url - ], - queryParameters: [ - Parameters.timeout, - Parameters.upn, - Parameters.action6 - ], - headerParameters: [ Parameters.requestId, - Parameters.version, - Parameters.leaseId0, - Parameters.ifMatch, - Parameters.ifNoneMatch, - Parameters.ifModifiedSince, + Parameters.immutabilityPolicyExpiry, + Parameters.immutabilityPolicyMode, Parameters.ifUnmodifiedSince ], responses: { 200: { - headersMapper: Mappers.BlobGetAccessControlHeaders - }, - default: { - bodyMapper: Mappers.DataLakeStorageError - } - }, - isXML: true, - serializer -}; - -const blobRenameOperationSpec: msRest.OperationSpec = { - httpMethod: "PUT", - path: "{filesystem}/{path}", - urlParameters: [ - Parameters.url - ], - queryParameters: [ - Parameters.timeout, - Parameters.pathRenameMode - ], - headerParameters: [ - Parameters.renameSource, - Parameters.directoryProperties, - Parameters.posixPermissions, - Parameters.posixUmask, - Parameters.sourceLeaseId, - Parameters.version, - Parameters.requestId, - Parameters.cacheControl, - Parameters.contentType, - Parameters.contentEncoding, - Parameters.contentLanguage, - Parameters.contentDisposition, - Parameters.leaseId0, - Parameters.ifModifiedSince, - Parameters.ifUnmodifiedSince, - Parameters.ifMatch, - Parameters.ifNoneMatch, - Parameters.sourceIfModifiedSince, - Parameters.sourceIfUnmodifiedSince, - Parameters.sourceIfMatches, - Parameters.sourceIfNoneMatch - ], - responses: { - 201: { - headersMapper: Mappers.BlobRenameHeaders + headersMapper: Mappers.BlobSetImmutabilityPolicyHeaders }, default: { - bodyMapper: Mappers.DataLakeStorageError + bodyMapper: Mappers.StorageError } }, isXML: true, serializer }; -const blobUndeleteOperationSpec: msRest.OperationSpec = { - httpMethod: "PUT", +const blobDeleteImmutabilityPolicyOperationSpec: msRest.OperationSpec = { + httpMethod: "DELETE", path: "{containerName}/{blob}", urlParameters: [ - Parameters.url + Parameters.url, + Parameters.containerName, + Parameters.blob ], queryParameters: [ Parameters.timeout, - Parameters.comp8 + Parameters.comp12 ], headerParameters: [ Parameters.version, @@ -1248,7 +1237,7 @@ const blobUndeleteOperationSpec: msRest.OperationSpec = { ], responses: { 200: { - headersMapper: Mappers.BlobUndeleteHeaders + headersMapper: Mappers.BlobDeleteImmutabilityPolicyHeaders }, default: { bodyMapper: Mappers.StorageError @@ -1258,34 +1247,26 @@ const blobUndeleteOperationSpec: msRest.OperationSpec = { serializer }; -const blobSetHTTPHeadersOperationSpec: msRest.OperationSpec = { +const blobSetLegalHoldOperationSpec: msRest.OperationSpec = { httpMethod: "PUT", path: "{containerName}/{blob}", urlParameters: [ - Parameters.url + Parameters.url, + Parameters.containerName, + Parameters.blob ], queryParameters: [ Parameters.timeout, - Parameters.comp0 + Parameters.comp13 ], headerParameters: [ Parameters.version, Parameters.requestId, - Parameters.blobCacheControl, - Parameters.blobContentType, - Parameters.blobContentMD5, - Parameters.blobContentEncoding, - Parameters.blobContentLanguage, - Parameters.blobContentDisposition, - Parameters.leaseId0, - Parameters.ifModifiedSince, - Parameters.ifUnmodifiedSince, - Parameters.ifMatch, - Parameters.ifNoneMatch + Parameters.legalHold0 ], responses: { 200: { - headersMapper: Mappers.BlobSetHTTPHeadersHeaders + headersMapper: Mappers.BlobSetLegalHoldHeaders }, default: { bodyMapper: Mappers.StorageError @@ -1299,11 +1280,13 @@ const blobSetMetadataOperationSpec: msRest.OperationSpec = { httpMethod: "PUT", path: "{containerName}/{blob}", urlParameters: [ - Parameters.url + Parameters.url, + Parameters.containerName, + Parameters.blob ], queryParameters: [ Parameters.timeout, - Parameters.comp5 + Parameters.comp6 ], headerParameters: [ Parameters.metadata, @@ -1313,10 +1296,12 @@ const blobSetMetadataOperationSpec: msRest.OperationSpec = { Parameters.encryptionKey, Parameters.encryptionKeySha256, Parameters.encryptionAlgorithm, + Parameters.encryptionScope, Parameters.ifModifiedSince, Parameters.ifUnmodifiedSince, Parameters.ifMatch, - Parameters.ifNoneMatch + Parameters.ifNoneMatch, + Parameters.ifTags ], responses: { 200: { @@ -1334,11 +1319,13 @@ const blobAcquireLeaseOperationSpec: msRest.OperationSpec = { httpMethod: "PUT", path: "{containerName}/{blob}", urlParameters: [ - Parameters.url + Parameters.url, + Parameters.containerName, + Parameters.blob ], queryParameters: [ Parameters.timeout, - Parameters.comp7 + Parameters.comp10 ], headerParameters: [ Parameters.duration, @@ -1349,7 +1336,8 @@ const blobAcquireLeaseOperationSpec: msRest.OperationSpec = { Parameters.ifModifiedSince, Parameters.ifUnmodifiedSince, Parameters.ifMatch, - Parameters.ifNoneMatch + Parameters.ifNoneMatch, + Parameters.ifTags ], responses: { 201: { @@ -1367,11 +1355,13 @@ const blobReleaseLeaseOperationSpec: msRest.OperationSpec = { httpMethod: "PUT", path: "{containerName}/{blob}", urlParameters: [ - Parameters.url + Parameters.url, + Parameters.containerName, + Parameters.blob ], queryParameters: [ Parameters.timeout, - Parameters.comp7 + Parameters.comp10 ], headerParameters: [ Parameters.leaseId1, @@ -1381,7 +1371,8 @@ const blobReleaseLeaseOperationSpec: msRest.OperationSpec = { Parameters.ifModifiedSince, Parameters.ifUnmodifiedSince, Parameters.ifMatch, - Parameters.ifNoneMatch + Parameters.ifNoneMatch, + Parameters.ifTags ], responses: { 200: { @@ -1399,11 +1390,13 @@ const blobRenewLeaseOperationSpec: msRest.OperationSpec = { httpMethod: "PUT", path: "{containerName}/{blob}", urlParameters: [ - Parameters.url + Parameters.url, + Parameters.containerName, + Parameters.blob ], queryParameters: [ Parameters.timeout, - Parameters.comp7 + Parameters.comp10 ], headerParameters: [ Parameters.leaseId1, @@ -1413,7 +1406,8 @@ const blobRenewLeaseOperationSpec: msRest.OperationSpec = { Parameters.ifModifiedSince, Parameters.ifUnmodifiedSince, Parameters.ifMatch, - Parameters.ifNoneMatch + Parameters.ifNoneMatch, + Parameters.ifTags ], responses: { 200: { @@ -1431,11 +1425,13 @@ const blobChangeLeaseOperationSpec: msRest.OperationSpec = { httpMethod: "PUT", path: "{containerName}/{blob}", urlParameters: [ - Parameters.url + Parameters.url, + Parameters.containerName, + Parameters.blob ], queryParameters: [ Parameters.timeout, - Parameters.comp7 + Parameters.comp10 ], headerParameters: [ Parameters.leaseId1, @@ -1446,7 +1442,8 @@ const blobChangeLeaseOperationSpec: msRest.OperationSpec = { Parameters.ifModifiedSince, Parameters.ifUnmodifiedSince, Parameters.ifMatch, - Parameters.ifNoneMatch + Parameters.ifNoneMatch, + Parameters.ifTags ], responses: { 200: { @@ -1464,11 +1461,13 @@ const blobBreakLeaseOperationSpec: msRest.OperationSpec = { httpMethod: "PUT", path: "{containerName}/{blob}", urlParameters: [ - Parameters.url + Parameters.url, + Parameters.containerName, + Parameters.blob ], queryParameters: [ Parameters.timeout, - Parameters.comp7 + Parameters.comp10 ], headerParameters: [ Parameters.breakPeriod, @@ -1478,7 +1477,8 @@ const blobBreakLeaseOperationSpec: msRest.OperationSpec = { Parameters.ifModifiedSince, Parameters.ifUnmodifiedSince, Parameters.ifMatch, - Parameters.ifNoneMatch + Parameters.ifNoneMatch, + Parameters.ifTags ], responses: { 202: { @@ -1496,11 +1496,13 @@ const blobCreateSnapshotOperationSpec: msRest.OperationSpec = { httpMethod: "PUT", path: "{containerName}/{blob}", urlParameters: [ - Parameters.url + Parameters.url, + Parameters.containerName, + Parameters.blob ], queryParameters: [ Parameters.timeout, - Parameters.comp9 + Parameters.comp14 ], headerParameters: [ Parameters.metadata, @@ -1509,10 +1511,12 @@ const blobCreateSnapshotOperationSpec: msRest.OperationSpec = { Parameters.encryptionKey, Parameters.encryptionKeySha256, Parameters.encryptionAlgorithm, + Parameters.encryptionScope, Parameters.ifModifiedSince, Parameters.ifUnmodifiedSince, Parameters.ifMatch, Parameters.ifNoneMatch, + Parameters.ifTags, Parameters.leaseId0 ], responses: { @@ -1531,7 +1535,9 @@ const blobStartCopyFromURLOperationSpec: msRest.OperationSpec = { httpMethod: "PUT", path: "{containerName}/{blob}", urlParameters: [ - Parameters.url + Parameters.url, + Parameters.containerName, + Parameters.blob ], queryParameters: [ Parameters.timeout @@ -1543,14 +1549,21 @@ const blobStartCopyFromURLOperationSpec: msRest.OperationSpec = { Parameters.copySource, Parameters.version, Parameters.requestId, + Parameters.blobTagsString, + Parameters.sealBlob, + Parameters.immutabilityPolicyExpiry, + Parameters.immutabilityPolicyMode, + Parameters.legalHold1, Parameters.sourceIfModifiedSince, Parameters.sourceIfUnmodifiedSince, - Parameters.sourceIfMatches, + Parameters.sourceIfMatch, Parameters.sourceIfNoneMatch, + Parameters.sourceIfTags, Parameters.ifModifiedSince, Parameters.ifUnmodifiedSince, Parameters.ifMatch, Parameters.ifNoneMatch, + Parameters.ifTags, Parameters.leaseId0 ], responses: { @@ -1569,31 +1582,137 @@ const blobCopyFromURLOperationSpec: msRest.OperationSpec = { httpMethod: "PUT", path: "{containerName}/{blob}", urlParameters: [ - Parameters.url + Parameters.url, + Parameters.containerName, + Parameters.blob ], queryParameters: [ Parameters.timeout ], headerParameters: [ - Parameters.metadata, - Parameters.tier0, - Parameters.copySource, - Parameters.version, - Parameters.requestId, - Parameters.xMsRequiresSync, - Parameters.sourceIfModifiedSince, - Parameters.sourceIfUnmodifiedSince, - Parameters.sourceIfMatches, - Parameters.sourceIfNoneMatch, - Parameters.ifModifiedSince, - Parameters.ifUnmodifiedSince, - Parameters.ifMatch, - Parameters.ifNoneMatch, - Parameters.leaseId0 + Parameters.metadata, + Parameters.tier0, + Parameters.copySource, + Parameters.version, + Parameters.requestId, + Parameters.sourceContentMD5, + Parameters.blobTagsString, + Parameters.immutabilityPolicyExpiry, + Parameters.immutabilityPolicyMode, + Parameters.legalHold1, + Parameters.copySourceAuthorization, + Parameters.copySourceTags, + Parameters.xMsRequiresSync, + Parameters.sourceIfModifiedSince, + Parameters.sourceIfUnmodifiedSince, + Parameters.sourceIfMatch, + Parameters.sourceIfNoneMatch, + Parameters.ifModifiedSince, + Parameters.ifUnmodifiedSince, + Parameters.ifMatch, + Parameters.ifNoneMatch, + Parameters.ifTags, + Parameters.leaseId0, + Parameters.encryptionScope + ], + responses: { + 202: { + headersMapper: Mappers.BlobCopyFromURLHeaders + }, + default: { + bodyMapper: Mappers.StorageError + } + }, + isXML: true, + serializer +}; + +const blobAbortCopyFromURLOperationSpec: msRest.OperationSpec = { + httpMethod: "PUT", + path: "{containerName}/{blob}", + urlParameters: [ + Parameters.url, + Parameters.containerName, + Parameters.blob + ], + queryParameters: [ + Parameters.copyId, + Parameters.timeout, + Parameters.comp15 + ], + headerParameters: [ + Parameters.version, + Parameters.requestId, + Parameters.copyActionAbortConstant, + Parameters.leaseId0 + ], + responses: { + 204: { + headersMapper: Mappers.BlobAbortCopyFromURLHeaders + }, + default: { + bodyMapper: Mappers.StorageError + } + }, + isXML: true, + serializer +}; + +const blobSetTierOperationSpec: msRest.OperationSpec = { + httpMethod: "PUT", + path: "{containerName}/{blob}", + urlParameters: [ + Parameters.url, + Parameters.containerName, + Parameters.blob + ], + queryParameters: [ + Parameters.snapshot, + Parameters.versionId, + Parameters.timeout, + Parameters.comp16 + ], + headerParameters: [ + Parameters.tier1, + Parameters.rehydratePriority, + Parameters.version, + Parameters.requestId, + Parameters.leaseId0, + Parameters.ifTags + ], + responses: { + 200: { + headersMapper: Mappers.BlobSetTierHeaders + }, + 202: { + headersMapper: Mappers.BlobSetTierHeaders + }, + default: { + bodyMapper: Mappers.StorageError + } + }, + isXML: true, + serializer +}; + +const blobGetAccountInfoOperationSpec: msRest.OperationSpec = { + httpMethod: "GET", + path: "{containerName}/{blob}", + urlParameters: [ + Parameters.url, + Parameters.containerName, + Parameters.blob + ], + queryParameters: [ + Parameters.restype1, + Parameters.comp0 + ], + headerParameters: [ + Parameters.version ], responses: { - 202: { - headersMapper: Mappers.BlobCopyFromURLHeaders + 200: { + headersMapper: Mappers.BlobGetAccountInfoHeaders }, default: { bodyMapper: Mappers.StorageError @@ -1603,26 +1722,24 @@ const blobCopyFromURLOperationSpec: msRest.OperationSpec = { serializer }; -const blobAbortCopyFromURLOperationSpec: msRest.OperationSpec = { - httpMethod: "PUT", +const blobGetAccountInfoWithHeadOperationSpec: msRest.OperationSpec = { + httpMethod: "HEAD", path: "{containerName}/{blob}", urlParameters: [ - Parameters.url + Parameters.url, + Parameters.containerName, + Parameters.blob ], queryParameters: [ - Parameters.copyId, - Parameters.timeout, - Parameters.comp10 + Parameters.restype1, + Parameters.comp0 ], headerParameters: [ - Parameters.version, - Parameters.requestId, - Parameters.copyActionAbortConstant, - Parameters.leaseId0 + Parameters.version ], responses: { - 204: { - headersMapper: Mappers.BlobAbortCopyFromURLHeaders + 200: { + headersMapper: Mappers.BlobGetAccountInfoHeaders }, default: { bodyMapper: Mappers.StorageError @@ -1632,29 +1749,58 @@ const blobAbortCopyFromURLOperationSpec: msRest.OperationSpec = { serializer }; -const blobSetTierOperationSpec: msRest.OperationSpec = { - httpMethod: "PUT", +const blobQueryOperationSpec: msRest.OperationSpec = { + httpMethod: "POST", path: "{containerName}/{blob}", urlParameters: [ - Parameters.url + Parameters.url, + Parameters.containerName, + Parameters.blob ], queryParameters: [ + Parameters.snapshot, Parameters.timeout, - Parameters.comp11 + Parameters.comp17 ], headerParameters: [ - Parameters.tier1, - Parameters.rehydratePriority, Parameters.version, Parameters.requestId, - Parameters.leaseId0 + Parameters.leaseId0, + Parameters.encryptionKey, + Parameters.encryptionKeySha256, + Parameters.encryptionAlgorithm, + Parameters.ifModifiedSince, + Parameters.ifUnmodifiedSince, + Parameters.ifMatch, + Parameters.ifNoneMatch, + Parameters.ifTags ], + requestBody: { + parameterPath: [ + "options", + "queryRequest" + ], + mapper: Mappers.QueryRequest + }, + contentType: "application/xml; charset=utf-8", responses: { 200: { - headersMapper: Mappers.BlobSetTierHeaders + bodyMapper: { + serializedName: "Stream", + type: { + name: "Stream" + } + }, + headersMapper: Mappers.BlobQueryHeaders }, - 202: { - headersMapper: Mappers.BlobSetTierHeaders + 206: { + bodyMapper: { + serializedName: "Stream", + type: { + name: "Stream" + } + }, + headersMapper: Mappers.BlobQueryHeaders }, default: { bodyMapper: Mappers.StorageError @@ -1664,22 +1810,30 @@ const blobSetTierOperationSpec: msRest.OperationSpec = { serializer }; -const blobGetAccountInfoOperationSpec: msRest.OperationSpec = { +const blobGetTagsOperationSpec: msRest.OperationSpec = { httpMethod: "GET", path: "{containerName}/{blob}", urlParameters: [ - Parameters.url + Parameters.url, + Parameters.containerName, + Parameters.blob ], queryParameters: [ - Parameters.restype1, - Parameters.comp0 + Parameters.timeout, + Parameters.snapshot, + Parameters.versionId, + Parameters.comp18 ], headerParameters: [ - Parameters.version + Parameters.version, + Parameters.requestId, + Parameters.ifTags, + Parameters.leaseId0 ], responses: { 200: { - headersMapper: Mappers.BlobGetAccountInfoHeaders + bodyMapper: Mappers.BlobTags, + headersMapper: Mappers.BlobGetTagsHeaders }, default: { bodyMapper: Mappers.StorageError @@ -1689,22 +1843,38 @@ const blobGetAccountInfoOperationSpec: msRest.OperationSpec = { serializer }; -const blobGetAccountInfoWithHeadOperationSpec: msRest.OperationSpec = { - httpMethod: "HEAD", +const blobSetTagsOperationSpec: msRest.OperationSpec = { + httpMethod: "PUT", path: "{containerName}/{blob}", urlParameters: [ - Parameters.url + Parameters.url, + Parameters.containerName, + Parameters.blob ], queryParameters: [ - Parameters.restype1, - Parameters.comp0 + Parameters.timeout, + Parameters.versionId, + Parameters.comp18 ], headerParameters: [ - Parameters.version + Parameters.version, + Parameters.transactionalContentMD5, + Parameters.transactionalContentCrc64, + Parameters.requestId, + Parameters.ifTags, + Parameters.leaseId0 ], + requestBody: { + parameterPath: [ + "options", + "tags" + ], + mapper: Mappers.BlobTags + }, + contentType: "application/xml; charset=utf-8", responses: { - 200: { - headersMapper: Mappers.BlobGetAccountInfoWithHeadHeaders + 204: { + headersMapper: Mappers.BlobSetTagsHeaders }, default: { bodyMapper: Mappers.StorageError @@ -1719,19 +1889,25 @@ const pageBlobCreateOperationSpec: msRest.OperationSpec = { httpMethod: "PUT", path: "{containerName}/{blob}", urlParameters: [ - Parameters.url + Parameters.url, + Parameters.containerName, + Parameters.blob ], queryParameters: [ Parameters.timeout ], headerParameters: [ Parameters.contentLength, + Parameters.tier0, Parameters.metadata, Parameters.blobContentLength, Parameters.blobSequenceNumber, - Parameters.pageBlobAccessTier, Parameters.version, Parameters.requestId, + Parameters.blobTagsString, + Parameters.immutabilityPolicyExpiry, + Parameters.immutabilityPolicyMode, + Parameters.legalHold1, Parameters.blobType0, Parameters.blobContentType, Parameters.blobContentEncoding, @@ -1743,10 +1919,12 @@ const pageBlobCreateOperationSpec: msRest.OperationSpec = { Parameters.encryptionKey, Parameters.encryptionKeySha256, Parameters.encryptionAlgorithm, + Parameters.encryptionScope, Parameters.ifModifiedSince, Parameters.ifUnmodifiedSince, Parameters.ifMatch, - Parameters.ifNoneMatch + Parameters.ifNoneMatch, + Parameters.ifTags ], responses: { 201: { @@ -1764,14 +1942,17 @@ const pageBlobUploadPagesOperationSpec: msRest.OperationSpec = { httpMethod: "PUT", path: "{containerName}/{blob}", urlParameters: [ - Parameters.url + Parameters.url, + Parameters.containerName, + Parameters.blob ], queryParameters: [ Parameters.timeout, - Parameters.comp12 + Parameters.comp19 ], headerParameters: [ Parameters.contentLength, + Parameters.transactionalContentMD5, Parameters.transactionalContentCrc64, Parameters.range0, Parameters.version, @@ -1781,13 +1962,15 @@ const pageBlobUploadPagesOperationSpec: msRest.OperationSpec = { Parameters.encryptionKey, Parameters.encryptionKeySha256, Parameters.encryptionAlgorithm, + Parameters.encryptionScope, Parameters.ifSequenceNumberLessThanOrEqualTo, Parameters.ifSequenceNumberLessThan, Parameters.ifSequenceNumberEqualTo, Parameters.ifModifiedSince, Parameters.ifUnmodifiedSince, Parameters.ifMatch, - Parameters.ifNoneMatch + Parameters.ifNoneMatch, + Parameters.ifTags ], requestBody: { parameterPath: "body", @@ -1816,11 +1999,13 @@ const pageBlobClearPagesOperationSpec: msRest.OperationSpec = { httpMethod: "PUT", path: "{containerName}/{blob}", urlParameters: [ - Parameters.url + Parameters.url, + Parameters.containerName, + Parameters.blob ], queryParameters: [ Parameters.timeout, - Parameters.comp12 + Parameters.comp19 ], headerParameters: [ Parameters.contentLength, @@ -1832,13 +2017,15 @@ const pageBlobClearPagesOperationSpec: msRest.OperationSpec = { Parameters.encryptionKey, Parameters.encryptionKeySha256, Parameters.encryptionAlgorithm, + Parameters.encryptionScope, Parameters.ifSequenceNumberLessThanOrEqualTo, Parameters.ifSequenceNumberLessThan, Parameters.ifSequenceNumberEqualTo, Parameters.ifModifiedSince, Parameters.ifUnmodifiedSince, Parameters.ifMatch, - Parameters.ifNoneMatch + Parameters.ifNoneMatch, + Parameters.ifTags ], responses: { 201: { @@ -1856,11 +2043,13 @@ const pageBlobUploadPagesFromURLOperationSpec: msRest.OperationSpec = { httpMethod: "PUT", path: "{containerName}/{blob}", urlParameters: [ - Parameters.url + Parameters.url, + Parameters.containerName, + Parameters.blob ], queryParameters: [ Parameters.timeout, - Parameters.comp12 + Parameters.comp19 ], headerParameters: [ Parameters.sourceUrl, @@ -1871,10 +2060,12 @@ const pageBlobUploadPagesFromURLOperationSpec: msRest.OperationSpec = { Parameters.range1, Parameters.version, Parameters.requestId, + Parameters.copySourceAuthorization, Parameters.pageWrite0, Parameters.encryptionKey, Parameters.encryptionKeySha256, Parameters.encryptionAlgorithm, + Parameters.encryptionScope, Parameters.leaseId0, Parameters.ifSequenceNumberLessThanOrEqualTo, Parameters.ifSequenceNumberLessThan, @@ -1883,9 +2074,10 @@ const pageBlobUploadPagesFromURLOperationSpec: msRest.OperationSpec = { Parameters.ifUnmodifiedSince, Parameters.ifMatch, Parameters.ifNoneMatch, + Parameters.ifTags, Parameters.sourceIfModifiedSince, Parameters.sourceIfUnmodifiedSince, - Parameters.sourceIfMatches, + Parameters.sourceIfMatch, Parameters.sourceIfNoneMatch ], responses: { @@ -1904,12 +2096,16 @@ const pageBlobGetPageRangesOperationSpec: msRest.OperationSpec = { httpMethod: "GET", path: "{containerName}/{blob}", urlParameters: [ - Parameters.url + Parameters.url, + Parameters.containerName, + Parameters.blob ], queryParameters: [ Parameters.snapshot, Parameters.timeout, - Parameters.comp13 + Parameters.marker, + Parameters.maxresults, + Parameters.comp20 ], headerParameters: [ Parameters.range0, @@ -1919,7 +2115,8 @@ const pageBlobGetPageRangesOperationSpec: msRest.OperationSpec = { Parameters.ifModifiedSince, Parameters.ifUnmodifiedSince, Parameters.ifMatch, - Parameters.ifNoneMatch + Parameters.ifNoneMatch, + Parameters.ifTags ], responses: { 200: { @@ -1938,15 +2135,20 @@ const pageBlobGetPageRangesDiffOperationSpec: msRest.OperationSpec = { httpMethod: "GET", path: "{containerName}/{blob}", urlParameters: [ - Parameters.url + Parameters.url, + Parameters.containerName, + Parameters.blob ], queryParameters: [ Parameters.snapshot, Parameters.timeout, Parameters.prevsnapshot, - Parameters.comp13 + Parameters.marker, + Parameters.maxresults, + Parameters.comp20 ], headerParameters: [ + Parameters.prevSnapshotUrl, Parameters.range0, Parameters.version, Parameters.requestId, @@ -1954,7 +2156,8 @@ const pageBlobGetPageRangesDiffOperationSpec: msRest.OperationSpec = { Parameters.ifModifiedSince, Parameters.ifUnmodifiedSince, Parameters.ifMatch, - Parameters.ifNoneMatch + Parameters.ifNoneMatch, + Parameters.ifTags ], responses: { 200: { @@ -1973,7 +2176,9 @@ const pageBlobResizeOperationSpec: msRest.OperationSpec = { httpMethod: "PUT", path: "{containerName}/{blob}", urlParameters: [ - Parameters.url + Parameters.url, + Parameters.containerName, + Parameters.blob ], queryParameters: [ Parameters.timeout, @@ -1987,10 +2192,12 @@ const pageBlobResizeOperationSpec: msRest.OperationSpec = { Parameters.encryptionKey, Parameters.encryptionKeySha256, Parameters.encryptionAlgorithm, + Parameters.encryptionScope, Parameters.ifModifiedSince, Parameters.ifUnmodifiedSince, Parameters.ifMatch, - Parameters.ifNoneMatch + Parameters.ifNoneMatch, + Parameters.ifTags ], responses: { 200: { @@ -2008,7 +2215,9 @@ const pageBlobUpdateSequenceNumberOperationSpec: msRest.OperationSpec = { httpMethod: "PUT", path: "{containerName}/{blob}", urlParameters: [ - Parameters.url + Parameters.url, + Parameters.containerName, + Parameters.blob ], queryParameters: [ Parameters.timeout, @@ -2023,7 +2232,8 @@ const pageBlobUpdateSequenceNumberOperationSpec: msRest.OperationSpec = { Parameters.ifModifiedSince, Parameters.ifUnmodifiedSince, Parameters.ifMatch, - Parameters.ifNoneMatch + Parameters.ifNoneMatch, + Parameters.ifTags ], responses: { 200: { @@ -2041,21 +2251,23 @@ const pageBlobCopyIncrementalOperationSpec: msRest.OperationSpec = { httpMethod: "PUT", path: "{containerName}/{blob}", urlParameters: [ - Parameters.url + Parameters.url, + Parameters.containerName, + Parameters.blob ], queryParameters: [ Parameters.timeout, - Parameters.comp14 + Parameters.comp21 ], headerParameters: [ - Parameters.metadata, Parameters.copySource, Parameters.version, Parameters.requestId, Parameters.ifModifiedSince, Parameters.ifUnmodifiedSince, Parameters.ifMatch, - Parameters.ifNoneMatch + Parameters.ifNoneMatch, + Parameters.ifTags ], responses: { 202: { @@ -2074,7 +2286,9 @@ const appendBlobCreateOperationSpec: msRest.OperationSpec = { httpMethod: "PUT", path: "{containerName}/{blob}", urlParameters: [ - Parameters.url + Parameters.url, + Parameters.containerName, + Parameters.blob ], queryParameters: [ Parameters.timeout @@ -2084,6 +2298,10 @@ const appendBlobCreateOperationSpec: msRest.OperationSpec = { Parameters.metadata, Parameters.version, Parameters.requestId, + Parameters.blobTagsString, + Parameters.immutabilityPolicyExpiry, + Parameters.immutabilityPolicyMode, + Parameters.legalHold1, Parameters.blobType1, Parameters.blobContentType, Parameters.blobContentEncoding, @@ -2095,10 +2313,12 @@ const appendBlobCreateOperationSpec: msRest.OperationSpec = { Parameters.encryptionKey, Parameters.encryptionKeySha256, Parameters.encryptionAlgorithm, + Parameters.encryptionScope, Parameters.ifModifiedSince, Parameters.ifUnmodifiedSince, Parameters.ifMatch, - Parameters.ifNoneMatch + Parameters.ifNoneMatch, + Parameters.ifTags ], responses: { 201: { @@ -2116,14 +2336,17 @@ const appendBlobAppendBlockOperationSpec: msRest.OperationSpec = { httpMethod: "PUT", path: "{containerName}/{blob}", urlParameters: [ - Parameters.url + Parameters.url, + Parameters.containerName, + Parameters.blob ], queryParameters: [ Parameters.timeout, - Parameters.comp15 + Parameters.comp22 ], headerParameters: [ Parameters.contentLength, + Parameters.transactionalContentMD5, Parameters.transactionalContentCrc64, Parameters.version, Parameters.requestId, @@ -2133,10 +2356,12 @@ const appendBlobAppendBlockOperationSpec: msRest.OperationSpec = { Parameters.encryptionKey, Parameters.encryptionKeySha256, Parameters.encryptionAlgorithm, + Parameters.encryptionScope, Parameters.ifModifiedSince, Parameters.ifUnmodifiedSince, Parameters.ifMatch, - Parameters.ifNoneMatch + Parameters.ifNoneMatch, + Parameters.ifTags ], requestBody: { parameterPath: "body", @@ -2148,7 +2373,7 @@ const appendBlobAppendBlockOperationSpec: msRest.OperationSpec = { } } }, - contentType: "application/xml; charset=utf-8", + contentType: "application/octet-stream", responses: { 201: { headersMapper: Mappers.AppendBlobAppendBlockHeaders @@ -2165,11 +2390,13 @@ const appendBlobAppendBlockFromUrlOperationSpec: msRest.OperationSpec = { httpMethod: "PUT", path: "{containerName}/{blob}", urlParameters: [ - Parameters.url + Parameters.url, + Parameters.containerName, + Parameters.blob ], queryParameters: [ Parameters.timeout, - Parameters.comp15 + Parameters.comp22 ], headerParameters: [ Parameters.sourceUrl, @@ -2177,11 +2404,14 @@ const appendBlobAppendBlockFromUrlOperationSpec: msRest.OperationSpec = { Parameters.sourceContentMD5, Parameters.sourceContentcrc64, Parameters.contentLength, + Parameters.transactionalContentMD5, Parameters.version, Parameters.requestId, + Parameters.copySourceAuthorization, Parameters.encryptionKey, Parameters.encryptionKeySha256, Parameters.encryptionAlgorithm, + Parameters.encryptionScope, Parameters.leaseId0, Parameters.maxSize, Parameters.appendPosition, @@ -2189,9 +2419,10 @@ const appendBlobAppendBlockFromUrlOperationSpec: msRest.OperationSpec = { Parameters.ifUnmodifiedSince, Parameters.ifMatch, Parameters.ifNoneMatch, + Parameters.ifTags, Parameters.sourceIfModifiedSince, Parameters.sourceIfUnmodifiedSince, - Parameters.sourceIfMatches, + Parameters.sourceIfMatch, Parameters.sourceIfNoneMatch ], responses: { @@ -2206,22 +2437,64 @@ const appendBlobAppendBlockFromUrlOperationSpec: msRest.OperationSpec = { serializer }; +const appendBlobSealOperationSpec: msRest.OperationSpec = { + httpMethod: "PUT", + path: "{containerName}/{blob}", + urlParameters: [ + Parameters.url, + Parameters.containerName, + Parameters.blob + ], + queryParameters: [ + Parameters.timeout, + Parameters.comp23 + ], + headerParameters: [ + Parameters.version, + Parameters.requestId, + Parameters.leaseId0, + Parameters.ifModifiedSince, + Parameters.ifUnmodifiedSince, + Parameters.ifMatch, + Parameters.ifNoneMatch, + Parameters.appendPosition + ], + responses: { + 200: { + headersMapper: Mappers.AppendBlobSealHeaders + }, + default: { + bodyMapper: Mappers.StorageError + } + }, + isXML: true, + serializer +}; + // specifications for new method group start const blockBlobUploadOperationSpec: msRest.OperationSpec = { httpMethod: "PUT", path: "{containerName}/{blob}", urlParameters: [ - Parameters.url + Parameters.url, + Parameters.containerName, + Parameters.blob ], queryParameters: [ Parameters.timeout ], headerParameters: [ + Parameters.transactionalContentMD5, Parameters.contentLength, Parameters.metadata, Parameters.tier0, Parameters.version, Parameters.requestId, + Parameters.blobTagsString, + Parameters.immutabilityPolicyExpiry, + Parameters.immutabilityPolicyMode, + Parameters.legalHold1, + Parameters.transactionalContentCrc64, Parameters.blobType2, Parameters.blobContentType, Parameters.blobContentEncoding, @@ -2233,10 +2506,12 @@ const blockBlobUploadOperationSpec: msRest.OperationSpec = { Parameters.encryptionKey, Parameters.encryptionKeySha256, Parameters.encryptionAlgorithm, + Parameters.encryptionScope, Parameters.ifModifiedSince, Parameters.ifUnmodifiedSince, Parameters.ifMatch, - Parameters.ifNoneMatch + Parameters.ifNoneMatch, + Parameters.ifTags ], requestBody: { parameterPath: "body", @@ -2261,26 +2536,89 @@ const blockBlobUploadOperationSpec: msRest.OperationSpec = { serializer }; +const blockBlobPutBlobFromUrlOperationSpec: msRest.OperationSpec = { + httpMethod: "PUT", + path: "{containerName}/{blob}", + urlParameters: [ + Parameters.url, + Parameters.containerName, + Parameters.blob + ], + queryParameters: [ + Parameters.timeout + ], + headerParameters: [ + Parameters.transactionalContentMD5, + Parameters.contentLength, + Parameters.metadata, + Parameters.tier0, + Parameters.version, + Parameters.requestId, + Parameters.sourceContentMD5, + Parameters.blobTagsString, + Parameters.copySource, + Parameters.copySourceBlobProperties, + Parameters.copySourceAuthorization, + Parameters.copySourceTags, + Parameters.blobType2, + Parameters.blobContentType, + Parameters.blobContentEncoding, + Parameters.blobContentLanguage, + Parameters.blobContentMD5, + Parameters.blobCacheControl, + Parameters.blobContentDisposition, + Parameters.leaseId0, + Parameters.encryptionKey, + Parameters.encryptionKeySha256, + Parameters.encryptionAlgorithm, + Parameters.encryptionScope, + Parameters.ifModifiedSince, + Parameters.ifUnmodifiedSince, + Parameters.ifMatch, + Parameters.ifNoneMatch, + Parameters.ifTags, + Parameters.sourceIfModifiedSince, + Parameters.sourceIfUnmodifiedSince, + Parameters.sourceIfMatch, + Parameters.sourceIfNoneMatch, + Parameters.sourceIfTags + ], + responses: { + 201: { + headersMapper: Mappers.BlockBlobPutBlobFromUrlHeaders + }, + default: { + bodyMapper: Mappers.StorageError + } + }, + isXML: true, + serializer +}; + const blockBlobStageBlockOperationSpec: msRest.OperationSpec = { httpMethod: "PUT", path: "{containerName}/{blob}", urlParameters: [ - Parameters.url + Parameters.url, + Parameters.containerName, + Parameters.blob ], queryParameters: [ Parameters.blockId, Parameters.timeout, - Parameters.comp16 + Parameters.comp24 ], headerParameters: [ Parameters.contentLength, + Parameters.transactionalContentMD5, Parameters.transactionalContentCrc64, Parameters.version, Parameters.requestId, Parameters.leaseId0, Parameters.encryptionKey, Parameters.encryptionKeySha256, - Parameters.encryptionAlgorithm + Parameters.encryptionAlgorithm, + Parameters.encryptionScope ], requestBody: { parameterPath: "body", @@ -2309,12 +2647,14 @@ const blockBlobStageBlockFromURLOperationSpec: msRest.OperationSpec = { httpMethod: "PUT", path: "{containerName}/{blob}", urlParameters: [ - Parameters.url + Parameters.url, + Parameters.containerName, + Parameters.blob ], queryParameters: [ Parameters.blockId, Parameters.timeout, - Parameters.comp16 + Parameters.comp24 ], headerParameters: [ Parameters.contentLength, @@ -2324,13 +2664,15 @@ const blockBlobStageBlockFromURLOperationSpec: msRest.OperationSpec = { Parameters.sourceContentcrc64, Parameters.version, Parameters.requestId, + Parameters.copySourceAuthorization, Parameters.encryptionKey, Parameters.encryptionKeySha256, Parameters.encryptionAlgorithm, + Parameters.encryptionScope, Parameters.leaseId0, Parameters.sourceIfModifiedSince, Parameters.sourceIfUnmodifiedSince, - Parameters.sourceIfMatches, + Parameters.sourceIfMatch, Parameters.sourceIfNoneMatch ], responses: { @@ -2349,18 +2691,25 @@ const blockBlobCommitBlockListOperationSpec: msRest.OperationSpec = { httpMethod: "PUT", path: "{containerName}/{blob}", urlParameters: [ - Parameters.url + Parameters.url, + Parameters.containerName, + Parameters.blob ], queryParameters: [ Parameters.timeout, - Parameters.comp17 + Parameters.comp25 ], headerParameters: [ + Parameters.transactionalContentMD5, Parameters.transactionalContentCrc64, Parameters.metadata, Parameters.tier0, Parameters.version, Parameters.requestId, + Parameters.blobTagsString, + Parameters.immutabilityPolicyExpiry, + Parameters.immutabilityPolicyMode, + Parameters.legalHold1, Parameters.blobCacheControl, Parameters.blobContentType, Parameters.blobContentEncoding, @@ -2371,10 +2720,12 @@ const blockBlobCommitBlockListOperationSpec: msRest.OperationSpec = { Parameters.encryptionKey, Parameters.encryptionKeySha256, Parameters.encryptionAlgorithm, + Parameters.encryptionScope, Parameters.ifModifiedSince, Parameters.ifUnmodifiedSince, Parameters.ifMatch, - Parameters.ifNoneMatch + Parameters.ifNoneMatch, + Parameters.ifTags ], requestBody: { parameterPath: "blocks", @@ -2400,18 +2751,21 @@ const blockBlobGetBlockListOperationSpec: msRest.OperationSpec = { httpMethod: "GET", path: "{containerName}/{blob}", urlParameters: [ - Parameters.url + Parameters.url, + Parameters.containerName, + Parameters.blob ], queryParameters: [ Parameters.snapshot, Parameters.listType, Parameters.timeout, - Parameters.comp17 + Parameters.comp25 ], headerParameters: [ Parameters.version, Parameters.requestId, - Parameters.leaseId0 + Parameters.leaseId0, + Parameters.ifTags ], responses: { 200: { @@ -2435,6 +2789,7 @@ Specifications[Operation.Service_GetUserDelegationKey] = serviceGetUserDelegatio Specifications[Operation.Service_GetAccountInfo] = serviceGetAccountInfoOperationSpec; Specifications[Operation.Service_GetAccountInfoWithHead] = serviceGetAccountInfoWithHeadOperationSpec; Specifications[Operation.Service_SubmitBatch] = serviceSubmitBatchOperationSpec; +Specifications[Operation.Service_FilterBlobs] = serviceFilterBlobsOperationSpec; Specifications[Operation.Container_Create] = containerCreateOperationSpec; Specifications[Operation.Container_GetProperties] = containerGetPropertiesOperationSpec; Specifications[Operation.Container_GetPropertiesWithHead] = containerGetPropertiesWithHeadOperationSpec; @@ -2442,7 +2797,10 @@ Specifications[Operation.Container_Delete] = containerDeleteOperationSpec; Specifications[Operation.Container_SetMetadata] = containerSetMetadataOperationSpec; Specifications[Operation.Container_GetAccessPolicy] = containerGetAccessPolicyOperationSpec; Specifications[Operation.Container_SetAccessPolicy] = containerSetAccessPolicyOperationSpec; +Specifications[Operation.Container_Restore] = containerRestoreOperationSpec; +Specifications[Operation.Container_Rename] = containerRenameOperationSpec; Specifications[Operation.Container_SubmitBatch] = containerSubmitBatchOperationSpec; +Specifications[Operation.Container_FilterBlobs] = containerFilterBlobsOperationSpec; Specifications[Operation.Container_AcquireLease] = containerAcquireLeaseOperationSpec; Specifications[Operation.Container_ReleaseLease] = containerReleaseLeaseOperationSpec; Specifications[Operation.Container_RenewLease] = containerRenewLeaseOperationSpec; @@ -2452,19 +2810,15 @@ Specifications[Operation.Container_ListBlobFlatSegment] = containerListBlobFlatS Specifications[Operation.Container_ListBlobHierarchySegment] = containerListBlobHierarchySegmentOperationSpec; Specifications[Operation.Container_GetAccountInfo] = containerGetAccountInfoOperationSpec; Specifications[Operation.Container_GetAccountInfoWithHead] = containerGetAccountInfoWithHeadOperationSpec; -Specifications[Operation.Directory_Create] = directoryCreateOperationSpec; -Specifications[Operation.Directory_Rename] = directoryRenameOperationSpec; -Specifications[Operation.Directory_Delete] = directoryDeleteOperationSpec; -Specifications[Operation.Directory_SetAccessControl] = directorySetAccessControlOperationSpec; -Specifications[Operation.Directory_GetAccessControl] = directoryGetAccessControlOperationSpec; Specifications[Operation.Blob_Download] = blobDownloadOperationSpec; Specifications[Operation.Blob_GetProperties] = blobGetPropertiesOperationSpec; Specifications[Operation.Blob_Delete] = blobDeleteOperationSpec; -Specifications[Operation.Blob_SetAccessControl] = blobSetAccessControlOperationSpec; -Specifications[Operation.Blob_GetAccessControl] = blobGetAccessControlOperationSpec; -Specifications[Operation.Blob_Rename] = blobRenameOperationSpec; Specifications[Operation.Blob_Undelete] = blobUndeleteOperationSpec; +Specifications[Operation.Blob_SetExpiry] = blobSetExpiryOperationSpec; Specifications[Operation.Blob_SetHTTPHeaders] = blobSetHTTPHeadersOperationSpec; +Specifications[Operation.Blob_SetImmutabilityPolicy] = blobSetImmutabilityPolicyOperationSpec; +Specifications[Operation.Blob_DeleteImmutabilityPolicy] = blobDeleteImmutabilityPolicyOperationSpec; +Specifications[Operation.Blob_SetLegalHold] = blobSetLegalHoldOperationSpec; Specifications[Operation.Blob_SetMetadata] = blobSetMetadataOperationSpec; Specifications[Operation.Blob_AcquireLease] = blobAcquireLeaseOperationSpec; Specifications[Operation.Blob_ReleaseLease] = blobReleaseLeaseOperationSpec; @@ -2478,6 +2832,9 @@ Specifications[Operation.Blob_AbortCopyFromURL] = blobAbortCopyFromURLOperationS Specifications[Operation.Blob_SetTier] = blobSetTierOperationSpec; Specifications[Operation.Blob_GetAccountInfo] = blobGetAccountInfoOperationSpec; Specifications[Operation.Blob_GetAccountInfoWithHead] = blobGetAccountInfoWithHeadOperationSpec; +Specifications[Operation.Blob_Query] = blobQueryOperationSpec; +Specifications[Operation.Blob_GetTags] = blobGetTagsOperationSpec; +Specifications[Operation.Blob_SetTags] = blobSetTagsOperationSpec; Specifications[Operation.PageBlob_Create] = pageBlobCreateOperationSpec; Specifications[Operation.PageBlob_UploadPages] = pageBlobUploadPagesOperationSpec; Specifications[Operation.PageBlob_ClearPages] = pageBlobClearPagesOperationSpec; @@ -2490,7 +2847,9 @@ Specifications[Operation.PageBlob_CopyIncremental] = pageBlobCopyIncrementalOper Specifications[Operation.AppendBlob_Create] = appendBlobCreateOperationSpec; Specifications[Operation.AppendBlob_AppendBlock] = appendBlobAppendBlockOperationSpec; Specifications[Operation.AppendBlob_AppendBlockFromUrl] = appendBlobAppendBlockFromUrlOperationSpec; +Specifications[Operation.AppendBlob_Seal] = appendBlobSealOperationSpec; Specifications[Operation.BlockBlob_Upload] = blockBlobUploadOperationSpec; +Specifications[Operation.BlockBlob_PutBlobFromUrl] = blockBlobPutBlobFromUrlOperationSpec; Specifications[Operation.BlockBlob_StageBlock] = blockBlobStageBlockOperationSpec; Specifications[Operation.BlockBlob_StageBlockFromURL] = blockBlobStageBlockFromURLOperationSpec; Specifications[Operation.BlockBlob_CommitBlockList] = blockBlobCommitBlockListOperationSpec; diff --git a/src/blob/generated/errors/DeserializationError.ts b/src/blob/generated/errors/DeserializationError.ts index 651ed97c4..82a549096 100644 --- a/src/blob/generated/errors/DeserializationError.ts +++ b/src/blob/generated/errors/DeserializationError.ts @@ -1,4 +1,4 @@ -import MiddlewareError from "./MiddlewareError"; +import MiddlewareError from './MiddlewareError'; export default class DeserializationError extends MiddlewareError { public constructor(message: string) { diff --git a/src/blob/generated/errors/MiddlewareError.ts b/src/blob/generated/errors/MiddlewareError.ts index 3785f445d..b39bbcd0b 100644 --- a/src/blob/generated/errors/MiddlewareError.ts +++ b/src/blob/generated/errors/MiddlewareError.ts @@ -1,4 +1,4 @@ -import { OutgoingHttpHeaders } from "http"; +import { OutgoingHttpHeaders } from 'http'; export default class MiddlewareError extends Error { /** diff --git a/src/blob/generated/errors/OperationMismatchError.ts b/src/blob/generated/errors/OperationMismatchError.ts index f05004820..65660cea6 100644 --- a/src/blob/generated/errors/OperationMismatchError.ts +++ b/src/blob/generated/errors/OperationMismatchError.ts @@ -1,4 +1,4 @@ -import MiddlewareError from "./MiddlewareError"; +import MiddlewareError from './MiddlewareError'; export default class OperationMismatchError extends MiddlewareError { public constructor() { diff --git a/src/blob/generated/errors/UnsupportedRequestError.ts b/src/blob/generated/errors/UnsupportedRequestError.ts index bdafb4839..1acee87ea 100644 --- a/src/blob/generated/errors/UnsupportedRequestError.ts +++ b/src/blob/generated/errors/UnsupportedRequestError.ts @@ -1,4 +1,4 @@ -import MiddlewareError from "./MiddlewareError"; +import MiddlewareError from './MiddlewareError'; export default class UnsupportedRequestError extends MiddlewareError { public constructor() { diff --git a/src/blob/generated/handlers/IAppendBlobHandler.ts b/src/blob/generated/handlers/IAppendBlobHandler.ts index 92d3ff1b1..b3fa59e65 100644 --- a/src/blob/generated/handlers/IAppendBlobHandler.ts +++ b/src/blob/generated/handlers/IAppendBlobHandler.ts @@ -9,11 +9,12 @@ */ // tslint:disable:max-line-length -import * as Models from "../artifacts/models"; -import Context from "../Context"; +import * as Models from '../artifacts/models'; +import Context from '../Context'; export default interface IAppendBlobHandler { create(contentLength: number, options: Models.AppendBlobCreateOptionalParams, context: Context): Promise; appendBlock(body: NodeJS.ReadableStream, contentLength: number, options: Models.AppendBlobAppendBlockOptionalParams, context: Context): Promise; appendBlockFromUrl(sourceUrl: string, contentLength: number, options: Models.AppendBlobAppendBlockFromUrlOptionalParams, context: Context): Promise; + seal(options: Models.AppendBlobSealOptionalParams, context: Context): Promise; } diff --git a/src/blob/generated/handlers/IBlobHandler.ts b/src/blob/generated/handlers/IBlobHandler.ts index 0ff66be80..565263ef6 100644 --- a/src/blob/generated/handlers/IBlobHandler.ts +++ b/src/blob/generated/handlers/IBlobHandler.ts @@ -9,18 +9,19 @@ */ // tslint:disable:max-line-length -import * as Models from "../artifacts/models"; -import Context from "../Context"; +import * as Models from '../artifacts/models'; +import Context from '../Context'; export default interface IBlobHandler { download(options: Models.BlobDownloadOptionalParams, context: Context): Promise; getProperties(options: Models.BlobGetPropertiesOptionalParams, context: Context): Promise; delete(options: Models.BlobDeleteMethodOptionalParams, context: Context): Promise; - setAccessControl(options: Models.BlobSetAccessControlOptionalParams, context: Context): Promise; - getAccessControl(options: Models.BlobGetAccessControlOptionalParams, context: Context): Promise; - rename(renameSource: string, options: Models.BlobRenameOptionalParams, context: Context): Promise; undelete(options: Models.BlobUndeleteOptionalParams, context: Context): Promise; + setExpiry(expiryOptions: Models.BlobExpiryOptions, options: Models.BlobSetExpiryOptionalParams, context: Context): Promise; setHTTPHeaders(options: Models.BlobSetHTTPHeadersOptionalParams, context: Context): Promise; + setImmutabilityPolicy(options: Models.BlobSetImmutabilityPolicyOptionalParams, context: Context): Promise; + deleteImmutabilityPolicy(options: Models.BlobDeleteImmutabilityPolicyOptionalParams, context: Context): Promise; + setLegalHold(legalHold: boolean, options: Models.BlobSetLegalHoldOptionalParams, context: Context): Promise; setMetadata(options: Models.BlobSetMetadataOptionalParams, context: Context): Promise; acquireLease(options: Models.BlobAcquireLeaseOptionalParams, context: Context): Promise; releaseLease(leaseId: string, options: Models.BlobReleaseLeaseOptionalParams, context: Context): Promise; @@ -33,5 +34,7 @@ export default interface IBlobHandler { abortCopyFromURL(copyId: string, options: Models.BlobAbortCopyFromURLOptionalParams, context: Context): Promise; setTier(tier: Models.AccessTier, options: Models.BlobSetTierOptionalParams, context: Context): Promise; getAccountInfo(context: Context): Promise; - getAccountInfoWithHead(context: Context): Promise; + query(options: Models.BlobQueryOptionalParams, context: Context): Promise; + getTags(options: Models.BlobGetTagsOptionalParams, context: Context): Promise; + setTags(options: Models.BlobSetTagsOptionalParams, context: Context): Promise; } diff --git a/src/blob/generated/handlers/IBlockBlobHandler.ts b/src/blob/generated/handlers/IBlockBlobHandler.ts index 4ef661dcd..ab29e6497 100644 --- a/src/blob/generated/handlers/IBlockBlobHandler.ts +++ b/src/blob/generated/handlers/IBlockBlobHandler.ts @@ -9,11 +9,12 @@ */ // tslint:disable:max-line-length -import * as Models from "../artifacts/models"; -import Context from "../Context"; +import * as Models from '../artifacts/models'; +import Context from '../Context'; export default interface IBlockBlobHandler { upload(body: NodeJS.ReadableStream, contentLength: number, options: Models.BlockBlobUploadOptionalParams, context: Context): Promise; + putBlobFromUrl(contentLength: number, copySource: string, options: Models.BlockBlobPutBlobFromUrlOptionalParams, context: Context): Promise; stageBlock(blockId: string, contentLength: number, body: NodeJS.ReadableStream, options: Models.BlockBlobStageBlockOptionalParams, context: Context): Promise; stageBlockFromURL(blockId: string, contentLength: number, sourceUrl: string, options: Models.BlockBlobStageBlockFromURLOptionalParams, context: Context): Promise; commitBlockList(blocks: Models.BlockLookupList, options: Models.BlockBlobCommitBlockListOptionalParams, context: Context): Promise; diff --git a/src/blob/generated/handlers/IContainerHandler.ts b/src/blob/generated/handlers/IContainerHandler.ts index b0dc88de3..f66abbc46 100644 --- a/src/blob/generated/handlers/IContainerHandler.ts +++ b/src/blob/generated/handlers/IContainerHandler.ts @@ -9,18 +9,21 @@ */ // tslint:disable:max-line-length -import * as Models from "../artifacts/models"; -import Context from "../Context"; +import * as Models from '../artifacts/models'; +import Context from '../Context'; export default interface IContainerHandler { create(options: Models.ContainerCreateOptionalParams, context: Context): Promise; getProperties(options: Models.ContainerGetPropertiesOptionalParams, context: Context): Promise; - getPropertiesWithHead(options: Models.ContainerGetPropertiesWithHeadOptionalParams, context: Context): Promise; + getProperties(options: Models.ContainerGetProperties1OptionalParams, context: Context): Promise; delete(options: Models.ContainerDeleteMethodOptionalParams, context: Context): Promise; setMetadata(options: Models.ContainerSetMetadataOptionalParams, context: Context): Promise; getAccessPolicy(options: Models.ContainerGetAccessPolicyOptionalParams, context: Context): Promise; setAccessPolicy(options: Models.ContainerSetAccessPolicyOptionalParams, context: Context): Promise; - submitBatch(body: NodeJS.ReadableStream, contentLength: number, multipartContentType: string, containerName: string, options: Models.ContainerSubmitBatchOptionalParams, context: Context): Promise; + restore(options: Models.ContainerRestoreOptionalParams, context: Context): Promise; + rename(sourceContainerName: string, options: Models.ContainerRenameOptionalParams, context: Context): Promise; + submitBatch(body: NodeJS.ReadableStream, contentLength: number, multipartContentType: string, options: Models.ContainerSubmitBatchOptionalParams, context: Context): Promise; + filterBlobs(options: Models.ContainerFilterBlobsOptionalParams, context: Context): Promise; acquireLease(options: Models.ContainerAcquireLeaseOptionalParams, context: Context): Promise; releaseLease(leaseId: string, options: Models.ContainerReleaseLeaseOptionalParams, context: Context): Promise; renewLease(leaseId: string, options: Models.ContainerRenewLeaseOptionalParams, context: Context): Promise; @@ -29,5 +32,4 @@ export default interface IContainerHandler { listBlobFlatSegment(options: Models.ContainerListBlobFlatSegmentOptionalParams, context: Context): Promise; listBlobHierarchySegment(delimiter: string, options: Models.ContainerListBlobHierarchySegmentOptionalParams, context: Context): Promise; getAccountInfo(context: Context): Promise; - getAccountInfoWithHead(context: Context): Promise; } diff --git a/src/blob/generated/handlers/IDirectoryHandler.ts b/src/blob/generated/handlers/IDirectoryHandler.ts deleted file mode 100644 index d9a739dba..000000000 --- a/src/blob/generated/handlers/IDirectoryHandler.ts +++ /dev/null @@ -1,21 +0,0 @@ -/* - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for - * license information. - * - * Code generated by Microsoft (R) AutoRest Code Generator. - * Changes may cause incorrect behavior and will be lost if the code is - * regenerated. - */ -// tslint:disable:max-line-length - -import * as Models from "../artifacts/models"; -import Context from "../Context"; - -export default interface IDirectoryHandler { - create(options: Models.DirectoryCreateOptionalParams, context: Context): Promise; - rename(renameSource: string, options: Models.DirectoryRenameOptionalParams, context: Context): Promise; - delete(recursiveDirectoryDelete: boolean, options: Models.DirectoryDeleteMethodOptionalParams, context: Context): Promise; - setAccessControl(options: Models.DirectorySetAccessControlOptionalParams, context: Context): Promise; - getAccessControl(options: Models.DirectoryGetAccessControlOptionalParams, context: Context): Promise; -} diff --git a/src/blob/generated/handlers/IHandlers.ts b/src/blob/generated/handlers/IHandlers.ts index 67ee9160d..a1e51cb0b 100644 --- a/src/blob/generated/handlers/IHandlers.ts +++ b/src/blob/generated/handlers/IHandlers.ts @@ -1,16 +1,14 @@ +import IAppendBlobHandler from './IAppendBlobHandler'; +import IBlobHandler from './IBlobHandler'; +import IBlockBlobHandler from './IBlockBlobHandler'; +import IContainerHandler from './IContainerHandler'; +import IPageBlobHandler from './IPageBlobHandler'; // tslint:disable:ordered-imports -import IServiceHandler from "./IServiceHandler"; -import IContainerHandler from "./IContainerHandler"; -import IDirectoryHandler from "./IDirectoryHandler"; -import IBlobHandler from "./IBlobHandler"; -import IPageBlobHandler from "./IPageBlobHandler"; -import IAppendBlobHandler from "./IAppendBlobHandler"; -import IBlockBlobHandler from "./IBlockBlobHandler"; +import IServiceHandler from './IServiceHandler'; export interface IHandlers { serviceHandler: IServiceHandler; containerHandler: IContainerHandler; - directoryHandler: IDirectoryHandler; blobHandler: IBlobHandler; pageBlobHandler: IPageBlobHandler; appendBlobHandler: IAppendBlobHandler; diff --git a/src/blob/generated/handlers/IPageBlobHandler.ts b/src/blob/generated/handlers/IPageBlobHandler.ts index 2e3fe9a8d..1c472367c 100644 --- a/src/blob/generated/handlers/IPageBlobHandler.ts +++ b/src/blob/generated/handlers/IPageBlobHandler.ts @@ -9,8 +9,8 @@ */ // tslint:disable:max-line-length -import * as Models from "../artifacts/models"; -import Context from "../Context"; +import * as Models from '../artifacts/models'; +import Context from '../Context'; export default interface IPageBlobHandler { create(contentLength: number, blobContentLength: number, options: Models.PageBlobCreateOptionalParams, context: Context): Promise; @@ -18,7 +18,7 @@ export default interface IPageBlobHandler { clearPages(contentLength: number, options: Models.PageBlobClearPagesOptionalParams, context: Context): Promise; uploadPagesFromURL(sourceUrl: string, sourceRange: string, contentLength: number, range: string, options: Models.PageBlobUploadPagesFromURLOptionalParams, context: Context): Promise; getPageRanges(options: Models.PageBlobGetPageRangesOptionalParams, context: Context): Promise; - getPageRangesDiff(prevsnapshot: string, options: Models.PageBlobGetPageRangesDiffOptionalParams, context: Context): Promise; + getPageRangesDiff(options: Models.PageBlobGetPageRangesDiffOptionalParams, context: Context): Promise; resize(blobContentLength: number, options: Models.PageBlobResizeOptionalParams, context: Context): Promise; updateSequenceNumber(sequenceNumberAction: Models.SequenceNumberActionType, options: Models.PageBlobUpdateSequenceNumberOptionalParams, context: Context): Promise; copyIncremental(copySource: string, options: Models.PageBlobCopyIncrementalOptionalParams, context: Context): Promise; diff --git a/src/blob/generated/handlers/IServiceHandler.ts b/src/blob/generated/handlers/IServiceHandler.ts index b490c6687..fd3725dab 100644 --- a/src/blob/generated/handlers/IServiceHandler.ts +++ b/src/blob/generated/handlers/IServiceHandler.ts @@ -9,8 +9,8 @@ */ // tslint:disable:max-line-length -import * as Models from "../artifacts/models"; -import Context from "../Context"; +import * as Models from '../artifacts/models'; +import Context from '../Context'; export default interface IServiceHandler { setProperties(storageServiceProperties: Models.StorageServiceProperties, options: Models.ServiceSetPropertiesOptionalParams, context: Context): Promise; @@ -19,6 +19,6 @@ export default interface IServiceHandler { listContainersSegment(options: Models.ServiceListContainersSegmentOptionalParams, context: Context): Promise; getUserDelegationKey(keyInfo: Models.KeyInfo, options: Models.ServiceGetUserDelegationKeyOptionalParams, context: Context): Promise; getAccountInfo(context: Context): Promise; - getAccountInfoWithHead(context: Context): Promise; submitBatch(body: NodeJS.ReadableStream, contentLength: number, multipartContentType: string, options: Models.ServiceSubmitBatchOptionalParams, context: Context): Promise; + filterBlobs(options: Models.ServiceFilterBlobsOptionalParams, context: Context): Promise; } diff --git a/src/blob/generated/handlers/handlerMappers.ts b/src/blob/generated/handlers/handlerMappers.ts index 800fbfbf2..41cce7ce1 100644 --- a/src/blob/generated/handlers/handlerMappers.ts +++ b/src/blob/generated/handlers/handlerMappers.ts @@ -1,4 +1,4 @@ -import Operation from "../artifacts/operation"; +import Operation from '../artifacts/operation'; // tslint:disable:one-line @@ -55,7 +55,7 @@ operationHandlerMapping[Operation.Service_GetAccountInfo] = { operationHandlerMapping[Operation.Service_GetAccountInfoWithHead] = { arguments: [], handler: "serviceHandler", - method: "getAccountInfoWithHead" + method: "getAccountInfo" }; operationHandlerMapping[Operation.Service_SubmitBatch] = { arguments: [ @@ -67,6 +67,13 @@ operationHandlerMapping[Operation.Service_SubmitBatch] = { handler: "serviceHandler", method: "submitBatch" }; +operationHandlerMapping[Operation.Service_FilterBlobs] = { + arguments: [ + "options" + ], + handler: "serviceHandler", + method: "filterBlobs" +}; operationHandlerMapping[Operation.Container_Create] = { arguments: [ "options" @@ -86,7 +93,7 @@ operationHandlerMapping[Operation.Container_GetPropertiesWithHead] = { "options" ], handler: "containerHandler", - method: "getPropertiesWithHead" + method: "getProperties" }; operationHandlerMapping[Operation.Container_Delete] = { arguments: [ @@ -116,17 +123,38 @@ operationHandlerMapping[Operation.Container_SetAccessPolicy] = { handler: "containerHandler", method: "setAccessPolicy" }; +operationHandlerMapping[Operation.Container_Restore] = { + arguments: [ + "options" + ], + handler: "containerHandler", + method: "restore" +}; +operationHandlerMapping[Operation.Container_Rename] = { + arguments: [ + "sourceContainerName", + "options" + ], + handler: "containerHandler", + method: "rename" +}; operationHandlerMapping[Operation.Container_SubmitBatch] = { arguments: [ "body", "contentLength", "multipartContentType", - "containerName", "options" ], handler: "containerHandler", method: "submitBatch" }; +operationHandlerMapping[Operation.Container_FilterBlobs] = { + arguments: [ + "options" + ], + handler: "containerHandler", + method: "filterBlobs" +}; operationHandlerMapping[Operation.Container_AcquireLease] = { arguments: [ "options" @@ -182,51 +210,16 @@ operationHandlerMapping[Operation.Container_ListBlobHierarchySegment] = { method: "listBlobHierarchySegment" }; operationHandlerMapping[Operation.Container_GetAccountInfo] = { - arguments: [], + arguments: [ + ], handler: "containerHandler", method: "getAccountInfo" }; operationHandlerMapping[Operation.Container_GetAccountInfoWithHead] = { - arguments: [], - handler: "containerHandler", - method: "getAccountInfoWithHead" -}; -operationHandlerMapping[Operation.Directory_Create] = { arguments: [ - "options" ], - handler: "directoryHandler", - method: "create" -}; -operationHandlerMapping[Operation.Directory_Rename] = { - arguments: [ - "renameSource", - "options" - ], - handler: "directoryHandler", - method: "rename" -}; -operationHandlerMapping[Operation.Directory_Delete] = { - arguments: [ - "recursiveDirectoryDelete", - "options" - ], - handler: "directoryHandler", - method: "delete" -}; -operationHandlerMapping[Operation.Directory_SetAccessControl] = { - arguments: [ - "options" - ], - handler: "directoryHandler", - method: "setAccessControl" -}; -operationHandlerMapping[Operation.Directory_GetAccessControl] = { - arguments: [ - "options" - ], - handler: "directoryHandler", - method: "getAccessControl" + handler: "containerHandler", + method: "getAccountInfo" }; operationHandlerMapping[Operation.Blob_Download] = { arguments: [ @@ -249,41 +242,49 @@ operationHandlerMapping[Operation.Blob_Delete] = { handler: "blobHandler", method: "delete" }; -operationHandlerMapping[Operation.Blob_SetAccessControl] = { +operationHandlerMapping[Operation.Blob_Undelete] = { arguments: [ "options" ], handler: "blobHandler", - method: "setAccessControl" + method: "undelete" }; -operationHandlerMapping[Operation.Blob_GetAccessControl] = { +operationHandlerMapping[Operation.Blob_SetExpiry] = { arguments: [ + "expiryOptions", "options" ], handler: "blobHandler", - method: "getAccessControl" + method: "setExpiry" }; -operationHandlerMapping[Operation.Blob_Rename] = { +operationHandlerMapping[Operation.Blob_SetHTTPHeaders] = { arguments: [ - "renameSource", "options" ], handler: "blobHandler", - method: "rename" + method: "setHTTPHeaders" }; -operationHandlerMapping[Operation.Blob_Undelete] = { +operationHandlerMapping[Operation.Blob_SetImmutabilityPolicy] = { arguments: [ "options" ], handler: "blobHandler", - method: "undelete" + method: "setImmutabilityPolicy" }; -operationHandlerMapping[Operation.Blob_SetHTTPHeaders] = { +operationHandlerMapping[Operation.Blob_DeleteImmutabilityPolicy] = { arguments: [ "options" ], handler: "blobHandler", - method: "setHTTPHeaders" + method: "deleteImmutabilityPolicy" +}; +operationHandlerMapping[Operation.Blob_SetLegalHold] = { + arguments: [ + "legalHold", + "options" + ], + handler: "blobHandler", + method: "setLegalHold" }; operationHandlerMapping[Operation.Blob_SetMetadata] = { arguments: [ @@ -371,14 +372,37 @@ operationHandlerMapping[Operation.Blob_SetTier] = { method: "setTier" }; operationHandlerMapping[Operation.Blob_GetAccountInfo] = { - arguments: [], + arguments: [ + ], handler: "blobHandler", method: "getAccountInfo" }; operationHandlerMapping[Operation.Blob_GetAccountInfoWithHead] = { - arguments: [], + arguments: [ + ], handler: "blobHandler", - method: "getAccountInfoWithHead" + method: "getAccountInfo" +}; +operationHandlerMapping[Operation.Blob_Query] = { + arguments: [ + "options" + ], + handler: "blobHandler", + method: "query" +}; +operationHandlerMapping[Operation.Blob_GetTags] = { + arguments: [ + "options" + ], + handler: "blobHandler", + method: "getTags" +}; +operationHandlerMapping[Operation.Blob_SetTags] = { + arguments: [ + "options" + ], + handler: "blobHandler", + method: "setTags" }; operationHandlerMapping[Operation.PageBlob_Create] = { arguments: [ @@ -426,7 +450,6 @@ operationHandlerMapping[Operation.PageBlob_GetPageRanges] = { }; operationHandlerMapping[Operation.PageBlob_GetPageRangesDiff] = { arguments: [ - "prevsnapshot", "options" ], handler: "pageBlobHandler", @@ -482,6 +505,13 @@ operationHandlerMapping[Operation.AppendBlob_AppendBlockFromUrl] = { handler: "appendBlobHandler", method: "appendBlockFromUrl" }; +operationHandlerMapping[Operation.AppendBlob_Seal] = { + arguments: [ + "options" + ], + handler: "appendBlobHandler", + method: "seal" +}; operationHandlerMapping[Operation.BlockBlob_Upload] = { arguments: [ "body", @@ -491,6 +521,15 @@ operationHandlerMapping[Operation.BlockBlob_Upload] = { handler: "blockBlobHandler", method: "upload" }; +operationHandlerMapping[Operation.BlockBlob_PutBlobFromUrl] = { + arguments: [ + "contentLength", + "copySource", + "options" + ], + handler: "blockBlobHandler", + method: "putBlobFromUrl" +}; operationHandlerMapping[Operation.BlockBlob_StageBlock] = { arguments: [ "blockId", diff --git a/src/blob/generated/middleware/HandlerMiddlewareFactory.ts b/src/blob/generated/middleware/HandlerMiddlewareFactory.ts index 89f8583a1..60a8b1a63 100644 --- a/src/blob/generated/middleware/HandlerMiddlewareFactory.ts +++ b/src/blob/generated/middleware/HandlerMiddlewareFactory.ts @@ -1,11 +1,11 @@ -import Operation from "../artifacts/operation"; -import Specifications from "../artifacts/specifications"; -import Context from "../Context"; -import OperationMismatchError from "../errors/OperationMismatchError"; -import getHandlerByOperation from "../handlers/handlerMappers"; -import IHandlers from "../handlers/IHandlers"; -import { NextFunction } from "../MiddlewareFactory"; -import ILogger from "../utils/ILogger"; +import Operation from '../artifacts/operation'; +import Specifications from '../artifacts/specifications'; +import Context from '../Context'; +import OperationMismatchError from '../errors/OperationMismatchError'; +import getHandlerByOperation from '../handlers/handlerMappers'; +import IHandlers from '../handlers/IHandlers'; +import { NextFunction } from '../MiddlewareFactory'; +import ILogger from '../utils/ILogger'; /** * Auto generated. HandlerMiddlewareFactory will accept handlers and create handler middleware. diff --git a/src/blob/generated/middleware/deserializer.middleware.ts b/src/blob/generated/middleware/deserializer.middleware.ts index f5378cc64..88813a165 100644 --- a/src/blob/generated/middleware/deserializer.middleware.ts +++ b/src/blob/generated/middleware/deserializer.middleware.ts @@ -1,12 +1,12 @@ -import Operation from "../artifacts/operation"; -import Specifications from "../artifacts/specifications"; -import Context from "../Context"; -import DeserializationError from "../errors/DeserializationError"; -import OperationMismatchError from "../errors/OperationMismatchError"; -import IRequest from "../IRequest"; -import { NextFunction } from "../MiddlewareFactory"; -import ILogger from "../utils/ILogger"; -import { deserialize } from "../utils/serializer"; +import Operation from '../artifacts/operation'; +import Specifications from '../artifacts/specifications'; +import Context from '../Context'; +import DeserializationError from '../errors/DeserializationError'; +import OperationMismatchError from '../errors/OperationMismatchError'; +import IRequest from '../IRequest'; +import { NextFunction } from '../MiddlewareFactory'; +import ILogger from '../utils/ILogger'; +import { deserialize } from '../utils/serializer'; /** * Deserializer Middleware. Deserialize incoming HTTP request into models. diff --git a/src/blob/generated/middleware/dispatch.middleware.ts b/src/blob/generated/middleware/dispatch.middleware.ts index 5e933b8de..49b0864c4 100644 --- a/src/blob/generated/middleware/dispatch.middleware.ts +++ b/src/blob/generated/middleware/dispatch.middleware.ts @@ -1,13 +1,13 @@ -import * as msRest from "@azure/ms-rest-js"; - -import Operation from "../artifacts/operation"; -import Specifications from "../artifacts/specifications"; -import Context from "../Context"; -import UnsupportedRequestError from "../errors/UnsupportedRequestError"; -import IRequest from "../IRequest"; -import { NextFunction } from "../MiddlewareFactory"; -import ILogger from "../utils/ILogger"; -import { isURITemplateMatch } from "../utils/utils"; +import * as msRest from '@azure/ms-rest-js'; + +import Operation from '../artifacts/operation'; +import Specifications from '../artifacts/specifications'; +import Context from '../Context'; +import UnsupportedRequestError from '../errors/UnsupportedRequestError'; +import IRequest from '../IRequest'; +import { NextFunction } from '../MiddlewareFactory'; +import ILogger from '../utils/ILogger'; +import { isURITemplateMatch } from '../utils/utils'; /** * Dispatch Middleware will try to find out which operation of current HTTP request belongs to, diff --git a/src/blob/generated/middleware/end.middleware.ts b/src/blob/generated/middleware/end.middleware.ts index 6aca6b47c..91692225c 100644 --- a/src/blob/generated/middleware/end.middleware.ts +++ b/src/blob/generated/middleware/end.middleware.ts @@ -1,6 +1,6 @@ -import Context from "../Context"; -import IResponse from "../IResponse"; -import ILogger from "../utils/ILogger"; +import Context from '../Context'; +import IResponse from '../IResponse'; +import ILogger from '../utils/ILogger'; /** * End middleware is used to send out final HTTP response. diff --git a/src/blob/generated/middleware/error.middleware.ts b/src/blob/generated/middleware/error.middleware.ts index 1e217cee4..080dd7250 100644 --- a/src/blob/generated/middleware/error.middleware.ts +++ b/src/blob/generated/middleware/error.middleware.ts @@ -1,9 +1,9 @@ -import Context from "../Context"; -import MiddlewareError from "../errors/MiddlewareError"; -import IRequest from "../IRequest"; -import IResponse from "../IResponse"; -import { NextFunction } from "../MiddlewareFactory"; -import ILogger from "../utils/ILogger"; +import Context from '../Context'; +import MiddlewareError from '../errors/MiddlewareError'; +import IRequest from '../IRequest'; +import IResponse from '../IResponse'; +import { NextFunction } from '../MiddlewareFactory'; +import ILogger from '../utils/ILogger'; /** * ErrorMiddleware handles following 2 kinds of errors thrown from previous middleware or handlers: diff --git a/src/blob/generated/middleware/serializer.middleware.ts b/src/blob/generated/middleware/serializer.middleware.ts index 1a85a0339..66460cf10 100644 --- a/src/blob/generated/middleware/serializer.middleware.ts +++ b/src/blob/generated/middleware/serializer.middleware.ts @@ -1,11 +1,11 @@ -import Operation from "../artifacts/operation"; -import Specifications from "../artifacts/specifications"; -import Context from "../Context"; -import OperationMismatchError from "../errors/OperationMismatchError"; -import IResponse from "../IResponse"; -import { NextFunction } from "../MiddlewareFactory"; -import ILogger from "../utils/ILogger"; -import { serialize } from "../utils/serializer"; +import Operation from '../artifacts/operation'; +import Specifications from '../artifacts/specifications'; +import Context from '../Context'; +import OperationMismatchError from '../errors/OperationMismatchError'; +import IResponse from '../IResponse'; +import { NextFunction } from '../MiddlewareFactory'; +import ILogger from '../utils/ILogger'; +import { serialize } from '../utils/serializer'; /** * SerializerMiddleware will serialize models into HTTP responses. diff --git a/src/blob/generated/utils/serializer.ts b/src/blob/generated/utils/serializer.ts index 85197a463..8689cbff4 100644 --- a/src/blob/generated/utils/serializer.ts +++ b/src/blob/generated/utils/serializer.ts @@ -1,11 +1,11 @@ -import * as msRest from "@azure/ms-rest-js"; - -import * as Mappers from "../artifacts/mappers"; -import Context, { IHandlerParameters } from "../Context"; -import IRequest from "../IRequest"; -import IResponse from "../IResponse"; -import ILogger from "./ILogger"; -import { parseXML, stringifyXML } from "./xml"; +import * as msRest from '@azure/ms-rest-js'; + +import * as Mappers from '../artifacts/mappers'; +import Context, { IHandlerParameters } from '../Context'; +import IRequest from '../IRequest'; +import IResponse from '../IResponse'; +import ILogger from './ILogger'; +import { parseXML, stringifyXML } from './xml'; export declare type ParameterPath = | string diff --git a/src/blob/generated/utils/utils.ts b/src/blob/generated/utils/utils.ts index 09128f7e2..8e39e4dd9 100644 --- a/src/blob/generated/utils/utils.ts +++ b/src/blob/generated/utils/utils.ts @@ -1,4 +1,4 @@ -import URITemplate from "uri-templates"; +import URITemplate from 'uri-templates'; export function isURITemplateMatch(url: string, template: string): boolean { const uriTemplate = URITemplate(template); diff --git a/src/blob/generated/utils/xml.ts b/src/blob/generated/utils/xml.ts index 676827077..057eaac91 100644 --- a/src/blob/generated/utils/xml.ts +++ b/src/blob/generated/utils/xml.ts @@ -1,4 +1,4 @@ -import * as xml2js from "xml2js"; +import * as xml2js from 'xml2js'; export function stringifyXML(obj: any, opts?: { rootName?: string }) { const builder = new xml2js.Builder({ diff --git a/src/blob/handlers/AppendBlobHandler.ts b/src/blob/handlers/AppendBlobHandler.ts index 1a9c92e90..129a880d1 100644 --- a/src/blob/handlers/AppendBlobHandler.ts +++ b/src/blob/handlers/AppendBlobHandler.ts @@ -222,4 +222,10 @@ export default class AppendBlobHandler extends BaseHandler ): Promise { throw new NotImplementedError(context.contextId); } + public async seal( + options: Models.AppendBlobSealOptionalParams, + context: Context + ): Promise { + throw new NotImplementedError(context.contextId); + } } diff --git a/src/blob/handlers/BlobBatchHandler.ts b/src/blob/handlers/BlobBatchHandler.ts index 9e0b4415e..9902c2995 100644 --- a/src/blob/handlers/BlobBatchHandler.ts +++ b/src/blob/handlers/BlobBatchHandler.ts @@ -179,8 +179,7 @@ export class BlobBatchHandler { this.extentStore, this.logger, this.loose - ), - directoryHandler: {} as any + ) }; const handlerMiddlewareFactory = new HandlerMiddlewareFactory( diff --git a/src/blob/handlers/BlobHandler.ts b/src/blob/handlers/BlobHandler.ts index ed61c4489..182999ddf 100644 --- a/src/blob/handlers/BlobHandler.ts +++ b/src/blob/handlers/BlobHandler.ts @@ -51,28 +51,6 @@ export default class BlobHandler extends BaseHandler implements IBlobHandler { super(metadataStore, extentStore, logger, loose); } - public setAccessControl( - options: Models.BlobSetAccessControlOptionalParams, - context: Context - ): Promise { - throw new NotImplementedError(context.contextId); - } - - public getAccessControl( - options: Models.BlobGetAccessControlOptionalParams, - context: Context - ): Promise { - throw new NotImplementedError(context.contextId); - } - - public rename( - renameSource: string, - options: Models.BlobRenameOptionalParams, - context: Context - ): Promise { - throw new NotImplementedError(context.contextId); - } - /** * Download blob. * @@ -228,6 +206,14 @@ export default class BlobHandler extends BaseHandler implements IBlobHandler { throw new NotImplementedError(context.contextId); } + public async setExpiry( + expiryOptions: Models.BlobExpiryOptions, + options: Models.BlobSetExpiryOptionalParams, + context: Context + ): Promise { + throw new NotImplementedError(context.contextId); + } + /** * Set HTTP Headers. * see also https://docs.microsoft.com/en-us/rest/api/storageservices/set-blob-properties @@ -296,6 +282,28 @@ export default class BlobHandler extends BaseHandler implements IBlobHandler { return response; } + public async setImmutabilityPolicy( + options: Models.BlobSetImmutabilityPolicyOptionalParams, + context: Context + ): Promise { + throw new NotImplementedError(context.contextId); + } + + public async deleteImmutabilityPolicy( + options: Models.BlobDeleteImmutabilityPolicyOptionalParams, + context: Context + ): Promise { + throw new NotImplementedError(context.contextId); + } + + public async setLegalHold( + legalHold: boolean, + options: Models.BlobSetLegalHoldOptionalParams, + context: Context + ): Promise { + throw new NotImplementedError(context.contextId); + } + /** * Set Metadata. * @@ -1215,4 +1223,25 @@ export default class BlobHandler extends BaseHandler implements IBlobHandler { return response; } + + public async query( + options: Models.BlobQueryOptionalParams, + context: Context + ): Promise{ + throw new NotImplementedError(context.contextId); + } + + public async getTags( + options: Models.BlobGetTagsOptionalParams, + context: Context + ): Promise { + throw new NotImplementedError(context.contextId); + } + + public async setTags( + options: Models.BlobSetTagsOptionalParams, + context: Context + ): Promise { + throw new NotImplementedError(context.contextId); + } } diff --git a/src/blob/handlers/BlockBlobHandler.ts b/src/blob/handlers/BlockBlobHandler.ts index e4d718ff6..cd2ee32e5 100644 --- a/src/blob/handlers/BlockBlobHandler.ts +++ b/src/blob/handlers/BlockBlobHandler.ts @@ -157,6 +157,11 @@ export default class BlockBlobHandler return response; } + public async putBlobFromUrl(contentLength: number, copySource: string, options: Models.BlockBlobPutBlobFromUrlOptionalParams, context: Context + ): Promise { + throw new NotImplementedError(context.contextId); + } + public async stageBlock( blockId: string, contentLength: number, @@ -170,9 +175,11 @@ export default class BlockBlobHandler const blobName = blobCtx.blob!; const date = blobCtx.startTime!; - options.blobHTTPHeaders = options.blobHTTPHeaders || {}; + // stageBlock operation doesn't have blobHTTPHeaders + // https://learn.microsoft.com/en-us/rest/api/storageservices/put-block + // options.blobHTTPHeaders = options.blobHTTPHeaders || {}; const contentMD5 = context.request!.getHeader("content-md5") - ? options.blobHTTPHeaders.blobContentMD5 || + ? options.transactionalContentMD5 || context.request!.getHeader("content-md5") : undefined; diff --git a/src/blob/handlers/ContainerHandler.ts b/src/blob/handlers/ContainerHandler.ts index 6aba00517..1167066b7 100644 --- a/src/blob/handlers/ContainerHandler.ts +++ b/src/blob/handlers/ContainerHandler.ts @@ -5,6 +5,7 @@ import { OAuthLevel } from "../../common/models"; import IExtentStore from "../../common/persistence/IExtentStore"; import { convertRawHeadersToMetadata, newEtag } from "../../common/utils/utils"; import BlobStorageContext from "../context/BlobStorageContext"; +import NotImplementedError from "../errors/NotImplementedError"; import * as Models from "../generated/artifacts/models"; import Context from "../generated/Context"; import IContainerHandler from "../generated/handlers/IContainerHandler"; @@ -320,11 +321,28 @@ export default class ContainerHandler extends BaseHandler return response; } + public async restore( + options: Models.ContainerRestoreOptionalParams, + context: Context + ): Promise { + throw new NotImplementedError(context.contextId!); + } + + // Service doesn't support this feature either. + // The SDK marked rename function to be private to hide it from customer. + // From SDK comments: Need to hide this interface for now. Make it public and turn on the live tests for it when the service is ready. + public async rename( + sourceContainerName: string, + options: Models.ContainerRenameOptionalParams, + context: Context + ): Promise{ + throw new NotImplementedError(context.contextId!); + } + public async submitBatch( body: NodeJS.ReadableStream, contentLength: number, multipartContentType: string, - containerName: string, options: Models.ContainerSubmitBatchOptionalParams, context: Context): Promise { const blobServiceCtx = new BlobStorageContext(context); @@ -345,7 +363,7 @@ export default class ContainerHandler extends BaseHandler // No client request id defined in batch response, should refine swagger and regenerate from it. // batch response succeed code should be 202 instead of 200, should refine swagger and regenerate from it. - const response: Models.ServiceSubmitBatchResponse = { + const response: Models.ContainerSubmitBatchResponse = { statusCode: 202, requestId: context.contextId, version: BLOB_API_VERSION, @@ -356,6 +374,11 @@ export default class ContainerHandler extends BaseHandler return response; } + public async filterBlobs(options: Models.ContainerFilterBlobsOptionalParams, context: Context + ): Promise { + throw new NotImplementedError(context.contextId!); + } + /** * Acquire container lease. * @@ -586,7 +609,6 @@ export default class ContainerHandler extends BaseHandler const request = context.request!; const marker = options.marker; - const delimiter = ""; options.marker = options.marker || ""; let includeSnapshots: boolean = false; let includeUncommittedBlobs: boolean = false; @@ -633,7 +655,6 @@ export default class ContainerHandler extends BaseHandler prefix: options.prefix || "", marker: options.marker, maxResults: options.maxresults, - delimiter, segment: { blobItems: blobs.map(item => { return { diff --git a/src/blob/handlers/PageBlobHandler.ts b/src/blob/handlers/PageBlobHandler.ts index 93547707e..416ec8674 100644 --- a/src/blob/handlers/PageBlobHandler.ts +++ b/src/blob/handlers/PageBlobHandler.ts @@ -60,7 +60,7 @@ export default class PageBlobHandler extends BaseHandler const blobName = blobCtx.blob!; const date = blobCtx.startTime!; - if (options.pageBlobAccessTier !== undefined) { + if (options.tier !== undefined) { throw StorageErrorFactory.getAccessTierNotSupportedForBlobType( context.contextId! ); @@ -400,7 +400,6 @@ export default class PageBlobHandler extends BaseHandler } public async getPageRangesDiff( - prevsnapshot: string, options: Models.PageBlobGetPageRangesDiffOptionalParams, context: Context ): Promise { diff --git a/src/blob/handlers/ServiceHandler.ts b/src/blob/handlers/ServiceHandler.ts index 318784855..191e0b75a 100644 --- a/src/blob/handlers/ServiceHandler.ts +++ b/src/blob/handlers/ServiceHandler.ts @@ -22,6 +22,7 @@ import { OAuthLevel } from "../../common/models"; import { BEARER_TOKEN_PREFIX } from "../../common/utils/constants"; import { decode } from "jsonwebtoken"; import { getUserDelegationKeyValue } from "../utils/utils"; +import NotImplementedError from "../errors/NotImplementedError"; /** * ServiceHandler handles Azure Storage Blob service related requests. @@ -351,4 +352,11 @@ export default class ServiceHandler extends BaseHandler ): Promise { return this.getAccountInfo(context); } + + public filterBlobs( + options: Models.ServiceFilterBlobsOptionalParams, + context: Context + ): Promise { + throw new NotImplementedError(context.contextId); + } } diff --git a/src/blob/persistence/IBlobMetadataStore.ts b/src/blob/persistence/IBlobMetadataStore.ts index 6cdeb6649..429340c78 100644 --- a/src/blob/persistence/IBlobMetadataStore.ts +++ b/src/blob/persistence/IBlobMetadataStore.ts @@ -138,7 +138,7 @@ interface IBlobAdditionalProperties { export type BlobModel = IBlobAdditionalProperties & IPageBlobAdditionalProperties & IBlockBlobAdditionalProperties & - Models.BlobItem & + Models.BlobItemInternal & IPersistencyPropertiesOptional; export type BlobPrefixModel = IPersistencyPropertiesOptional & @@ -146,7 +146,7 @@ export type BlobPrefixModel = IPersistencyPropertiesOptional & // The response model for getContainerProperties. interface IGetBlobPropertiesRes { - properties: Models.BlobProperties; + properties: Models.BlobPropertiesInternal; metadata?: Models.BlobMetadata; blobCommittedBlockCount?: number; // AppendBlobOnly } @@ -154,7 +154,7 @@ export type GetBlobPropertiesRes = IGetBlobPropertiesRes; // The response model for each lease-related request. interface IBlobLeaseResponse { - properties: Models.BlobProperties; + properties: Models.BlobPropertiesInternal; leaseId?: string; leaseTime?: number; } @@ -166,7 +166,7 @@ export type ChangeBlobLeaseResponse = IBlobLeaseResponse; // The response model for create snapshot. interface ICreateSnapshotResponse { - properties: Models.BlobProperties; + properties: Models.BlobPropertiesInternal; snapshot: string; } export type CreateSnapshotResponse = ICreateSnapshotResponse; @@ -183,7 +183,7 @@ export type BlobId = IBlobId; // The model contain required attributes of pageblob for request getPageRanges. interface IGetPageRangeResponse { pageRangesInOrder?: PersistencyPageRange[]; - properties: Models.BlobProperties; + properties: Models.BlobPropertiesInternal; } export type GetPageRangeResponse = IGetPageRangeResponse; @@ -628,7 +628,7 @@ export interface IBlobMetadataStore leaseAccessConditions: Models.LeaseAccessConditions | undefined, blobHTTPHeaders: Models.BlobHTTPHeaders | undefined, modifiedAccessConditions?: Models.ModifiedAccessConditions - ): Promise; + ): Promise; /** * Set blob metadata. @@ -651,7 +651,7 @@ export interface IBlobMetadataStore leaseAccessConditions: Models.LeaseAccessConditions | undefined, metadata: Models.BlobMetadata | undefined, modifiedAccessConditions?: Models.ModifiedAccessConditions - ): Promise; + ): Promise; /** * Acquire blob lease. @@ -823,7 +823,7 @@ export interface IBlobMetadataStore metadata: Models.BlobMetadata | undefined, tier: Models.AccessTier | undefined, leaseAccessConditions?: Models.BlobStartCopyFromURLOptionalParams - ): Promise; + ): Promise; /** * Sync copy from Url. @@ -846,7 +846,7 @@ export interface IBlobMetadataStore metadata: Models.BlobMetadata | undefined, tier: Models.AccessTier | undefined, leaseAccessConditions?: Models.BlobCopyFromURLOptionalParams - ): Promise; + ): Promise; /** * Update Tier for a blob. @@ -901,7 +901,7 @@ export interface IBlobMetadataStore leaseAccessConditions?: Models.LeaseAccessConditions, modifiedAccessConditions?: Models.ModifiedAccessConditions, appendPositionAccessConditions?: Models.AppendPositionAccessConditions - ): Promise; + ): Promise; /** * Commit block list for a blob. @@ -947,7 +947,7 @@ export interface IBlobMetadataStore isCommitted: boolean | undefined, leaseAccessConditions: Models.LeaseAccessConditions | undefined ): Promise<{ - properties: Models.BlobProperties; + properties: Models.BlobPropertiesInternal; uncommittedBlocks: Models.Block[]; committedBlocks: Models.Block[]; }>; @@ -975,7 +975,7 @@ export interface IBlobMetadataStore leaseAccessConditions?: Models.LeaseAccessConditions, modifiedAccessConditions?: Models.ModifiedAccessConditions, sequenceNumberAccessConditions?: Models.SequenceNumberAccessConditions - ): Promise; + ): Promise; /** * Clear range for a page blob. @@ -998,7 +998,7 @@ export interface IBlobMetadataStore leaseAccessConditions?: Models.LeaseAccessConditions, modifiedAccessConditions?: Models.ModifiedAccessConditions, sequenceNumberAccessConditions?: Models.SequenceNumberAccessConditions - ): Promise; + ): Promise; /** * Returns the list of valid page ranges for a page blob or snapshot of a page blob. @@ -1044,7 +1044,7 @@ export interface IBlobMetadataStore blobContentLength: number, leaseAccessConditions?: Models.LeaseAccessConditions, modifiedAccessConditions?: Models.ModifiedAccessConditions - ): Promise; + ): Promise; /** * Update the sequence number of a page blob. @@ -1069,7 +1069,7 @@ export interface IBlobMetadataStore blobSequenceNumber: number | undefined, leaseAccessConditions?: Models.LeaseAccessConditions, modifiedAccessConditions?: Models.ModifiedAccessConditions - ): Promise; + ): Promise; /** * Gets uncommitted blocks list for a blob from persistency layer. diff --git a/src/blob/persistence/LokiBlobMetadataStore.ts b/src/blob/persistence/LokiBlobMetadataStore.ts index 03efb8db8..b7ecb7658 100644 --- a/src/blob/persistence/LokiBlobMetadataStore.ts +++ b/src/blob/persistence/LokiBlobMetadataStore.ts @@ -1335,7 +1335,7 @@ export default class LokiBlobMetadataStore leaseAccessConditions: Models.LeaseAccessConditions | undefined, blobHTTPHeaders: Models.BlobHTTPHeaders | undefined, modifiedAccessConditions?: Models.ModifiedAccessConditions - ): Promise { + ): Promise { const coll = this.db.getCollection(this.BLOBS_COLLECTION); const doc = await this.getBlobWithLeaseUpdated( account, @@ -1403,7 +1403,7 @@ export default class LokiBlobMetadataStore leaseAccessConditions: Models.LeaseAccessConditions | undefined, metadata: Models.BlobMetadata | undefined, modifiedAccessConditions?: Models.ModifiedAccessConditions - ): Promise { + ): Promise { const coll = this.db.getCollection(this.BLOBS_COLLECTION); const doc = await this.getBlobWithLeaseUpdated( account, @@ -1781,7 +1781,7 @@ export default class LokiBlobMetadataStore metadata: Models.BlobMetadata | undefined, tier: Models.AccessTier | undefined, options: Models.BlobStartCopyFromURLOptionalParams = {} - ): Promise { + ): Promise { const coll = this.db.getCollection(this.BLOBS_COLLECTION); const sourceBlob = await this.getBlobWithLeaseUpdated( source.account, @@ -1802,7 +1802,7 @@ export default class LokiBlobMetadataStore options.sourceModifiedAccessConditions.sourceIfModifiedSince, ifUnmodifiedSince: options.sourceModifiedAccessConditions.sourceIfUnmodifiedSince, - ifMatch: options.sourceModifiedAccessConditions.sourceIfMatches, + ifMatch: options.sourceModifiedAccessConditions.sourceIfMatch, ifNoneMatch: options.sourceModifiedAccessConditions.sourceIfNoneMatch }, sourceBlob @@ -1966,7 +1966,7 @@ export default class LokiBlobMetadataStore metadata: Models.BlobMetadata | undefined, tier: Models.AccessTier | undefined, options: Models.BlobCopyFromURLOptionalParams = {} - ): Promise { + ): Promise { const coll = this.db.getCollection(this.BLOBS_COLLECTION); const sourceBlob = await this.getBlobWithLeaseUpdated( source.account, @@ -1987,7 +1987,7 @@ export default class LokiBlobMetadataStore options.sourceModifiedAccessConditions.sourceIfModifiedSince, ifUnmodifiedSince: options.sourceModifiedAccessConditions.sourceIfUnmodifiedSince, - ifMatch: options.sourceModifiedAccessConditions.sourceIfMatches, + ifMatch: options.sourceModifiedAccessConditions.sourceIfMatch, ifNoneMatch: options.sourceModifiedAccessConditions.sourceIfNoneMatch }, sourceBlob @@ -2307,7 +2307,7 @@ export default class LokiBlobMetadataStore leaseAccessConditions: Models.LeaseAccessConditions = {}, modifiedAccessConditions: Models.ModifiedAccessConditions = {}, appendPositionAccessConditions: Models.AppendPositionAccessConditions = {} - ): Promise { + ): Promise { const doc = await this.getBlobWithLeaseUpdated( block.accountName, block.containerName, @@ -2559,7 +2559,7 @@ export default class LokiBlobMetadataStore isCommitted: boolean | undefined, leaseAccessConditions: Models.LeaseAccessConditions | undefined ): Promise<{ - properties: Models.BlobProperties; + properties: Models.BlobPropertiesInternal; uncommittedBlocks: Models.Block[]; committedBlocks: Models.Block[]; }> { @@ -2581,7 +2581,7 @@ export default class LokiBlobMetadataStore } const res: { - properties: Models.BlobProperties; + properties: Models.BlobPropertiesInternal; uncommittedBlocks: Models.Block[]; committedBlocks: Models.Block[]; } = { @@ -2637,7 +2637,7 @@ export default class LokiBlobMetadataStore leaseAccessConditions?: Models.LeaseAccessConditions, modifiedAccessConditions?: Models.ModifiedAccessConditions, sequenceNumberAccessConditions?: Models.SequenceNumberAccessConditions - ): Promise { + ): Promise { const coll = this.db.getCollection(this.BLOBS_COLLECTION); const doc = await this.getBlobWithLeaseUpdated( blob.accountName, @@ -2706,7 +2706,7 @@ export default class LokiBlobMetadataStore leaseAccessConditions?: Models.LeaseAccessConditions, modifiedAccessConditions?: Models.ModifiedAccessConditions, sequenceNumberAccessConditions?: Models.SequenceNumberAccessConditions - ): Promise { + ): Promise { const coll = this.db.getCollection(this.BLOBS_COLLECTION); const doc = await this.getBlobWithLeaseUpdated( blob.accountName, @@ -2824,7 +2824,7 @@ export default class LokiBlobMetadataStore blobContentLength: number, leaseAccessConditions?: Models.LeaseAccessConditions, modifiedAccessConditions?: Models.ModifiedAccessConditions - ): Promise { + ): Promise { const coll = this.db.getCollection(this.BLOBS_COLLECTION); const doc = await this.getBlobWithLeaseUpdated( account, @@ -2895,7 +2895,7 @@ export default class LokiBlobMetadataStore blobSequenceNumber: number | undefined, leaseAccessConditions?: Models.LeaseAccessConditions, modifiedAccessConditions?: Models.ModifiedAccessConditions - ): Promise { + ): Promise { const coll = this.db.getCollection(this.BLOBS_COLLECTION); const doc = await this.getBlobWithLeaseUpdated( account, diff --git a/src/blob/persistence/SqlBlobMetadataStore.ts b/src/blob/persistence/SqlBlobMetadataStore.ts index 3447d62af..0013185e2 100644 --- a/src/blob/persistence/SqlBlobMetadataStore.ts +++ b/src/blob/persistence/SqlBlobMetadataStore.ts @@ -1992,7 +1992,7 @@ export default class SqlBlobMetadataStore implements IBlobMetadataStore { leaseAccessConditions: Models.LeaseAccessConditions | undefined, blobHTTPHeaders: Models.BlobHTTPHeaders | undefined, modifiedAccessConditions?: Models.ModifiedAccessConditions - ): Promise { + ): Promise { return this.sequelize.transaction(async (t) => { await this.assertContainerExists(context, account, container, t); @@ -2068,7 +2068,7 @@ export default class SqlBlobMetadataStore implements IBlobMetadataStore { leaseAccessConditions: Models.LeaseAccessConditions | undefined, metadata: Models.BlobMetadata | undefined, modifiedAccessConditions?: Models.ModifiedAccessConditions - ): Promise { + ): Promise { return this.sequelize.transaction(async (t) => { await this.assertContainerExists(context, account, container, t); @@ -2124,7 +2124,7 @@ export default class SqlBlobMetadataStore implements IBlobMetadataStore { } ); - const ret: Models.BlobProperties = { + const ret: Models.BlobPropertiesInternal = { lastModified, etag, leaseStatus: blobModel.properties.leaseStatus, @@ -2490,7 +2490,7 @@ export default class SqlBlobMetadataStore implements IBlobMetadataStore { metadata: Models.BlobMetadata | undefined, tier: Models.AccessTier | undefined, options: Models.BlobStartCopyFromURLOptionalParams = {} - ): Promise { + ): Promise { return this.sequelize.transaction(async (t) => { const sourceBlob = await this.getBlobWithLeaseUpdated( source.account, @@ -2512,7 +2512,7 @@ export default class SqlBlobMetadataStore implements IBlobMetadataStore { options.sourceModifiedAccessConditions.sourceIfModifiedSince, ifUnmodifiedSince: options.sourceModifiedAccessConditions.sourceIfUnmodifiedSince, - ifMatch: options.sourceModifiedAccessConditions.sourceIfMatches, + ifMatch: options.sourceModifiedAccessConditions.sourceIfMatch, ifNoneMatch: options.sourceModifiedAccessConditions.sourceIfNoneMatch }, sourceBlob @@ -2655,7 +2655,7 @@ export default class SqlBlobMetadataStore implements IBlobMetadataStore { destination: BlobId, copySource: string, metadata: Models.BlobMetadata | undefined - ): Promise { + ): Promise { throw new Error("Method not implemented."); } @@ -2764,7 +2764,7 @@ export default class SqlBlobMetadataStore implements IBlobMetadataStore { persistency: IExtentChunk, leaseAccessConditions?: Models.LeaseAccessConditions, modifiedAccessConditions?: Models.ModifiedAccessConditions - ): Promise { + ): Promise { throw new Error("Method not implemented."); } @@ -2775,7 +2775,7 @@ export default class SqlBlobMetadataStore implements IBlobMetadataStore { end: number, leaseAccessConditions?: Models.LeaseAccessConditions, modifiedAccessConditions?: Models.ModifiedAccessConditions - ): Promise { + ): Promise { throw new Error("Method not implemented."); } @@ -2799,7 +2799,7 @@ export default class SqlBlobMetadataStore implements IBlobMetadataStore { blobContentLength: number, leaseAccessConditions?: Models.LeaseAccessConditions, modifiedAccessConditions?: Models.ModifiedAccessConditions - ): Promise { + ): Promise { throw new Error("Method not implemented."); } @@ -2810,7 +2810,7 @@ export default class SqlBlobMetadataStore implements IBlobMetadataStore { blob: string, sequenceNumberAction: Models.SequenceNumberActionType, blobSequenceNumber: number | undefined - ): Promise { + ): Promise { throw new Error("Method not implemented."); } @@ -2822,7 +2822,7 @@ export default class SqlBlobMetadataStore implements IBlobMetadataStore { appendPositionAccessConditions?: | Models.AppendPositionAccessConditions | undefined - ): Promise { + ): Promise { throw new Error("Method not implemented."); } diff --git a/swagger/blob-storage-2021-10-04.json b/swagger/blob-storage-2021-10-04.json new file mode 100644 index 000000000..258b1426c --- /dev/null +++ b/swagger/blob-storage-2021-10-04.json @@ -0,0 +1,12699 @@ +{ + "swagger": "2.0", + "info": { + "title": "Azure Blob Storage", + "version": "2021-10-04", + "x-ms-code-generation-settings": { + "header": "MIT", + "strictSpecAdherence": false + } + }, + "x-ms-parameterized-host": { + "hostTemplate": "{url}", + "useSchemePrefix": false, + "positionInOperation": "first", + "parameters": [ + { + "$ref": "#/parameters/Url" + } + ] + }, + "schemes": [ + "https" + ], + "consumes": [ + "application/xml" + ], + "produces": [ + "application/xml" + ], + "paths": {}, + "x-ms-paths": { + "/?restype=service&comp=properties": { + "put": { + "tags": [ + "service" + ], + "operationId": "Service_SetProperties", + "description": "Sets properties for a storage account's Blob service endpoint, including properties for Storage Analytics and CORS (Cross-Origin Resource Sharing) rules", + "parameters": [ + { + "$ref": "#/parameters/StorageServiceProperties" + }, + { + "$ref": "#/parameters/Timeout" + }, + { + "$ref": "#/parameters/ApiVersionParameter" + }, + { + "$ref": "#/parameters/ClientRequestId" + } + ], + "responses": { + "202": { + "description": "Success (Accepted)", + "headers": { + "x-ms-client-request-id": { + "x-ms-client-name": "ClientRequestId", + "type": "string", + "description": "If a client request id header is sent in the request, this header will be present in the response with the same value." + }, + "x-ms-request-id": { + "x-ms-client-name": "RequestId", + "type": "string", + "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." + }, + "x-ms-version": { + "x-ms-client-name": "Version", + "type": "string", + "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." + } + } + }, + "default": { + "description": "Failure", + "headers": { + "x-ms-error-code": { + "x-ms-client-name": "ErrorCode", + "type": "string" + } + }, + "schema": { + "$ref": "#/definitions/StorageError" + } + } + } + }, + "get": { + "tags": [ + "service" + ], + "operationId": "Service_GetProperties", + "description": "gets the properties of a storage account's Blob service, including properties for Storage Analytics and CORS (Cross-Origin Resource Sharing) rules.", + "parameters": [ + { + "$ref": "#/parameters/Timeout" + }, + { + "$ref": "#/parameters/ApiVersionParameter" + }, + { + "$ref": "#/parameters/ClientRequestId" + } + ], + "responses": { + "200": { + "description": "Success.", + "headers": { + "x-ms-client-request-id": { + "x-ms-client-name": "ClientRequestId", + "type": "string", + "description": "If a client request id header is sent in the request, this header will be present in the response with the same value." + }, + "x-ms-request-id": { + "x-ms-client-name": "RequestId", + "type": "string", + "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." + }, + "x-ms-version": { + "x-ms-client-name": "Version", + "type": "string", + "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." + } + }, + "schema": { + "$ref": "#/definitions/StorageServiceProperties" + } + }, + "default": { + "description": "Failure", + "headers": { + "x-ms-error-code": { + "x-ms-client-name": "ErrorCode", + "type": "string" + } + }, + "schema": { + "$ref": "#/definitions/StorageError" + } + } + } + }, + "parameters": [ + { + "name": "restype", + "description": "restype", + "in": "query", + "required": true, + "type": "string", + "enum": [ + "service" + ] + }, + { + "name": "comp", + "description": "comp", + "in": "query", + "required": true, + "type": "string", + "enum": [ + "properties" + ] + } + ] + }, + "/?restype=service&comp=stats": { + "get": { + "tags": [ + "service" + ], + "operationId": "Service_GetStatistics", + "description": "Retrieves statistics related to replication for the Blob service. It is only available on the secondary location endpoint when read-access geo-redundant replication is enabled for the storage account.", + "parameters": [ + { + "$ref": "#/parameters/Timeout" + }, + { + "$ref": "#/parameters/ApiVersionParameter" + }, + { + "$ref": "#/parameters/ClientRequestId" + } + ], + "responses": { + "200": { + "description": "Success.", + "headers": { + "x-ms-client-request-id": { + "x-ms-client-name": "ClientRequestId", + "type": "string", + "description": "If a client request id header is sent in the request, this header will be present in the response with the same value." + }, + "x-ms-request-id": { + "x-ms-client-name": "RequestId", + "type": "string", + "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." + }, + "x-ms-version": { + "x-ms-client-name": "Version", + "type": "string", + "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." + }, + "Date": { + "type": "string", + "format": "date-time-rfc1123", + "description": "UTC date/time value generated by the service that indicates the time at which the response was initiated" + } + }, + "schema": { + "$ref": "#/definitions/StorageServiceStats" + } + }, + "default": { + "description": "Failure", + "headers": { + "x-ms-error-code": { + "x-ms-client-name": "ErrorCode", + "type": "string" + } + }, + "schema": { + "$ref": "#/definitions/StorageError" + } + } + } + }, + "parameters": [ + { + "name": "restype", + "description": "restype", + "in": "query", + "required": true, + "type": "string", + "enum": [ + "service" + ] + }, + { + "name": "comp", + "description": "comp", + "in": "query", + "required": true, + "type": "string", + "enum": [ + "stats" + ] + } + ] + }, + "/?comp=list": { + "get": { + "tags": [ + "service" + ], + "operationId": "Service_ListContainersSegment", + "description": "The List Containers Segment operation returns a list of the containers under the specified account", + "parameters": [ + { + "$ref": "#/parameters/Prefix" + }, + { + "$ref": "#/parameters/Marker" + }, + { + "$ref": "#/parameters/MaxResults" + }, + { + "$ref": "#/parameters/ListContainersInclude" + }, + { + "$ref": "#/parameters/Timeout" + }, + { + "$ref": "#/parameters/ApiVersionParameter" + }, + { + "$ref": "#/parameters/ClientRequestId" + } + ], + "responses": { + "200": { + "description": "Success.", + "headers": { + "x-ms-client-request-id": { + "x-ms-client-name": "ClientRequestId", + "type": "string", + "description": "If a client request id header is sent in the request, this header will be present in the response with the same value." + }, + "x-ms-request-id": { + "x-ms-client-name": "RequestId", + "type": "string", + "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." + }, + "x-ms-version": { + "x-ms-client-name": "Version", + "type": "string", + "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." + } + }, + "schema": { + "$ref": "#/definitions/ListContainersSegmentResponse" + } + }, + "default": { + "description": "Failure", + "headers": { + "x-ms-error-code": { + "x-ms-client-name": "ErrorCode", + "type": "string" + } + }, + "schema": { + "$ref": "#/definitions/StorageError" + } + } + }, + "x-ms-pageable": { + "nextLinkName": "NextMarker" + } + }, + "parameters": [ + { + "name": "comp", + "description": "comp", + "in": "query", + "required": true, + "type": "string", + "enum": [ + "list" + ] + } + ] + }, + "/?restype=service&comp=userdelegationkey": { + "post": { + "tags": [ + "service" + ], + "operationId": "Service_GetUserDelegationKey", + "description": "Retrieves a user delegation key for the Blob service. This is only a valid operation when using bearer token authentication.", + "parameters": [ + { + "$ref": "#/parameters/KeyInfo" + }, + { + "$ref": "#/parameters/Timeout" + }, + { + "$ref": "#/parameters/ApiVersionParameter" + }, + { + "$ref": "#/parameters/ClientRequestId" + } + ], + "responses": { + "200": { + "description": "Success.", + "headers": { + "x-ms-client-request-id": { + "x-ms-client-name": "ClientRequestId", + "type": "string", + "description": "If a client request id header is sent in the request, this header will be present in the response with the same value." + }, + "x-ms-request-id": { + "x-ms-client-name": "RequestId", + "type": "string", + "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." + }, + "x-ms-version": { + "x-ms-client-name": "Version", + "type": "string", + "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." + }, + "Date": { + "type": "string", + "format": "date-time-rfc1123", + "description": "UTC date/time value generated by the service that indicates the time at which the response was initiated" + } + }, + "schema": { + "$ref": "#/definitions/UserDelegationKey" + } + }, + "default": { + "description": "Failure", + "headers": { + "x-ms-error-code": { + "x-ms-client-name": "ErrorCode", + "type": "string" + } + }, + "schema": { + "$ref": "#/definitions/StorageError" + } + } + } + }, + "parameters": [ + { + "name": "restype", + "description": "restype", + "in": "query", + "required": true, + "type": "string", + "enum": [ + "service" + ] + }, + { + "name": "comp", + "description": "comp", + "in": "query", + "required": true, + "type": "string", + "enum": [ + "userdelegationkey" + ] + } + ] + }, + "/?restype=account&comp=properties": { + "get": { + "tags": [ + "service" + ], + "operationId": "Service_GetAccountInfo", + "description": "Returns the sku name and account kind ", + "parameters": [ + { + "$ref": "#/parameters/ApiVersionParameter" + } + ], + "responses": { + "200": { + "description": "Success (OK)", + "headers": { + "x-ms-client-request-id": { + "x-ms-client-name": "ClientRequestId", + "type": "string", + "description": "If a client request id header is sent in the request, this header will be present in the response with the same value." + }, + "x-ms-request-id": { + "x-ms-client-name": "RequestId", + "type": "string", + "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." + }, + "x-ms-version": { + "x-ms-client-name": "Version", + "type": "string", + "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." + }, + "Date": { + "type": "string", + "format": "date-time-rfc1123", + "description": "UTC date/time value generated by the service that indicates the time at which the response was initiated" + }, + "x-ms-sku-name": { + "x-ms-client-name": "SkuName", + "type": "string", + "enum": [ + "Standard_LRS", + "Standard_GRS", + "Standard_RAGRS", + "Standard_ZRS", + "Premium_LRS" + ], + "x-ms-enum": { + "name": "SkuName", + "modelAsString": false + }, + "description": "Identifies the sku name of the account" + }, + "x-ms-account-kind": { + "x-ms-client-name": "AccountKind", + "type": "string", + "enum": [ + "Storage", + "BlobStorage", + "StorageV2", + "FileStorage", + "BlockBlobStorage" + ], + "x-ms-enum": { + "name": "AccountKind", + "modelAsString": false + }, + "description": "Identifies the account kind" + }, + "x-ms-is-hns-enabled": { + "x-ms-client-name": "IsHierarchicalNamespaceEnabled", + "type": "boolean", + "description": "Version 2019-07-07 and newer. Indicates if the account has a hierarchical namespace enabled." + } + } + }, + "default": { + "description": "Failure", + "headers": { + "x-ms-error-code": { + "x-ms-client-name": "ErrorCode", + "type": "string" + } + }, + "schema": { + "$ref": "#/definitions/StorageError" + } + } + } + }, + "head": { + "tags": [ + "service" + ], + "operationId": "Service_GetAccountInfoWithHead", + "description": "Returns the sku name and account kind ", + "parameters": [ + { + "$ref": "#/parameters/ApiVersionParameter" + } + ], + "responses": { + "200": { + "description": "Success (OK)", + "headers": { + "x-ms-client-request-id": { + "x-ms-client-name": "ClientRequestId", + "type": "string", + "description": "If a client request id header is sent in the request, this header will be present in the response with the same value." + }, + "x-ms-request-id": { + "x-ms-client-name": "RequestId", + "type": "string", + "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." + }, + "x-ms-version": { + "x-ms-client-name": "Version", + "type": "string", + "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." + }, + "Date": { + "type": "string", + "format": "date-time-rfc1123", + "description": "UTC date/time value generated by the service that indicates the time at which the response was initiated" + }, + "x-ms-sku-name": { + "x-ms-client-name": "SkuName", + "type": "string", + "enum": [ + "Standard_LRS", + "Standard_GRS", + "Standard_RAGRS", + "Standard_ZRS", + "Premium_LRS" + ], + "x-ms-enum": { + "name": "SkuName", + "modelAsString": false + }, + "description": "Identifies the sku name of the account" + }, + "x-ms-account-kind": { + "x-ms-client-name": "AccountKind", + "type": "string", + "enum": [ + "Storage", + "BlobStorage", + "StorageV2", + "FileStorage", + "BlockBlobStorage" + ], + "x-ms-enum": { + "name": "AccountKind", + "modelAsString": false + }, + "description": "Identifies the account kind" + }, + "x-ms-is-hns-enabled": { + "x-ms-client-name": "IsHierarchicalNamespaceEnabled", + "type": "boolean", + "description": "Version 2019-07-07 and newer. Indicates if the account has a hierarchical namespace enabled." + } + } + }, + "default": { + "description": "Failure", + "headers": { + "x-ms-error-code": { + "x-ms-client-name": "ErrorCode", + "type": "string" + } + }, + "schema": { + "$ref": "#/definitions/StorageError" + } + } + } + }, + "parameters": [ + { + "name": "restype", + "description": "restype", + "in": "query", + "required": true, + "type": "string", + "enum": [ + "account" + ] + }, + { + "name": "comp", + "description": "comp", + "in": "query", + "required": true, + "type": "string", + "enum": [ + "properties" + ] + } + ] + }, + "/?comp=batch": { + "post": { + "tags": [ + "service" + ], + "operationId": "Service_SubmitBatch", + "description": "The Batch operation allows multiple API calls to be embedded into a single HTTP request.", + "parameters": [ + { + "$ref": "#/parameters/Body" + }, + { + "$ref": "#/parameters/ContentLength" + }, + { + "$ref": "#/parameters/MultipartContentType" + }, + { + "$ref": "#/parameters/Timeout" + }, + { + "$ref": "#/parameters/ApiVersionParameter" + }, + { + "$ref": "#/parameters/ClientRequestId" + } + ], + "responses": { + "202": { + "description": "Success.", + "headers": { + "Content-Type": { + "type": "string", + "description": "The media type of the body of the response. For batch requests, this is multipart/mixed; boundary=batchresponse_GUID" + }, + "x-ms-request-id": { + "x-ms-client-name": "RequestId", + "type": "string", + "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." + }, + "x-ms-version": { + "x-ms-client-name": "Version", + "type": "string", + "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." + } + }, + "schema": { + "type": "object", + "format": "file" + } + }, + "default": { + "description": "Failure", + "headers": { + "x-ms-error-code": { + "x-ms-client-name": "ErrorCode", + "type": "string" + } + }, + "schema": { + "$ref": "#/definitions/StorageError" + } + } + } + }, + "parameters": [ + { + "name": "comp", + "description": "comp", + "in": "query", + "required": true, + "type": "string", + "enum": [ + "batch" + ] + } + ] + }, + "/?comp=blobs": { + "get": { + "tags": [ + "service" + ], + "operationId": "Service_FilterBlobs", + "description": "The Filter Blobs operation enables callers to list blobs across all containers whose tags match a given search expression. Filter blobs searches across all containers within a storage account but can be scoped within the expression to a single container.", + "parameters": [ + { + "$ref": "#/parameters/Timeout" + }, + { + "$ref": "#/parameters/ApiVersionParameter" + }, + { + "$ref": "#/parameters/ClientRequestId" + }, + { + "$ref": "#/parameters/FilterBlobsWhere" + }, + { + "$ref": "#/parameters/Marker" + }, + { + "$ref": "#/parameters/MaxResults" + }, + { + "$ref": "#/parameters/FilterBlobsInclude" + } + ], + "responses": { + "200": { + "description": "Success", + "headers": { + "x-ms-client-request-id": { + "x-ms-client-name": "ClientRequestId", + "type": "string", + "description": "If a client request id header is sent in the request, this header will be present in the response with the same value." + }, + "x-ms-request-id": { + "x-ms-client-name": "RequestId", + "type": "string", + "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." + }, + "x-ms-version": { + "x-ms-client-name": "Version", + "type": "string", + "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." + }, + "Date": { + "type": "string", + "format": "date-time-rfc1123", + "description": "UTC date/time value generated by the service that indicates the time at which the response was initiated" + } + }, + "schema": { + "$ref": "#/definitions/FilterBlobSegment" + } + }, + "default": { + "description": "Failure", + "headers": { + "x-ms-error-code": { + "x-ms-client-name": "ErrorCode", + "type": "string" + } + }, + "schema": { + "$ref": "#/definitions/StorageError" + } + } + } + }, + "parameters": [ + { + "name": "comp", + "description": "comp", + "in": "query", + "required": true, + "type": "string", + "enum": [ + "blobs" + ] + } + ] + }, + "/{containerName}?restype=container": { + "put": { + "tags": [ + "container" + ], + "operationId": "Container_Create", + "description": "creates a new container under the specified account. If the container with the same name already exists, the operation fails", + "parameters": [ + { + "$ref": "#/parameters/Timeout" + }, + { + "$ref": "#/parameters/Metadata" + }, + { + "$ref": "#/parameters/BlobPublicAccess" + }, + { + "$ref": "#/parameters/ApiVersionParameter" + }, + { + "$ref": "#/parameters/ClientRequestId" + }, + { + "$ref": "#/parameters/DefaultEncryptionScope" + }, + { + "$ref": "#/parameters/DenyEncryptionScopeOverride" + } + ], + "responses": { + "201": { + "description": "Success, Container created.", + "headers": { + "ETag": { + "type": "string", + "description": "The ETag contains a value that you can use to perform operations conditionally. If the request version is 2011-08-18 or newer, the ETag value will be in quotes." + }, + "Last-Modified": { + "type": "string", + "format": "date-time-rfc1123", + "description": "Returns the date and time the container was last modified. Any operation that modifies the blob, including an update of the blob's metadata or properties, changes the last-modified time of the blob." + }, + "x-ms-client-request-id": { + "x-ms-client-name": "ClientRequestId", + "type": "string", + "description": "If a client request id header is sent in the request, this header will be present in the response with the same value." + }, + "x-ms-request-id": { + "x-ms-client-name": "RequestId", + "type": "string", + "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." + }, + "x-ms-version": { + "x-ms-client-name": "Version", + "type": "string", + "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." + }, + "Date": { + "type": "string", + "format": "date-time-rfc1123", + "description": "UTC date/time value generated by the service that indicates the time at which the response was initiated" + } + } + }, + "default": { + "description": "Failure", + "headers": { + "x-ms-error-code": { + "x-ms-client-name": "ErrorCode", + "type": "string" + } + }, + "schema": { + "$ref": "#/definitions/StorageError" + } + } + } + }, + "get": { + "tags": [ + "container" + ], + "operationId": "Container_GetProperties", + "description": "returns all user-defined metadata and system properties for the specified container. The data returned does not include the container's list of blobs", + "parameters": [ + { + "$ref": "#/parameters/Timeout" + }, + { + "$ref": "#/parameters/LeaseIdOptional" + }, + { + "$ref": "#/parameters/ApiVersionParameter" + }, + { + "$ref": "#/parameters/ClientRequestId" + } + ], + "responses": { + "200": { + "description": "Success", + "headers": { + "x-ms-meta": { + "type": "string", + "x-ms-client-name": "Metadata", + "x-ms-header-collection-prefix": "x-ms-meta-" + }, + "ETag": { + "type": "string", + "description": "The ETag contains a value that you can use to perform operations conditionally. If the request version is 2011-08-18 or newer, the ETag value will be in quotes." + }, + "Last-Modified": { + "type": "string", + "format": "date-time-rfc1123", + "description": "Returns the date and time the container was last modified. Any operation that modifies the blob, including an update of the blob's metadata or properties, changes the last-modified time of the blob." + }, + "x-ms-lease-duration": { + "x-ms-client-name": "LeaseDuration", + "description": "When a blob is leased, specifies whether the lease is of infinite or fixed duration.", + "type": "string", + "enum": [ + "infinite", + "fixed" + ], + "x-ms-enum": { + "name": "LeaseDurationType", + "modelAsString": false + } + }, + "x-ms-lease-state": { + "x-ms-client-name": "LeaseState", + "description": "Lease state of the blob.", + "type": "string", + "enum": [ + "available", + "leased", + "expired", + "breaking", + "broken" + ], + "x-ms-enum": { + "name": "LeaseStateType", + "modelAsString": false + } + }, + "x-ms-lease-status": { + "x-ms-client-name": "LeaseStatus", + "description": "The current lease status of the blob.", + "type": "string", + "enum": [ + "locked", + "unlocked" + ], + "x-ms-enum": { + "name": "LeaseStatusType", + "modelAsString": false + } + }, + "x-ms-client-request-id": { + "x-ms-client-name": "ClientRequestId", + "type": "string", + "description": "If a client request id header is sent in the request, this header will be present in the response with the same value." + }, + "x-ms-request-id": { + "x-ms-client-name": "RequestId", + "type": "string", + "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." + }, + "x-ms-version": { + "x-ms-client-name": "Version", + "type": "string", + "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." + }, + "Date": { + "type": "string", + "format": "date-time-rfc1123", + "description": "UTC date/time value generated by the service that indicates the time at which the response was initiated" + }, + "x-ms-blob-public-access": { + "x-ms-client-name": "BlobPublicAccess", + "description": "Indicated whether data in the container may be accessed publicly and the level of access", + "type": "string", + "enum": [ + "container", + "blob" + ], + "x-ms-enum": { + "name": "PublicAccessType", + "modelAsString": true + } + }, + "x-ms-has-immutability-policy": { + "x-ms-client-name": "HasImmutabilityPolicy", + "description": "Indicates whether the container has an immutability policy set on it.", + "type": "boolean" + }, + "x-ms-has-legal-hold": { + "x-ms-client-name": "HasLegalHold", + "description": "Indicates whether the container has a legal hold.", + "type": "boolean" + }, + "x-ms-default-encryption-scope": { + "x-ms-client-name": "DefaultEncryptionScope", + "description": "The default encryption scope for the container.", + "type": "string" + }, + "x-ms-deny-encryption-scope-override": { + "x-ms-client-name": "DenyEncryptionScopeOverride", + "description": "Indicates whether the container's default encryption scope can be overriden.", + "type": "boolean" + }, + "x-ms-immutable-storage-with-versioning-enabled": { + "x-ms-client-name": "IsImmutableStorageWithVersioningEnabled", + "description": "Indicates whether version level worm is enabled on a container.", + "type": "boolean" + } + } + }, + "default": { + "description": "Failure", + "headers": { + "x-ms-error-code": { + "x-ms-client-name": "ErrorCode", + "type": "string" + } + }, + "schema": { + "$ref": "#/definitions/StorageError" + } + } + } + }, + "head": { + "tags": [ + "container" + ], + "operationId": "Container_GetProperties", + "description": "returns all user-defined metadata and system properties for the specified container. The data returned does not include the container's list of blobs", + "parameters": [ + { + "$ref": "#/parameters/Timeout" + }, + { + "$ref": "#/parameters/LeaseIdOptional" + }, + { + "$ref": "#/parameters/ApiVersionParameter" + }, + { + "$ref": "#/parameters/ClientRequestId" + } + ], + "responses": { + "200": { + "description": "Success", + "headers": { + "x-ms-meta": { + "type": "string", + "x-ms-client-name": "Metadata", + "x-ms-header-collection-prefix": "x-ms-meta-" + }, + "ETag": { + "type": "string", + "description": "The ETag contains a value that you can use to perform operations conditionally. If the request version is 2011-08-18 or newer, the ETag value will be in quotes." + }, + "Last-Modified": { + "type": "string", + "format": "date-time-rfc1123", + "description": "Returns the date and time the container was last modified. Any operation that modifies the blob, including an update of the blob's metadata or properties, changes the last-modified time of the blob." + }, + "x-ms-lease-duration": { + "x-ms-client-name": "LeaseDuration", + "description": "When a blob is leased, specifies whether the lease is of infinite or fixed duration.", + "type": "string", + "enum": [ + "infinite", + "fixed" + ], + "x-ms-enum": { + "name": "LeaseDurationType", + "modelAsString": false + } + }, + "x-ms-lease-state": { + "x-ms-client-name": "LeaseState", + "description": "Lease state of the blob.", + "type": "string", + "enum": [ + "available", + "leased", + "expired", + "breaking", + "broken" + ], + "x-ms-enum": { + "name": "LeaseStateType", + "modelAsString": false + } + }, + "x-ms-lease-status": { + "x-ms-client-name": "LeaseStatus", + "description": "The current lease status of the blob.", + "type": "string", + "enum": [ + "locked", + "unlocked" + ], + "x-ms-enum": { + "name": "LeaseStatusType", + "modelAsString": false + } + }, + "x-ms-client-request-id": { + "x-ms-client-name": "ClientRequestId", + "type": "string", + "description": "If a client request id header is sent in the request, this header will be present in the response with the same value." + }, + "x-ms-request-id": { + "x-ms-client-name": "RequestId", + "type": "string", + "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." + }, + "x-ms-version": { + "x-ms-client-name": "Version", + "type": "string", + "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." + }, + "Date": { + "type": "string", + "format": "date-time-rfc1123", + "description": "UTC date/time value generated by the service that indicates the time at which the response was initiated" + }, + "x-ms-blob-public-access": { + "x-ms-client-name": "BlobPublicAccess", + "description": "Indicated whether data in the container may be accessed publicly and the level of access", + "type": "string", + "enum": [ + "container", + "blob" + ], + "x-ms-enum": { + "name": "PublicAccessType", + "modelAsString": true + } + }, + "x-ms-has-immutability-policy": { + "x-ms-client-name": "HasImmutabilityPolicy", + "description": "Indicates whether the container has an immutability policy set on it.", + "type": "boolean" + }, + "x-ms-has-legal-hold": { + "x-ms-client-name": "HasLegalHold", + "description": "Indicates whether the container has a legal hold.", + "type": "boolean" + }, + "x-ms-default-encryption-scope": { + "x-ms-client-name": "DefaultEncryptionScope", + "description": "The default encryption scope for the container.", + "type": "string" + }, + "x-ms-deny-encryption-scope-override": { + "x-ms-client-name": "DenyEncryptionScopeOverride", + "description": "Indicates whether the container's default encryption scope can be overriden.", + "type": "boolean" + }, + "x-ms-immutable-storage-with-versioning-enabled": { + "x-ms-client-name": "IsImmutableStorageWithVersioningEnabled", + "description": "Indicates whether version level worm is enabled on a container.", + "type": "boolean" + } + } + }, + "default": { + "description": "Failure", + "headers": { + "x-ms-error-code": { + "x-ms-client-name": "ErrorCode", + "type": "string" + } + }, + "schema": { + "$ref": "#/definitions/StorageError" + } + } + } + }, + "delete": { + "tags": [ + "container" + ], + "operationId": "Container_Delete", + "description": "operation marks the specified container for deletion. The container and any blobs contained within it are later deleted during garbage collection", + "parameters": [ + { + "$ref": "#/parameters/Timeout" + }, + { + "$ref": "#/parameters/LeaseIdOptional" + }, + { + "$ref": "#/parameters/IfModifiedSince" + }, + { + "$ref": "#/parameters/IfUnmodifiedSince" + }, + { + "$ref": "#/parameters/ApiVersionParameter" + }, + { + "$ref": "#/parameters/ClientRequestId" + } + ], + "responses": { + "202": { + "description": "Accepted", + "headers": { + "x-ms-client-request-id": { + "x-ms-client-name": "ClientRequestId", + "type": "string", + "description": "If a client request id header is sent in the request, this header will be present in the response with the same value." + }, + "x-ms-request-id": { + "x-ms-client-name": "RequestId", + "type": "string", + "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." + }, + "x-ms-version": { + "x-ms-client-name": "Version", + "type": "string", + "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." + }, + "Date": { + "type": "string", + "format": "date-time-rfc1123", + "description": "UTC date/time value generated by the service that indicates the time at which the response was initiated" + } + } + }, + "default": { + "description": "Failure", + "headers": { + "x-ms-error-code": { + "x-ms-client-name": "ErrorCode", + "type": "string" + } + }, + "schema": { + "$ref": "#/definitions/StorageError" + } + } + } + }, + "parameters": [ + { + "$ref": "#/parameters/ContainerName" + }, + { + "name": "restype", + "description": "restype", + "in": "query", + "required": true, + "type": "string", + "enum": [ + "container" + ] + } + ] + }, + "/{containerName}?restype=container&comp=metadata": { + "put": { + "tags": [ + "container" + ], + "operationId": "Container_SetMetadata", + "description": "operation sets one or more user-defined name-value pairs for the specified container.", + "parameters": [ + { + "$ref": "#/parameters/Timeout" + }, + { + "$ref": "#/parameters/LeaseIdOptional" + }, + { + "$ref": "#/parameters/Metadata" + }, + { + "$ref": "#/parameters/IfModifiedSince" + }, + { + "$ref": "#/parameters/ApiVersionParameter" + }, + { + "$ref": "#/parameters/ClientRequestId" + } + ], + "responses": { + "200": { + "description": "Success", + "headers": { + "ETag": { + "type": "string", + "description": "The ETag contains a value that you can use to perform operations conditionally. If the request version is 2011-08-18 or newer, the ETag value will be in quotes." + }, + "Last-Modified": { + "type": "string", + "format": "date-time-rfc1123", + "description": "Returns the date and time the container was last modified. Any operation that modifies the blob, including an update of the blob's metadata or properties, changes the last-modified time of the blob." + }, + "x-ms-client-request-id": { + "x-ms-client-name": "ClientRequestId", + "type": "string", + "description": "If a client request id header is sent in the request, this header will be present in the response with the same value." + }, + "x-ms-request-id": { + "x-ms-client-name": "RequestId", + "type": "string", + "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." + }, + "x-ms-version": { + "x-ms-client-name": "Version", + "type": "string", + "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." + }, + "Date": { + "type": "string", + "format": "date-time-rfc1123", + "description": "UTC date/time value generated by the service that indicates the time at which the response was initiated" + } + } + }, + "default": { + "description": "Failure", + "headers": { + "x-ms-error-code": { + "x-ms-client-name": "ErrorCode", + "type": "string" + } + }, + "schema": { + "$ref": "#/definitions/StorageError" + } + } + } + }, + "parameters": [ + { + "$ref": "#/parameters/ContainerName" + }, + { + "name": "restype", + "description": "restype", + "in": "query", + "required": true, + "type": "string", + "enum": [ + "container" + ] + }, + { + "name": "comp", + "description": "comp", + "in": "query", + "required": true, + "type": "string", + "enum": [ + "metadata" + ] + } + ] + }, + "/{containerName}?restype=container&comp=acl": { + "get": { + "tags": [ + "container" + ], + "operationId": "Container_GetAccessPolicy", + "description": "gets the permissions for the specified container. The permissions indicate whether container data may be accessed publicly.", + "parameters": [ + { + "$ref": "#/parameters/Timeout" + }, + { + "$ref": "#/parameters/LeaseIdOptional" + }, + { + "$ref": "#/parameters/ApiVersionParameter" + }, + { + "$ref": "#/parameters/ClientRequestId" + } + ], + "responses": { + "200": { + "description": "Success", + "headers": { + "x-ms-blob-public-access": { + "x-ms-client-name": "BlobPublicAccess", + "description": "Indicated whether data in the container may be accessed publicly and the level of access", + "type": "string", + "enum": [ + "container", + "blob" + ], + "x-ms-enum": { + "name": "PublicAccessType", + "modelAsString": true + } + }, + "ETag": { + "type": "string", + "description": "The ETag contains a value that you can use to perform operations conditionally. If the request version is 2011-08-18 or newer, the ETag value will be in quotes." + }, + "Last-Modified": { + "type": "string", + "format": "date-time-rfc1123", + "description": "Returns the date and time the container was last modified. Any operation that modifies the blob, including an update of the blob's metadata or properties, changes the last-modified time of the blob." + }, + "x-ms-client-request-id": { + "x-ms-client-name": "ClientRequestId", + "type": "string", + "description": "If a client request id header is sent in the request, this header will be present in the response with the same value." + }, + "x-ms-request-id": { + "x-ms-client-name": "RequestId", + "type": "string", + "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." + }, + "x-ms-version": { + "x-ms-client-name": "Version", + "type": "string", + "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." + }, + "Date": { + "type": "string", + "format": "date-time-rfc1123", + "description": "UTC date/time value generated by the service that indicates the time at which the response was initiated" + } + }, + "schema": { + "$ref": "#/definitions/SignedIdentifiers" + } + }, + "default": { + "description": "Failure", + "headers": { + "x-ms-error-code": { + "x-ms-client-name": "ErrorCode", + "type": "string" + } + }, + "schema": { + "$ref": "#/definitions/StorageError" + } + } + } + }, + "put": { + "tags": [ + "container" + ], + "operationId": "Container_SetAccessPolicy", + "description": "sets the permissions for the specified container. The permissions indicate whether blobs in a container may be accessed publicly.", + "parameters": [ + { + "$ref": "#/parameters/ContainerAcl" + }, + { + "$ref": "#/parameters/Timeout" + }, + { + "$ref": "#/parameters/LeaseIdOptional" + }, + { + "$ref": "#/parameters/BlobPublicAccess" + }, + { + "$ref": "#/parameters/IfModifiedSince" + }, + { + "$ref": "#/parameters/IfUnmodifiedSince" + }, + { + "$ref": "#/parameters/ApiVersionParameter" + }, + { + "$ref": "#/parameters/ClientRequestId" + } + ], + "responses": { + "200": { + "description": "Success.", + "headers": { + "ETag": { + "type": "string", + "description": "The ETag contains a value that you can use to perform operations conditionally. If the request version is 2011-08-18 or newer, the ETag value will be in quotes." + }, + "Last-Modified": { + "type": "string", + "format": "date-time-rfc1123", + "description": "Returns the date and time the container was last modified. Any operation that modifies the blob, including an update of the blob's metadata or properties, changes the last-modified time of the blob." + }, + "x-ms-client-request-id": { + "x-ms-client-name": "ClientRequestId", + "type": "string", + "description": "If a client request id header is sent in the request, this header will be present in the response with the same value." + }, + "x-ms-request-id": { + "x-ms-client-name": "RequestId", + "type": "string", + "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." + }, + "x-ms-version": { + "x-ms-client-name": "Version", + "type": "string", + "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." + }, + "Date": { + "type": "string", + "format": "date-time-rfc1123", + "description": "UTC date/time value generated by the service that indicates the time at which the response was initiated" + } + } + }, + "default": { + "description": "Failure", + "headers": { + "x-ms-error-code": { + "x-ms-client-name": "ErrorCode", + "type": "string" + } + }, + "schema": { + "$ref": "#/definitions/StorageError" + } + } + } + }, + "parameters": [ + { + "$ref": "#/parameters/ContainerName" + }, + { + "name": "restype", + "description": "restype", + "in": "query", + "required": true, + "type": "string", + "enum": [ + "container" + ] + }, + { + "name": "comp", + "description": "comp", + "in": "query", + "required": true, + "type": "string", + "enum": [ + "acl" + ] + } + ] + }, + "/{containerName}?restype=container&comp=undelete": { + "put": { + "tags": [ + "container" + ], + "operationId": "Container_Restore", + "description": "Restores a previously-deleted container.", + "parameters": [ + { + "$ref": "#/parameters/Timeout" + }, + { + "$ref": "#/parameters/ApiVersionParameter" + }, + { + "$ref": "#/parameters/ClientRequestId" + }, + { + "$ref": "#/parameters/DeletedContainerName" + }, + { + "$ref": "#/parameters/DeletedContainerVersion" + } + ], + "responses": { + "201": { + "description": "Created.", + "headers": { + "x-ms-client-request-id": { + "x-ms-client-name": "ClientRequestId", + "type": "string", + "description": "If a client request id header is sent in the request, this header will be present in the response with the same value." + }, + "x-ms-request-id": { + "x-ms-client-name": "RequestId", + "type": "string", + "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." + }, + "x-ms-version": { + "x-ms-client-name": "Version", + "type": "string", + "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." + }, + "Date": { + "type": "string", + "format": "date-time-rfc1123", + "description": "UTC date/time value generated by the service that indicates the time at which the response was initiated" + } + } + }, + "default": { + "description": "Failure", + "headers": { + "x-ms-error-code": { + "x-ms-client-name": "ErrorCode", + "type": "string" + } + }, + "schema": { + "$ref": "#/definitions/StorageError" + } + } + } + }, + "parameters": [ + { + "$ref": "#/parameters/ContainerName" + }, + { + "name": "restype", + "description": "restype", + "in": "query", + "required": true, + "type": "string", + "enum": [ + "container" + ] + }, + { + "name": "comp", + "description": "comp", + "in": "query", + "required": true, + "type": "string", + "enum": [ + "undelete" + ] + } + ] + }, + "/{containerName}?restype=container&comp=rename": { + "put": { + "tags": [ + "container" + ], + "operationId": "Container_Rename", + "description": "Renames an existing container.", + "parameters": [ + { + "$ref": "#/parameters/Timeout" + }, + { + "$ref": "#/parameters/ApiVersionParameter" + }, + { + "$ref": "#/parameters/ClientRequestId" + }, + { + "$ref": "#/parameters/SourceContainerName" + }, + { + "$ref": "#/parameters/SourceLeaseId" + } + ], + "responses": { + "200": { + "description": "Created.", + "headers": { + "x-ms-client-request-id": { + "x-ms-client-name": "ClientRequestId", + "type": "string", + "description": "If a client request id header is sent in the request, this header will be present in the response with the same value." + }, + "x-ms-request-id": { + "x-ms-client-name": "RequestId", + "type": "string", + "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." + }, + "x-ms-version": { + "x-ms-client-name": "Version", + "type": "string", + "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." + }, + "Date": { + "type": "string", + "format": "date-time-rfc1123", + "description": "UTC date/time value generated by the service that indicates the time at which the response was initiated" + } + } + }, + "default": { + "description": "Failure", + "headers": { + "x-ms-error-code": { + "x-ms-client-name": "ErrorCode", + "type": "string" + } + }, + "schema": { + "$ref": "#/definitions/StorageError" + } + } + } + }, + "parameters": [ + { + "$ref": "#/parameters/ContainerName" + }, + { + "name": "restype", + "description": "restype", + "in": "query", + "required": true, + "type": "string", + "enum": [ + "container" + ] + }, + { + "name": "comp", + "description": "comp", + "in": "query", + "required": true, + "type": "string", + "enum": [ + "rename" + ] + } + ] + }, + "/{containerName}?restype=container&comp=batch": { + "post": { + "tags": [ + "container" + ], + "operationId": "Container_SubmitBatch", + "description": "The Batch operation allows multiple API calls to be embedded into a single HTTP request.", + "parameters": [ + { + "$ref": "#/parameters/Body" + }, + { + "$ref": "#/parameters/ContentLength" + }, + { + "$ref": "#/parameters/MultipartContentType" + }, + { + "$ref": "#/parameters/Timeout" + }, + { + "$ref": "#/parameters/ApiVersionParameter" + }, + { + "$ref": "#/parameters/ClientRequestId" + } + ], + "responses": { + "202": { + "description": "Success.", + "headers": { + "Content-Type": { + "type": "string", + "description": "The media type of the body of the response. For batch requests, this is multipart/mixed; boundary=batchresponse_GUID" + }, + "x-ms-request-id": { + "x-ms-client-name": "RequestId", + "type": "string", + "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." + }, + "x-ms-version": { + "x-ms-client-name": "Version", + "type": "string", + "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." + } + }, + "schema": { + "type": "object", + "format": "file" + } + }, + "default": { + "description": "Failure", + "headers": { + "x-ms-error-code": { + "x-ms-client-name": "ErrorCode", + "type": "string" + } + }, + "schema": { + "$ref": "#/definitions/StorageError" + } + } + } + }, + "parameters": [ + { + "$ref": "#/parameters/ContainerName" + }, + { + "name": "restype", + "description": "restype", + "in": "query", + "required": true, + "type": "string", + "enum": [ + "container" + ] + }, + { + "name": "comp", + "description": "comp", + "in": "query", + "required": true, + "type": "string", + "enum": [ + "batch" + ] + } + ] + }, + "/{containerName}?restype=container&comp=blobs": { + "get": { + "tags": [ + "container" + ], + "operationId": "Container_FilterBlobs", + "description": "The Filter Blobs operation enables callers to list blobs in a container whose tags match a given search expression. Filter blobs searches within the given container.", + "parameters": [ + { + "$ref": "#/parameters/Timeout" + }, + { + "$ref": "#/parameters/ApiVersionParameter" + }, + { + "$ref": "#/parameters/ClientRequestId" + }, + { + "$ref": "#/parameters/FilterBlobsWhere" + }, + { + "$ref": "#/parameters/Marker" + }, + { + "$ref": "#/parameters/MaxResults" + }, + { + "$ref": "#/parameters/FilterBlobsInclude" + } + ], + "responses": { + "200": { + "description": "Success", + "headers": { + "x-ms-client-request-id": { + "x-ms-client-name": "ClientRequestId", + "type": "string", + "description": "If a client request id header is sent in the request, this header will be present in the response with the same value." + }, + "x-ms-request-id": { + "x-ms-client-name": "RequestId", + "type": "string", + "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." + }, + "x-ms-version": { + "x-ms-client-name": "Version", + "type": "string", + "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." + }, + "Date": { + "type": "string", + "format": "date-time-rfc1123", + "description": "UTC date/time value generated by the service that indicates the time at which the response was initiated" + } + }, + "schema": { + "$ref": "#/definitions/FilterBlobSegment" + } + }, + "default": { + "description": "Failure", + "headers": { + "x-ms-error-code": { + "x-ms-client-name": "ErrorCode", + "type": "string" + } + }, + "schema": { + "$ref": "#/definitions/StorageError" + } + } + } + }, + "parameters": [ + { + "$ref": "#/parameters/ContainerName" + }, + { + "name": "restype", + "description": "restype", + "in": "query", + "required": true, + "type": "string", + "enum": [ + "container" + ] + }, + { + "name": "comp", + "description": "comp", + "in": "query", + "required": true, + "type": "string", + "enum": [ + "blobs" + ] + } + ] + }, + "/{containerName}?comp=lease&restype=container&acquire": { + "put": { + "tags": [ + "container" + ], + "operationId": "Container_AcquireLease", + "description": "[Update] establishes and manages a lock on a container for delete operations. The lock duration can be 15 to 60 seconds, or can be infinite", + "parameters": [ + { + "$ref": "#/parameters/Timeout" + }, + { + "$ref": "#/parameters/LeaseDuration" + }, + { + "$ref": "#/parameters/ProposedLeaseIdOptional" + }, + { + "$ref": "#/parameters/IfModifiedSince" + }, + { + "$ref": "#/parameters/IfUnmodifiedSince" + }, + { + "$ref": "#/parameters/ApiVersionParameter" + }, + { + "$ref": "#/parameters/ClientRequestId" + } + ], + "responses": { + "201": { + "description": "The Acquire operation completed successfully.", + "headers": { + "ETag": { + "type": "string", + "description": "The ETag contains a value that you can use to perform operations conditionally. If the request version is 2011-08-18 or newer, the ETag value will be in quotes." + }, + "Last-Modified": { + "type": "string", + "format": "date-time-rfc1123", + "description": "Returns the date and time the container was last modified. Any operation that modifies the blob, including an update of the blob's metadata or properties, changes the last-modified time of the blob." + }, + "x-ms-lease-id": { + "x-ms-client-name": "LeaseId", + "type": "string", + "description": "Uniquely identifies a container's lease" + }, + "x-ms-client-request-id": { + "x-ms-client-name": "ClientRequestId", + "type": "string", + "description": "If a client request id header is sent in the request, this header will be present in the response with the same value." + }, + "x-ms-request-id": { + "x-ms-client-name": "RequestId", + "type": "string", + "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." + }, + "x-ms-version": { + "x-ms-client-name": "Version", + "type": "string", + "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." + }, + "Date": { + "type": "string", + "format": "date-time-rfc1123", + "description": "UTC date/time value generated by the service that indicates the time at which the response was initiated" + } + } + }, + "default": { + "description": "Failure", + "headers": { + "x-ms-error-code": { + "x-ms-client-name": "ErrorCode", + "type": "string" + } + }, + "schema": { + "$ref": "#/definitions/StorageError" + } + } + } + }, + "parameters": [ + { + "$ref": "#/parameters/ContainerName" + }, + { + "name": "comp", + "description": "comp", + "in": "query", + "required": true, + "type": "string", + "enum": [ + "lease" + ] + }, + { + "name": "restype", + "description": "restype", + "in": "query", + "required": true, + "type": "string", + "enum": [ + "container" + ] + }, + { + "name": "x-ms-lease-action", + "x-ms-client-name": "action", + "in": "header", + "required": true, + "type": "string", + "enum": [ + "acquire" + ], + "x-ms-enum": { + "name": "LeaseAction", + "modelAsString": false + }, + "x-ms-parameter-location": "method", + "description": "Describes what lease action to take." + } + ] + }, + "/{containerName}?comp=lease&restype=container&release": { + "put": { + "tags": [ + "container" + ], + "operationId": "Container_ReleaseLease", + "description": "[Update] establishes and manages a lock on a container for delete operations. The lock duration can be 15 to 60 seconds, or can be infinite", + "parameters": [ + { + "$ref": "#/parameters/Timeout" + }, + { + "$ref": "#/parameters/LeaseIdRequired" + }, + { + "$ref": "#/parameters/IfModifiedSince" + }, + { + "$ref": "#/parameters/IfUnmodifiedSince" + }, + { + "$ref": "#/parameters/ApiVersionParameter" + }, + { + "$ref": "#/parameters/ClientRequestId" + } + ], + "responses": { + "200": { + "description": "The Release operation completed successfully.", + "headers": { + "ETag": { + "type": "string", + "description": "The ETag contains a value that you can use to perform operations conditionally. If the request version is 2011-08-18 or newer, the ETag value will be in quotes." + }, + "Last-Modified": { + "type": "string", + "format": "date-time-rfc1123", + "description": "Returns the date and time the container was last modified. Any operation that modifies the blob, including an update of the blob's metadata or properties, changes the last-modified time of the blob." + }, + "x-ms-client-request-id": { + "x-ms-client-name": "ClientRequestId", + "type": "string", + "description": "If a client request id header is sent in the request, this header will be present in the response with the same value." + }, + "x-ms-request-id": { + "x-ms-client-name": "RequestId", + "type": "string", + "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." + }, + "x-ms-version": { + "x-ms-client-name": "Version", + "type": "string", + "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." + }, + "Date": { + "type": "string", + "format": "date-time-rfc1123", + "description": "UTC date/time value generated by the service that indicates the time at which the response was initiated" + } + } + }, + "default": { + "description": "Failure", + "headers": { + "x-ms-error-code": { + "x-ms-client-name": "ErrorCode", + "type": "string" + } + }, + "schema": { + "$ref": "#/definitions/StorageError" + } + } + } + }, + "parameters": [ + { + "$ref": "#/parameters/ContainerName" + }, + { + "name": "comp", + "description": "comp", + "in": "query", + "required": true, + "type": "string", + "enum": [ + "lease" + ] + }, + { + "name": "restype", + "description": "restype", + "in": "query", + "required": true, + "type": "string", + "enum": [ + "container" + ] + }, + { + "name": "x-ms-lease-action", + "x-ms-client-name": "action", + "in": "header", + "required": true, + "type": "string", + "enum": [ + "release" + ], + "x-ms-enum": { + "name": "LeaseAction", + "modelAsString": false + }, + "x-ms-parameter-location": "method", + "description": "Describes what lease action to take." + } + ] + }, + "/{containerName}?comp=lease&restype=container&renew": { + "put": { + "tags": [ + "container" + ], + "operationId": "Container_RenewLease", + "description": "[Update] establishes and manages a lock on a container for delete operations. The lock duration can be 15 to 60 seconds, or can be infinite", + "parameters": [ + { + "$ref": "#/parameters/Timeout" + }, + { + "$ref": "#/parameters/LeaseIdRequired" + }, + { + "$ref": "#/parameters/IfModifiedSince" + }, + { + "$ref": "#/parameters/IfUnmodifiedSince" + }, + { + "$ref": "#/parameters/ApiVersionParameter" + }, + { + "$ref": "#/parameters/ClientRequestId" + } + ], + "responses": { + "200": { + "description": "The Renew operation completed successfully.", + "headers": { + "ETag": { + "type": "string", + "description": "The ETag contains a value that you can use to perform operations conditionally. If the request version is 2011-08-18 or newer, the ETag value will be in quotes." + }, + "Last-Modified": { + "type": "string", + "format": "date-time-rfc1123", + "description": "Returns the date and time the container was last modified. Any operation that modifies the blob, including an update of the blob's metadata or properties, changes the last-modified time of the blob." + }, + "x-ms-lease-id": { + "x-ms-client-name": "LeaseId", + "type": "string", + "description": "Uniquely identifies a container's lease" + }, + "x-ms-client-request-id": { + "x-ms-client-name": "ClientRequestId", + "type": "string", + "description": "If a client request id header is sent in the request, this header will be present in the response with the same value." + }, + "x-ms-request-id": { + "x-ms-client-name": "RequestId", + "type": "string", + "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." + }, + "x-ms-version": { + "x-ms-client-name": "Version", + "type": "string", + "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." + }, + "Date": { + "type": "string", + "format": "date-time-rfc1123", + "description": "UTC date/time value generated by the service that indicates the time at which the response was initiated" + } + } + }, + "default": { + "description": "Failure", + "headers": { + "x-ms-error-code": { + "x-ms-client-name": "ErrorCode", + "type": "string" + } + }, + "schema": { + "$ref": "#/definitions/StorageError" + } + } + } + }, + "parameters": [ + { + "$ref": "#/parameters/ContainerName" + }, + { + "name": "comp", + "description": "comp", + "in": "query", + "required": true, + "type": "string", + "enum": [ + "lease" + ] + }, + { + "name": "restype", + "description": "restype", + "in": "query", + "required": true, + "type": "string", + "enum": [ + "container" + ] + }, + { + "name": "x-ms-lease-action", + "x-ms-client-name": "action", + "in": "header", + "required": true, + "type": "string", + "enum": [ + "renew" + ], + "x-ms-enum": { + "name": "LeaseAction", + "modelAsString": false + }, + "x-ms-parameter-location": "method", + "description": "Describes what lease action to take." + } + ] + }, + "/{containerName}?comp=lease&restype=container&break": { + "put": { + "tags": [ + "container" + ], + "operationId": "Container_BreakLease", + "description": "[Update] establishes and manages a lock on a container for delete operations. The lock duration can be 15 to 60 seconds, or can be infinite", + "parameters": [ + { + "$ref": "#/parameters/Timeout" + }, + { + "$ref": "#/parameters/LeaseBreakPeriod" + }, + { + "$ref": "#/parameters/IfModifiedSince" + }, + { + "$ref": "#/parameters/IfUnmodifiedSince" + }, + { + "$ref": "#/parameters/ApiVersionParameter" + }, + { + "$ref": "#/parameters/ClientRequestId" + } + ], + "responses": { + "202": { + "description": "The Break operation completed successfully.", + "headers": { + "ETag": { + "type": "string", + "description": "The ETag contains a value that you can use to perform operations conditionally. If the request version is 2011-08-18 or newer, the ETag value will be in quotes." + }, + "Last-Modified": { + "type": "string", + "format": "date-time-rfc1123", + "description": "Returns the date and time the container was last modified. Any operation that modifies the blob, including an update of the blob's metadata or properties, changes the last-modified time of the blob." + }, + "x-ms-lease-time": { + "x-ms-client-name": "LeaseTime", + "type": "integer", + "description": "Approximate time remaining in the lease period, in seconds." + }, + "x-ms-client-request-id": { + "x-ms-client-name": "ClientRequestId", + "type": "string", + "description": "If a client request id header is sent in the request, this header will be present in the response with the same value." + }, + "x-ms-request-id": { + "x-ms-client-name": "RequestId", + "type": "string", + "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." + }, + "x-ms-version": { + "x-ms-client-name": "Version", + "type": "string", + "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." + }, + "Date": { + "type": "string", + "format": "date-time-rfc1123", + "description": "UTC date/time value generated by the service that indicates the time at which the response was initiated" + } + } + }, + "default": { + "description": "Failure", + "headers": { + "x-ms-error-code": { + "x-ms-client-name": "ErrorCode", + "type": "string" + } + }, + "schema": { + "$ref": "#/definitions/StorageError" + } + } + } + }, + "parameters": [ + { + "$ref": "#/parameters/ContainerName" + }, + { + "name": "comp", + "description": "comp", + "in": "query", + "required": true, + "type": "string", + "enum": [ + "lease" + ] + }, + { + "name": "restype", + "description": "restype", + "in": "query", + "required": true, + "type": "string", + "enum": [ + "container" + ] + }, + { + "name": "x-ms-lease-action", + "x-ms-client-name": "action", + "in": "header", + "required": true, + "type": "string", + "enum": [ + "break" + ], + "x-ms-enum": { + "name": "LeaseAction", + "modelAsString": false + }, + "x-ms-parameter-location": "method", + "description": "Describes what lease action to take." + } + ] + }, + "/{containerName}?comp=lease&restype=container&change": { + "put": { + "tags": [ + "container" + ], + "operationId": "Container_ChangeLease", + "description": "[Update] establishes and manages a lock on a container for delete operations. The lock duration can be 15 to 60 seconds, or can be infinite", + "parameters": [ + { + "$ref": "#/parameters/Timeout" + }, + { + "$ref": "#/parameters/LeaseIdRequired" + }, + { + "$ref": "#/parameters/ProposedLeaseIdRequired" + }, + { + "$ref": "#/parameters/IfModifiedSince" + }, + { + "$ref": "#/parameters/IfUnmodifiedSince" + }, + { + "$ref": "#/parameters/ApiVersionParameter" + }, + { + "$ref": "#/parameters/ClientRequestId" + } + ], + "responses": { + "200": { + "description": "The Change operation completed successfully.", + "headers": { + "ETag": { + "type": "string", + "description": "The ETag contains a value that you can use to perform operations conditionally. If the request version is 2011-08-18 or newer, the ETag value will be in quotes." + }, + "Last-Modified": { + "type": "string", + "format": "date-time-rfc1123", + "description": "Returns the date and time the container was last modified. Any operation that modifies the blob, including an update of the blob's metadata or properties, changes the last-modified time of the blob." + }, + "x-ms-lease-id": { + "x-ms-client-name": "LeaseId", + "type": "string", + "description": "Uniquely identifies a container's lease" + }, + "x-ms-client-request-id": { + "x-ms-client-name": "ClientRequestId", + "type": "string", + "description": "If a client request id header is sent in the request, this header will be present in the response with the same value." + }, + "x-ms-request-id": { + "x-ms-client-name": "RequestId", + "type": "string", + "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." + }, + "x-ms-version": { + "x-ms-client-name": "Version", + "type": "string", + "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." + }, + "Date": { + "type": "string", + "format": "date-time-rfc1123", + "description": "UTC date/time value generated by the service that indicates the time at which the response was initiated" + } + } + }, + "default": { + "description": "Failure", + "headers": { + "x-ms-error-code": { + "x-ms-client-name": "ErrorCode", + "type": "string" + } + }, + "schema": { + "$ref": "#/definitions/StorageError" + } + } + } + }, + "parameters": [ + { + "$ref": "#/parameters/ContainerName" + }, + { + "name": "comp", + "description": "comp", + "in": "query", + "required": true, + "type": "string", + "enum": [ + "lease" + ] + }, + { + "name": "restype", + "description": "restype", + "in": "query", + "required": true, + "type": "string", + "enum": [ + "container" + ] + }, + { + "name": "x-ms-lease-action", + "x-ms-client-name": "action", + "in": "header", + "required": true, + "type": "string", + "enum": [ + "change" + ], + "x-ms-enum": { + "name": "LeaseAction", + "modelAsString": false + }, + "x-ms-parameter-location": "method", + "description": "Describes what lease action to take." + } + ] + }, + "/{containerName}?restype=container&comp=list&flat": { + "get": { + "tags": [ + "containers" + ], + "operationId": "Container_ListBlobFlatSegment", + "description": "[Update] The List Blobs operation returns a list of the blobs under the specified container", + "parameters": [ + { + "$ref": "#/parameters/Prefix" + }, + { + "$ref": "#/parameters/Marker" + }, + { + "$ref": "#/parameters/MaxResults" + }, + { + "$ref": "#/parameters/ListBlobsInclude" + }, + { + "$ref": "#/parameters/Timeout" + }, + { + "$ref": "#/parameters/ApiVersionParameter" + }, + { + "$ref": "#/parameters/ClientRequestId" + } + ], + "responses": { + "200": { + "description": "Success.", + "headers": { + "Content-Type": { + "type": "string", + "description": "The media type of the body of the response. For List Blobs this is 'application/xml'" + }, + "x-ms-client-request-id": { + "x-ms-client-name": "ClientRequestId", + "type": "string", + "description": "If a client request id header is sent in the request, this header will be present in the response with the same value." + }, + "x-ms-request-id": { + "x-ms-client-name": "RequestId", + "type": "string", + "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." + }, + "x-ms-version": { + "x-ms-client-name": "Version", + "type": "string", + "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." + }, + "Date": { + "type": "string", + "format": "date-time-rfc1123", + "description": "UTC date/time value generated by the service that indicates the time at which the response was initiated" + } + }, + "schema": { + "$ref": "#/definitions/ListBlobsFlatSegmentResponse" + } + }, + "default": { + "description": "Failure", + "headers": { + "x-ms-error-code": { + "x-ms-client-name": "ErrorCode", + "type": "string" + } + }, + "schema": { + "$ref": "#/definitions/StorageError" + } + } + }, + "x-ms-pageable": { + "nextLinkName": "NextMarker" + } + }, + "parameters": [ + { + "$ref": "#/parameters/ContainerName" + }, + { + "name": "restype", + "description": "restype", + "in": "query", + "required": true, + "type": "string", + "enum": [ + "container" + ] + }, + { + "name": "comp", + "description": "comp", + "in": "query", + "required": true, + "type": "string", + "enum": [ + "list" + ] + } + ] + }, + "/{containerName}?restype=container&comp=list&hierarchy": { + "get": { + "tags": [ + "containers" + ], + "operationId": "Container_ListBlobHierarchySegment", + "description": "[Update] The List Blobs operation returns a list of the blobs under the specified container", + "parameters": [ + { + "$ref": "#/parameters/Prefix" + }, + { + "$ref": "#/parameters/Delimiter" + }, + { + "$ref": "#/parameters/Marker" + }, + { + "$ref": "#/parameters/MaxResults" + }, + { + "$ref": "#/parameters/ListBlobsInclude" + }, + { + "$ref": "#/parameters/Timeout" + }, + { + "$ref": "#/parameters/ApiVersionParameter" + }, + { + "$ref": "#/parameters/ClientRequestId" + } + ], + "responses": { + "200": { + "description": "Success.", + "headers": { + "Content-Type": { + "type": "string", + "description": "The media type of the body of the response. For List Blobs this is 'application/xml'" + }, + "x-ms-client-request-id": { + "x-ms-client-name": "ClientRequestId", + "type": "string", + "description": "If a client request id header is sent in the request, this header will be present in the response with the same value." + }, + "x-ms-request-id": { + "x-ms-client-name": "RequestId", + "type": "string", + "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." + }, + "x-ms-version": { + "x-ms-client-name": "Version", + "type": "string", + "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." + }, + "Date": { + "type": "string", + "format": "date-time-rfc1123", + "description": "UTC date/time value generated by the service that indicates the time at which the response was initiated" + } + }, + "schema": { + "$ref": "#/definitions/ListBlobsHierarchySegmentResponse" + } + }, + "default": { + "description": "Failure", + "headers": { + "x-ms-error-code": { + "x-ms-client-name": "ErrorCode", + "type": "string" + } + }, + "schema": { + "$ref": "#/definitions/StorageError" + } + } + }, + "x-ms-pageable": { + "nextLinkName": "NextMarker" + } + }, + "parameters": [ + { + "$ref": "#/parameters/ContainerName" + }, + { + "name": "restype", + "description": "restype", + "in": "query", + "required": true, + "type": "string", + "enum": [ + "container" + ] + }, + { + "name": "comp", + "description": "comp", + "in": "query", + "required": true, + "type": "string", + "enum": [ + "list" + ] + } + ] + }, + "/{containerName}?restype=account&comp=properties": { + "get": { + "tags": [ + "container" + ], + "operationId": "Container_GetAccountInfo", + "description": "Returns the sku name and account kind ", + "parameters": [ + { + "$ref": "#/parameters/ApiVersionParameter" + } + ], + "responses": { + "200": { + "description": "Success (OK)", + "headers": { + "x-ms-client-request-id": { + "x-ms-client-name": "ClientRequestId", + "type": "string", + "description": "If a client request id header is sent in the request, this header will be present in the response with the same value." + }, + "x-ms-request-id": { + "x-ms-client-name": "RequestId", + "type": "string", + "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." + }, + "x-ms-version": { + "x-ms-client-name": "Version", + "type": "string", + "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." + }, + "Date": { + "type": "string", + "format": "date-time-rfc1123", + "description": "UTC date/time value generated by the service that indicates the time at which the response was initiated" + }, + "x-ms-sku-name": { + "x-ms-client-name": "SkuName", + "type": "string", + "enum": [ + "Standard_LRS", + "Standard_GRS", + "Standard_RAGRS", + "Standard_ZRS", + "Premium_LRS" + ], + "x-ms-enum": { + "name": "SkuName", + "modelAsString": false + }, + "description": "Identifies the sku name of the account" + }, + "x-ms-account-kind": { + "x-ms-client-name": "AccountKind", + "type": "string", + "enum": [ + "Storage", + "BlobStorage", + "StorageV2", + "FileStorage", + "BlockBlobStorage" + ], + "x-ms-enum": { + "name": "AccountKind", + "modelAsString": false + }, + "description": "Identifies the account kind" + } + } + }, + "default": { + "description": "Failure", + "headers": { + "x-ms-error-code": { + "x-ms-client-name": "ErrorCode", + "type": "string" + } + }, + "schema": { + "$ref": "#/definitions/StorageError" + } + } + } + }, + "head": { + "tags": [ + "container" + ], + "operationId": "Container_GetAccountInfoWithHead", + "description": "Returns the sku name and account kind ", + "parameters": [ + { + "$ref": "#/parameters/ApiVersionParameter" + } + ], + "responses": { + "200": { + "description": "Success (OK)", + "headers": { + "x-ms-client-request-id": { + "x-ms-client-name": "ClientRequestId", + "type": "string", + "description": "If a client request id header is sent in the request, this header will be present in the response with the same value." + }, + "x-ms-request-id": { + "x-ms-client-name": "RequestId", + "type": "string", + "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." + }, + "x-ms-version": { + "x-ms-client-name": "Version", + "type": "string", + "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." + }, + "Date": { + "type": "string", + "format": "date-time-rfc1123", + "description": "UTC date/time value generated by the service that indicates the time at which the response was initiated" + }, + "x-ms-sku-name": { + "x-ms-client-name": "SkuName", + "type": "string", + "enum": [ + "Standard_LRS", + "Standard_GRS", + "Standard_RAGRS", + "Standard_ZRS", + "Premium_LRS" + ], + "x-ms-enum": { + "name": "SkuName", + "modelAsString": false + }, + "description": "Identifies the sku name of the account" + }, + "x-ms-account-kind": { + "x-ms-client-name": "AccountKind", + "type": "string", + "enum": [ + "Storage", + "BlobStorage", + "StorageV2", + "FileStorage", + "BlockBlobStorage" + ], + "x-ms-enum": { + "name": "AccountKind", + "modelAsString": false + }, + "description": "Identifies the account kind" + } + } + }, + "default": { + "description": "Failure", + "headers": { + "x-ms-error-code": { + "x-ms-client-name": "ErrorCode", + "type": "string" + } + }, + "schema": { + "$ref": "#/definitions/StorageError" + } + } + } + }, + "parameters": [ + { + "$ref": "#/parameters/ContainerName" + }, + { + "name": "restype", + "description": "restype", + "in": "query", + "required": true, + "type": "string", + "enum": [ + "account" + ] + }, + { + "name": "comp", + "description": "comp", + "in": "query", + "required": true, + "type": "string", + "enum": [ + "properties" + ] + } + ] + }, + "/{containerName}/{blob}": { + "get": { + "tags": [ + "blob" + ], + "operationId": "Blob_Download", + "description": "The Download operation reads or downloads a blob from the system, including its metadata and properties. You can also call Download to read a snapshot.", + "parameters": [ + { + "$ref": "#/parameters/Snapshot" + }, + { + "$ref": "#/parameters/VersionId" + }, + { + "$ref": "#/parameters/Timeout" + }, + { + "$ref": "#/parameters/Range" + }, + { + "$ref": "#/parameters/LeaseIdOptional" + }, + { + "$ref": "#/parameters/GetRangeContentMD5" + }, + { + "$ref": "#/parameters/GetRangeContentCRC64" + }, + { + "$ref": "#/parameters/EncryptionKey" + }, + { + "$ref": "#/parameters/EncryptionKeySha256" + }, + { + "$ref": "#/parameters/EncryptionAlgorithm" + }, + { + "$ref": "#/parameters/IfModifiedSince" + }, + { + "$ref": "#/parameters/IfUnmodifiedSince" + }, + { + "$ref": "#/parameters/IfMatch" + }, + { + "$ref": "#/parameters/IfNoneMatch" + }, + { + "$ref": "#/parameters/IfTags" + }, + { + "$ref": "#/parameters/ApiVersionParameter" + }, + { + "$ref": "#/parameters/ClientRequestId" + } + ], + "responses": { + "200": { + "description": "Returns the content of the entire blob.", + "headers": { + "Last-Modified": { + "type": "string", + "format": "date-time-rfc1123", + "description": "Returns the date and time the container was last modified. Any operation that modifies the blob, including an update of the blob's metadata or properties, changes the last-modified time of the blob." + }, + "x-ms-meta": { + "type": "string", + "x-ms-client-name": "Metadata", + "x-ms-header-collection-prefix": "x-ms-meta-" + }, + "x-ms-creation-time": { + "x-ms-client-name": "CreationTime", + "type": "string", + "format": "date-time-rfc1123", + "description": "Returns the date and time the blob was created." + }, + "x-ms-or-policy-id": { + "x-ms-client-name": "ObjectReplicationPolicyId", + "type": "string", + "description": "Optional. Only valid when Object Replication is enabled for the storage container and on the destination blob of the replication." + }, + "x-ms-or": { + "type": "string", + "x-ms-client-name": "ObjectReplicationRules", + "x-ms-header-collection-prefix": "x-ms-or-", + "description": "Optional. Only valid when Object Replication is enabled for the storage container and on the source blob of the replication. When retrieving this header, it will return the header with the policy id and rule id (e.g. x-ms-or-policyid_ruleid), and the value will be the status of the replication (e.g. complete, failed)." + }, + "Content-Length": { + "type": "integer", + "format": "int64", + "description": "The number of bytes present in the response body." + }, + "Content-Type": { + "type": "string", + "description": "The media type of the body of the response. For Download Blob this is 'application/octet-stream'" + }, + "Content-Range": { + "type": "string", + "description": "Indicates the range of bytes returned in the event that the client requested a subset of the blob by setting the 'Range' request header." + }, + "ETag": { + "type": "string", + "description": "The ETag contains a value that you can use to perform operations conditionally. If the request version is 2011-08-18 or newer, the ETag value will be in quotes." + }, + "Content-MD5": { + "type": "string", + "format": "byte", + "description": "If the blob has an MD5 hash and this operation is to read the full blob, this response header is returned so that the client can check for message content integrity." + }, + "Content-Encoding": { + "type": "string", + "description": "This header returns the value that was specified for the Content-Encoding request header" + }, + "Cache-Control": { + "type": "string", + "description": "This header is returned if it was previously specified for the blob." + }, + "Content-Disposition": { + "type": "string", + "description": "This header returns the value that was specified for the 'x-ms-blob-content-disposition' header. The Content-Disposition response header field conveys additional information about how to process the response payload, and also can be used to attach additional metadata. For example, if set to attachment, it indicates that the user-agent should not display the response, but instead show a Save As dialog with a filename other than the blob name specified." + }, + "Content-Language": { + "type": "string", + "description": "This header returns the value that was specified for the Content-Language request header." + }, + "x-ms-blob-sequence-number": { + "x-ms-client-name": "BlobSequenceNumber", + "type": "integer", + "format": "int64", + "description": "The current sequence number for a page blob. This header is not returned for block blobs or append blobs" + }, + "x-ms-blob-type": { + "x-ms-client-name": "BlobType", + "description": "The blob's type.", + "type": "string", + "enum": [ + "BlockBlob", + "PageBlob", + "AppendBlob" + ], + "x-ms-enum": { + "name": "BlobType", + "modelAsString": false + } + }, + "x-ms-copy-completion-time": { + "x-ms-client-name": "CopyCompletionTime", + "type": "string", + "format": "date-time-rfc1123", + "description": "Conclusion time of the last attempted Copy Blob operation where this blob was the destination blob. This value can specify the time of a completed, aborted, or failed copy attempt. This header does not appear if a copy is pending, if this blob has never been the destination in a Copy Blob operation, or if this blob has been modified after a concluded Copy Blob operation using Set Blob Properties, Put Blob, or Put Block List." + }, + "x-ms-copy-status-description": { + "x-ms-client-name": "CopyStatusDescription", + "type": "string", + "description": "Only appears when x-ms-copy-status is failed or pending. Describes the cause of the last fatal or non-fatal copy operation failure. This header does not appear if this blob has never been the destination in a Copy Blob operation, or if this blob has been modified after a concluded Copy Blob operation using Set Blob Properties, Put Blob, or Put Block List" + }, + "x-ms-copy-id": { + "x-ms-client-name": "CopyId", + "type": "string", + "description": "String identifier for this copy operation. Use with Get Blob Properties to check the status of this copy operation, or pass to Abort Copy Blob to abort a pending copy." + }, + "x-ms-copy-progress": { + "x-ms-client-name": "CopyProgress", + "type": "string", + "description": "Contains the number of bytes copied and the total bytes in the source in the last attempted Copy Blob operation where this blob was the destination blob. Can show between 0 and Content-Length bytes copied. This header does not appear if this blob has never been the destination in a Copy Blob operation, or if this blob has been modified after a concluded Copy Blob operation using Set Blob Properties, Put Blob, or Put Block List" + }, + "x-ms-copy-source": { + "x-ms-client-name": "CopySource", + "type": "string", + "description": "URL up to 2 KB in length that specifies the source blob or file used in the last attempted Copy Blob operation where this blob was the destination blob. This header does not appear if this blob has never been the destination in a Copy Blob operation, or if this blob has been modified after a concluded Copy Blob operation using Set Blob Properties, Put Blob, or Put Block List." + }, + "x-ms-copy-status": { + "x-ms-client-name": "CopyStatus", + "description": "State of the copy operation identified by x-ms-copy-id.", + "type": "string", + "enum": [ + "pending", + "success", + "aborted", + "failed" + ], + "x-ms-enum": { + "name": "CopyStatusType", + "modelAsString": false + } + }, + "x-ms-lease-duration": { + "x-ms-client-name": "LeaseDuration", + "description": "When a blob is leased, specifies whether the lease is of infinite or fixed duration.", + "type": "string", + "enum": [ + "infinite", + "fixed" + ], + "x-ms-enum": { + "name": "LeaseDurationType", + "modelAsString": false + } + }, + "x-ms-lease-state": { + "x-ms-client-name": "LeaseState", + "description": "Lease state of the blob.", + "type": "string", + "enum": [ + "available", + "leased", + "expired", + "breaking", + "broken" + ], + "x-ms-enum": { + "name": "LeaseStateType", + "modelAsString": false + } + }, + "x-ms-lease-status": { + "x-ms-client-name": "LeaseStatus", + "description": "The current lease status of the blob.", + "type": "string", + "enum": [ + "locked", + "unlocked" + ], + "x-ms-enum": { + "name": "LeaseStatusType", + "modelAsString": false + } + }, + "x-ms-client-request-id": { + "x-ms-client-name": "ClientRequestId", + "type": "string", + "description": "If a client request id header is sent in the request, this header will be present in the response with the same value." + }, + "x-ms-request-id": { + "x-ms-client-name": "RequestId", + "type": "string", + "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." + }, + "x-ms-version": { + "x-ms-client-name": "Version", + "type": "string", + "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." + }, + "x-ms-version-id": { + "x-ms-client-name": "VersionId", + "type": "string", + "description": "A DateTime value returned by the service that uniquely identifies the blob. The value of this header indicates the blob version, and may be used in subsequent requests to access this version of the blob." + }, + "x-ms-is-current-version": { + "x-ms-client-name": "IsCurrentVersion", + "type": "boolean", + "description": "The value of this header indicates whether version of this blob is a current version, see also x-ms-version-id header." + }, + "Accept-Ranges": { + "type": "string", + "description": "Indicates that the service supports requests for partial blob content." + }, + "Date": { + "type": "string", + "format": "date-time-rfc1123", + "description": "UTC date/time value generated by the service that indicates the time at which the response was initiated" + }, + "x-ms-blob-committed-block-count": { + "x-ms-client-name": "BlobCommittedBlockCount", + "type": "integer", + "description": "The number of committed blocks present in the blob. This header is returned only for append blobs." + }, + "x-ms-server-encrypted": { + "x-ms-client-name": "IsServerEncrypted", + "type": "boolean", + "description": "The value of this header is set to true if the blob data and application metadata are completely encrypted using the specified algorithm. Otherwise, the value is set to false (when the blob is unencrypted, or if only parts of the blob/application metadata are encrypted)." + }, + "x-ms-encryption-key-sha256": { + "x-ms-client-name": "EncryptionKeySha256", + "type": "string", + "description": "The SHA-256 hash of the encryption key used to encrypt the blob. This header is only returned when the blob was encrypted with a customer-provided key." + }, + "x-ms-encryption-scope": { + "x-ms-client-name": "EncryptionScope", + "type": "string", + "description": "Returns the name of the encryption scope used to encrypt the blob contents and application metadata. Note that the absence of this header implies use of the default account encryption scope." + }, + "x-ms-blob-content-md5": { + "x-ms-client-name": "BlobContentMD5", + "type": "string", + "format": "byte", + "description": "If the blob has a MD5 hash, and if request contains range header (Range or x-ms-range), this response header is returned with the value of the whole blob's MD5 value. This value may or may not be equal to the value returned in Content-MD5 header, with the latter calculated from the requested range" + }, + "x-ms-tag-count": { + "x-ms-client-name": "TagCount", + "type": "integer", + "format": "int64", + "description": "The number of tags associated with the blob" + }, + "x-ms-blob-sealed": { + "x-ms-client-name": "IsSealed", + "type": "boolean", + "description": "If this blob has been sealed" + }, + "x-ms-last-access-time": { + "x-ms-client-name": "LastAccessed", + "type": "string", + "format": "date-time-rfc1123", + "description": "UTC date/time value generated by the service that indicates the time at which the blob was last read or written to" + }, + "x-ms-immutability-policy-until-date": { + "x-ms-client-name": "ImmutabilityPolicyExpiresOn", + "type": "string", + "format": "date-time-rfc1123", + "description": "UTC date/time value generated by the service that indicates the time at which the blob immutability policy will expire." + }, + "x-ms-immutability-policy-mode": { + "x-ms-client-name": "ImmutabilityPolicyMode", + "type": "string", + "enum": [ + "Mutable", + "Unlocked", + "Locked" + ], + "x-ms-enum": { + "name": "BlobImmutabilityPolicyMode", + "modelAsString": false + }, + "description": "Indicates immutability policy mode." + }, + "x-ms-legal-hold": { + "x-ms-client-name": "LegalHold", + "type": "boolean", + "description": "Indicates if a legal hold is present on the blob." + } + }, + "schema": { + "type": "object", + "format": "file" + } + }, + "206": { + "description": "Returns the content of a specified range of the blob.", + "headers": { + "Last-Modified": { + "type": "string", + "format": "date-time-rfc1123", + "description": "Returns the date and time the container was last modified. Any operation that modifies the blob, including an update of the blob's metadata or properties, changes the last-modified time of the blob." + }, + "x-ms-meta": { + "type": "string", + "x-ms-client-name": "Metadata", + "x-ms-header-collection-prefix": "x-ms-meta-" + }, + "x-ms-or-policy-id": { + "x-ms-client-name": "ObjectReplicationPolicyId", + "type": "string", + "description": "Optional. Only valid when Object Replication is enabled for the storage container and on the destination blob of the replication." + }, + "x-ms-or": { + "type": "string", + "x-ms-client-name": "ObjectReplicationRules", + "x-ms-header-collection-prefix": "x-ms-or-", + "description": "Optional. Only valid when Object Replication is enabled for the storage container and on the source blob of the replication. When retrieving this header, it will return the header with the policy id and rule id (e.g. x-ms-or-policyid_ruleid), and the value will be the status of the replication (e.g. complete, failed)." + }, + "Content-Length": { + "type": "integer", + "format": "int64", + "description": "The number of bytes present in the response body." + }, + "Content-Type": { + "type": "string", + "description": "The media type of the body of the response. For Download Blob this is 'application/octet-stream'" + }, + "Content-Range": { + "type": "string", + "description": "Indicates the range of bytes returned in the event that the client requested a subset of the blob by setting the 'Range' request header." + }, + "ETag": { + "type": "string", + "description": "The ETag contains a value that you can use to perform operations conditionally. If the request version is 2011-08-18 or newer, the ETag value will be in quotes." + }, + "Content-MD5": { + "type": "string", + "format": "byte", + "description": "If the blob has an MD5 hash and this operation is to read the full blob, this response header is returned so that the client can check for message content integrity." + }, + "Content-Encoding": { + "type": "string", + "description": "This header returns the value that was specified for the Content-Encoding request header" + }, + "Cache-Control": { + "type": "string", + "description": "This header is returned if it was previously specified for the blob." + }, + "Content-Disposition": { + "type": "string", + "description": "This header returns the value that was specified for the 'x-ms-blob-content-disposition' header. The Content-Disposition response header field conveys additional information about how to process the response payload, and also can be used to attach additional metadata. For example, if set to attachment, it indicates that the user-agent should not display the response, but instead show a Save As dialog with a filename other than the blob name specified." + }, + "Content-Language": { + "type": "string", + "description": "This header returns the value that was specified for the Content-Language request header." + }, + "x-ms-blob-sequence-number": { + "x-ms-client-name": "BlobSequenceNumber", + "type": "integer", + "format": "int64", + "description": "The current sequence number for a page blob. This header is not returned for block blobs or append blobs" + }, + "x-ms-blob-type": { + "x-ms-client-name": "BlobType", + "description": "The blob's type.", + "type": "string", + "enum": [ + "BlockBlob", + "PageBlob", + "AppendBlob" + ], + "x-ms-enum": { + "name": "BlobType", + "modelAsString": false + } + }, + "x-ms-content-crc64": { + "x-ms-client-name": "ContentCrc64", + "type": "string", + "format": "byte", + "description": "If the request is to read a specified range and the x-ms-range-get-content-crc64 is set to true, then the request returns a crc64 for the range, as long as the range size is less than or equal to 4 MB. If both x-ms-range-get-content-crc64 & x-ms-range-get-content-md5 is specified in the same request, it will fail with 400(Bad Request)" + }, + "x-ms-copy-completion-time": { + "x-ms-client-name": "CopyCompletionTime", + "type": "string", + "format": "date-time-rfc1123", + "description": "Conclusion time of the last attempted Copy Blob operation where this blob was the destination blob. This value can specify the time of a completed, aborted, or failed copy attempt. This header does not appear if a copy is pending, if this blob has never been the destination in a Copy Blob operation, or if this blob has been modified after a concluded Copy Blob operation using Set Blob Properties, Put Blob, or Put Block List." + }, + "x-ms-copy-status-description": { + "x-ms-client-name": "CopyStatusDescription", + "type": "string", + "description": "Only appears when x-ms-copy-status is failed or pending. Describes the cause of the last fatal or non-fatal copy operation failure. This header does not appear if this blob has never been the destination in a Copy Blob operation, or if this blob has been modified after a concluded Copy Blob operation using Set Blob Properties, Put Blob, or Put Block List" + }, + "x-ms-copy-id": { + "x-ms-client-name": "CopyId", + "type": "string", + "description": "String identifier for this copy operation. Use with Get Blob Properties to check the status of this copy operation, or pass to Abort Copy Blob to abort a pending copy." + }, + "x-ms-copy-progress": { + "x-ms-client-name": "CopyProgress", + "type": "string", + "description": "Contains the number of bytes copied and the total bytes in the source in the last attempted Copy Blob operation where this blob was the destination blob. Can show between 0 and Content-Length bytes copied. This header does not appear if this blob has never been the destination in a Copy Blob operation, or if this blob has been modified after a concluded Copy Blob operation using Set Blob Properties, Put Blob, or Put Block List" + }, + "x-ms-copy-source": { + "x-ms-client-name": "CopySource", + "type": "string", + "description": "URL up to 2 KB in length that specifies the source blob or file used in the last attempted Copy Blob operation where this blob was the destination blob. This header does not appear if this blob has never been the destination in a Copy Blob operation, or if this blob has been modified after a concluded Copy Blob operation using Set Blob Properties, Put Blob, or Put Block List." + }, + "x-ms-copy-status": { + "x-ms-client-name": "CopyStatus", + "description": "State of the copy operation identified by x-ms-copy-id.", + "type": "string", + "enum": [ + "pending", + "success", + "aborted", + "failed" + ], + "x-ms-enum": { + "name": "CopyStatusType", + "modelAsString": false + } + }, + "x-ms-lease-duration": { + "x-ms-client-name": "LeaseDuration", + "description": "When a blob is leased, specifies whether the lease is of infinite or fixed duration.", + "type": "string", + "enum": [ + "infinite", + "fixed" + ], + "x-ms-enum": { + "name": "LeaseDurationType", + "modelAsString": false + } + }, + "x-ms-lease-state": { + "x-ms-client-name": "LeaseState", + "description": "Lease state of the blob.", + "type": "string", + "enum": [ + "available", + "leased", + "expired", + "breaking", + "broken" + ], + "x-ms-enum": { + "name": "LeaseStateType", + "modelAsString": false + } + }, + "x-ms-lease-status": { + "x-ms-client-name": "LeaseStatus", + "description": "The current lease status of the blob.", + "type": "string", + "enum": [ + "locked", + "unlocked" + ], + "x-ms-enum": { + "name": "LeaseStatusType", + "modelAsString": false + } + }, + "x-ms-client-request-id": { + "x-ms-client-name": "ClientRequestId", + "type": "string", + "description": "If a client request id header is sent in the request, this header will be present in the response with the same value." + }, + "x-ms-request-id": { + "x-ms-client-name": "RequestId", + "type": "string", + "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." + }, + "x-ms-version": { + "x-ms-client-name": "Version", + "type": "string", + "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." + }, + "x-ms-version-id": { + "x-ms-client-name": "VersionId", + "type": "string", + "description": "A DateTime value returned by the service that uniquely identifies the blob. The value of this header indicates the blob version, and may be used in subsequent requests to access this version of the blob." + }, + "x-ms-is-current-version": { + "x-ms-client-name": "IsCurrentVersion", + "type": "boolean", + "description": "The value of this header indicates whether version of this blob is a current version, see also x-ms-version-id header." + }, + "Accept-Ranges": { + "type": "string", + "description": "Indicates that the service supports requests for partial blob content." + }, + "Date": { + "type": "string", + "format": "date-time-rfc1123", + "description": "UTC date/time value generated by the service that indicates the time at which the response was initiated" + }, + "x-ms-blob-committed-block-count": { + "x-ms-client-name": "BlobCommittedBlockCount", + "type": "integer", + "description": "The number of committed blocks present in the blob. This header is returned only for append blobs." + }, + "x-ms-server-encrypted": { + "x-ms-client-name": "IsServerEncrypted", + "type": "boolean", + "description": "The value of this header is set to true if the blob data and application metadata are completely encrypted using the specified algorithm. Otherwise, the value is set to false (when the blob is unencrypted, or if only parts of the blob/application metadata are encrypted)." + }, + "x-ms-encryption-key-sha256": { + "x-ms-client-name": "EncryptionKeySha256", + "type": "string", + "description": "The SHA-256 hash of the encryption key used to encrypt the blob. This header is only returned when the blob was encrypted with a customer-provided key." + }, + "x-ms-encryption-scope": { + "x-ms-client-name": "EncryptionScope", + "type": "string", + "description": "Returns the name of the encryption scope used to encrypt the blob contents and application metadata. Note that the absence of this header implies use of the default account encryption scope." + }, + "x-ms-blob-content-md5": { + "x-ms-client-name": "BlobContentMD5", + "type": "string", + "format": "byte", + "description": "If the blob has a MD5 hash, and if request contains range header (Range or x-ms-range), this response header is returned with the value of the whole blob's MD5 value. This value may or may not be equal to the value returned in Content-MD5 header, with the latter calculated from the requested range" + }, + "x-ms-tag-count": { + "x-ms-client-name": "TagCount", + "type": "integer", + "format": "int64", + "description": "The number of tags associated with the blob" + }, + "x-ms-blob-sealed": { + "x-ms-client-name": "IsSealed", + "type": "boolean", + "description": "If this blob has been sealed" + }, + "x-ms-last-access-time": { + "x-ms-client-name": "LastAccessed", + "type": "string", + "format": "date-time-rfc1123", + "description": "UTC date/time value generated by the service that indicates the time at which the blob was last read or written to" + }, + "x-ms-immutability-policy-until-date": { + "x-ms-client-name": "ImmutabilityPolicyExpiresOn", + "type": "string", + "format": "date-time-rfc1123", + "description": "UTC date/time value generated by the service that indicates the time at which the blob immutability policy will expire." + }, + "x-ms-immutability-policy-mode": { + "x-ms-client-name": "ImmutabilityPolicyMode", + "type": "string", + "description": "Indicates immutability policy mode." + }, + "x-ms-legal-hold": { + "x-ms-client-name": "LegalHold", + "type": "boolean", + "description": "Indicates if a legal hold is present on the blob." + } + }, + "schema": { + "type": "object", + "format": "file" + } + }, + "default": { + "description": "Failure", + "headers": { + "x-ms-error-code": { + "x-ms-client-name": "ErrorCode", + "type": "string" + } + }, + "schema": { + "$ref": "#/definitions/StorageError" + } + } + } + }, + "head": { + "tags": [ + "blob" + ], + "operationId": "Blob_GetProperties", + "description": "The Get Properties operation returns all user-defined metadata, standard HTTP properties, and system properties for the blob. It does not return the content of the blob.", + "parameters": [ + { + "$ref": "#/parameters/Snapshot" + }, + { + "$ref": "#/parameters/VersionId" + }, + { + "$ref": "#/parameters/Timeout" + }, + { + "$ref": "#/parameters/LeaseIdOptional" + }, + { + "$ref": "#/parameters/EncryptionKey" + }, + { + "$ref": "#/parameters/EncryptionKeySha256" + }, + { + "$ref": "#/parameters/EncryptionAlgorithm" + }, + { + "$ref": "#/parameters/IfModifiedSince" + }, + { + "$ref": "#/parameters/IfUnmodifiedSince" + }, + { + "$ref": "#/parameters/IfMatch" + }, + { + "$ref": "#/parameters/IfNoneMatch" + }, + { + "$ref": "#/parameters/IfTags" + }, + { + "$ref": "#/parameters/ApiVersionParameter" + }, + { + "$ref": "#/parameters/ClientRequestId" + } + ], + "responses": { + "200": { + "description": "Returns the properties of the blob.", + "headers": { + "Last-Modified": { + "type": "string", + "format": "date-time-rfc1123", + "description": "Returns the date and time the blob was last modified. Any operation that modifies the blob, including an update of the blob's metadata or properties, changes the last-modified time of the blob." + }, + "x-ms-creation-time": { + "x-ms-client-name": "CreationTime", + "type": "string", + "format": "date-time-rfc1123", + "description": "Returns the date and time the blob was created." + }, + "x-ms-meta": { + "type": "string", + "x-ms-client-name": "Metadata", + "x-ms-header-collection-prefix": "x-ms-meta-" + }, + "x-ms-or-policy-id": { + "x-ms-client-name": "ObjectReplicationPolicyId", + "type": "string", + "description": "Optional. Only valid when Object Replication is enabled for the storage container and on the destination blob of the replication." + }, + "x-ms-or": { + "type": "string", + "x-ms-client-name": "ObjectReplicationRules", + "x-ms-header-collection-prefix": "x-ms-or-", + "description": "Optional. Only valid when Object Replication is enabled for the storage container and on the source blob of the replication. When retrieving this header, it will return the header with the policy id and rule id (e.g. x-ms-or-policyid_ruleid), and the value will be the status of the replication (e.g. complete, failed)." + }, + "x-ms-blob-type": { + "x-ms-client-name": "BlobType", + "description": "The blob's type.", + "type": "string", + "enum": [ + "BlockBlob", + "PageBlob", + "AppendBlob" + ], + "x-ms-enum": { + "name": "BlobType", + "modelAsString": false + } + }, + "x-ms-copy-completion-time": { + "x-ms-client-name": "CopyCompletionTime", + "type": "string", + "format": "date-time-rfc1123", + "description": "Conclusion time of the last attempted Copy Blob operation where this blob was the destination blob. This value can specify the time of a completed, aborted, or failed copy attempt. This header does not appear if a copy is pending, if this blob has never been the destination in a Copy Blob operation, or if this blob has been modified after a concluded Copy Blob operation using Set Blob Properties, Put Blob, or Put Block List." + }, + "x-ms-copy-status-description": { + "x-ms-client-name": "CopyStatusDescription", + "type": "string", + "description": "Only appears when x-ms-copy-status is failed or pending. Describes the cause of the last fatal or non-fatal copy operation failure. This header does not appear if this blob has never been the destination in a Copy Blob operation, or if this blob has been modified after a concluded Copy Blob operation using Set Blob Properties, Put Blob, or Put Block List" + }, + "x-ms-copy-id": { + "x-ms-client-name": "CopyId", + "type": "string", + "description": "String identifier for this copy operation. Use with Get Blob Properties to check the status of this copy operation, or pass to Abort Copy Blob to abort a pending copy." + }, + "x-ms-copy-progress": { + "x-ms-client-name": "CopyProgress", + "type": "string", + "description": "Contains the number of bytes copied and the total bytes in the source in the last attempted Copy Blob operation where this blob was the destination blob. Can show between 0 and Content-Length bytes copied. This header does not appear if this blob has never been the destination in a Copy Blob operation, or if this blob has been modified after a concluded Copy Blob operation using Set Blob Properties, Put Blob, or Put Block List" + }, + "x-ms-copy-source": { + "x-ms-client-name": "CopySource", + "type": "string", + "description": "URL up to 2 KB in length that specifies the source blob or file used in the last attempted Copy Blob operation where this blob was the destination blob. This header does not appear if this blob has never been the destination in a Copy Blob operation, or if this blob has been modified after a concluded Copy Blob operation using Set Blob Properties, Put Blob, or Put Block List." + }, + "x-ms-copy-status": { + "x-ms-client-name": "CopyStatus", + "description": "State of the copy operation identified by x-ms-copy-id.", + "type": "string", + "enum": [ + "pending", + "success", + "aborted", + "failed" + ], + "x-ms-enum": { + "name": "CopyStatusType", + "modelAsString": false + } + }, + "x-ms-incremental-copy": { + "x-ms-client-name": "IsIncrementalCopy", + "type": "boolean", + "description": "Included if the blob is incremental copy blob." + }, + "x-ms-copy-destination-snapshot": { + "x-ms-client-name": "DestinationSnapshot", + "type": "string", + "description": "Included if the blob is incremental copy blob or incremental copy snapshot, if x-ms-copy-status is success. Snapshot time of the last successful incremental copy snapshot for this blob." + }, + "x-ms-lease-duration": { + "x-ms-client-name": "LeaseDuration", + "description": "When a blob is leased, specifies whether the lease is of infinite or fixed duration.", + "type": "string", + "enum": [ + "infinite", + "fixed" + ], + "x-ms-enum": { + "name": "LeaseDurationType", + "modelAsString": false + } + }, + "x-ms-lease-state": { + "x-ms-client-name": "LeaseState", + "description": "Lease state of the blob.", + "type": "string", + "enum": [ + "available", + "leased", + "expired", + "breaking", + "broken" + ], + "x-ms-enum": { + "name": "LeaseStateType", + "modelAsString": false + } + }, + "x-ms-lease-status": { + "x-ms-client-name": "LeaseStatus", + "description": "The current lease status of the blob.", + "type": "string", + "enum": [ + "locked", + "unlocked" + ], + "x-ms-enum": { + "name": "LeaseStatusType", + "modelAsString": false + } + }, + "Content-Length": { + "type": "integer", + "format": "int64", + "description": "The number of bytes present in the response body." + }, + "Content-Type": { + "type": "string", + "description": "The content type specified for the blob. The default content type is 'application/octet-stream'" + }, + "ETag": { + "type": "string", + "description": "The ETag contains a value that you can use to perform operations conditionally. If the request version is 2011-08-18 or newer, the ETag value will be in quotes." + }, + "Content-MD5": { + "type": "string", + "format": "byte", + "description": "If the blob has an MD5 hash and this operation is to read the full blob, this response header is returned so that the client can check for message content integrity." + }, + "Content-Encoding": { + "type": "string", + "description": "This header returns the value that was specified for the Content-Encoding request header" + }, + "Content-Disposition": { + "type": "string", + "description": "This header returns the value that was specified for the 'x-ms-blob-content-disposition' header. The Content-Disposition response header field conveys additional information about how to process the response payload, and also can be used to attach additional metadata. For example, if set to attachment, it indicates that the user-agent should not display the response, but instead show a Save As dialog with a filename other than the blob name specified." + }, + "Content-Language": { + "type": "string", + "description": "This header returns the value that was specified for the Content-Language request header." + }, + "Cache-Control": { + "type": "string", + "description": "This header is returned if it was previously specified for the blob." + }, + "x-ms-blob-sequence-number": { + "x-ms-client-name": "BlobSequenceNumber", + "type": "integer", + "format": "int64", + "description": "The current sequence number for a page blob. This header is not returned for block blobs or append blobs" + }, + "x-ms-client-request-id": { + "x-ms-client-name": "ClientRequestId", + "type": "string", + "description": "If a client request id header is sent in the request, this header will be present in the response with the same value." + }, + "x-ms-request-id": { + "x-ms-client-name": "RequestId", + "type": "string", + "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." + }, + "x-ms-version": { + "x-ms-client-name": "Version", + "type": "string", + "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." + }, + "Date": { + "type": "string", + "format": "date-time-rfc1123", + "description": "UTC date/time value generated by the service that indicates the time at which the response was initiated" + }, + "Accept-Ranges": { + "type": "string", + "description": "Indicates that the service supports requests for partial blob content." + }, + "x-ms-blob-committed-block-count": { + "x-ms-client-name": "BlobCommittedBlockCount", + "type": "integer", + "description": "The number of committed blocks present in the blob. This header is returned only for append blobs." + }, + "x-ms-server-encrypted": { + "x-ms-client-name": "IsServerEncrypted", + "type": "boolean", + "description": "The value of this header is set to true if the blob data and application metadata are completely encrypted using the specified algorithm. Otherwise, the value is set to false (when the blob is unencrypted, or if only parts of the blob/application metadata are encrypted)." + }, + "x-ms-encryption-key-sha256": { + "x-ms-client-name": "EncryptionKeySha256", + "type": "string", + "description": "The SHA-256 hash of the encryption key used to encrypt the metadata. This header is only returned when the metadata was encrypted with a customer-provided key." + }, + "x-ms-encryption-scope": { + "x-ms-client-name": "EncryptionScope", + "type": "string", + "description": "Returns the name of the encryption scope used to encrypt the blob contents and application metadata. Note that the absence of this header implies use of the default account encryption scope." + }, + "x-ms-access-tier": { + "x-ms-client-name": "AccessTier", + "type": "string", + "description": "The tier of page blob on a premium storage account or tier of block blob on blob storage LRS accounts. For a list of allowed premium page blob tiers, see https://docs.microsoft.com/en-us/azure/virtual-machines/windows/premium-storage#features. For blob storage LRS accounts, valid values are Hot/Cool/Archive." + }, + "x-ms-access-tier-inferred": { + "x-ms-client-name": "AccessTierInferred", + "type": "boolean", + "description": "For page blobs on a premium storage account only. If the access tier is not explicitly set on the blob, the tier is inferred based on its content length and this header will be returned with true value." + }, + "x-ms-archive-status": { + "x-ms-client-name": "ArchiveStatus", + "type": "string", + "description": "For blob storage LRS accounts, valid values are rehydrate-pending-to-hot/rehydrate-pending-to-cool. If the blob is being rehydrated and is not complete then this header is returned indicating that rehydrate is pending and also tells the destination tier." + }, + "x-ms-access-tier-change-time": { + "x-ms-client-name": "AccessTierChangeTime", + "type": "string", + "format": "date-time-rfc1123", + "description": "The time the tier was changed on the object. This is only returned if the tier on the block blob was ever set." + }, + "x-ms-version-id": { + "x-ms-client-name": "VersionId", + "type": "string", + "description": "A DateTime value returned by the service that uniquely identifies the blob. The value of this header indicates the blob version, and may be used in subsequent requests to access this version of the blob." + }, + "x-ms-is-current-version": { + "x-ms-client-name": "IsCurrentVersion", + "type": "boolean", + "description": "The value of this header indicates whether version of this blob is a current version, see also x-ms-version-id header." + }, + "x-ms-tag-count": { + "x-ms-client-name": "TagCount", + "type": "integer", + "format": "int64", + "description": "The number of tags associated with the blob" + }, + "x-ms-expiry-time": { + "x-ms-client-name": "ExpiresOn", + "type": "string", + "format": "date-time-rfc1123", + "description": "The time this blob will expire." + }, + "x-ms-blob-sealed": { + "x-ms-client-name": "IsSealed", + "type": "boolean", + "description": "If this blob has been sealed" + }, + "x-ms-rehydrate-priority": { + "x-ms-client-name": "RehydratePriority", + "description": "If an object is in rehydrate pending state then this header is returned with priority of rehydrate. Valid values are High and Standard.", + "type": "string" + }, + "x-ms-last-access-time": { + "x-ms-client-name": "LastAccessed", + "type": "string", + "format": "date-time-rfc1123", + "description": "UTC date/time value generated by the service that indicates the time at which the blob was last read or written to" + }, + "x-ms-immutability-policy-until-date": { + "x-ms-client-name": "ImmutabilityPolicyExpiresOn", + "type": "string", + "format": "date-time-rfc1123", + "description": "UTC date/time value generated by the service that indicates the time at which the blob immutability policy will expire." + }, + "x-ms-immutability-policy-mode": { + "x-ms-client-name": "ImmutabilityPolicyMode", + "type": "string", + "enum": [ + "Mutable", + "Unlocked", + "Locked" + ], + "x-ms-enum": { + "name": "BlobImmutabilityPolicyMode", + "modelAsString": false + }, + "description": "Indicates immutability policy mode." + }, + "x-ms-legal-hold": { + "x-ms-client-name": "LegalHold", + "type": "boolean", + "description": "Indicates if a legal hold is present on the blob." + } + } + }, + "default": { + "description": "Failure", + "headers": { + "x-ms-error-code": { + "x-ms-client-name": "ErrorCode", + "type": "string" + } + }, + "schema": { + "$ref": "#/definitions/StorageError" + } + } + } + }, + "delete": { + "tags": [ + "blob" + ], + "operationId": "Blob_Delete", + "description": "If the storage account's soft delete feature is disabled then, when a blob is deleted, it is permanently removed from the storage account. If the storage account's soft delete feature is enabled, then, when a blob is deleted, it is marked for deletion and becomes inaccessible immediately. However, the blob service retains the blob or snapshot for the number of days specified by the DeleteRetentionPolicy section of [Storage service properties] (Set-Blob-Service-Properties.md). After the specified number of days has passed, the blob's data is permanently removed from the storage account. Note that you continue to be charged for the soft-deleted blob's storage until it is permanently removed. Use the List Blobs API and specify the \"include=deleted\" query parameter to discover which blobs and snapshots have been soft deleted. You can then use the Undelete Blob API to restore a soft-deleted blob. All other operations on a soft-deleted blob or snapshot causes the service to return an HTTP status code of 404 (ResourceNotFound).", + "parameters": [ + { + "$ref": "#/parameters/Snapshot" + }, + { + "$ref": "#/parameters/VersionId" + }, + { + "$ref": "#/parameters/Timeout" + }, + { + "$ref": "#/parameters/LeaseIdOptional" + }, + { + "$ref": "#/parameters/DeleteSnapshots" + }, + { + "$ref": "#/parameters/IfModifiedSince" + }, + { + "$ref": "#/parameters/IfUnmodifiedSince" + }, + { + "$ref": "#/parameters/IfMatch" + }, + { + "$ref": "#/parameters/IfNoneMatch" + }, + { + "$ref": "#/parameters/IfTags" + }, + { + "$ref": "#/parameters/ApiVersionParameter" + }, + { + "$ref": "#/parameters/ClientRequestId" + }, + { + "$ref": "#/parameters/BlobDeleteType" + } + ], + "responses": { + "202": { + "description": "The delete request was accepted and the blob will be deleted.", + "headers": { + "x-ms-client-request-id": { + "x-ms-client-name": "ClientRequestId", + "type": "string", + "description": "If a client request id header is sent in the request, this header will be present in the response with the same value." + }, + "x-ms-request-id": { + "x-ms-client-name": "RequestId", + "type": "string", + "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." + }, + "x-ms-version": { + "x-ms-client-name": "Version", + "type": "string", + "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." + }, + "Date": { + "type": "string", + "format": "date-time-rfc1123", + "description": "UTC date/time value generated by the service that indicates the time at which the response was initiated" + } + } + }, + "default": { + "description": "Failure", + "headers": { + "x-ms-error-code": { + "x-ms-client-name": "ErrorCode", + "type": "string" + } + }, + "schema": { + "$ref": "#/definitions/StorageError" + } + } + } + }, + "parameters": [ + { + "$ref": "#/parameters/ContainerName" + }, + { + "$ref": "#/parameters/Blob" + } + ] + }, + "/{containerName}/{blob}?PageBlob": { + "put": { + "tags": [ + "blob" + ], + "operationId": "PageBlob_Create", + "description": "The Create operation creates a new page blob.", + "consumes": [ + "application/octet-stream" + ], + "parameters": [ + { + "$ref": "#/parameters/Timeout" + }, + { + "$ref": "#/parameters/ContentLength" + }, + { + "$ref": "#/parameters/PremiumPageBlobAccessTierOptional" + }, + { + "$ref": "#/parameters/BlobContentType" + }, + { + "$ref": "#/parameters/BlobContentEncoding" + }, + { + "$ref": "#/parameters/BlobContentLanguage" + }, + { + "$ref": "#/parameters/BlobContentMD5" + }, + { + "$ref": "#/parameters/BlobCacheControl" + }, + { + "$ref": "#/parameters/Metadata" + }, + { + "$ref": "#/parameters/LeaseIdOptional" + }, + { + "$ref": "#/parameters/BlobContentDisposition" + }, + { + "$ref": "#/parameters/EncryptionKey" + }, + { + "$ref": "#/parameters/EncryptionKeySha256" + }, + { + "$ref": "#/parameters/EncryptionAlgorithm" + }, + { + "$ref": "#/parameters/EncryptionScope" + }, + { + "$ref": "#/parameters/IfModifiedSince" + }, + { + "$ref": "#/parameters/IfUnmodifiedSince" + }, + { + "$ref": "#/parameters/IfMatch" + }, + { + "$ref": "#/parameters/IfNoneMatch" + }, + { + "$ref": "#/parameters/IfTags" + }, + { + "$ref": "#/parameters/BlobContentLengthRequired" + }, + { + "$ref": "#/parameters/BlobSequenceNumber" + }, + { + "$ref": "#/parameters/ApiVersionParameter" + }, + { + "$ref": "#/parameters/ClientRequestId" + }, + { + "$ref": "#/parameters/BlobTagsHeader" + }, + { + "$ref": "#/parameters/ImmutabilityPolicyExpiry" + }, + { + "$ref": "#/parameters/ImmutabilityPolicyMode" + }, + { + "$ref": "#/parameters/LegalHoldOptional" + } + ], + "responses": { + "201": { + "description": "The blob was created.", + "headers": { + "ETag": { + "type": "string", + "description": "The ETag contains a value that you can use to perform operations conditionally. If the request version is 2011-08-18 or newer, the ETag value will be in quotes." + }, + "Last-Modified": { + "type": "string", + "format": "date-time-rfc1123", + "description": "Returns the date and time the container was last modified. Any operation that modifies the blob, including an update of the blob's metadata or properties, changes the last-modified time of the blob." + }, + "Content-MD5": { + "type": "string", + "format": "byte", + "description": "If the blob has an MD5 hash and this operation is to read the full blob, this response header is returned so that the client can check for message content integrity." + }, + "x-ms-client-request-id": { + "x-ms-client-name": "ClientRequestId", + "type": "string", + "description": "If a client request id header is sent in the request, this header will be present in the response with the same value." + }, + "x-ms-request-id": { + "x-ms-client-name": "RequestId", + "type": "string", + "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." + }, + "x-ms-version": { + "x-ms-client-name": "Version", + "type": "string", + "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." + }, + "x-ms-version-id": { + "x-ms-client-name": "VersionId", + "type": "string", + "description": "A DateTime value returned by the service that uniquely identifies the blob. The value of this header indicates the blob version, and may be used in subsequent requests to access this version of the blob." + }, + "Date": { + "type": "string", + "format": "date-time-rfc1123", + "description": "UTC date/time value generated by the service that indicates the time at which the response was initiated" + }, + "x-ms-request-server-encrypted": { + "x-ms-client-name": "IsServerEncrypted", + "type": "boolean", + "description": "The value of this header is set to true if the contents of the request are successfully encrypted using the specified algorithm, and false otherwise." + }, + "x-ms-encryption-key-sha256": { + "x-ms-client-name": "EncryptionKeySha256", + "type": "string", + "description": "The SHA-256 hash of the encryption key used to encrypt the blob. This header is only returned when the blob was encrypted with a customer-provided key." + }, + "x-ms-encryption-scope": { + "x-ms-client-name": "EncryptionScope", + "type": "string", + "description": "Returns the name of the encryption scope used to encrypt the blob contents and application metadata. Note that the absence of this header implies use of the default account encryption scope." + } + } + }, + "default": { + "description": "Failure", + "headers": { + "x-ms-error-code": { + "x-ms-client-name": "ErrorCode", + "type": "string" + } + }, + "schema": { + "$ref": "#/definitions/StorageError" + } + } + } + }, + "parameters": [ + { + "$ref": "#/parameters/ContainerName" + }, + { + "$ref": "#/parameters/Blob" + }, + { + "name": "x-ms-blob-type", + "x-ms-client-name": "blobType", + "in": "header", + "required": true, + "x-ms-parameter-location": "method", + "description": "Specifies the type of blob to create: block blob, page blob, or append blob.", + "type": "string", + "enum": [ + "PageBlob" + ], + "x-ms-enum": { + "name": "BlobType", + "modelAsString": false + } + } + ] + }, + "/{containerName}/{blob}?AppendBlob": { + "put": { + "tags": [ + "blob" + ], + "operationId": "AppendBlob_Create", + "description": "The Create Append Blob operation creates a new append blob.", + "consumes": [ + "application/octet-stream" + ], + "parameters": [ + { + "$ref": "#/parameters/Timeout" + }, + { + "$ref": "#/parameters/ContentLength" + }, + { + "$ref": "#/parameters/BlobContentType" + }, + { + "$ref": "#/parameters/BlobContentEncoding" + }, + { + "$ref": "#/parameters/BlobContentLanguage" + }, + { + "$ref": "#/parameters/BlobContentMD5" + }, + { + "$ref": "#/parameters/BlobCacheControl" + }, + { + "$ref": "#/parameters/Metadata" + }, + { + "$ref": "#/parameters/LeaseIdOptional" + }, + { + "$ref": "#/parameters/BlobContentDisposition" + }, + { + "$ref": "#/parameters/EncryptionKey" + }, + { + "$ref": "#/parameters/EncryptionKeySha256" + }, + { + "$ref": "#/parameters/EncryptionAlgorithm" + }, + { + "$ref": "#/parameters/EncryptionScope" + }, + { + "$ref": "#/parameters/IfModifiedSince" + }, + { + "$ref": "#/parameters/IfUnmodifiedSince" + }, + { + "$ref": "#/parameters/IfMatch" + }, + { + "$ref": "#/parameters/IfNoneMatch" + }, + { + "$ref": "#/parameters/IfTags" + }, + { + "$ref": "#/parameters/ApiVersionParameter" + }, + { + "$ref": "#/parameters/ClientRequestId" + }, + { + "$ref": "#/parameters/BlobTagsHeader" + }, + { + "$ref": "#/parameters/ImmutabilityPolicyExpiry" + }, + { + "$ref": "#/parameters/ImmutabilityPolicyMode" + }, + { + "$ref": "#/parameters/LegalHoldOptional" + } + ], + "responses": { + "201": { + "description": "The blob was created.", + "headers": { + "ETag": { + "type": "string", + "description": "The ETag contains a value that you can use to perform operations conditionally. If the request version is 2011-08-18 or newer, the ETag value will be in quotes." + }, + "Last-Modified": { + "type": "string", + "format": "date-time-rfc1123", + "description": "Returns the date and time the container was last modified. Any operation that modifies the blob, including an update of the blob's metadata or properties, changes the last-modified time of the blob." + }, + "Content-MD5": { + "type": "string", + "format": "byte", + "description": "If the blob has an MD5 hash and this operation is to read the full blob, this response header is returned so that the client can check for message content integrity." + }, + "x-ms-client-request-id": { + "x-ms-client-name": "ClientRequestId", + "type": "string", + "description": "If a client request id header is sent in the request, this header will be present in the response with the same value." + }, + "x-ms-request-id": { + "x-ms-client-name": "RequestId", + "type": "string", + "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." + }, + "x-ms-version": { + "x-ms-client-name": "Version", + "type": "string", + "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." + }, + "x-ms-version-id": { + "x-ms-client-name": "VersionId", + "type": "string", + "description": "A DateTime value returned by the service that uniquely identifies the blob. The value of this header indicates the blob version, and may be used in subsequent requests to access this version of the blob." + }, + "Date": { + "type": "string", + "format": "date-time-rfc1123", + "description": "UTC date/time value generated by the service that indicates the time at which the response was initiated" + }, + "x-ms-request-server-encrypted": { + "x-ms-client-name": "IsServerEncrypted", + "type": "boolean", + "description": "The value of this header is set to true if the contents of the request are successfully encrypted using the specified algorithm, and false otherwise." + }, + "x-ms-encryption-key-sha256": { + "x-ms-client-name": "EncryptionKeySha256", + "type": "string", + "description": "The SHA-256 hash of the encryption key used to encrypt the blob. This header is only returned when the blob was encrypted with a customer-provided key." + }, + "x-ms-encryption-scope": { + "x-ms-client-name": "EncryptionScope", + "type": "string", + "description": "Returns the name of the encryption scope used to encrypt the blob contents and application metadata. Note that the absence of this header implies use of the default account encryption scope." + } + } + }, + "default": { + "description": "Failure", + "headers": { + "x-ms-error-code": { + "x-ms-client-name": "ErrorCode", + "type": "string" + } + }, + "schema": { + "$ref": "#/definitions/StorageError" + } + } + } + }, + "parameters": [ + { + "$ref": "#/parameters/ContainerName" + }, + { + "$ref": "#/parameters/Blob" + }, + { + "name": "x-ms-blob-type", + "x-ms-client-name": "blobType", + "in": "header", + "required": true, + "x-ms-parameter-location": "method", + "description": "Specifies the type of blob to create: block blob, page blob, or append blob.", + "type": "string", + "enum": [ + "AppendBlob" + ], + "x-ms-enum": { + "name": "BlobType", + "modelAsString": false + } + } + ] + }, + "/{containerName}/{blob}?BlockBlob": { + "put": { + "tags": [ + "blob" + ], + "operationId": "BlockBlob_Upload", + "description": "The Upload Block Blob operation updates the content of an existing block blob. Updating an existing block blob overwrites any existing metadata on the blob. Partial updates are not supported with Put Blob; the content of the existing blob is overwritten with the content of the new blob. To perform a partial update of the content of a block blob, use the Put Block List operation.", + "consumes": [ + "application/octet-stream" + ], + "parameters": [ + { + "$ref": "#/parameters/Body" + }, + { + "$ref": "#/parameters/Timeout" + }, + { + "$ref": "#/parameters/ContentMD5" + }, + { + "$ref": "#/parameters/ContentLength" + }, + { + "$ref": "#/parameters/BlobContentType" + }, + { + "$ref": "#/parameters/BlobContentEncoding" + }, + { + "$ref": "#/parameters/BlobContentLanguage" + }, + { + "$ref": "#/parameters/BlobContentMD5" + }, + { + "$ref": "#/parameters/BlobCacheControl" + }, + { + "$ref": "#/parameters/Metadata" + }, + { + "$ref": "#/parameters/LeaseIdOptional" + }, + { + "$ref": "#/parameters/BlobContentDisposition" + }, + { + "$ref": "#/parameters/EncryptionKey" + }, + { + "$ref": "#/parameters/EncryptionKeySha256" + }, + { + "$ref": "#/parameters/EncryptionAlgorithm" + }, + { + "$ref": "#/parameters/EncryptionScope" + }, + { + "$ref": "#/parameters/AccessTierOptional" + }, + { + "$ref": "#/parameters/IfModifiedSince" + }, + { + "$ref": "#/parameters/IfUnmodifiedSince" + }, + { + "$ref": "#/parameters/IfMatch" + }, + { + "$ref": "#/parameters/IfNoneMatch" + }, + { + "$ref": "#/parameters/IfTags" + }, + { + "$ref": "#/parameters/ApiVersionParameter" + }, + { + "$ref": "#/parameters/ClientRequestId" + }, + { + "$ref": "#/parameters/BlobTagsHeader" + }, + { + "$ref": "#/parameters/ImmutabilityPolicyExpiry" + }, + { + "$ref": "#/parameters/ImmutabilityPolicyMode" + }, + { + "$ref": "#/parameters/LegalHoldOptional" + }, + { + "$ref": "#/parameters/ContentCrc64" + } + ], + "responses": { + "201": { + "description": "The blob was updated.", + "headers": { + "ETag": { + "type": "string", + "description": "The ETag contains a value that you can use to perform operations conditionally. If the request version is 2011-08-18 or newer, the ETag value will be in quotes." + }, + "Last-Modified": { + "type": "string", + "format": "date-time-rfc1123", + "description": "Returns the date and time the container was last modified. Any operation that modifies the blob, including an update of the blob's metadata or properties, changes the last-modified time of the blob." + }, + "Content-MD5": { + "type": "string", + "format": "byte", + "description": "If the blob has an MD5 hash and this operation is to read the full blob, this response header is returned so that the client can check for message content integrity." + }, + "x-ms-client-request-id": { + "x-ms-client-name": "ClientRequestId", + "type": "string", + "description": "If a client request id header is sent in the request, this header will be present in the response with the same value." + }, + "x-ms-request-id": { + "x-ms-client-name": "RequestId", + "type": "string", + "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." + }, + "x-ms-version": { + "x-ms-client-name": "Version", + "type": "string", + "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." + }, + "x-ms-version-id": { + "x-ms-client-name": "VersionId", + "type": "string", + "description": "A DateTime value returned by the service that uniquely identifies the blob. The value of this header indicates the blob version, and may be used in subsequent requests to access this version of the blob." + }, + "Date": { + "type": "string", + "format": "date-time-rfc1123", + "description": "UTC date/time value generated by the service that indicates the time at which the response was initiated" + }, + "x-ms-request-server-encrypted": { + "x-ms-client-name": "IsServerEncrypted", + "type": "boolean", + "description": "The value of this header is set to true if the contents of the request are successfully encrypted using the specified algorithm, and false otherwise." + }, + "x-ms-encryption-key-sha256": { + "x-ms-client-name": "EncryptionKeySha256", + "type": "string", + "description": "The SHA-256 hash of the encryption key used to encrypt the blob. This header is only returned when the blob was encrypted with a customer-provided key." + }, + "x-ms-encryption-scope": { + "x-ms-client-name": "EncryptionScope", + "type": "string", + "description": "Returns the name of the encryption scope used to encrypt the blob contents and application metadata. Note that the absence of this header implies use of the default account encryption scope." + } + } + }, + "default": { + "description": "Failure", + "headers": { + "x-ms-error-code": { + "x-ms-client-name": "ErrorCode", + "type": "string" + } + }, + "schema": { + "$ref": "#/definitions/StorageError" + } + } + } + }, + "parameters": [ + { + "$ref": "#/parameters/ContainerName" + }, + { + "$ref": "#/parameters/Blob" + }, + { + "name": "x-ms-blob-type", + "x-ms-client-name": "blobType", + "in": "header", + "required": true, + "x-ms-parameter-location": "method", + "description": "Specifies the type of blob to create: block blob, page blob, or append blob.", + "type": "string", + "enum": [ + "BlockBlob" + ], + "x-ms-enum": { + "name": "BlobType", + "modelAsString": false + } + } + ] + }, + "/{containerName}/{blob}?BlockBlob&fromUrl": { + "put": { + "tags": [ + "blob" + ], + "operationId": "BlockBlob_PutBlobFromUrl", + "description": "The Put Blob from URL operation creates a new Block Blob where the contents of the blob are read from a given URL. This API is supported beginning with the 2020-04-08 version. Partial updates are not supported with Put Blob from URL; the content of an existing blob is overwritten with the content of the new blob. To perform partial updates to a block blob’s contents using a source URL, use the Put Block from URL API in conjunction with Put Block List.", + "consumes": [ + "application/octet-stream" + ], + "parameters": [ + { + "$ref": "#/parameters/Timeout" + }, + { + "$ref": "#/parameters/ContentMD5" + }, + { + "$ref": "#/parameters/ContentLength" + }, + { + "$ref": "#/parameters/BlobContentType" + }, + { + "$ref": "#/parameters/BlobContentEncoding" + }, + { + "$ref": "#/parameters/BlobContentLanguage" + }, + { + "$ref": "#/parameters/BlobContentMD5" + }, + { + "$ref": "#/parameters/BlobCacheControl" + }, + { + "$ref": "#/parameters/Metadata" + }, + { + "$ref": "#/parameters/LeaseIdOptional" + }, + { + "$ref": "#/parameters/BlobContentDisposition" + }, + { + "$ref": "#/parameters/EncryptionKey" + }, + { + "$ref": "#/parameters/EncryptionKeySha256" + }, + { + "$ref": "#/parameters/EncryptionAlgorithm" + }, + { + "$ref": "#/parameters/EncryptionScope" + }, + { + "$ref": "#/parameters/AccessTierOptional" + }, + { + "$ref": "#/parameters/IfModifiedSince" + }, + { + "$ref": "#/parameters/IfUnmodifiedSince" + }, + { + "$ref": "#/parameters/IfMatch" + }, + { + "$ref": "#/parameters/IfNoneMatch" + }, + { + "$ref": "#/parameters/IfTags" + }, + { + "$ref": "#/parameters/SourceIfModifiedSince" + }, + { + "$ref": "#/parameters/SourceIfUnmodifiedSince" + }, + { + "$ref": "#/parameters/SourceIfMatch" + }, + { + "$ref": "#/parameters/SourceIfNoneMatch" + }, + { + "$ref": "#/parameters/SourceIfTags" + }, + { + "$ref": "#/parameters/ApiVersionParameter" + }, + { + "$ref": "#/parameters/ClientRequestId" + }, + { + "$ref": "#/parameters/SourceContentMD5" + }, + { + "$ref": "#/parameters/BlobTagsHeader" + }, + { + "$ref": "#/parameters/CopySource" + }, + { + "$ref": "#/parameters/CopySourceBlobProperties" + }, + { + "$ref": "#/parameters/CopySourceAuthorization" + }, + { + "$ref": "#/parameters/CopySourceTags" + } + ], + "responses": { + "201": { + "description": "The blob was updated.", + "headers": { + "ETag": { + "type": "string", + "description": "The ETag contains a value that you can use to perform operations conditionally. If the request version is 2011-08-18 or newer, the ETag value will be in quotes." + }, + "Last-Modified": { + "type": "string", + "format": "date-time-rfc1123", + "description": "Returns the date and time the container was last modified. Any operation that modifies the blob, including an update of the blob's metadata or properties, changes the last-modified time of the blob." + }, + "Content-MD5": { + "type": "string", + "format": "byte", + "description": "If the blob has an MD5 hash and this operation is to read the full blob, this response header is returned so that the client can check for message content integrity." + }, + "x-ms-client-request-id": { + "x-ms-client-name": "ClientRequestId", + "type": "string", + "description": "If a client request id header is sent in the request, this header will be present in the response with the same value." + }, + "x-ms-request-id": { + "x-ms-client-name": "RequestId", + "type": "string", + "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." + }, + "x-ms-version": { + "x-ms-client-name": "Version", + "type": "string", + "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." + }, + "x-ms-version-id": { + "x-ms-client-name": "VersionId", + "type": "string", + "description": "A DateTime value returned by the service that uniquely identifies the blob. The value of this header indicates the blob version, and may be used in subsequent requests to access this version of the blob." + }, + "Date": { + "type": "string", + "format": "date-time-rfc1123", + "description": "UTC date/time value generated by the service that indicates the time at which the response was initiated" + }, + "x-ms-request-server-encrypted": { + "x-ms-client-name": "IsServerEncrypted", + "type": "boolean", + "description": "The value of this header is set to true if the contents of the request are successfully encrypted using the specified algorithm, and false otherwise." + }, + "x-ms-encryption-key-sha256": { + "x-ms-client-name": "EncryptionKeySha256", + "type": "string", + "description": "The SHA-256 hash of the encryption key used to encrypt the blob. This header is only returned when the blob was encrypted with a customer-provided key." + }, + "x-ms-encryption-scope": { + "x-ms-client-name": "EncryptionScope", + "type": "string", + "description": "Returns the name of the encryption scope used to encrypt the blob contents and application metadata. Note that the absence of this header implies use of the default account encryption scope." + } + } + }, + "default": { + "description": "Failure", + "headers": { + "x-ms-error-code": { + "x-ms-client-name": "ErrorCode", + "type": "string" + } + }, + "schema": { + "$ref": "#/definitions/StorageError" + } + } + } + }, + "parameters": [ + { + "$ref": "#/parameters/ContainerName" + }, + { + "$ref": "#/parameters/Blob" + }, + { + "name": "x-ms-blob-type", + "x-ms-client-name": "blobType", + "in": "header", + "required": true, + "x-ms-parameter-location": "method", + "description": "Specifies the type of blob to create: block blob, page blob, or append blob.", + "type": "string", + "enum": [ + "BlockBlob" + ], + "x-ms-enum": { + "name": "BlobType", + "modelAsString": false + } + } + ] + }, + "/{containerName}/{blob}?comp=undelete": { + "put": { + "tags": [ + "blob" + ], + "operationId": "Blob_Undelete", + "description": "Undelete a blob that was previously soft deleted", + "parameters": [ + { + "$ref": "#/parameters/Timeout" + }, + { + "$ref": "#/parameters/ApiVersionParameter" + }, + { + "$ref": "#/parameters/ClientRequestId" + } + ], + "responses": { + "200": { + "description": "The blob was undeleted successfully.", + "headers": { + "x-ms-client-request-id": { + "x-ms-client-name": "ClientRequestId", + "type": "string", + "description": "If a client request id header is sent in the request, this header will be present in the response with the same value." + }, + "x-ms-request-id": { + "x-ms-client-name": "RequestId", + "type": "string", + "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." + }, + "x-ms-version": { + "x-ms-client-name": "Version", + "type": "string", + "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." + }, + "Date": { + "type": "string", + "format": "date-time-rfc1123", + "description": "UTC date/time value generated by the service that indicates the time at which the response was initiated." + } + } + }, + "default": { + "description": "Failure", + "headers": { + "x-ms-error-code": { + "x-ms-client-name": "ErrorCode", + "type": "string" + } + }, + "schema": { + "$ref": "#/definitions/StorageError" + } + } + } + }, + "parameters": [ + { + "$ref": "#/parameters/ContainerName" + }, + { + "$ref": "#/parameters/Blob" + }, + { + "name": "comp", + "description": "comp", + "in": "query", + "required": true, + "type": "string", + "enum": [ + "undelete" + ] + } + ] + }, + "/{containerName}/{blob}?comp=expiry": { + "put": { + "tags": [ + "blob" + ], + "operationId": "Blob_SetExpiry", + "description": "Sets the time a blob will expire and be deleted.", + "parameters": [ + { + "$ref": "#/parameters/Timeout" + }, + { + "$ref": "#/parameters/ApiVersionParameter" + }, + { + "$ref": "#/parameters/ClientRequestId" + }, + { + "$ref": "#/parameters/BlobExpiryOptions" + }, + { + "$ref": "#/parameters/BlobExpiryTime" + } + ], + "responses": { + "200": { + "description": "The blob expiry was set successfully.", + "headers": { + "ETag": { + "type": "string", + "description": "The ETag contains a value that you can use to perform operations conditionally. If the request version is 2011-08-18 or newer, the ETag value will be in quotes." + }, + "Last-Modified": { + "type": "string", + "format": "date-time-rfc1123", + "description": "Returns the date and time the container was last modified. Any operation that modifies the blob, including an update of the blob's metadata or properties, changes the last-modified time of the blob." + }, + "x-ms-client-request-id": { + "x-ms-client-name": "ClientRequestId", + "type": "string", + "description": "If a client request id header is sent in the request, this header will be present in the response with the same value." + }, + "x-ms-request-id": { + "x-ms-client-name": "RequestId", + "type": "string", + "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." + }, + "x-ms-version": { + "x-ms-client-name": "Version", + "type": "string", + "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." + }, + "Date": { + "type": "string", + "format": "date-time-rfc1123", + "description": "UTC date/time value generated by the service that indicates the time at which the response was initiated." + } + } + }, + "default": { + "description": "Failure", + "headers": { + "x-ms-error-code": { + "x-ms-client-name": "ErrorCode", + "type": "string" + } + }, + "schema": { + "$ref": "#/definitions/StorageError" + } + } + } + }, + "parameters": [ + { + "$ref": "#/parameters/ContainerName" + }, + { + "$ref": "#/parameters/Blob" + }, + { + "name": "comp", + "description": "comp", + "in": "query", + "required": true, + "type": "string", + "enum": [ + "expiry" + ] + } + ] + }, + "/{containerName}/{blob}?comp=properties&SetHTTPHeaders": { + "put": { + "tags": [ + "blob" + ], + "operationId": "Blob_SetHTTPHeaders", + "description": "The Set HTTP Headers operation sets system properties on the blob", + "parameters": [ + { + "$ref": "#/parameters/Timeout" + }, + { + "$ref": "#/parameters/BlobCacheControl" + }, + { + "$ref": "#/parameters/BlobContentType" + }, + { + "$ref": "#/parameters/BlobContentMD5" + }, + { + "$ref": "#/parameters/BlobContentEncoding" + }, + { + "$ref": "#/parameters/BlobContentLanguage" + }, + { + "$ref": "#/parameters/LeaseIdOptional" + }, + { + "$ref": "#/parameters/IfModifiedSince" + }, + { + "$ref": "#/parameters/IfUnmodifiedSince" + }, + { + "$ref": "#/parameters/IfMatch" + }, + { + "$ref": "#/parameters/IfNoneMatch" + }, + { + "$ref": "#/parameters/IfTags" + }, + { + "$ref": "#/parameters/BlobContentDisposition" + }, + { + "$ref": "#/parameters/ApiVersionParameter" + }, + { + "$ref": "#/parameters/ClientRequestId" + } + ], + "responses": { + "200": { + "description": "The properties were set successfully.", + "headers": { + "ETag": { + "type": "string", + "description": "The ETag contains a value that you can use to perform operations conditionally. If the request version is 2011-08-18 or newer, the ETag value will be in quotes." + }, + "Last-Modified": { + "type": "string", + "format": "date-time-rfc1123", + "description": "Returns the date and time the container was last modified. Any operation that modifies the blob, including an update of the blob's metadata or properties, changes the last-modified time of the blob." + }, + "x-ms-blob-sequence-number": { + "x-ms-client-name": "BlobSequenceNumber", + "type": "integer", + "format": "int64", + "description": "The current sequence number for a page blob. This header is not returned for block blobs or append blobs" + }, + "x-ms-client-request-id": { + "x-ms-client-name": "ClientRequestId", + "type": "string", + "description": "If a client request id header is sent in the request, this header will be present in the response with the same value." + }, + "x-ms-request-id": { + "x-ms-client-name": "RequestId", + "type": "string", + "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." + }, + "x-ms-version": { + "x-ms-client-name": "Version", + "type": "string", + "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." + }, + "Date": { + "type": "string", + "format": "date-time-rfc1123", + "description": "UTC date/time value generated by the service that indicates the time at which the response was initiated" + } + } + }, + "default": { + "description": "Failure", + "headers": { + "x-ms-error-code": { + "x-ms-client-name": "ErrorCode", + "type": "string" + } + }, + "schema": { + "$ref": "#/definitions/StorageError" + } + } + } + }, + "parameters": [ + { + "$ref": "#/parameters/ContainerName" + }, + { + "$ref": "#/parameters/Blob" + }, + { + "name": "comp", + "description": "comp", + "in": "query", + "required": true, + "type": "string", + "enum": [ + "properties" + ] + } + ] + }, + "/{containerName}/{blob}?comp=immutabilityPolicies": { + "put": { + "tags": [ + "blob" + ], + "operationId": "Blob_SetImmutabilityPolicy", + "description": "The Set Immutability Policy operation sets the immutability policy on the blob", + "parameters": [ + { + "$ref": "#/parameters/Timeout" + }, + { + "$ref": "#/parameters/ApiVersionParameter" + }, + { + "$ref": "#/parameters/ClientRequestId" + }, + { + "$ref": "#/parameters/IfUnmodifiedSince" + }, + { + "$ref": "#/parameters/ImmutabilityPolicyExpiry" + }, + { + "$ref": "#/parameters/ImmutabilityPolicyMode" + } + ], + "responses": { + "200": { + "description": "The immutability policy was successfully set.", + "headers": { + "x-ms-client-request-id": { + "x-ms-client-name": "ClientRequestId", + "type": "string", + "description": "If a client request id header is sent in the request, this header will be present in the response with the same value." + }, + "x-ms-request-id": { + "x-ms-client-name": "RequestId", + "type": "string", + "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." + }, + "x-ms-version": { + "x-ms-client-name": "Version", + "type": "string", + "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." + }, + "Date": { + "type": "string", + "format": "date-time-rfc1123", + "description": "UTC date/time value generated by the service that indicates the time at which the response was initiated" + }, + "x-ms-immutability-policy-until-date": { + "x-ms-client-name": "ImmutabilityPolicyExpiry", + "type": "string", + "format": "date-time-rfc1123", + "description": "Indicates the time the immutability policy will expire." + }, + "x-ms-immutability-policy-mode": { + "x-ms-client-name": "ImmutabilityPolicyMode", + "type": "string", + "enum": [ + "Mutable", + "Unlocked", + "Locked" + ], + "x-ms-enum": { + "name": "BlobImmutabilityPolicyMode", + "modelAsString": false + }, + "description": "Indicates immutability policy mode." + } + } + }, + "default": { + "description": "Failure", + "headers": { + "x-ms-error-code": { + "x-ms-client-name": "ErrorCode", + "type": "string" + } + }, + "schema": { + "$ref": "#/definitions/StorageError" + } + } + } + }, + "delete": { + "tags": [ + "blob" + ], + "operationId": "Blob_DeleteImmutabilityPolicy", + "description": "The Delete Immutability Policy operation deletes the immutability policy on the blob", + "parameters": [ + { + "$ref": "#/parameters/Timeout" + }, + { + "$ref": "#/parameters/ApiVersionParameter" + }, + { + "$ref": "#/parameters/ClientRequestId" + } + ], + "responses": { + "200": { + "description": "The delete immutability policy request was accepted and the immutability policy will be deleted.", + "headers": { + "x-ms-client-request-id": { + "x-ms-client-name": "ClientRequestId", + "type": "string", + "description": "If a client request id header is sent in the request, this header will be present in the response with the same value." + }, + "x-ms-request-id": { + "x-ms-client-name": "RequestId", + "type": "string", + "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." + }, + "x-ms-version": { + "x-ms-client-name": "Version", + "type": "string", + "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." + }, + "Date": { + "type": "string", + "format": "date-time-rfc1123", + "description": "UTC date/time value generated by the service that indicates the time at which the response was initiated" + } + } + }, + "default": { + "description": "Failure", + "headers": { + "x-ms-error-code": { + "x-ms-client-name": "ErrorCode", + "type": "string" + } + }, + "schema": { + "$ref": "#/definitions/StorageError" + } + } + } + }, + "parameters": [ + { + "$ref": "#/parameters/ContainerName" + }, + { + "$ref": "#/parameters/Blob" + }, + { + "name": "comp", + "description": "comp", + "in": "query", + "required": true, + "type": "string", + "enum": [ + "immutabilityPolicies" + ] + } + ] + }, + "/{containerName}/{blob}?comp=legalhold": { + "put": { + "tags": [ + "blob" + ], + "operationId": "Blob_SetLegalHold", + "description": "The Set Legal Hold operation sets a legal hold on the blob.", + "parameters": [ + { + "$ref": "#/parameters/Timeout" + }, + { + "$ref": "#/parameters/ApiVersionParameter" + }, + { + "$ref": "#/parameters/ClientRequestId" + }, + { + "$ref": "#/parameters/LegalHoldRequired" + } + ], + "responses": { + "200": { + "description": "The legal hold was successfully set on the blob.", + "headers": { + "x-ms-client-request-id": { + "x-ms-client-name": "ClientRequestId", + "type": "string", + "description": "If a client request id header is sent in the request, this header will be present in the response with the same value." + }, + "x-ms-request-id": { + "x-ms-client-name": "RequestId", + "type": "string", + "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." + }, + "x-ms-version": { + "x-ms-client-name": "Version", + "type": "string", + "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." + }, + "Date": { + "type": "string", + "format": "date-time-rfc1123", + "description": "UTC date/time value generated by the service that indicates the time at which the response was initiated" + }, + "x-ms-legal-hold": { + "x-ms-client-name": "LegalHold", + "type": "boolean", + "description": "Indicates if the blob has a legal hold." + } + } + }, + "default": { + "description": "Failure", + "headers": { + "x-ms-error-code": { + "x-ms-client-name": "ErrorCode", + "type": "string" + } + }, + "schema": { + "$ref": "#/definitions/StorageError" + } + } + } + }, + "parameters": [ + { + "$ref": "#/parameters/ContainerName" + }, + { + "$ref": "#/parameters/Blob" + }, + { + "name": "comp", + "description": "comp", + "in": "query", + "required": true, + "type": "string", + "enum": [ + "legalhold" + ] + } + ] + }, + "/{containerName}/{blob}?comp=metadata": { + "put": { + "tags": [ + "blob" + ], + "operationId": "Blob_SetMetadata", + "description": "The Set Blob Metadata operation sets user-defined metadata for the specified blob as one or more name-value pairs", + "parameters": [ + { + "$ref": "#/parameters/Timeout" + }, + { + "$ref": "#/parameters/Metadata" + }, + { + "$ref": "#/parameters/LeaseIdOptional" + }, + { + "$ref": "#/parameters/EncryptionKey" + }, + { + "$ref": "#/parameters/EncryptionKeySha256" + }, + { + "$ref": "#/parameters/EncryptionAlgorithm" + }, + { + "$ref": "#/parameters/EncryptionScope" + }, + { + "$ref": "#/parameters/IfModifiedSince" + }, + { + "$ref": "#/parameters/IfUnmodifiedSince" + }, + { + "$ref": "#/parameters/IfMatch" + }, + { + "$ref": "#/parameters/IfNoneMatch" + }, + { + "$ref": "#/parameters/IfTags" + }, + { + "$ref": "#/parameters/ApiVersionParameter" + }, + { + "$ref": "#/parameters/ClientRequestId" + } + ], + "responses": { + "200": { + "description": "The metadata was set successfully.", + "headers": { + "ETag": { + "type": "string", + "description": "The ETag contains a value that you can use to perform operations conditionally. If the request version is 2011-08-18 or newer, the ETag value will be in quotes." + }, + "Last-Modified": { + "type": "string", + "format": "date-time-rfc1123", + "description": "Returns the date and time the container was last modified. Any operation that modifies the blob, including an update of the blob's metadata or properties, changes the last-modified time of the blob." + }, + "x-ms-client-request-id": { + "x-ms-client-name": "ClientRequestId", + "type": "string", + "description": "If a client request id header is sent in the request, this header will be present in the response with the same value." + }, + "x-ms-request-id": { + "x-ms-client-name": "RequestId", + "type": "string", + "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." + }, + "x-ms-version": { + "x-ms-client-name": "Version", + "type": "string", + "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." + }, + "x-ms-version-id": { + "x-ms-client-name": "VersionId", + "type": "string", + "description": "A DateTime value returned by the service that uniquely identifies the blob. The value of this header indicates the blob version, and may be used in subsequent requests to access this version of the blob." + }, + "Date": { + "type": "string", + "format": "date-time-rfc1123", + "description": "UTC date/time value generated by the service that indicates the time at which the response was initiated" + }, + "x-ms-request-server-encrypted": { + "x-ms-client-name": "IsServerEncrypted", + "type": "boolean", + "description": "The value of this header is set to true if the contents of the request are successfully encrypted using the specified algorithm, and false otherwise." + }, + "x-ms-encryption-key-sha256": { + "x-ms-client-name": "EncryptionKeySha256", + "type": "string", + "description": "The SHA-256 hash of the encryption key used to encrypt the metadata. This header is only returned when the metadata was encrypted with a customer-provided key." + }, + "x-ms-encryption-scope": { + "x-ms-client-name": "EncryptionScope", + "type": "string", + "description": "Returns the name of the encryption scope used to encrypt the blob contents and application metadata. Note that the absence of this header implies use of the default account encryption scope." + } + } + }, + "default": { + "description": "Failure", + "headers": { + "x-ms-error-code": { + "x-ms-client-name": "ErrorCode", + "type": "string" + } + }, + "schema": { + "$ref": "#/definitions/StorageError" + } + } + } + }, + "parameters": [ + { + "$ref": "#/parameters/ContainerName" + }, + { + "$ref": "#/parameters/Blob" + }, + { + "name": "comp", + "description": "comp", + "in": "query", + "required": true, + "type": "string", + "enum": [ + "metadata" + ] + } + ] + }, + "/{containerName}/{blob}?comp=lease&acquire": { + "put": { + "tags": [ + "blob" + ], + "operationId": "Blob_AcquireLease", + "description": "[Update] The Lease Blob operation establishes and manages a lock on a blob for write and delete operations", + "parameters": [ + { + "$ref": "#/parameters/Timeout" + }, + { + "$ref": "#/parameters/LeaseDuration" + }, + { + "$ref": "#/parameters/ProposedLeaseIdOptional" + }, + { + "$ref": "#/parameters/IfModifiedSince" + }, + { + "$ref": "#/parameters/IfUnmodifiedSince" + }, + { + "$ref": "#/parameters/IfMatch" + }, + { + "$ref": "#/parameters/IfNoneMatch" + }, + { + "$ref": "#/parameters/IfTags" + }, + { + "$ref": "#/parameters/ApiVersionParameter" + }, + { + "$ref": "#/parameters/ClientRequestId" + } + ], + "responses": { + "201": { + "description": "The Acquire operation completed successfully.", + "headers": { + "ETag": { + "type": "string", + "description": "The ETag contains a value that you can use to perform operations conditionally. If the request version is 2011-08-18 or newer, the ETag value will be in quotes." + }, + "Last-Modified": { + "type": "string", + "format": "date-time-rfc1123", + "description": "Returns the date and time the blob was last modified. Any operation that modifies the blob, including an update of the blob's metadata or properties, changes the last-modified time of the blob." + }, + "x-ms-lease-id": { + "x-ms-client-name": "LeaseId", + "type": "string", + "description": "Uniquely identifies a blobs' lease" + }, + "x-ms-client-request-id": { + "x-ms-client-name": "ClientRequestId", + "type": "string", + "description": "If a client request id header is sent in the request, this header will be present in the response with the same value." + }, + "x-ms-request-id": { + "x-ms-client-name": "RequestId", + "type": "string", + "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." + }, + "x-ms-version": { + "x-ms-client-name": "Version", + "type": "string", + "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." + }, + "Date": { + "type": "string", + "format": "date-time-rfc1123", + "description": "UTC date/time value generated by the service that indicates the time at which the response was initiated" + } + } + }, + "default": { + "description": "Failure", + "headers": { + "x-ms-error-code": { + "x-ms-client-name": "ErrorCode", + "type": "string" + } + }, + "schema": { + "$ref": "#/definitions/StorageError" + } + } + } + }, + "parameters": [ + { + "$ref": "#/parameters/ContainerName" + }, + { + "$ref": "#/parameters/Blob" + }, + { + "name": "comp", + "description": "comp", + "in": "query", + "required": true, + "type": "string", + "enum": [ + "lease" + ] + }, + { + "name": "x-ms-lease-action", + "x-ms-client-name": "action", + "in": "header", + "required": true, + "type": "string", + "enum": [ + "acquire" + ], + "x-ms-enum": { + "name": "LeaseAction", + "modelAsString": false + }, + "x-ms-parameter-location": "method", + "description": "Describes what lease action to take." + } + ] + }, + "/{containerName}/{blob}?comp=lease&release": { + "put": { + "tags": [ + "blob" + ], + "operationId": "Blob_ReleaseLease", + "description": "[Update] The Lease Blob operation establishes and manages a lock on a blob for write and delete operations", + "parameters": [ + { + "$ref": "#/parameters/Timeout" + }, + { + "$ref": "#/parameters/LeaseIdRequired" + }, + { + "$ref": "#/parameters/IfModifiedSince" + }, + { + "$ref": "#/parameters/IfUnmodifiedSince" + }, + { + "$ref": "#/parameters/IfMatch" + }, + { + "$ref": "#/parameters/IfNoneMatch" + }, + { + "$ref": "#/parameters/IfTags" + }, + { + "$ref": "#/parameters/ApiVersionParameter" + }, + { + "$ref": "#/parameters/ClientRequestId" + } + ], + "responses": { + "200": { + "description": "The Release operation completed successfully.", + "headers": { + "ETag": { + "type": "string", + "description": "The ETag contains a value that you can use to perform operations conditionally. If the request version is 2011-08-18 or newer, the ETag value will be in quotes." + }, + "Last-Modified": { + "type": "string", + "format": "date-time-rfc1123", + "description": "Returns the date and time the blob was last modified. Any operation that modifies the blob, including an update of the blob's metadata or properties, changes the last-modified time of the blob." + }, + "x-ms-client-request-id": { + "x-ms-client-name": "ClientRequestId", + "type": "string", + "description": "If a client request id header is sent in the request, this header will be present in the response with the same value." + }, + "x-ms-request-id": { + "x-ms-client-name": "RequestId", + "type": "string", + "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." + }, + "x-ms-version": { + "x-ms-client-name": "Version", + "type": "string", + "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." + }, + "Date": { + "type": "string", + "format": "date-time-rfc1123", + "description": "UTC date/time value generated by the service that indicates the time at which the response was initiated" + } + } + }, + "default": { + "description": "Failure", + "headers": { + "x-ms-error-code": { + "x-ms-client-name": "ErrorCode", + "type": "string" + } + }, + "schema": { + "$ref": "#/definitions/StorageError" + } + } + } + }, + "parameters": [ + { + "$ref": "#/parameters/ContainerName" + }, + { + "$ref": "#/parameters/Blob" + }, + { + "name": "comp", + "description": "comp", + "in": "query", + "required": true, + "type": "string", + "enum": [ + "lease" + ] + }, + { + "name": "x-ms-lease-action", + "x-ms-client-name": "action", + "in": "header", + "required": true, + "type": "string", + "enum": [ + "release" + ], + "x-ms-enum": { + "name": "LeaseAction", + "modelAsString": false + }, + "x-ms-parameter-location": "method", + "description": "Describes what lease action to take." + } + ] + }, + "/{containerName}/{blob}?comp=lease&renew": { + "put": { + "tags": [ + "blob" + ], + "operationId": "Blob_RenewLease", + "description": "[Update] The Lease Blob operation establishes and manages a lock on a blob for write and delete operations", + "parameters": [ + { + "$ref": "#/parameters/Timeout" + }, + { + "$ref": "#/parameters/LeaseIdRequired" + }, + { + "$ref": "#/parameters/IfModifiedSince" + }, + { + "$ref": "#/parameters/IfUnmodifiedSince" + }, + { + "$ref": "#/parameters/IfMatch" + }, + { + "$ref": "#/parameters/IfNoneMatch" + }, + { + "$ref": "#/parameters/IfTags" + }, + { + "$ref": "#/parameters/ApiVersionParameter" + }, + { + "$ref": "#/parameters/ClientRequestId" + } + ], + "responses": { + "200": { + "description": "The Renew operation completed successfully.", + "headers": { + "ETag": { + "type": "string", + "description": "The ETag contains a value that you can use to perform operations conditionally. If the request version is 2011-08-18 or newer, the ETag value will be in quotes." + }, + "Last-Modified": { + "type": "string", + "format": "date-time-rfc1123", + "description": "Returns the date and time the blob was last modified. Any operation that modifies the blob, including an update of the blob's metadata or properties, changes the last-modified time of the blob." + }, + "x-ms-lease-id": { + "x-ms-client-name": "LeaseId", + "type": "string", + "description": "Uniquely identifies a blobs' lease" + }, + "x-ms-client-request-id": { + "x-ms-client-name": "ClientRequestId", + "type": "string", + "description": "If a client request id header is sent in the request, this header will be present in the response with the same value." + }, + "x-ms-request-id": { + "x-ms-client-name": "RequestId", + "type": "string", + "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." + }, + "x-ms-version": { + "x-ms-client-name": "Version", + "type": "string", + "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." + }, + "Date": { + "type": "string", + "format": "date-time-rfc1123", + "description": "UTC date/time value generated by the service that indicates the time at which the response was initiated" + } + } + }, + "default": { + "description": "Failure", + "headers": { + "x-ms-error-code": { + "x-ms-client-name": "ErrorCode", + "type": "string" + } + }, + "schema": { + "$ref": "#/definitions/StorageError" + } + } + } + }, + "parameters": [ + { + "$ref": "#/parameters/ContainerName" + }, + { + "$ref": "#/parameters/Blob" + }, + { + "name": "comp", + "description": "comp", + "in": "query", + "required": true, + "type": "string", + "enum": [ + "lease" + ] + }, + { + "name": "x-ms-lease-action", + "x-ms-client-name": "action", + "in": "header", + "required": true, + "type": "string", + "enum": [ + "renew" + ], + "x-ms-enum": { + "name": "LeaseAction", + "modelAsString": false + }, + "x-ms-parameter-location": "method", + "description": "Describes what lease action to take." + } + ] + }, + "/{containerName}/{blob}?comp=lease&change": { + "put": { + "tags": [ + "blob" + ], + "operationId": "Blob_ChangeLease", + "description": "[Update] The Lease Blob operation establishes and manages a lock on a blob for write and delete operations", + "parameters": [ + { + "$ref": "#/parameters/Timeout" + }, + { + "$ref": "#/parameters/LeaseIdRequired" + }, + { + "$ref": "#/parameters/ProposedLeaseIdRequired" + }, + { + "$ref": "#/parameters/IfModifiedSince" + }, + { + "$ref": "#/parameters/IfUnmodifiedSince" + }, + { + "$ref": "#/parameters/IfMatch" + }, + { + "$ref": "#/parameters/IfNoneMatch" + }, + { + "$ref": "#/parameters/IfTags" + }, + { + "$ref": "#/parameters/ApiVersionParameter" + }, + { + "$ref": "#/parameters/ClientRequestId" + } + ], + "responses": { + "200": { + "description": "The Change operation completed successfully.", + "headers": { + "ETag": { + "type": "string", + "description": "The ETag contains a value that you can use to perform operations conditionally. If the request version is 2011-08-18 or newer, the ETag value will be in quotes." + }, + "Last-Modified": { + "type": "string", + "format": "date-time-rfc1123", + "description": "Returns the date and time the blob was last modified. Any operation that modifies the blob, including an update of the blob's metadata or properties, changes the last-modified time of the blob." + }, + "x-ms-client-request-id": { + "x-ms-client-name": "ClientRequestId", + "type": "string", + "description": "If a client request id header is sent in the request, this header will be present in the response with the same value." + }, + "x-ms-request-id": { + "x-ms-client-name": "RequestId", + "type": "string", + "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." + }, + "x-ms-lease-id": { + "x-ms-client-name": "LeaseId", + "type": "string", + "description": "Uniquely identifies a blobs' lease" + }, + "x-ms-version": { + "x-ms-client-name": "Version", + "type": "string", + "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." + }, + "Date": { + "type": "string", + "format": "date-time-rfc1123", + "description": "UTC date/time value generated by the service that indicates the time at which the response was initiated" + } + } + }, + "default": { + "description": "Failure", + "headers": { + "x-ms-error-code": { + "x-ms-client-name": "ErrorCode", + "type": "string" + } + }, + "schema": { + "$ref": "#/definitions/StorageError" + } + } + } + }, + "parameters": [ + { + "$ref": "#/parameters/ContainerName" + }, + { + "$ref": "#/parameters/Blob" + }, + { + "name": "comp", + "description": "comp", + "in": "query", + "required": true, + "type": "string", + "enum": [ + "lease" + ] + }, + { + "name": "x-ms-lease-action", + "x-ms-client-name": "action", + "in": "header", + "required": true, + "type": "string", + "enum": [ + "change" + ], + "x-ms-enum": { + "name": "LeaseAction", + "modelAsString": false + }, + "x-ms-parameter-location": "method", + "description": "Describes what lease action to take." + } + ] + }, + "/{containerName}/{blob}?comp=lease&break": { + "put": { + "tags": [ + "blob" + ], + "operationId": "Blob_BreakLease", + "description": "[Update] The Lease Blob operation establishes and manages a lock on a blob for write and delete operations", + "parameters": [ + { + "$ref": "#/parameters/Timeout" + }, + { + "$ref": "#/parameters/LeaseBreakPeriod" + }, + { + "$ref": "#/parameters/IfModifiedSince" + }, + { + "$ref": "#/parameters/IfUnmodifiedSince" + }, + { + "$ref": "#/parameters/IfMatch" + }, + { + "$ref": "#/parameters/IfNoneMatch" + }, + { + "$ref": "#/parameters/IfTags" + }, + { + "$ref": "#/parameters/ApiVersionParameter" + }, + { + "$ref": "#/parameters/ClientRequestId" + } + ], + "responses": { + "202": { + "description": "The Break operation completed successfully.", + "headers": { + "ETag": { + "type": "string", + "description": "The ETag contains a value that you can use to perform operations conditionally. If the request version is 2011-08-18 or newer, the ETag value will be in quotes." + }, + "Last-Modified": { + "type": "string", + "format": "date-time-rfc1123", + "description": "Returns the date and time the blob was last modified. Any operation that modifies the blob, including an update of the blob's metadata or properties, changes the last-modified time of the blob." + }, + "x-ms-lease-time": { + "x-ms-client-name": "LeaseTime", + "type": "integer", + "description": "Approximate time remaining in the lease period, in seconds." + }, + "x-ms-client-request-id": { + "x-ms-client-name": "ClientRequestId", + "type": "string", + "description": "If a client request id header is sent in the request, this header will be present in the response with the same value." + }, + "x-ms-request-id": { + "x-ms-client-name": "RequestId", + "type": "string", + "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." + }, + "x-ms-version": { + "x-ms-client-name": "Version", + "type": "string", + "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." + }, + "Date": { + "type": "string", + "format": "date-time-rfc1123", + "description": "UTC date/time value generated by the service that indicates the time at which the response was initiated" + } + } + }, + "default": { + "description": "Failure", + "headers": { + "x-ms-error-code": { + "x-ms-client-name": "ErrorCode", + "type": "string" + } + }, + "schema": { + "$ref": "#/definitions/StorageError" + } + } + } + }, + "parameters": [ + { + "$ref": "#/parameters/ContainerName" + }, + { + "$ref": "#/parameters/Blob" + }, + { + "name": "comp", + "description": "comp", + "in": "query", + "required": true, + "type": "string", + "enum": [ + "lease" + ] + }, + { + "name": "x-ms-lease-action", + "x-ms-client-name": "action", + "in": "header", + "required": true, + "type": "string", + "enum": [ + "break" + ], + "x-ms-enum": { + "name": "LeaseAction", + "modelAsString": false + }, + "x-ms-parameter-location": "method", + "description": "Describes what lease action to take." + } + ] + }, + "/{containerName}/{blob}?comp=snapshot": { + "put": { + "tags": [ + "blob" + ], + "operationId": "Blob_CreateSnapshot", + "description": "The Create Snapshot operation creates a read-only snapshot of a blob", + "parameters": [ + { + "$ref": "#/parameters/Timeout" + }, + { + "$ref": "#/parameters/Metadata" + }, + { + "$ref": "#/parameters/EncryptionKey" + }, + { + "$ref": "#/parameters/EncryptionKeySha256" + }, + { + "$ref": "#/parameters/EncryptionAlgorithm" + }, + { + "$ref": "#/parameters/EncryptionScope" + }, + { + "$ref": "#/parameters/IfModifiedSince" + }, + { + "$ref": "#/parameters/IfUnmodifiedSince" + }, + { + "$ref": "#/parameters/IfMatch" + }, + { + "$ref": "#/parameters/IfNoneMatch" + }, + { + "$ref": "#/parameters/IfTags" + }, + { + "$ref": "#/parameters/LeaseIdOptional" + }, + { + "$ref": "#/parameters/ApiVersionParameter" + }, + { + "$ref": "#/parameters/ClientRequestId" + } + ], + "responses": { + "201": { + "description": "The snaptshot was taken successfully.", + "headers": { + "x-ms-snapshot": { + "x-ms-client-name": "Snapshot", + "type": "string", + "description": "Uniquely identifies the snapshot and indicates the snapshot version. It may be used in subsequent requests to access the snapshot" + }, + "ETag": { + "type": "string", + "description": "The ETag contains a value that you can use to perform operations conditionally. If the request version is 2011-08-18 or newer, the ETag value will be in quotes." + }, + "Last-Modified": { + "type": "string", + "format": "date-time-rfc1123", + "description": "Returns the date and time the container was last modified. Any operation that modifies the blob, including an update of the blob's metadata or properties, changes the last-modified time of the blob." + }, + "x-ms-client-request-id": { + "x-ms-client-name": "ClientRequestId", + "type": "string", + "description": "If a client request id header is sent in the request, this header will be present in the response with the same value." + }, + "x-ms-request-id": { + "x-ms-client-name": "RequestId", + "type": "string", + "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." + }, + "x-ms-version": { + "x-ms-client-name": "Version", + "type": "string", + "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." + }, + "x-ms-version-id": { + "x-ms-client-name": "VersionId", + "type": "string", + "description": "A DateTime value returned by the service that uniquely identifies the blob. The value of this header indicates the blob version, and may be used in subsequent requests to access this version of the blob." + }, + "Date": { + "type": "string", + "format": "date-time-rfc1123", + "description": "UTC date/time value generated by the service that indicates the time at which the response was initiated" + }, + "x-ms-request-server-encrypted": { + "x-ms-client-name": "IsServerEncrypted", + "type": "boolean", + "description": "True if the contents of the request are successfully encrypted using the specified algorithm, and false otherwise. For a snapshot request, this header is set to true when metadata was provided in the request and encrypted with a customer-provided key." + } + } + }, + "default": { + "description": "Failure", + "headers": { + "x-ms-error-code": { + "x-ms-client-name": "ErrorCode", + "type": "string" + } + }, + "schema": { + "$ref": "#/definitions/StorageError" + } + } + } + }, + "parameters": [ + { + "$ref": "#/parameters/ContainerName" + }, + { + "$ref": "#/parameters/Blob" + }, + { + "name": "comp", + "description": "comp", + "in": "query", + "required": true, + "type": "string", + "enum": [ + "snapshot" + ] + } + ] + }, + "/{containerName}/{blob}?comp=copy": { + "put": { + "tags": [ + "blob" + ], + "operationId": "Blob_StartCopyFromURL", + "description": "The Start Copy From URL operation copies a blob or an internet resource to a new blob.", + "parameters": [ + { + "$ref": "#/parameters/Timeout" + }, + { + "$ref": "#/parameters/Metadata" + }, + { + "$ref": "#/parameters/AccessTierOptional" + }, + { + "$ref": "#/parameters/RehydratePriority" + }, + { + "$ref": "#/parameters/SourceIfModifiedSince" + }, + { + "$ref": "#/parameters/SourceIfUnmodifiedSince" + }, + { + "$ref": "#/parameters/SourceIfMatch" + }, + { + "$ref": "#/parameters/SourceIfNoneMatch" + }, + { + "$ref": "#/parameters/SourceIfTags" + }, + { + "$ref": "#/parameters/IfModifiedSince" + }, + { + "$ref": "#/parameters/IfUnmodifiedSince" + }, + { + "$ref": "#/parameters/IfMatch" + }, + { + "$ref": "#/parameters/IfNoneMatch" + }, + { + "$ref": "#/parameters/IfTags" + }, + { + "$ref": "#/parameters/CopySource" + }, + { + "$ref": "#/parameters/LeaseIdOptional" + }, + { + "$ref": "#/parameters/ApiVersionParameter" + }, + { + "$ref": "#/parameters/ClientRequestId" + }, + { + "$ref": "#/parameters/BlobTagsHeader" + }, + { + "$ref": "#/parameters/SealBlob" + }, + { + "$ref": "#/parameters/ImmutabilityPolicyExpiry" + }, + { + "$ref": "#/parameters/ImmutabilityPolicyMode" + }, + { + "$ref": "#/parameters/LegalHoldOptional" + } + ], + "responses": { + "202": { + "description": "The copy blob has been accepted with the specified copy status.", + "headers": { + "ETag": { + "type": "string", + "description": "The ETag contains a value that you can use to perform operations conditionally. If the request version is 2011-08-18 or newer, the ETag value will be in quotes." + }, + "Last-Modified": { + "type": "string", + "format": "date-time-rfc1123", + "description": "Returns the date and time the container was last modified. Any operation that modifies the blob, including an update of the blob's metadata or properties, changes the last-modified time of the blob." + }, + "x-ms-client-request-id": { + "x-ms-client-name": "ClientRequestId", + "type": "string", + "description": "If a client request id header is sent in the request, this header will be present in the response with the same value." + }, + "x-ms-request-id": { + "x-ms-client-name": "RequestId", + "type": "string", + "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." + }, + "x-ms-version": { + "x-ms-client-name": "Version", + "type": "string", + "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." + }, + "x-ms-version-id": { + "x-ms-client-name": "VersionId", + "type": "string", + "description": "A DateTime value returned by the service that uniquely identifies the blob. The value of this header indicates the blob version, and may be used in subsequent requests to access this version of the blob." + }, + "Date": { + "type": "string", + "format": "date-time-rfc1123", + "description": "UTC date/time value generated by the service that indicates the time at which the response was initiated" + }, + "x-ms-copy-id": { + "x-ms-client-name": "CopyId", + "type": "string", + "description": "String identifier for this copy operation. Use with Get Blob Properties to check the status of this copy operation, or pass to Abort Copy Blob to abort a pending copy." + }, + "x-ms-copy-status": { + "x-ms-client-name": "CopyStatus", + "description": "State of the copy operation identified by x-ms-copy-id.", + "type": "string", + "enum": [ + "pending", + "success", + "aborted", + "failed" + ], + "x-ms-enum": { + "name": "CopyStatusType", + "modelAsString": false + } + } + } + }, + "default": { + "description": "Failure", + "headers": { + "x-ms-error-code": { + "x-ms-client-name": "ErrorCode", + "type": "string" + } + }, + "schema": { + "$ref": "#/definitions/StorageError" + } + } + } + }, + "parameters": [ + { + "$ref": "#/parameters/ContainerName" + }, + { + "$ref": "#/parameters/Blob" + } + ] + }, + "/{containerName}/{blob}?comp=copy&sync": { + "put": { + "tags": [ + "blob" + ], + "operationId": "Blob_CopyFromURL", + "description": "The Copy From URL operation copies a blob or an internet resource to a new blob. It will not return a response until the copy is complete.", + "parameters": [ + { + "$ref": "#/parameters/Timeout" + }, + { + "$ref": "#/parameters/Metadata" + }, + { + "$ref": "#/parameters/AccessTierOptional" + }, + { + "$ref": "#/parameters/SourceIfModifiedSince" + }, + { + "$ref": "#/parameters/SourceIfUnmodifiedSince" + }, + { + "$ref": "#/parameters/SourceIfMatch" + }, + { + "$ref": "#/parameters/SourceIfNoneMatch" + }, + { + "$ref": "#/parameters/IfModifiedSince" + }, + { + "$ref": "#/parameters/IfUnmodifiedSince" + }, + { + "$ref": "#/parameters/IfMatch" + }, + { + "$ref": "#/parameters/IfNoneMatch" + }, + { + "$ref": "#/parameters/IfTags" + }, + { + "$ref": "#/parameters/CopySource" + }, + { + "$ref": "#/parameters/LeaseIdOptional" + }, + { + "$ref": "#/parameters/ApiVersionParameter" + }, + { + "$ref": "#/parameters/ClientRequestId" + }, + { + "$ref": "#/parameters/SourceContentMD5" + }, + { + "$ref": "#/parameters/BlobTagsHeader" + }, + { + "$ref": "#/parameters/ImmutabilityPolicyExpiry" + }, + { + "$ref": "#/parameters/ImmutabilityPolicyMode" + }, + { + "$ref": "#/parameters/LegalHoldOptional" + }, + { + "$ref": "#/parameters/CopySourceAuthorization" + }, + { + "$ref": "#/parameters/EncryptionScope" + }, + { + "$ref": "#/parameters/CopySourceTags" + } + ], + "responses": { + "202": { + "description": "The copy has completed.", + "headers": { + "ETag": { + "type": "string", + "description": "The ETag contains a value that you can use to perform operations conditionally. If the request version is 2011-08-18 or newer, the ETag value will be in quotes." + }, + "Last-Modified": { + "type": "string", + "format": "date-time-rfc1123", + "description": "Returns the date and time the container was last modified. Any operation that modifies the blob, including an update of the blob's metadata or properties, changes the last-modified time of the blob." + }, + "x-ms-client-request-id": { + "x-ms-client-name": "ClientRequestId", + "type": "string", + "description": "If a client request id header is sent in the request, this header will be present in the response with the same value." + }, + "x-ms-request-id": { + "x-ms-client-name": "RequestId", + "type": "string", + "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." + }, + "x-ms-version": { + "x-ms-client-name": "Version", + "type": "string", + "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." + }, + "x-ms-version-id": { + "x-ms-client-name": "VersionId", + "type": "string", + "description": "A DateTime value returned by the service that uniquely identifies the blob. The value of this header indicates the blob version, and may be used in subsequent requests to access this version of the blob." + }, + "Date": { + "type": "string", + "format": "date-time-rfc1123", + "description": "UTC date/time value generated by the service that indicates the time at which the response was initiated" + }, + "x-ms-copy-id": { + "x-ms-client-name": "CopyId", + "type": "string", + "description": "String identifier for this copy operation." + }, + "x-ms-copy-status": { + "x-ms-client-name": "CopyStatus", + "description": "State of the copy operation identified by x-ms-copy-id.", + "type": "string", + "enum": [ + "success" + ], + "x-ms-enum": { + "name": "SyncCopyStatusType", + "modelAsString": false + } + }, + "Content-MD5": { + "type": "string", + "format": "byte", + "description": "This response header is returned so that the client can check for the integrity of the copied content. This header is only returned if the source content MD5 was specified." + }, + "x-ms-content-crc64": { + "type": "string", + "format": "byte", + "description": "This response header is returned so that the client can check for the integrity of the copied content." + }, + "x-ms-encryption-scope": { + "x-ms-client-name": "EncryptionScope", + "type": "string", + "description": "Returns the name of the encryption scope used to encrypt the blob contents and application metadata. Note that the absence of this header implies use of the default account encryption scope." + } + } + }, + "default": { + "description": "Failure", + "headers": { + "x-ms-error-code": { + "x-ms-client-name": "ErrorCode", + "type": "string" + } + }, + "schema": { + "$ref": "#/definitions/StorageError" + } + } + } + }, + "parameters": [ + { + "$ref": "#/parameters/ContainerName" + }, + { + "$ref": "#/parameters/Blob" + }, + { + "name": "x-ms-requires-sync", + "description": "This header indicates that this is a synchronous Copy Blob From URL instead of a Asynchronous Copy Blob.", + "in": "header", + "required": true, + "type": "string", + "enum": [ + "true" + ] + } + ] + }, + "/{containerName}/{blob}?comp=copy©id": { + "put": { + "tags": [ + "blob" + ], + "operationId": "Blob_AbortCopyFromURL", + "description": "The Abort Copy From URL operation aborts a pending Copy From URL operation, and leaves a destination blob with zero length and full metadata.", + "parameters": [ + { + "$ref": "#/parameters/CopyId" + }, + { + "$ref": "#/parameters/Timeout" + }, + { + "$ref": "#/parameters/LeaseIdOptional" + }, + { + "$ref": "#/parameters/ApiVersionParameter" + }, + { + "$ref": "#/parameters/ClientRequestId" + } + ], + "responses": { + "204": { + "description": "The delete request was accepted and the blob will be deleted.", + "headers": { + "x-ms-client-request-id": { + "x-ms-client-name": "ClientRequestId", + "type": "string", + "description": "If a client request id header is sent in the request, this header will be present in the response with the same value." + }, + "x-ms-request-id": { + "x-ms-client-name": "RequestId", + "type": "string", + "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." + }, + "x-ms-version": { + "x-ms-client-name": "Version", + "type": "string", + "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." + }, + "Date": { + "type": "string", + "format": "date-time-rfc1123", + "description": "UTC date/time value generated by the service that indicates the time at which the response was initiated" + } + } + }, + "default": { + "description": "Failure", + "headers": { + "x-ms-error-code": { + "x-ms-client-name": "ErrorCode", + "type": "string" + } + }, + "schema": { + "$ref": "#/definitions/StorageError" + } + } + } + }, + "parameters": [ + { + "$ref": "#/parameters/ContainerName" + }, + { + "$ref": "#/parameters/Blob" + }, + { + "name": "comp", + "description": "comp", + "in": "query", + "required": true, + "type": "string", + "enum": [ + "copy" + ] + }, + { + "name": "x-ms-copy-action", + "description": "Copy action.", + "x-ms-client-name": "copyActionAbortConstant", + "in": "header", + "required": true, + "type": "string", + "enum": [ + "abort" + ], + "x-ms-parameter-location": "method" + } + ] + }, + "/{containerName}/{blob}?comp=tier": { + "put": { + "tags": [ + "blobs" + ], + "operationId": "Blob_SetTier", + "description": "The Set Tier operation sets the tier on a blob. The operation is allowed on a page blob in a premium storage account and on a block blob in a blob storage account (locally redundant storage only). A premium page blob's tier determines the allowed size, IOPS, and bandwidth of the blob. A block blob's tier determines Hot/Cool/Archive storage type. This operation does not update the blob's ETag.", + "parameters": [ + { + "$ref": "#/parameters/Snapshot" + }, + { + "$ref": "#/parameters/VersionId" + }, + { + "$ref": "#/parameters/Timeout" + }, + { + "$ref": "#/parameters/AccessTierRequired" + }, + { + "$ref": "#/parameters/RehydratePriority" + }, + { + "$ref": "#/parameters/ApiVersionParameter" + }, + { + "$ref": "#/parameters/ClientRequestId" + }, + { + "$ref": "#/parameters/LeaseIdOptional" + }, + { + "$ref": "#/parameters/IfTags" + } + ], + "responses": { + "200": { + "description": "The new tier will take effect immediately.", + "headers": { + "x-ms-client-request-id": { + "x-ms-client-name": "ClientRequestId", + "type": "string", + "description": "If a client request id header is sent in the request, this header will be present in the response with the same value." + }, + "x-ms-request-id": { + "x-ms-client-name": "RequestId", + "type": "string", + "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." + }, + "x-ms-version": { + "x-ms-client-name": "Version", + "type": "string", + "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and newer." + } + } + }, + "202": { + "description": "The transition to the new tier is pending.", + "headers": { + "x-ms-client-request-id": { + "x-ms-client-name": "ClientRequestId", + "type": "string", + "description": "If a client request id header is sent in the request, this header will be present in the response with the same value." + }, + "x-ms-request-id": { + "x-ms-client-name": "RequestId", + "type": "string", + "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." + }, + "x-ms-version": { + "x-ms-client-name": "Version", + "type": "string", + "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and newer." + } + } + }, + "default": { + "description": "Failure", + "headers": { + "x-ms-error-code": { + "x-ms-client-name": "ErrorCode", + "type": "string" + } + }, + "schema": { + "$ref": "#/definitions/StorageError" + } + } + } + }, + "parameters": [ + { + "$ref": "#/parameters/ContainerName" + }, + { + "$ref": "#/parameters/Blob" + }, + { + "name": "comp", + "description": "comp", + "in": "query", + "required": true, + "type": "string", + "enum": [ + "tier" + ] + } + ] + }, + "/{containerName}/{blob}?restype=account&comp=properties": { + "get": { + "tags": [ + "blob" + ], + "operationId": "Blob_GetAccountInfo", + "description": "Returns the sku name and account kind ", + "parameters": [ + { + "$ref": "#/parameters/ApiVersionParameter" + } + ], + "responses": { + "200": { + "description": "Success (OK)", + "headers": { + "x-ms-client-request-id": { + "x-ms-client-name": "ClientRequestId", + "type": "string", + "description": "If a client request id header is sent in the request, this header will be present in the response with the same value." + }, + "x-ms-request-id": { + "x-ms-client-name": "RequestId", + "type": "string", + "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." + }, + "x-ms-version": { + "x-ms-client-name": "Version", + "type": "string", + "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." + }, + "Date": { + "type": "string", + "format": "date-time-rfc1123", + "description": "UTC date/time value generated by the service that indicates the time at which the response was initiated" + }, + "x-ms-sku-name": { + "x-ms-client-name": "SkuName", + "type": "string", + "enum": [ + "Standard_LRS", + "Standard_GRS", + "Standard_RAGRS", + "Standard_ZRS", + "Premium_LRS" + ], + "x-ms-enum": { + "name": "SkuName", + "modelAsString": false + }, + "description": "Identifies the sku name of the account" + }, + "x-ms-account-kind": { + "x-ms-client-name": "AccountKind", + "type": "string", + "enum": [ + "Storage", + "BlobStorage", + "StorageV2", + "FileStorage", + "BlockBlobStorage" + ], + "x-ms-enum": { + "name": "AccountKind", + "modelAsString": false + }, + "description": "Identifies the account kind" + } + } + }, + "default": { + "description": "Failure", + "headers": { + "x-ms-error-code": { + "x-ms-client-name": "ErrorCode", + "type": "string" + } + }, + "schema": { + "$ref": "#/definitions/StorageError" + } + } + } + }, + "head": { + "tags": [ + "blob" + ], + "operationId": "Blob_GetAccountInfoWithHead", + "description": "Returns the sku name and account kind ", + "parameters": [ + { + "$ref": "#/parameters/ApiVersionParameter" + } + ], + "responses": { + "200": { + "description": "Success (OK)", + "headers": { + "x-ms-client-request-id": { + "x-ms-client-name": "ClientRequestId", + "type": "string", + "description": "If a client request id header is sent in the request, this header will be present in the response with the same value." + }, + "x-ms-request-id": { + "x-ms-client-name": "RequestId", + "type": "string", + "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." + }, + "x-ms-version": { + "x-ms-client-name": "Version", + "type": "string", + "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." + }, + "Date": { + "type": "string", + "format": "date-time-rfc1123", + "description": "UTC date/time value generated by the service that indicates the time at which the response was initiated" + }, + "x-ms-sku-name": { + "x-ms-client-name": "SkuName", + "type": "string", + "enum": [ + "Standard_LRS", + "Standard_GRS", + "Standard_RAGRS", + "Standard_ZRS", + "Premium_LRS" + ], + "x-ms-enum": { + "name": "SkuName", + "modelAsString": false + }, + "description": "Identifies the sku name of the account" + }, + "x-ms-account-kind": { + "x-ms-client-name": "AccountKind", + "type": "string", + "enum": [ + "Storage", + "BlobStorage", + "StorageV2", + "FileStorage", + "BlockBlobStorage" + ], + "x-ms-enum": { + "name": "AccountKind", + "modelAsString": false + }, + "description": "Identifies the account kind" + } + } + }, + "default": { + "description": "Failure", + "headers": { + "x-ms-error-code": { + "x-ms-client-name": "ErrorCode", + "type": "string" + } + }, + "schema": { + "$ref": "#/definitions/StorageError" + } + } + } + }, + "parameters": [ + { + "$ref": "#/parameters/ContainerName" + }, + { + "$ref": "#/parameters/Blob" + }, + { + "name": "restype", + "description": "restype", + "in": "query", + "required": true, + "type": "string", + "enum": [ + "account" + ] + }, + { + "name": "comp", + "description": "comp", + "in": "query", + "required": true, + "type": "string", + "enum": [ + "properties" + ] + } + ] + }, + "/{containerName}/{blob}?comp=block": { + "put": { + "tags": [ + "blockblob" + ], + "operationId": "BlockBlob_StageBlock", + "description": "The Stage Block operation creates a new block to be committed as part of a blob", + "consumes": [ + "application/octet-stream" + ], + "parameters": [ + { + "$ref": "#/parameters/BlockId" + }, + { + "$ref": "#/parameters/ContentLength" + }, + { + "$ref": "#/parameters/ContentMD5" + }, + { + "$ref": "#/parameters/ContentCrc64" + }, + { + "$ref": "#/parameters/Body" + }, + { + "$ref": "#/parameters/Timeout" + }, + { + "$ref": "#/parameters/LeaseIdOptional" + }, + { + "$ref": "#/parameters/EncryptionKey" + }, + { + "$ref": "#/parameters/EncryptionKeySha256" + }, + { + "$ref": "#/parameters/EncryptionAlgorithm" + }, + { + "$ref": "#/parameters/EncryptionScope" + }, + { + "$ref": "#/parameters/ApiVersionParameter" + }, + { + "$ref": "#/parameters/ClientRequestId" + } + ], + "responses": { + "201": { + "description": "The block was created.", + "headers": { + "Content-MD5": { + "type": "string", + "format": "byte", + "description": "This header is returned so that the client can check for message content integrity. The value of this header is computed by the Blob service; it is not necessarily the same value specified in the request headers." + }, + "x-ms-client-request-id": { + "x-ms-client-name": "ClientRequestId", + "type": "string", + "description": "If a client request id header is sent in the request, this header will be present in the response with the same value." + }, + "x-ms-request-id": { + "x-ms-client-name": "RequestId", + "type": "string", + "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." + }, + "x-ms-version": { + "x-ms-client-name": "Version", + "type": "string", + "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." + }, + "Date": { + "type": "string", + "format": "date-time-rfc1123", + "description": "UTC date/time value generated by the service that indicates the time at which the response was initiated" + }, + "x-ms-content-crc64": { + "type": "string", + "format": "byte", + "description": "This header is returned so that the client can check for message content integrity. The value of this header is computed by the Blob service; it is not necessarily the same value specified in the request headers." + }, + "x-ms-request-server-encrypted": { + "x-ms-client-name": "IsServerEncrypted", + "type": "boolean", + "description": "The value of this header is set to true if the contents of the request are successfully encrypted using the specified algorithm, and false otherwise." + }, + "x-ms-encryption-key-sha256": { + "x-ms-client-name": "EncryptionKeySha256", + "type": "string", + "description": "The SHA-256 hash of the encryption key used to encrypt the block. This header is only returned when the block was encrypted with a customer-provided key." + }, + "x-ms-encryption-scope": { + "x-ms-client-name": "EncryptionScope", + "type": "string", + "description": "Returns the name of the encryption scope used to encrypt the blob contents and application metadata. Note that the absence of this header implies use of the default account encryption scope." + } + } + }, + "default": { + "description": "Failure", + "headers": { + "x-ms-error-code": { + "x-ms-client-name": "ErrorCode", + "type": "string" + } + }, + "schema": { + "$ref": "#/definitions/StorageError" + } + } + } + }, + "parameters": [ + { + "$ref": "#/parameters/ContainerName" + }, + { + "$ref": "#/parameters/Blob" + }, + { + "name": "comp", + "description": "comp", + "in": "query", + "required": true, + "type": "string", + "enum": [ + "block" + ] + } + ] + }, + "/{containerName}/{blob}?comp=block&fromURL": { + "put": { + "tags": [ + "blockblob" + ], + "operationId": "BlockBlob_StageBlockFromURL", + "description": "The Stage Block operation creates a new block to be committed as part of a blob where the contents are read from a URL.", + "parameters": [ + { + "$ref": "#/parameters/BlockId" + }, + { + "$ref": "#/parameters/ContentLength" + }, + { + "$ref": "#/parameters/SourceUrl" + }, + { + "$ref": "#/parameters/SourceRange" + }, + { + "$ref": "#/parameters/SourceContentMD5" + }, + { + "$ref": "#/parameters/SourceContentCRC64" + }, + { + "$ref": "#/parameters/Timeout" + }, + { + "$ref": "#/parameters/EncryptionKey" + }, + { + "$ref": "#/parameters/EncryptionKeySha256" + }, + { + "$ref": "#/parameters/EncryptionAlgorithm" + }, + { + "$ref": "#/parameters/EncryptionScope" + }, + { + "$ref": "#/parameters/LeaseIdOptional" + }, + { + "$ref": "#/parameters/SourceIfModifiedSince" + }, + { + "$ref": "#/parameters/SourceIfUnmodifiedSince" + }, + { + "$ref": "#/parameters/SourceIfMatch" + }, + { + "$ref": "#/parameters/SourceIfNoneMatch" + }, + { + "$ref": "#/parameters/ApiVersionParameter" + }, + { + "$ref": "#/parameters/ClientRequestId" + }, + { + "$ref": "#/parameters/CopySourceAuthorization" + } + ], + "responses": { + "201": { + "description": "The block was created.", + "headers": { + "Content-MD5": { + "type": "string", + "format": "byte", + "description": "This header is returned so that the client can check for message content integrity. The value of this header is computed by the Blob service; it is not necessarily the same value specified in the request headers." + }, + "x-ms-content-crc64": { + "type": "string", + "format": "byte", + "description": "This header is returned so that the client can check for message content integrity. The value of this header is computed by the Blob service; it is not necessarily the same value specified in the request headers." + }, + "x-ms-client-request-id": { + "x-ms-client-name": "ClientRequestId", + "type": "string", + "description": "If a client request id header is sent in the request, this header will be present in the response with the same value." + }, + "x-ms-request-id": { + "x-ms-client-name": "RequestId", + "type": "string", + "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." + }, + "x-ms-version": { + "x-ms-client-name": "Version", + "type": "string", + "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." + }, + "Date": { + "type": "string", + "format": "date-time-rfc1123", + "description": "UTC date/time value generated by the service that indicates the time at which the response was initiated" + }, + "x-ms-request-server-encrypted": { + "x-ms-client-name": "IsServerEncrypted", + "type": "boolean", + "description": "The value of this header is set to true if the contents of the request are successfully encrypted using the specified algorithm, and false otherwise." + }, + "x-ms-encryption-key-sha256": { + "x-ms-client-name": "EncryptionKeySha256", + "type": "string", + "description": "The SHA-256 hash of the encryption key used to encrypt the block. This header is only returned when the block was encrypted with a customer-provided key." + }, + "x-ms-encryption-scope": { + "x-ms-client-name": "EncryptionScope", + "type": "string", + "description": "Returns the name of the encryption scope used to encrypt the blob contents and application metadata. Note that the absence of this header implies use of the default account encryption scope." + } + } + }, + "default": { + "description": "Failure", + "headers": { + "x-ms-error-code": { + "x-ms-client-name": "ErrorCode", + "type": "string" + } + }, + "schema": { + "$ref": "#/definitions/StorageError" + } + } + } + }, + "parameters": [ + { + "$ref": "#/parameters/ContainerName" + }, + { + "$ref": "#/parameters/Blob" + }, + { + "name": "comp", + "description": "comp", + "in": "query", + "required": true, + "type": "string", + "enum": [ + "block" + ] + } + ] + }, + "/{containerName}/{blob}?comp=blocklist": { + "put": { + "tags": [ + "blockblob" + ], + "operationId": "BlockBlob_CommitBlockList", + "description": "The Commit Block List operation writes a blob by specifying the list of block IDs that make up the blob. In order to be written as part of a blob, a block must have been successfully written to the server in a prior Put Block operation. You can call Put Block List to update a blob by uploading only those blocks that have changed, then committing the new and existing blocks together. You can do this by specifying whether to commit a block from the committed block list or from the uncommitted block list, or to commit the most recently uploaded version of the block, whichever list it may belong to.", + "parameters": [ + { + "$ref": "#/parameters/Timeout" + }, + { + "$ref": "#/parameters/BlobCacheControl" + }, + { + "$ref": "#/parameters/BlobContentType" + }, + { + "$ref": "#/parameters/BlobContentEncoding" + }, + { + "$ref": "#/parameters/BlobContentLanguage" + }, + { + "$ref": "#/parameters/BlobContentMD5" + }, + { + "$ref": "#/parameters/ContentMD5" + }, + { + "$ref": "#/parameters/ContentCrc64" + }, + { + "$ref": "#/parameters/Metadata" + }, + { + "$ref": "#/parameters/LeaseIdOptional" + }, + { + "$ref": "#/parameters/BlobContentDisposition" + }, + { + "$ref": "#/parameters/EncryptionKey" + }, + { + "$ref": "#/parameters/EncryptionKeySha256" + }, + { + "$ref": "#/parameters/EncryptionAlgorithm" + }, + { + "$ref": "#/parameters/EncryptionScope" + }, + { + "$ref": "#/parameters/AccessTierOptional" + }, + { + "$ref": "#/parameters/IfModifiedSince" + }, + { + "$ref": "#/parameters/IfUnmodifiedSince" + }, + { + "$ref": "#/parameters/IfMatch" + }, + { + "$ref": "#/parameters/IfNoneMatch" + }, + { + "$ref": "#/parameters/IfTags" + }, + { + "name": "blocks", + "description": "Blob Blocks.", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/BlockLookupList" + } + }, + { + "$ref": "#/parameters/ApiVersionParameter" + }, + { + "$ref": "#/parameters/ClientRequestId" + }, + { + "$ref": "#/parameters/BlobTagsHeader" + }, + { + "$ref": "#/parameters/ImmutabilityPolicyExpiry" + }, + { + "$ref": "#/parameters/ImmutabilityPolicyMode" + }, + { + "$ref": "#/parameters/LegalHoldOptional" + } + ], + "responses": { + "201": { + "description": "The block list was recorded.", + "headers": { + "ETag": { + "type": "string", + "description": "The ETag contains a value that you can use to perform operations conditionally. If the request version is 2011-08-18 or newer, the ETag value will be in quotes." + }, + "Last-Modified": { + "type": "string", + "format": "date-time-rfc1123", + "description": "Returns the date and time the container was last modified. Any operation that modifies the blob, including an update of the blob's metadata or properties, changes the last-modified time of the blob." + }, + "Content-MD5": { + "type": "string", + "format": "byte", + "description": "This header is returned so that the client can check for message content integrity. This header refers to the content of the request, meaning, in this case, the list of blocks, and not the content of the blob itself." + }, + "x-ms-content-crc64": { + "type": "string", + "format": "byte", + "description": "This header is returned so that the client can check for message content integrity. This header refers to the content of the request, meaning, in this case, the list of blocks, and not the content of the blob itself." + }, + "x-ms-client-request-id": { + "x-ms-client-name": "ClientRequestId", + "type": "string", + "description": "If a client request id header is sent in the request, this header will be present in the response with the same value." + }, + "x-ms-request-id": { + "x-ms-client-name": "RequestId", + "type": "string", + "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." + }, + "x-ms-version": { + "x-ms-client-name": "Version", + "type": "string", + "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." + }, + "x-ms-version-id": { + "x-ms-client-name": "VersionId", + "type": "string", + "description": "A DateTime value returned by the service that uniquely identifies the blob. The value of this header indicates the blob version, and may be used in subsequent requests to access this version of the blob." + }, + "Date": { + "type": "string", + "format": "date-time-rfc1123", + "description": "UTC date/time value generated by the service that indicates the time at which the response was initiated" + }, + "x-ms-request-server-encrypted": { + "x-ms-client-name": "IsServerEncrypted", + "type": "boolean", + "description": "The value of this header is set to true if the contents of the request are successfully encrypted using the specified algorithm, and false otherwise." + }, + "x-ms-encryption-key-sha256": { + "x-ms-client-name": "EncryptionKeySha256", + "type": "string", + "description": "The SHA-256 hash of the encryption key used to encrypt the blob. This header is only returned when the blob was encrypted with a customer-provided key." + }, + "x-ms-encryption-scope": { + "x-ms-client-name": "EncryptionScope", + "type": "string", + "description": "Returns the name of the encryption scope used to encrypt the blob contents and application metadata. Note that the absence of this header implies use of the default account encryption scope." + } + } + }, + "default": { + "description": "Failure", + "headers": { + "x-ms-error-code": { + "x-ms-client-name": "ErrorCode", + "type": "string" + } + }, + "schema": { + "$ref": "#/definitions/StorageError" + } + } + } + }, + "get": { + "tags": [ + "blockblob" + ], + "operationId": "BlockBlob_GetBlockList", + "description": "The Get Block List operation retrieves the list of blocks that have been uploaded as part of a block blob", + "parameters": [ + { + "$ref": "#/parameters/Snapshot" + }, + { + "$ref": "#/parameters/BlockListType" + }, + { + "$ref": "#/parameters/Timeout" + }, + { + "$ref": "#/parameters/LeaseIdOptional" + }, + { + "$ref": "#/parameters/IfTags" + }, + { + "$ref": "#/parameters/ApiVersionParameter" + }, + { + "$ref": "#/parameters/ClientRequestId" + } + ], + "responses": { + "200": { + "description": "The page range was written.", + "headers": { + "Last-Modified": { + "type": "string", + "format": "date-time-rfc1123", + "description": "Returns the date and time the container was last modified. Any operation that modifies the blob, including an update of the blob's metadata or properties, changes the last-modified time of the blob." + }, + "ETag": { + "type": "string", + "description": "The ETag contains a value that you can use to perform operations conditionally. If the request version is 2011-08-18 or newer, the ETag value will be in quotes." + }, + "Content-Type": { + "type": "string", + "description": "The media type of the body of the response. For Get Block List this is 'application/xml'" + }, + "x-ms-blob-content-length": { + "x-ms-client-name": "BlobContentLength", + "type": "integer", + "format": "int64", + "description": "The size of the blob in bytes." + }, + "x-ms-client-request-id": { + "x-ms-client-name": "ClientRequestId", + "type": "string", + "description": "If a client request id header is sent in the request, this header will be present in the response with the same value." + }, + "x-ms-request-id": { + "x-ms-client-name": "RequestId", + "type": "string", + "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." + }, + "x-ms-version": { + "x-ms-client-name": "Version", + "type": "string", + "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." + }, + "Date": { + "type": "string", + "format": "date-time-rfc1123", + "description": "UTC date/time value generated by the service that indicates the time at which the response was initiated" + } + }, + "schema": { + "$ref": "#/definitions/BlockList" + } + }, + "default": { + "description": "Failure", + "headers": { + "x-ms-error-code": { + "x-ms-client-name": "ErrorCode", + "type": "string" + } + }, + "schema": { + "$ref": "#/definitions/StorageError" + } + } + } + }, + "parameters": [ + { + "$ref": "#/parameters/ContainerName" + }, + { + "$ref": "#/parameters/Blob" + }, + { + "name": "comp", + "description": "comp", + "in": "query", + "required": true, + "type": "string", + "enum": [ + "blocklist" + ] + } + ] + }, + "/{containerName}/{blob}?comp=page&update": { + "put": { + "tags": [ + "pageblob" + ], + "operationId": "PageBlob_UploadPages", + "description": "The Upload Pages operation writes a range of pages to a page blob", + "consumes": [ + "application/octet-stream" + ], + "parameters": [ + { + "$ref": "#/parameters/Body" + }, + { + "$ref": "#/parameters/ContentLength" + }, + { + "$ref": "#/parameters/ContentMD5" + }, + { + "$ref": "#/parameters/ContentCrc64" + }, + { + "$ref": "#/parameters/Timeout" + }, + { + "$ref": "#/parameters/Range" + }, + { + "$ref": "#/parameters/LeaseIdOptional" + }, + { + "$ref": "#/parameters/EncryptionKey" + }, + { + "$ref": "#/parameters/EncryptionKeySha256" + }, + { + "$ref": "#/parameters/EncryptionAlgorithm" + }, + { + "$ref": "#/parameters/EncryptionScope" + }, + { + "$ref": "#/parameters/IfSequenceNumberLessThanOrEqualTo" + }, + { + "$ref": "#/parameters/IfSequenceNumberLessThan" + }, + { + "$ref": "#/parameters/IfSequenceNumberEqualTo" + }, + { + "$ref": "#/parameters/IfModifiedSince" + }, + { + "$ref": "#/parameters/IfUnmodifiedSince" + }, + { + "$ref": "#/parameters/IfMatch" + }, + { + "$ref": "#/parameters/IfNoneMatch" + }, + { + "$ref": "#/parameters/IfTags" + }, + { + "$ref": "#/parameters/ApiVersionParameter" + }, + { + "$ref": "#/parameters/ClientRequestId" + } + ], + "responses": { + "201": { + "description": "The page range was written.", + "headers": { + "ETag": { + "type": "string", + "description": "The ETag contains a value that you can use to perform operations conditionally. If the request version is 2011-08-18 or newer, the ETag value will be in quotes." + }, + "Last-Modified": { + "type": "string", + "format": "date-time-rfc1123", + "description": "Returns the date and time the container was last modified. Any operation that modifies the blob, including an update of the blob's metadata or properties, changes the last-modified time of the blob." + }, + "Content-MD5": { + "type": "string", + "format": "byte", + "description": "If the blob has an MD5 hash and this operation is to read the full blob, this response header is returned so that the client can check for message content integrity." + }, + "x-ms-content-crc64": { + "type": "string", + "format": "byte", + "description": "This header is returned so that the client can check for message content integrity. The value of this header is computed by the Blob service; it is not necessarily the same value specified in the request headers." + }, + "x-ms-blob-sequence-number": { + "x-ms-client-name": "BlobSequenceNumber", + "type": "integer", + "format": "int64", + "description": "The current sequence number for the page blob." + }, + "x-ms-client-request-id": { + "x-ms-client-name": "ClientRequestId", + "type": "string", + "description": "If a client request id header is sent in the request, this header will be present in the response with the same value." + }, + "x-ms-request-id": { + "x-ms-client-name": "RequestId", + "type": "string", + "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." + }, + "x-ms-version": { + "x-ms-client-name": "Version", + "type": "string", + "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." + }, + "Date": { + "type": "string", + "format": "date-time-rfc1123", + "description": "UTC date/time value generated by the service that indicates the time at which the response was initiated" + }, + "x-ms-request-server-encrypted": { + "x-ms-client-name": "IsServerEncrypted", + "type": "boolean", + "description": "The value of this header is set to true if the contents of the request are successfully encrypted using the specified algorithm, and false otherwise." + }, + "x-ms-encryption-key-sha256": { + "x-ms-client-name": "EncryptionKeySha256", + "type": "string", + "description": "The SHA-256 hash of the encryption key used to encrypt the pages. This header is only returned when the pages were encrypted with a customer-provided key." + }, + "x-ms-encryption-scope": { + "x-ms-client-name": "EncryptionScope", + "type": "string", + "description": "Returns the name of the encryption scope used to encrypt the blob contents and application metadata. Note that the absence of this header implies use of the default account encryption scope." + } + } + }, + "default": { + "description": "Failure", + "headers": { + "x-ms-error-code": { + "x-ms-client-name": "ErrorCode", + "type": "string" + } + }, + "schema": { + "$ref": "#/definitions/StorageError" + } + } + } + }, + "parameters": [ + { + "$ref": "#/parameters/ContainerName" + }, + { + "$ref": "#/parameters/Blob" + }, + { + "name": "comp", + "description": "comp", + "in": "query", + "required": true, + "type": "string", + "enum": [ + "page" + ] + }, + { + "name": "x-ms-page-write", + "x-ms-client-name": "pageWrite", + "in": "header", + "required": true, + "x-ms-parameter-location": "method", + "description": "Required. You may specify one of the following options:\n - Update: Writes the bytes specified by the request body into the specified range. The Range and Content-Length headers must match to perform the update.\n - Clear: Clears the specified range and releases the space used in storage for that range. To clear a range, set the Content-Length header to zero, and the Range header to a value that indicates the range to clear, up to maximum blob size.", + "type": "string", + "enum": [ + "update" + ], + "x-ms-enum": { + "name": "PageWriteType", + "modelAsString": false + } + } + ] + }, + "/{containerName}/{blob}?comp=page&clear": { + "put": { + "tags": [ + "pageblob" + ], + "operationId": "PageBlob_ClearPages", + "description": "The Clear Pages operation clears a set of pages from a page blob", + "consumes": [ + "application/octet-stream" + ], + "parameters": [ + { + "$ref": "#/parameters/ContentLength" + }, + { + "$ref": "#/parameters/Timeout" + }, + { + "$ref": "#/parameters/Range" + }, + { + "$ref": "#/parameters/LeaseIdOptional" + }, + { + "$ref": "#/parameters/EncryptionKey" + }, + { + "$ref": "#/parameters/EncryptionKeySha256" + }, + { + "$ref": "#/parameters/EncryptionAlgorithm" + }, + { + "$ref": "#/parameters/EncryptionScope" + }, + { + "$ref": "#/parameters/IfSequenceNumberLessThanOrEqualTo" + }, + { + "$ref": "#/parameters/IfSequenceNumberLessThan" + }, + { + "$ref": "#/parameters/IfSequenceNumberEqualTo" + }, + { + "$ref": "#/parameters/IfModifiedSince" + }, + { + "$ref": "#/parameters/IfUnmodifiedSince" + }, + { + "$ref": "#/parameters/IfMatch" + }, + { + "$ref": "#/parameters/IfNoneMatch" + }, + { + "$ref": "#/parameters/IfTags" + }, + { + "$ref": "#/parameters/ApiVersionParameter" + }, + { + "$ref": "#/parameters/ClientRequestId" + } + ], + "responses": { + "201": { + "description": "The page range was cleared.", + "headers": { + "ETag": { + "type": "string", + "description": "The ETag contains a value that you can use to perform operations conditionally. If the request version is 2011-08-18 or newer, the ETag value will be in quotes." + }, + "Last-Modified": { + "type": "string", + "format": "date-time-rfc1123", + "description": "Returns the date and time the container was last modified. Any operation that modifies the blob, including an update of the blob's metadata or properties, changes the last-modified time of the blob." + }, + "Content-MD5": { + "type": "string", + "format": "byte", + "description": "If the blob has an MD5 hash and this operation is to read the full blob, this response header is returned so that the client can check for message content integrity." + }, + "x-ms-content-crc64": { + "type": "string", + "format": "byte", + "description": "This header is returned so that the client can check for message content integrity. The value of this header is computed by the Blob service; it is not necessarily the same value specified in the request headers." + }, + "x-ms-blob-sequence-number": { + "x-ms-client-name": "BlobSequenceNumber", + "type": "integer", + "format": "int64", + "description": "The current sequence number for the page blob." + }, + "x-ms-client-request-id": { + "x-ms-client-name": "ClientRequestId", + "type": "string", + "description": "If a client request id header is sent in the request, this header will be present in the response with the same value." + }, + "x-ms-request-id": { + "x-ms-client-name": "RequestId", + "type": "string", + "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." + }, + "x-ms-version": { + "x-ms-client-name": "Version", + "type": "string", + "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." + }, + "Date": { + "type": "string", + "format": "date-time-rfc1123", + "description": "UTC date/time value generated by the service that indicates the time at which the response was initiated" + } + } + }, + "default": { + "description": "Failure", + "headers": { + "x-ms-error-code": { + "x-ms-client-name": "ErrorCode", + "type": "string" + } + }, + "schema": { + "$ref": "#/definitions/StorageError" + } + } + } + }, + "parameters": [ + { + "$ref": "#/parameters/ContainerName" + }, + { + "$ref": "#/parameters/Blob" + }, + { + "name": "comp", + "description": "comp", + "in": "query", + "required": true, + "type": "string", + "enum": [ + "page" + ] + }, + { + "name": "x-ms-page-write", + "x-ms-client-name": "pageWrite", + "in": "header", + "required": true, + "x-ms-parameter-location": "method", + "description": "Required. You may specify one of the following options:\n - Update: Writes the bytes specified by the request body into the specified range. The Range and Content-Length headers must match to perform the update.\n - Clear: Clears the specified range and releases the space used in storage for that range. To clear a range, set the Content-Length header to zero, and the Range header to a value that indicates the range to clear, up to maximum blob size.", + "type": "string", + "enum": [ + "clear" + ], + "x-ms-enum": { + "name": "PageWriteType", + "modelAsString": false + } + } + ] + }, + "/{containerName}/{blob}?comp=page&update&fromUrl": { + "put": { + "tags": [ + "pageblob" + ], + "operationId": "PageBlob_UploadPagesFromURL", + "description": "The Upload Pages operation writes a range of pages to a page blob where the contents are read from a URL", + "consumes": [ + "application/octet-stream" + ], + "parameters": [ + { + "$ref": "#/parameters/SourceUrl" + }, + { + "$ref": "#/parameters/SourceRangeRequiredPutPageFromUrl" + }, + { + "$ref": "#/parameters/SourceContentMD5" + }, + { + "$ref": "#/parameters/SourceContentCRC64" + }, + { + "$ref": "#/parameters/ContentLength" + }, + { + "$ref": "#/parameters/Timeout" + }, + { + "$ref": "#/parameters/RangeRequiredPutPageFromUrl" + }, + { + "$ref": "#/parameters/EncryptionKey" + }, + { + "$ref": "#/parameters/EncryptionKeySha256" + }, + { + "$ref": "#/parameters/EncryptionAlgorithm" + }, + { + "$ref": "#/parameters/EncryptionScope" + }, + { + "$ref": "#/parameters/LeaseIdOptional" + }, + { + "$ref": "#/parameters/IfSequenceNumberLessThanOrEqualTo" + }, + { + "$ref": "#/parameters/IfSequenceNumberLessThan" + }, + { + "$ref": "#/parameters/IfSequenceNumberEqualTo" + }, + { + "$ref": "#/parameters/IfModifiedSince" + }, + { + "$ref": "#/parameters/IfUnmodifiedSince" + }, + { + "$ref": "#/parameters/IfMatch" + }, + { + "$ref": "#/parameters/IfNoneMatch" + }, + { + "$ref": "#/parameters/IfTags" + }, + { + "$ref": "#/parameters/SourceIfModifiedSince" + }, + { + "$ref": "#/parameters/SourceIfUnmodifiedSince" + }, + { + "$ref": "#/parameters/SourceIfMatch" + }, + { + "$ref": "#/parameters/SourceIfNoneMatch" + }, + { + "$ref": "#/parameters/ApiVersionParameter" + }, + { + "$ref": "#/parameters/ClientRequestId" + }, + { + "$ref": "#/parameters/CopySourceAuthorization" + } + ], + "responses": { + "201": { + "description": "The page range was written.", + "headers": { + "ETag": { + "type": "string", + "description": "The ETag contains a value that you can use to perform operations conditionally. If the request version is 2011-08-18 or newer, the ETag value will be in quotes." + }, + "Last-Modified": { + "type": "string", + "format": "date-time-rfc1123", + "description": "Returns the date and time the container was last modified. Any operation that modifies the blob, including an update of the blob's metadata or properties, changes the last-modified time of the blob." + }, + "Content-MD5": { + "type": "string", + "format": "byte", + "description": "If the blob has an MD5 hash and this operation is to read the full blob, this response header is returned so that the client can check for message content integrity." + }, + "x-ms-content-crc64": { + "type": "string", + "format": "byte", + "description": "This header is returned so that the client can check for message content integrity. The value of this header is computed by the Blob service; it is not necessarily the same value specified in the request headers." + }, + "x-ms-blob-sequence-number": { + "x-ms-client-name": "BlobSequenceNumber", + "type": "integer", + "format": "int64", + "description": "The current sequence number for the page blob." + }, + "x-ms-request-id": { + "x-ms-client-name": "RequestId", + "type": "string", + "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." + }, + "x-ms-version": { + "x-ms-client-name": "Version", + "type": "string", + "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." + }, + "Date": { + "type": "string", + "format": "date-time-rfc1123", + "description": "UTC date/time value generated by the service that indicates the time at which the response was initiated" + }, + "x-ms-request-server-encrypted": { + "x-ms-client-name": "IsServerEncrypted", + "type": "boolean", + "description": "The value of this header is set to true if the contents of the request are successfully encrypted using the specified algorithm, and false otherwise." + }, + "x-ms-encryption-key-sha256": { + "x-ms-client-name": "EncryptionKeySha256", + "type": "string", + "description": "The SHA-256 hash of the encryption key used to encrypt the blob. This header is only returned when the blob was encrypted with a customer-provided key." + }, + "x-ms-encryption-scope": { + "x-ms-client-name": "EncryptionScope", + "type": "string", + "description": "Returns the name of the encryption scope used to encrypt the blob contents and application metadata. Note that the absence of this header implies use of the default account encryption scope." + } + } + }, + "default": { + "description": "Failure", + "headers": { + "x-ms-error-code": { + "x-ms-client-name": "ErrorCode", + "type": "string" + } + }, + "schema": { + "$ref": "#/definitions/StorageError" + } + } + } + }, + "parameters": [ + { + "$ref": "#/parameters/ContainerName" + }, + { + "$ref": "#/parameters/Blob" + }, + { + "name": "comp", + "description": "comp", + "in": "query", + "required": true, + "type": "string", + "enum": [ + "page" + ] + }, + { + "name": "x-ms-page-write", + "x-ms-client-name": "pageWrite", + "in": "header", + "required": true, + "x-ms-parameter-location": "method", + "description": "Required. You may specify one of the following options:\n - Update: Writes the bytes specified by the request body into the specified range. The Range and Content-Length headers must match to perform the update.\n - Clear: Clears the specified range and releases the space used in storage for that range. To clear a range, set the Content-Length header to zero, and the Range header to a value that indicates the range to clear, up to maximum blob size.", + "type": "string", + "enum": [ + "update" + ], + "x-ms-enum": { + "name": "PageWriteType", + "modelAsString": false + } + } + ] + }, + "/{containerName}/{blob}?comp=pagelist": { + "get": { + "tags": [ + "pageblob" + ], + "operationId": "PageBlob_GetPageRanges", + "description": "The Get Page Ranges operation returns the list of valid page ranges for a page blob or snapshot of a page blob", + "parameters": [ + { + "$ref": "#/parameters/Snapshot" + }, + { + "$ref": "#/parameters/Timeout" + }, + { + "$ref": "#/parameters/Range" + }, + { + "$ref": "#/parameters/LeaseIdOptional" + }, + { + "$ref": "#/parameters/IfModifiedSince" + }, + { + "$ref": "#/parameters/IfUnmodifiedSince" + }, + { + "$ref": "#/parameters/IfMatch" + }, + { + "$ref": "#/parameters/IfNoneMatch" + }, + { + "$ref": "#/parameters/IfTags" + }, + { + "$ref": "#/parameters/ApiVersionParameter" + }, + { + "$ref": "#/parameters/ClientRequestId" + }, + { + "$ref": "#/parameters/Marker" + }, + { + "$ref": "#/parameters/MaxResults" + } + ], + "responses": { + "200": { + "description": "Information on the page blob was found.", + "headers": { + "Last-Modified": { + "type": "string", + "format": "date-time-rfc1123", + "description": "Returns the date and time the container was last modified. Any operation that modifies the blob, including an update of the blob's metadata or properties, changes the last-modified time of the blob." + }, + "ETag": { + "type": "string", + "description": "The ETag contains a value that you can use to perform operations conditionally. If the request version is 2011-08-18 or newer, the ETag value will be in quotes." + }, + "x-ms-blob-content-length": { + "x-ms-client-name": "BlobContentLength", + "type": "integer", + "format": "int64", + "description": "The size of the blob in bytes." + }, + "x-ms-client-request-id": { + "x-ms-client-name": "ClientRequestId", + "type": "string", + "description": "If a client request id header is sent in the request, this header will be present in the response with the same value." + }, + "x-ms-request-id": { + "x-ms-client-name": "RequestId", + "type": "string", + "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." + }, + "x-ms-version": { + "x-ms-client-name": "Version", + "type": "string", + "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." + }, + "Date": { + "type": "string", + "format": "date-time-rfc1123", + "description": "UTC date/time value generated by the service that indicates the time at which the response was initiated" + } + }, + "schema": { + "$ref": "#/definitions/PageList" + } + }, + "default": { + "description": "Failure", + "headers": { + "x-ms-error-code": { + "x-ms-client-name": "ErrorCode", + "type": "string" + } + }, + "schema": { + "$ref": "#/definitions/StorageError" + } + } + }, + "x-ms-pageable": { + "nextLinkName": "NextMarker" + } + }, + "parameters": [ + { + "$ref": "#/parameters/ContainerName" + }, + { + "$ref": "#/parameters/Blob" + }, + { + "name": "comp", + "description": "comp", + "in": "query", + "required": true, + "type": "string", + "enum": [ + "pagelist" + ] + } + ] + }, + "/{containerName}/{blob}?comp=pagelist&diff": { + "get": { + "tags": [ + "pageblob" + ], + "operationId": "PageBlob_GetPageRangesDiff", + "description": "The Get Page Ranges Diff operation returns the list of valid page ranges for a page blob that were changed between target blob and previous snapshot.", + "parameters": [ + { + "$ref": "#/parameters/Snapshot" + }, + { + "$ref": "#/parameters/Timeout" + }, + { + "$ref": "#/parameters/PrevSnapshot" + }, + { + "$ref": "#/parameters/PrevSnapshotUrl" + }, + { + "$ref": "#/parameters/Range" + }, + { + "$ref": "#/parameters/LeaseIdOptional" + }, + { + "$ref": "#/parameters/IfModifiedSince" + }, + { + "$ref": "#/parameters/IfUnmodifiedSince" + }, + { + "$ref": "#/parameters/IfMatch" + }, + { + "$ref": "#/parameters/IfNoneMatch" + }, + { + "$ref": "#/parameters/IfTags" + }, + { + "$ref": "#/parameters/ApiVersionParameter" + }, + { + "$ref": "#/parameters/ClientRequestId" + }, + { + "$ref": "#/parameters/Marker" + }, + { + "$ref": "#/parameters/MaxResults" + } + ], + "responses": { + "200": { + "description": "Information on the page blob was found.", + "headers": { + "Last-Modified": { + "type": "string", + "format": "date-time-rfc1123", + "description": "Returns the date and time the container was last modified. Any operation that modifies the blob, including an update of the blob's metadata or properties, changes the last-modified time of the blob." + }, + "ETag": { + "type": "string", + "description": "The ETag contains a value that you can use to perform operations conditionally. If the request version is 2011-08-18 or newer, the ETag value will be in quotes." + }, + "x-ms-blob-content-length": { + "x-ms-client-name": "BlobContentLength", + "type": "integer", + "format": "int64", + "description": "The size of the blob in bytes." + }, + "x-ms-client-request-id": { + "x-ms-client-name": "ClientRequestId", + "type": "string", + "description": "If a client request id header is sent in the request, this header will be present in the response with the same value." + }, + "x-ms-request-id": { + "x-ms-client-name": "RequestId", + "type": "string", + "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." + }, + "x-ms-version": { + "x-ms-client-name": "Version", + "type": "string", + "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." + }, + "Date": { + "type": "string", + "format": "date-time-rfc1123", + "description": "UTC date/time value generated by the service that indicates the time at which the response was initiated" + } + }, + "schema": { + "$ref": "#/definitions/PageList" + } + }, + "default": { + "description": "Failure", + "headers": { + "x-ms-error-code": { + "x-ms-client-name": "ErrorCode", + "type": "string" + } + }, + "schema": { + "$ref": "#/definitions/StorageError" + } + } + }, + "x-ms-pageable": { + "nextLinkName": "NextMarker" + } + }, + "parameters": [ + { + "$ref": "#/parameters/ContainerName" + }, + { + "$ref": "#/parameters/Blob" + }, + { + "name": "comp", + "description": "comp", + "in": "query", + "required": true, + "type": "string", + "enum": [ + "pagelist" + ] + } + ] + }, + "/{containerName}/{blob}?comp=properties&Resize": { + "put": { + "tags": [ + "pageblob" + ], + "operationId": "PageBlob_Resize", + "description": "Resize the Blob", + "parameters": [ + { + "$ref": "#/parameters/Timeout" + }, + { + "$ref": "#/parameters/LeaseIdOptional" + }, + { + "$ref": "#/parameters/EncryptionKey" + }, + { + "$ref": "#/parameters/EncryptionKeySha256" + }, + { + "$ref": "#/parameters/EncryptionAlgorithm" + }, + { + "$ref": "#/parameters/EncryptionScope" + }, + { + "$ref": "#/parameters/IfModifiedSince" + }, + { + "$ref": "#/parameters/IfUnmodifiedSince" + }, + { + "$ref": "#/parameters/IfMatch" + }, + { + "$ref": "#/parameters/IfNoneMatch" + }, + { + "$ref": "#/parameters/IfTags" + }, + { + "$ref": "#/parameters/BlobContentLengthRequired" + }, + { + "$ref": "#/parameters/ApiVersionParameter" + }, + { + "$ref": "#/parameters/ClientRequestId" + } + ], + "responses": { + "200": { + "description": "The Blob was resized successfully", + "headers": { + "ETag": { + "type": "string", + "description": "The ETag contains a value that you can use to perform operations conditionally. If the request version is 2011-08-18 or newer, the ETag value will be in quotes." + }, + "Last-Modified": { + "type": "string", + "format": "date-time-rfc1123", + "description": "Returns the date and time the container was last modified. Any operation that modifies the blob, including an update of the blob's metadata or properties, changes the last-modified time of the blob." + }, + "x-ms-blob-sequence-number": { + "x-ms-client-name": "BlobSequenceNumber", + "type": "integer", + "format": "int64", + "description": "The current sequence number for a page blob. This header is not returned for block blobs or append blobs" + }, + "x-ms-client-request-id": { + "x-ms-client-name": "ClientRequestId", + "type": "string", + "description": "If a client request id header is sent in the request, this header will be present in the response with the same value." + }, + "x-ms-request-id": { + "x-ms-client-name": "RequestId", + "type": "string", + "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." + }, + "x-ms-version": { + "x-ms-client-name": "Version", + "type": "string", + "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." + }, + "Date": { + "type": "string", + "format": "date-time-rfc1123", + "description": "UTC date/time value generated by the service that indicates the time at which the response was initiated" + } + } + }, + "default": { + "description": "Failure", + "headers": { + "x-ms-error-code": { + "x-ms-client-name": "ErrorCode", + "type": "string" + } + }, + "schema": { + "$ref": "#/definitions/StorageError" + } + } + } + }, + "parameters": [ + { + "$ref": "#/parameters/ContainerName" + }, + { + "$ref": "#/parameters/Blob" + }, + { + "name": "comp", + "description": "comp", + "in": "query", + "required": true, + "type": "string", + "enum": [ + "properties" + ] + } + ] + }, + "/{containerName}/{blob}?comp=properties&UpdateSequenceNumber": { + "put": { + "tags": [ + "pageblob" + ], + "operationId": "PageBlob_UpdateSequenceNumber", + "description": "Update the sequence number of the blob", + "parameters": [ + { + "$ref": "#/parameters/Timeout" + }, + { + "$ref": "#/parameters/LeaseIdOptional" + }, + { + "$ref": "#/parameters/IfModifiedSince" + }, + { + "$ref": "#/parameters/IfUnmodifiedSince" + }, + { + "$ref": "#/parameters/IfMatch" + }, + { + "$ref": "#/parameters/IfNoneMatch" + }, + { + "$ref": "#/parameters/IfTags" + }, + { + "$ref": "#/parameters/SequenceNumberAction" + }, + { + "$ref": "#/parameters/BlobSequenceNumber" + }, + { + "$ref": "#/parameters/ApiVersionParameter" + }, + { + "$ref": "#/parameters/ClientRequestId" + } + ], + "responses": { + "200": { + "description": "The sequence numbers were updated successfully.", + "headers": { + "ETag": { + "type": "string", + "description": "The ETag contains a value that you can use to perform operations conditionally. If the request version is 2011-08-18 or newer, the ETag value will be in quotes." + }, + "Last-Modified": { + "type": "string", + "format": "date-time-rfc1123", + "description": "Returns the date and time the container was last modified. Any operation that modifies the blob, including an update of the blob's metadata or properties, changes the last-modified time of the blob." + }, + "x-ms-blob-sequence-number": { + "x-ms-client-name": "BlobSequenceNumber", + "type": "integer", + "format": "int64", + "description": "The current sequence number for a page blob. This header is not returned for block blobs or append blobs" + }, + "x-ms-client-request-id": { + "x-ms-client-name": "ClientRequestId", + "type": "string", + "description": "If a client request id header is sent in the request, this header will be present in the response with the same value." + }, + "x-ms-request-id": { + "x-ms-client-name": "RequestId", + "type": "string", + "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." + }, + "x-ms-version": { + "x-ms-client-name": "Version", + "type": "string", + "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." + }, + "Date": { + "type": "string", + "format": "date-time-rfc1123", + "description": "UTC date/time value generated by the service that indicates the time at which the response was initiated" + } + } + }, + "default": { + "description": "Failure", + "headers": { + "x-ms-error-code": { + "x-ms-client-name": "ErrorCode", + "type": "string" + } + }, + "schema": { + "$ref": "#/definitions/StorageError" + } + } + } + }, + "parameters": [ + { + "$ref": "#/parameters/ContainerName" + }, + { + "$ref": "#/parameters/Blob" + }, + { + "name": "comp", + "description": "comp", + "in": "query", + "required": true, + "type": "string", + "enum": [ + "properties" + ] + } + ] + }, + "/{containerName}/{blob}?comp=incrementalcopy": { + "put": { + "tags": [ + "pageblob" + ], + "operationId": "PageBlob_CopyIncremental", + "description": "The Copy Incremental operation copies a snapshot of the source page blob to a destination page blob. The snapshot is copied such that only the differential changes between the previously copied snapshot are transferred to the destination. The copied snapshots are complete copies of the original snapshot and can be read or copied from as usual. This API is supported since REST version 2016-05-31.", + "parameters": [ + { + "$ref": "#/parameters/Timeout" + }, + { + "$ref": "#/parameters/IfModifiedSince" + }, + { + "$ref": "#/parameters/IfUnmodifiedSince" + }, + { + "$ref": "#/parameters/IfMatch" + }, + { + "$ref": "#/parameters/IfNoneMatch" + }, + { + "$ref": "#/parameters/IfTags" + }, + { + "$ref": "#/parameters/CopySource" + }, + { + "$ref": "#/parameters/ApiVersionParameter" + }, + { + "$ref": "#/parameters/ClientRequestId" + } + ], + "responses": { + "202": { + "description": "The blob was copied.", + "headers": { + "ETag": { + "type": "string", + "description": "The ETag contains a value that you can use to perform operations conditionally. If the request version is 2011-08-18 or newer, the ETag value will be in quotes." + }, + "Last-Modified": { + "type": "string", + "format": "date-time-rfc1123", + "description": "Returns the date and time the container was last modified. Any operation that modifies the blob, including an update of the blob's metadata or properties, changes the last-modified time of the blob." + }, + "x-ms-client-request-id": { + "x-ms-client-name": "ClientRequestId", + "type": "string", + "description": "If a client request id header is sent in the request, this header will be present in the response with the same value." + }, + "x-ms-request-id": { + "x-ms-client-name": "RequestId", + "type": "string", + "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." + }, + "x-ms-version": { + "x-ms-client-name": "Version", + "type": "string", + "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." + }, + "Date": { + "type": "string", + "format": "date-time-rfc1123", + "description": "UTC date/time value generated by the service that indicates the time at which the response was initiated" + }, + "x-ms-copy-id": { + "x-ms-client-name": "CopyId", + "type": "string", + "description": "String identifier for this copy operation. Use with Get Blob Properties to check the status of this copy operation, or pass to Abort Copy Blob to abort a pending copy." + }, + "x-ms-copy-status": { + "x-ms-client-name": "CopyStatus", + "description": "State of the copy operation identified by x-ms-copy-id.", + "type": "string", + "enum": [ + "pending", + "success", + "aborted", + "failed" + ], + "x-ms-enum": { + "name": "CopyStatusType", + "modelAsString": false + } + } + } + }, + "default": { + "description": "Failure", + "headers": { + "x-ms-error-code": { + "x-ms-client-name": "ErrorCode", + "type": "string" + } + }, + "schema": { + "$ref": "#/definitions/StorageError" + } + } + } + }, + "parameters": [ + { + "$ref": "#/parameters/ContainerName" + }, + { + "$ref": "#/parameters/Blob" + }, + { + "name": "comp", + "description": "comp", + "in": "query", + "required": true, + "type": "string", + "enum": [ + "incrementalcopy" + ] + } + ] + }, + "/{containerName}/{blob}?comp=appendblock": { + "put": { + "tags": [ + "appendblob" + ], + "consumes": [ + "application/octet-stream" + ], + "operationId": "AppendBlob_AppendBlock", + "description": "The Append Block operation commits a new block of data to the end of an existing append blob. The Append Block operation is permitted only if the blob was created with x-ms-blob-type set to AppendBlob. Append Block is supported only on version 2015-02-21 version or later.", + "parameters": [ + { + "$ref": "#/parameters/Body" + }, + { + "$ref": "#/parameters/Timeout" + }, + { + "$ref": "#/parameters/ContentLength" + }, + { + "$ref": "#/parameters/ContentMD5" + }, + { + "$ref": "#/parameters/ContentCrc64" + }, + { + "$ref": "#/parameters/LeaseIdOptional" + }, + { + "$ref": "#/parameters/BlobConditionMaxSize" + }, + { + "$ref": "#/parameters/BlobConditionAppendPos" + }, + { + "$ref": "#/parameters/EncryptionKey" + }, + { + "$ref": "#/parameters/EncryptionKeySha256" + }, + { + "$ref": "#/parameters/EncryptionAlgorithm" + }, + { + "$ref": "#/parameters/EncryptionScope" + }, + { + "$ref": "#/parameters/IfModifiedSince" + }, + { + "$ref": "#/parameters/IfUnmodifiedSince" + }, + { + "$ref": "#/parameters/IfMatch" + }, + { + "$ref": "#/parameters/IfNoneMatch" + }, + { + "$ref": "#/parameters/IfTags" + }, + { + "$ref": "#/parameters/ApiVersionParameter" + }, + { + "$ref": "#/parameters/ClientRequestId" + } + ], + "responses": { + "201": { + "description": "The block was created.", + "headers": { + "ETag": { + "type": "string", + "description": "The ETag contains a value that you can use to perform operations conditionally. If the request version is 2011-08-18 or newer, the ETag value will be in quotes." + }, + "Last-Modified": { + "type": "string", + "format": "date-time-rfc1123", + "description": "Returns the date and time the container was last modified. Any operation that modifies the blob, including an update of the blob's metadata or properties, changes the last-modified time of the blob." + }, + "Content-MD5": { + "type": "string", + "format": "byte", + "description": "If the blob has an MD5 hash and this operation is to read the full blob, this response header is returned so that the client can check for message content integrity." + }, + "x-ms-content-crc64": { + "type": "string", + "format": "byte", + "description": "This header is returned so that the client can check for message content integrity. The value of this header is computed by the Blob service; it is not necessarily the same value specified in the request headers." + }, + "x-ms-client-request-id": { + "x-ms-client-name": "ClientRequestId", + "type": "string", + "description": "If a client request id header is sent in the request, this header will be present in the response with the same value." + }, + "x-ms-request-id": { + "x-ms-client-name": "RequestId", + "type": "string", + "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." + }, + "x-ms-version": { + "x-ms-client-name": "Version", + "type": "string", + "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." + }, + "Date": { + "type": "string", + "format": "date-time-rfc1123", + "description": "UTC date/time value generated by the service that indicates the time at which the response was initiated" + }, + "x-ms-blob-append-offset": { + "x-ms-client-name": "BlobAppendOffset", + "type": "string", + "description": "This response header is returned only for append operations. It returns the offset at which the block was committed, in bytes." + }, + "x-ms-blob-committed-block-count": { + "x-ms-client-name": "BlobCommittedBlockCount", + "type": "integer", + "description": "The number of committed blocks present in the blob. This header is returned only for append blobs." + }, + "x-ms-request-server-encrypted": { + "x-ms-client-name": "IsServerEncrypted", + "type": "boolean", + "description": "The value of this header is set to true if the contents of the request are successfully encrypted using the specified algorithm, and false otherwise." + }, + "x-ms-encryption-key-sha256": { + "x-ms-client-name": "EncryptionKeySha256", + "type": "string", + "description": "The SHA-256 hash of the encryption key used to encrypt the block. This header is only returned when the block was encrypted with a customer-provided key." + }, + "x-ms-encryption-scope": { + "x-ms-client-name": "EncryptionScope", + "type": "string", + "description": "Returns the name of the encryption scope used to encrypt the blob contents and application metadata. Note that the absence of this header implies use of the default account encryption scope." + } + } + }, + "default": { + "description": "Failure", + "headers": { + "x-ms-error-code": { + "x-ms-client-name": "ErrorCode", + "type": "string" + } + }, + "schema": { + "$ref": "#/definitions/StorageError" + } + } + } + }, + "parameters": [ + { + "$ref": "#/parameters/ContainerName" + }, + { + "$ref": "#/parameters/Blob" + }, + { + "name": "comp", + "description": "comp", + "in": "query", + "required": true, + "type": "string", + "enum": [ + "appendblock" + ] + } + ] + }, + "/{containerName}/{blob}?comp=appendblock&fromUrl": { + "put": { + "tags": [ + "appendblob" + ], + "operationId": "AppendBlob_AppendBlockFromUrl", + "description": "The Append Block operation commits a new block of data to the end of an existing append blob where the contents are read from a source url. The Append Block operation is permitted only if the blob was created with x-ms-blob-type set to AppendBlob. Append Block is supported only on version 2015-02-21 version or later.", + "parameters": [ + { + "$ref": "#/parameters/SourceUrl" + }, + { + "$ref": "#/parameters/SourceRange" + }, + { + "$ref": "#/parameters/SourceContentMD5" + }, + { + "$ref": "#/parameters/SourceContentCRC64" + }, + { + "$ref": "#/parameters/Timeout" + }, + { + "$ref": "#/parameters/ContentLength" + }, + { + "$ref": "#/parameters/ContentMD5" + }, + { + "$ref": "#/parameters/EncryptionKey" + }, + { + "$ref": "#/parameters/EncryptionKeySha256" + }, + { + "$ref": "#/parameters/EncryptionAlgorithm" + }, + { + "$ref": "#/parameters/EncryptionScope" + }, + { + "$ref": "#/parameters/LeaseIdOptional" + }, + { + "$ref": "#/parameters/BlobConditionMaxSize" + }, + { + "$ref": "#/parameters/BlobConditionAppendPos" + }, + { + "$ref": "#/parameters/IfModifiedSince" + }, + { + "$ref": "#/parameters/IfUnmodifiedSince" + }, + { + "$ref": "#/parameters/IfMatch" + }, + { + "$ref": "#/parameters/IfNoneMatch" + }, + { + "$ref": "#/parameters/IfTags" + }, + { + "$ref": "#/parameters/SourceIfModifiedSince" + }, + { + "$ref": "#/parameters/SourceIfUnmodifiedSince" + }, + { + "$ref": "#/parameters/SourceIfMatch" + }, + { + "$ref": "#/parameters/SourceIfNoneMatch" + }, + { + "$ref": "#/parameters/ApiVersionParameter" + }, + { + "$ref": "#/parameters/ClientRequestId" + }, + { + "$ref": "#/parameters/CopySourceAuthorization" + } + ], + "responses": { + "201": { + "description": "The block was created.", + "headers": { + "ETag": { + "type": "string", + "description": "The ETag contains a value that you can use to perform operations conditionally. If the request version is 2011-08-18 or newer, the ETag value will be in quotes." + }, + "Last-Modified": { + "type": "string", + "format": "date-time-rfc1123", + "description": "Returns the date and time the container was last modified. Any operation that modifies the blob, including an update of the blob's metadata or properties, changes the last-modified time of the blob." + }, + "Content-MD5": { + "type": "string", + "format": "byte", + "description": "If the blob has an MD5 hash and this operation is to read the full blob, this response header is returned so that the client can check for message content integrity." + }, + "x-ms-content-crc64": { + "type": "string", + "format": "byte", + "description": "This header is returned so that the client can check for message content integrity. The value of this header is computed by the Blob service; it is not necessarily the same value specified in the request headers." + }, + "x-ms-request-id": { + "x-ms-client-name": "RequestId", + "type": "string", + "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." + }, + "x-ms-version": { + "x-ms-client-name": "Version", + "type": "string", + "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." + }, + "Date": { + "type": "string", + "format": "date-time-rfc1123", + "description": "UTC date/time value generated by the service that indicates the time at which the response was initiated" + }, + "x-ms-blob-append-offset": { + "x-ms-client-name": "BlobAppendOffset", + "type": "string", + "description": "This response header is returned only for append operations. It returns the offset at which the block was committed, in bytes." + }, + "x-ms-blob-committed-block-count": { + "x-ms-client-name": "BlobCommittedBlockCount", + "type": "integer", + "description": "The number of committed blocks present in the blob. This header is returned only for append blobs." + }, + "x-ms-encryption-key-sha256": { + "x-ms-client-name": "EncryptionKeySha256", + "type": "string", + "description": "The SHA-256 hash of the encryption key used to encrypt the block. This header is only returned when the block was encrypted with a customer-provided key." + }, + "x-ms-encryption-scope": { + "x-ms-client-name": "EncryptionScope", + "type": "string", + "description": "Returns the name of the encryption scope used to encrypt the blob contents and application metadata. Note that the absence of this header implies use of the default account encryption scope." + }, + "x-ms-request-server-encrypted": { + "x-ms-client-name": "IsServerEncrypted", + "type": "boolean", + "description": "The value of this header is set to true if the contents of the request are successfully encrypted using the specified algorithm, and false otherwise." + } + } + }, + "default": { + "description": "Failure", + "headers": { + "x-ms-error-code": { + "x-ms-client-name": "ErrorCode", + "type": "string" + } + }, + "schema": { + "$ref": "#/definitions/StorageError" + } + } + } + }, + "parameters": [ + { + "$ref": "#/parameters/ContainerName" + }, + { + "$ref": "#/parameters/Blob" + }, + { + "name": "comp", + "description": "comp", + "in": "query", + "required": true, + "type": "string", + "enum": [ + "appendblock" + ] + } + ] + }, + "/{containerName}/{blob}?comp=seal": { + "put": { + "tags": [ + "appendblob" + ], + "operationId": "AppendBlob_Seal", + "description": "The Seal operation seals the Append Blob to make it read-only. Seal is supported only on version 2019-12-12 version or later.", + "parameters": [ + { + "$ref": "#/parameters/Timeout" + }, + { + "$ref": "#/parameters/ApiVersionParameter" + }, + { + "$ref": "#/parameters/ClientRequestId" + }, + { + "$ref": "#/parameters/LeaseIdOptional" + }, + { + "$ref": "#/parameters/IfModifiedSince" + }, + { + "$ref": "#/parameters/IfUnmodifiedSince" + }, + { + "$ref": "#/parameters/IfMatch" + }, + { + "$ref": "#/parameters/IfNoneMatch" + }, + { + "$ref": "#/parameters/BlobConditionAppendPos" + } + ], + "responses": { + "200": { + "description": "The blob was sealed.", + "headers": { + "ETag": { + "type": "string", + "description": "The ETag contains a value that you can use to perform operations conditionally. If the request version is 2011-08-18 or newer, the ETag value will be in quotes." + }, + "Last-Modified": { + "type": "string", + "format": "date-time-rfc1123", + "description": "Returns the date and time the container was last modified. Any operation that modifies the blob, including an update of the blob's metadata or properties, changes the last-modified time of the blob." + }, + "x-ms-client-request-id": { + "x-ms-client-name": "ClientRequestId", + "type": "string", + "description": "If a client request id header is sent in the request, this header will be present in the response with the same value." + }, + "x-ms-request-id": { + "x-ms-client-name": "RequestId", + "type": "string", + "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." + }, + "x-ms-version": { + "x-ms-client-name": "Version", + "type": "string", + "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." + }, + "Date": { + "type": "string", + "format": "date-time-rfc1123", + "description": "UTC date/time value generated by the service that indicates the time at which the response was initiated" + }, + "x-ms-blob-sealed": { + "x-ms-client-name": "IsSealed", + "type": "boolean", + "description": "If this blob has been sealed" + } + } + }, + "default": { + "description": "Failure", + "headers": { + "x-ms-error-code": { + "x-ms-client-name": "ErrorCode", + "type": "string" + } + }, + "schema": { + "$ref": "#/definitions/StorageError" + } + } + } + }, + "parameters": [ + { + "$ref": "#/parameters/ContainerName" + }, + { + "$ref": "#/parameters/Blob" + }, + { + "name": "comp", + "description": "comp", + "in": "query", + "required": true, + "type": "string", + "enum": [ + "seal" + ] + } + ] + }, + "/{containerName}/{blob}?comp=query": { + "post": { + "tags": [ + "blob" + ], + "operationId": "Blob_Query", + "description": "The Query operation enables users to select/project on blob data by providing simple query expressions.", + "parameters": [ + { + "$ref": "#/parameters/QueryRequest" + }, + { + "$ref": "#/parameters/Snapshot" + }, + { + "$ref": "#/parameters/Timeout" + }, + { + "$ref": "#/parameters/LeaseIdOptional" + }, + { + "$ref": "#/parameters/EncryptionKey" + }, + { + "$ref": "#/parameters/EncryptionKeySha256" + }, + { + "$ref": "#/parameters/EncryptionAlgorithm" + }, + { + "$ref": "#/parameters/IfModifiedSince" + }, + { + "$ref": "#/parameters/IfUnmodifiedSince" + }, + { + "$ref": "#/parameters/IfMatch" + }, + { + "$ref": "#/parameters/IfNoneMatch" + }, + { + "$ref": "#/parameters/IfTags" + }, + { + "$ref": "#/parameters/ApiVersionParameter" + }, + { + "$ref": "#/parameters/ClientRequestId" + } + ], + "responses": { + "200": { + "description": "Returns the content of the entire blob.", + "headers": { + "Last-Modified": { + "type": "string", + "format": "date-time-rfc1123", + "description": "Returns the date and time the container was last modified. Any operation that modifies the blob, including an update of the blob's metadata or properties, changes the last-modified time of the blob." + }, + "x-ms-meta": { + "type": "string", + "x-ms-client-name": "Metadata", + "x-ms-header-collection-prefix": "x-ms-meta-" + }, + "Content-Length": { + "type": "integer", + "format": "int64", + "description": "The number of bytes present in the response body." + }, + "Content-Type": { + "type": "string", + "description": "The media type of the body of the response. For Download Blob this is 'application/octet-stream'" + }, + "Content-Range": { + "type": "string", + "description": "Indicates the range of bytes returned in the event that the client requested a subset of the blob by setting the 'Range' request header." + }, + "ETag": { + "type": "string", + "description": "The ETag contains a value that you can use to perform operations conditionally. If the request version is 2011-08-18 or newer, the ETag value will be in quotes." + }, + "Content-MD5": { + "type": "string", + "format": "byte", + "description": "If the blob has an MD5 hash and this operation is to read the full blob, this response header is returned so that the client can check for message content integrity." + }, + "Content-Encoding": { + "type": "string", + "description": "This header returns the value that was specified for the Content-Encoding request header" + }, + "Cache-Control": { + "type": "string", + "description": "This header is returned if it was previously specified for the blob." + }, + "Content-Disposition": { + "type": "string", + "description": "This header returns the value that was specified for the 'x-ms-blob-content-disposition' header. The Content-Disposition response header field conveys additional information about how to process the response payload, and also can be used to attach additional metadata. For example, if set to attachment, it indicates that the user-agent should not display the response, but instead show a Save As dialog with a filename other than the blob name specified." + }, + "Content-Language": { + "type": "string", + "description": "This header returns the value that was specified for the Content-Language request header." + }, + "x-ms-blob-sequence-number": { + "x-ms-client-name": "BlobSequenceNumber", + "type": "integer", + "format": "int64", + "description": "The current sequence number for a page blob. This header is not returned for block blobs or append blobs" + }, + "x-ms-blob-type": { + "x-ms-client-name": "BlobType", + "description": "The blob's type.", + "type": "string", + "enum": [ + "BlockBlob", + "PageBlob", + "AppendBlob" + ], + "x-ms-enum": { + "name": "BlobType", + "modelAsString": false + } + }, + "x-ms-copy-completion-time": { + "x-ms-client-name": "CopyCompletionTime", + "type": "string", + "format": "date-time-rfc1123", + "description": "Conclusion time of the last attempted Copy Blob operation where this blob was the destination blob. This value can specify the time of a completed, aborted, or failed copy attempt. This header does not appear if a copy is pending, if this blob has never been the destination in a Copy Blob operation, or if this blob has been modified after a concluded Copy Blob operation using Set Blob Properties, Put Blob, or Put Block List." + }, + "x-ms-copy-status-description": { + "x-ms-client-name": "CopyStatusDescription", + "type": "string", + "description": "Only appears when x-ms-copy-status is failed or pending. Describes the cause of the last fatal or non-fatal copy operation failure. This header does not appear if this blob has never been the destination in a Copy Blob operation, or if this blob has been modified after a concluded Copy Blob operation using Set Blob Properties, Put Blob, or Put Block List" + }, + "x-ms-copy-id": { + "x-ms-client-name": "CopyId", + "type": "string", + "description": "String identifier for this copy operation. Use with Get Blob Properties to check the status of this copy operation, or pass to Abort Copy Blob to abort a pending copy." + }, + "x-ms-copy-progress": { + "x-ms-client-name": "CopyProgress", + "type": "string", + "description": "Contains the number of bytes copied and the total bytes in the source in the last attempted Copy Blob operation where this blob was the destination blob. Can show between 0 and Content-Length bytes copied. This header does not appear if this blob has never been the destination in a Copy Blob operation, or if this blob has been modified after a concluded Copy Blob operation using Set Blob Properties, Put Blob, or Put Block List" + }, + "x-ms-copy-source": { + "x-ms-client-name": "CopySource", + "type": "string", + "description": "URL up to 2 KB in length that specifies the source blob or file used in the last attempted Copy Blob operation where this blob was the destination blob. This header does not appear if this blob has never been the destination in a Copy Blob operation, or if this blob has been modified after a concluded Copy Blob operation using Set Blob Properties, Put Blob, or Put Block List." + }, + "x-ms-copy-status": { + "x-ms-client-name": "CopyStatus", + "description": "State of the copy operation identified by x-ms-copy-id.", + "type": "string", + "enum": [ + "pending", + "success", + "aborted", + "failed" + ], + "x-ms-enum": { + "name": "CopyStatusType", + "modelAsString": false + } + }, + "x-ms-lease-duration": { + "x-ms-client-name": "LeaseDuration", + "description": "When a blob is leased, specifies whether the lease is of infinite or fixed duration.", + "type": "string", + "enum": [ + "infinite", + "fixed" + ], + "x-ms-enum": { + "name": "LeaseDurationType", + "modelAsString": false + } + }, + "x-ms-lease-state": { + "x-ms-client-name": "LeaseState", + "description": "Lease state of the blob.", + "type": "string", + "enum": [ + "available", + "leased", + "expired", + "breaking", + "broken" + ], + "x-ms-enum": { + "name": "LeaseStateType", + "modelAsString": false + } + }, + "x-ms-lease-status": { + "x-ms-client-name": "LeaseStatus", + "description": "The current lease status of the blob.", + "type": "string", + "enum": [ + "locked", + "unlocked" + ], + "x-ms-enum": { + "name": "LeaseStatusType", + "modelAsString": false + } + }, + "x-ms-client-request-id": { + "x-ms-client-name": "ClientRequestId", + "type": "string", + "description": "If a client request id header is sent in the request, this header will be present in the response with the same value." + }, + "x-ms-request-id": { + "x-ms-client-name": "RequestId", + "type": "string", + "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." + }, + "x-ms-version": { + "x-ms-client-name": "Version", + "type": "string", + "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." + }, + "Accept-Ranges": { + "type": "string", + "description": "Indicates that the service supports requests for partial blob content." + }, + "Date": { + "type": "string", + "format": "date-time-rfc1123", + "description": "UTC date/time value generated by the service that indicates the time at which the response was initiated" + }, + "x-ms-blob-committed-block-count": { + "x-ms-client-name": "BlobCommittedBlockCount", + "type": "integer", + "description": "The number of committed blocks present in the blob. This header is returned only for append blobs." + }, + "x-ms-server-encrypted": { + "x-ms-client-name": "IsServerEncrypted", + "type": "boolean", + "description": "The value of this header is set to true if the blob data and application metadata are completely encrypted using the specified algorithm. Otherwise, the value is set to false (when the blob is unencrypted, or if only parts of the blob/application metadata are encrypted)." + }, + "x-ms-encryption-key-sha256": { + "x-ms-client-name": "EncryptionKeySha256", + "type": "string", + "description": "The SHA-256 hash of the encryption key used to encrypt the blob. This header is only returned when the blob was encrypted with a customer-provided key." + }, + "x-ms-encryption-scope": { + "x-ms-client-name": "EncryptionScope", + "type": "string", + "description": "Returns the name of the encryption scope used to encrypt the blob contents and application metadata. Note that the absence of this header implies use of the default account encryption scope." + }, + "x-ms-blob-content-md5": { + "x-ms-client-name": "BlobContentMD5", + "type": "string", + "format": "byte", + "description": "If the blob has a MD5 hash, and if request contains range header (Range or x-ms-range), this response header is returned with the value of the whole blob's MD5 value. This value may or may not be equal to the value returned in Content-MD5 header, with the latter calculated from the requested range" + } + }, + "schema": { + "type": "object", + "format": "file" + } + }, + "206": { + "description": "Returns the content of a specified range of the blob.", + "headers": { + "Last-Modified": { + "type": "string", + "format": "date-time-rfc1123", + "description": "Returns the date and time the container was last modified. Any operation that modifies the blob, including an update of the blob's metadata or properties, changes the last-modified time of the blob." + }, + "x-ms-meta": { + "type": "string", + "x-ms-client-name": "Metadata", + "x-ms-header-collection-prefix": "x-ms-meta-" + }, + "Content-Length": { + "type": "integer", + "format": "int64", + "description": "The number of bytes present in the response body." + }, + "Content-Type": { + "type": "string", + "description": "The media type of the body of the response. For Download Blob this is 'application/octet-stream'" + }, + "Content-Range": { + "type": "string", + "description": "Indicates the range of bytes returned in the event that the client requested a subset of the blob by setting the 'Range' request header." + }, + "ETag": { + "type": "string", + "description": "The ETag contains a value that you can use to perform operations conditionally. If the request version is 2011-08-18 or newer, the ETag value will be in quotes." + }, + "Content-MD5": { + "type": "string", + "format": "byte", + "description": "If the blob has an MD5 hash and this operation is to read the full blob, this response header is returned so that the client can check for message content integrity." + }, + "Content-Encoding": { + "type": "string", + "description": "This header returns the value that was specified for the Content-Encoding request header" + }, + "Cache-Control": { + "type": "string", + "description": "This header is returned if it was previously specified for the blob." + }, + "Content-Disposition": { + "type": "string", + "description": "This header returns the value that was specified for the 'x-ms-blob-content-disposition' header. The Content-Disposition response header field conveys additional information about how to process the response payload, and also can be used to attach additional metadata. For example, if set to attachment, it indicates that the user-agent should not display the response, but instead show a Save As dialog with a filename other than the blob name specified." + }, + "Content-Language": { + "type": "string", + "description": "This header returns the value that was specified for the Content-Language request header." + }, + "x-ms-blob-sequence-number": { + "x-ms-client-name": "BlobSequenceNumber", + "type": "integer", + "format": "int64", + "description": "The current sequence number for a page blob. This header is not returned for block blobs or append blobs" + }, + "x-ms-blob-type": { + "x-ms-client-name": "BlobType", + "description": "The blob's type.", + "type": "string", + "enum": [ + "BlockBlob", + "PageBlob", + "AppendBlob" + ], + "x-ms-enum": { + "name": "BlobType", + "modelAsString": false + } + }, + "x-ms-content-crc64": { + "x-ms-client-name": "ContentCrc64", + "type": "string", + "format": "byte", + "description": "If the request is to read a specified range and the x-ms-range-get-content-crc64 is set to true, then the request returns a crc64 for the range, as long as the range size is less than or equal to 4 MB. If both x-ms-range-get-content-crc64 and x-ms-range-get-content-md5 is specified in the same request, it will fail with 400(Bad Request)" + }, + "x-ms-copy-completion-time": { + "x-ms-client-name": "CopyCompletionTime", + "type": "string", + "format": "date-time-rfc1123", + "description": "Conclusion time of the last attempted Copy Blob operation where this blob was the destination blob. This value can specify the time of a completed, aborted, or failed copy attempt. This header does not appear if a copy is pending, if this blob has never been the destination in a Copy Blob operation, or if this blob has been modified after a concluded Copy Blob operation using Set Blob Properties, Put Blob, or Put Block List." + }, + "x-ms-copy-status-description": { + "x-ms-client-name": "CopyStatusDescription", + "type": "string", + "description": "Only appears when x-ms-copy-status is failed or pending. Describes the cause of the last fatal or non-fatal copy operation failure. This header does not appear if this blob has never been the destination in a Copy Blob operation, or if this blob has been modified after a concluded Copy Blob operation using Set Blob Properties, Put Blob, or Put Block List" + }, + "x-ms-copy-id": { + "x-ms-client-name": "CopyId", + "type": "string", + "description": "String identifier for this copy operation. Use with Get Blob Properties to check the status of this copy operation, or pass to Abort Copy Blob to abort a pending copy." + }, + "x-ms-copy-progress": { + "x-ms-client-name": "CopyProgress", + "type": "string", + "description": "Contains the number of bytes copied and the total bytes in the source in the last attempted Copy Blob operation where this blob was the destination blob. Can show between 0 and Content-Length bytes copied. This header does not appear if this blob has never been the destination in a Copy Blob operation, or if this blob has been modified after a concluded Copy Blob operation using Set Blob Properties, Put Blob, or Put Block List" + }, + "x-ms-copy-source": { + "x-ms-client-name": "CopySource", + "type": "string", + "description": "URL up to 2 KB in length that specifies the source blob or file used in the last attempted Copy Blob operation where this blob was the destination blob. This header does not appear if this blob has never been the destination in a Copy Blob operation, or if this blob has been modified after a concluded Copy Blob operation using Set Blob Properties, Put Blob, or Put Block List." + }, + "x-ms-copy-status": { + "x-ms-client-name": "CopyStatus", + "description": "State of the copy operation identified by x-ms-copy-id.", + "type": "string", + "enum": [ + "pending", + "success", + "aborted", + "failed" + ], + "x-ms-enum": { + "name": "CopyStatusType", + "modelAsString": false + } + }, + "x-ms-lease-duration": { + "x-ms-client-name": "LeaseDuration", + "description": "When a blob is leased, specifies whether the lease is of infinite or fixed duration.", + "type": "string", + "enum": [ + "infinite", + "fixed" + ], + "x-ms-enum": { + "name": "LeaseDurationType", + "modelAsString": false + } + }, + "x-ms-lease-state": { + "x-ms-client-name": "LeaseState", + "description": "Lease state of the blob.", + "type": "string", + "enum": [ + "available", + "leased", + "expired", + "breaking", + "broken" + ], + "x-ms-enum": { + "name": "LeaseStateType", + "modelAsString": false + } + }, + "x-ms-lease-status": { + "x-ms-client-name": "LeaseStatus", + "description": "The current lease status of the blob.", + "type": "string", + "enum": [ + "locked", + "unlocked" + ], + "x-ms-enum": { + "name": "LeaseStatusType", + "modelAsString": false + } + }, + "x-ms-client-request-id": { + "x-ms-client-name": "ClientRequestId", + "type": "string", + "description": "If a client request id header is sent in the request, this header will be present in the response with the same value." + }, + "x-ms-request-id": { + "x-ms-client-name": "RequestId", + "type": "string", + "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." + }, + "x-ms-version": { + "x-ms-client-name": "Version", + "type": "string", + "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." + }, + "Accept-Ranges": { + "type": "string", + "description": "Indicates that the service supports requests for partial blob content." + }, + "Date": { + "type": "string", + "format": "date-time-rfc1123", + "description": "UTC date/time value generated by the service that indicates the time at which the response was initiated" + }, + "x-ms-blob-committed-block-count": { + "x-ms-client-name": "BlobCommittedBlockCount", + "type": "integer", + "description": "The number of committed blocks present in the blob. This header is returned only for append blobs." + }, + "x-ms-server-encrypted": { + "x-ms-client-name": "IsServerEncrypted", + "type": "boolean", + "description": "The value of this header is set to true if the blob data and application metadata are completely encrypted using the specified algorithm. Otherwise, the value is set to false (when the blob is unencrypted, or if only parts of the blob/application metadata are encrypted)." + }, + "x-ms-encryption-key-sha256": { + "x-ms-client-name": "EncryptionKeySha256", + "type": "string", + "description": "The SHA-256 hash of the encryption key used to encrypt the blob. This header is only returned when the blob was encrypted with a customer-provided key." + }, + "x-ms-encryption-scope": { + "x-ms-client-name": "EncryptionScope", + "type": "string", + "description": "Returns the name of the encryption scope used to encrypt the blob contents and application metadata. Note that the absence of this header implies use of the default account encryption scope." + }, + "x-ms-blob-content-md5": { + "x-ms-client-name": "BlobContentMD5", + "type": "string", + "format": "byte", + "description": "If the blob has a MD5 hash, and if request contains range header (Range or x-ms-range), this response header is returned with the value of the whole blob's MD5 value. This value may or may not be equal to the value returned in Content-MD5 header, with the latter calculated from the requested range" + } + }, + "schema": { + "type": "object", + "format": "file" + } + }, + "default": { + "description": "Failure", + "headers": { + "x-ms-error-code": { + "x-ms-client-name": "ErrorCode", + "type": "string" + } + }, + "schema": { + "$ref": "#/definitions/StorageError" + } + } + } + }, + "parameters": [ + { + "$ref": "#/parameters/ContainerName" + }, + { + "$ref": "#/parameters/Blob" + }, + { + "name": "comp", + "description": "comp", + "in": "query", + "required": true, + "type": "string", + "enum": [ + "query" + ] + } + ] + }, + "/{containerName}/{blob}?comp=tags": { + "get": { + "tags": [ + "blob" + ], + "operationId": "Blob_GetTags", + "description": "The Get Tags operation enables users to get the tags associated with a blob.", + "parameters": [ + { + "$ref": "#/parameters/Timeout" + }, + { + "$ref": "#/parameters/ApiVersionParameter" + }, + { + "$ref": "#/parameters/ClientRequestId" + }, + { + "$ref": "#/parameters/Snapshot" + }, + { + "$ref": "#/parameters/VersionId" + }, + { + "$ref": "#/parameters/IfTags" + }, + { + "$ref": "#/parameters/LeaseIdOptional" + } + ], + "responses": { + "200": { + "description": "Retrieved blob tags", + "headers": { + "x-ms-client-request-id": { + "x-ms-client-name": "ClientRequestId", + "type": "string", + "description": "If a client request id header is sent in the request, this header will be present in the response with the same value." + }, + "x-ms-request-id": { + "x-ms-client-name": "RequestId", + "type": "string", + "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." + }, + "x-ms-version": { + "x-ms-client-name": "Version", + "type": "string", + "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." + }, + "Date": { + "type": "string", + "format": "date-time-rfc1123", + "description": "UTC date/time value generated by the service that indicates the time at which the response was initiated" + } + }, + "schema": { + "$ref": "#/definitions/BlobTags" + } + }, + "default": { + "description": "Failure", + "headers": { + "x-ms-error-code": { + "x-ms-client-name": "ErrorCode", + "type": "string" + } + }, + "schema": { + "$ref": "#/definitions/StorageError" + } + } + } + }, + "put": { + "tags": [ + "blob" + ], + "operationId": "Blob_SetTags", + "description": "The Set Tags operation enables users to set tags on a blob.", + "parameters": [ + { + "$ref": "#/parameters/ApiVersionParameter" + }, + { + "$ref": "#/parameters/Timeout" + }, + { + "$ref": "#/parameters/VersionId" + }, + { + "$ref": "#/parameters/ContentMD5" + }, + { + "$ref": "#/parameters/ContentCrc64" + }, + { + "$ref": "#/parameters/ClientRequestId" + }, + { + "$ref": "#/parameters/IfTags" + }, + { + "$ref": "#/parameters/LeaseIdOptional" + }, + { + "$ref": "#/parameters/BlobTagsBody" + } + ], + "responses": { + "204": { + "description": "The tags were applied to the blob", + "headers": { + "x-ms-client-request-id": { + "x-ms-client-name": "ClientRequestId", + "type": "string", + "description": "If a client request id header is sent in the request, this header will be present in the response with the same value." + }, + "x-ms-request-id": { + "x-ms-client-name": "RequestId", + "type": "string", + "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." + }, + "x-ms-version": { + "x-ms-client-name": "Version", + "type": "string", + "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." + }, + "Date": { + "type": "string", + "format": "date-time-rfc1123", + "description": "UTC date/time value generated by the service that indicates the time at which the response was initiated" + } + } + }, + "default": { + "description": "Failure", + "headers": { + "x-ms-error-code": { + "x-ms-client-name": "ErrorCode", + "type": "string" + } + }, + "schema": { + "$ref": "#/definitions/StorageError" + } + } + } + }, + "parameters": [ + { + "$ref": "#/parameters/ContainerName" + }, + { + "$ref": "#/parameters/Blob" + }, + { + "name": "comp", + "description": "comp", + "in": "query", + "required": true, + "type": "string", + "enum": [ + "tags" + ] + } + ] + } + }, + "definitions": { + "KeyInfo": { + "type": "object", + "required": [ + "Start", + "Expiry" + ], + "description": "Key information", + "properties": { + "Start": { + "description": "The date-time the key is active in ISO 8601 UTC time", + "type": "string" + }, + "Expiry": { + "description": "The date-time the key expires in ISO 8601 UTC time", + "type": "string" + } + } + }, + "UserDelegationKey": { + "type": "object", + "required": [ + "SignedOid", + "SignedTid", + "SignedStart", + "SignedExpiry", + "SignedService", + "SignedVersion", + "Value" + ], + "description": "A user delegation key", + "properties": { + "SignedOid": { + "description": "The Azure Active Directory object ID in GUID format.", + "type": "string" + }, + "SignedTid": { + "description": "The Azure Active Directory tenant ID in GUID format", + "type": "string" + }, + "SignedStart": { + "description": "The date-time the key is active", + "type": "string", + "format": "date-time" + }, + "SignedExpiry": { + "description": "The date-time the key expires", + "type": "string", + "format": "date-time" + }, + "SignedService": { + "description": "Abbreviation of the Azure Storage service that accepts the key", + "type": "string" + }, + "SignedVersion": { + "description": "The service version that created the key", + "type": "string" + }, + "Value": { + "description": "The key as a base64 string", + "type": "string" + } + } + }, + "PublicAccessType": { + "type": "string", + "enum": [ + "container", + "blob" + ], + "x-ms-enum": { + "name": "PublicAccessType", + "modelAsString": true + } + }, + "CopyStatus": { + "type": "string", + "enum": [ + "pending", + "success", + "aborted", + "failed" + ], + "x-ms-enum": { + "name": "CopyStatusType", + "modelAsString": false + } + }, + "LeaseDuration": { + "type": "string", + "enum": [ + "infinite", + "fixed" + ], + "x-ms-enum": { + "name": "LeaseDurationType", + "modelAsString": false + } + }, + "LeaseState": { + "type": "string", + "enum": [ + "available", + "leased", + "expired", + "breaking", + "broken" + ], + "x-ms-enum": { + "name": "LeaseStateType", + "modelAsString": false + } + }, + "LeaseStatus": { + "type": "string", + "enum": [ + "locked", + "unlocked" + ], + "x-ms-enum": { + "name": "LeaseStatusType", + "modelAsString": false + } + }, + "StorageError": { + "type": "object", + "properties": { + "Message": { + "type": "string" + } + } + }, + "AccessPolicy": { + "type": "object", + "description": "An Access policy", + "properties": { + "Start": { + "description": "the date-time the policy is active", + "type": "string", + "format": "date-time" + }, + "Expiry": { + "description": "the date-time the policy expires", + "type": "string", + "format": "date-time" + }, + "Permission": { + "description": "the permissions for the acl policy", + "type": "string" + } + } + }, + "AccessTier": { + "type": "string", + "enum": [ + "P4", + "P6", + "P10", + "P15", + "P20", + "P30", + "P40", + "P50", + "P60", + "P70", + "P80", + "Hot", + "Cool", + "Archive", + "Premium" + ], + "x-ms-enum": { + "name": "AccessTier", + "modelAsString": true + } + }, + "ArchiveStatus": { + "type": "string", + "enum": [ + "rehydrate-pending-to-hot", + "rehydrate-pending-to-cool" + ], + "x-ms-enum": { + "name": "ArchiveStatus", + "modelAsString": true + } + }, + "BlobItemInternal": { + "xml": { + "name": "Blob" + }, + "description": "An Azure Storage blob", + "type": "object", + "required": [ + "Name", + "Properties" + ], + "properties": { + "Name": { + "type": "string" + }, + "Deleted": { + "type": "boolean" + }, + "Snapshot": { + "type": "string" + }, + "VersionId": { + "type": "string" + }, + "IsCurrentVersion": { + "type": "boolean" + }, + "Properties": { + "$ref": "#/definitions/BlobPropertiesInternal" + }, + "Metadata": { + "$ref": "#/definitions/BlobMetadata" + }, + "BlobTags": { + "$ref": "#/definitions/BlobTags" + }, + "ObjectReplicationMetadata": { + "$ref": "#/definitions/ObjectReplicationMetadata" + }, + "HasVersionsOnly": { + "type": "boolean" + } + } + }, + "BlobPropertiesInternal": { + "xml": { + "name": "Properties" + }, + "description": "Properties of a blob", + "type": "object", + "required": [ + "Etag", + "Last-Modified" + ], + "properties": { + "Creation-Time": { + "type": "string", + "format": "date-time-rfc1123" + }, + "Last-Modified": { + "type": "string", + "format": "date-time-rfc1123" + }, + "Etag": { + "type": "string" + }, + "Content-Length": { + "type": "integer", + "format": "int64", + "description": "Size in bytes" + }, + "Content-Type": { + "type": "string" + }, + "Content-Encoding": { + "type": "string" + }, + "Content-Language": { + "type": "string" + }, + "Content-MD5": { + "type": "string", + "format": "byte" + }, + "Content-Disposition": { + "type": "string" + }, + "Cache-Control": { + "type": "string" + }, + "x-ms-blob-sequence-number": { + "x-ms-client-name": "blobSequenceNumber", + "type": "integer", + "format": "int64" + }, + "BlobType": { + "type": "string", + "enum": [ + "BlockBlob", + "PageBlob", + "AppendBlob" + ], + "x-ms-enum": { + "name": "BlobType", + "modelAsString": false + } + }, + "LeaseStatus": { + "$ref": "#/definitions/LeaseStatus" + }, + "LeaseState": { + "$ref": "#/definitions/LeaseState" + }, + "LeaseDuration": { + "$ref": "#/definitions/LeaseDuration" + }, + "CopyId": { + "type": "string" + }, + "CopyStatus": { + "$ref": "#/definitions/CopyStatus" + }, + "CopySource": { + "type": "string" + }, + "CopyProgress": { + "type": "string" + }, + "CopyCompletionTime": { + "type": "string", + "format": "date-time-rfc1123" + }, + "CopyStatusDescription": { + "type": "string" + }, + "ServerEncrypted": { + "type": "boolean" + }, + "IncrementalCopy": { + "type": "boolean" + }, + "DestinationSnapshot": { + "type": "string" + }, + "DeletedTime": { + "type": "string", + "format": "date-time-rfc1123" + }, + "RemainingRetentionDays": { + "type": "integer" + }, + "AccessTier": { + "$ref": "#/definitions/AccessTier" + }, + "AccessTierInferred": { + "type": "boolean" + }, + "ArchiveStatus": { + "$ref": "#/definitions/ArchiveStatus" + }, + "CustomerProvidedKeySha256": { + "type": "string" + }, + "EncryptionScope": { + "type": "string", + "description": "The name of the encryption scope under which the blob is encrypted." + }, + "AccessTierChangeTime": { + "type": "string", + "format": "date-time-rfc1123" + }, + "TagCount": { + "type": "integer" + }, + "Expiry-Time": { + "x-ms-client-name": "ExpiresOn", + "type": "string", + "format": "date-time-rfc1123" + }, + "Sealed": { + "x-ms-client-name": "IsSealed", + "type": "boolean" + }, + "RehydratePriority": { + "$ref": "#/definitions/RehydratePriority" + }, + "LastAccessTime": { + "x-ms-client-name": "LastAccessedOn", + "type": "string", + "format": "date-time-rfc1123" + }, + "ImmutabilityPolicyUntilDate": { + "x-ms-client-name": "ImmutabilityPolicyExpiresOn", + "type": "string", + "format": "date-time-rfc1123" + }, + "ImmutabilityPolicyMode": { + "type": "string", + "enum": [ + "Mutable", + "Unlocked", + "Locked" + ], + "x-ms-enum": { + "name": "BlobImmutabilityPolicyMode", + "modelAsString": false + } + }, + "LegalHold": { + "type": "boolean" + } + } + }, + "ListBlobsFlatSegmentResponse": { + "xml": { + "name": "EnumerationResults" + }, + "description": "An enumeration of blobs", + "type": "object", + "required": [ + "ServiceEndpoint", + "ContainerName", + "Segment" + ], + "properties": { + "ServiceEndpoint": { + "type": "string", + "xml": { + "attribute": true + } + }, + "ContainerName": { + "type": "string", + "xml": { + "attribute": true + } + }, + "Prefix": { + "type": "string" + }, + "Marker": { + "type": "string" + }, + "MaxResults": { + "type": "integer" + }, + "Segment": { + "$ref": "#/definitions/BlobFlatListSegment" + }, + "NextMarker": { + "type": "string" + } + } + }, + "ListBlobsHierarchySegmentResponse": { + "xml": { + "name": "EnumerationResults" + }, + "description": "An enumeration of blobs", + "type": "object", + "required": [ + "ServiceEndpoint", + "ContainerName", + "Segment" + ], + "properties": { + "ServiceEndpoint": { + "type": "string", + "xml": { + "attribute": true + } + }, + "ContainerName": { + "type": "string", + "xml": { + "attribute": true + } + }, + "Prefix": { + "type": "string" + }, + "Marker": { + "type": "string" + }, + "MaxResults": { + "type": "integer" + }, + "Delimiter": { + "type": "string" + }, + "Segment": { + "$ref": "#/definitions/BlobHierarchyListSegment" + }, + "NextMarker": { + "type": "string" + } + } + }, + "BlobFlatListSegment": { + "xml": { + "name": "Blobs" + }, + "required": [ + "BlobItems" + ], + "type": "object", + "properties": { + "BlobItems": { + "type": "array", + "items": { + "$ref": "#/definitions/BlobItemInternal" + } + } + } + }, + "BlobHierarchyListSegment": { + "xml": { + "name": "Blobs" + }, + "type": "object", + "required": [ + "BlobItems" + ], + "properties": { + "BlobPrefixes": { + "type": "array", + "items": { + "$ref": "#/definitions/BlobPrefix" + } + }, + "BlobItems": { + "type": "array", + "items": { + "$ref": "#/definitions/BlobItemInternal" + } + } + } + }, + "BlobPrefix": { + "type": "object", + "required": [ + "Name" + ], + "properties": { + "Name": { + "type": "string" + } + } + }, + "BlobName": { + "type": "object", + "properties": { + "Encoded": { + "xml": { + "attribute": true, + "name": "Encoded" + }, + "type": "boolean", + "description": "Indicates if the blob name is encoded." + }, + "content": { + "xml": { + "x-ms-text": true + }, + "type": "string", + "description": "The name of the blob." + } + } + }, + "BlobTag": { + "xml": { + "name": "Tag" + }, + "type": "object", + "required": [ + "Key", + "Value" + ], + "properties": { + "Key": { + "type": "string" + }, + "Value": { + "type": "string" + } + } + }, + "BlobTags": { + "type": "object", + "xml": { + "name": "Tags" + }, + "description": "Blob tags", + "required": [ + "BlobTagSet" + ], + "properties": { + "BlobTagSet": { + "xml": { + "wrapped": true, + "name": "TagSet" + }, + "type": "array", + "items": { + "$ref": "#/definitions/BlobTag" + } + } + } + }, + "Block": { + "type": "object", + "required": [ + "Name", + "Size" + ], + "description": "Represents a single block in a block blob. It describes the block's ID and size.", + "properties": { + "Name": { + "description": "The base64 encoded block ID.", + "type": "string" + }, + "Size": { + "description": "The block size in bytes.", + "type": "integer", + "format": "int64" + } + } + }, + "BlockList": { + "type": "object", + "properties": { + "CommittedBlocks": { + "xml": { + "wrapped": true + }, + "type": "array", + "items": { + "$ref": "#/definitions/Block" + } + }, + "UncommittedBlocks": { + "xml": { + "wrapped": true + }, + "type": "array", + "items": { + "$ref": "#/definitions/Block" + } + } + } + }, + "BlockLookupList": { + "type": "object", + "properties": { + "Committed": { + "type": "array", + "items": { + "type": "string", + "xml": { + "name": "Committed" + } + } + }, + "Uncommitted": { + "type": "array", + "items": { + "type": "string", + "xml": { + "name": "Uncommitted" + } + } + }, + "Latest": { + "type": "array", + "items": { + "type": "string", + "xml": { + "name": "Latest" + } + } + } + }, + "xml": { + "name": "BlockList" + } + }, + "ContainerItem": { + "xml": { + "name": "Container" + }, + "type": "object", + "required": [ + "Name", + "Properties" + ], + "description": "An Azure Storage container", + "properties": { + "Name": { + "type": "string" + }, + "Deleted": { + "type": "boolean" + }, + "Version": { + "type": "string" + }, + "Properties": { + "$ref": "#/definitions/ContainerProperties" + }, + "Metadata": { + "$ref": "#/definitions/ContainerMetadata" + } + } + }, + "ContainerProperties": { + "type": "object", + "required": [ + "Last-Modified", + "Etag" + ], + "description": "Properties of a container", + "properties": { + "Last-Modified": { + "type": "string", + "format": "date-time-rfc1123" + }, + "Etag": { + "type": "string" + }, + "LeaseStatus": { + "$ref": "#/definitions/LeaseStatus" + }, + "LeaseState": { + "$ref": "#/definitions/LeaseState" + }, + "LeaseDuration": { + "$ref": "#/definitions/LeaseDuration" + }, + "PublicAccess": { + "$ref": "#/definitions/PublicAccessType" + }, + "HasImmutabilityPolicy": { + "type": "boolean" + }, + "HasLegalHold": { + "type": "boolean" + }, + "DefaultEncryptionScope": { + "type": "string" + }, + "DenyEncryptionScopeOverride": { + "type": "boolean", + "x-ms-client-name": "PreventEncryptionScopeOverride" + }, + "DeletedTime": { + "type": "string", + "format": "date-time-rfc1123" + }, + "RemainingRetentionDays": { + "type": "integer" + }, + "ImmutableStorageWithVersioningEnabled": { + "x-ms-client-name": "IsImmutableStorageWithVersioningEnabled", + "type": "boolean", + "description": "Indicates if version level worm is enabled on this container." + } + } + }, + "DelimitedTextConfiguration": { + "xml": { + "name": "DelimitedTextConfiguration" + }, + "description": "Groups the settings used for interpreting the blob data if the blob is delimited text formatted.", + "type": "object", + "properties": { + "ColumnSeparator": { + "type": "string", + "description": "The string used to separate columns.", + "xml": { + "name": "ColumnSeparator" + } + }, + "FieldQuote": { + "type": "string", + "description": "The string used to quote a specific field.", + "xml": { + "name": "FieldQuote" + } + }, + "RecordSeparator": { + "type": "string", + "description": "The string used to separate records.", + "xml": { + "name": "RecordSeparator" + } + }, + "EscapeChar": { + "type": "string", + "description": "The string used as an escape character.", + "xml": { + "name": "EscapeChar" + } + }, + "HeadersPresent": { + "type": "boolean", + "description": "Represents whether the data has headers.", + "xml": { + "name": "HasHeaders" + } + } + } + }, + "JsonTextConfiguration": { + "xml": { + "name": "JsonTextConfiguration" + }, + "description": "json text configuration", + "type": "object", + "properties": { + "RecordSeparator": { + "type": "string", + "description": "The string used to separate records.", + "xml": { + "name": "RecordSeparator" + } + } + } + }, + "ArrowConfiguration": { + "xml": { + "name": "ArrowConfiguration" + }, + "description": "Groups the settings used for formatting the response if the response should be Arrow formatted.", + "type": "object", + "required": [ + "Schema" + ], + "properties": { + "Schema": { + "type": "array", + "items": { + "$ref": "#/definitions/ArrowField" + }, + "xml": { + "wrapped": true, + "name": "Schema" + } + } + } + }, + "ParquetConfiguration": { + "xml": { + "name": "ParquetTextConfiguration" + }, + "description": "parquet configuration", + "type": "object" + }, + "ArrowField": { + "xml": { + "name": "Field" + }, + "description": "Groups settings regarding specific field of an arrow schema", + "type": "object", + "required": [ + "Type" + ], + "properties": { + "Type": { + "type": "string" + }, + "Name": { + "type": "string" + }, + "Precision": { + "type": "integer" + }, + "Scale": { + "type": "integer" + } + } + }, + "ListContainersSegmentResponse": { + "xml": { + "name": "EnumerationResults" + }, + "description": "An enumeration of containers", + "type": "object", + "required": [ + "ServiceEndpoint", + "ContainerItems" + ], + "properties": { + "ServiceEndpoint": { + "type": "string", + "xml": { + "attribute": true + } + }, + "Prefix": { + "type": "string" + }, + "Marker": { + "type": "string" + }, + "MaxResults": { + "type": "integer" + }, + "ContainerItems": { + "xml": { + "wrapped": true, + "name": "Containers" + }, + "type": "array", + "items": { + "$ref": "#/definitions/ContainerItem" + } + }, + "NextMarker": { + "type": "string" + } + } + }, + "CorsRule": { + "description": "CORS is an HTTP feature that enables a web application running under one domain to access resources in another domain. Web browsers implement a security restriction known as same-origin policy that prevents a web page from calling APIs in a different domain; CORS provides a secure way to allow one domain (the origin domain) to call APIs in another domain", + "type": "object", + "required": [ + "AllowedOrigins", + "AllowedMethods", + "MaxAgeInSeconds" + ], + "properties": { + "AllowedOrigins": { + "description": "The origin domains that are permitted to make a request against the storage service via CORS. The origin domain is the domain from which the request originates. Note that the origin must be an exact case-sensitive match with the origin that the user age sends to the service. You can also use the wildcard character '*' to allow all origin domains to make requests via CORS.", + "type": "string" + }, + "AllowedMethods": { + "description": "The methods (HTTP request verbs) that the origin domain may use for a CORS request. (comma separated)", + "type": "string" + }, + "AllowedHeaders": { + "description": "the request headers that the origin domain may specify on the CORS request.", + "type": "string" + }, + "ExposedHeaders": { + "description": "The response headers that may be sent in the response to the CORS request and exposed by the browser to the request issuer", + "type": "string" + }, + "MaxAgeInSeconds": { + "description": "The maximum amount time that a browser should cache the preflight OPTIONS request.", + "type": "integer", + "minimum": 0 + } + } + }, + "ErrorCode": { + "description": "Error codes returned by the service", + "type": "string", + "enum": [ + "AccountAlreadyExists", + "AccountBeingCreated", + "AccountIsDisabled", + "AuthenticationFailed", + "AuthorizationFailure", + "ConditionHeadersNotSupported", + "ConditionNotMet", + "EmptyMetadataKey", + "InsufficientAccountPermissions", + "InternalError", + "InvalidAuthenticationInfo", + "InvalidHeaderValue", + "InvalidHttpVerb", + "InvalidInput", + "InvalidMd5", + "InvalidMetadata", + "InvalidQueryParameterValue", + "InvalidRange", + "InvalidResourceName", + "InvalidUri", + "InvalidXmlDocument", + "InvalidXmlNodeValue", + "Md5Mismatch", + "MetadataTooLarge", + "MissingContentLengthHeader", + "MissingRequiredQueryParameter", + "MissingRequiredHeader", + "MissingRequiredXmlNode", + "MultipleConditionHeadersNotSupported", + "OperationTimedOut", + "OutOfRangeInput", + "OutOfRangeQueryParameterValue", + "RequestBodyTooLarge", + "ResourceTypeMismatch", + "RequestUrlFailedToParse", + "ResourceAlreadyExists", + "ResourceNotFound", + "ServerBusy", + "UnsupportedHeader", + "UnsupportedXmlNode", + "UnsupportedQueryParameter", + "UnsupportedHttpVerb", + "AppendPositionConditionNotMet", + "BlobAlreadyExists", + "BlobImmutableDueToPolicy", + "BlobNotFound", + "BlobOverwritten", + "BlobTierInadequateForContentLength", + "BlobUsesCustomerSpecifiedEncryption", + "BlockCountExceedsLimit", + "BlockListTooLong", + "CannotChangeToLowerTier", + "CannotVerifyCopySource", + "ContainerAlreadyExists", + "ContainerBeingDeleted", + "ContainerDisabled", + "ContainerNotFound", + "ContentLengthLargerThanTierLimit", + "CopyAcrossAccountsNotSupported", + "CopyIdMismatch", + "FeatureVersionMismatch", + "IncrementalCopyBlobMismatch", + "IncrementalCopyOfEarlierVersionSnapshotNotAllowed", + "IncrementalCopySourceMustBeSnapshot", + "InfiniteLeaseDurationRequired", + "InvalidBlobOrBlock", + "InvalidBlobTier", + "InvalidBlobType", + "InvalidBlockId", + "InvalidBlockList", + "InvalidOperation", + "InvalidPageRange", + "InvalidSourceBlobType", + "InvalidSourceBlobUrl", + "InvalidVersionForPageBlobOperation", + "LeaseAlreadyPresent", + "LeaseAlreadyBroken", + "LeaseIdMismatchWithBlobOperation", + "LeaseIdMismatchWithContainerOperation", + "LeaseIdMismatchWithLeaseOperation", + "LeaseIdMissing", + "LeaseIsBreakingAndCannotBeAcquired", + "LeaseIsBreakingAndCannotBeChanged", + "LeaseIsBrokenAndCannotBeRenewed", + "LeaseLost", + "LeaseNotPresentWithBlobOperation", + "LeaseNotPresentWithContainerOperation", + "LeaseNotPresentWithLeaseOperation", + "MaxBlobSizeConditionNotMet", + "NoAuthenticationInformation", + "NoPendingCopyOperation", + "OperationNotAllowedOnIncrementalCopyBlob", + "PendingCopyOperation", + "PreviousSnapshotCannotBeNewer", + "PreviousSnapshotNotFound", + "PreviousSnapshotOperationNotSupported", + "SequenceNumberConditionNotMet", + "SequenceNumberIncrementTooLarge", + "SnapshotCountExceeded", + "SnapshotOperationRateExceeded", + "SnapshotsPresent", + "SourceConditionNotMet", + "SystemInUse", + "TargetConditionNotMet", + "UnauthorizedBlobOverwrite", + "BlobBeingRehydrated", + "BlobArchived", + "BlobNotArchived", + "AuthorizationSourceIPMismatch", + "AuthorizationProtocolMismatch", + "AuthorizationPermissionMismatch", + "AuthorizationServiceMismatch", + "AuthorizationResourceTypeMismatch" + ], + "x-ms-enum": { + "name": "StorageErrorCode", + "modelAsString": true + } + }, + "FilterBlobItem": { + "xml": { + "name": "Blob" + }, + "description": "Blob info from a Filter Blobs API call", + "type": "object", + "required": [ + "Name", + "ContainerName" + ], + "properties": { + "Name": { + "type": "string" + }, + "ContainerName": { + "type": "string" + }, + "Tags": { + "$ref": "#/definitions/BlobTags" + }, + "VersionId": { + "type": "string" + }, + "IsCurrentVersion": { + "type": "boolean" + } + } + }, + "FilterBlobSegment": { + "description": "The result of a Filter Blobs API call", + "xml": { + "name": "EnumerationResults" + }, + "type": "object", + "required": [ + "ServiceEndpoint", + "Where", + "Blobs" + ], + "properties": { + "ServiceEndpoint": { + "type": "string", + "xml": { + "attribute": true + } + }, + "Where": { + "type": "string" + }, + "Blobs": { + "xml": { + "name": "Blobs", + "wrapped": true + }, + "type": "array", + "items": { + "$ref": "#/definitions/FilterBlobItem" + } + }, + "NextMarker": { + "type": "string" + } + } + }, + "GeoReplication": { + "description": "Geo-Replication information for the Secondary Storage Service", + "type": "object", + "required": [ + "Status", + "LastSyncTime" + ], + "properties": { + "Status": { + "description": "The status of the secondary location", + "type": "string", + "enum": [ + "live", + "bootstrap", + "unavailable" + ], + "x-ms-enum": { + "name": "GeoReplicationStatusType", + "modelAsString": true + } + }, + "LastSyncTime": { + "description": "A GMT date/time value, to the second. All primary writes preceding this value are guaranteed to be available for read operations at the secondary. Primary writes after this point in time may or may not be available for reads.", + "type": "string", + "format": "date-time-rfc1123" + } + } + }, + "Logging": { + "description": "Azure Analytics Logging settings.", + "type": "object", + "required": [ + "Version", + "Delete", + "Read", + "Write", + "RetentionPolicy" + ], + "properties": { + "Version": { + "description": "The version of Storage Analytics to configure.", + "type": "string" + }, + "Delete": { + "description": "Indicates whether all delete requests should be logged.", + "type": "boolean" + }, + "Read": { + "description": "Indicates whether all read requests should be logged.", + "type": "boolean" + }, + "Write": { + "description": "Indicates whether all write requests should be logged.", + "type": "boolean" + }, + "RetentionPolicy": { + "$ref": "#/definitions/RetentionPolicy" + } + } + }, + "ContainerMetadata": { + "type": "object", + "xml": { + "name": "Metadata" + }, + "additionalProperties": { + "type": "string" + } + }, + "BlobMetadata": { + "type": "object", + "xml": { + "name": "Metadata" + }, + "properties": { + "Encrypted": { + "type": "string", + "xml": { + "attribute": true + } + } + }, + "additionalProperties": { + "type": "string" + } + }, + "ObjectReplicationMetadata": { + "type": "object", + "xml": { + "name": "OrMetadata" + }, + "additionalProperties": { + "type": "string" + } + }, + "Metrics": { + "description": "a summary of request statistics grouped by API in hour or minute aggregates for blobs", + "required": [ + "Enabled" + ], + "properties": { + "Version": { + "description": "The version of Storage Analytics to configure.", + "type": "string" + }, + "Enabled": { + "description": "Indicates whether metrics are enabled for the Blob service.", + "type": "boolean" + }, + "IncludeAPIs": { + "description": "Indicates whether metrics should generate summary statistics for called API operations.", + "type": "boolean" + }, + "RetentionPolicy": { + "$ref": "#/definitions/RetentionPolicy" + } + } + }, + "PageList": { + "description": "the list of pages", + "type": "object", + "properties": { + "PageRange": { + "type": "array", + "items": { + "$ref": "#/definitions/PageRange" + } + }, + "ClearRange": { + "type": "array", + "items": { + "$ref": "#/definitions/ClearRange" + } + }, + "NextMarker": { + "type": "string" + } + } + }, + "PageRange": { + "type": "object", + "required": [ + "Start", + "End" + ], + "properties": { + "Start": { + "type": "integer", + "format": "int64", + "xml": { + "name": "Start" + } + }, + "End": { + "type": "integer", + "format": "int64", + "xml": { + "name": "End" + } + } + }, + "xml": { + "name": "PageRange" + } + }, + "ClearRange": { + "type": "object", + "required": [ + "Start", + "End" + ], + "properties": { + "Start": { + "type": "integer", + "format": "int64", + "xml": { + "name": "Start" + } + }, + "End": { + "type": "integer", + "format": "int64", + "xml": { + "name": "End" + } + } + }, + "xml": { + "name": "ClearRange" + } + }, + "QueryRequest": { + "description": "Groups the set of query request settings.", + "type": "object", + "required": [ + "QueryType", + "Expression" + ], + "properties": { + "QueryType": { + "type": "string", + "description": "Required. The type of the provided query expression.", + "xml": { + "name": "QueryType" + }, + "enum": [ + "SQL" + ] + }, + "Expression": { + "type": "string", + "description": "The query expression in SQL. The maximum size of the query expression is 256KiB.", + "xml": { + "name": "Expression" + } + }, + "InputSerialization": { + "$ref": "#/definitions/QuerySerialization", + "xml": { + "name": "InputSerialization" + } + }, + "OutputSerialization": { + "$ref": "#/definitions/QuerySerialization", + "xml": { + "name": "OutputSerialization" + } + } + }, + "xml": { + "name": "QueryRequest" + } + }, + "QueryFormat": { + "type": "object", + "required": [ + "Type" + ], + "properties": { + "Type": { + "$ref": "#/definitions/QueryType" + }, + "DelimitedTextConfiguration": { + "$ref": "#/definitions/DelimitedTextConfiguration" + }, + "JsonTextConfiguration": { + "$ref": "#/definitions/JsonTextConfiguration" + }, + "ArrowConfiguration": { + "$ref": "#/definitions/ArrowConfiguration" + }, + "ParquetTextConfiguration": { + "$ref": "#/definitions/ParquetConfiguration" + } + } + }, + "QuerySerialization": { + "type": "object", + "required": [ + "Format" + ], + "properties": { + "Format": { + "$ref": "#/definitions/QueryFormat", + "xml": { + "name": "Format" + } + } + } + }, + "QueryType": { + "type": "string", + "description": "The quick query format type.", + "enum": [ + "delimited", + "json", + "arrow", + "parquet" + ], + "x-ms-enum": { + "name": "QueryFormatType", + "modelAsString": false + }, + "xml": { + "name": "Type" + } + }, + "RehydratePriority": { + "description": "If an object is in rehydrate pending state then this header is returned with priority of rehydrate. Valid values are High and Standard.", + "type": "string", + "enum": [ + "High", + "Standard" + ], + "x-ms-enum": { + "name": "RehydratePriority", + "modelAsString": true + }, + "xml": { + "name": "RehydratePriority" + } + }, + "RetentionPolicy": { + "description": "the retention policy which determines how long the associated data should persist", + "type": "object", + "required": [ + "Enabled" + ], + "properties": { + "Enabled": { + "description": "Indicates whether a retention policy is enabled for the storage service", + "type": "boolean" + }, + "Days": { + "description": "Indicates the number of days that metrics or logging or soft-deleted data should be retained. All data older than this value will be deleted", + "type": "integer", + "minimum": 1 + }, + "AllowPermanentDelete": { + "description": "Indicates whether permanent delete is allowed on this storage account.", + "type": "boolean" + } + } + }, + "SignedIdentifier": { + "xml": { + "name": "SignedIdentifier" + }, + "description": "signed identifier", + "type": "object", + "required": [ + "Id", + "AccessPolicy" + ], + "properties": { + "Id": { + "type": "string", + "description": "a unique id" + }, + "AccessPolicy": { + "$ref": "#/definitions/AccessPolicy" + } + } + }, + "SignedIdentifiers": { + "description": "a collection of signed identifiers", + "type": "array", + "items": { + "$ref": "#/definitions/SignedIdentifier" + }, + "xml": { + "wrapped": true, + "name": "SignedIdentifiers" + } + }, + "StaticWebsite": { + "description": "The properties that enable an account to host a static website", + "type": "object", + "required": [ + "Enabled" + ], + "properties": { + "Enabled": { + "description": "Indicates whether this account is hosting a static website", + "type": "boolean" + }, + "IndexDocument": { + "description": "The default name of the index page under each directory", + "type": "string" + }, + "ErrorDocument404Path": { + "description": "The absolute path of the custom 404 page", + "type": "string" + }, + "DefaultIndexDocumentPath": { + "description": "Absolute path of the default index page", + "type": "string" + } + } + }, + "StorageServiceProperties": { + "description": "Storage Service Properties.", + "type": "object", + "properties": { + "Logging": { + "$ref": "#/definitions/Logging" + }, + "HourMetrics": { + "$ref": "#/definitions/Metrics" + }, + "MinuteMetrics": { + "$ref": "#/definitions/Metrics" + }, + "Cors": { + "description": "The set of CORS rules.", + "type": "array", + "items": { + "$ref": "#/definitions/CorsRule" + }, + "xml": { + "wrapped": true + } + }, + "DefaultServiceVersion": { + "description": "The default version to use for requests to the Blob service if an incoming request's version is not specified. Possible values include version 2008-10-27 and all more recent versions", + "type": "string" + }, + "DeleteRetentionPolicy": { + "$ref": "#/definitions/RetentionPolicy" + }, + "StaticWebsite": { + "$ref": "#/definitions/StaticWebsite" + } + } + }, + "StorageServiceStats": { + "description": "Stats for the storage service.", + "type": "object", + "properties": { + "GeoReplication": { + "$ref": "#/definitions/GeoReplication" + } + } + } + }, + "parameters": { + "Url": { + "name": "url", + "description": "The URL of the service account, container, or blob that is the target of the desired operation.", + "x-ms-parameter-location": "client", + "required": true, + "type": "string", + "in": "path", + "x-ms-skip-url-encoding": true + }, + "ApiVersionParameter": { + "name": "x-ms-version", + "x-ms-parameter-location": "client", + "x-ms-client-name": "version", + "in": "header", + "required": false, + "type": "string", + "description": "Specifies the version of the operation to use for this request.", + "enum": [ + "2021-10-04" + ] + }, + "Blob": { + "name": "blob", + "in": "path", + "required": true, + "type": "string", + "pattern": "^[a-zA-Z0-9]+(?:/[a-zA-Z0-9]+)*(?:\\.[a-zA-Z0-9]+){0,1}$", + "minLength": 1, + "maxLength": 1024, + "x-ms-parameter-location": "method", + "description": "The blob name." + }, + "BlobCacheControl": { + "name": "x-ms-blob-cache-control", + "x-ms-client-name": "blobCacheControl", + "in": "header", + "required": false, + "type": "string", + "x-ms-parameter-location": "method", + "x-ms-parameter-grouping": { + "name": "blob-HTTP-headers" + }, + "description": "Optional. Sets the blob's cache control. If specified, this property is stored with the blob and returned with a read request." + }, + "BlobConditionAppendPos": { + "name": "x-ms-blob-condition-appendpos", + "x-ms-client-name": "appendPosition", + "in": "header", + "required": false, + "type": "integer", + "format": "int64", + "x-ms-parameter-location": "method", + "x-ms-parameter-grouping": { + "name": "append-position-access-conditions" + }, + "description": "Optional conditional header, used only for the Append Block operation. A number indicating the byte offset to compare. Append Block will succeed only if the append position is equal to this number. If it is not, the request will fail with the AppendPositionConditionNotMet error (HTTP status code 412 - Precondition Failed)." + }, + "BlobConditionMaxSize": { + "name": "x-ms-blob-condition-maxsize", + "x-ms-client-name": "maxSize", + "in": "header", + "required": false, + "type": "integer", + "format": "int64", + "x-ms-parameter-location": "method", + "x-ms-parameter-grouping": { + "name": "append-position-access-conditions" + }, + "description": "Optional conditional header. The max length in bytes permitted for the append blob. If the Append Block operation would cause the blob to exceed that limit or if the blob size is already greater than the value specified in this header, the request will fail with MaxBlobSizeConditionNotMet error (HTTP status code 412 - Precondition Failed)." + }, + "BlobPublicAccess": { + "name": "x-ms-blob-public-access", + "x-ms-client-name": "access", + "in": "header", + "required": false, + "x-ms-parameter-location": "method", + "description": "Specifies whether data in the container may be accessed publicly and the level of access", + "type": "string", + "enum": [ + "container", + "blob" + ], + "x-ms-enum": { + "name": "PublicAccessType", + "modelAsString": true + } + }, + "BlobTagsBody": { + "name": "Tags", + "in": "body", + "schema": { + "$ref": "#/definitions/BlobTags" + }, + "x-ms-parameter-location": "method", + "description": "Blob tags" + }, + "BlobTagsHeader": { + "name": "x-ms-tags", + "x-ms-client-name": "BlobTagsString", + "in": "header", + "required": false, + "type": "string", + "x-ms-parameter-location": "method", + "description": "Optional. Used to set blob tags in various blob operations." + }, + "AccessTierRequired": { + "name": "x-ms-access-tier", + "x-ms-client-name": "tier", + "in": "header", + "required": true, + "type": "string", + "enum": [ + "P4", + "P6", + "P10", + "P15", + "P20", + "P30", + "P40", + "P50", + "P60", + "P70", + "P80", + "Hot", + "Cool", + "Archive", + "Premium" + ], + "x-ms-enum": { + "name": "AccessTier", + "modelAsString": true + }, + "x-ms-parameter-location": "method", + "description": "Indicates the tier to be set on the blob." + }, + "AccessTierOptional": { + "name": "x-ms-access-tier", + "x-ms-client-name": "tier", + "in": "header", + "required": false, + "type": "string", + "enum": [ + "P4", + "P6", + "P10", + "P15", + "P20", + "P30", + "P40", + "P50", + "P60", + "P70", + "P80", + "Hot", + "Cool", + "Archive", + "Premium" + ], + "x-ms-enum": { + "name": "AccessTier", + "modelAsString": true + }, + "x-ms-parameter-location": "method", + "description": "Optional. Indicates the tier to be set on the blob." + }, + "PremiumPageBlobAccessTierOptional": { + "name": "x-ms-access-tier", + "x-ms-client-name": "tier", + "in": "header", + "required": false, + "type": "string", + "enum": [ + "P4", + "P6", + "P10", + "P15", + "P20", + "P30", + "P40", + "P50", + "P60", + "P70", + "P80" + ], + "x-ms-enum": { + "name": "PremiumPageBlobAccessTier", + "modelAsString": true + }, + "x-ms-parameter-location": "method", + "description": "Optional. Indicates the tier to be set on the page blob." + }, + "RehydratePriority": { + "name": "x-ms-rehydrate-priority", + "x-ms-client-name": "rehydratePriority", + "in": "header", + "required": false, + "type": "string", + "enum": [ + "High", + "Standard" + ], + "x-ms-enum": { + "name": "RehydratePriority", + "modelAsString": true + }, + "x-ms-parameter-location": "method", + "description": "Optional: Indicates the priority with which to rehydrate an archived blob." + }, + "BlobContentDisposition": { + "name": "x-ms-blob-content-disposition", + "x-ms-client-name": "blobContentDisposition", + "in": "header", + "required": false, + "type": "string", + "x-ms-parameter-location": "method", + "x-ms-parameter-grouping": { + "name": "blob-HTTP-headers" + }, + "description": "Optional. Sets the blob's Content-Disposition header." + }, + "BlobContentEncoding": { + "name": "x-ms-blob-content-encoding", + "x-ms-client-name": "blobContentEncoding", + "in": "header", + "required": false, + "type": "string", + "x-ms-parameter-location": "method", + "x-ms-parameter-grouping": { + "name": "blob-HTTP-headers" + }, + "description": "Optional. Sets the blob's content encoding. If specified, this property is stored with the blob and returned with a read request." + }, + "BlobContentLanguage": { + "name": "x-ms-blob-content-language", + "x-ms-client-name": "blobContentLanguage", + "in": "header", + "required": false, + "type": "string", + "x-ms-parameter-location": "method", + "x-ms-parameter-grouping": { + "name": "blob-HTTP-headers" + }, + "description": "Optional. Set the blob's content language. If specified, this property is stored with the blob and returned with a read request." + }, + "BlobContentLengthOptional": { + "name": "x-ms-blob-content-length", + "x-ms-client-name": "blobContentLength", + "in": "header", + "required": false, + "type": "integer", + "format": "int64", + "x-ms-parameter-location": "method", + "description": "This header specifies the maximum size for the page blob, up to 1 TB. The page blob size must be aligned to a 512-byte boundary." + }, + "BlobContentLengthRequired": { + "name": "x-ms-blob-content-length", + "x-ms-client-name": "blobContentLength", + "in": "header", + "required": true, + "type": "integer", + "format": "int64", + "x-ms-parameter-location": "method", + "description": "This header specifies the maximum size for the page blob, up to 1 TB. The page blob size must be aligned to a 512-byte boundary." + }, + "BlobContentMD5": { + "name": "x-ms-blob-content-md5", + "x-ms-client-name": "blobContentMD5", + "in": "header", + "required": false, + "type": "string", + "format": "byte", + "x-ms-parameter-location": "method", + "x-ms-parameter-grouping": { + "name": "blob-HTTP-headers" + }, + "description": "Optional. An MD5 hash of the blob content. Note that this hash is not validated, as the hashes for the individual blocks were validated when each was uploaded." + }, + "BlobContentType": { + "name": "x-ms-blob-content-type", + "x-ms-client-name": "blobContentType", + "in": "header", + "required": false, + "type": "string", + "x-ms-parameter-location": "method", + "x-ms-parameter-grouping": { + "name": "blob-HTTP-headers" + }, + "description": "Optional. Sets the blob's content type. If specified, this property is stored with the blob and returned with a read request." + }, + "BlobDeleteType": { + "name": "deletetype", + "x-ms-client-name": "blobDeleteType", + "in": "query", + "required": false, + "type": "string", + "enum": [ + "Permanent" + ], + "x-ms-enum": { + "name": "BlobDeleteType", + "modelAsString": false + }, + "x-ms-parameter-location": "method", + "description": "Optional. Only possible value is 'permanent', which specifies to permanently delete a blob if blob soft delete is enabled." + }, + "BlobExpiryOptions": { + "name": "x-ms-expiry-option", + "x-ms-client-name": "ExpiryOptions", + "in": "header", + "required": true, + "type": "string", + "enum": [ + "NeverExpire", + "RelativeToCreation", + "RelativeToNow", + "Absolute" + ], + "x-ms-enum": { + "name": "BlobExpiryOptions", + "modelAsString": true + }, + "x-ms-parameter-location": "method", + "description": "Required. Indicates mode of the expiry time" + }, + "BlobExpiryTime": { + "name": "x-ms-expiry-time", + "x-ms-client-name": "ExpiresOn", + "in": "header", + "required": false, + "type": "string", + "x-ms-parameter-location": "method", + "description": "The time to set the blob to expiry" + }, + "BlobSequenceNumber": { + "name": "x-ms-blob-sequence-number", + "x-ms-client-name": "blobSequenceNumber", + "in": "header", + "required": false, + "type": "integer", + "format": "int64", + "default": 0, + "x-ms-parameter-location": "method", + "description": "Set for page blobs only. The sequence number is a user-controlled value that you can use to track requests. The value of the sequence number must be between 0 and 2^63 - 1." + }, + "BlockId": { + "name": "blockid", + "x-ms-client-name": "blockId", + "in": "query", + "type": "string", + "required": true, + "x-ms-parameter-location": "method", + "description": "A valid Base64 string value that identifies the block. Prior to encoding, the string must be less than or equal to 64 bytes in size. For a given blob, the length of the value specified for the blockid parameter must be the same size for each block." + }, + "BlockListType": { + "name": "blocklisttype", + "x-ms-client-name": "listType", + "in": "query", + "required": false, + "default": "committed", + "x-ms-parameter-location": "method", + "description": "Specifies whether to return the list of committed blocks, the list of uncommitted blocks, or both lists together.", + "type": "string", + "enum": [ + "committed", + "uncommitted", + "all" + ], + "x-ms-enum": { + "name": "BlockListType", + "modelAsString": false + } + }, + "Body": { + "name": "body", + "in": "body", + "required": true, + "schema": { + "type": "object", + "format": "file" + }, + "x-ms-parameter-location": "method", + "description": "Initial data" + }, + "ContainerAcl": { + "name": "containerAcl", + "in": "body", + "schema": { + "$ref": "#/definitions/SignedIdentifiers" + }, + "x-ms-parameter-location": "method", + "description": "the acls for the container" + }, + "CopyId": { + "name": "copyid", + "x-ms-client-name": "copyId", + "in": "query", + "required": true, + "type": "string", + "x-ms-parameter-location": "method", + "description": "The copy identifier provided in the x-ms-copy-id header of the original Copy Blob operation." + }, + "ClientRequestId": { + "name": "x-ms-client-request-id", + "x-ms-client-name": "requestId", + "in": "header", + "required": false, + "type": "string", + "x-ms-parameter-location": "method", + "description": "Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage analytics logging is enabled." + }, + "ContainerName": { + "name": "containerName", + "in": "path", + "required": true, + "type": "string", + "x-ms-parameter-location": "method", + "description": "The container name." + }, + "ContentCrc64": { + "name": "x-ms-content-crc64", + "x-ms-client-name": "transactionalContentCrc64", + "in": "header", + "required": false, + "type": "string", + "format": "byte", + "x-ms-parameter-location": "method", + "description": "Specify the transactional crc64 for the body, to be validated by the service." + }, + "ContentLength": { + "name": "Content-Length", + "in": "header", + "required": true, + "type": "integer", + "format": "int64", + "x-ms-parameter-location": "method", + "description": "The length of the request." + }, + "ContentMD5": { + "name": "Content-MD5", + "x-ms-client-name": "transactionalContentMD5", + "in": "header", + "required": false, + "type": "string", + "format": "byte", + "x-ms-parameter-location": "method", + "description": "Specify the transactional md5 for the body, to be validated by the service." + }, + "CopySource": { + "name": "x-ms-copy-source", + "x-ms-client-name": "copySource", + "in": "header", + "required": true, + "type": "string", + "x-ms-parameter-location": "method", + "description": "Specifies the name of the source page blob snapshot. This value is a URL of up to 2 KB in length that specifies a page blob snapshot. The value should be URL-encoded as it would appear in a request URI. The source blob must either be public or must be authenticated via a shared access signature." + }, + "CopySourceAuthorization": { + "name": "x-ms-copy-source-authorization", + "x-ms-client-name": "copySourceAuthorization", + "in": "header", + "required": false, + "type": "string", + "x-ms-parameter-location": "method", + "description": "Only Bearer type is supported. Credentials should be a valid OAuth access token to copy source." + }, + "CopySourceBlobProperties": { + "name": "x-ms-copy-source-blob-properties", + "x-ms-client-name": "copySourceBlobProperties", + "in": "header", + "required": false, + "type": "boolean", + "x-ms-parameter-location": "method", + "description": "Optional, default is true. Indicates if properties from the source blob should be copied." + }, + "CopySourceTags": { + "name": "x-ms-copy-source-tag-option", + "x-ms-client-name": "copySourceTags", + "in": "header", + "required": false, + "type": "string", + "enum": [ + "REPLACE", + "COPY" + ], + "x-ms-enum": { + "name": "BlobCopySourceTags", + "modelAsString": false + }, + "x-ms-parameter-location": "method", + "description": "Optional, default 'replace'. Indicates if source tags should be copied or replaced with the tags specified by x-ms-tags." + }, + "DeleteSnapshots": { + "name": "x-ms-delete-snapshots", + "x-ms-client-name": "deleteSnapshots", + "description": "Required if the blob has associated snapshots. Specify one of the following two options: include: Delete the base blob and all of its snapshots. only: Delete only the blob's snapshots and not the blob itself", + "x-ms-parameter-location": "method", + "in": "header", + "required": false, + "type": "string", + "enum": [ + "include", + "only" + ], + "x-ms-enum": { + "name": "DeleteSnapshotsOptionType", + "modelAsString": false + } + }, + "Delimiter": { + "name": "delimiter", + "description": "When the request includes this parameter, the operation returns a BlobPrefix element in the response body that acts as a placeholder for all blobs whose names begin with the same substring up to the appearance of the delimiter character. The delimiter may be a single character or a string.", + "type": "string", + "x-ms-parameter-location": "method", + "in": "query", + "required": true + }, + "EncryptionKey": { + "name": "x-ms-encryption-key", + "x-ms-client-name": "encryptionKey", + "type": "string", + "in": "header", + "required": false, + "x-ms-parameter-location": "method", + "x-ms-parameter-grouping": { + "name": "cpk-info" + }, + "description": "Optional. Specifies the encryption key to use to encrypt the data provided in the request. If not specified, encryption is performed with the root account encryption key. For more information, see Encryption at Rest for Azure Storage Services." + }, + "EncryptionKeySha256": { + "name": "x-ms-encryption-key-sha256", + "x-ms-client-name": "encryptionKeySha256", + "type": "string", + "in": "header", + "required": false, + "x-ms-parameter-location": "method", + "x-ms-parameter-grouping": { + "name": "cpk-info" + }, + "description": "The SHA-256 hash of the provided encryption key. Must be provided if the x-ms-encryption-key header is provided." + }, + "EncryptionAlgorithm": { + "name": "x-ms-encryption-algorithm", + "x-ms-client-name": "encryptionAlgorithm", + "type": "string", + "in": "header", + "required": false, + "enum": [ + "AES256" + ], + "x-ms-enum": { + "name": "EncryptionAlgorithmType", + "modelAsString": false + }, + "x-ms-parameter-location": "method", + "x-ms-parameter-grouping": { + "name": "cpk-info" + }, + "description": "The algorithm used to produce the encryption key hash. Currently, the only accepted value is \"AES256\". Must be provided if the x-ms-encryption-key header is provided." + }, + "EncryptionScope": { + "name": "x-ms-encryption-scope", + "x-ms-client-name": "encryptionScope", + "type": "string", + "in": "header", + "required": false, + "x-ms-parameter-location": "method", + "x-ms-parameter-grouping": { + "name": "cpk-scope-info" + }, + "description": "Optional. Version 2019-07-07 and later. Specifies the name of the encryption scope to use to encrypt the data provided in the request. If not specified, encryption is performed with the default account encryption scope. For more information, see Encryption at Rest for Azure Storage Services." + }, + "DefaultEncryptionScope": { + "name": "x-ms-default-encryption-scope", + "x-ms-client-name": "DefaultEncryptionScope", + "type": "string", + "in": "header", + "required": false, + "x-ms-parameter-location": "method", + "x-ms-parameter-grouping": { + "name": "container-cpk-scope-info" + }, + "description": "Optional. Version 2019-07-07 and later. Specifies the default encryption scope to set on the container and use for all future writes." + }, + "DeletedContainerName": { + "name": "x-ms-deleted-container-name", + "x-ms-client-name": "DeletedContainerName", + "type": "string", + "in": "header", + "required": false, + "x-ms-parameter-location": "method", + "description": "Optional. Version 2019-12-12 and later. Specifies the name of the deleted container to restore." + }, + "DeletedContainerVersion": { + "name": "x-ms-deleted-container-version", + "x-ms-client-name": "DeletedContainerVersion", + "type": "string", + "in": "header", + "required": false, + "x-ms-parameter-location": "method", + "description": "Optional. Version 2019-12-12 and later. Specifies the version of the deleted container to restore." + }, + "DenyEncryptionScopeOverride": { + "name": "x-ms-deny-encryption-scope-override", + "x-ms-client-name": "PreventEncryptionScopeOverride", + "type": "boolean", + "in": "header", + "required": false, + "x-ms-parameter-location": "method", + "x-ms-parameter-grouping": { + "name": "container-cpk-scope-info" + }, + "description": "Optional. Version 2019-07-07 and newer. If true, prevents any request from specifying a different encryption scope than the scope set on the container." + }, + "FilterBlobsInclude": { + "name": "include", + "in": "query", + "required": false, + "type": "array", + "collectionFormat": "csv", + "items": { + "type": "string", + "enum": [ + "none", + "versions" + ], + "x-ms-enum": { + "name": "FilterBlobsIncludeItem", + "modelAsString": false + } + }, + "x-ms-parameter-location": "method", + "description": "Include this parameter to specify one or more datasets to include in the response." + }, + "FilterBlobsWhere": { + "name": "where", + "in": "query", + "required": false, + "type": "string", + "description": "Filters the results to return only to return only blobs whose tags match the specified expression.", + "x-ms-parameter-location": "method" + }, + "GetRangeContentMD5": { + "name": "x-ms-range-get-content-md5", + "x-ms-client-name": "rangeGetContentMD5", + "in": "header", + "required": false, + "type": "boolean", + "x-ms-parameter-location": "method", + "description": "When set to true and specified together with the Range, the service returns the MD5 hash for the range, as long as the range is less than or equal to 4 MB in size." + }, + "GetRangeContentCRC64": { + "name": "x-ms-range-get-content-crc64", + "x-ms-client-name": "rangeGetContentCRC64", + "in": "header", + "required": false, + "type": "boolean", + "x-ms-parameter-location": "method", + "description": "When set to true and specified together with the Range, the service returns the CRC64 hash for the range, as long as the range is less than or equal to 4 MB in size." + }, + "IfMatch": { + "name": "If-Match", + "x-ms-client-name": "ifMatch", + "in": "header", + "required": false, + "type": "string", + "x-ms-parameter-location": "method", + "x-ms-parameter-grouping": { + "name": "modified-access-conditions" + }, + "description": "Specify an ETag value to operate only on blobs with a matching value." + }, + "IfModifiedSince": { + "name": "If-Modified-Since", + "x-ms-client-name": "ifModifiedSince", + "in": "header", + "required": false, + "type": "string", + "format": "date-time-rfc1123", + "x-ms-parameter-location": "method", + "x-ms-parameter-grouping": { + "name": "modified-access-conditions" + }, + "description": "Specify this header value to operate only on a blob if it has been modified since the specified date/time." + }, + "IfNoneMatch": { + "name": "If-None-Match", + "x-ms-client-name": "ifNoneMatch", + "in": "header", + "required": false, + "type": "string", + "x-ms-parameter-location": "method", + "x-ms-parameter-grouping": { + "name": "modified-access-conditions" + }, + "description": "Specify an ETag value to operate only on blobs without a matching value." + }, + "IfUnmodifiedSince": { + "name": "If-Unmodified-Since", + "x-ms-client-name": "ifUnmodifiedSince", + "in": "header", + "required": false, + "type": "string", + "format": "date-time-rfc1123", + "x-ms-parameter-location": "method", + "x-ms-parameter-grouping": { + "name": "modified-access-conditions" + }, + "description": "Specify this header value to operate only on a blob if it has not been modified since the specified date/time." + }, + "IfSequenceNumberEqualTo": { + "name": "x-ms-if-sequence-number-eq", + "x-ms-client-name": "ifSequenceNumberEqualTo", + "in": "header", + "required": false, + "type": "integer", + "format": "int64", + "x-ms-parameter-location": "method", + "x-ms-parameter-grouping": { + "name": "sequence-number-access-conditions" + }, + "description": "Specify this header value to operate only on a blob if it has the specified sequence number." + }, + "IfSequenceNumberLessThan": { + "name": "x-ms-if-sequence-number-lt", + "x-ms-client-name": "ifSequenceNumberLessThan", + "in": "header", + "required": false, + "type": "integer", + "format": "int64", + "x-ms-parameter-location": "method", + "x-ms-parameter-grouping": { + "name": "sequence-number-access-conditions" + }, + "description": "Specify this header value to operate only on a blob if it has a sequence number less than the specified." + }, + "IfSequenceNumberLessThanOrEqualTo": { + "name": "x-ms-if-sequence-number-le", + "x-ms-client-name": "ifSequenceNumberLessThanOrEqualTo", + "in": "header", + "required": false, + "type": "integer", + "format": "int64", + "x-ms-parameter-location": "method", + "x-ms-parameter-grouping": { + "name": "sequence-number-access-conditions" + }, + "description": "Specify this header value to operate only on a blob if it has a sequence number less than or equal to the specified." + }, + "IfTags": { + "name": "x-ms-if-tags", + "x-ms-client-name": "ifTags", + "in": "header", + "required": false, + "type": "string", + "x-ms-parameter-location": "method", + "x-ms-parameter-grouping": { + "name": "modified-access-conditions" + }, + "description": "Specify a SQL where clause on blob tags to operate only on blobs with a matching value." + }, + "ImmutabilityPolicyExpiry": { + "name": "x-ms-immutability-policy-until-date", + "x-ms-client-name": "immutabilityPolicyExpiry", + "in": "header", + "required": false, + "type": "string", + "format": "date-time-rfc1123", + "x-ms-parameter-location": "method", + "description": "Specifies the date time when the blobs immutability policy is set to expire." + }, + "ImmutabilityPolicyMode": { + "name": "x-ms-immutability-policy-mode", + "x-ms-client-name": "immutabilityPolicyMode", + "in": "header", + "required": false, + "type": "string", + "enum": [ + "Mutable", + "Unlocked", + "Locked" + ], + "x-ms-enum": { + "name": "BlobImmutabilityPolicyMode", + "modelAsString": false + }, + "x-ms-parameter-location": "method", + "description": "Specifies the immutability policy mode to set on the blob." + }, + "KeyInfo": { + "description": "Key information", + "name": "KeyInfo", + "in": "body", + "x-ms-parameter-location": "method", + "required": true, + "schema": { + "$ref": "#/definitions/KeyInfo" + } + }, + "ListBlobsInclude": { + "name": "include", + "in": "query", + "required": false, + "type": "array", + "collectionFormat": "csv", + "items": { + "type": "string", + "enum": [ + "", + "copy", + "deleted", + "metadata", + "snapshots", + "uncommittedblobs", + "versions", + "tags", + "immutabilitypolicy", + "legalhold", + "deletedwithversions", + "permissions" + ], + "x-ms-enum": { + "name": "ListBlobsIncludeItem", + "modelAsString": false + } + }, + "x-ms-parameter-location": "method", + "description": "Include this parameter to specify one or more datasets to include in the response." + }, + "ListContainersInclude": { + "name": "include", + "in": "query", + "required": false, + "type": "array", + "collectionFormat": "csv", + "items": { + "type": "string", + "enum": [ + "", + "metadata", + "deleted", + "system" + ], + "x-ms-enum": { + "name": "ListContainersIncludeType", + "modelAsString": false + } + }, + "x-ms-parameter-location": "method", + "description": "Include this parameter to specify that the container's metadata be returned as part of the response body." + }, + "LeaseBreakPeriod": { + "name": "x-ms-lease-break-period", + "x-ms-client-name": "breakPeriod", + "in": "header", + "required": false, + "type": "integer", + "x-ms-parameter-location": "method", + "description": "For a break operation, proposed duration the lease should continue before it is broken, in seconds, between 0 and 60. This break period is only used if it is shorter than the time remaining on the lease. If longer, the time remaining on the lease is used. A new lease will not be available before the break period has expired, but the lease may be held for longer than the break period. If this header does not appear with a break operation, a fixed-duration lease breaks after the remaining lease period elapses, and an infinite lease breaks immediately." + }, + "LeaseDuration": { + "name": "x-ms-lease-duration", + "x-ms-client-name": "duration", + "in": "header", + "required": false, + "type": "integer", + "x-ms-parameter-location": "method", + "description": "Specifies the duration of the lease, in seconds, or negative one (-1) for a lease that never expires. A non-infinite lease can be between 15 and 60 seconds. A lease duration cannot be changed using renew or change." + }, + "LeaseIdOptional": { + "name": "x-ms-lease-id", + "x-ms-client-name": "leaseId", + "in": "header", + "required": false, + "type": "string", + "x-ms-parameter-location": "method", + "x-ms-parameter-grouping": { + "name": "lease-access-conditions" + }, + "description": "If specified, the operation only succeeds if the resource's lease is active and matches this ID." + }, + "LeaseIdRequired": { + "name": "x-ms-lease-id", + "x-ms-client-name": "leaseId", + "in": "header", + "required": true, + "type": "string", + "x-ms-parameter-location": "method", + "description": "Specifies the current lease ID on the resource." + }, + "LegalHoldOptional": { + "name": "x-ms-legal-hold", + "x-ms-client-name": "legalHold", + "in": "header", + "required": false, + "type": "boolean", + "x-ms-parameter-location": "method", + "description": "Specified if a legal hold should be set on the blob." + }, + "LegalHoldRequired": { + "name": "x-ms-legal-hold", + "x-ms-client-name": "legalHold", + "in": "header", + "required": true, + "type": "boolean", + "x-ms-parameter-location": "method", + "description": "Specified if a legal hold should be set on the blob." + }, + "Marker": { + "name": "marker", + "in": "query", + "required": false, + "type": "string", + "description": "A string value that identifies the portion of the list of containers to be returned with the next listing operation. The operation returns the NextMarker value within the response body if the listing operation did not return all containers remaining to be listed with the current page. The NextMarker value can be used as the value for the marker parameter in a subsequent call to request the next page of list items. The marker value is opaque to the client.", + "x-ms-parameter-location": "method" + }, + "MaxResults": { + "name": "maxresults", + "in": "query", + "required": false, + "type": "integer", + "minimum": 1, + "x-ms-parameter-location": "method", + "description": "Specifies the maximum number of containers to return. If the request does not specify maxresults, or specifies a value greater than 5000, the server will return up to 5000 items. Note that if the listing operation crosses a partition boundary, then the service will return a continuation token for retrieving the remainder of the results. For this reason, it is possible that the service will return fewer results than specified by maxresults, or than the default of 5000." + }, + "Metadata": { + "name": "x-ms-meta", + "x-ms-client-name": "metadata", + "in": "header", + "required": false, + "type": "string", + "x-ms-parameter-location": "method", + "description": "Optional. Specifies a user-defined name-value pair associated with the blob. If no name-value pairs are specified, the operation will copy the metadata from the source blob or file to the destination blob. If one or more name-value pairs are specified, the destination blob is created with the specified metadata, and metadata is not copied from the source blob or file. Note that beginning with version 2009-09-19, metadata names must adhere to the naming rules for C# identifiers. See Naming and Referencing Containers, Blobs, and Metadata for more information.", + "x-ms-header-collection-prefix": "x-ms-meta-" + }, + "MultipartContentType": { + "name": "Content-Type", + "x-ms-client-name": "multipartContentType", + "in": "header", + "required": true, + "type": "string", + "x-ms-parameter-location": "method", + "description": "Required. The value of this header must be multipart/mixed with a batch boundary. Example header value: multipart/mixed; boundary=batch_" + }, + "ObjectReplicationPolicyId": { + "name": "x-ms-or-policy-id", + "x-ms-client-name": "objectReplicationPolicyId", + "in": "header", + "required": false, + "type": "string", + "x-ms-parameter-location": "method", + "description": "Optional. Only valid when Object Replication is enabled for the storage container and on the destination blob of the replication." + }, + "ObjectReplicationRules": { + "name": "x-ms-or", + "x-ms-client-name": "ObjectReplicationRules", + "in": "header", + "required": false, + "type": "string", + "x-ms-parameter-location": "method", + "description": "Optional. Only valid when Object Replication is enabled for the storage container and on the source blob of the replication. When retrieving this header, it will return the header with the policy id and rule id (e.g. x-ms-or-policyid_ruleid), and the value will be the status of the replication (e.g. complete, failed).", + "x-ms-header-collection-prefix": "x-ms-or-" + }, + "Prefix": { + "name": "prefix", + "in": "query", + "required": false, + "type": "string", + "description": "Filters the results to return only containers whose name begins with the specified prefix.", + "x-ms-parameter-location": "method" + }, + "PrevSnapshot": { + "name": "prevsnapshot", + "in": "query", + "required": false, + "type": "string", + "x-ms-parameter-location": "method", + "description": "Optional in version 2015-07-08 and newer. The prevsnapshot parameter is a DateTime value that specifies that the response will contain only pages that were changed between target blob and previous snapshot. Changed pages include both updated and cleared pages. The target blob may be a snapshot, as long as the snapshot specified by prevsnapshot is the older of the two. Note that incremental snapshots are currently supported only for blobs created on or after January 1, 2016." + }, + "PrevSnapshotUrl": { + "name": "x-ms-previous-snapshot-url", + "x-ms-client-name": "prevSnapshotUrl", + "in": "header", + "required": false, + "type": "string", + "x-ms-parameter-location": "method", + "description": "Optional. This header is only supported in service versions 2019-04-19 and after and specifies the URL of a previous snapshot of the target blob. The response will only contain pages that were changed between the target blob and its previous snapshot." + }, + "ProposedLeaseIdOptional": { + "name": "x-ms-proposed-lease-id", + "x-ms-client-name": "proposedLeaseId", + "in": "header", + "required": false, + "type": "string", + "x-ms-parameter-location": "method", + "description": "Proposed lease ID, in a GUID string format. The Blob service returns 400 (Invalid request) if the proposed lease ID is not in the correct format. See Guid Constructor (String) for a list of valid GUID string formats." + }, + "ProposedLeaseIdRequired": { + "name": "x-ms-proposed-lease-id", + "x-ms-client-name": "proposedLeaseId", + "in": "header", + "required": true, + "type": "string", + "x-ms-parameter-location": "method", + "description": "Proposed lease ID, in a GUID string format. The Blob service returns 400 (Invalid request) if the proposed lease ID is not in the correct format. See Guid Constructor (String) for a list of valid GUID string formats." + }, + "QueryRequest": { + "name": "queryRequest", + "in": "body", + "x-ms-parameter-location": "client", + "schema": { + "$ref": "#/definitions/QueryRequest" + }, + "description": "the query request" + }, + "Range": { + "name": "x-ms-range", + "x-ms-client-name": "range", + "in": "header", + "required": false, + "type": "string", + "x-ms-parameter-location": "method", + "description": "Return only the bytes of the blob in the specified range." + }, + "RangeRequiredPutPageFromUrl": { + "name": "x-ms-range", + "x-ms-client-name": "range", + "in": "header", + "required": true, + "type": "string", + "x-ms-parameter-location": "method", + "description": "The range of bytes to which the source range would be written. The range should be 512 aligned and range-end is required." + }, + "SequenceNumberAction": { + "name": "x-ms-sequence-number-action", + "x-ms-client-name": "sequenceNumberAction", + "in": "header", + "required": true, + "x-ms-parameter-location": "method", + "description": "Required if the x-ms-blob-sequence-number header is set for the request. This property applies to page blobs only. This property indicates how the service should modify the blob's sequence number", + "type": "string", + "enum": [ + "max", + "update", + "increment" + ], + "x-ms-enum": { + "name": "SequenceNumberActionType", + "modelAsString": false + } + }, + "Snapshot": { + "name": "snapshot", + "in": "query", + "required": false, + "type": "string", + "x-ms-parameter-location": "method", + "description": "The snapshot parameter is an opaque DateTime value that, when present, specifies the blob snapshot to retrieve. For more information on working with blob snapshots, see Creating a Snapshot of a Blob." + }, + "VersionId": { + "name": "versionid", + "x-ms-client-name": "versionId", + "in": "query", + "required": false, + "type": "string", + "x-ms-parameter-location": "method", + "description": "The version id parameter is an opaque DateTime value that, when present, specifies the version of the blob to operate on. It's for service version 2019-10-10 and newer." + }, + "SealBlob": { + "name": "x-ms-seal-blob", + "x-ms-client-name": "SealBlob", + "in": "header", + "required": false, + "type": "boolean", + "x-ms-parameter-location": "method", + "description": "Overrides the sealed state of the destination blob. Service version 2019-12-12 and newer." + }, + "SourceContainerName": { + "name": "x-ms-source-container-name", + "x-ms-client-name": "SourceContainerName", + "type": "string", + "in": "header", + "required": true, + "x-ms-parameter-location": "method", + "description": "Required. Specifies the name of the container to rename." + }, + "SourceContentMD5": { + "name": "x-ms-source-content-md5", + "x-ms-client-name": "sourceContentMD5", + "in": "header", + "required": false, + "type": "string", + "format": "byte", + "x-ms-parameter-location": "method", + "description": "Specify the md5 calculated for the range of bytes that must be read from the copy source." + }, + "SourceContentCRC64": { + "name": "x-ms-source-content-crc64", + "x-ms-client-name": "sourceContentcrc64", + "in": "header", + "required": false, + "type": "string", + "format": "byte", + "x-ms-parameter-location": "method", + "description": "Specify the crc64 calculated for the range of bytes that must be read from the copy source." + }, + "SourceRange": { + "name": "x-ms-source-range", + "x-ms-client-name": "sourceRange", + "in": "header", + "required": false, + "type": "string", + "x-ms-parameter-location": "method", + "description": "Bytes of source data in the specified range." + }, + "SourceRangeRequiredPutPageFromUrl": { + "name": "x-ms-source-range", + "x-ms-client-name": "sourceRange", + "in": "header", + "required": true, + "type": "string", + "x-ms-parameter-location": "method", + "description": "Bytes of source data in the specified range. The length of this range should match the ContentLength header and x-ms-range/Range destination range header." + }, + "SourceIfMatch": { + "name": "x-ms-source-if-match", + "x-ms-client-name": "sourceIfMatch", + "in": "header", + "required": false, + "type": "string", + "x-ms-parameter-location": "method", + "x-ms-parameter-grouping": { + "name": "source-modified-access-conditions" + }, + "description": "Specify an ETag value to operate only on blobs with a matching value." + }, + "SourceIfModifiedSince": { + "name": "x-ms-source-if-modified-since", + "x-ms-client-name": "sourceIfModifiedSince", + "in": "header", + "required": false, + "type": "string", + "format": "date-time-rfc1123", + "x-ms-parameter-location": "method", + "x-ms-parameter-grouping": { + "name": "source-modified-access-conditions" + }, + "description": "Specify this header value to operate only on a blob if it has been modified since the specified date/time." + }, + "SourceIfNoneMatch": { + "name": "x-ms-source-if-none-match", + "x-ms-client-name": "sourceIfNoneMatch", + "in": "header", + "required": false, + "type": "string", + "x-ms-parameter-location": "method", + "x-ms-parameter-grouping": { + "name": "source-modified-access-conditions" + }, + "description": "Specify an ETag value to operate only on blobs without a matching value." + }, + "SourceIfUnmodifiedSince": { + "name": "x-ms-source-if-unmodified-since", + "x-ms-client-name": "sourceIfUnmodifiedSince", + "in": "header", + "required": false, + "type": "string", + "format": "date-time-rfc1123", + "x-ms-parameter-location": "method", + "x-ms-parameter-grouping": { + "name": "source-modified-access-conditions" + }, + "description": "Specify this header value to operate only on a blob if it has not been modified since the specified date/time." + }, + "SourceLeaseId": { + "name": "x-ms-source-lease-id", + "x-ms-client-name": "sourceLeaseId", + "in": "header", + "required": false, + "type": "string", + "x-ms-parameter-location": "method", + "description": "A lease ID for the source path. If specified, the source path must have an active lease and the lease ID must match." + }, + "SourceIfTags": { + "name": "x-ms-source-if-tags", + "x-ms-client-name": "sourceIfTags", + "in": "header", + "required": false, + "type": "string", + "x-ms-parameter-location": "method", + "x-ms-parameter-grouping": { + "name": "source-modified-access-conditions" + }, + "description": "Specify a SQL where clause on blob tags to operate only on blobs with a matching value." + }, + "SourceUrl": { + "name": "x-ms-copy-source", + "x-ms-client-name": "sourceUrl", + "in": "header", + "required": true, + "type": "string", + "x-ms-parameter-location": "method", + "description": "Specify a URL to the copy source." + }, + "StorageServiceProperties": { + "name": "StorageServiceProperties", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/StorageServiceProperties" + }, + "x-ms-parameter-location": "method", + "description": "The StorageService properties." + }, + "Timeout": { + "name": "timeout", + "in": "query", + "required": false, + "type": "integer", + "minimum": 0, + "x-ms-parameter-location": "method", + "description": "The timeout parameter is expressed in seconds. For more information, see Setting Timeouts for Blob Service Operations." + } + } +} \ No newline at end of file diff --git a/swagger/blob.md b/swagger/blob.md index 95c6b8535..5e5a3faeb 100644 --- a/swagger/blob.md +++ b/swagger/blob.md @@ -10,7 +10,7 @@ enable-xml: true generate-metadata: false license-header: MICROSOFT_MIT_NO_VERSION output-folder: ../src/blob/generated -input-file: blob-storage-2019-02-02.json +input-file: blob-storage-2021-10-04.json model-date-time-as-string: true optional-response-headers: true enum-types: true @@ -22,12 +22,45 @@ enum-types: true 2. Updated blocklisttype for list blob blocks from required to optional. -3. Make "Deleted" and "Snapshot" from required to optional for BlobItem model. +3. Only for 2019-02-02, make "Deleted" and "Snapshot" from required to optional for BlobItem model. -4. Make `ApiVersionParameter` parameter from required to optional. +4. Only for 2021-10-04, make "Deleted" and "Snapshot" from required to optional for "BlobItemInternal" model from: -5. Add `x-ms-creation-time` to Blob_Download API responds +5. Change for 2021-10-04, change "Name" definition in "BlobItemInternal" from: + "Name": { + "$ref": "#/definitions/BlobName" + } + to + "Name": { + "type": "string" + } 6. Add "","deleted" to "ListContainersInclude" enum, add "","tags","versions","deletedwithversions","legalhold","permissions" to "ListBlobsInclude" enum. 7. Add section for "Container_SubmitBatch" operation. + +8. Only for 2021-10-04, change "Name" definition in "BlobPrefix" from: + "Name": { + "$ref": "#/definitions/BlobName" + } + to + "Name": { + "type": "string" + } + +9. Make `ApiVersionParameter` parameter from required to optional. + +10. Add `x-ms-creation-time` to Blob_Download API responds + +11. Only for 2019-02-02, add "", "deleted" to "ListContainersInclude" enum, add "", "tags", "versions", "deletedwithversions", "legalhold", "permissions" to "ListBlobsInclude" enum. + +12. Only for 2021-10-04, add "" to "ListContainersInclude" enum, add "", "permissions" to "ListBlobsInclude" enum. + +13. Only for 2021-10-04, add "Premium" to "AccessTierRequired" enum and "AccessTierOptional" enum. + Add "Mutable" to "ImmutabilityPolicyMode" at around line #11994 + +14. Only for 2021-10-04, add spec for: Blob_GetAccountInfoWithHead, Container_GetAccountInfoWithHead and Service_GetAccountInfoWithHead. + +15. Only for 2021-10-04, change return code from '200' to '202' for service_submitbatch. + +16. Only for 2021-10-04, change "AllowedHeaders" and "ExposedHeaders" to be not required. diff --git a/tests/blob/handlers/AppendBlobHandler.test.ts b/tests/blob/handlers/AppendBlobHandler.test.ts index 2bf762116..2c4878860 100644 --- a/tests/blob/handlers/AppendBlobHandler.test.ts +++ b/tests/blob/handlers/AppendBlobHandler.test.ts @@ -41,7 +41,7 @@ describe("AppendBlobHandler", () => { const buffer = Buffer.from("deadbeef"); - const properties: Models.BlobProperties = { + const properties: Models.BlobPropertiesInternal = { lastModified: new Date(), etag: getUniqueName("etag"), blobType: Models.BlobType.AppendBlob, From 740b2afe09fe6d29fd5f437e9ccf3007255eb4c0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 21 Mar 2023 10:07:37 +0800 Subject: [PATCH 037/297] Bump autorest from 3.6.2 to 3.6.3 (#1850) Bumps [autorest](https://github.com/Azure/autorest) from 3.6.2 to 3.6.3. - [Release notes](https://github.com/Azure/autorest/releases) - [Commits](https://github.com/Azure/autorest/commits) --- updated-dependencies: - dependency-name: autorest dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index f97627433..85e3a32d8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2046,9 +2046,9 @@ } }, "node_modules/autorest": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/autorest/-/autorest-3.6.2.tgz", - "integrity": "sha512-JRMmAsSG4wplYUkjVOWELidF+P/OG9BjF542aQcbt4Qj85bJ+7EzRCTV09vbf8f4ScOB+I68+9IcskjNTU9UkQ==", + "version": "3.6.3", + "resolved": "https://registry.npmjs.org/autorest/-/autorest-3.6.3.tgz", + "integrity": "sha512-j/Axwk9bniifTNtBLYVxfQZGQIGPKljFaCQCBWOiybVar2j3tkHP1btiC4a/t9pAJXY6IaFgWctoPM3G/Puhyg==", "dev": true, "hasInstallScript": true, "bin": { @@ -11760,9 +11760,9 @@ "dev": true }, "autorest": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/autorest/-/autorest-3.6.2.tgz", - "integrity": "sha512-JRMmAsSG4wplYUkjVOWELidF+P/OG9BjF542aQcbt4Qj85bJ+7EzRCTV09vbf8f4ScOB+I68+9IcskjNTU9UkQ==", + "version": "3.6.3", + "resolved": "https://registry.npmjs.org/autorest/-/autorest-3.6.3.tgz", + "integrity": "sha512-j/Axwk9bniifTNtBLYVxfQZGQIGPKljFaCQCBWOiybVar2j3tkHP1btiC4a/t9pAJXY6IaFgWctoPM3G/Puhyg==", "dev": true }, "aws-sign2": { From 9c613f15f29f3a9eeda97b0025fd2eadfd5d4613 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 21 Mar 2023 11:52:51 +0800 Subject: [PATCH 038/297] Bump @typescript-eslint/parser from 5.55.0 to 5.56.0 (#1849) Bumps [@typescript-eslint/parser](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/parser) from 5.55.0 to 5.56.0. - [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases) - [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/parser/CHANGELOG.md) - [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v5.56.0/packages/parser) --- updated-dependencies: - dependency-name: "@typescript-eslint/parser" dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 92 +++++++++++++++++++++++------------------------ 1 file changed, 46 insertions(+), 46 deletions(-) diff --git a/package-lock.json b/package-lock.json index 85e3a32d8..aa3deb6ad 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1505,14 +1505,14 @@ "dev": true }, "node_modules/@typescript-eslint/parser": { - "version": "5.55.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.55.0.tgz", - "integrity": "sha512-ppvmeF7hvdhUUZWSd2EEWfzcFkjJzgNQzVST22nzg958CR+sphy8A6K7LXQZd6V75m1VKjp+J4g/PCEfSCmzhw==", + "version": "5.56.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.56.0.tgz", + "integrity": "sha512-sn1OZmBxUsgxMmR8a8U5QM/Wl+tyqlH//jTqCg8daTAmhAk26L2PFhcqPLlYBhYUJMZJK276qLXlHN3a83o2cg==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "5.55.0", - "@typescript-eslint/types": "5.55.0", - "@typescript-eslint/typescript-estree": "5.55.0", + "@typescript-eslint/scope-manager": "5.56.0", + "@typescript-eslint/types": "5.56.0", + "@typescript-eslint/typescript-estree": "5.56.0", "debug": "^4.3.4" }, "engines": { @@ -1532,13 +1532,13 @@ } }, "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/scope-manager": { - "version": "5.55.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.55.0.tgz", - "integrity": "sha512-OK+cIO1ZGhJYNCL//a3ROpsd83psf4dUJ4j7pdNVzd5DmIk+ffkuUIX2vcZQbEW/IR41DYsfJTB19tpCboxQuw==", + "version": "5.56.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.56.0.tgz", + "integrity": "sha512-jGYKyt+iBakD0SA5Ww8vFqGpoV2asSjwt60Gl6YcO8ksQ8s2HlUEyHBMSa38bdLopYqGf7EYQMUIGdT/Luw+sw==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.55.0", - "@typescript-eslint/visitor-keys": "5.55.0" + "@typescript-eslint/types": "5.56.0", + "@typescript-eslint/visitor-keys": "5.56.0" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -1549,9 +1549,9 @@ } }, "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/types": { - "version": "5.55.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.55.0.tgz", - "integrity": "sha512-M4iRh4AG1ChrOL6Y+mETEKGeDnT7Sparn6fhZ5LtVJF1909D5O4uqK+C5NPbLmpfZ0XIIxCdwzKiijpZUOvOug==", + "version": "5.56.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.56.0.tgz", + "integrity": "sha512-JyAzbTJcIyhuUhogmiu+t79AkdnqgPUEsxMTMc/dCZczGMJQh1MK2wgrju++yMN6AWroVAy2jxyPcPr3SWCq5w==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -1562,13 +1562,13 @@ } }, "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/typescript-estree": { - "version": "5.55.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.55.0.tgz", - "integrity": "sha512-I7X4A9ovA8gdpWMpr7b1BN9eEbvlEtWhQvpxp/yogt48fy9Lj3iE3ild/1H3jKBBIYj5YYJmS2+9ystVhC7eaQ==", + "version": "5.56.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.56.0.tgz", + "integrity": "sha512-41CH/GncsLXOJi0jb74SnC7jVPWeVJ0pxQj8bOjH1h2O26jXN3YHKDT1ejkVz5YeTEQPeLCCRY0U2r68tfNOcg==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.55.0", - "@typescript-eslint/visitor-keys": "5.55.0", + "@typescript-eslint/types": "5.56.0", + "@typescript-eslint/visitor-keys": "5.56.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -1589,12 +1589,12 @@ } }, "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/visitor-keys": { - "version": "5.55.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.55.0.tgz", - "integrity": "sha512-q2dlHHwWgirKh1D3acnuApXG+VNXpEY5/AwRxDVuEQpxWaB0jCDe0jFMVMALJ3ebSfuOVE8/rMS+9ZOYGg1GWw==", + "version": "5.56.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.56.0.tgz", + "integrity": "sha512-1mFdED7u5bZpX6Xxf5N9U2c18sb+8EvU3tyOIj6LQZ5OOvnmj8BVeNNP603OFPm5KkS1a7IvCIcwrdHXaEMG/Q==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.55.0", + "@typescript-eslint/types": "5.56.0", "eslint-visitor-keys": "^3.3.0" }, "engines": { @@ -11401,41 +11401,41 @@ } }, "@typescript-eslint/parser": { - "version": "5.55.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.55.0.tgz", - "integrity": "sha512-ppvmeF7hvdhUUZWSd2EEWfzcFkjJzgNQzVST22nzg958CR+sphy8A6K7LXQZd6V75m1VKjp+J4g/PCEfSCmzhw==", + "version": "5.56.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.56.0.tgz", + "integrity": "sha512-sn1OZmBxUsgxMmR8a8U5QM/Wl+tyqlH//jTqCg8daTAmhAk26L2PFhcqPLlYBhYUJMZJK276qLXlHN3a83o2cg==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "5.55.0", - "@typescript-eslint/types": "5.55.0", - "@typescript-eslint/typescript-estree": "5.55.0", + "@typescript-eslint/scope-manager": "5.56.0", + "@typescript-eslint/types": "5.56.0", + "@typescript-eslint/typescript-estree": "5.56.0", "debug": "^4.3.4" }, "dependencies": { "@typescript-eslint/scope-manager": { - "version": "5.55.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.55.0.tgz", - "integrity": "sha512-OK+cIO1ZGhJYNCL//a3ROpsd83psf4dUJ4j7pdNVzd5DmIk+ffkuUIX2vcZQbEW/IR41DYsfJTB19tpCboxQuw==", + "version": "5.56.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.56.0.tgz", + "integrity": "sha512-jGYKyt+iBakD0SA5Ww8vFqGpoV2asSjwt60Gl6YcO8ksQ8s2HlUEyHBMSa38bdLopYqGf7EYQMUIGdT/Luw+sw==", "dev": true, "requires": { - "@typescript-eslint/types": "5.55.0", - "@typescript-eslint/visitor-keys": "5.55.0" + "@typescript-eslint/types": "5.56.0", + "@typescript-eslint/visitor-keys": "5.56.0" } }, "@typescript-eslint/types": { - "version": "5.55.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.55.0.tgz", - "integrity": "sha512-M4iRh4AG1ChrOL6Y+mETEKGeDnT7Sparn6fhZ5LtVJF1909D5O4uqK+C5NPbLmpfZ0XIIxCdwzKiijpZUOvOug==", + "version": "5.56.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.56.0.tgz", + "integrity": "sha512-JyAzbTJcIyhuUhogmiu+t79AkdnqgPUEsxMTMc/dCZczGMJQh1MK2wgrju++yMN6AWroVAy2jxyPcPr3SWCq5w==", "dev": true }, "@typescript-eslint/typescript-estree": { - "version": "5.55.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.55.0.tgz", - "integrity": "sha512-I7X4A9ovA8gdpWMpr7b1BN9eEbvlEtWhQvpxp/yogt48fy9Lj3iE3ild/1H3jKBBIYj5YYJmS2+9ystVhC7eaQ==", + "version": "5.56.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.56.0.tgz", + "integrity": "sha512-41CH/GncsLXOJi0jb74SnC7jVPWeVJ0pxQj8bOjH1h2O26jXN3YHKDT1ejkVz5YeTEQPeLCCRY0U2r68tfNOcg==", "dev": true, "requires": { - "@typescript-eslint/types": "5.55.0", - "@typescript-eslint/visitor-keys": "5.55.0", + "@typescript-eslint/types": "5.56.0", + "@typescript-eslint/visitor-keys": "5.56.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -11444,12 +11444,12 @@ } }, "@typescript-eslint/visitor-keys": { - "version": "5.55.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.55.0.tgz", - "integrity": "sha512-q2dlHHwWgirKh1D3acnuApXG+VNXpEY5/AwRxDVuEQpxWaB0jCDe0jFMVMALJ3ebSfuOVE8/rMS+9ZOYGg1GWw==", + "version": "5.56.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.56.0.tgz", + "integrity": "sha512-1mFdED7u5bZpX6Xxf5N9U2c18sb+8EvU3tyOIj6LQZ5OOvnmj8BVeNNP603OFPm5KkS1a7IvCIcwrdHXaEMG/Q==", "dev": true, "requires": { - "@typescript-eslint/types": "5.55.0", + "@typescript-eslint/types": "5.56.0", "eslint-visitor-keys": "^3.3.0" } }, From 4182c7426f3c580e31974d7eec20e2c8a929ece8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 21 Mar 2023 11:53:03 +0800 Subject: [PATCH 039/297] Bump @typescript-eslint/eslint-plugin from 5.54.1 to 5.56.0 (#1848) Bumps [@typescript-eslint/eslint-plugin](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/eslint-plugin) from 5.54.1 to 5.56.0. - [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases) - [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/eslint-plugin/CHANGELOG.md) - [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v5.56.0/packages/eslint-plugin) --- updated-dependencies: - dependency-name: "@typescript-eslint/eslint-plugin" dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 183 ++++++++++++++++++++++++++++------------------ 1 file changed, 111 insertions(+), 72 deletions(-) diff --git a/package-lock.json b/package-lock.json index aa3deb6ad..1ced2d16b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -778,6 +778,30 @@ "kuler": "^2.0.0" } }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.3.0.tgz", + "integrity": "sha512-v3oplH6FYCULtFuCeqyuTd9D2WKO937Dxdq+GmHOLL72TTRriLxz2VLlNfkZRsvj6PKnOPAtuT6dwrs/pA5DvA==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.4.0.tgz", + "integrity": "sha512-A9983Q0LnDGdLPjxyXQ00sbV+K+O+ko2Dr+CZigbHWtX9pNfxlaBkMR8X1CztI73zuEyEBXTVjx7CE+/VSwDiQ==", + "dev": true, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, "node_modules/@eslint/eslintrc": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.0.tgz", @@ -1448,19 +1472,19 @@ } }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.54.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.54.1.tgz", - "integrity": "sha512-a2RQAkosH3d3ZIV08s3DcL/mcGc2M/UC528VkPULFxR9VnVPT8pBu0IyBAJJmVsCmhVfwQX1v6q+QGnmSe1bew==", + "version": "5.56.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.56.0.tgz", + "integrity": "sha512-ZNW37Ccl3oMZkzxrYDUX4o7cnuPgU+YrcaYXzsRtLB16I1FR5SHMqga3zGsaSliZADCWo2v8qHWqAYIj8nWCCg==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "5.54.1", - "@typescript-eslint/type-utils": "5.54.1", - "@typescript-eslint/utils": "5.54.1", + "@eslint-community/regexpp": "^4.4.0", + "@typescript-eslint/scope-manager": "5.56.0", + "@typescript-eslint/type-utils": "5.56.0", + "@typescript-eslint/utils": "5.56.0", "debug": "^4.3.4", "grapheme-splitter": "^1.0.4", "ignore": "^5.2.0", "natural-compare-lite": "^1.4.0", - "regexpp": "^3.2.0", "semver": "^7.3.7", "tsutils": "^3.21.0" }, @@ -1629,13 +1653,13 @@ "dev": true }, "node_modules/@typescript-eslint/scope-manager": { - "version": "5.54.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.54.1.tgz", - "integrity": "sha512-zWKuGliXxvuxyM71UA/EcPxaviw39dB2504LqAmFDjmkpO8qNLHcmzlh6pbHs1h/7YQ9bnsO8CCcYCSA8sykUg==", + "version": "5.56.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.56.0.tgz", + "integrity": "sha512-jGYKyt+iBakD0SA5Ww8vFqGpoV2asSjwt60Gl6YcO8ksQ8s2HlUEyHBMSa38bdLopYqGf7EYQMUIGdT/Luw+sw==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.54.1", - "@typescript-eslint/visitor-keys": "5.54.1" + "@typescript-eslint/types": "5.56.0", + "@typescript-eslint/visitor-keys": "5.56.0" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -1646,13 +1670,13 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "5.54.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.54.1.tgz", - "integrity": "sha512-WREHsTz0GqVYLIbzIZYbmUUr95DKEKIXZNH57W3s+4bVnuF1TKe2jH8ZNH8rO1CeMY3U4j4UQeqPNkHMiGem3g==", + "version": "5.56.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.56.0.tgz", + "integrity": "sha512-8WxgOgJjWRy6m4xg9KoSHPzBNZeQbGlQOH7l2QEhQID/+YseaFxg5J/DLwWSsi9Axj4e/cCiKx7PVzOq38tY4A==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "5.54.1", - "@typescript-eslint/utils": "5.54.1", + "@typescript-eslint/typescript-estree": "5.56.0", + "@typescript-eslint/utils": "5.56.0", "debug": "^4.3.4", "tsutils": "^3.21.0" }, @@ -1696,9 +1720,9 @@ "dev": true }, "node_modules/@typescript-eslint/types": { - "version": "5.54.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.54.1.tgz", - "integrity": "sha512-G9+1vVazrfAfbtmCapJX8jRo2E4MDXxgm/IMOF4oGh3kq7XuK3JRkOg6y2Qu1VsTRmWETyTkWt1wxy7X7/yLkw==", + "version": "5.56.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.56.0.tgz", + "integrity": "sha512-JyAzbTJcIyhuUhogmiu+t79AkdnqgPUEsxMTMc/dCZczGMJQh1MK2wgrju++yMN6AWroVAy2jxyPcPr3SWCq5w==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -1709,13 +1733,13 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.54.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.54.1.tgz", - "integrity": "sha512-bjK5t+S6ffHnVwA0qRPTZrxKSaFYocwFIkZx5k7pvWfsB1I57pO/0M0Skatzzw1sCkjJ83AfGTL0oFIFiDX3bg==", + "version": "5.56.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.56.0.tgz", + "integrity": "sha512-41CH/GncsLXOJi0jb74SnC7jVPWeVJ0pxQj8bOjH1h2O26jXN3YHKDT1ejkVz5YeTEQPeLCCRY0U2r68tfNOcg==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.54.1", - "@typescript-eslint/visitor-keys": "5.54.1", + "@typescript-eslint/types": "5.56.0", + "@typescript-eslint/visitor-keys": "5.56.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -1759,18 +1783,18 @@ "dev": true }, "node_modules/@typescript-eslint/utils": { - "version": "5.54.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.54.1.tgz", - "integrity": "sha512-IY5dyQM8XD1zfDe5X8jegX6r2EVU5o/WJnLu/znLPWCBF7KNGC+adacXnt5jEYS9JixDcoccI6CvE4RCjHMzCQ==", + "version": "5.56.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.56.0.tgz", + "integrity": "sha512-XhZDVdLnUJNtbzaJeDSCIYaM+Tgr59gZGbFuELgF7m0IY03PlciidS7UQNKLE0+WpUTn1GlycEr6Ivb/afjbhA==", "dev": true, "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", "@types/json-schema": "^7.0.9", "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.54.1", - "@typescript-eslint/types": "5.54.1", - "@typescript-eslint/typescript-estree": "5.54.1", + "@typescript-eslint/scope-manager": "5.56.0", + "@typescript-eslint/types": "5.56.0", + "@typescript-eslint/typescript-estree": "5.56.0", "eslint-scope": "^5.1.1", - "eslint-utils": "^3.0.0", "semver": "^7.3.7" }, "engines": { @@ -1785,12 +1809,12 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.54.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.54.1.tgz", - "integrity": "sha512-q8iSoHTgwCfgcRJ2l2x+xCbu8nBlRAlsQ33k24Adj8eoVBE0f8dUeI+bAa8F84Mv05UGbAx57g2zrRsYIooqQg==", + "version": "5.56.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.56.0.tgz", + "integrity": "sha512-1mFdED7u5bZpX6Xxf5N9U2c18sb+8EvU3tyOIj6LQZ5OOvnmj8BVeNNP603OFPm5KkS1a7IvCIcwrdHXaEMG/Q==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.54.1", + "@typescript-eslint/types": "5.56.0", "eslint-visitor-keys": "^3.3.0" }, "engines": { @@ -10805,6 +10829,21 @@ "kuler": "^2.0.0" } }, + "@eslint-community/eslint-utils": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.3.0.tgz", + "integrity": "sha512-v3oplH6FYCULtFuCeqyuTd9D2WKO937Dxdq+GmHOLL72TTRriLxz2VLlNfkZRsvj6PKnOPAtuT6dwrs/pA5DvA==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^3.3.0" + } + }, + "@eslint-community/regexpp": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.4.0.tgz", + "integrity": "sha512-A9983Q0LnDGdLPjxyXQ00sbV+K+O+ko2Dr+CZigbHWtX9pNfxlaBkMR8X1CztI73zuEyEBXTVjx7CE+/VSwDiQ==", + "dev": true + }, "@eslint/eslintrc": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.0.tgz", @@ -11366,19 +11405,19 @@ } }, "@typescript-eslint/eslint-plugin": { - "version": "5.54.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.54.1.tgz", - "integrity": "sha512-a2RQAkosH3d3ZIV08s3DcL/mcGc2M/UC528VkPULFxR9VnVPT8pBu0IyBAJJmVsCmhVfwQX1v6q+QGnmSe1bew==", + "version": "5.56.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.56.0.tgz", + "integrity": "sha512-ZNW37Ccl3oMZkzxrYDUX4o7cnuPgU+YrcaYXzsRtLB16I1FR5SHMqga3zGsaSliZADCWo2v8qHWqAYIj8nWCCg==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "5.54.1", - "@typescript-eslint/type-utils": "5.54.1", - "@typescript-eslint/utils": "5.54.1", + "@eslint-community/regexpp": "^4.4.0", + "@typescript-eslint/scope-manager": "5.56.0", + "@typescript-eslint/type-utils": "5.56.0", + "@typescript-eslint/utils": "5.56.0", "debug": "^4.3.4", "grapheme-splitter": "^1.0.4", "ignore": "^5.2.0", "natural-compare-lite": "^1.4.0", - "regexpp": "^3.2.0", "semver": "^7.3.7", "tsutils": "^3.21.0" }, @@ -11471,23 +11510,23 @@ } }, "@typescript-eslint/scope-manager": { - "version": "5.54.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.54.1.tgz", - "integrity": "sha512-zWKuGliXxvuxyM71UA/EcPxaviw39dB2504LqAmFDjmkpO8qNLHcmzlh6pbHs1h/7YQ9bnsO8CCcYCSA8sykUg==", + "version": "5.56.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.56.0.tgz", + "integrity": "sha512-jGYKyt+iBakD0SA5Ww8vFqGpoV2asSjwt60Gl6YcO8ksQ8s2HlUEyHBMSa38bdLopYqGf7EYQMUIGdT/Luw+sw==", "dev": true, "requires": { - "@typescript-eslint/types": "5.54.1", - "@typescript-eslint/visitor-keys": "5.54.1" + "@typescript-eslint/types": "5.56.0", + "@typescript-eslint/visitor-keys": "5.56.0" } }, "@typescript-eslint/type-utils": { - "version": "5.54.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.54.1.tgz", - "integrity": "sha512-WREHsTz0GqVYLIbzIZYbmUUr95DKEKIXZNH57W3s+4bVnuF1TKe2jH8ZNH8rO1CeMY3U4j4UQeqPNkHMiGem3g==", + "version": "5.56.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.56.0.tgz", + "integrity": "sha512-8WxgOgJjWRy6m4xg9KoSHPzBNZeQbGlQOH7l2QEhQID/+YseaFxg5J/DLwWSsi9Axj4e/cCiKx7PVzOq38tY4A==", "dev": true, "requires": { - "@typescript-eslint/typescript-estree": "5.54.1", - "@typescript-eslint/utils": "5.54.1", + "@typescript-eslint/typescript-estree": "5.56.0", + "@typescript-eslint/utils": "5.56.0", "debug": "^4.3.4", "tsutils": "^3.21.0" }, @@ -11510,19 +11549,19 @@ } }, "@typescript-eslint/types": { - "version": "5.54.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.54.1.tgz", - "integrity": "sha512-G9+1vVazrfAfbtmCapJX8jRo2E4MDXxgm/IMOF4oGh3kq7XuK3JRkOg6y2Qu1VsTRmWETyTkWt1wxy7X7/yLkw==", + "version": "5.56.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.56.0.tgz", + "integrity": "sha512-JyAzbTJcIyhuUhogmiu+t79AkdnqgPUEsxMTMc/dCZczGMJQh1MK2wgrju++yMN6AWroVAy2jxyPcPr3SWCq5w==", "dev": true }, "@typescript-eslint/typescript-estree": { - "version": "5.54.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.54.1.tgz", - "integrity": "sha512-bjK5t+S6ffHnVwA0qRPTZrxKSaFYocwFIkZx5k7pvWfsB1I57pO/0M0Skatzzw1sCkjJ83AfGTL0oFIFiDX3bg==", + "version": "5.56.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.56.0.tgz", + "integrity": "sha512-41CH/GncsLXOJi0jb74SnC7jVPWeVJ0pxQj8bOjH1h2O26jXN3YHKDT1ejkVz5YeTEQPeLCCRY0U2r68tfNOcg==", "dev": true, "requires": { - "@typescript-eslint/types": "5.54.1", - "@typescript-eslint/visitor-keys": "5.54.1", + "@typescript-eslint/types": "5.56.0", + "@typescript-eslint/visitor-keys": "5.56.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -11548,28 +11587,28 @@ } }, "@typescript-eslint/utils": { - "version": "5.54.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.54.1.tgz", - "integrity": "sha512-IY5dyQM8XD1zfDe5X8jegX6r2EVU5o/WJnLu/znLPWCBF7KNGC+adacXnt5jEYS9JixDcoccI6CvE4RCjHMzCQ==", + "version": "5.56.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.56.0.tgz", + "integrity": "sha512-XhZDVdLnUJNtbzaJeDSCIYaM+Tgr59gZGbFuELgF7m0IY03PlciidS7UQNKLE0+WpUTn1GlycEr6Ivb/afjbhA==", "dev": true, "requires": { + "@eslint-community/eslint-utils": "^4.2.0", "@types/json-schema": "^7.0.9", "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.54.1", - "@typescript-eslint/types": "5.54.1", - "@typescript-eslint/typescript-estree": "5.54.1", + "@typescript-eslint/scope-manager": "5.56.0", + "@typescript-eslint/types": "5.56.0", + "@typescript-eslint/typescript-estree": "5.56.0", "eslint-scope": "^5.1.1", - "eslint-utils": "^3.0.0", "semver": "^7.3.7" } }, "@typescript-eslint/visitor-keys": { - "version": "5.54.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.54.1.tgz", - "integrity": "sha512-q8iSoHTgwCfgcRJ2l2x+xCbu8nBlRAlsQ33k24Adj8eoVBE0f8dUeI+bAa8F84Mv05UGbAx57g2zrRsYIooqQg==", + "version": "5.56.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.56.0.tgz", + "integrity": "sha512-1mFdED7u5bZpX6Xxf5N9U2c18sb+8EvU3tyOIj6LQZ5OOvnmj8BVeNNP603OFPm5KkS1a7IvCIcwrdHXaEMG/Q==", "dev": true, "requires": { - "@typescript-eslint/types": "5.54.1", + "@typescript-eslint/types": "5.56.0", "eslint-visitor-keys": "^3.3.0" } }, From e5b5d588435f175e5bcb956f36ec677a294119ba Mon Sep 17 00:00:00 2001 From: Edwin Huber Date: Tue, 21 Mar 2023 10:32:51 +0100 Subject: [PATCH 040/297] Fix GUID queries using operators other than 'eq' or 'ne' (#1835) * fixed GUID queries using operator other than eq and added tests --- ChangeLog.md | 2 + .../PredicateModel/GuidPredicate.ts | 53 +++++++- tests/table/apis/table.entity.query.test.ts | 114 +++++++++++++++++- .../AzureDataTablesTestEntityFactory.ts | 24 ++-- .../unit/LokiJsQueryTranscriber.unit.test.ts | 2 +- 5 files changed, 179 insertions(+), 16 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index e7e0442f3..bed51787e 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -14,6 +14,8 @@ General: Table: - Fixed issue for querying on identifiers starting with underscore. +- Fixed issue for querying GUIDs using operators other than eq and ne +- GUID queries only support persistent storage on legacy (string) format GUIDs for eq and ne operators, other operators will only evaluate newly stored entities. Queue: diff --git a/src/table/persistence/QueryTranscriber/PredicateModel/GuidPredicate.ts b/src/table/persistence/QueryTranscriber/PredicateModel/GuidPredicate.ts index a95c85560..ba3bdbecf 100644 --- a/src/table/persistence/QueryTranscriber/PredicateModel/GuidPredicate.ts +++ b/src/table/persistence/QueryTranscriber/PredicateModel/GuidPredicate.ts @@ -25,13 +25,54 @@ export default class GuidPredicate implements IPredicate { */ public convertPredicateForLokiJS() { const newTokens: TaggedToken[] = []; - this.pushStringGuidPredicate(newTokens, this.tokenMap); - newTokens.push(new TaggedToken("||", new OperatorToken())); this.pushBase64GuidPredicate(newTokens, this.tokenMap); + this.backWardCompatibleGuidMatch(newTokens, this.tokenMap); this.tokenMap.tokens = newTokens; return this; } + /** + * GUIDs were originally stored as plain strings, but this diverged from the + * service, so we changed the storage format to base64 encoded strings. + * To allow for transition between schemas, we update "equals / not equals" + * queries to search for both plain string and base64 encoded. + * + * @param {TaggedToken[]} newTokens + * @param {TokenMap} tokenMap + * @memberof GuidPredicate + */ + backWardCompatibleGuidMatch(newTokens: TaggedToken[], tokenMap: TokenMap) { + if (this.isBackWardsCompatiblePredicate(tokenMap)) { + this.pushPredicate(newTokens, this.tokenMap); + this.pushStringGuidPredicate(newTokens, this.tokenMap); + } + } + + private isBackWardsCompatiblePredicate(tokenMap: TokenMap) { + return ( + tokenMap.tokens[1].token === "===" || tokenMap.tokens[1].token === "!==" + ); + } + + /** + * adds an OR operator to allow query to return both base64 and string GUIDs + * or an AND operator to retun GUIDs not matching either base64 or string rep + * other operators cannot support backwards compatibility and require the + * persistent storage (database) to be recreated + * + * @private + * @param {TaggedToken[]} newTokens + * @param {TokenMap} taggedPredicate + * @memberof GuidPredicate + */ + private pushPredicate(newTokens: TaggedToken[], tokenMap: TokenMap) { + if (tokenMap.tokens[1].token === "===") { + newTokens.push(new TaggedToken("||", new OperatorToken())); + } else { + newTokens.push(new TaggedToken("&&", new OperatorToken())); + } + } + /** * new schema converts guids to base64 representation * @@ -44,13 +85,17 @@ export default class GuidPredicate implements IPredicate { newTokens: TaggedToken[], taggedPredicate: TokenMap ) { - newTokens.push(new TaggedToken("(", new ParensOpenToken())); + if (this.isBackWardsCompatiblePredicate(taggedPredicate)) { + newTokens.push(new TaggedToken("(", new ParensOpenToken())); + } taggedPredicate.tokens.forEach((taggedToken) => { this.pushIdentifier(taggedToken, newTokens); this.pushOperator(taggedToken, newTokens); this.pushBase64Guid(taggedToken, newTokens); }); - newTokens.push(new TaggedToken(")", new ParensCloseToken())); + if (this.isBackWardsCompatiblePredicate(taggedPredicate)) { + newTokens.push(new TaggedToken(")", new ParensCloseToken())); + } } /** diff --git a/tests/table/apis/table.entity.query.test.ts b/tests/table/apis/table.entity.query.test.ts index 6b525f58d..8c239029f 100644 --- a/tests/table/apis/table.entity.query.test.ts +++ b/tests/table/apis/table.entity.query.test.ts @@ -981,7 +981,7 @@ describe("table Entity APIs test - using Azure/data-tables", () => { await tableClient.deleteTable(); }); - it("should find a property identifier starting with underscore, @loki", async () => { + it("15. should find a property identifier starting with underscore, @loki", async () => { const tableClient = createAzureDataTablesClient( testLocalAzuriteInstance, getUniqueName("under") @@ -1003,4 +1003,116 @@ describe("table Entity APIs test - using Azure/data-tables", () => { assert.notStrictEqual(queryResult.value, undefined); await tableClient.deleteTable(); }); + + it("16. should find guids when using filter with ge, lt, gt and ne, @loki", async () => { + const tableClient = createAzureDataTablesClient( + testLocalAzuriteInstance, + getUniqueName("guidfilters") + ); + const partitionKeyForQueryTest = getUniqueName("1"); + const totalItems = 3; + await tableClient.createTable(); + + const guidEntities: TableTestEntity[] = []; + + const entity0 = entityFactory.createBasicEntityForTest( + partitionKeyForQueryTest + ); + entity0.guidField.value = "11111111-1111-1111-1111-111111111111"; + guidEntities.push(entity0); + + const entity1 = entityFactory.createBasicEntityForTest( + partitionKeyForQueryTest + ); + entity1.guidField.value = "22222222-2222-2222-2222-222222222222"; + guidEntities.push(entity1); + + const entity2 = entityFactory.createBasicEntityForTest( + partitionKeyForQueryTest + ); + entity2.guidField.value = "33333333-3333-3333-3333-333333333333"; + guidEntities.push(entity2); + + for (let i = 0; i < totalItems; i++) { + const result = await tableClient.createEntity(guidEntities[i]); + assert.notStrictEqual(result.etag, undefined); + } + + const maxPageSize = 10; + let testsCompleted = 0; + const queriesAndExpectedResult = [ + { + index: 0, + queryOptions: { + filter: odata`(PartitionKey eq ${partitionKeyForQueryTest}) and (guidField ne guid'${guidEntities[1].guidField.value}')` + }, + expectedResult: 2, // we insert 3 and don't want this one + expectedValue: guidEntities[0].guidField.value + }, + { + index: 1, + queryOptions: { + filter: odata`(PartitionKey eq ${partitionKeyForQueryTest}) and (guidField lt guid'${guidEntities[1].guidField.value}')` + }, + expectedResult: 1, + expectedValue: guidEntities[0].guidField.value + }, + { + index: 2, + queryOptions: { + filter: odata`(PartitionKey eq ${partitionKeyForQueryTest}) and (guidField ge guid'${guidEntities[1].guidField.value}')` + }, + expectedResult: 2, + expectedValue: guidEntities[1].guidField.value + }, + { + index: 3, + queryOptions: { + filter: odata`(PartitionKey eq ${partitionKeyForQueryTest}) and (guidField gt guid'${guidEntities[1].guidField.value}')` + }, + expectedResult: 1, + expectedValue: guidEntities[2].guidField.value + } + ]; + + for (const queryTest of queriesAndExpectedResult) { + const entities = tableClient.listEntities({ + queryOptions: queryTest.queryOptions + }); + let all: TableTestEntity[] = []; + for await (const entity of entities.byPage({ + maxPageSize + })) { + all = [...all, ...entity]; + } + assert.strictEqual( + all.length, + queryTest.expectedResult, + `Failed with query ${queryTest.queryOptions.filter}` + ); + if (all[0] !== undefined) { + all.sort((a, b) => { + return ( + parseInt(a.guidField.value[1], 10) - + parseInt(b.guidField.value[1], 10) + ); + }); + assert.strictEqual( + all[0].guidField.value, + queryTest.expectedValue, + `Test ${queryTest.index}: Guid value ${all[0].guidField.value} was not equal to ${queryTest.expectedValue} with query ${queryTest.queryOptions.filter}` + ); + } else { + assert.strictEqual( + all[0], + queryTest.expectedValue, + `Value ${all[0]} was not equal to ${queryTest.expectedValue} with query ${queryTest.queryOptions.filter}` + ); + } + + testsCompleted++; + } + assert.strictEqual(testsCompleted, queriesAndExpectedResult.length); + await tableClient.deleteTable(); + }); }); diff --git a/tests/table/models/AzureDataTablesTestEntityFactory.ts b/tests/table/models/AzureDataTablesTestEntityFactory.ts index c601ed1d0..09ddabc30 100644 --- a/tests/table/models/AzureDataTablesTestEntityFactory.ts +++ b/tests/table/models/AzureDataTablesTestEntityFactory.ts @@ -10,17 +10,21 @@ export class AzureDataTablesTestEntityFactory { private int32Field: number = 54321; private int64Field: Edm<"Int64"> = { value: "12345", type: "Int64" }; private doubleField: Edm<"Double"> = { value: 54.321, type: "Double" }; - private guidField: Edm<"Guid"> = { - value: "d3365292-0f33-4e13-9ec6-2ea5053c32ad", - type: "Guid" - }; private nullableString: string | null = "notNull"; private binaryField: Buffer = Buffer.from("11111111"); private booleanField: boolean = true; - private dateField: Edm<"DateTime"> = { - value: "2023-01-01T23:00:00", - type: "DateTime" - }; + private newGuid(): Edm<"Guid"> { + return { + value: "d3365292-0f33-4e13-9ec6-2ea5053c32ad", + type: "Guid" + }; + } + private newDateField(): Edm<"DateTime"> { + return { + value: "2023-01-01T23:00:00", + type: "DateTime" + }; + } public Create(part: string, row: string, value: string): TableTestEntity { return { partitionKey: part, @@ -29,11 +33,11 @@ export class AzureDataTablesTestEntityFactory { int32Field: this.int32Field, int64Field: this.int64Field, doubleField: this.doubleField, - guidField: this.guidField, + guidField: this.newGuid(), nullableString: this.nullableString, binaryField: this.binaryField, booleanField: this.booleanField, - dateField: this.dateField + dateField: this.newDateField() }; } diff --git a/tests/table/unit/LokiJsQueryTranscriber.unit.test.ts b/tests/table/unit/LokiJsQueryTranscriber.unit.test.ts index 73599c513..1798a53d8 100644 --- a/tests/table/unit/LokiJsQueryTranscriber.unit.test.ts +++ b/tests/table/unit/LokiJsQueryTranscriber.unit.test.ts @@ -116,7 +116,7 @@ describe("LokiJs Query Transcribing unit tests, also ensures backward compatabil originalQuery: "(myGuid eq guid'12345678-1234-1234-1234-1234567890ab' )", expectedQuery: - "return ( ( ( item.properties.myGuid === '12345678-1234-1234-1234-1234567890ab' ) || ( item.properties.myGuid === 'MTIzNDU2NzgtMTIzNC0xMjM0LTEyMzQtMTIzNDU2Nzg5MGFi' ) ) )" + "return ( ( ( item.properties.myGuid === 'MTIzNDU2NzgtMTIzNC0xMjM0LTEyMzQtMTIzNDU2Nzg5MGFi' ) || ( item.properties.myGuid === '12345678-1234-1234-1234-1234567890ab' ) ) )" } ]; From 5441e030e6236a3a380ba498f99449e04c3a4c2e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 22 Mar 2023 10:35:36 +0800 Subject: [PATCH 041/297] Bump fs-extra and @types/fs-extra (#1852) Bumps [fs-extra](https://github.com/jprichardson/node-fs-extra) and [@types/fs-extra](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/fs-extra). These dependencies needed to be updated together. Updates `fs-extra` from 10.1.0 to 11.1.1 - [Release notes](https://github.com/jprichardson/node-fs-extra/releases) - [Changelog](https://github.com/jprichardson/node-fs-extra/blob/master/CHANGELOG.md) - [Commits](https://github.com/jprichardson/node-fs-extra/compare/10.1.0...11.1.1) Updates `@types/fs-extra` from 9.0.13 to 11.0.1 - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/fs-extra) --- updated-dependencies: - dependency-name: fs-extra dependency-type: direct:production update-type: version-update:semver-major - dependency-name: "@types/fs-extra" dependency-type: direct:development update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 50 +++++++++++++++++++++++++++++++++-------------- package.json | 4 ++-- 2 files changed, 37 insertions(+), 17 deletions(-) diff --git a/package-lock.json b/package-lock.json index 1ced2d16b..8f2a350a4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,7 +14,7 @@ "axios": "^0.27.0", "etag": "^1.8.1", "express": "^4.16.4", - "fs-extra": "^10.1.0", + "fs-extra": "^11.1.1", "glob-to-regexp": "^0.4.1", "jsonwebtoken": "^8.5.1", "lokijs": "^1.5.6", @@ -49,7 +49,7 @@ "@types/bluebird": "^3.5.27", "@types/etag": "^1.8.0", "@types/express": "^4.16.0", - "@types/fs-extra": "^9.0.13", + "@types/fs-extra": "^11.0.1", "@types/glob-to-regexp": "^0.4.1", "@types/jsonwebtoken": "^8.3.9", "@types/lokijs": "^1.5.2", @@ -1287,11 +1287,12 @@ } }, "node_modules/@types/fs-extra": { - "version": "9.0.13", - "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-9.0.13.tgz", - "integrity": "sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==", + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-11.0.1.tgz", + "integrity": "sha512-MxObHvNl4A69ofaTRU8DFqvgzzv8s9yRtaPPm5gud9HDNvpB3GPQFvNuTWAI59B9huVGV5jXYJwbCsmBsOGYWA==", "dev": true, "dependencies": { + "@types/jsonfile": "*", "@types/node": "*" } }, @@ -1317,6 +1318,15 @@ "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", "dev": true }, + "node_modules/@types/jsonfile": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/@types/jsonfile/-/jsonfile-6.1.1.tgz", + "integrity": "sha512-GSgiRCVeapDN+3pqA35IkQwasaCh/0YFH5dEF6S88iDvEn901DjOeH3/QPY+XYP1DFzDZPvIvfeEgk+7br5png==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/jsonwebtoken": { "version": "8.5.9", "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-8.5.9.tgz", @@ -5109,16 +5119,16 @@ "dev": true }, "node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.1.tgz", + "integrity": "sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==", "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" }, "engines": { - "node": ">=12" + "node": ">=14.14" } }, "node_modules/fs-extra/node_modules/universalify": { @@ -11220,11 +11230,12 @@ } }, "@types/fs-extra": { - "version": "9.0.13", - "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-9.0.13.tgz", - "integrity": "sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==", + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-11.0.1.tgz", + "integrity": "sha512-MxObHvNl4A69ofaTRU8DFqvgzzv8s9yRtaPPm5gud9HDNvpB3GPQFvNuTWAI59B9huVGV5jXYJwbCsmBsOGYWA==", "dev": true, "requires": { + "@types/jsonfile": "*", "@types/node": "*" } }, @@ -11250,6 +11261,15 @@ "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", "dev": true }, + "@types/jsonfile": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/@types/jsonfile/-/jsonfile-6.1.1.tgz", + "integrity": "sha512-GSgiRCVeapDN+3pqA35IkQwasaCh/0YFH5dEF6S88iDvEn901DjOeH3/QPY+XYP1DFzDZPvIvfeEgk+7br5png==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, "@types/jsonwebtoken": { "version": "8.5.9", "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-8.5.9.tgz", @@ -14282,9 +14302,9 @@ "dev": true }, "fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.1.tgz", + "integrity": "sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==", "requires": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", diff --git a/package.json b/package.json index 30f1957dd..ba00b3af8 100644 --- a/package.json +++ b/package.json @@ -25,7 +25,7 @@ "axios": "^0.27.0", "etag": "^1.8.1", "express": "^4.16.4", - "fs-extra": "^10.1.0", + "fs-extra": "^11.1.1", "glob-to-regexp": "^0.4.1", "jsonwebtoken": "^8.5.1", "lokijs": "^1.5.6", @@ -54,7 +54,7 @@ "@types/bluebird": "^3.5.27", "@types/etag": "^1.8.0", "@types/express": "^4.16.0", - "@types/fs-extra": "^9.0.13", + "@types/fs-extra": "^11.0.1", "@types/glob-to-regexp": "^0.4.1", "@types/jsonwebtoken": "^8.3.9", "@types/lokijs": "^1.5.2", From 5bd1f02c5db609b8f6b0d4fcfe129b80cd459daa Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 22 Mar 2023 11:27:41 +0800 Subject: [PATCH 042/297] Bump pkg from 5.8.0 to 5.8.1 (#1851) Bumps [pkg](https://github.com/vercel/pkg) from 5.8.0 to 5.8.1. - [Release notes](https://github.com/vercel/pkg/releases) - [Commits](https://github.com/vercel/pkg/compare/5.8.0...5.8.1) --- updated-dependencies: - dependency-name: pkg dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 605 +++++++++------------------------------------- 1 file changed, 113 insertions(+), 492 deletions(-) diff --git a/package-lock.json b/package-lock.json index 8f2a350a4..99f50eba6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -705,10 +705,19 @@ "node": ">=4" } }, + "node_modules/@babel/helper-string-parser": { + "version": "7.19.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", + "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", - "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==", + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", + "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", "dev": true, "engines": { "node": ">=6.9.0" @@ -727,12 +736,13 @@ } }, "node_modules/@babel/types": { - "version": "7.18.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.4.tgz", - "integrity": "sha512-ThN1mBcMq5pG/Vm2IcBmPPfyPXbd8S02rS+OBIDENdufvqC7Z/jHPCv9IcP01277aKtDI8g/2XysBN4hA8niiw==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.19.0.tgz", + "integrity": "sha512-YuGopBq3ke25BVSiS6fgF49Ul9gH1x70Bcr6bqRLjWCkcX8Hre1/5+z+IiWOIerRMSSEfGZVB9z9kyq7wVs9YA==", "dev": true, "dependencies": { - "@babel/helper-validator-identifier": "^7.16.7", + "@babel/helper-string-parser": "^7.18.10", + "@babel/helper-validator-identifier": "^7.18.6", "to-fast-properties": "^2.0.0" }, "engines": { @@ -1992,22 +2002,6 @@ "node": ">=4" } }, - "node_modules/aproba": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", - "dev": true - }, - "node_modules/are-we-there-yet": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", - "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", - "dev": true, - "dependencies": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" - } - }, "node_modules/arg": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", @@ -3479,15 +3473,6 @@ "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "node_modules/code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/color": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/color/-/color-3.2.1.tgz", @@ -3550,12 +3535,6 @@ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" }, - "node_modules/console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", - "dev": true - }, "node_modules/content-disposition": { "version": "0.5.4", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", @@ -3826,15 +3805,18 @@ } }, "node_modules/decompress-response": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-4.2.1.tgz", - "integrity": "sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", "dev": true, "dependencies": { - "mimic-response": "^2.0.0" + "mimic-response": "^3.1.0" }, "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/deep-extend": { @@ -3883,12 +3865,6 @@ "node": ">=0.4.0" } }, - "node_modules/delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", - "dev": true - }, "node_modules/denque": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/denque/-/denque-2.1.0.tgz", @@ -3927,15 +3903,12 @@ } }, "node_modules/detect-libc": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", - "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz", + "integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==", "dev": true, - "bin": { - "detect-libc": "bin/detect-libc.js" - }, "engines": { - "node": ">=0.10" + "node": ">=8" } }, "node_modules/diff": { @@ -5157,22 +5130,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/gauge": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", - "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", - "dev": true, - "dependencies": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" - } - }, "node_modules/generate-function": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.3.1.tgz", @@ -5549,12 +5506,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", - "dev": true - }, "node_modules/hash-base": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", @@ -6054,18 +6005,6 @@ "node": ">=0.10.0" } }, - "node_modules/is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "dependencies": { - "number-is-nan": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", @@ -6406,106 +6345,6 @@ "prebuild-install": "^7.0.1" } }, - "node_modules/keytar/node_modules/decompress-response": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", - "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", - "dev": true, - "dependencies": { - "mimic-response": "^3.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/keytar/node_modules/detect-libc": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz", - "integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/keytar/node_modules/mimic-response": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", - "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/keytar/node_modules/node-abi": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.8.0.tgz", - "integrity": "sha512-tzua9qWWi7iW4I42vUPKM+SfaF0vQSLAm4yO5J83mSwB7GeoWrDKC/K+8YCnYNwqP5duwazbw2X9l4m8SC2cUw==", - "dev": true, - "dependencies": { - "semver": "^7.3.5" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/keytar/node_modules/prebuild-install": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.0.1.tgz", - "integrity": "sha512-QBSab31WqkyxpnMWQxubYAHR5S9B2+r81ucocew34Fkl98FhvKIF50jIJnNOBmAZfyNV7vE5T6gd3hTVWgY6tg==", - "dev": true, - "dependencies": { - "detect-libc": "^2.0.0", - "expand-template": "^2.0.3", - "github-from-package": "0.0.0", - "minimist": "^1.2.3", - "mkdirp-classic": "^0.5.3", - "napi-build-utils": "^1.0.1", - "node-abi": "^3.3.0", - "npmlog": "^4.0.1", - "pump": "^3.0.0", - "rc": "^1.2.7", - "simple-get": "^4.0.0", - "tar-fs": "^2.0.0", - "tunnel-agent": "^0.6.0" - }, - "bin": { - "prebuild-install": "bin.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/keytar/node_modules/simple-get": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", - "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "decompress-response": "^6.0.0", - "once": "^1.3.1", - "simple-concat": "^1.0.0" - } - }, "node_modules/kuler": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz", @@ -7320,12 +7159,12 @@ } }, "node_modules/mimic-response": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-2.1.0.tgz", - "integrity": "sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", "dev": true, "engines": { - "node": ">=8" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -7604,21 +7443,15 @@ } }, "node_modules/node-abi": { - "version": "2.30.1", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-2.30.1.tgz", - "integrity": "sha512-/2D0wOQPgaUWzVSVgRMx+trKJRC2UG4SUc4oCJoXx9Uxjtp0Vy3/kt7zcbxHF8+Z/pK3UloLWzBISg72brfy1w==", + "version": "3.33.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.33.0.tgz", + "integrity": "sha512-7GGVawqyHF4pfd0YFybhv/eM9JwTtPqx0mAanQ146O3FlSh3pA24zf9IRQTOsfTSqXTNzPSP5iagAJ94jjuVog==", "dev": true, "dependencies": { - "semver": "^5.4.1" - } - }, - "node_modules/node-abi/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true, - "bin": { - "semver": "bin/semver" + "semver": "^7.3.5" + }, + "engines": { + "node": ">=10" } }, "node_modules/node-abort-controller": { @@ -7660,18 +7493,6 @@ "node": ">=0.10.0" } }, - "node_modules/npmlog": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", - "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", - "dev": true, - "dependencies": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" - } - }, "node_modules/nth-check": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.0.1.tgz", @@ -7702,15 +7523,6 @@ "node": "*" } }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/object-inspect": { "version": "1.12.2", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", @@ -8004,14 +7816,14 @@ } }, "node_modules/pkg": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/pkg/-/pkg-5.8.0.tgz", - "integrity": "sha512-8h9PUDYFi+LOMLbIyGRdP21g08mAtHidSpofSrf8LWhxUWGHymaRzcopEGiynB5EhQmZUKM6PQ9kCImV2TpdjQ==", + "version": "5.8.1", + "resolved": "https://registry.npmjs.org/pkg/-/pkg-5.8.1.tgz", + "integrity": "sha512-CjBWtFStCfIiT4Bde9QpJy0KeH19jCfwZRJqHFDFXfhUklCx8JoFmMj3wgnEYIwGmZVNkhsStPHEOnrtrQhEXA==", "dev": true, "dependencies": { "@babel/generator": "7.18.2", "@babel/parser": "7.18.4", - "@babel/types": "7.18.4", + "@babel/types": "7.19.0", "chalk": "^4.1.2", "fs-extra": "^9.1.0", "globby": "^11.1.0", @@ -8020,7 +7832,7 @@ "minimist": "^1.2.6", "multistream": "^4.1.0", "pkg-fetch": "3.4.2", - "prebuild-install": "6.1.4", + "prebuild-install": "7.1.1", "resolve": "^1.22.0", "stream-meter": "^1.0.4" }, @@ -8399,22 +8211,21 @@ } }, "node_modules/prebuild-install": { - "version": "6.1.4", - "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-6.1.4.tgz", - "integrity": "sha512-Z4vpywnK1lBg+zdPCVCsKq0xO66eEV9rWo2zrROGGiRS4JtueBOdlB1FnY8lcy7JsUud/Q3ijUxyWN26Ika0vQ==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.1.tgz", + "integrity": "sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==", "dev": true, "dependencies": { - "detect-libc": "^1.0.3", + "detect-libc": "^2.0.0", "expand-template": "^2.0.3", "github-from-package": "0.0.0", "minimist": "^1.2.3", "mkdirp-classic": "^0.5.3", "napi-build-utils": "^1.0.1", - "node-abi": "^2.21.0", - "npmlog": "^4.0.1", + "node-abi": "^3.3.0", "pump": "^3.0.0", "rc": "^1.2.7", - "simple-get": "^3.0.3", + "simple-get": "^4.0.0", "tar-fs": "^2.0.0", "tunnel-agent": "^0.6.0" }, @@ -8422,7 +8233,7 @@ "prebuild-install": "bin.js" }, "engines": { - "node": ">=6" + "node": ">=10" } }, "node_modules/prelude-ls": { @@ -9077,12 +8888,6 @@ "node": ">= 0.8.0" } }, - "node_modules/set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true - }, "node_modules/setprototypeof": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", @@ -9149,12 +8954,26 @@ ] }, "node_modules/simple-get": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-3.1.1.tgz", - "integrity": "sha512-CQ5LTKGfCpvE1K0n2us+kuMPbk/q0EKl82s4aheV9oXjFEz6W/Y7oQFVJuU6QG77hRT4Ghb5RURteF5vnWjupA==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", + "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], "dependencies": { - "decompress-response": "^4.2.0", + "decompress-response": "^6.0.0", "once": "^1.3.1", "simple-concat": "^1.0.0" } @@ -9318,20 +9137,6 @@ "node": ">=0.6.19" } }, - "node_modules/string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "dependencies": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/string.prototype.trimend": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz", @@ -9998,15 +9803,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/wide-align": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", - "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", - "dev": true, - "dependencies": { - "string-width": "^1.0.2 || 2" - } - }, "node_modules/winston": { "version": "3.8.1", "resolved": "https://registry.npmjs.org/winston/-/winston-3.8.1.tgz", @@ -10785,10 +10581,16 @@ } } }, + "@babel/helper-string-parser": { + "version": "7.19.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", + "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==", + "dev": true + }, "@babel/helper-validator-identifier": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", - "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==", + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", + "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", "dev": true }, "@babel/parser": { @@ -10798,12 +10600,13 @@ "dev": true }, "@babel/types": { - "version": "7.18.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.4.tgz", - "integrity": "sha512-ThN1mBcMq5pG/Vm2IcBmPPfyPXbd8S02rS+OBIDENdufvqC7Z/jHPCv9IcP01277aKtDI8g/2XysBN4hA8niiw==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.19.0.tgz", + "integrity": "sha512-YuGopBq3ke25BVSiS6fgF49Ul9gH1x70Bcr6bqRLjWCkcX8Hre1/5+z+IiWOIerRMSSEfGZVB9z9kyq7wVs9YA==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.16.7", + "@babel/helper-string-parser": "^7.18.10", + "@babel/helper-validator-identifier": "^7.18.6", "to-fast-properties": "^2.0.0" }, "dependencies": { @@ -11743,22 +11546,6 @@ "color-convert": "^1.9.0" } }, - "aproba": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", - "dev": true - }, - "are-we-there-yet": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", - "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", - "dev": true, - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" - } - }, "arg": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", @@ -13088,12 +12875,6 @@ } } }, - "code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "dev": true - }, "color": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/color/-/color-3.2.1.tgz", @@ -13153,12 +12934,6 @@ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" }, - "console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", - "dev": true - }, "content-disposition": { "version": "0.5.4", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", @@ -13351,12 +13126,12 @@ } }, "decompress-response": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-4.2.1.tgz", - "integrity": "sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", "dev": true, "requires": { - "mimic-response": "^2.0.0" + "mimic-response": "^3.1.0" } }, "deep-extend": { @@ -13390,12 +13165,6 @@ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" }, - "delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", - "dev": true - }, "denque": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/denque/-/denque-2.1.0.tgz", @@ -13421,9 +13190,9 @@ } }, "detect-libc": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", - "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz", + "integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==", "dev": true }, "diff": { @@ -14333,22 +14102,6 @@ "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==" }, - "gauge": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", - "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", - "dev": true, - "requires": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" - } - }, "generate-function": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.3.1.tgz", @@ -14624,12 +14377,6 @@ "has-symbols": "^1.0.2" } }, - "has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", - "dev": true - }, "hash-base": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", @@ -14970,15 +14717,6 @@ "number-is-nan": "^1.0.0" } }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, "is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", @@ -15247,70 +14985,6 @@ "requires": { "node-addon-api": "^4.3.0", "prebuild-install": "^7.0.1" - }, - "dependencies": { - "decompress-response": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", - "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", - "dev": true, - "requires": { - "mimic-response": "^3.1.0" - } - }, - "detect-libc": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz", - "integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==", - "dev": true - }, - "mimic-response": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", - "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", - "dev": true - }, - "node-abi": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.8.0.tgz", - "integrity": "sha512-tzua9qWWi7iW4I42vUPKM+SfaF0vQSLAm4yO5J83mSwB7GeoWrDKC/K+8YCnYNwqP5duwazbw2X9l4m8SC2cUw==", - "dev": true, - "requires": { - "semver": "^7.3.5" - } - }, - "prebuild-install": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.0.1.tgz", - "integrity": "sha512-QBSab31WqkyxpnMWQxubYAHR5S9B2+r81ucocew34Fkl98FhvKIF50jIJnNOBmAZfyNV7vE5T6gd3hTVWgY6tg==", - "dev": true, - "requires": { - "detect-libc": "^2.0.0", - "expand-template": "^2.0.3", - "github-from-package": "0.0.0", - "minimist": "^1.2.3", - "mkdirp-classic": "^0.5.3", - "napi-build-utils": "^1.0.1", - "node-abi": "^3.3.0", - "npmlog": "^4.0.1", - "pump": "^3.0.0", - "rc": "^1.2.7", - "simple-get": "^4.0.0", - "tar-fs": "^2.0.0", - "tunnel-agent": "^0.6.0" - } - }, - "simple-get": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", - "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", - "dev": true, - "requires": { - "decompress-response": "^6.0.0", - "once": "^1.3.1", - "simple-concat": "^1.0.0" - } - } } }, "kuler": { @@ -15922,9 +15596,9 @@ "dev": true }, "mimic-response": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-2.1.0.tgz", - "integrity": "sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", "dev": true }, "minimatch": { @@ -16155,20 +15829,12 @@ "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==" }, "node-abi": { - "version": "2.30.1", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-2.30.1.tgz", - "integrity": "sha512-/2D0wOQPgaUWzVSVgRMx+trKJRC2UG4SUc4oCJoXx9Uxjtp0Vy3/kt7zcbxHF8+Z/pK3UloLWzBISg72brfy1w==", + "version": "3.33.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.33.0.tgz", + "integrity": "sha512-7GGVawqyHF4pfd0YFybhv/eM9JwTtPqx0mAanQ146O3FlSh3pA24zf9IRQTOsfTSqXTNzPSP5iagAJ94jjuVog==", "dev": true, "requires": { - "semver": "^5.4.1" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } + "semver": "^7.3.5" } }, "node-abort-controller": { @@ -16196,18 +15862,6 @@ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "dev": true }, - "npmlog": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", - "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", - "dev": true, - "requires": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" - } - }, "nth-check": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.0.1.tgz", @@ -16229,12 +15883,6 @@ "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", "dev": true }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true - }, "object-inspect": { "version": "1.12.2", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", @@ -16449,14 +16097,14 @@ "dev": true }, "pkg": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/pkg/-/pkg-5.8.0.tgz", - "integrity": "sha512-8h9PUDYFi+LOMLbIyGRdP21g08mAtHidSpofSrf8LWhxUWGHymaRzcopEGiynB5EhQmZUKM6PQ9kCImV2TpdjQ==", + "version": "5.8.1", + "resolved": "https://registry.npmjs.org/pkg/-/pkg-5.8.1.tgz", + "integrity": "sha512-CjBWtFStCfIiT4Bde9QpJy0KeH19jCfwZRJqHFDFXfhUklCx8JoFmMj3wgnEYIwGmZVNkhsStPHEOnrtrQhEXA==", "dev": true, "requires": { "@babel/generator": "7.18.2", "@babel/parser": "7.18.4", - "@babel/types": "7.18.4", + "@babel/types": "7.19.0", "chalk": "^4.1.2", "fs-extra": "^9.1.0", "globby": "^11.1.0", @@ -16465,7 +16113,7 @@ "minimist": "^1.2.6", "multistream": "^4.1.0", "pkg-fetch": "3.4.2", - "prebuild-install": "6.1.4", + "prebuild-install": "7.1.1", "resolve": "^1.22.0", "stream-meter": "^1.0.4" }, @@ -16733,22 +16381,21 @@ } }, "prebuild-install": { - "version": "6.1.4", - "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-6.1.4.tgz", - "integrity": "sha512-Z4vpywnK1lBg+zdPCVCsKq0xO66eEV9rWo2zrROGGiRS4JtueBOdlB1FnY8lcy7JsUud/Q3ijUxyWN26Ika0vQ==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.1.tgz", + "integrity": "sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==", "dev": true, "requires": { - "detect-libc": "^1.0.3", + "detect-libc": "^2.0.0", "expand-template": "^2.0.3", "github-from-package": "0.0.0", "minimist": "^1.2.3", "mkdirp-classic": "^0.5.3", "napi-build-utils": "^1.0.1", - "node-abi": "^2.21.0", - "npmlog": "^4.0.1", + "node-abi": "^3.3.0", "pump": "^3.0.0", "rc": "^1.2.7", - "simple-get": "^3.0.3", + "simple-get": "^4.0.0", "tar-fs": "^2.0.0", "tunnel-agent": "^0.6.0" } @@ -17228,12 +16875,6 @@ "send": "0.18.0" } }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true - }, "setprototypeof": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", @@ -17277,12 +16918,12 @@ "dev": true }, "simple-get": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-3.1.1.tgz", - "integrity": "sha512-CQ5LTKGfCpvE1K0n2us+kuMPbk/q0EKl82s4aheV9oXjFEz6W/Y7oQFVJuU6QG77hRT4Ghb5RURteF5vnWjupA==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", + "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", "dev": true, "requires": { - "decompress-response": "^4.2.0", + "decompress-response": "^6.0.0", "once": "^1.3.1", "simple-concat": "^1.0.0" } @@ -17400,17 +17041,6 @@ "integrity": "sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg==", "dev": true }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, "string.prototype.trimend": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz", @@ -17927,15 +17557,6 @@ "is-symbol": "^1.0.3" } }, - "wide-align": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", - "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", - "dev": true, - "requires": { - "string-width": "^1.0.2 || 2" - } - }, "winston": { "version": "3.8.1", "resolved": "https://registry.npmjs.org/winston/-/winston-3.8.1.tgz", From f7580b4d8a16b455a3f722c02c746e9bea987001 Mon Sep 17 00:00:00 2001 From: Emma Zhu Date: Thu, 23 Mar 2023 13:47:35 +0800 Subject: [PATCH 043/297] Resolve comments --- swagger/blob-storage-2019-02-02.json | 10505 ---------------- ...rage-2021-10-04.json => blob-storage.json} | 0 swagger/blob.md | 28 +- 3 files changed, 12 insertions(+), 10521 deletions(-) delete mode 100644 swagger/blob-storage-2019-02-02.json rename swagger/{blob-storage-2021-10-04.json => blob-storage.json} (100%) diff --git a/swagger/blob-storage-2019-02-02.json b/swagger/blob-storage-2019-02-02.json deleted file mode 100644 index ba44edf16..000000000 --- a/swagger/blob-storage-2019-02-02.json +++ /dev/null @@ -1,10505 +0,0 @@ -{ - "swagger": "2.0", - "info": { - "title": "Azure Blob Storage", - "version": "2019-02-02", - "x-ms-code-generation-settings": { - "header": "MIT", - "strictSpecAdherence": false - } - }, - "x-ms-parameterized-host": { - "hostTemplate": "{url}", - "useSchemePrefix": false, - "positionInOperation": "first", - "parameters": [ - { - "$ref": "#/parameters/Url" - } - ] - }, - "securityDefinitions": { - "blob_shared_key": { - "type": "apiKey", - "name": "Authorization", - "in": "header" - } - }, - "schemes": [ - "https" - ], - "consumes": [ - "application/xml" - ], - "produces": [ - "application/xml" - ], - "paths": {}, - "x-ms-paths": { - "/?restype=service&comp=properties": { - "put": { - "tags": [ - "service" - ], - "operationId": "Service_SetProperties", - "description": "Sets properties for a storage account's Blob service endpoint, including properties for Storage Analytics and CORS (Cross-Origin Resource Sharing) rules", - "parameters": [ - { - "$ref": "#/parameters/StorageServiceProperties" - }, - { - "$ref": "#/parameters/Timeout" - }, - { - "$ref": "#/parameters/ApiVersionParameter" - }, - { - "$ref": "#/parameters/ClientRequestId" - } - ], - "responses": { - "202": { - "description": "Success (Accepted)", - "headers": { - "x-ms-client-request-id": { - "x-ms-client-name": "ClientRequestId", - "type": "string", - "description": "If a client request id header is sent in the request, this header will be present in the response with the same value." - }, - "x-ms-request-id": { - "x-ms-client-name": "RequestId", - "type": "string", - "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." - }, - "x-ms-version": { - "x-ms-client-name": "Version", - "type": "string", - "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." - } - } - }, - "default": { - "description": "Failure", - "headers": { - "x-ms-error-code": { - "x-ms-client-name": "ErrorCode", - "type": "string" - } - }, - "schema": { - "$ref": "#/definitions/StorageError" - } - } - } - }, - "get": { - "tags": [ - "service" - ], - "operationId": "Service_GetProperties", - "description": "gets the properties of a storage account's Blob service, including properties for Storage Analytics and CORS (Cross-Origin Resource Sharing) rules.", - "parameters": [ - { - "$ref": "#/parameters/Timeout" - }, - { - "$ref": "#/parameters/ApiVersionParameter" - }, - { - "$ref": "#/parameters/ClientRequestId" - } - ], - "responses": { - "200": { - "description": "Success.", - "headers": { - "x-ms-client-request-id": { - "x-ms-client-name": "ClientRequestId", - "type": "string", - "description": "If a client request id header is sent in the request, this header will be present in the response with the same value." - }, - "x-ms-request-id": { - "x-ms-client-name": "RequestId", - "type": "string", - "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." - }, - "x-ms-version": { - "x-ms-client-name": "Version", - "type": "string", - "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." - } - }, - "schema": { - "$ref": "#/definitions/StorageServiceProperties" - } - }, - "default": { - "description": "Failure", - "headers": { - "x-ms-error-code": { - "x-ms-client-name": "ErrorCode", - "type": "string" - } - }, - "schema": { - "$ref": "#/definitions/StorageError" - } - } - } - }, - "parameters": [ - { - "name": "restype", - "in": "query", - "required": true, - "type": "string", - "enum": [ - "service" - ] - }, - { - "name": "comp", - "in": "query", - "required": true, - "type": "string", - "enum": [ - "properties" - ] - } - ] - }, - "/?restype=service&comp=stats": { - "get": { - "tags": [ - "service" - ], - "operationId": "Service_GetStatistics", - "description": "Retrieves statistics related to replication for the Blob service. It is only available on the secondary location endpoint when read-access geo-redundant replication is enabled for the storage account.", - "parameters": [ - { - "$ref": "#/parameters/Timeout" - }, - { - "$ref": "#/parameters/ApiVersionParameter" - }, - { - "$ref": "#/parameters/ClientRequestId" - } - ], - "responses": { - "200": { - "description": "Success.", - "headers": { - "x-ms-client-request-id": { - "x-ms-client-name": "ClientRequestId", - "type": "string", - "description": "If a client request id header is sent in the request, this header will be present in the response with the same value." - }, - "x-ms-request-id": { - "x-ms-client-name": "RequestId", - "type": "string", - "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." - }, - "x-ms-version": { - "x-ms-client-name": "Version", - "type": "string", - "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." - }, - "Date": { - "type": "string", - "format": "date-time-rfc1123", - "description": "UTC date/time value generated by the service that indicates the time at which the response was initiated" - } - }, - "schema": { - "$ref": "#/definitions/StorageServiceStats" - } - }, - "default": { - "description": "Failure", - "headers": { - "x-ms-error-code": { - "x-ms-client-name": "ErrorCode", - "type": "string" - } - }, - "schema": { - "$ref": "#/definitions/StorageError" - } - } - } - }, - "parameters": [ - { - "name": "restype", - "in": "query", - "required": true, - "type": "string", - "enum": [ - "service" - ] - }, - { - "name": "comp", - "in": "query", - "required": true, - "type": "string", - "enum": [ - "stats" - ] - } - ] - }, - "/?comp=list": { - "get": { - "tags": [ - "service" - ], - "operationId": "Service_ListContainersSegment", - "description": "The List Containers Segment operation returns a list of the containers under the specified account", - "parameters": [ - { - "$ref": "#/parameters/Prefix" - }, - { - "$ref": "#/parameters/Marker" - }, - { - "$ref": "#/parameters/MaxResults" - }, - { - "$ref": "#/parameters/ListContainersInclude" - }, - { - "$ref": "#/parameters/Timeout" - }, - { - "$ref": "#/parameters/ApiVersionParameter" - }, - { - "$ref": "#/parameters/ClientRequestId" - } - ], - "responses": { - "200": { - "description": "Success.", - "headers": { - "x-ms-client-request-id": { - "x-ms-client-name": "ClientRequestId", - "type": "string", - "description": "If a client request id header is sent in the request, this header will be present in the response with the same value." - }, - "x-ms-request-id": { - "x-ms-client-name": "RequestId", - "type": "string", - "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." - }, - "x-ms-version": { - "x-ms-client-name": "Version", - "type": "string", - "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." - } - }, - "schema": { - "$ref": "#/definitions/ListContainersSegmentResponse" - } - }, - "default": { - "description": "Failure", - "headers": { - "x-ms-error-code": { - "x-ms-client-name": "ErrorCode", - "type": "string" - } - }, - "schema": { - "$ref": "#/definitions/StorageError" - } - } - }, - "x-ms-pageable": { - "nextLinkName": "NextMarker" - } - }, - "parameters": [ - { - "name": "comp", - "in": "query", - "required": true, - "type": "string", - "enum": [ - "list" - ] - } - ] - }, - "/?restype=service&comp=userdelegationkey": { - "post": { - "tags": [ - "service" - ], - "operationId": "Service_GetUserDelegationKey", - "description": "Retrieves a user delegation key for the Blob service. This is only a valid operation when using bearer token authentication.", - "parameters": [ - { - "$ref": "#/parameters/KeyInfo" - }, - { - "$ref": "#/parameters/Timeout" - }, - { - "$ref": "#/parameters/ApiVersionParameter" - }, - { - "$ref": "#/parameters/ClientRequestId" - } - ], - "responses": { - "200": { - "description": "Success.", - "headers": { - "x-ms-client-request-id": { - "x-ms-client-name": "ClientRequestId", - "type": "string", - "description": "If a client request id header is sent in the request, this header will be present in the response with the same value." - }, - "x-ms-request-id": { - "x-ms-client-name": "RequestId", - "type": "string", - "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." - }, - "x-ms-version": { - "x-ms-client-name": "Version", - "type": "string", - "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." - }, - "Date": { - "type": "string", - "format": "date-time-rfc1123", - "description": "UTC date/time value generated by the service that indicates the time at which the response was initiated" - } - }, - "schema": { - "$ref": "#/definitions/UserDelegationKey" - } - }, - "default": { - "description": "Failure", - "headers": { - "x-ms-error-code": { - "x-ms-client-name": "ErrorCode", - "type": "string" - } - }, - "schema": { - "$ref": "#/definitions/StorageError" - } - } - } - }, - "parameters": [ - { - "name": "restype", - "in": "query", - "required": true, - "type": "string", - "enum": [ - "service" - ] - }, - { - "name": "comp", - "in": "query", - "required": true, - "type": "string", - "enum": [ - "userdelegationkey" - ] - } - ] - }, - "/?restype=account&comp=properties": { - "get": { - "tags": [ - "service" - ], - "operationId": "Service_GetAccountInfo", - "description": "Returns the sku name and account kind ", - "parameters": [ - { - "$ref": "#/parameters/ApiVersionParameter" - } - ], - "responses": { - "200": { - "description": "Success (OK)", - "headers": { - "x-ms-client-request-id": { - "x-ms-client-name": "ClientRequestId", - "type": "string", - "description": "If a client request id header is sent in the request, this header will be present in the response with the same value." - }, - "x-ms-request-id": { - "x-ms-client-name": "RequestId", - "type": "string", - "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." - }, - "x-ms-version": { - "x-ms-client-name": "Version", - "type": "string", - "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." - }, - "Date": { - "type": "string", - "format": "date-time-rfc1123", - "description": "UTC date/time value generated by the service that indicates the time at which the response was initiated" - }, - "x-ms-sku-name": { - "x-ms-client-name": "SkuName", - "type": "string", - "enum": [ - "Standard_LRS", - "Standard_GRS", - "Standard_RAGRS", - "Standard_ZRS", - "Premium_LRS" - ], - "x-ms-enum": { - "name": "SkuName", - "modelAsString": false - }, - "description": "Identifies the sku name of the account" - }, - "x-ms-account-kind": { - "x-ms-client-name": "AccountKind", - "type": "string", - "enum": [ - "Storage", - "BlobStorage", - "StorageV2" - ], - "x-ms-enum": { - "name": "AccountKind", - "modelAsString": false - }, - "description": "Identifies the account kind" - } - } - }, - "default": { - "description": "Failure", - "headers": { - "x-ms-error-code": { - "x-ms-client-name": "ErrorCode", - "type": "string" - } - }, - "schema": { - "$ref": "#/definitions/StorageError" - } - } - } - }, - "head": { - "tags": [ - "service" - ], - "operationId": "Service_GetAccountInfoWithHead", - "description": "Returns the sku name and account kind ", - "parameters": [ - { - "$ref": "#/parameters/ApiVersionParameter" - } - ], - "responses": { - "200": { - "description": "Success (OK)", - "headers": { - "x-ms-client-request-id": { - "x-ms-client-name": "ClientRequestId", - "type": "string", - "description": "If a client request id header is sent in the request, this header will be present in the response with the same value." - }, - "x-ms-request-id": { - "x-ms-client-name": "RequestId", - "type": "string", - "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." - }, - "x-ms-version": { - "x-ms-client-name": "Version", - "type": "string", - "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." - }, - "Date": { - "type": "string", - "format": "date-time-rfc1123", - "description": "UTC date/time value generated by the service that indicates the time at which the response was initiated" - }, - "x-ms-sku-name": { - "x-ms-client-name": "SkuName", - "type": "string", - "enum": [ - "Standard_LRS", - "Standard_GRS", - "Standard_RAGRS", - "Standard_ZRS", - "Premium_LRS" - ], - "x-ms-enum": { - "name": "SkuName", - "modelAsString": false - }, - "description": "Identifies the sku name of the account" - }, - "x-ms-account-kind": { - "x-ms-client-name": "AccountKind", - "type": "string", - "enum": [ - "Storage", - "BlobStorage", - "StorageV2" - ], - "x-ms-enum": { - "name": "AccountKind", - "modelAsString": false - }, - "description": "Identifies the account kind" - } - } - }, - "default": { - "description": "Failure", - "headers": { - "x-ms-error-code": { - "x-ms-client-name": "ErrorCode", - "type": "string" - } - }, - "schema": { - "$ref": "#/definitions/StorageError" - } - } - } - }, - "parameters": [ - { - "name": "restype", - "in": "query", - "required": true, - "type": "string", - "enum": [ - "account" - ] - }, - { - "name": "comp", - "in": "query", - "required": true, - "type": "string", - "enum": [ - "properties" - ] - } - ] - }, - "/?comp=batch": { - "post": { - "tags": [ - "service" - ], - "operationId": "Service_SubmitBatch", - "description": "The Batch operation allows multiple API calls to be embedded into a single HTTP request.", - "parameters": [ - { - "$ref": "#/parameters/Body" - }, - { - "$ref": "#/parameters/ContentLength" - }, - { - "$ref": "#/parameters/MultipartContentType" - }, - { - "$ref": "#/parameters/Timeout" - }, - { - "$ref": "#/parameters/ApiVersionParameter" - }, - { - "$ref": "#/parameters/ClientRequestId" - } - ], - "responses": { - "202": { - "description": "Success.", - "headers": { - "Content-Type": { - "type": "string", - "description": "The media type of the body of the response. For batch requests, this is multipart/mixed; boundary=batchresponse_GUID" - }, - "x-ms-request-id": { - "x-ms-client-name": "RequestId", - "type": "string", - "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." - }, - "x-ms-version": { - "x-ms-client-name": "Version", - "type": "string", - "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." - } - }, - "schema": { - "type": "object", - "format": "file" - } - }, - "default": { - "description": "Failure", - "headers": { - "x-ms-error-code": { - "x-ms-client-name": "ErrorCode", - "type": "string" - } - }, - "schema": { - "$ref": "#/definitions/StorageError" - } - } - } - }, - "parameters": [ - { - "name": "comp", - "in": "query", - "required": true, - "type": "string", - "enum": [ - "batch" - ] - } - ] - }, - "/{containerName}?restype=container": { - "put": { - "tags": [ - "container" - ], - "operationId": "Container_Create", - "description": "creates a new container under the specified account. If the container with the same name already exists, the operation fails", - "parameters": [ - { - "$ref": "#/parameters/Timeout" - }, - { - "$ref": "#/parameters/Metadata" - }, - { - "$ref": "#/parameters/BlobPublicAccess" - }, - { - "$ref": "#/parameters/ApiVersionParameter" - }, - { - "$ref": "#/parameters/ClientRequestId" - } - ], - "responses": { - "201": { - "description": "Success, Container created.", - "headers": { - "ETag": { - "type": "string", - "format": "etag", - "description": "The ETag contains a value that you can use to perform operations conditionally. If the request version is 2011-08-18 or newer, the ETag value will be in quotes." - }, - "Last-Modified": { - "type": "string", - "format": "date-time-rfc1123", - "description": "Returns the date and time the container was last modified. Any operation that modifies the blob, including an update of the blob's metadata or properties, changes the last-modified time of the blob." - }, - "x-ms-client-request-id": { - "x-ms-client-name": "ClientRequestId", - "type": "string", - "description": "If a client request id header is sent in the request, this header will be present in the response with the same value." - }, - "x-ms-request-id": { - "x-ms-client-name": "RequestId", - "type": "string", - "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." - }, - "x-ms-version": { - "x-ms-client-name": "Version", - "type": "string", - "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." - }, - "Date": { - "type": "string", - "format": "date-time-rfc1123", - "description": "UTC date/time value generated by the service that indicates the time at which the response was initiated" - } - } - }, - "default": { - "description": "Failure", - "headers": { - "x-ms-error-code": { - "x-ms-client-name": "ErrorCode", - "type": "string" - } - }, - "schema": { - "$ref": "#/definitions/StorageError" - } - } - } - }, - "get": { - "tags": [ - "container" - ], - "operationId": "Container_GetProperties", - "description": "returns all user-defined metadata and system properties for the specified container. The data returned does not include the container's list of blobs", - "parameters": [ - { - "$ref": "#/parameters/Timeout" - }, - { - "$ref": "#/parameters/LeaseIdOptional" - }, - { - "$ref": "#/parameters/ApiVersionParameter" - }, - { - "$ref": "#/parameters/ClientRequestId" - } - ], - "responses": { - "200": { - "description": "Success", - "headers": { - "x-ms-meta": { - "type": "string", - "x-ms-client-name": "Metadata", - "x-ms-header-collection-prefix": "x-ms-meta-" - }, - "ETag": { - "type": "string", - "format": "etag", - "description": "The ETag contains a value that you can use to perform operations conditionally. If the request version is 2011-08-18 or newer, the ETag value will be in quotes." - }, - "Last-Modified": { - "type": "string", - "format": "date-time-rfc1123", - "description": "Returns the date and time the container was last modified. Any operation that modifies the blob, including an update of the blob's metadata or properties, changes the last-modified time of the blob." - }, - "x-ms-lease-duration": { - "x-ms-client-name": "LeaseDuration", - "description": "When a blob is leased, specifies whether the lease is of infinite or fixed duration.", - "type": "string", - "enum": [ - "infinite", - "fixed" - ], - "x-ms-enum": { - "name": "LeaseDurationType", - "modelAsString": false - } - }, - "x-ms-lease-state": { - "x-ms-client-name": "LeaseState", - "description": "Lease state of the blob.", - "type": "string", - "enum": [ - "available", - "leased", - "expired", - "breaking", - "broken" - ], - "x-ms-enum": { - "name": "LeaseStateType", - "modelAsString": false - } - }, - "x-ms-lease-status": { - "x-ms-client-name": "LeaseStatus", - "description": "The current lease status of the blob.", - "type": "string", - "enum": [ - "locked", - "unlocked" - ], - "x-ms-enum": { - "name": "LeaseStatusType", - "modelAsString": false - } - }, - "x-ms-client-request-id": { - "x-ms-client-name": "ClientRequestId", - "type": "string", - "description": "If a client request id header is sent in the request, this header will be present in the response with the same value." - }, - "x-ms-request-id": { - "x-ms-client-name": "RequestId", - "type": "string", - "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." - }, - "x-ms-version": { - "x-ms-client-name": "Version", - "type": "string", - "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." - }, - "Date": { - "type": "string", - "format": "date-time-rfc1123", - "description": "UTC date/time value generated by the service that indicates the time at which the response was initiated" - }, - "x-ms-blob-public-access": { - "x-ms-client-name": "BlobPublicAccess", - "description": "Indicated whether data in the container may be accessed publicly and the level of access", - "type": "string", - "enum": [ - "container", - "blob" - ], - "x-ms-enum": { - "name": "PublicAccessType", - "modelAsString": true - } - }, - "x-ms-has-immutability-policy": { - "x-ms-client-name": "HasImmutabilityPolicy", - "description": "Indicates whether the container has an immutability policy set on it.", - "type": "boolean" - }, - "x-ms-has-legal-hold": { - "x-ms-client-name": "HasLegalHold", - "description": "Indicates whether the container has a legal hold.", - "type": "boolean" - } - } - }, - "default": { - "description": "Failure", - "headers": { - "x-ms-error-code": { - "x-ms-client-name": "ErrorCode", - "type": "string" - } - }, - "schema": { - "$ref": "#/definitions/StorageError" - } - } - } - }, - "head": { - "tags": [ - "container" - ], - "operationId": "Container_GetPropertiesWithHead", - "description": "returns all user-defined metadata and system properties for the specified container. The data returned does not include the container's list of blobs", - "parameters": [ - { - "$ref": "#/parameters/Timeout" - }, - { - "$ref": "#/parameters/LeaseIdOptional" - }, - { - "$ref": "#/parameters/ApiVersionParameter" - }, - { - "$ref": "#/parameters/ClientRequestId" - } - ], - "responses": { - "200": { - "description": "Success", - "headers": { - "x-ms-meta": { - "type": "string", - "x-ms-client-name": "Metadata", - "x-ms-header-collection-prefix": "x-ms-meta-" - }, - "ETag": { - "type": "string", - "format": "etag", - "description": "The ETag contains a value that you can use to perform operations conditionally. If the request version is 2011-08-18 or newer, the ETag value will be in quotes." - }, - "Last-Modified": { - "type": "string", - "format": "date-time-rfc1123", - "description": "Returns the date and time the container was last modified. Any operation that modifies the blob, including an update of the blob's metadata or properties, changes the last-modified time of the blob." - }, - "x-ms-lease-duration": { - "x-ms-client-name": "LeaseDuration", - "description": "When a blob is leased, specifies whether the lease is of infinite or fixed duration.", - "type": "string", - "enum": [ - "infinite", - "fixed" - ], - "x-ms-enum": { - "name": "LeaseDurationType", - "modelAsString": false - } - }, - "x-ms-lease-state": { - "x-ms-client-name": "LeaseState", - "description": "Lease state of the blob.", - "type": "string", - "enum": [ - "available", - "leased", - "expired", - "breaking", - "broken" - ], - "x-ms-enum": { - "name": "LeaseStateType", - "modelAsString": false - } - }, - "x-ms-lease-status": { - "x-ms-client-name": "LeaseStatus", - "description": "The current lease status of the blob.", - "type": "string", - "enum": [ - "locked", - "unlocked" - ], - "x-ms-enum": { - "name": "LeaseStatusType", - "modelAsString": false - } - }, - "x-ms-client-request-id": { - "x-ms-client-name": "ClientRequestId", - "type": "string", - "description": "If a client request id header is sent in the request, this header will be present in the response with the same value." - }, - "x-ms-request-id": { - "x-ms-client-name": "RequestId", - "type": "string", - "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." - }, - "x-ms-version": { - "x-ms-client-name": "Version", - "type": "string", - "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." - }, - "Date": { - "type": "string", - "format": "date-time-rfc1123", - "description": "UTC date/time value generated by the service that indicates the time at which the response was initiated" - }, - "x-ms-blob-public-access": { - "x-ms-client-name": "BlobPublicAccess", - "description": "Indicated whether data in the container may be accessed publicly and the level of access", - "type": "string", - "enum": [ - "container", - "blob" - ], - "x-ms-enum": { - "name": "PublicAccessType", - "modelAsString": true - } - }, - "x-ms-has-immutability-policy": { - "x-ms-client-name": "HasImmutabilityPolicy", - "description": "Indicates whether the container has an immutability policy set on it.", - "type": "boolean" - }, - "x-ms-has-legal-hold": { - "x-ms-client-name": "HasLegalHold", - "description": "Indicates whether the container has a legal hold.", - "type": "boolean" - } - } - }, - "default": { - "description": "Failure", - "headers": { - "x-ms-error-code": { - "x-ms-client-name": "ErrorCode", - "type": "string" - } - }, - "schema": { - "$ref": "#/definitions/StorageError" - } - } - } - }, - "delete": { - "tags": [ - "container" - ], - "operationId": "Container_Delete", - "description": "operation marks the specified container for deletion. The container and any blobs contained within it are later deleted during garbage collection", - "parameters": [ - { - "$ref": "#/parameters/Timeout" - }, - { - "$ref": "#/parameters/LeaseIdOptional" - }, - { - "$ref": "#/parameters/IfModifiedSince" - }, - { - "$ref": "#/parameters/IfUnmodifiedSince" - }, - { - "$ref": "#/parameters/ApiVersionParameter" - }, - { - "$ref": "#/parameters/ClientRequestId" - } - ], - "responses": { - "202": { - "description": "Accepted", - "headers": { - "x-ms-client-request-id": { - "x-ms-client-name": "ClientRequestId", - "type": "string", - "description": "If a client request id header is sent in the request, this header will be present in the response with the same value." - }, - "x-ms-request-id": { - "x-ms-client-name": "RequestId", - "type": "string", - "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." - }, - "x-ms-version": { - "x-ms-client-name": "Version", - "type": "string", - "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." - }, - "Date": { - "type": "string", - "format": "date-time-rfc1123", - "description": "UTC date/time value generated by the service that indicates the time at which the response was initiated" - } - } - }, - "default": { - "description": "Failure", - "headers": { - "x-ms-error-code": { - "x-ms-client-name": "ErrorCode", - "type": "string" - } - }, - "schema": { - "$ref": "#/definitions/StorageError" - } - } - } - }, - "parameters": [ - { - "name": "restype", - "in": "query", - "required": true, - "type": "string", - "enum": [ - "container" - ] - } - ] - }, - "/{containerName}?restype=container&comp=metadata": { - "put": { - "tags": [ - "container" - ], - "operationId": "Container_SetMetadata", - "description": "operation sets one or more user-defined name-value pairs for the specified container.", - "parameters": [ - { - "$ref": "#/parameters/Timeout" - }, - { - "$ref": "#/parameters/LeaseIdOptional" - }, - { - "$ref": "#/parameters/Metadata" - }, - { - "$ref": "#/parameters/IfModifiedSince" - }, - { - "$ref": "#/parameters/ApiVersionParameter" - }, - { - "$ref": "#/parameters/ClientRequestId" - } - ], - "responses": { - "200": { - "description": "Success", - "headers": { - "ETag": { - "type": "string", - "format": "etag", - "description": "The ETag contains a value that you can use to perform operations conditionally. If the request version is 2011-08-18 or newer, the ETag value will be in quotes." - }, - "Last-Modified": { - "type": "string", - "format": "date-time-rfc1123", - "description": "Returns the date and time the container was last modified. Any operation that modifies the blob, including an update of the blob's metadata or properties, changes the last-modified time of the blob." - }, - "x-ms-client-request-id": { - "x-ms-client-name": "ClientRequestId", - "type": "string", - "description": "If a client request id header is sent in the request, this header will be present in the response with the same value." - }, - "x-ms-request-id": { - "x-ms-client-name": "RequestId", - "type": "string", - "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." - }, - "x-ms-version": { - "x-ms-client-name": "Version", - "type": "string", - "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." - }, - "Date": { - "type": "string", - "format": "date-time-rfc1123", - "description": "UTC date/time value generated by the service that indicates the time at which the response was initiated" - } - } - }, - "default": { - "description": "Failure", - "headers": { - "x-ms-error-code": { - "x-ms-client-name": "ErrorCode", - "type": "string" - } - }, - "schema": { - "$ref": "#/definitions/StorageError" - } - } - } - }, - "parameters": [ - { - "name": "restype", - "in": "query", - "required": true, - "type": "string", - "enum": [ - "container" - ] - }, - { - "name": "comp", - "in": "query", - "required": true, - "type": "string", - "enum": [ - "metadata" - ] - } - ] - }, - "/{containerName}?restype=container&comp=acl": { - "get": { - "tags": [ - "container" - ], - "operationId": "Container_GetAccessPolicy", - "description": "gets the permissions for the specified container. The permissions indicate whether container data may be accessed publicly.", - "parameters": [ - { - "$ref": "#/parameters/Timeout" - }, - { - "$ref": "#/parameters/LeaseIdOptional" - }, - { - "$ref": "#/parameters/ApiVersionParameter" - }, - { - "$ref": "#/parameters/ClientRequestId" - } - ], - "responses": { - "200": { - "description": "Success", - "headers": { - "x-ms-blob-public-access": { - "x-ms-client-name": "BlobPublicAccess", - "description": "Indicated whether data in the container may be accessed publicly and the level of access", - "type": "string", - "enum": [ - "container", - "blob" - ], - "x-ms-enum": { - "name": "PublicAccessType", - "modelAsString": true - } - }, - "ETag": { - "type": "string", - "format": "etag", - "description": "The ETag contains a value that you can use to perform operations conditionally. If the request version is 2011-08-18 or newer, the ETag value will be in quotes." - }, - "Last-Modified": { - "type": "string", - "format": "date-time-rfc1123", - "description": "Returns the date and time the container was last modified. Any operation that modifies the blob, including an update of the blob's metadata or properties, changes the last-modified time of the blob." - }, - "x-ms-client-request-id": { - "x-ms-client-name": "ClientRequestId", - "type": "string", - "description": "If a client request id header is sent in the request, this header will be present in the response with the same value." - }, - "x-ms-request-id": { - "x-ms-client-name": "RequestId", - "type": "string", - "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." - }, - "x-ms-version": { - "x-ms-client-name": "Version", - "type": "string", - "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." - }, - "Date": { - "type": "string", - "format": "date-time-rfc1123", - "description": "UTC date/time value generated by the service that indicates the time at which the response was initiated" - } - }, - "schema": { - "$ref": "#/definitions/SignedIdentifiers" - } - }, - "default": { - "description": "Failure", - "headers": { - "x-ms-error-code": { - "x-ms-client-name": "ErrorCode", - "type": "string" - } - }, - "schema": { - "$ref": "#/definitions/StorageError" - } - } - } - }, - "put": { - "tags": [ - "container" - ], - "operationId": "Container_SetAccessPolicy", - "description": "sets the permissions for the specified container. The permissions indicate whether blobs in a container may be accessed publicly.", - "parameters": [ - { - "$ref": "#/parameters/ContainerAcl" - }, - { - "$ref": "#/parameters/Timeout" - }, - { - "$ref": "#/parameters/LeaseIdOptional" - }, - { - "$ref": "#/parameters/BlobPublicAccess" - }, - { - "$ref": "#/parameters/IfModifiedSince" - }, - { - "$ref": "#/parameters/IfUnmodifiedSince" - }, - { - "$ref": "#/parameters/ApiVersionParameter" - }, - { - "$ref": "#/parameters/ClientRequestId" - } - ], - "responses": { - "200": { - "description": "Success.", - "headers": { - "ETag": { - "type": "string", - "format": "etag", - "description": "The ETag contains a value that you can use to perform operations conditionally. If the request version is 2011-08-18 or newer, the ETag value will be in quotes." - }, - "Last-Modified": { - "type": "string", - "format": "date-time-rfc1123", - "description": "Returns the date and time the container was last modified. Any operation that modifies the blob, including an update of the blob's metadata or properties, changes the last-modified time of the blob." - }, - "x-ms-client-request-id": { - "x-ms-client-name": "ClientRequestId", - "type": "string", - "description": "If a client request id header is sent in the request, this header will be present in the response with the same value." - }, - "x-ms-request-id": { - "x-ms-client-name": "RequestId", - "type": "string", - "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." - }, - "x-ms-version": { - "x-ms-client-name": "Version", - "type": "string", - "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." - }, - "Date": { - "type": "string", - "format": "date-time-rfc1123", - "description": "UTC date/time value generated by the service that indicates the time at which the response was initiated" - } - } - }, - "default": { - "description": "Failure", - "headers": { - "x-ms-error-code": { - "x-ms-client-name": "ErrorCode", - "type": "string" - } - }, - "schema": { - "$ref": "#/definitions/StorageError" - } - } - } - }, - "parameters": [ - { - "name": "restype", - "in": "query", - "required": true, - "type": "string", - "enum": [ - "container" - ] - }, - { - "name": "comp", - "in": "query", - "required": true, - "type": "string", - "enum": [ - "acl" - ] - } - ] - }, - "/{containerName}?restype=container&comp=batch": { - "post": { - "tags": [ - "container" - ], - "operationId": "Container_SubmitBatch", - "description": "The Batch operation allows multiple API calls to be embedded into a single HTTP request.", - "parameters": [ - { - "$ref": "#/parameters/Body" - }, - { - "$ref": "#/parameters/ContentLength" - }, - { - "$ref": "#/parameters/MultipartContentType" - }, - { - "$ref": "#/parameters/Timeout" - }, - { - "$ref": "#/parameters/ApiVersionParameter" - }, - { - "$ref": "#/parameters/ClientRequestId" - } - ], - "responses": { - "202": { - "description": "Success.", - "headers": { - "Content-Type": { - "type": "string", - "description": "The media type of the body of the response. For batch requests, this is multipart/mixed; boundary=batchresponse_GUID" - }, - "x-ms-request-id": { - "x-ms-client-name": "RequestId", - "type": "string", - "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." - }, - "x-ms-version": { - "x-ms-client-name": "Version", - "type": "string", - "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." - } - }, - "schema": { - "type": "object", - "format": "file" - } - }, - "default": { - "description": "Failure", - "headers": { - "x-ms-error-code": { - "x-ms-client-name": "ErrorCode", - "type": "string" - } - }, - "schema": { - "$ref": "#/definitions/StorageError" - } - } - } - }, - "parameters": [ - { - "$ref": "#/parameters/ContainerName" - }, - { - "name": "restype", - "description": "restype", - "in": "query", - "required": true, - "type": "string", - "enum": [ - "container" - ] - }, - { - "name": "comp", - "description": "comp", - "in": "query", - "required": true, - "type": "string", - "enum": [ - "batch" - ] - } - ] - }, - "/{containerName}?comp=lease&restype=container&acquire": { - "put": { - "tags": [ - "container" - ], - "operationId": "Container_AcquireLease", - "description": "[Update] establishes and manages a lock on a container for delete operations. The lock duration can be 15 to 60 seconds, or can be infinite", - "parameters": [ - { - "$ref": "#/parameters/Timeout" - }, - { - "$ref": "#/parameters/LeaseDuration" - }, - { - "$ref": "#/parameters/ProposedLeaseIdOptional" - }, - { - "$ref": "#/parameters/IfModifiedSince" - }, - { - "$ref": "#/parameters/IfUnmodifiedSince" - }, - { - "$ref": "#/parameters/ApiVersionParameter" - }, - { - "$ref": "#/parameters/ClientRequestId" - } - ], - "responses": { - "201": { - "description": "The Acquire operation completed successfully.", - "headers": { - "ETag": { - "type": "string", - "format": "etag", - "description": "The ETag contains a value that you can use to perform operations conditionally. If the request version is 2011-08-18 or newer, the ETag value will be in quotes." - }, - "Last-Modified": { - "type": "string", - "format": "date-time-rfc1123", - "description": "Returns the date and time the container was last modified. Any operation that modifies the blob, including an update of the blob's metadata or properties, changes the last-modified time of the blob." - }, - "x-ms-lease-id": { - "x-ms-client-name": "LeaseId", - "type": "string", - "description": "Uniquely identifies a container's lease" - }, - "x-ms-client-request-id": { - "x-ms-client-name": "ClientRequestId", - "type": "string", - "description": "If a client request id header is sent in the request, this header will be present in the response with the same value." - }, - "x-ms-request-id": { - "x-ms-client-name": "RequestId", - "type": "string", - "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." - }, - "x-ms-version": { - "x-ms-client-name": "Version", - "type": "string", - "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." - }, - "Date": { - "type": "string", - "format": "date-time-rfc1123", - "description": "UTC date/time value generated by the service that indicates the time at which the response was initiated" - } - } - }, - "default": { - "description": "Failure", - "headers": { - "x-ms-error-code": { - "x-ms-client-name": "ErrorCode", - "type": "string" - } - }, - "schema": { - "$ref": "#/definitions/StorageError" - } - } - } - }, - "parameters": [ - { - "name": "comp", - "in": "query", - "required": true, - "type": "string", - "enum": [ - "lease" - ] - }, - { - "name": "restype", - "in": "query", - "required": true, - "type": "string", - "enum": [ - "container" - ] - }, - { - "name": "x-ms-lease-action", - "x-ms-client-name": "action", - "in": "header", - "required": true, - "type": "string", - "enum": [ - "acquire" - ], - "x-ms-enum": { - "name": "LeaseAction", - "modelAsString": false - }, - "x-ms-parameter-location": "method", - "description": "Describes what lease action to take." - } - ] - }, - "/{containerName}?comp=lease&restype=container&release": { - "put": { - "tags": [ - "container" - ], - "operationId": "Container_ReleaseLease", - "description": "[Update] establishes and manages a lock on a container for delete operations. The lock duration can be 15 to 60 seconds, or can be infinite", - "parameters": [ - { - "$ref": "#/parameters/Timeout" - }, - { - "$ref": "#/parameters/LeaseIdRequired" - }, - { - "$ref": "#/parameters/IfModifiedSince" - }, - { - "$ref": "#/parameters/IfUnmodifiedSince" - }, - { - "$ref": "#/parameters/ApiVersionParameter" - }, - { - "$ref": "#/parameters/ClientRequestId" - } - ], - "responses": { - "200": { - "description": "The Release operation completed successfully.", - "headers": { - "ETag": { - "type": "string", - "format": "etag", - "description": "The ETag contains a value that you can use to perform operations conditionally. If the request version is 2011-08-18 or newer, the ETag value will be in quotes." - }, - "Last-Modified": { - "type": "string", - "format": "date-time-rfc1123", - "description": "Returns the date and time the container was last modified. Any operation that modifies the blob, including an update of the blob's metadata or properties, changes the last-modified time of the blob." - }, - "x-ms-client-request-id": { - "x-ms-client-name": "ClientRequestId", - "type": "string", - "description": "If a client request id header is sent in the request, this header will be present in the response with the same value." - }, - "x-ms-request-id": { - "x-ms-client-name": "RequestId", - "type": "string", - "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." - }, - "x-ms-version": { - "x-ms-client-name": "Version", - "type": "string", - "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." - }, - "Date": { - "type": "string", - "format": "date-time-rfc1123", - "description": "UTC date/time value generated by the service that indicates the time at which the response was initiated" - } - } - }, - "default": { - "description": "Failure", - "headers": { - "x-ms-error-code": { - "x-ms-client-name": "ErrorCode", - "type": "string" - } - }, - "schema": { - "$ref": "#/definitions/StorageError" - } - } - } - }, - "parameters": [ - { - "name": "comp", - "in": "query", - "required": true, - "type": "string", - "enum": [ - "lease" - ] - }, - { - "name": "restype", - "in": "query", - "required": true, - "type": "string", - "enum": [ - "container" - ] - }, - { - "name": "x-ms-lease-action", - "x-ms-client-name": "action", - "in": "header", - "required": true, - "type": "string", - "enum": [ - "release" - ], - "x-ms-enum": { - "name": "LeaseAction", - "modelAsString": false - }, - "x-ms-parameter-location": "method", - "description": "Describes what lease action to take." - } - ] - }, - "/{containerName}?comp=lease&restype=container&renew": { - "put": { - "tags": [ - "container" - ], - "operationId": "Container_RenewLease", - "description": "[Update] establishes and manages a lock on a container for delete operations. The lock duration can be 15 to 60 seconds, or can be infinite", - "parameters": [ - { - "$ref": "#/parameters/Timeout" - }, - { - "$ref": "#/parameters/LeaseIdRequired" - }, - { - "$ref": "#/parameters/IfModifiedSince" - }, - { - "$ref": "#/parameters/IfUnmodifiedSince" - }, - { - "$ref": "#/parameters/ApiVersionParameter" - }, - { - "$ref": "#/parameters/ClientRequestId" - } - ], - "responses": { - "200": { - "description": "The Renew operation completed successfully.", - "headers": { - "ETag": { - "type": "string", - "format": "etag", - "description": "The ETag contains a value that you can use to perform operations conditionally. If the request version is 2011-08-18 or newer, the ETag value will be in quotes." - }, - "Last-Modified": { - "type": "string", - "format": "date-time-rfc1123", - "description": "Returns the date and time the container was last modified. Any operation that modifies the blob, including an update of the blob's metadata or properties, changes the last-modified time of the blob." - }, - "x-ms-lease-id": { - "x-ms-client-name": "LeaseId", - "type": "string", - "description": "Uniquely identifies a container's lease" - }, - "x-ms-client-request-id": { - "x-ms-client-name": "ClientRequestId", - "type": "string", - "description": "If a client request id header is sent in the request, this header will be present in the response with the same value." - }, - "x-ms-request-id": { - "x-ms-client-name": "RequestId", - "type": "string", - "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." - }, - "x-ms-version": { - "x-ms-client-name": "Version", - "type": "string", - "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." - }, - "Date": { - "type": "string", - "format": "date-time-rfc1123", - "description": "UTC date/time value generated by the service that indicates the time at which the response was initiated" - } - } - }, - "default": { - "description": "Failure", - "headers": { - "x-ms-error-code": { - "x-ms-client-name": "ErrorCode", - "type": "string" - } - }, - "schema": { - "$ref": "#/definitions/StorageError" - } - } - } - }, - "parameters": [ - { - "name": "comp", - "in": "query", - "required": true, - "type": "string", - "enum": [ - "lease" - ] - }, - { - "name": "restype", - "in": "query", - "required": true, - "type": "string", - "enum": [ - "container" - ] - }, - { - "name": "x-ms-lease-action", - "x-ms-client-name": "action", - "in": "header", - "required": true, - "type": "string", - "enum": [ - "renew" - ], - "x-ms-enum": { - "name": "LeaseAction", - "modelAsString": false - }, - "x-ms-parameter-location": "method", - "description": "Describes what lease action to take." - } - ] - }, - "/{containerName}?comp=lease&restype=container&break": { - "put": { - "tags": [ - "container" - ], - "operationId": "Container_BreakLease", - "description": "[Update] establishes and manages a lock on a container for delete operations. The lock duration can be 15 to 60 seconds, or can be infinite", - "parameters": [ - { - "$ref": "#/parameters/Timeout" - }, - { - "$ref": "#/parameters/LeaseBreakPeriod" - }, - { - "$ref": "#/parameters/IfModifiedSince" - }, - { - "$ref": "#/parameters/IfUnmodifiedSince" - }, - { - "$ref": "#/parameters/ApiVersionParameter" - }, - { - "$ref": "#/parameters/ClientRequestId" - } - ], - "responses": { - "202": { - "description": "The Break operation completed successfully.", - "headers": { - "ETag": { - "type": "string", - "format": "etag", - "description": "The ETag contains a value that you can use to perform operations conditionally. If the request version is 2011-08-18 or newer, the ETag value will be in quotes." - }, - "Last-Modified": { - "type": "string", - "format": "date-time-rfc1123", - "description": "Returns the date and time the container was last modified. Any operation that modifies the blob, including an update of the blob's metadata or properties, changes the last-modified time of the blob." - }, - "x-ms-lease-time": { - "x-ms-client-name": "LeaseTime", - "type": "integer", - "description": "Approximate time remaining in the lease period, in seconds." - }, - "x-ms-client-request-id": { - "x-ms-client-name": "ClientRequestId", - "type": "string", - "description": "If a client request id header is sent in the request, this header will be present in the response with the same value." - }, - "x-ms-request-id": { - "x-ms-client-name": "RequestId", - "type": "string", - "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." - }, - "x-ms-version": { - "x-ms-client-name": "Version", - "type": "string", - "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." - }, - "Date": { - "type": "string", - "format": "date-time-rfc1123", - "description": "UTC date/time value generated by the service that indicates the time at which the response was initiated" - } - } - }, - "default": { - "description": "Failure", - "headers": { - "x-ms-error-code": { - "x-ms-client-name": "ErrorCode", - "type": "string" - } - }, - "schema": { - "$ref": "#/definitions/StorageError" - } - } - } - }, - "parameters": [ - { - "name": "comp", - "in": "query", - "required": true, - "type": "string", - "enum": [ - "lease" - ] - }, - { - "name": "restype", - "in": "query", - "required": true, - "type": "string", - "enum": [ - "container" - ] - }, - { - "name": "x-ms-lease-action", - "x-ms-client-name": "action", - "in": "header", - "required": true, - "type": "string", - "enum": [ - "break" - ], - "x-ms-enum": { - "name": "LeaseAction", - "modelAsString": false - }, - "x-ms-parameter-location": "method", - "description": "Describes what lease action to take." - } - ] - }, - "/{containerName}?comp=lease&restype=container&change": { - "put": { - "tags": [ - "container" - ], - "operationId": "Container_ChangeLease", - "description": "[Update] establishes and manages a lock on a container for delete operations. The lock duration can be 15 to 60 seconds, or can be infinite", - "parameters": [ - { - "$ref": "#/parameters/Timeout" - }, - { - "$ref": "#/parameters/LeaseIdRequired" - }, - { - "$ref": "#/parameters/ProposedLeaseIdRequired" - }, - { - "$ref": "#/parameters/IfModifiedSince" - }, - { - "$ref": "#/parameters/IfUnmodifiedSince" - }, - { - "$ref": "#/parameters/ApiVersionParameter" - }, - { - "$ref": "#/parameters/ClientRequestId" - } - ], - "responses": { - "200": { - "description": "The Change operation completed successfully.", - "headers": { - "ETag": { - "type": "string", - "format": "etag", - "description": "The ETag contains a value that you can use to perform operations conditionally. If the request version is 2011-08-18 or newer, the ETag value will be in quotes." - }, - "Last-Modified": { - "type": "string", - "format": "date-time-rfc1123", - "description": "Returns the date and time the container was last modified. Any operation that modifies the blob, including an update of the blob's metadata or properties, changes the last-modified time of the blob." - }, - "x-ms-lease-id": { - "x-ms-client-name": "LeaseId", - "type": "string", - "description": "Uniquely identifies a container's lease" - }, - "x-ms-client-request-id": { - "x-ms-client-name": "ClientRequestId", - "type": "string", - "description": "If a client request id header is sent in the request, this header will be present in the response with the same value." - }, - "x-ms-request-id": { - "x-ms-client-name": "RequestId", - "type": "string", - "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." - }, - "x-ms-version": { - "x-ms-client-name": "Version", - "type": "string", - "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." - }, - "Date": { - "type": "string", - "format": "date-time-rfc1123", - "description": "UTC date/time value generated by the service that indicates the time at which the response was initiated" - } - } - }, - "default": { - "description": "Failure", - "headers": { - "x-ms-error-code": { - "x-ms-client-name": "ErrorCode", - "type": "string" - } - }, - "schema": { - "$ref": "#/definitions/StorageError" - } - } - } - }, - "parameters": [ - { - "name": "comp", - "in": "query", - "required": true, - "type": "string", - "enum": [ - "lease" - ] - }, - { - "name": "restype", - "in": "query", - "required": true, - "type": "string", - "enum": [ - "container" - ] - }, - { - "name": "x-ms-lease-action", - "x-ms-client-name": "action", - "in": "header", - "required": true, - "type": "string", - "enum": [ - "change" - ], - "x-ms-enum": { - "name": "LeaseAction", - "modelAsString": false - }, - "x-ms-parameter-location": "method", - "description": "Describes what lease action to take." - } - ] - }, - "/{containerName}?restype=container&comp=list&flat": { - "get": { - "tags": [ - "containers" - ], - "operationId": "Container_ListBlobFlatSegment", - "description": "[Update] The List Blobs operation returns a list of the blobs under the specified container", - "parameters": [ - { - "$ref": "#/parameters/Prefix" - }, - { - "$ref": "#/parameters/Marker" - }, - { - "$ref": "#/parameters/MaxResults" - }, - { - "$ref": "#/parameters/ListBlobsInclude" - }, - { - "$ref": "#/parameters/Timeout" - }, - { - "$ref": "#/parameters/ApiVersionParameter" - }, - { - "$ref": "#/parameters/ClientRequestId" - } - ], - "responses": { - "200": { - "description": "Success.", - "headers": { - "Content-Type": { - "type": "string", - "description": "The media type of the body of the response. For List Blobs this is 'application/xml'" - }, - "x-ms-client-request-id": { - "x-ms-client-name": "ClientRequestId", - "type": "string", - "description": "If a client request id header is sent in the request, this header will be present in the response with the same value." - }, - "x-ms-request-id": { - "x-ms-client-name": "RequestId", - "type": "string", - "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." - }, - "x-ms-version": { - "x-ms-client-name": "Version", - "type": "string", - "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." - }, - "Date": { - "type": "string", - "format": "date-time-rfc1123", - "description": "UTC date/time value generated by the service that indicates the time at which the response was initiated" - } - }, - "schema": { - "$ref": "#/definitions/ListBlobsFlatSegmentResponse" - } - }, - "default": { - "description": "Failure", - "headers": { - "x-ms-error-code": { - "x-ms-client-name": "ErrorCode", - "type": "string" - } - }, - "schema": { - "$ref": "#/definitions/StorageError" - } - } - }, - "x-ms-pageable": { - "nextLinkName": "NextMarker" - } - }, - "parameters": [ - { - "name": "restype", - "in": "query", - "required": true, - "type": "string", - "enum": [ - "container" - ] - }, - { - "name": "comp", - "in": "query", - "required": true, - "type": "string", - "enum": [ - "list" - ] - } - ] - }, - "/{containerName}?restype=container&comp=list&hierarchy": { - "get": { - "tags": [ - "containers" - ], - "operationId": "Container_ListBlobHierarchySegment", - "description": "[Update] The List Blobs operation returns a list of the blobs under the specified container", - "parameters": [ - { - "$ref": "#/parameters/Prefix" - }, - { - "$ref": "#/parameters/Delimiter" - }, - { - "$ref": "#/parameters/Marker" - }, - { - "$ref": "#/parameters/MaxResults" - }, - { - "$ref": "#/parameters/ListBlobsInclude" - }, - { - "$ref": "#/parameters/Timeout" - }, - { - "$ref": "#/parameters/ApiVersionParameter" - }, - { - "$ref": "#/parameters/ClientRequestId" - } - ], - "responses": { - "200": { - "description": "Success.", - "headers": { - "Content-Type": { - "type": "string", - "description": "The media type of the body of the response. For List Blobs this is 'application/xml'" - }, - "x-ms-client-request-id": { - "x-ms-client-name": "ClientRequestId", - "type": "string", - "description": "If a client request id header is sent in the request, this header will be present in the response with the same value." - }, - "x-ms-request-id": { - "x-ms-client-name": "RequestId", - "type": "string", - "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." - }, - "x-ms-version": { - "x-ms-client-name": "Version", - "type": "string", - "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." - }, - "Date": { - "type": "string", - "format": "date-time-rfc1123", - "description": "UTC date/time value generated by the service that indicates the time at which the response was initiated" - } - }, - "schema": { - "$ref": "#/definitions/ListBlobsHierarchySegmentResponse" - } - }, - "default": { - "description": "Failure", - "headers": { - "x-ms-error-code": { - "x-ms-client-name": "ErrorCode", - "type": "string" - } - }, - "schema": { - "$ref": "#/definitions/StorageError" - } - } - }, - "x-ms-pageable": { - "nextLinkName": "NextMarker" - } - }, - "parameters": [ - { - "name": "restype", - "in": "query", - "required": true, - "type": "string", - "enum": [ - "container" - ] - }, - { - "name": "comp", - "in": "query", - "required": true, - "type": "string", - "enum": [ - "list" - ] - } - ] - }, - "/{containerName}?restype=account&comp=properties": { - "get": { - "tags": [ - "container" - ], - "operationId": "Container_GetAccountInfo", - "description": "Returns the sku name and account kind ", - "parameters": [ - { - "$ref": "#/parameters/ApiVersionParameter" - } - ], - "responses": { - "200": { - "description": "Success (OK)", - "headers": { - "x-ms-client-request-id": { - "x-ms-client-name": "ClientRequestId", - "type": "string", - "description": "If a client request id header is sent in the request, this header will be present in the response with the same value." - }, - "x-ms-request-id": { - "x-ms-client-name": "RequestId", - "type": "string", - "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." - }, - "x-ms-version": { - "x-ms-client-name": "Version", - "type": "string", - "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." - }, - "Date": { - "type": "string", - "format": "date-time-rfc1123", - "description": "UTC date/time value generated by the service that indicates the time at which the response was initiated" - }, - "x-ms-sku-name": { - "x-ms-client-name": "SkuName", - "type": "string", - "enum": [ - "Standard_LRS", - "Standard_GRS", - "Standard_RAGRS", - "Standard_ZRS", - "Premium_LRS" - ], - "x-ms-enum": { - "name": "SkuName", - "modelAsString": false - }, - "description": "Identifies the sku name of the account" - }, - "x-ms-account-kind": { - "x-ms-client-name": "AccountKind", - "type": "string", - "enum": [ - "Storage", - "BlobStorage", - "StorageV2" - ], - "x-ms-enum": { - "name": "AccountKind", - "modelAsString": false - }, - "description": "Identifies the account kind" - } - } - }, - "default": { - "description": "Failure", - "headers": { - "x-ms-error-code": { - "x-ms-client-name": "ErrorCode", - "type": "string" - } - }, - "schema": { - "$ref": "#/definitions/StorageError" - } - } - } - }, - "head": { - "tags": [ - "container" - ], - "operationId": "Container_GetAccountInfoWithHead", - "description": "Returns the sku name and account kind ", - "parameters": [ - { - "$ref": "#/parameters/ApiVersionParameter" - } - ], - "responses": { - "200": { - "description": "Success (OK)", - "headers": { - "x-ms-client-request-id": { - "x-ms-client-name": "ClientRequestId", - "type": "string", - "description": "If a client request id header is sent in the request, this header will be present in the response with the same value." - }, - "x-ms-request-id": { - "x-ms-client-name": "RequestId", - "type": "string", - "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." - }, - "x-ms-version": { - "x-ms-client-name": "Version", - "type": "string", - "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." - }, - "Date": { - "type": "string", - "format": "date-time-rfc1123", - "description": "UTC date/time value generated by the service that indicates the time at which the response was initiated" - }, - "x-ms-sku-name": { - "x-ms-client-name": "SkuName", - "type": "string", - "enum": [ - "Standard_LRS", - "Standard_GRS", - "Standard_RAGRS", - "Standard_ZRS", - "Premium_LRS" - ], - "x-ms-enum": { - "name": "SkuName", - "modelAsString": false - }, - "description": "Identifies the sku name of the account" - }, - "x-ms-account-kind": { - "x-ms-client-name": "AccountKind", - "type": "string", - "enum": [ - "Storage", - "BlobStorage", - "StorageV2" - ], - "x-ms-enum": { - "name": "AccountKind", - "modelAsString": false - }, - "description": "Identifies the account kind" - } - } - }, - "default": { - "description": "Failure", - "headers": { - "x-ms-error-code": { - "x-ms-client-name": "ErrorCode", - "type": "string" - } - }, - "schema": { - "$ref": "#/definitions/StorageError" - } - } - } - }, - "parameters": [ - { - "name": "restype", - "in": "query", - "required": true, - "type": "string", - "enum": [ - "account" - ] - }, - { - "name": "comp", - "in": "query", - "required": true, - "type": "string", - "enum": [ - "properties" - ] - } - ] - }, - "/{filesystem}/{path}?resource=directory&Create": { - "put": { - "tags": [ - "directory" - ], - "operationId": "Directory_Create", - "description": "Create a directory. By default, the destination is overwritten and if the destination already exists and has a lease the lease is broken. This operation supports conditional HTTP requests. For more information, see [Specifying Conditional Headers for Blob Service Operations](https://docs.microsoft.com/en-us/rest/api/storageservices/specifying-conditional-headers-for-blob-service-operations). To fail if the destination already exists, use a conditional request with If-None-Match: \"*\".", - "consumes": [ - "application/octet-stream" - ], - "parameters": [ - { - "$ref": "#/parameters/Timeout" - }, - { - "$ref": "#/parameters/DirectoryProperties" - }, - { - "$ref": "#/parameters/PosixPermissions" - }, - { - "$ref": "#/parameters/PosixUmask" - }, - { - "$ref": "#/parameters/XMsCacheControl" - }, - { - "$ref": "#/parameters/XMsContentType" - }, - { - "$ref": "#/parameters/XMsContentEncoding" - }, - { - "$ref": "#/parameters/XMsContentLanguage" - }, - { - "$ref": "#/parameters/XMsContentDisposition" - }, - { - "$ref": "#/parameters/LeaseIdOptional" - }, - { - "$ref": "#/parameters/IfModifiedSince" - }, - { - "$ref": "#/parameters/IfUnmodifiedSince" - }, - { - "$ref": "#/parameters/IfMatch" - }, - { - "$ref": "#/parameters/IfNoneMatch" - }, - { - "$ref": "#/parameters/ApiVersionParameter" - }, - { - "$ref": "#/parameters/ClientRequestId" - } - ], - "responses": { - "201": { - "description": "The file or directory was created.", - "headers": { - "ETag": { - "type": "string", - "format": "etag", - "description": "An HTTP entity tag associated with the file or directory." - }, - "Last-Modified": { - "type": "string", - "format": "date-time-rfc1123", - "description": "The data and time the file or directory was last modified. Write operations on the file or directory update the last modified time." - }, - "x-ms-client-request-id": { - "x-ms-client-name": "ClientRequestId", - "type": "string", - "description": "If a client request id header is sent in the request, this header will be present in the response with the same value." - }, - "x-ms-request-id": { - "x-ms-client-name": "RequestId", - "type": "string", - "description": "A server-generated UUID recorded in the analytics logs for troubleshooting and correlation." - }, - "x-ms-version": { - "x-ms-client-name": "Version", - "type": "string", - "description": "The version of the REST protocol used to process the request." - }, - "Content-Length": { - "type": "integer", - "format": "int64", - "description": "The size of the resource in bytes." - }, - "Date": { - "type": "string", - "format": "date-time-rfc1123", - "description": "A UTC date/time value generated by the service that indicates the time at which the response was initiated." - } - } - }, - "default": { - "description": "Failure", - "headers": { - "x-ms-client-request-id": { - "x-ms-client-name": "ClientRequestId", - "type": "string", - "description": "If a client request id header is sent in the request, this header will be present in the response with the same value." - }, - "x-ms-request-id": { - "x-ms-client-name": "RequestId", - "type": "string", - "description": "A server-generated UUID recorded in the analytics logs for troubleshooting and correlation." - }, - "x-ms-version": { - "x-ms-client-name": "Version", - "type": "string", - "description": "The version of the REST protocol used to process the request." - } - }, - "schema": { - "$ref": "#/definitions/DataLakeStorageError" - } - } - } - }, - "parameters": [ - { - "name": "resource", - "in": "query", - "required": true, - "type": "string", - "enum": [ - "directory" - ] - } - ] - }, - "/{filesystem}/{path}?DirectoryRename": { - "put": { - "tags": [ - "directory" - ], - "operationId": "Directory_Rename", - "description": "Rename a directory. By default, the destination is overwritten and if the destination already exists and has a lease the lease is broken. This operation supports conditional HTTP requests. For more information, see [Specifying Conditional Headers for Blob Service Operations](https://docs.microsoft.com/en-us/rest/api/storageservices/specifying-conditional-headers-for-blob-service-operations). To fail if the destination already exists, use a conditional request with If-None-Match: \"*\".", - "consumes": [ - "application/octet-stream" - ], - "parameters": [ - { - "$ref": "#/parameters/Timeout" - }, - { - "$ref": "#/parameters/Continuation" - }, - { - "$ref": "#/parameters/PathRenameMode" - }, - { - "$ref": "#/parameters/FileRenameSource" - }, - { - "$ref": "#/parameters/DirectoryProperties" - }, - { - "$ref": "#/parameters/PosixPermissions" - }, - { - "$ref": "#/parameters/PosixUmask" - }, - { - "$ref": "#/parameters/XMsCacheControl" - }, - { - "$ref": "#/parameters/XMsContentType" - }, - { - "$ref": "#/parameters/XMsContentEncoding" - }, - { - "$ref": "#/parameters/XMsContentLanguage" - }, - { - "$ref": "#/parameters/XMsContentDisposition" - }, - { - "$ref": "#/parameters/LeaseIdOptional" - }, - { - "$ref": "#/parameters/SourceLeaseId" - }, - { - "$ref": "#/parameters/IfModifiedSince" - }, - { - "$ref": "#/parameters/IfUnmodifiedSince" - }, - { - "$ref": "#/parameters/IfMatch" - }, - { - "$ref": "#/parameters/IfNoneMatch" - }, - { - "$ref": "#/parameters/SourceIfModifiedSince" - }, - { - "$ref": "#/parameters/SourceIfUnmodifiedSince" - }, - { - "$ref": "#/parameters/SourceIfMatch" - }, - { - "$ref": "#/parameters/SourceIfNoneMatch" - }, - { - "$ref": "#/parameters/ApiVersionParameter" - }, - { - "$ref": "#/parameters/ClientRequestId" - } - ], - "responses": { - "201": { - "description": "The directory was renamed.", - "headers": { - "x-ms-continuation": { - "x-ms-client-name": "marker", - "type": "string", - "description": "When renaming a directory, the number of paths that are renamed with each invocation is limited. If the number of paths to be renamed exceeds this limit, a continuation token is returned in this response header. When a continuation token is returned in the response, it must be specified in a subsequent invocation of the rename operation to continue renaming the directory." - }, - "ETag": { - "type": "string", - "format": "etag", - "description": "An HTTP entity tag associated with the file or directory." - }, - "Last-Modified": { - "type": "string", - "format": "date-time-rfc1123", - "description": "The data and time the file or directory was last modified. Write operations on the file or directory update the last modified time." - }, - "x-ms-client-request-id": { - "x-ms-client-name": "ClientRequestId", - "type": "string", - "description": "If a client request id header is sent in the request, this header will be present in the response with the same value." - }, - "x-ms-request-id": { - "x-ms-client-name": "RequestId", - "type": "string", - "description": "A server-generated UUID recorded in the analytics logs for troubleshooting and correlation." - }, - "x-ms-version": { - "x-ms-client-name": "Version", - "type": "string", - "description": "The version of the REST protocol used to process the request." - }, - "Content-Length": { - "type": "integer", - "format": "int64", - "description": "The size of the resource in bytes." - }, - "Date": { - "type": "string", - "format": "date-time-rfc1123", - "description": "A UTC date/time value generated by the service that indicates the time at which the response was initiated." - } - } - }, - "default": { - "description": "Failure", - "headers": { - "x-ms-client-request-id": { - "x-ms-client-name": "ClientRequestId", - "type": "string", - "description": "If a client request id header is sent in the request, this header will be present in the response with the same value." - }, - "x-ms-request-id": { - "x-ms-client-name": "RequestId", - "type": "string", - "description": "A server-generated UUID recorded in the analytics logs for troubleshooting and correlation." - }, - "x-ms-version": { - "x-ms-client-name": "Version", - "type": "string", - "description": "The version of the REST protocol used to process the request." - } - }, - "schema": { - "$ref": "#/definitions/DataLakeStorageError" - } - } - } - } - }, - "/{filesystem}/{path}?DirectoryDelete": { - "delete": { - "tags": [ - "directory" - ], - "operationId": "Directory_Delete", - "description": "Deletes the directory", - "parameters": [ - { - "$ref": "#/parameters/Timeout" - }, - { - "$ref": "#/parameters/RecursiveDirectoryDelete" - }, - { - "$ref": "#/parameters/Continuation" - }, - { - "$ref": "#/parameters/LeaseIdOptional" - }, - { - "$ref": "#/parameters/IfModifiedSince" - }, - { - "$ref": "#/parameters/IfUnmodifiedSince" - }, - { - "$ref": "#/parameters/IfMatch" - }, - { - "$ref": "#/parameters/IfNoneMatch" - }, - { - "$ref": "#/parameters/ApiVersionParameter" - }, - { - "$ref": "#/parameters/ClientRequestId" - } - ], - "responses": { - "200": { - "description": "The directory was deleted.", - "headers": { - "x-ms-continuation": { - "x-ms-client-name": "marker", - "type": "string", - "description": "When renaming a directory, the number of paths that are renamed with each invocation is limited. If the number of paths to be renamed exceeds this limit, a continuation token is returned in this response header. When a continuation token is returned in the response, it must be specified in a subsequent invocation of the rename operation to continue renaming the directory." - }, - "x-ms-client-request-id": { - "x-ms-client-name": "ClientRequestId", - "type": "string", - "description": "If a client request id header is sent in the request, this header will be present in the response with the same value." - }, - "x-ms-request-id": { - "x-ms-client-name": "RequestId", - "type": "string", - "description": "A server-generated UUID recorded in the analytics logs for troubleshooting and correlation." - }, - "x-ms-version": { - "x-ms-client-name": "Version", - "type": "string", - "description": "The version of the REST protocol used to process the request." - }, - "Date": { - "type": "string", - "format": "date-time-rfc1123", - "description": "A UTC date/time value generated by the service that indicates the time at which the response was initiated." - } - } - }, - "default": { - "description": "Failure", - "headers": { - "x-ms-client-request-id": { - "x-ms-client-name": "ClientRequestId", - "type": "string", - "description": "If a client request id header is sent in the request, this header will be present in the response with the same value." - }, - "x-ms-request-id": { - "x-ms-client-name": "RequestId", - "type": "string", - "description": "A server-generated UUID recorded in the analytics logs for troubleshooting and correlation." - }, - "x-ms-version": { - "x-ms-client-name": "Version", - "type": "string", - "description": "The version of the REST protocol used to process the request." - } - }, - "schema": { - "$ref": "#/definitions/DataLakeStorageError" - } - } - } - } - }, - "/{filesystem}/{path}?action=setAccessControl&directory": { - "patch": { - "tags": [ - "directory" - ], - "operationId": "Directory_SetAccessControl", - "description": "Set the owner, group, permissions, or access control list for a directory.", - "parameters": [ - { - "$ref": "#/parameters/Timeout" - }, - { - "$ref": "#/parameters/LeaseIdOptional" - }, - { - "$ref": "#/parameters/Owner" - }, - { - "$ref": "#/parameters/Group" - }, - { - "$ref": "#/parameters/PosixPermissions" - }, - { - "$ref": "#/parameters/PosixAcl" - }, - { - "$ref": "#/parameters/IfMatch" - }, - { - "$ref": "#/parameters/IfNoneMatch" - }, - { - "$ref": "#/parameters/IfModifiedSince" - }, - { - "$ref": "#/parameters/IfUnmodifiedSince" - }, - { - "$ref": "#/parameters/ClientRequestId" - }, - { - "$ref": "#/parameters/ApiVersionParameter" - } - ], - "responses": { - "200": { - "description": "Set directory access control response.", - "headers": { - "Date": { - "type": "string", - "format": "date-time-rfc1123", - "description": "A UTC date/time value generated by the service that indicates the time at which the response was initiated." - }, - "ETag": { - "type": "string", - "format": "etag", - "description": "An HTTP entity tag associated with the file or directory." - }, - "Last-Modified": { - "type": "string", - "format": "date-time-rfc1123", - "description": "The data and time the file or directory was last modified. Write operations on the file or directory update the last modified time." - }, - "x-ms-request-id": { - "x-ms-client-name": "RequestId", - "type": "string", - "description": "A server-generated UUID recorded in the analytics logs for troubleshooting and correlation." - }, - "x-ms-version": { - "x-ms-client-name": "Version", - "type": "string", - "description": "The version of the REST protocol used to process the request." - } - } - }, - "default": { - "description": "Failure", - "headers": { - "x-ms-client-request-id": { - "x-ms-client-name": "ClientRequestId", - "type": "string", - "description": "If a client request id header is sent in the request, this header will be present in the response with the same value." - }, - "x-ms-request-id": { - "x-ms-client-name": "RequestId", - "type": "string", - "description": "A server-generated UUID recorded in the analytics logs for troubleshooting and correlation." - }, - "x-ms-version": { - "x-ms-client-name": "Version", - "type": "string", - "description": "The version of the REST protocol used to process the request." - } - }, - "schema": { - "$ref": "#/definitions/DataLakeStorageError" - } - } - } - }, - "parameters": [ - { - "name": "action", - "in": "query", - "required": true, - "type": "string", - "enum": [ - "setAccessControl" - ] - } - ] - }, - "/{filesystem}/{path}?action=getAccessControl&directory": { - "head": { - "tags": [ - "directory" - ], - "operationId": "Directory_GetAccessControl", - "description": "Get the owner, group, permissions, or access control list for a directory.", - "parameters": [ - { - "$ref": "#/parameters/Timeout" - }, - { - "$ref": "#/parameters/Upn" - }, - { - "$ref": "#/parameters/LeaseIdOptional" - }, - { - "$ref": "#/parameters/IfMatch" - }, - { - "$ref": "#/parameters/IfNoneMatch" - }, - { - "$ref": "#/parameters/IfModifiedSince" - }, - { - "$ref": "#/parameters/IfUnmodifiedSince" - }, - { - "$ref": "#/parameters/ClientRequestId" - }, - { - "$ref": "#/parameters/ApiVersionParameter" - } - ], - "responses": { - "200": { - "description": "Get directory access control response.", - "headers": { - "Date": { - "type": "string", - "format": "date-time-rfc1123", - "description": "A UTC date/time value generated by the service that indicates the time at which the response was initiated." - }, - "ETag": { - "type": "string", - "format": "etag", - "description": "An HTTP entity tag associated with the file or directory." - }, - "Last-Modified": { - "type": "string", - "format": "date-time-rfc1123", - "description": "The data and time the file or directory was last modified. Write operations on the file or directory update the last modified time." - }, - "x-ms-owner": { - "description": "The owner of the file or directory. Included in the response if Hierarchical Namespace is enabled for the account.", - "type": "string" - }, - "x-ms-group": { - "description": "The owning group of the file or directory. Included in the response if Hierarchical Namespace is enabled for the account.", - "type": "string" - }, - "x-ms-permissions": { - "description": "The POSIX access permissions for the file owner, the file owning group, and others. Included in the response if Hierarchical Namespace is enabled for the account.", - "type": "string" - }, - "x-ms-acl": { - "description": "The POSIX access control list for the file or directory. Included in the response only if the action is \"getAccessControl\" and Hierarchical Namespace is enabled for the account.", - "type": "string" - }, - "x-ms-request-id": { - "x-ms-client-name": "RequestId", - "type": "string", - "description": "A server-generated UUID recorded in the analytics logs for troubleshooting and correlation." - }, - "x-ms-version": { - "x-ms-client-name": "Version", - "type": "string", - "description": "The version of the REST protocol used to process the request." - } - } - }, - "default": { - "description": "Failure", - "headers": { - "x-ms-client-request-id": { - "x-ms-client-name": "ClientRequestId", - "type": "string", - "description": "If a client request id header is sent in the request, this header will be present in the response with the same value." - }, - "x-ms-request-id": { - "x-ms-client-name": "RequestId", - "type": "string", - "description": "A server-generated UUID recorded in the analytics logs for troubleshooting and correlation." - }, - "x-ms-version": { - "x-ms-client-name": "Version", - "type": "string", - "description": "The version of the REST protocol used to process the request." - } - }, - "schema": { - "$ref": "#/definitions/DataLakeStorageError" - } - } - } - }, - "parameters": [ - { - "name": "action", - "in": "query", - "required": true, - "type": "string", - "enum": [ - "getAccessControl" - ] - } - ] - }, - "/{containerName}/{blob}": { - "get": { - "tags": [ - "blob" - ], - "operationId": "Blob_Download", - "description": "The Download operation reads or downloads a blob from the system, including its metadata and properties. You can also call Download to read a snapshot.", - "parameters": [ - { - "$ref": "#/parameters/Snapshot" - }, - { - "$ref": "#/parameters/Timeout" - }, - { - "$ref": "#/parameters/Range" - }, - { - "$ref": "#/parameters/LeaseIdOptional" - }, - { - "$ref": "#/parameters/GetRangeContentMD5" - }, - { - "$ref": "#/parameters/GetRangeContentCRC64" - }, - { - "$ref": "#/parameters/EncryptionKey" - }, - { - "$ref": "#/parameters/EncryptionKeySha256" - }, - { - "$ref": "#/parameters/EncryptionAlgorithm" - }, - { - "$ref": "#/parameters/IfModifiedSince" - }, - { - "$ref": "#/parameters/IfUnmodifiedSince" - }, - { - "$ref": "#/parameters/IfMatch" - }, - { - "$ref": "#/parameters/IfNoneMatch" - }, - { - "$ref": "#/parameters/ApiVersionParameter" - }, - { - "$ref": "#/parameters/ClientRequestId" - } - ], - "responses": { - "200": { - "description": "Returns the content of the entire blob.", - "headers": { - "Last-Modified": { - "type": "string", - "format": "date-time-rfc1123", - "description": "Returns the date and time the container was last modified. Any operation that modifies the blob, including an update of the blob's metadata or properties, changes the last-modified time of the blob." - }, - "x-ms-meta": { - "type": "string", - "x-ms-client-name": "Metadata", - "x-ms-header-collection-prefix": "x-ms-meta-" - }, - "x-ms-creation-time": { - "x-ms-client-name": "CreationTime", - "type": "string", - "format": "date-time-rfc1123", - "description": "Returns the date and time the blob was created." - }, - "Content-Length": { - "type": "integer", - "format": "int64", - "description": "The number of bytes present in the response body." - }, - "Content-Type": { - "type": "string", - "description": "The media type of the body of the response. For Download Blob this is 'application/octet-stream'" - }, - "Content-Range": { - "type": "string", - "description": "Indicates the range of bytes returned in the event that the client requested a subset of the blob by setting the 'Range' request header." - }, - "ETag": { - "type": "string", - "format": "etag", - "description": "The ETag contains a value that you can use to perform operations conditionally. If the request version is 2011-08-18 or newer, the ETag value will be in quotes." - }, - "Content-MD5": { - "type": "string", - "format": "byte", - "description": "If the blob has an MD5 hash and this operation is to read the full blob, this response header is returned so that the client can check for message content integrity." - }, - "Content-Encoding": { - "type": "string", - "description": "This header returns the value that was specified for the Content-Encoding request header" - }, - "Cache-Control": { - "type": "string", - "description": "This header is returned if it was previously specified for the blob." - }, - "Content-Disposition": { - "type": "string", - "description": "This header returns the value that was specified for the 'x-ms-blob-content-disposition' header. The Content-Disposition response header field conveys additional information about how to process the response payload, and also can be used to attach additional metadata. For example, if set to attachment, it indicates that the user-agent should not display the response, but instead show a Save As dialog with a filename other than the blob name specified." - }, - "Content-Language": { - "type": "string", - "description": "This header returns the value that was specified for the Content-Language request header." - }, - "x-ms-blob-sequence-number": { - "x-ms-client-name": "BlobSequenceNumber", - "type": "integer", - "format": "int64", - "description": "The current sequence number for a page blob. This header is not returned for block blobs or append blobs" - }, - "x-ms-blob-type": { - "x-ms-client-name": "BlobType", - "description": "The blob's type.", - "type": "string", - "enum": [ - "BlockBlob", - "PageBlob", - "AppendBlob" - ], - "x-ms-enum": { - "name": "BlobType", - "modelAsString": false - } - }, - "x-ms-copy-completion-time": { - "x-ms-client-name": "CopyCompletionTime", - "type": "string", - "format": "date-time-rfc1123", - "description": "Conclusion time of the last attempted Copy Blob operation where this blob was the destination blob. This value can specify the time of a completed, aborted, or failed copy attempt. This header does not appear if a copy is pending, if this blob has never been the destination in a Copy Blob operation, or if this blob has been modified after a concluded Copy Blob operation using Set Blob Properties, Put Blob, or Put Block List." - }, - "x-ms-copy-status-description": { - "x-ms-client-name": "CopyStatusDescription", - "type": "string", - "description": "Only appears when x-ms-copy-status is failed or pending. Describes the cause of the last fatal or non-fatal copy operation failure. This header does not appear if this blob has never been the destination in a Copy Blob operation, or if this blob has been modified after a concluded Copy Blob operation using Set Blob Properties, Put Blob, or Put Block List" - }, - "x-ms-copy-id": { - "x-ms-client-name": "CopyId", - "type": "string", - "description": "String identifier for this copy operation. Use with Get Blob Properties to check the status of this copy operation, or pass to Abort Copy Blob to abort a pending copy." - }, - "x-ms-copy-progress": { - "x-ms-client-name": "CopyProgress", - "type": "string", - "description": "Contains the number of bytes copied and the total bytes in the source in the last attempted Copy Blob operation where this blob was the destination blob. Can show between 0 and Content-Length bytes copied. This header does not appear if this blob has never been the destination in a Copy Blob operation, or if this blob has been modified after a concluded Copy Blob operation using Set Blob Properties, Put Blob, or Put Block List" - }, - "x-ms-copy-source": { - "x-ms-client-name": "CopySource", - "type": "string", - "description": "URL up to 2 KB in length that specifies the source blob or file used in the last attempted Copy Blob operation where this blob was the destination blob. This header does not appear if this blob has never been the destination in a Copy Blob operation, or if this blob has been modified after a concluded Copy Blob operation using Set Blob Properties, Put Blob, or Put Block List." - }, - "x-ms-copy-status": { - "x-ms-client-name": "CopyStatus", - "description": "State of the copy operation identified by x-ms-copy-id.", - "type": "string", - "enum": [ - "pending", - "success", - "aborted", - "failed" - ], - "x-ms-enum": { - "name": "CopyStatusType", - "modelAsString": false - } - }, - "x-ms-lease-duration": { - "x-ms-client-name": "LeaseDuration", - "description": "When a blob is leased, specifies whether the lease is of infinite or fixed duration.", - "type": "string", - "enum": [ - "infinite", - "fixed" - ], - "x-ms-enum": { - "name": "LeaseDurationType", - "modelAsString": false - } - }, - "x-ms-lease-state": { - "x-ms-client-name": "LeaseState", - "description": "Lease state of the blob.", - "type": "string", - "enum": [ - "available", - "leased", - "expired", - "breaking", - "broken" - ], - "x-ms-enum": { - "name": "LeaseStateType", - "modelAsString": false - } - }, - "x-ms-lease-status": { - "x-ms-client-name": "LeaseStatus", - "description": "The current lease status of the blob.", - "type": "string", - "enum": [ - "locked", - "unlocked" - ], - "x-ms-enum": { - "name": "LeaseStatusType", - "modelAsString": false - } - }, - "x-ms-client-request-id": { - "x-ms-client-name": "ClientRequestId", - "type": "string", - "description": "If a client request id header is sent in the request, this header will be present in the response with the same value." - }, - "x-ms-request-id": { - "x-ms-client-name": "RequestId", - "type": "string", - "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." - }, - "x-ms-version": { - "x-ms-client-name": "Version", - "type": "string", - "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." - }, - "Accept-Ranges": { - "type": "string", - "description": "Indicates that the service supports requests for partial blob content." - }, - "Date": { - "type": "string", - "format": "date-time-rfc1123", - "description": "UTC date/time value generated by the service that indicates the time at which the response was initiated" - }, - "x-ms-blob-committed-block-count": { - "x-ms-client-name": "BlobCommittedBlockCount", - "type": "integer", - "description": "The number of committed blocks present in the blob. This header is returned only for append blobs." - }, - "x-ms-server-encrypted": { - "x-ms-client-name": "IsServerEncrypted", - "type": "boolean", - "description": "The value of this header is set to true if the blob data and application metadata are completely encrypted using the specified algorithm. Otherwise, the value is set to false (when the blob is unencrypted, or if only parts of the blob/application metadata are encrypted)." - }, - "x-ms-encryption-key-sha256": { - "x-ms-client-name": "EncryptionKeySha256", - "type": "string", - "description": "The SHA-256 hash of the encryption key used to encrypt the blob. This header is only returned when the blob was encrypted with a customer-provided key." - }, - "x-ms-blob-content-md5": { - "x-ms-client-name": "BlobContentMD5", - "type": "string", - "format": "byte", - "description": "If the blob has a MD5 hash, and if request contains range header (Range or x-ms-range), this response header is returned with the value of the whole blob's MD5 value. This value may or may not be equal to the value returned in Content-MD5 header, with the latter calculated from the requested range" - } - }, - "schema": { - "type": "object", - "format": "file" - } - }, - "206": { - "description": "Returns the content of a specified range of the blob.", - "headers": { - "Last-Modified": { - "type": "string", - "format": "date-time-rfc1123", - "description": "Returns the date and time the container was last modified. Any operation that modifies the blob, including an update of the blob's metadata or properties, changes the last-modified time of the blob." - }, - "x-ms-meta": { - "type": "string", - "x-ms-client-name": "Metadata", - "x-ms-header-collection-prefix": "x-ms-meta-" - }, - "Content-Length": { - "type": "integer", - "format": "int64", - "description": "The number of bytes present in the response body." - }, - "Content-Type": { - "type": "string", - "description": "The media type of the body of the response. For Download Blob this is 'application/octet-stream'" - }, - "Content-Range": { - "type": "string", - "description": "Indicates the range of bytes returned in the event that the client requested a subset of the blob by setting the 'Range' request header." - }, - "ETag": { - "type": "string", - "format": "etag", - "description": "The ETag contains a value that you can use to perform operations conditionally. If the request version is 2011-08-18 or newer, the ETag value will be in quotes." - }, - "Content-MD5": { - "type": "string", - "format": "byte", - "description": "If the blob has an MD5 hash and this operation is to read the full blob, this response header is returned so that the client can check for message content integrity." - }, - "Content-Encoding": { - "type": "string", - "description": "This header returns the value that was specified for the Content-Encoding request header" - }, - "Cache-Control": { - "type": "string", - "description": "This header is returned if it was previously specified for the blob." - }, - "Content-Disposition": { - "type": "string", - "description": "This header returns the value that was specified for the 'x-ms-blob-content-disposition' header. The Content-Disposition response header field conveys additional information about how to process the response payload, and also can be used to attach additional metadata. For example, if set to attachment, it indicates that the user-agent should not display the response, but instead show a Save As dialog with a filename other than the blob name specified." - }, - "Content-Language": { - "type": "string", - "description": "This header returns the value that was specified for the Content-Language request header." - }, - "x-ms-blob-sequence-number": { - "x-ms-client-name": "BlobSequenceNumber", - "type": "integer", - "format": "int64", - "description": "The current sequence number for a page blob. This header is not returned for block blobs or append blobs" - }, - "x-ms-blob-type": { - "x-ms-client-name": "BlobType", - "description": "The blob's type.", - "type": "string", - "enum": [ - "BlockBlob", - "PageBlob", - "AppendBlob" - ], - "x-ms-enum": { - "name": "BlobType", - "modelAsString": false - } - }, - "x-ms-content-crc64": { - "x-ms-client-name": "ContentCrc64", - "type": "string", - "format": "byte", - "description": "If the request is to read a specified range and the x-ms-range-get-content-crc64 is set to true, then the request returns a crc64 for the range, as long as the range size is less than or equal to 4 MB. If both x-ms-range-get-content-crc64 & x-ms-range-get-content-md5 is specified in the same request, it will fail with 400(Bad Request)" - }, - "x-ms-copy-completion-time": { - "x-ms-client-name": "CopyCompletionTime", - "type": "string", - "format": "date-time-rfc1123", - "description": "Conclusion time of the last attempted Copy Blob operation where this blob was the destination blob. This value can specify the time of a completed, aborted, or failed copy attempt. This header does not appear if a copy is pending, if this blob has never been the destination in a Copy Blob operation, or if this blob has been modified after a concluded Copy Blob operation using Set Blob Properties, Put Blob, or Put Block List." - }, - "x-ms-copy-status-description": { - "x-ms-client-name": "CopyStatusDescription", - "type": "string", - "description": "Only appears when x-ms-copy-status is failed or pending. Describes the cause of the last fatal or non-fatal copy operation failure. This header does not appear if this blob has never been the destination in a Copy Blob operation, or if this blob has been modified after a concluded Copy Blob operation using Set Blob Properties, Put Blob, or Put Block List" - }, - "x-ms-copy-id": { - "x-ms-client-name": "CopyId", - "type": "string", - "description": "String identifier for this copy operation. Use with Get Blob Properties to check the status of this copy operation, or pass to Abort Copy Blob to abort a pending copy." - }, - "x-ms-copy-progress": { - "x-ms-client-name": "CopyProgress", - "type": "string", - "description": "Contains the number of bytes copied and the total bytes in the source in the last attempted Copy Blob operation where this blob was the destination blob. Can show between 0 and Content-Length bytes copied. This header does not appear if this blob has never been the destination in a Copy Blob operation, or if this blob has been modified after a concluded Copy Blob operation using Set Blob Properties, Put Blob, or Put Block List" - }, - "x-ms-copy-source": { - "x-ms-client-name": "CopySource", - "type": "string", - "description": "URL up to 2 KB in length that specifies the source blob or file used in the last attempted Copy Blob operation where this blob was the destination blob. This header does not appear if this blob has never been the destination in a Copy Blob operation, or if this blob has been modified after a concluded Copy Blob operation using Set Blob Properties, Put Blob, or Put Block List." - }, - "x-ms-copy-status": { - "x-ms-client-name": "CopyStatus", - "description": "State of the copy operation identified by x-ms-copy-id.", - "type": "string", - "enum": [ - "pending", - "success", - "aborted", - "failed" - ], - "x-ms-enum": { - "name": "CopyStatusType", - "modelAsString": false - } - }, - "x-ms-lease-duration": { - "x-ms-client-name": "LeaseDuration", - "description": "When a blob is leased, specifies whether the lease is of infinite or fixed duration.", - "type": "string", - "enum": [ - "infinite", - "fixed" - ], - "x-ms-enum": { - "name": "LeaseDurationType", - "modelAsString": false - } - }, - "x-ms-lease-state": { - "x-ms-client-name": "LeaseState", - "description": "Lease state of the blob.", - "type": "string", - "enum": [ - "available", - "leased", - "expired", - "breaking", - "broken" - ], - "x-ms-enum": { - "name": "LeaseStateType", - "modelAsString": false - } - }, - "x-ms-lease-status": { - "x-ms-client-name": "LeaseStatus", - "description": "The current lease status of the blob.", - "type": "string", - "enum": [ - "locked", - "unlocked" - ], - "x-ms-enum": { - "name": "LeaseStatusType", - "modelAsString": false - } - }, - "x-ms-client-request-id": { - "x-ms-client-name": "ClientRequestId", - "type": "string", - "description": "If a client request id header is sent in the request, this header will be present in the response with the same value." - }, - "x-ms-request-id": { - "x-ms-client-name": "RequestId", - "type": "string", - "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." - }, - "x-ms-version": { - "x-ms-client-name": "Version", - "type": "string", - "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." - }, - "Accept-Ranges": { - "type": "string", - "description": "Indicates that the service supports requests for partial blob content." - }, - "Date": { - "type": "string", - "format": "date-time-rfc1123", - "description": "UTC date/time value generated by the service that indicates the time at which the response was initiated" - }, - "x-ms-blob-committed-block-count": { - "x-ms-client-name": "BlobCommittedBlockCount", - "type": "integer", - "description": "The number of committed blocks present in the blob. This header is returned only for append blobs." - }, - "x-ms-server-encrypted": { - "x-ms-client-name": "IsServerEncrypted", - "type": "boolean", - "description": "The value of this header is set to true if the blob data and application metadata are completely encrypted using the specified algorithm. Otherwise, the value is set to false (when the blob is unencrypted, or if only parts of the blob/application metadata are encrypted)." - }, - "x-ms-encryption-key-sha256": { - "x-ms-client-name": "EncryptionKeySha256", - "type": "string", - "description": "The SHA-256 hash of the encryption key used to encrypt the blob. This header is only returned when the blob was encrypted with a customer-provided key." - }, - "x-ms-blob-content-md5": { - "x-ms-client-name": "BlobContentMD5", - "type": "string", - "format": "byte", - "description": "If the blob has a MD5 hash, and if request contains range header (Range or x-ms-range), this response header is returned with the value of the whole blob's MD5 value. This value may or may not be equal to the value returned in Content-MD5 header, with the latter calculated from the requested range" - } - }, - "schema": { - "type": "object", - "format": "file" - } - }, - "default": { - "description": "Failure", - "headers": { - "x-ms-error-code": { - "x-ms-client-name": "ErrorCode", - "type": "string" - } - }, - "schema": { - "$ref": "#/definitions/StorageError" - } - } - } - }, - "head": { - "tags": [ - "blob" - ], - "operationId": "Blob_GetProperties", - "description": "The Get Properties operation returns all user-defined metadata, standard HTTP properties, and system properties for the blob. It does not return the content of the blob.", - "parameters": [ - { - "$ref": "#/parameters/Snapshot" - }, - { - "$ref": "#/parameters/Timeout" - }, - { - "$ref": "#/parameters/LeaseIdOptional" - }, - { - "$ref": "#/parameters/EncryptionKey" - }, - { - "$ref": "#/parameters/EncryptionKeySha256" - }, - { - "$ref": "#/parameters/EncryptionAlgorithm" - }, - { - "$ref": "#/parameters/IfModifiedSince" - }, - { - "$ref": "#/parameters/IfUnmodifiedSince" - }, - { - "$ref": "#/parameters/IfMatch" - }, - { - "$ref": "#/parameters/IfNoneMatch" - }, - { - "$ref": "#/parameters/ApiVersionParameter" - }, - { - "$ref": "#/parameters/ClientRequestId" - } - ], - "responses": { - "200": { - "description": "Returns the properties of the blob.", - "headers": { - "Last-Modified": { - "type": "string", - "format": "date-time-rfc1123", - "description": "Returns the date and time the blob was last modified. Any operation that modifies the blob, including an update of the blob's metadata or properties, changes the last-modified time of the blob." - }, - "x-ms-creation-time": { - "x-ms-client-name": "CreationTime", - "type": "string", - "format": "date-time-rfc1123", - "description": "Returns the date and time the blob was created." - }, - "x-ms-meta": { - "type": "string", - "x-ms-client-name": "Metadata", - "x-ms-header-collection-prefix": "x-ms-meta-" - }, - "x-ms-blob-type": { - "x-ms-client-name": "BlobType", - "description": "The blob's type.", - "type": "string", - "enum": [ - "BlockBlob", - "PageBlob", - "AppendBlob" - ], - "x-ms-enum": { - "name": "BlobType", - "modelAsString": false - } - }, - "x-ms-copy-completion-time": { - "x-ms-client-name": "CopyCompletionTime", - "type": "string", - "format": "date-time-rfc1123", - "description": "Conclusion time of the last attempted Copy Blob operation where this blob was the destination blob. This value can specify the time of a completed, aborted, or failed copy attempt. This header does not appear if a copy is pending, if this blob has never been the destination in a Copy Blob operation, or if this blob has been modified after a concluded Copy Blob operation using Set Blob Properties, Put Blob, or Put Block List." - }, - "x-ms-copy-status-description": { - "x-ms-client-name": "CopyStatusDescription", - "type": "string", - "description": "Only appears when x-ms-copy-status is failed or pending. Describes the cause of the last fatal or non-fatal copy operation failure. This header does not appear if this blob has never been the destination in a Copy Blob operation, or if this blob has been modified after a concluded Copy Blob operation using Set Blob Properties, Put Blob, or Put Block List" - }, - "x-ms-copy-id": { - "x-ms-client-name": "CopyId", - "type": "string", - "description": "String identifier for this copy operation. Use with Get Blob Properties to check the status of this copy operation, or pass to Abort Copy Blob to abort a pending copy." - }, - "x-ms-copy-progress": { - "x-ms-client-name": "CopyProgress", - "type": "string", - "description": "Contains the number of bytes copied and the total bytes in the source in the last attempted Copy Blob operation where this blob was the destination blob. Can show between 0 and Content-Length bytes copied. This header does not appear if this blob has never been the destination in a Copy Blob operation, or if this blob has been modified after a concluded Copy Blob operation using Set Blob Properties, Put Blob, or Put Block List" - }, - "x-ms-copy-source": { - "x-ms-client-name": "CopySource", - "type": "string", - "description": "URL up to 2 KB in length that specifies the source blob or file used in the last attempted Copy Blob operation where this blob was the destination blob. This header does not appear if this blob has never been the destination in a Copy Blob operation, or if this blob has been modified after a concluded Copy Blob operation using Set Blob Properties, Put Blob, or Put Block List." - }, - "x-ms-copy-status": { - "x-ms-client-name": "CopyStatus", - "description": "State of the copy operation identified by x-ms-copy-id.", - "type": "string", - "enum": [ - "pending", - "success", - "aborted", - "failed" - ], - "x-ms-enum": { - "name": "CopyStatusType", - "modelAsString": false - } - }, - "x-ms-incremental-copy": { - "x-ms-client-name": "IsIncrementalCopy", - "type": "boolean", - "description": "Included if the blob is incremental copy blob." - }, - "x-ms-copy-destination-snapshot": { - "x-ms-client-name": "DestinationSnapshot", - "type": "string", - "description": "Included if the blob is incremental copy blob or incremental copy snapshot, if x-ms-copy-status is success. Snapshot time of the last successful incremental copy snapshot for this blob." - }, - "x-ms-lease-duration": { - "x-ms-client-name": "LeaseDuration", - "description": "When a blob is leased, specifies whether the lease is of infinite or fixed duration.", - "type": "string", - "enum": [ - "infinite", - "fixed" - ], - "x-ms-enum": { - "name": "LeaseDurationType", - "modelAsString": false - } - }, - "x-ms-lease-state": { - "x-ms-client-name": "LeaseState", - "description": "Lease state of the blob.", - "type": "string", - "enum": [ - "available", - "leased", - "expired", - "breaking", - "broken" - ], - "x-ms-enum": { - "name": "LeaseStateType", - "modelAsString": false - } - }, - "x-ms-lease-status": { - "x-ms-client-name": "LeaseStatus", - "description": "The current lease status of the blob.", - "type": "string", - "enum": [ - "locked", - "unlocked" - ], - "x-ms-enum": { - "name": "LeaseStatusType", - "modelAsString": false - } - }, - "Content-Length": { - "type": "integer", - "format": "int64", - "description": "The number of bytes present in the response body." - }, - "Content-Type": { - "type": "string", - "description": "The content type specified for the blob. The default content type is 'application/octet-stream'" - }, - "ETag": { - "type": "string", - "format": "etag", - "description": "The ETag contains a value that you can use to perform operations conditionally. If the request version is 2011-08-18 or newer, the ETag value will be in quotes." - }, - "Content-MD5": { - "type": "string", - "format": "byte", - "description": "If the blob has an MD5 hash and this operation is to read the full blob, this response header is returned so that the client can check for message content integrity." - }, - "Content-Encoding": { - "type": "string", - "description": "This header returns the value that was specified for the Content-Encoding request header" - }, - "Content-Disposition": { - "type": "string", - "description": "This header returns the value that was specified for the 'x-ms-blob-content-disposition' header. The Content-Disposition response header field conveys additional information about how to process the response payload, and also can be used to attach additional metadata. For example, if set to attachment, it indicates that the user-agent should not display the response, but instead show a Save As dialog with a filename other than the blob name specified." - }, - "Content-Language": { - "type": "string", - "description": "This header returns the value that was specified for the Content-Language request header." - }, - "Cache-Control": { - "type": "string", - "description": "This header is returned if it was previously specified for the blob." - }, - "x-ms-blob-sequence-number": { - "x-ms-client-name": "BlobSequenceNumber", - "type": "integer", - "format": "int64", - "description": "The current sequence number for a page blob. This header is not returned for block blobs or append blobs" - }, - "x-ms-client-request-id": { - "x-ms-client-name": "ClientRequestId", - "type": "string", - "description": "If a client request id header is sent in the request, this header will be present in the response with the same value." - }, - "x-ms-request-id": { - "x-ms-client-name": "RequestId", - "type": "string", - "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." - }, - "x-ms-version": { - "x-ms-client-name": "Version", - "type": "string", - "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." - }, - "Date": { - "type": "string", - "format": "date-time-rfc1123", - "description": "UTC date/time value generated by the service that indicates the time at which the response was initiated" - }, - "Accept-Ranges": { - "type": "string", - "description": "Indicates that the service supports requests for partial blob content." - }, - "x-ms-blob-committed-block-count": { - "x-ms-client-name": "BlobCommittedBlockCount", - "type": "integer", - "description": "The number of committed blocks present in the blob. This header is returned only for append blobs." - }, - "x-ms-server-encrypted": { - "x-ms-client-name": "IsServerEncrypted", - "type": "boolean", - "description": "The value of this header is set to true if the blob data and application metadata are completely encrypted using the specified algorithm. Otherwise, the value is set to false (when the blob is unencrypted, or if only parts of the blob/application metadata are encrypted)." - }, - "x-ms-encryption-key-sha256": { - "x-ms-client-name": "EncryptionKeySha256", - "type": "string", - "description": "The SHA-256 hash of the encryption key used to encrypt the metadata. This header is only returned when the metadata was encrypted with a customer-provided key." - }, - "x-ms-access-tier": { - "x-ms-client-name": "AccessTier", - "type": "string", - "description": "The tier of page blob on a premium storage account or tier of block blob on blob storage LRS accounts. For a list of allowed premium page blob tiers, see https://docs.microsoft.com/en-us/azure/virtual-machines/windows/premium-storage#features. For blob storage LRS accounts, valid values are Hot/Cool/Archive." - }, - "x-ms-access-tier-inferred": { - "x-ms-client-name": "AccessTierInferred", - "type": "boolean", - "description": "For page blobs on a premium storage account only. If the access tier is not explicitly set on the blob, the tier is inferred based on its content length and this header will be returned with true value." - }, - "x-ms-archive-status": { - "x-ms-client-name": "ArchiveStatus", - "type": "string", - "description": "For blob storage LRS accounts, valid values are rehydrate-pending-to-hot/rehydrate-pending-to-cool. If the blob is being rehydrated and is not complete then this header is returned indicating that rehydrate is pending and also tells the destination tier." - }, - "x-ms-access-tier-change-time": { - "x-ms-client-name": "AccessTierChangeTime", - "type": "string", - "format": "date-time-rfc1123", - "description": "The time the tier was changed on the object. This is only returned if the tier on the block blob was ever set." - } - } - }, - "default": { - "description": "Failure", - "headers": { - "x-ms-error-code": { - "x-ms-client-name": "ErrorCode", - "type": "string" - } - }, - "schema": { - "$ref": "#/definitions/StorageError" - } - } - } - }, - "delete": { - "tags": [ - "blob" - ], - "operationId": "Blob_Delete", - "description": "If the storage account's soft delete feature is disabled then, when a blob is deleted, it is permanently removed from the storage account. If the storage account's soft delete feature is enabled, then, when a blob is deleted, it is marked for deletion and becomes inaccessible immediately. However, the blob service retains the blob or snapshot for the number of days specified by the DeleteRetentionPolicy section of [Storage service properties] (Set-Blob-Service-Properties.md). After the specified number of days has passed, the blob's data is permanently removed from the storage account. Note that you continue to be charged for the soft-deleted blob's storage until it is permanently removed. Use the List Blobs API and specify the \"include=deleted\" query parameter to discover which blobs and snapshots have been soft deleted. You can then use the Undelete Blob API to restore a soft-deleted blob. All other operations on a soft-deleted blob or snapshot causes the service to return an HTTP status code of 404 (ResourceNotFound).", - "parameters": [ - { - "$ref": "#/parameters/Snapshot" - }, - { - "$ref": "#/parameters/Timeout" - }, - { - "$ref": "#/parameters/LeaseIdOptional" - }, - { - "$ref": "#/parameters/DeleteSnapshots" - }, - { - "$ref": "#/parameters/IfModifiedSince" - }, - { - "$ref": "#/parameters/IfUnmodifiedSince" - }, - { - "$ref": "#/parameters/IfMatch" - }, - { - "$ref": "#/parameters/IfNoneMatch" - }, - { - "$ref": "#/parameters/ApiVersionParameter" - }, - { - "$ref": "#/parameters/ClientRequestId" - } - ], - "responses": { - "202": { - "description": "The delete request was accepted and the blob will be deleted.", - "headers": { - "x-ms-client-request-id": { - "x-ms-client-name": "ClientRequestId", - "type": "string", - "description": "If a client request id header is sent in the request, this header will be present in the response with the same value." - }, - "x-ms-request-id": { - "x-ms-client-name": "RequestId", - "type": "string", - "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." - }, - "x-ms-version": { - "x-ms-client-name": "Version", - "type": "string", - "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." - }, - "Date": { - "type": "string", - "format": "date-time-rfc1123", - "description": "UTC date/time value generated by the service that indicates the time at which the response was initiated" - } - } - }, - "default": { - "description": "Failure", - "headers": { - "x-ms-error-code": { - "x-ms-client-name": "ErrorCode", - "type": "string" - } - }, - "schema": { - "$ref": "#/definitions/StorageError" - } - } - } - } - }, - "/{filesystem}/{path}?action=setAccessControl&blob": { - "patch": { - "tags": [ - "blob" - ], - "operationId": "Blob_SetAccessControl", - "description": "Set the owner, group, permissions, or access control list for a blob.", - "parameters": [ - { - "$ref": "#/parameters/Timeout" - }, - { - "$ref": "#/parameters/LeaseIdOptional" - }, - { - "$ref": "#/parameters/Owner" - }, - { - "$ref": "#/parameters/Group" - }, - { - "$ref": "#/parameters/PosixPermissions" - }, - { - "$ref": "#/parameters/PosixAcl" - }, - { - "$ref": "#/parameters/IfMatch" - }, - { - "$ref": "#/parameters/IfNoneMatch" - }, - { - "$ref": "#/parameters/IfModifiedSince" - }, - { - "$ref": "#/parameters/IfUnmodifiedSince" - }, - { - "$ref": "#/parameters/ClientRequestId" - }, - { - "$ref": "#/parameters/ApiVersionParameter" - } - ], - "responses": { - "200": { - "description": "Set blob access control response.", - "headers": { - "Date": { - "type": "string", - "format": "date-time-rfc1123", - "description": "A UTC date/time value generated by the service that indicates the time at which the response was initiated." - }, - "ETag": { - "type": "string", - "format": "etag", - "description": "An HTTP entity tag associated with the file or directory." - }, - "Last-Modified": { - "type": "string", - "format": "date-time-rfc1123", - "description": "The data and time the file or directory was last modified. Write operations on the file or directory update the last modified time." - }, - "x-ms-request-id": { - "x-ms-client-name": "RequestId", - "type": "string", - "description": "A server-generated UUID recorded in the analytics logs for troubleshooting and correlation." - }, - "x-ms-version": { - "x-ms-client-name": "Version", - "type": "string", - "description": "The version of the REST protocol used to process the request." - } - } - }, - "default": { - "description": "Failure", - "headers": { - "x-ms-client-request-id": { - "x-ms-client-name": "ClientRequestId", - "type": "string", - "description": "If a client request id header is sent in the request, this header will be present in the response with the same value." - }, - "x-ms-request-id": { - "x-ms-client-name": "RequestId", - "type": "string", - "description": "A server-generated UUID recorded in the analytics logs for troubleshooting and correlation." - }, - "x-ms-version": { - "x-ms-client-name": "Version", - "type": "string", - "description": "The version of the REST protocol used to process the request." - } - }, - "schema": { - "$ref": "#/definitions/DataLakeStorageError" - } - } - } - }, - "parameters": [ - { - "name": "action", - "in": "query", - "required": true, - "type": "string", - "enum": [ - "setAccessControl" - ] - } - ] - }, - "/{filesystem}/{path}?action=getAccessControl&blob": { - "head": { - "tags": [ - "blob" - ], - "operationId": "Blob_GetAccessControl", - "description": "Get the owner, group, permissions, or access control list for a blob.", - "parameters": [ - { - "$ref": "#/parameters/Timeout" - }, - { - "$ref": "#/parameters/Upn" - }, - { - "$ref": "#/parameters/LeaseIdOptional" - }, - { - "$ref": "#/parameters/IfMatch" - }, - { - "$ref": "#/parameters/IfNoneMatch" - }, - { - "$ref": "#/parameters/IfModifiedSince" - }, - { - "$ref": "#/parameters/IfUnmodifiedSince" - }, - { - "$ref": "#/parameters/ClientRequestId" - }, - { - "$ref": "#/parameters/ApiVersionParameter" - } - ], - "responses": { - "200": { - "description": "Get blob access control response.", - "headers": { - "Date": { - "type": "string", - "format": "date-time-rfc1123", - "description": "A UTC date/time value generated by the service that indicates the time at which the response was initiated." - }, - "ETag": { - "type": "string", - "format": "etag", - "description": "An HTTP entity tag associated with the file or directory." - }, - "Last-Modified": { - "type": "string", - "format": "date-time-rfc1123", - "description": "The data and time the file or directory was last modified. Write operations on the file or directory update the last modified time." - }, - "x-ms-owner": { - "description": "The owner of the file or directory. Included in the response if Hierarchical Namespace is enabled for the account.", - "type": "string" - }, - "x-ms-group": { - "description": "The owning group of the file or directory. Included in the response if Hierarchical Namespace is enabled for the account.", - "type": "string" - }, - "x-ms-permissions": { - "description": "The POSIX access permissions for the file owner, the file owning group, and others. Included in the response if Hierarchical Namespace is enabled for the account.", - "type": "string" - }, - "x-ms-acl": { - "description": "The POSIX access control list for the file or directory. Included in the response only if the action is \"getAccessControl\" and Hierarchical Namespace is enabled for the account.", - "type": "string" - }, - "x-ms-request-id": { - "x-ms-client-name": "RequestId", - "type": "string", - "description": "A server-generated UUID recorded in the analytics logs for troubleshooting and correlation." - }, - "x-ms-version": { - "x-ms-client-name": "Version", - "type": "string", - "description": "The version of the REST protocol used to process the request." - } - } - }, - "default": { - "description": "Failure", - "headers": { - "x-ms-client-request-id": { - "x-ms-client-name": "ClientRequestId", - "type": "string", - "description": "If a client request id header is sent in the request, this header will be present in the response with the same value." - }, - "x-ms-request-id": { - "x-ms-client-name": "RequestId", - "type": "string", - "description": "A server-generated UUID recorded in the analytics logs for troubleshooting and correlation." - }, - "x-ms-version": { - "x-ms-client-name": "Version", - "type": "string", - "description": "The version of the REST protocol used to process the request." - } - }, - "schema": { - "$ref": "#/definitions/DataLakeStorageError" - } - } - } - }, - "parameters": [ - { - "name": "action", - "in": "query", - "required": true, - "type": "string", - "enum": [ - "getAccessControl" - ] - } - ] - }, - "/{filesystem}/{path}?FileRename": { - "put": { - "tags": [ - "blob" - ], - "operationId": "Blob_Rename", - "description": "Rename a blob/file. By default, the destination is overwritten and if the destination already exists and has a lease the lease is broken. This operation supports conditional HTTP requests. For more information, see [Specifying Conditional Headers for Blob Service Operations](https://docs.microsoft.com/en-us/rest/api/storageservices/specifying-conditional-headers-for-blob-service-operations). To fail if the destination already exists, use a conditional request with If-None-Match: \"*\".", - "consumes": [ - "application/octet-stream" - ], - "parameters": [ - { - "$ref": "#/parameters/Timeout" - }, - { - "$ref": "#/parameters/PathRenameMode" - }, - { - "$ref": "#/parameters/FileRenameSource" - }, - { - "$ref": "#/parameters/DirectoryProperties" - }, - { - "$ref": "#/parameters/PosixPermissions" - }, - { - "$ref": "#/parameters/PosixUmask" - }, - { - "$ref": "#/parameters/XMsCacheControl" - }, - { - "$ref": "#/parameters/XMsContentType" - }, - { - "$ref": "#/parameters/XMsContentEncoding" - }, - { - "$ref": "#/parameters/XMsContentLanguage" - }, - { - "$ref": "#/parameters/XMsContentDisposition" - }, - { - "$ref": "#/parameters/LeaseIdOptional" - }, - { - "$ref": "#/parameters/SourceLeaseId" - }, - { - "$ref": "#/parameters/IfModifiedSince" - }, - { - "$ref": "#/parameters/IfUnmodifiedSince" - }, - { - "$ref": "#/parameters/IfMatch" - }, - { - "$ref": "#/parameters/IfNoneMatch" - }, - { - "$ref": "#/parameters/SourceIfModifiedSince" - }, - { - "$ref": "#/parameters/SourceIfUnmodifiedSince" - }, - { - "$ref": "#/parameters/SourceIfMatch" - }, - { - "$ref": "#/parameters/SourceIfNoneMatch" - }, - { - "$ref": "#/parameters/ApiVersionParameter" - }, - { - "$ref": "#/parameters/ClientRequestId" - } - ], - "responses": { - "201": { - "description": "The file was renamed.", - "headers": { - "ETag": { - "type": "string", - "format": "etag", - "description": "An HTTP entity tag associated with the file or directory." - }, - "Last-Modified": { - "type": "string", - "format": "date-time-rfc1123", - "description": "The data and time the file or directory was last modified. Write operations on the file or directory update the last modified time." - }, - "x-ms-client-request-id": { - "x-ms-client-name": "ClientRequestId", - "type": "string", - "description": "If a client request id header is sent in the request, this header will be present in the response with the same value." - }, - "x-ms-request-id": { - "x-ms-client-name": "RequestId", - "type": "string", - "description": "A server-generated UUID recorded in the analytics logs for troubleshooting and correlation." - }, - "x-ms-version": { - "x-ms-client-name": "Version", - "type": "string", - "description": "The version of the REST protocol used to process the request." - }, - "Content-Length": { - "type": "integer", - "format": "int64", - "description": "The size of the resource in bytes." - }, - "Date": { - "type": "string", - "format": "date-time-rfc1123", - "description": "A UTC date/time value generated by the service that indicates the time at which the response was initiated." - } - } - }, - "default": { - "description": "Failure", - "headers": { - "x-ms-client-request-id": { - "x-ms-client-name": "ClientRequestId", - "type": "string", - "description": "If a client request id header is sent in the request, this header will be present in the response with the same value." - }, - "x-ms-request-id": { - "x-ms-client-name": "RequestId", - "type": "string", - "description": "A server-generated UUID recorded in the analytics logs for troubleshooting and correlation." - }, - "x-ms-version": { - "x-ms-client-name": "Version", - "type": "string", - "description": "The version of the REST protocol used to process the request." - } - }, - "schema": { - "$ref": "#/definitions/DataLakeStorageError" - } - } - } - } - }, - "/{containerName}/{blob}?PageBlob": { - "put": { - "tags": [ - "blob" - ], - "operationId": "PageBlob_Create", - "description": "The Create operation creates a new page blob.", - "consumes": [ - "application/octet-stream" - ], - "parameters": [ - { - "$ref": "#/parameters/Timeout" - }, - { - "$ref": "#/parameters/ContentLength" - }, - { - "$ref": "#/parameters/BlobContentType" - }, - { - "$ref": "#/parameters/BlobContentEncoding" - }, - { - "$ref": "#/parameters/BlobContentLanguage" - }, - { - "$ref": "#/parameters/BlobContentMD5" - }, - { - "$ref": "#/parameters/BlobCacheControl" - }, - { - "$ref": "#/parameters/Metadata" - }, - { - "$ref": "#/parameters/LeaseIdOptional" - }, - { - "$ref": "#/parameters/BlobContentDisposition" - }, - { - "$ref": "#/parameters/EncryptionKey" - }, - { - "$ref": "#/parameters/EncryptionKeySha256" - }, - { - "$ref": "#/parameters/EncryptionAlgorithm" - }, - { - "$ref": "#/parameters/IfModifiedSince" - }, - { - "$ref": "#/parameters/IfUnmodifiedSince" - }, - { - "$ref": "#/parameters/IfMatch" - }, - { - "$ref": "#/parameters/IfNoneMatch" - }, - { - "$ref": "#/parameters/BlobContentLengthRequired" - }, - { - "$ref": "#/parameters/BlobSequenceNumber" - }, - { - "$ref": "#/parameters/PageBlobAccessTier" - }, - { - "$ref": "#/parameters/ApiVersionParameter" - }, - { - "$ref": "#/parameters/ClientRequestId" - } - ], - "responses": { - "201": { - "description": "The blob was created.", - "headers": { - "ETag": { - "type": "string", - "format": "etag", - "description": "The ETag contains a value that you can use to perform operations conditionally. If the request version is 2011-08-18 or newer, the ETag value will be in quotes." - }, - "Last-Modified": { - "type": "string", - "format": "date-time-rfc1123", - "description": "Returns the date and time the container was last modified. Any operation that modifies the blob, including an update of the blob's metadata or properties, changes the last-modified time of the blob." - }, - "Content-MD5": { - "type": "string", - "format": "byte", - "description": "If the blob has an MD5 hash and this operation is to read the full blob, this response header is returned so that the client can check for message content integrity." - }, - "x-ms-client-request-id": { - "x-ms-client-name": "ClientRequestId", - "type": "string", - "description": "If a client request id header is sent in the request, this header will be present in the response with the same value." - }, - "x-ms-request-id": { - "x-ms-client-name": "RequestId", - "type": "string", - "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." - }, - "x-ms-version": { - "x-ms-client-name": "Version", - "type": "string", - "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." - }, - "Date": { - "type": "string", - "format": "date-time-rfc1123", - "description": "UTC date/time value generated by the service that indicates the time at which the response was initiated" - }, - "x-ms-request-server-encrypted": { - "x-ms-client-name": "IsServerEncrypted", - "type": "boolean", - "description": "The value of this header is set to true if the contents of the request are successfully encrypted using the specified algorithm, and false otherwise." - }, - "x-ms-encryption-key-sha256": { - "x-ms-client-name": "EncryptionKeySha256", - "type": "string", - "description": "The SHA-256 hash of the encryption key used to encrypt the blob. This header is only returned when the blob was encrypted with a customer-provided key." - } - } - }, - "default": { - "description": "Failure", - "headers": { - "x-ms-error-code": { - "x-ms-client-name": "ErrorCode", - "type": "string" - } - }, - "schema": { - "$ref": "#/definitions/StorageError" - } - } - } - }, - "parameters": [ - { - "name": "x-ms-blob-type", - "x-ms-client-name": "blobType", - "in": "header", - "required": true, - "x-ms-parameter-location": "method", - "description": "Specifies the type of blob to create: block blob, page blob, or append blob.", - "type": "string", - "enum": [ - "PageBlob" - ], - "x-ms-enum": { - "name": "BlobType", - "modelAsString": false - } - } - ] - }, - "/{containerName}/{blob}?AppendBlob": { - "put": { - "tags": [ - "blob" - ], - "operationId": "AppendBlob_Create", - "description": "The Create Append Blob operation creates a new append blob.", - "consumes": [ - "application/octet-stream" - ], - "parameters": [ - { - "$ref": "#/parameters/Timeout" - }, - { - "$ref": "#/parameters/ContentLength" - }, - { - "$ref": "#/parameters/BlobContentType" - }, - { - "$ref": "#/parameters/BlobContentEncoding" - }, - { - "$ref": "#/parameters/BlobContentLanguage" - }, - { - "$ref": "#/parameters/BlobContentMD5" - }, - { - "$ref": "#/parameters/BlobCacheControl" - }, - { - "$ref": "#/parameters/Metadata" - }, - { - "$ref": "#/parameters/LeaseIdOptional" - }, - { - "$ref": "#/parameters/BlobContentDisposition" - }, - { - "$ref": "#/parameters/EncryptionKey" - }, - { - "$ref": "#/parameters/EncryptionKeySha256" - }, - { - "$ref": "#/parameters/EncryptionAlgorithm" - }, - { - "$ref": "#/parameters/IfModifiedSince" - }, - { - "$ref": "#/parameters/IfUnmodifiedSince" - }, - { - "$ref": "#/parameters/IfMatch" - }, - { - "$ref": "#/parameters/IfNoneMatch" - }, - { - "$ref": "#/parameters/ApiVersionParameter" - }, - { - "$ref": "#/parameters/ClientRequestId" - } - ], - "responses": { - "201": { - "description": "The blob was created.", - "headers": { - "ETag": { - "type": "string", - "format": "etag", - "description": "The ETag contains a value that you can use to perform operations conditionally. If the request version is 2011-08-18 or newer, the ETag value will be in quotes." - }, - "Last-Modified": { - "type": "string", - "format": "date-time-rfc1123", - "description": "Returns the date and time the container was last modified. Any operation that modifies the blob, including an update of the blob's metadata or properties, changes the last-modified time of the blob." - }, - "Content-MD5": { - "type": "string", - "format": "byte", - "description": "If the blob has an MD5 hash and this operation is to read the full blob, this response header is returned so that the client can check for message content integrity." - }, - "x-ms-client-request-id": { - "x-ms-client-name": "ClientRequestId", - "type": "string", - "description": "If a client request id header is sent in the request, this header will be present in the response with the same value." - }, - "x-ms-request-id": { - "x-ms-client-name": "RequestId", - "type": "string", - "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." - }, - "x-ms-version": { - "x-ms-client-name": "Version", - "type": "string", - "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." - }, - "Date": { - "type": "string", - "format": "date-time-rfc1123", - "description": "UTC date/time value generated by the service that indicates the time at which the response was initiated" - }, - "x-ms-request-server-encrypted": { - "x-ms-client-name": "IsServerEncrypted", - "type": "boolean", - "description": "The value of this header is set to true if the contents of the request are successfully encrypted using the specified algorithm, and false otherwise." - }, - "x-ms-encryption-key-sha256": { - "x-ms-client-name": "EncryptionKeySha256", - "type": "string", - "description": "The SHA-256 hash of the encryption key used to encrypt the blob. This header is only returned when the blob was encrypted with a customer-provided key." - } - } - }, - "default": { - "description": "Failure", - "headers": { - "x-ms-error-code": { - "x-ms-client-name": "ErrorCode", - "type": "string" - } - }, - "schema": { - "$ref": "#/definitions/StorageError" - } - } - } - }, - "parameters": [ - { - "name": "x-ms-blob-type", - "x-ms-client-name": "blobType", - "in": "header", - "required": true, - "x-ms-parameter-location": "method", - "description": "Specifies the type of blob to create: block blob, page blob, or append blob.", - "type": "string", - "enum": [ - "AppendBlob" - ], - "x-ms-enum": { - "name": "BlobType", - "modelAsString": false - } - } - ] - }, - "/{containerName}/{blob}?BlockBlob": { - "put": { - "tags": [ - "blob" - ], - "operationId": "BlockBlob_Upload", - "description": "The Upload Block Blob operation updates the content of an existing block blob. Updating an existing block blob overwrites any existing metadata on the blob. Partial updates are not supported with Put Blob; the content of the existing blob is overwritten with the content of the new blob. To perform a partial update of the content of a block blob, use the Put Block List operation.", - "consumes": [ - "application/octet-stream" - ], - "parameters": [ - { - "$ref": "#/parameters/Body" - }, - { - "$ref": "#/parameters/Timeout" - }, - { - "$ref": "#/parameters/ContentLength" - }, - { - "$ref": "#/parameters/BlobContentType" - }, - { - "$ref": "#/parameters/BlobContentEncoding" - }, - { - "$ref": "#/parameters/BlobContentLanguage" - }, - { - "$ref": "#/parameters/BlobContentMD5" - }, - { - "$ref": "#/parameters/BlobCacheControl" - }, - { - "$ref": "#/parameters/Metadata" - }, - { - "$ref": "#/parameters/LeaseIdOptional" - }, - { - "$ref": "#/parameters/BlobContentDisposition" - }, - { - "$ref": "#/parameters/EncryptionKey" - }, - { - "$ref": "#/parameters/EncryptionKeySha256" - }, - { - "$ref": "#/parameters/EncryptionAlgorithm" - }, - { - "$ref": "#/parameters/AccessTierOptional" - }, - { - "$ref": "#/parameters/IfModifiedSince" - }, - { - "$ref": "#/parameters/IfUnmodifiedSince" - }, - { - "$ref": "#/parameters/IfMatch" - }, - { - "$ref": "#/parameters/IfNoneMatch" - }, - { - "$ref": "#/parameters/ApiVersionParameter" - }, - { - "$ref": "#/parameters/ClientRequestId" - } - ], - "responses": { - "201": { - "description": "The blob was updated.", - "headers": { - "ETag": { - "type": "string", - "format": "etag", - "description": "The ETag contains a value that you can use to perform operations conditionally. If the request version is 2011-08-18 or newer, the ETag value will be in quotes." - }, - "Last-Modified": { - "type": "string", - "format": "date-time-rfc1123", - "description": "Returns the date and time the container was last modified. Any operation that modifies the blob, including an update of the blob's metadata or properties, changes the last-modified time of the blob." - }, - "Content-MD5": { - "type": "string", - "format": "byte", - "description": "If the blob has an MD5 hash and this operation is to read the full blob, this response header is returned so that the client can check for message content integrity." - }, - "x-ms-client-request-id": { - "x-ms-client-name": "ClientRequestId", - "type": "string", - "description": "If a client request id header is sent in the request, this header will be present in the response with the same value." - }, - "x-ms-request-id": { - "x-ms-client-name": "RequestId", - "type": "string", - "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." - }, - "x-ms-version": { - "x-ms-client-name": "Version", - "type": "string", - "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." - }, - "Date": { - "type": "string", - "format": "date-time-rfc1123", - "description": "UTC date/time value generated by the service that indicates the time at which the response was initiated" - }, - "x-ms-request-server-encrypted": { - "x-ms-client-name": "IsServerEncrypted", - "type": "boolean", - "description": "The value of this header is set to true if the contents of the request are successfully encrypted using the specified algorithm, and false otherwise." - }, - "x-ms-encryption-key-sha256": { - "x-ms-client-name": "EncryptionKeySha256", - "type": "string", - "description": "The SHA-256 hash of the encryption key used to encrypt the blob. This header is only returned when the blob was encrypted with a customer-provided key." - } - } - }, - "default": { - "description": "Failure", - "headers": { - "x-ms-error-code": { - "x-ms-client-name": "ErrorCode", - "type": "string" - } - }, - "schema": { - "$ref": "#/definitions/StorageError" - } - } - } - }, - "parameters": [ - { - "name": "x-ms-blob-type", - "x-ms-client-name": "blobType", - "in": "header", - "required": true, - "x-ms-parameter-location": "method", - "description": "Specifies the type of blob to create: block blob, page blob, or append blob.", - "type": "string", - "enum": [ - "BlockBlob" - ], - "x-ms-enum": { - "name": "BlobType", - "modelAsString": false - } - } - ] - }, - "/{containerName}/{blob}?comp=undelete": { - "put": { - "tags": [ - "blob" - ], - "operationId": "Blob_Undelete", - "description": "Undelete a blob that was previously soft deleted", - "parameters": [ - { - "$ref": "#/parameters/Timeout" - }, - { - "$ref": "#/parameters/ApiVersionParameter" - }, - { - "$ref": "#/parameters/ClientRequestId" - } - ], - "responses": { - "200": { - "description": "The blob was undeleted successfully.", - "headers": { - "x-ms-client-request-id": { - "x-ms-client-name": "ClientRequestId", - "type": "string", - "description": "If a client request id header is sent in the request, this header will be present in the response with the same value." - }, - "x-ms-request-id": { - "x-ms-client-name": "RequestId", - "type": "string", - "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." - }, - "x-ms-version": { - "x-ms-client-name": "Version", - "type": "string", - "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." - }, - "Date": { - "type": "string", - "format": "date-time-rfc1123", - "description": "UTC date/time value generated by the service that indicates the time at which the response was initiated." - } - } - }, - "default": { - "description": "Failure", - "headers": { - "x-ms-error-code": { - "x-ms-client-name": "ErrorCode", - "type": "string" - } - }, - "schema": { - "$ref": "#/definitions/StorageError" - } - } - } - }, - "parameters": [ - { - "name": "comp", - "in": "query", - "required": true, - "type": "string", - "enum": [ - "undelete" - ] - } - ] - }, - "/{containerName}/{blob}?comp=properties&SetHTTPHeaders": { - "put": { - "tags": [ - "blob" - ], - "operationId": "Blob_SetHTTPHeaders", - "description": "The Set HTTP Headers operation sets system properties on the blob", - "parameters": [ - { - "$ref": "#/parameters/Timeout" - }, - { - "$ref": "#/parameters/BlobCacheControl" - }, - { - "$ref": "#/parameters/BlobContentType" - }, - { - "$ref": "#/parameters/BlobContentMD5" - }, - { - "$ref": "#/parameters/BlobContentEncoding" - }, - { - "$ref": "#/parameters/BlobContentLanguage" - }, - { - "$ref": "#/parameters/LeaseIdOptional" - }, - { - "$ref": "#/parameters/IfModifiedSince" - }, - { - "$ref": "#/parameters/IfUnmodifiedSince" - }, - { - "$ref": "#/parameters/IfMatch" - }, - { - "$ref": "#/parameters/IfNoneMatch" - }, - { - "$ref": "#/parameters/BlobContentDisposition" - }, - { - "$ref": "#/parameters/ApiVersionParameter" - }, - { - "$ref": "#/parameters/ClientRequestId" - } - ], - "responses": { - "200": { - "description": "The properties were set successfully.", - "headers": { - "ETag": { - "type": "string", - "format": "etag", - "description": "The ETag contains a value that you can use to perform operations conditionally. If the request version is 2011-08-18 or newer, the ETag value will be in quotes." - }, - "Last-Modified": { - "type": "string", - "format": "date-time-rfc1123", - "description": "Returns the date and time the container was last modified. Any operation that modifies the blob, including an update of the blob's metadata or properties, changes the last-modified time of the blob." - }, - "x-ms-blob-sequence-number": { - "x-ms-client-name": "BlobSequenceNumber", - "type": "integer", - "format": "int64", - "description": "The current sequence number for a page blob. This header is not returned for block blobs or append blobs" - }, - "x-ms-client-request-id": { - "x-ms-client-name": "ClientRequestId", - "type": "string", - "description": "If a client request id header is sent in the request, this header will be present in the response with the same value." - }, - "x-ms-request-id": { - "x-ms-client-name": "RequestId", - "type": "string", - "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." - }, - "x-ms-version": { - "x-ms-client-name": "Version", - "type": "string", - "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." - }, - "Date": { - "type": "string", - "format": "date-time-rfc1123", - "description": "UTC date/time value generated by the service that indicates the time at which the response was initiated" - } - } - }, - "default": { - "description": "Failure", - "headers": { - "x-ms-error-code": { - "x-ms-client-name": "ErrorCode", - "type": "string" - } - }, - "schema": { - "$ref": "#/definitions/StorageError" - } - } - } - }, - "parameters": [ - { - "name": "comp", - "in": "query", - "required": true, - "type": "string", - "enum": [ - "properties" - ] - } - ] - }, - "/{containerName}/{blob}?comp=metadata": { - "put": { - "tags": [ - "blob" - ], - "operationId": "Blob_SetMetadata", - "description": "The Set Blob Metadata operation sets user-defined metadata for the specified blob as one or more name-value pairs", - "parameters": [ - { - "$ref": "#/parameters/Timeout" - }, - { - "$ref": "#/parameters/Metadata" - }, - { - "$ref": "#/parameters/LeaseIdOptional" - }, - { - "$ref": "#/parameters/EncryptionKey" - }, - { - "$ref": "#/parameters/EncryptionKeySha256" - }, - { - "$ref": "#/parameters/EncryptionAlgorithm" - }, - { - "$ref": "#/parameters/IfModifiedSince" - }, - { - "$ref": "#/parameters/IfUnmodifiedSince" - }, - { - "$ref": "#/parameters/IfMatch" - }, - { - "$ref": "#/parameters/IfNoneMatch" - }, - { - "$ref": "#/parameters/ApiVersionParameter" - }, - { - "$ref": "#/parameters/ClientRequestId" - } - ], - "responses": { - "200": { - "description": "The metadata was set successfully.", - "headers": { - "ETag": { - "type": "string", - "format": "etag", - "description": "The ETag contains a value that you can use to perform operations conditionally. If the request version is 2011-08-18 or newer, the ETag value will be in quotes." - }, - "Last-Modified": { - "type": "string", - "format": "date-time-rfc1123", - "description": "Returns the date and time the container was last modified. Any operation that modifies the blob, including an update of the blob's metadata or properties, changes the last-modified time of the blob." - }, - "x-ms-client-request-id": { - "x-ms-client-name": "ClientRequestId", - "type": "string", - "description": "If a client request id header is sent in the request, this header will be present in the response with the same value." - }, - "x-ms-request-id": { - "x-ms-client-name": "RequestId", - "type": "string", - "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." - }, - "x-ms-version": { - "x-ms-client-name": "Version", - "type": "string", - "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." - }, - "Date": { - "type": "string", - "format": "date-time-rfc1123", - "description": "UTC date/time value generated by the service that indicates the time at which the response was initiated" - }, - "x-ms-request-server-encrypted": { - "x-ms-client-name": "IsServerEncrypted", - "type": "boolean", - "description": "The value of this header is set to true if the contents of the request are successfully encrypted using the specified algorithm, and false otherwise." - }, - "x-ms-encryption-key-sha256": { - "x-ms-client-name": "EncryptionKeySha256", - "type": "string", - "description": "The SHA-256 hash of the encryption key used to encrypt the metadata. This header is only returned when the metadata was encrypted with a customer-provided key." - } - } - }, - "default": { - "description": "Failure", - "headers": { - "x-ms-error-code": { - "x-ms-client-name": "ErrorCode", - "type": "string" - } - }, - "schema": { - "$ref": "#/definitions/StorageError" - } - } - } - }, - "parameters": [ - { - "name": "comp", - "in": "query", - "required": true, - "type": "string", - "enum": [ - "metadata" - ] - } - ] - }, - "/{containerName}/{blob}?comp=lease&acquire": { - "put": { - "tags": [ - "blob" - ], - "operationId": "Blob_AcquireLease", - "description": "[Update] The Lease Blob operation establishes and manages a lock on a blob for write and delete operations", - "parameters": [ - { - "$ref": "#/parameters/Timeout" - }, - { - "$ref": "#/parameters/LeaseDuration" - }, - { - "$ref": "#/parameters/ProposedLeaseIdOptional" - }, - { - "$ref": "#/parameters/IfModifiedSince" - }, - { - "$ref": "#/parameters/IfUnmodifiedSince" - }, - { - "$ref": "#/parameters/IfMatch" - }, - { - "$ref": "#/parameters/IfNoneMatch" - }, - { - "$ref": "#/parameters/ApiVersionParameter" - }, - { - "$ref": "#/parameters/ClientRequestId" - } - ], - "responses": { - "201": { - "description": "The Acquire operation completed successfully.", - "headers": { - "ETag": { - "type": "string", - "format": "etag", - "description": "The ETag contains a value that you can use to perform operations conditionally. If the request version is 2011-08-18 or newer, the ETag value will be in quotes." - }, - "Last-Modified": { - "type": "string", - "format": "date-time-rfc1123", - "description": "Returns the date and time the blob was last modified. Any operation that modifies the blob, including an update of the blob's metadata or properties, changes the last-modified time of the blob." - }, - "x-ms-lease-id": { - "x-ms-client-name": "LeaseId", - "type": "string", - "description": "Uniquely identifies a blobs's lease" - }, - "x-ms-client-request-id": { - "x-ms-client-name": "ClientRequestId", - "type": "string", - "description": "If a client request id header is sent in the request, this header will be present in the response with the same value." - }, - "x-ms-request-id": { - "x-ms-client-name": "RequestId", - "type": "string", - "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." - }, - "x-ms-version": { - "x-ms-client-name": "Version", - "type": "string", - "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." - }, - "Date": { - "type": "string", - "format": "date-time-rfc1123", - "description": "UTC date/time value generated by the service that indicates the time at which the response was initiated" - } - } - }, - "default": { - "description": "Failure", - "headers": { - "x-ms-error-code": { - "x-ms-client-name": "ErrorCode", - "type": "string" - } - }, - "schema": { - "$ref": "#/definitions/StorageError" - } - } - } - }, - "parameters": [ - { - "name": "comp", - "in": "query", - "required": true, - "type": "string", - "enum": [ - "lease" - ] - }, - { - "name": "x-ms-lease-action", - "x-ms-client-name": "action", - "in": "header", - "required": true, - "type": "string", - "enum": [ - "acquire" - ], - "x-ms-enum": { - "name": "LeaseAction", - "modelAsString": false - }, - "x-ms-parameter-location": "method", - "description": "Describes what lease action to take." - } - ] - }, - "/{containerName}/{blob}?comp=lease&release": { - "put": { - "tags": [ - "blob" - ], - "operationId": "Blob_ReleaseLease", - "description": "[Update] The Lease Blob operation establishes and manages a lock on a blob for write and delete operations", - "parameters": [ - { - "$ref": "#/parameters/Timeout" - }, - { - "$ref": "#/parameters/LeaseIdRequired" - }, - { - "$ref": "#/parameters/IfModifiedSince" - }, - { - "$ref": "#/parameters/IfUnmodifiedSince" - }, - { - "$ref": "#/parameters/IfMatch" - }, - { - "$ref": "#/parameters/IfNoneMatch" - }, - { - "$ref": "#/parameters/ApiVersionParameter" - }, - { - "$ref": "#/parameters/ClientRequestId" - } - ], - "responses": { - "200": { - "description": "The Release operation completed successfully.", - "headers": { - "ETag": { - "type": "string", - "format": "etag", - "description": "The ETag contains a value that you can use to perform operations conditionally. If the request version is 2011-08-18 or newer, the ETag value will be in quotes." - }, - "Last-Modified": { - "type": "string", - "format": "date-time-rfc1123", - "description": "Returns the date and time the blob was last modified. Any operation that modifies the blob, including an update of the blob's metadata or properties, changes the last-modified time of the blob." - }, - "x-ms-client-request-id": { - "x-ms-client-name": "ClientRequestId", - "type": "string", - "description": "If a client request id header is sent in the request, this header will be present in the response with the same value." - }, - "x-ms-request-id": { - "x-ms-client-name": "RequestId", - "type": "string", - "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." - }, - "x-ms-version": { - "x-ms-client-name": "Version", - "type": "string", - "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." - }, - "Date": { - "type": "string", - "format": "date-time-rfc1123", - "description": "UTC date/time value generated by the service that indicates the time at which the response was initiated" - } - } - }, - "default": { - "description": "Failure", - "headers": { - "x-ms-error-code": { - "x-ms-client-name": "ErrorCode", - "type": "string" - } - }, - "schema": { - "$ref": "#/definitions/StorageError" - } - } - } - }, - "parameters": [ - { - "name": "comp", - "in": "query", - "required": true, - "type": "string", - "enum": [ - "lease" - ] - }, - { - "name": "x-ms-lease-action", - "x-ms-client-name": "action", - "in": "header", - "required": true, - "type": "string", - "enum": [ - "release" - ], - "x-ms-enum": { - "name": "LeaseAction", - "modelAsString": false - }, - "x-ms-parameter-location": "method", - "description": "Describes what lease action to take." - } - ] - }, - "/{containerName}/{blob}?comp=lease&renew": { - "put": { - "tags": [ - "blob" - ], - "operationId": "Blob_RenewLease", - "description": "[Update] The Lease Blob operation establishes and manages a lock on a blob for write and delete operations", - "parameters": [ - { - "$ref": "#/parameters/Timeout" - }, - { - "$ref": "#/parameters/LeaseIdRequired" - }, - { - "$ref": "#/parameters/IfModifiedSince" - }, - { - "$ref": "#/parameters/IfUnmodifiedSince" - }, - { - "$ref": "#/parameters/IfMatch" - }, - { - "$ref": "#/parameters/IfNoneMatch" - }, - { - "$ref": "#/parameters/ApiVersionParameter" - }, - { - "$ref": "#/parameters/ClientRequestId" - } - ], - "responses": { - "200": { - "description": "The Renew operation completed successfully.", - "headers": { - "ETag": { - "type": "string", - "format": "etag", - "description": "The ETag contains a value that you can use to perform operations conditionally. If the request version is 2011-08-18 or newer, the ETag value will be in quotes." - }, - "Last-Modified": { - "type": "string", - "format": "date-time-rfc1123", - "description": "Returns the date and time the blob was last modified. Any operation that modifies the blob, including an update of the blob's metadata or properties, changes the last-modified time of the blob." - }, - "x-ms-lease-id": { - "x-ms-client-name": "LeaseId", - "type": "string", - "description": "Uniquely identifies a blobs's lease" - }, - "x-ms-client-request-id": { - "x-ms-client-name": "ClientRequestId", - "type": "string", - "description": "If a client request id header is sent in the request, this header will be present in the response with the same value." - }, - "x-ms-request-id": { - "x-ms-client-name": "RequestId", - "type": "string", - "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." - }, - "x-ms-version": { - "x-ms-client-name": "Version", - "type": "string", - "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." - }, - "Date": { - "type": "string", - "format": "date-time-rfc1123", - "description": "UTC date/time value generated by the service that indicates the time at which the response was initiated" - } - } - }, - "default": { - "description": "Failure", - "headers": { - "x-ms-error-code": { - "x-ms-client-name": "ErrorCode", - "type": "string" - } - }, - "schema": { - "$ref": "#/definitions/StorageError" - } - } - } - }, - "parameters": [ - { - "name": "comp", - "in": "query", - "required": true, - "type": "string", - "enum": [ - "lease" - ] - }, - { - "name": "x-ms-lease-action", - "x-ms-client-name": "action", - "in": "header", - "required": true, - "type": "string", - "enum": [ - "renew" - ], - "x-ms-enum": { - "name": "LeaseAction", - "modelAsString": false - }, - "x-ms-parameter-location": "method", - "description": "Describes what lease action to take." - } - ] - }, - "/{containerName}/{blob}?comp=lease&change": { - "put": { - "tags": [ - "blob" - ], - "operationId": "Blob_ChangeLease", - "description": "[Update] The Lease Blob operation establishes and manages a lock on a blob for write and delete operations", - "parameters": [ - { - "$ref": "#/parameters/Timeout" - }, - { - "$ref": "#/parameters/LeaseIdRequired" - }, - { - "$ref": "#/parameters/ProposedLeaseIdRequired" - }, - { - "$ref": "#/parameters/IfModifiedSince" - }, - { - "$ref": "#/parameters/IfUnmodifiedSince" - }, - { - "$ref": "#/parameters/IfMatch" - }, - { - "$ref": "#/parameters/IfNoneMatch" - }, - { - "$ref": "#/parameters/ApiVersionParameter" - }, - { - "$ref": "#/parameters/ClientRequestId" - } - ], - "responses": { - "200": { - "description": "The Change operation completed successfully.", - "headers": { - "ETag": { - "type": "string", - "format": "etag", - "description": "The ETag contains a value that you can use to perform operations conditionally. If the request version is 2011-08-18 or newer, the ETag value will be in quotes." - }, - "Last-Modified": { - "type": "string", - "format": "date-time-rfc1123", - "description": "Returns the date and time the blob was last modified. Any operation that modifies the blob, including an update of the blob's metadata or properties, changes the last-modified time of the blob." - }, - "x-ms-client-request-id": { - "x-ms-client-name": "ClientRequestId", - "type": "string", - "description": "If a client request id header is sent in the request, this header will be present in the response with the same value." - }, - "x-ms-request-id": { - "x-ms-client-name": "RequestId", - "type": "string", - "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." - }, - "x-ms-lease-id": { - "x-ms-client-name": "LeaseId", - "type": "string", - "description": "Uniquely identifies a blobs's lease" - }, - "x-ms-version": { - "x-ms-client-name": "Version", - "type": "string", - "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." - }, - "Date": { - "type": "string", - "format": "date-time-rfc1123", - "description": "UTC date/time value generated by the service that indicates the time at which the response was initiated" - } - } - }, - "default": { - "description": "Failure", - "headers": { - "x-ms-error-code": { - "x-ms-client-name": "ErrorCode", - "type": "string" - } - }, - "schema": { - "$ref": "#/definitions/StorageError" - } - } - } - }, - "parameters": [ - { - "name": "comp", - "in": "query", - "required": true, - "type": "string", - "enum": [ - "lease" - ] - }, - { - "name": "x-ms-lease-action", - "x-ms-client-name": "action", - "in": "header", - "required": true, - "type": "string", - "enum": [ - "change" - ], - "x-ms-enum": { - "name": "LeaseAction", - "modelAsString": false - }, - "x-ms-parameter-location": "method", - "description": "Describes what lease action to take." - } - ] - }, - "/{containerName}/{blob}?comp=lease&break": { - "put": { - "tags": [ - "blob" - ], - "operationId": "Blob_BreakLease", - "description": "[Update] The Lease Blob operation establishes and manages a lock on a blob for write and delete operations", - "parameters": [ - { - "$ref": "#/parameters/Timeout" - }, - { - "$ref": "#/parameters/LeaseBreakPeriod" - }, - { - "$ref": "#/parameters/IfModifiedSince" - }, - { - "$ref": "#/parameters/IfUnmodifiedSince" - }, - { - "$ref": "#/parameters/IfMatch" - }, - { - "$ref": "#/parameters/IfNoneMatch" - }, - { - "$ref": "#/parameters/ApiVersionParameter" - }, - { - "$ref": "#/parameters/ClientRequestId" - } - ], - "responses": { - "202": { - "description": "The Break operation completed successfully.", - "headers": { - "ETag": { - "type": "string", - "format": "etag", - "description": "The ETag contains a value that you can use to perform operations conditionally. If the request version is 2011-08-18 or newer, the ETag value will be in quotes." - }, - "Last-Modified": { - "type": "string", - "format": "date-time-rfc1123", - "description": "Returns the date and time the blob was last modified. Any operation that modifies the blob, including an update of the blob's metadata or properties, changes the last-modified time of the blob." - }, - "x-ms-lease-time": { - "x-ms-client-name": "LeaseTime", - "type": "integer", - "description": "Approximate time remaining in the lease period, in seconds." - }, - "x-ms-client-request-id": { - "x-ms-client-name": "ClientRequestId", - "type": "string", - "description": "If a client request id header is sent in the request, this header will be present in the response with the same value." - }, - "x-ms-request-id": { - "x-ms-client-name": "RequestId", - "type": "string", - "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." - }, - "x-ms-version": { - "x-ms-client-name": "Version", - "type": "string", - "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." - }, - "Date": { - "type": "string", - "format": "date-time-rfc1123", - "description": "UTC date/time value generated by the service that indicates the time at which the response was initiated" - } - } - }, - "default": { - "description": "Failure", - "headers": { - "x-ms-error-code": { - "x-ms-client-name": "ErrorCode", - "type": "string" - } - }, - "schema": { - "$ref": "#/definitions/StorageError" - } - } - } - }, - "parameters": [ - { - "name": "comp", - "in": "query", - "required": true, - "type": "string", - "enum": [ - "lease" - ] - }, - { - "name": "x-ms-lease-action", - "x-ms-client-name": "action", - "in": "header", - "required": true, - "type": "string", - "enum": [ - "break" - ], - "x-ms-enum": { - "name": "LeaseAction", - "modelAsString": false - }, - "x-ms-parameter-location": "method", - "description": "Describes what lease action to take." - } - ] - }, - "/{containerName}/{blob}?comp=snapshot": { - "put": { - "tags": [ - "blob" - ], - "operationId": "Blob_CreateSnapshot", - "description": "The Create Snapshot operation creates a read-only snapshot of a blob", - "parameters": [ - { - "$ref": "#/parameters/Timeout" - }, - { - "$ref": "#/parameters/Metadata" - }, - { - "$ref": "#/parameters/EncryptionKey" - }, - { - "$ref": "#/parameters/EncryptionKeySha256" - }, - { - "$ref": "#/parameters/EncryptionAlgorithm" - }, - { - "$ref": "#/parameters/IfModifiedSince" - }, - { - "$ref": "#/parameters/IfUnmodifiedSince" - }, - { - "$ref": "#/parameters/IfMatch" - }, - { - "$ref": "#/parameters/IfNoneMatch" - }, - { - "$ref": "#/parameters/LeaseIdOptional" - }, - { - "$ref": "#/parameters/ApiVersionParameter" - }, - { - "$ref": "#/parameters/ClientRequestId" - } - ], - "responses": { - "201": { - "description": "The snaptshot was taken successfully.", - "headers": { - "x-ms-snapshot": { - "x-ms-client-name": "Snapshot", - "type": "string", - "description": "Uniquely identifies the snapshot and indicates the snapshot version. It may be used in subsequent requests to access the snapshot" - }, - "ETag": { - "type": "string", - "format": "etag", - "description": "The ETag contains a value that you can use to perform operations conditionally. If the request version is 2011-08-18 or newer, the ETag value will be in quotes." - }, - "Last-Modified": { - "type": "string", - "format": "date-time-rfc1123", - "description": "Returns the date and time the container was last modified. Any operation that modifies the blob, including an update of the blob's metadata or properties, changes the last-modified time of the blob." - }, - "x-ms-client-request-id": { - "x-ms-client-name": "ClientRequestId", - "type": "string", - "description": "If a client request id header is sent in the request, this header will be present in the response with the same value." - }, - "x-ms-request-id": { - "x-ms-client-name": "RequestId", - "type": "string", - "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." - }, - "x-ms-version": { - "x-ms-client-name": "Version", - "type": "string", - "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." - }, - "Date": { - "type": "string", - "format": "date-time-rfc1123", - "description": "UTC date/time value generated by the service that indicates the time at which the response was initiated" - }, - "x-ms-request-server-encrypted": { - "x-ms-client-name": "IsServerEncrypted", - "type": "boolean", - "description": "True if the contents of the request are successfully encrypted using the specified algorithm, and false otherwise. For a snapshot request, this header is set to true when metadata was provided in the request and encrypted with a customer-provided key." - } - } - }, - "default": { - "description": "Failure", - "headers": { - "x-ms-error-code": { - "x-ms-client-name": "ErrorCode", - "type": "string" - } - }, - "schema": { - "$ref": "#/definitions/StorageError" - } - } - } - }, - "parameters": [ - { - "name": "comp", - "in": "query", - "required": true, - "type": "string", - "enum": [ - "snapshot" - ] - } - ] - }, - "/{containerName}/{blob}?comp=copy": { - "put": { - "tags": [ - "blob" - ], - "operationId": "Blob_StartCopyFromURL", - "description": "The Start Copy From URL operation copies a blob or an internet resource to a new blob.", - "parameters": [ - { - "$ref": "#/parameters/Timeout" - }, - { - "$ref": "#/parameters/Metadata" - }, - { - "$ref": "#/parameters/AccessTierOptional" - }, - { - "$ref": "#/parameters/RehydratePriority" - }, - { - "$ref": "#/parameters/SourceIfModifiedSince" - }, - { - "$ref": "#/parameters/SourceIfUnmodifiedSince" - }, - { - "$ref": "#/parameters/SourceIfMatch" - }, - { - "$ref": "#/parameters/SourceIfNoneMatch" - }, - { - "$ref": "#/parameters/IfModifiedSince" - }, - { - "$ref": "#/parameters/IfUnmodifiedSince" - }, - { - "$ref": "#/parameters/IfMatch" - }, - { - "$ref": "#/parameters/IfNoneMatch" - }, - { - "$ref": "#/parameters/CopySource" - }, - { - "$ref": "#/parameters/LeaseIdOptional" - }, - { - "$ref": "#/parameters/ApiVersionParameter" - }, - { - "$ref": "#/parameters/ClientRequestId" - } - ], - "responses": { - "202": { - "description": "The copy blob has been accepted with the specified copy status.", - "headers": { - "ETag": { - "type": "string", - "format": "etag", - "description": "The ETag contains a value that you can use to perform operations conditionally. If the request version is 2011-08-18 or newer, the ETag value will be in quotes." - }, - "Last-Modified": { - "type": "string", - "format": "date-time-rfc1123", - "description": "Returns the date and time the container was last modified. Any operation that modifies the blob, including an update of the blob's metadata or properties, changes the last-modified time of the blob." - }, - "x-ms-client-request-id": { - "x-ms-client-name": "ClientRequestId", - "type": "string", - "description": "If a client request id header is sent in the request, this header will be present in the response with the same value." - }, - "x-ms-request-id": { - "x-ms-client-name": "RequestId", - "type": "string", - "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." - }, - "x-ms-version": { - "x-ms-client-name": "Version", - "type": "string", - "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." - }, - "Date": { - "type": "string", - "format": "date-time-rfc1123", - "description": "UTC date/time value generated by the service that indicates the time at which the response was initiated" - }, - "x-ms-copy-id": { - "x-ms-client-name": "CopyId", - "type": "string", - "description": "String identifier for this copy operation. Use with Get Blob Properties to check the status of this copy operation, or pass to Abort Copy Blob to abort a pending copy." - }, - "x-ms-copy-status": { - "x-ms-client-name": "CopyStatus", - "description": "State of the copy operation identified by x-ms-copy-id.", - "type": "string", - "enum": [ - "pending", - "success", - "aborted", - "failed" - ], - "x-ms-enum": { - "name": "CopyStatusType", - "modelAsString": false - } - } - } - }, - "default": { - "description": "Failure", - "headers": { - "x-ms-error-code": { - "x-ms-client-name": "ErrorCode", - "type": "string" - } - }, - "schema": { - "$ref": "#/definitions/StorageError" - } - } - } - }, - "parameters": [] - }, - "/{containerName}/{blob}?comp=copy&sync": { - "put": { - "tags": [ - "blob" - ], - "operationId": "Blob_CopyFromURL", - "description": "The Copy From URL operation copies a blob or an internet resource to a new blob. It will not return a response until the copy is complete.", - "parameters": [ - { - "$ref": "#/parameters/Timeout" - }, - { - "$ref": "#/parameters/Metadata" - }, - { - "$ref": "#/parameters/AccessTierOptional" - }, - { - "$ref": "#/parameters/SourceIfModifiedSince" - }, - { - "$ref": "#/parameters/SourceIfUnmodifiedSince" - }, - { - "$ref": "#/parameters/SourceIfMatch" - }, - { - "$ref": "#/parameters/SourceIfNoneMatch" - }, - { - "$ref": "#/parameters/IfModifiedSince" - }, - { - "$ref": "#/parameters/IfUnmodifiedSince" - }, - { - "$ref": "#/parameters/IfMatch" - }, - { - "$ref": "#/parameters/IfNoneMatch" - }, - { - "$ref": "#/parameters/CopySource" - }, - { - "$ref": "#/parameters/LeaseIdOptional" - }, - { - "$ref": "#/parameters/ApiVersionParameter" - }, - { - "$ref": "#/parameters/ClientRequestId" - } - ], - "responses": { - "202": { - "description": "The copy has completed.", - "headers": { - "ETag": { - "type": "string", - "format": "etag", - "description": "The ETag contains a value that you can use to perform operations conditionally. If the request version is 2011-08-18 or newer, the ETag value will be in quotes." - }, - "Last-Modified": { - "type": "string", - "format": "date-time-rfc1123", - "description": "Returns the date and time the container was last modified. Any operation that modifies the blob, including an update of the blob's metadata or properties, changes the last-modified time of the blob." - }, - "x-ms-client-request-id": { - "x-ms-client-name": "ClientRequestId", - "type": "string", - "description": "If a client request id header is sent in the request, this header will be present in the response with the same value." - }, - "x-ms-request-id": { - "x-ms-client-name": "RequestId", - "type": "string", - "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." - }, - "x-ms-version": { - "x-ms-client-name": "Version", - "type": "string", - "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." - }, - "Date": { - "type": "string", - "format": "date-time-rfc1123", - "description": "UTC date/time value generated by the service that indicates the time at which the response was initiated" - }, - "x-ms-copy-id": { - "x-ms-client-name": "CopyId", - "type": "string", - "description": "String identifier for this copy operation." - }, - "x-ms-copy-status": { - "x-ms-client-name": "CopyStatus", - "description": "State of the copy operation identified by x-ms-copy-id.", - "type": "string", - "enum": [ - "success" - ], - "x-ms-enum": { - "name": "SyncCopyStatusType", - "modelAsString": false - } - } - } - }, - "default": { - "description": "Failure", - "headers": { - "x-ms-error-code": { - "x-ms-client-name": "ErrorCode", - "type": "string" - } - }, - "schema": { - "$ref": "#/definitions/StorageError" - } - } - } - }, - "parameters": [ - { - "name": "x-ms-requires-sync", - "in": "header", - "required": true, - "type": "string", - "enum": [ - "true" - ] - } - ] - }, - "/{containerName}/{blob}?comp=copy©id={CopyId}": { - "put": { - "tags": [ - "blob" - ], - "operationId": "Blob_AbortCopyFromURL", - "description": "The Abort Copy From URL operation aborts a pending Copy From URL operation, and leaves a destination blob with zero length and full metadata.", - "parameters": [ - { - "$ref": "#/parameters/CopyId" - }, - { - "$ref": "#/parameters/Timeout" - }, - { - "$ref": "#/parameters/LeaseIdOptional" - }, - { - "$ref": "#/parameters/ApiVersionParameter" - }, - { - "$ref": "#/parameters/ClientRequestId" - } - ], - "responses": { - "204": { - "description": "The delete request was accepted and the blob will be deleted.", - "headers": { - "x-ms-client-request-id": { - "x-ms-client-name": "ClientRequestId", - "type": "string", - "description": "If a client request id header is sent in the request, this header will be present in the response with the same value." - }, - "x-ms-request-id": { - "x-ms-client-name": "RequestId", - "type": "string", - "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." - }, - "x-ms-version": { - "x-ms-client-name": "Version", - "type": "string", - "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." - }, - "Date": { - "type": "string", - "format": "date-time-rfc1123", - "description": "UTC date/time value generated by the service that indicates the time at which the response was initiated" - } - } - }, - "default": { - "description": "Failure", - "headers": { - "x-ms-error-code": { - "x-ms-client-name": "ErrorCode", - "type": "string" - } - }, - "schema": { - "$ref": "#/definitions/StorageError" - } - } - } - }, - "parameters": [ - { - "name": "comp", - "in": "query", - "required": true, - "type": "string", - "enum": [ - "copy" - ] - }, - { - "name": "x-ms-copy-action", - "x-ms-client-name": "copyActionAbortConstant", - "in": "header", - "required": true, - "type": "string", - "enum": [ - "abort" - ], - "x-ms-parameter-location": "method" - } - ] - }, - "/{containerName}/{blob}?comp=tier": { - "put": { - "tags": [ - "blobs" - ], - "operationId": "Blob_SetTier", - "description": "The Set Tier operation sets the tier on a blob. The operation is allowed on a page blob in a premium storage account and on a block blob in a blob storage account (locally redundant storage only). A premium page blob's tier determines the allowed size, IOPS, and bandwidth of the blob. A block blob's tier determines Hot/Cool/Archive storage type. This operation does not update the blob's ETag.", - "parameters": [ - { - "$ref": "#/parameters/Timeout" - }, - { - "$ref": "#/parameters/AccessTierRequired" - }, - { - "$ref": "#/parameters/RehydratePriority" - }, - { - "$ref": "#/parameters/ApiVersionParameter" - }, - { - "$ref": "#/parameters/ClientRequestId" - }, - { - "$ref": "#/parameters/LeaseIdOptional" - } - ], - "responses": { - "200": { - "description": "The new tier will take effect immediately.", - "headers": { - "x-ms-client-request-id": { - "x-ms-client-name": "ClientRequestId", - "type": "string", - "description": "If a client request id header is sent in the request, this header will be present in the response with the same value." - }, - "x-ms-request-id": { - "x-ms-client-name": "RequestId", - "type": "string", - "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." - }, - "x-ms-version": { - "x-ms-client-name": "Version", - "type": "string", - "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and newer." - } - } - }, - "202": { - "description": "The transition to the new tier is pending.", - "headers": { - "x-ms-client-request-id": { - "x-ms-client-name": "ClientRequestId", - "type": "string", - "description": "If a client request id header is sent in the request, this header will be present in the response with the same value." - }, - "x-ms-request-id": { - "x-ms-client-name": "RequestId", - "type": "string", - "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." - }, - "x-ms-version": { - "x-ms-client-name": "Version", - "type": "string", - "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and newer." - } - } - }, - "default": { - "description": "Failure", - "headers": { - "x-ms-error-code": { - "x-ms-client-name": "ErrorCode", - "type": "string" - } - }, - "schema": { - "$ref": "#/definitions/StorageError" - } - } - } - }, - "parameters": [ - { - "name": "comp", - "in": "query", - "required": true, - "type": "string", - "enum": [ - "tier" - ] - } - ] - }, - "/{containerName}/{blob}?restype=account&comp=properties": { - "get": { - "tags": [ - "blob" - ], - "operationId": "Blob_GetAccountInfo", - "description": "Returns the sku name and account kind ", - "parameters": [ - { - "$ref": "#/parameters/ApiVersionParameter" - } - ], - "responses": { - "200": { - "description": "Success (OK)", - "headers": { - "x-ms-client-request-id": { - "x-ms-client-name": "ClientRequestId", - "type": "string", - "description": "If a client request id header is sent in the request, this header will be present in the response with the same value." - }, - "x-ms-request-id": { - "x-ms-client-name": "RequestId", - "type": "string", - "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." - }, - "x-ms-version": { - "x-ms-client-name": "Version", - "type": "string", - "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." - }, - "Date": { - "type": "string", - "format": "date-time-rfc1123", - "description": "UTC date/time value generated by the service that indicates the time at which the response was initiated" - }, - "x-ms-sku-name": { - "x-ms-client-name": "SkuName", - "type": "string", - "enum": [ - "Standard_LRS", - "Standard_GRS", - "Standard_RAGRS", - "Standard_ZRS", - "Premium_LRS" - ], - "x-ms-enum": { - "name": "SkuName", - "modelAsString": false - }, - "description": "Identifies the sku name of the account" - }, - "x-ms-account-kind": { - "x-ms-client-name": "AccountKind", - "type": "string", - "enum": [ - "Storage", - "BlobStorage", - "StorageV2" - ], - "x-ms-enum": { - "name": "AccountKind", - "modelAsString": false - }, - "description": "Identifies the account kind" - } - } - }, - "default": { - "description": "Failure", - "headers": { - "x-ms-error-code": { - "x-ms-client-name": "ErrorCode", - "type": "string" - } - }, - "schema": { - "$ref": "#/definitions/StorageError" - } - } - } - }, - "head": { - "tags": [ - "blob" - ], - "operationId": "Blob_GetAccountInfoWithHead", - "description": "Returns the sku name and account kind ", - "parameters": [ - { - "$ref": "#/parameters/ApiVersionParameter" - } - ], - "responses": { - "200": { - "description": "Success (OK)", - "headers": { - "x-ms-client-request-id": { - "x-ms-client-name": "ClientRequestId", - "type": "string", - "description": "If a client request id header is sent in the request, this header will be present in the response with the same value." - }, - "x-ms-request-id": { - "x-ms-client-name": "RequestId", - "type": "string", - "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." - }, - "x-ms-version": { - "x-ms-client-name": "Version", - "type": "string", - "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." - }, - "Date": { - "type": "string", - "format": "date-time-rfc1123", - "description": "UTC date/time value generated by the service that indicates the time at which the response was initiated" - }, - "x-ms-sku-name": { - "x-ms-client-name": "SkuName", - "type": "string", - "enum": [ - "Standard_LRS", - "Standard_GRS", - "Standard_RAGRS", - "Standard_ZRS", - "Premium_LRS" - ], - "x-ms-enum": { - "name": "SkuName", - "modelAsString": false - }, - "description": "Identifies the sku name of the account" - }, - "x-ms-account-kind": { - "x-ms-client-name": "AccountKind", - "type": "string", - "enum": [ - "Storage", - "BlobStorage", - "StorageV2" - ], - "x-ms-enum": { - "name": "AccountKind", - "modelAsString": false - }, - "description": "Identifies the account kind" - } - } - }, - "default": { - "description": "Failure", - "headers": { - "x-ms-error-code": { - "x-ms-client-name": "ErrorCode", - "type": "string" - } - }, - "schema": { - "$ref": "#/definitions/StorageError" - } - } - } - }, - "parameters": [ - { - "name": "restype", - "in": "query", - "required": true, - "type": "string", - "enum": [ - "account" - ] - }, - { - "name": "comp", - "in": "query", - "required": true, - "type": "string", - "enum": [ - "properties" - ] - } - ] - }, - "/{containerName}/{blob}?comp=block": { - "put": { - "tags": [ - "blockblob" - ], - "operationId": "BlockBlob_StageBlock", - "description": "The Stage Block operation creates a new block to be committed as part of a blob", - "consumes": [ - "application/octet-stream" - ], - "parameters": [ - { - "$ref": "#/parameters/BlockId" - }, - { - "$ref": "#/parameters/ContentLength" - }, - { - "$ref": "#/parameters/ContentCrc64" - }, - { - "$ref": "#/parameters/Body" - }, - { - "$ref": "#/parameters/Timeout" - }, - { - "$ref": "#/parameters/LeaseIdOptional" - }, - { - "$ref": "#/parameters/EncryptionKey" - }, - { - "$ref": "#/parameters/EncryptionKeySha256" - }, - { - "$ref": "#/parameters/EncryptionAlgorithm" - }, - { - "$ref": "#/parameters/ApiVersionParameter" - }, - { - "$ref": "#/parameters/ClientRequestId" - } - ], - "responses": { - "201": { - "description": "The block was created.", - "headers": { - "Content-MD5": { - "type": "string", - "format": "byte", - "description": "This header is returned so that the client can check for message content integrity. The value of this header is computed by the Blob service; it is not necessarily the same value specified in the request headers." - }, - "x-ms-client-request-id": { - "x-ms-client-name": "ClientRequestId", - "type": "string", - "description": "If a client request id header is sent in the request, this header will be present in the response with the same value." - }, - "x-ms-request-id": { - "x-ms-client-name": "RequestId", - "type": "string", - "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." - }, - "x-ms-version": { - "x-ms-client-name": "Version", - "type": "string", - "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." - }, - "Date": { - "type": "string", - "format": "date-time-rfc1123", - "description": "UTC date/time value generated by the service that indicates the time at which the response was initiated" - }, - "x-ms-content-crc64": { - "type": "string", - "format": "byte", - "description": "This header is returned so that the client can check for message content integrity. The value of this header is computed by the Blob service; it is not necessarily the same value specified in the request headers." - }, - "x-ms-request-server-encrypted": { - "x-ms-client-name": "IsServerEncrypted", - "type": "boolean", - "description": "The value of this header is set to true if the contents of the request are successfully encrypted using the specified algorithm, and false otherwise." - }, - "x-ms-encryption-key-sha256": { - "x-ms-client-name": "EncryptionKeySha256", - "type": "string", - "description": "The SHA-256 hash of the encryption key used to encrypt the block. This header is only returned when the block was encrypted with a customer-provided key." - } - } - }, - "default": { - "description": "Failure", - "headers": { - "x-ms-error-code": { - "x-ms-client-name": "ErrorCode", - "type": "string" - } - }, - "schema": { - "$ref": "#/definitions/StorageError" - } - } - } - }, - "parameters": [ - { - "name": "comp", - "in": "query", - "required": true, - "type": "string", - "enum": [ - "block" - ] - } - ] - }, - "/{containerName}/{blob}?comp=block&fromURL": { - "put": { - "tags": [ - "blockblob" - ], - "operationId": "BlockBlob_StageBlockFromURL", - "description": "The Stage Block operation creates a new block to be committed as part of a blob where the contents are read from a URL.", - "parameters": [ - { - "$ref": "#/parameters/BlockId" - }, - { - "$ref": "#/parameters/ContentLength" - }, - { - "$ref": "#/parameters/SourceUrl" - }, - { - "$ref": "#/parameters/SourceRange" - }, - { - "$ref": "#/parameters/SourceContentMD5" - }, - { - "$ref": "#/parameters/SourceContentCRC64" - }, - { - "$ref": "#/parameters/Timeout" - }, - { - "$ref": "#/parameters/EncryptionKey" - }, - { - "$ref": "#/parameters/EncryptionKeySha256" - }, - { - "$ref": "#/parameters/EncryptionAlgorithm" - }, - { - "$ref": "#/parameters/LeaseIdOptional" - }, - { - "$ref": "#/parameters/SourceIfModifiedSince" - }, - { - "$ref": "#/parameters/SourceIfUnmodifiedSince" - }, - { - "$ref": "#/parameters/SourceIfMatch" - }, - { - "$ref": "#/parameters/SourceIfNoneMatch" - }, - { - "$ref": "#/parameters/ApiVersionParameter" - }, - { - "$ref": "#/parameters/ClientRequestId" - } - ], - "responses": { - "201": { - "description": "The block was created.", - "headers": { - "Content-MD5": { - "type": "string", - "format": "byte", - "description": "This header is returned so that the client can check for message content integrity. The value of this header is computed by the Blob service; it is not necessarily the same value specified in the request headers." - }, - "x-ms-content-crc64": { - "type": "string", - "format": "byte", - "description": "This header is returned so that the client can check for message content integrity. The value of this header is computed by the Blob service; it is not necessarily the same value specified in the request headers." - }, - "x-ms-client-request-id": { - "x-ms-client-name": "ClientRequestId", - "type": "string", - "description": "If a client request id header is sent in the request, this header will be present in the response with the same value." - }, - "x-ms-request-id": { - "x-ms-client-name": "RequestId", - "type": "string", - "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." - }, - "x-ms-version": { - "x-ms-client-name": "Version", - "type": "string", - "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." - }, - "Date": { - "type": "string", - "format": "date-time-rfc1123", - "description": "UTC date/time value generated by the service that indicates the time at which the response was initiated" - }, - "x-ms-request-server-encrypted": { - "x-ms-client-name": "IsServerEncrypted", - "type": "boolean", - "description": "The value of this header is set to true if the contents of the request are successfully encrypted using the specified algorithm, and false otherwise." - }, - "x-ms-encryption-key-sha256": { - "x-ms-client-name": "EncryptionKeySha256", - "type": "string", - "description": "The SHA-256 hash of the encryption key used to encrypt the block. This header is only returned when the block was encrypted with a customer-provided key." - } - } - }, - "default": { - "description": "Failure", - "headers": { - "x-ms-error-code": { - "x-ms-client-name": "ErrorCode", - "type": "string" - } - }, - "schema": { - "$ref": "#/definitions/StorageError" - } - } - } - }, - "parameters": [ - { - "name": "comp", - "in": "query", - "required": true, - "type": "string", - "enum": [ - "block" - ] - } - ] - }, - "/{containerName}/{blob}?comp=blocklist": { - "put": { - "tags": [ - "blockblob" - ], - "operationId": "BlockBlob_CommitBlockList", - "description": "The Commit Block List operation writes a blob by specifying the list of block IDs that make up the blob. In order to be written as part of a blob, a block must have been successfully written to the server in a prior Put Block operation. You can call Put Block List to update a blob by uploading only those blocks that have changed, then committing the new and existing blocks together. You can do this by specifying whether to commit a block from the committed block list or from the uncommitted block list, or to commit the most recently uploaded version of the block, whichever list it may belong to.", - "parameters": [ - { - "$ref": "#/parameters/Timeout" - }, - { - "$ref": "#/parameters/BlobCacheControl" - }, - { - "$ref": "#/parameters/BlobContentType" - }, - { - "$ref": "#/parameters/BlobContentEncoding" - }, - { - "$ref": "#/parameters/BlobContentLanguage" - }, - { - "$ref": "#/parameters/BlobContentMD5" - }, - { - "$ref": "#/parameters/ContentCrc64" - }, - { - "$ref": "#/parameters/Metadata" - }, - { - "$ref": "#/parameters/LeaseIdOptional" - }, - { - "$ref": "#/parameters/BlobContentDisposition" - }, - { - "$ref": "#/parameters/EncryptionKey" - }, - { - "$ref": "#/parameters/EncryptionKeySha256" - }, - { - "$ref": "#/parameters/EncryptionAlgorithm" - }, - { - "$ref": "#/parameters/AccessTierOptional" - }, - { - "$ref": "#/parameters/IfModifiedSince" - }, - { - "$ref": "#/parameters/IfUnmodifiedSince" - }, - { - "$ref": "#/parameters/IfMatch" - }, - { - "$ref": "#/parameters/IfNoneMatch" - }, - { - "name": "blocks", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/BlockLookupList" - } - }, - { - "$ref": "#/parameters/ApiVersionParameter" - }, - { - "$ref": "#/parameters/ClientRequestId" - } - ], - "responses": { - "201": { - "description": "The block list was recorded.", - "headers": { - "ETag": { - "type": "string", - "format": "etag", - "description": "The ETag contains a value that you can use to perform operations conditionally. If the request version is 2011-08-18 or newer, the ETag value will be in quotes." - }, - "Last-Modified": { - "type": "string", - "format": "date-time-rfc1123", - "description": "Returns the date and time the container was last modified. Any operation that modifies the blob, including an update of the blob's metadata or properties, changes the last-modified time of the blob." - }, - "Content-MD5": { - "type": "string", - "format": "byte", - "description": "This header is returned so that the client can check for message content integrity. This header refers to the content of the request, meaning, in this case, the list of blocks, and not the content of the blob itself." - }, - "x-ms-content-crc64": { - "type": "string", - "format": "byte", - "description": "This header is returned so that the client can check for message content integrity. This header refers to the content of the request, meaning, in this case, the list of blocks, and not the content of the blob itself." - }, - "x-ms-client-request-id": { - "x-ms-client-name": "ClientRequestId", - "type": "string", - "description": "If a client request id header is sent in the request, this header will be present in the response with the same value." - }, - "x-ms-request-id": { - "x-ms-client-name": "RequestId", - "type": "string", - "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." - }, - "x-ms-version": { - "x-ms-client-name": "Version", - "type": "string", - "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." - }, - "Date": { - "type": "string", - "format": "date-time-rfc1123", - "description": "UTC date/time value generated by the service that indicates the time at which the response was initiated" - }, - "x-ms-request-server-encrypted": { - "x-ms-client-name": "IsServerEncrypted", - "type": "boolean", - "description": "The value of this header is set to true if the contents of the request are successfully encrypted using the specified algorithm, and false otherwise." - }, - "x-ms-encryption-key-sha256": { - "x-ms-client-name": "EncryptionKeySha256", - "type": "string", - "description": "The SHA-256 hash of the encryption key used to encrypt the blob. This header is only returned when the blob was encrypted with a customer-provided key." - } - } - }, - "default": { - "description": "Failure", - "headers": { - "x-ms-error-code": { - "x-ms-client-name": "ErrorCode", - "type": "string" - } - }, - "schema": { - "$ref": "#/definitions/StorageError" - } - } - } - }, - "get": { - "tags": [ - "blockblob" - ], - "operationId": "BlockBlob_GetBlockList", - "description": "The Get Block List operation retrieves the list of blocks that have been uploaded as part of a block blob", - "parameters": [ - { - "$ref": "#/parameters/Snapshot" - }, - { - "$ref": "#/parameters/BlockListType" - }, - { - "$ref": "#/parameters/Timeout" - }, - { - "$ref": "#/parameters/LeaseIdOptional" - }, - { - "$ref": "#/parameters/ApiVersionParameter" - }, - { - "$ref": "#/parameters/ClientRequestId" - } - ], - "responses": { - "200": { - "description": "The page range was written.", - "headers": { - "Last-Modified": { - "type": "string", - "format": "date-time-rfc1123", - "description": "Returns the date and time the container was last modified. Any operation that modifies the blob, including an update of the blob's metadata or properties, changes the last-modified time of the blob." - }, - "ETag": { - "type": "string", - "format": "etag", - "description": "The ETag contains a value that you can use to perform operations conditionally. If the request version is 2011-08-18 or newer, the ETag value will be in quotes." - }, - "Content-Type": { - "type": "string", - "description": "The media type of the body of the response. For Get Block List this is 'application/xml'" - }, - "x-ms-blob-content-length": { - "x-ms-client-name": "BlobContentLength", - "type": "integer", - "format": "int64", - "description": "The size of the blob in bytes." - }, - "x-ms-client-request-id": { - "x-ms-client-name": "ClientRequestId", - "type": "string", - "description": "If a client request id header is sent in the request, this header will be present in the response with the same value." - }, - "x-ms-request-id": { - "x-ms-client-name": "RequestId", - "type": "string", - "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." - }, - "x-ms-version": { - "x-ms-client-name": "Version", - "type": "string", - "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." - }, - "Date": { - "type": "string", - "format": "date-time-rfc1123", - "description": "UTC date/time value generated by the service that indicates the time at which the response was initiated" - } - }, - "schema": { - "$ref": "#/definitions/BlockList" - } - }, - "default": { - "description": "Failure", - "headers": { - "x-ms-error-code": { - "x-ms-client-name": "ErrorCode", - "type": "string" - } - }, - "schema": { - "$ref": "#/definitions/StorageError" - } - } - } - }, - "parameters": [ - { - "name": "comp", - "in": "query", - "required": true, - "type": "string", - "enum": [ - "blocklist" - ] - } - ] - }, - "/{containerName}/{blob}?comp=page&update": { - "put": { - "tags": [ - "pageblob" - ], - "operationId": "PageBlob_UploadPages", - "description": "The Upload Pages operation writes a range of pages to a page blob", - "consumes": [ - "application/octet-stream" - ], - "parameters": [ - { - "$ref": "#/parameters/Body" - }, - { - "$ref": "#/parameters/ContentLength" - }, - { - "$ref": "#/parameters/ContentCrc64" - }, - { - "$ref": "#/parameters/Timeout" - }, - { - "$ref": "#/parameters/Range" - }, - { - "$ref": "#/parameters/LeaseIdOptional" - }, - { - "$ref": "#/parameters/EncryptionKey" - }, - { - "$ref": "#/parameters/EncryptionKeySha256" - }, - { - "$ref": "#/parameters/EncryptionAlgorithm" - }, - { - "$ref": "#/parameters/IfSequenceNumberLessThanOrEqualTo" - }, - { - "$ref": "#/parameters/IfSequenceNumberLessThan" - }, - { - "$ref": "#/parameters/IfSequenceNumberEqualTo" - }, - { - "$ref": "#/parameters/IfModifiedSince" - }, - { - "$ref": "#/parameters/IfUnmodifiedSince" - }, - { - "$ref": "#/parameters/IfMatch" - }, - { - "$ref": "#/parameters/IfNoneMatch" - }, - { - "$ref": "#/parameters/ApiVersionParameter" - }, - { - "$ref": "#/parameters/ClientRequestId" - } - ], - "responses": { - "201": { - "description": "The page range was written.", - "headers": { - "ETag": { - "type": "string", - "format": "etag", - "description": "The ETag contains a value that you can use to perform operations conditionally. If the request version is 2011-08-18 or newer, the ETag value will be in quotes." - }, - "Last-Modified": { - "type": "string", - "format": "date-time-rfc1123", - "description": "Returns the date and time the container was last modified. Any operation that modifies the blob, including an update of the blob's metadata or properties, changes the last-modified time of the blob." - }, - "Content-MD5": { - "type": "string", - "format": "byte", - "description": "If the blob has an MD5 hash and this operation is to read the full blob, this response header is returned so that the client can check for message content integrity." - }, - "x-ms-content-crc64": { - "type": "string", - "format": "byte", - "description": "This header is returned so that the client can check for message content integrity. The value of this header is computed by the Blob service; it is not necessarily the same value specified in the request headers." - }, - "x-ms-blob-sequence-number": { - "x-ms-client-name": "BlobSequenceNumber", - "type": "integer", - "format": "int64", - "description": "The current sequence number for the page blob." - }, - "x-ms-client-request-id": { - "x-ms-client-name": "ClientRequestId", - "type": "string", - "description": "If a client request id header is sent in the request, this header will be present in the response with the same value." - }, - "x-ms-request-id": { - "x-ms-client-name": "RequestId", - "type": "string", - "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." - }, - "x-ms-version": { - "x-ms-client-name": "Version", - "type": "string", - "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." - }, - "Date": { - "type": "string", - "format": "date-time-rfc1123", - "description": "UTC date/time value generated by the service that indicates the time at which the response was initiated" - }, - "x-ms-request-server-encrypted": { - "x-ms-client-name": "IsServerEncrypted", - "type": "boolean", - "description": "The value of this header is set to true if the contents of the request are successfully encrypted using the specified algorithm, and false otherwise." - }, - "x-ms-encryption-key-sha256": { - "x-ms-client-name": "EncryptionKeySha256", - "type": "string", - "description": "The SHA-256 hash of the encryption key used to encrypt the pages. This header is only returned when the pages were encrypted with a customer-provided key." - } - } - }, - "default": { - "description": "Failure", - "headers": { - "x-ms-error-code": { - "x-ms-client-name": "ErrorCode", - "type": "string" - } - }, - "schema": { - "$ref": "#/definitions/StorageError" - } - } - } - }, - "parameters": [ - { - "name": "comp", - "in": "query", - "required": true, - "type": "string", - "enum": [ - "page" - ] - }, - { - "name": "x-ms-page-write", - "x-ms-client-name": "pageWrite", - "in": "header", - "required": true, - "x-ms-parameter-location": "method", - "description": "Required. You may specify one of the following options:\n - Update: Writes the bytes specified by the request body into the specified range. The Range and Content-Length headers must match to perform the update.\n - Clear: Clears the specified range and releases the space used in storage for that range. To clear a range, set the Content-Length header to zero, and the Range header to a value that indicates the range to clear, up to maximum blob size.", - "type": "string", - "enum": [ - "update" - ], - "x-ms-enum": { - "name": "PageWriteType", - "modelAsString": false - } - } - ] - }, - "/{containerName}/{blob}?comp=page&clear": { - "put": { - "tags": [ - "pageblob" - ], - "operationId": "PageBlob_ClearPages", - "description": "The Clear Pages operation clears a set of pages from a page blob", - "consumes": [ - "application/octet-stream" - ], - "parameters": [ - { - "$ref": "#/parameters/ContentLength" - }, - { - "$ref": "#/parameters/Timeout" - }, - { - "$ref": "#/parameters/Range" - }, - { - "$ref": "#/parameters/LeaseIdOptional" - }, - { - "$ref": "#/parameters/EncryptionKey" - }, - { - "$ref": "#/parameters/EncryptionKeySha256" - }, - { - "$ref": "#/parameters/EncryptionAlgorithm" - }, - { - "$ref": "#/parameters/IfSequenceNumberLessThanOrEqualTo" - }, - { - "$ref": "#/parameters/IfSequenceNumberLessThan" - }, - { - "$ref": "#/parameters/IfSequenceNumberEqualTo" - }, - { - "$ref": "#/parameters/IfModifiedSince" - }, - { - "$ref": "#/parameters/IfUnmodifiedSince" - }, - { - "$ref": "#/parameters/IfMatch" - }, - { - "$ref": "#/parameters/IfNoneMatch" - }, - { - "$ref": "#/parameters/ApiVersionParameter" - }, - { - "$ref": "#/parameters/ClientRequestId" - } - ], - "responses": { - "201": { - "description": "The page range was cleared.", - "headers": { - "ETag": { - "type": "string", - "format": "etag", - "description": "The ETag contains a value that you can use to perform operations conditionally. If the request version is 2011-08-18 or newer, the ETag value will be in quotes." - }, - "Last-Modified": { - "type": "string", - "format": "date-time-rfc1123", - "description": "Returns the date and time the container was last modified. Any operation that modifies the blob, including an update of the blob's metadata or properties, changes the last-modified time of the blob." - }, - "Content-MD5": { - "type": "string", - "format": "byte", - "description": "If the blob has an MD5 hash and this operation is to read the full blob, this response header is returned so that the client can check for message content integrity." - }, - "x-ms-content-crc64": { - "type": "string", - "format": "byte", - "description": "This header is returned so that the client can check for message content integrity. The value of this header is computed by the Blob service; it is not necessarily the same value specified in the request headers." - }, - "x-ms-blob-sequence-number": { - "x-ms-client-name": "BlobSequenceNumber", - "type": "integer", - "format": "int64", - "description": "The current sequence number for the page blob." - }, - "x-ms-client-request-id": { - "x-ms-client-name": "ClientRequestId", - "type": "string", - "description": "If a client request id header is sent in the request, this header will be present in the response with the same value." - }, - "x-ms-request-id": { - "x-ms-client-name": "RequestId", - "type": "string", - "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." - }, - "x-ms-version": { - "x-ms-client-name": "Version", - "type": "string", - "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." - }, - "Date": { - "type": "string", - "format": "date-time-rfc1123", - "description": "UTC date/time value generated by the service that indicates the time at which the response was initiated" - } - } - }, - "default": { - "description": "Failure", - "headers": { - "x-ms-error-code": { - "x-ms-client-name": "ErrorCode", - "type": "string" - } - }, - "schema": { - "$ref": "#/definitions/StorageError" - } - } - } - }, - "parameters": [ - { - "name": "comp", - "in": "query", - "required": true, - "type": "string", - "enum": [ - "page" - ] - }, - { - "name": "x-ms-page-write", - "x-ms-client-name": "pageWrite", - "in": "header", - "required": true, - "x-ms-parameter-location": "method", - "description": "Required. You may specify one of the following options:\n - Update: Writes the bytes specified by the request body into the specified range. The Range and Content-Length headers must match to perform the update.\n - Clear: Clears the specified range and releases the space used in storage for that range. To clear a range, set the Content-Length header to zero, and the Range header to a value that indicates the range to clear, up to maximum blob size.", - "type": "string", - "enum": [ - "clear" - ], - "x-ms-enum": { - "name": "PageWriteType", - "modelAsString": false - } - } - ] - }, - "/{containerName}/{blob}?comp=page&update&fromUrl": { - "put": { - "tags": [ - "pageblob" - ], - "operationId": "PageBlob_UploadPagesFromURL", - "description": "The Upload Pages operation writes a range of pages to a page blob where the contents are read from a URL", - "consumes": [ - "application/octet-stream" - ], - "parameters": [ - { - "$ref": "#/parameters/SourceUrl" - }, - { - "$ref": "#/parameters/SourceRangeRequiredPutPageFromUrl" - }, - { - "$ref": "#/parameters/SourceContentMD5" - }, - { - "$ref": "#/parameters/SourceContentCRC64" - }, - { - "$ref": "#/parameters/ContentLength" - }, - { - "$ref": "#/parameters/Timeout" - }, - { - "$ref": "#/parameters/RangeRequiredPutPageFromUrl" - }, - { - "$ref": "#/parameters/EncryptionKey" - }, - { - "$ref": "#/parameters/EncryptionKeySha256" - }, - { - "$ref": "#/parameters/EncryptionAlgorithm" - }, - { - "$ref": "#/parameters/LeaseIdOptional" - }, - { - "$ref": "#/parameters/IfSequenceNumberLessThanOrEqualTo" - }, - { - "$ref": "#/parameters/IfSequenceNumberLessThan" - }, - { - "$ref": "#/parameters/IfSequenceNumberEqualTo" - }, - { - "$ref": "#/parameters/IfModifiedSince" - }, - { - "$ref": "#/parameters/IfUnmodifiedSince" - }, - { - "$ref": "#/parameters/IfMatch" - }, - { - "$ref": "#/parameters/IfNoneMatch" - }, - { - "$ref": "#/parameters/SourceIfModifiedSince" - }, - { - "$ref": "#/parameters/SourceIfUnmodifiedSince" - }, - { - "$ref": "#/parameters/SourceIfMatch" - }, - { - "$ref": "#/parameters/SourceIfNoneMatch" - }, - { - "$ref": "#/parameters/ApiVersionParameter" - }, - { - "$ref": "#/parameters/ClientRequestId" - } - ], - "responses": { - "201": { - "description": "The page range was written.", - "headers": { - "ETag": { - "type": "string", - "format": "etag", - "description": "The ETag contains a value that you can use to perform operations conditionally. If the request version is 2011-08-18 or newer, the ETag value will be in quotes." - }, - "Last-Modified": { - "type": "string", - "format": "date-time-rfc1123", - "description": "Returns the date and time the container was last modified. Any operation that modifies the blob, including an update of the blob's metadata or properties, changes the last-modified time of the blob." - }, - "Content-MD5": { - "type": "string", - "format": "byte", - "description": "If the blob has an MD5 hash and this operation is to read the full blob, this response header is returned so that the client can check for message content integrity." - }, - "x-ms-content-crc64": { - "type": "string", - "format": "byte", - "description": "This header is returned so that the client can check for message content integrity. The value of this header is computed by the Blob service; it is not necessarily the same value specified in the request headers." - }, - "x-ms-blob-sequence-number": { - "x-ms-client-name": "BlobSequenceNumber", - "type": "integer", - "format": "int64", - "description": "The current sequence number for the page blob." - }, - "x-ms-request-id": { - "x-ms-client-name": "RequestId", - "type": "string", - "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." - }, - "x-ms-version": { - "x-ms-client-name": "Version", - "type": "string", - "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." - }, - "Date": { - "type": "string", - "format": "date-time-rfc1123", - "description": "UTC date/time value generated by the service that indicates the time at which the response was initiated" - }, - "x-ms-request-server-encrypted": { - "x-ms-client-name": "IsServerEncrypted", - "type": "boolean", - "description": "The value of this header is set to true if the contents of the request are successfully encrypted using the specified algorithm, and false otherwise." - } - } - }, - "default": { - "description": "Failure", - "headers": { - "x-ms-error-code": { - "x-ms-client-name": "ErrorCode", - "type": "string" - } - }, - "schema": { - "$ref": "#/definitions/StorageError" - } - } - } - }, - "parameters": [ - { - "name": "comp", - "in": "query", - "required": true, - "type": "string", - "enum": [ - "page" - ] - }, - { - "name": "x-ms-page-write", - "x-ms-client-name": "pageWrite", - "in": "header", - "required": true, - "x-ms-parameter-location": "method", - "description": "Required. You may specify one of the following options:\n - Update: Writes the bytes specified by the request body into the specified range. The Range and Content-Length headers must match to perform the update.\n - Clear: Clears the specified range and releases the space used in storage for that range. To clear a range, set the Content-Length header to zero, and the Range header to a value that indicates the range to clear, up to maximum blob size.", - "type": "string", - "enum": [ - "update" - ], - "x-ms-enum": { - "name": "PageWriteType", - "modelAsString": false - } - } - ] - }, - "/{containerName}/{blob}?comp=pagelist": { - "get": { - "tags": [ - "pageblob" - ], - "operationId": "PageBlob_GetPageRanges", - "description": "The Get Page Ranges operation returns the list of valid page ranges for a page blob or snapshot of a page blob", - "parameters": [ - { - "$ref": "#/parameters/Snapshot" - }, - { - "$ref": "#/parameters/Timeout" - }, - { - "$ref": "#/parameters/Range" - }, - { - "$ref": "#/parameters/LeaseIdOptional" - }, - { - "$ref": "#/parameters/IfModifiedSince" - }, - { - "$ref": "#/parameters/IfUnmodifiedSince" - }, - { - "$ref": "#/parameters/IfMatch" - }, - { - "$ref": "#/parameters/IfNoneMatch" - }, - { - "$ref": "#/parameters/ApiVersionParameter" - }, - { - "$ref": "#/parameters/ClientRequestId" - } - ], - "responses": { - "200": { - "description": "Information on the page blob was found.", - "headers": { - "Last-Modified": { - "type": "string", - "format": "date-time-rfc1123", - "description": "Returns the date and time the container was last modified. Any operation that modifies the blob, including an update of the blob's metadata or properties, changes the last-modified time of the blob." - }, - "ETag": { - "type": "string", - "format": "etag", - "description": "The ETag contains a value that you can use to perform operations conditionally. If the request version is 2011-08-18 or newer, the ETag value will be in quotes." - }, - "x-ms-blob-content-length": { - "x-ms-client-name": "BlobContentLength", - "type": "integer", - "format": "int64", - "description": "The size of the blob in bytes." - }, - "x-ms-client-request-id": { - "x-ms-client-name": "ClientRequestId", - "type": "string", - "description": "If a client request id header is sent in the request, this header will be present in the response with the same value." - }, - "x-ms-request-id": { - "x-ms-client-name": "RequestId", - "type": "string", - "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." - }, - "x-ms-version": { - "x-ms-client-name": "Version", - "type": "string", - "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." - }, - "Date": { - "type": "string", - "format": "date-time-rfc1123", - "description": "UTC date/time value generated by the service that indicates the time at which the response was initiated" - } - }, - "schema": { - "$ref": "#/definitions/PageList" - } - }, - "default": { - "description": "Failure", - "headers": { - "x-ms-error-code": { - "x-ms-client-name": "ErrorCode", - "type": "string" - } - }, - "schema": { - "$ref": "#/definitions/StorageError" - } - } - } - }, - "parameters": [ - { - "name": "comp", - "in": "query", - "required": true, - "type": "string", - "enum": [ - "pagelist" - ] - } - ] - }, - "/{containerName}/{blob}?comp=pagelist&diff": { - "get": { - "tags": [ - "pageblob" - ], - "operationId": "PageBlob_GetPageRangesDiff", - "description": "The Get Page Ranges Diff operation returns the list of valid page ranges for a page blob that were changed between target blob and previous snapshot.", - "parameters": [ - { - "$ref": "#/parameters/Snapshot" - }, - { - "$ref": "#/parameters/Timeout" - }, - { - "$ref": "#/parameters/PrevSnapshot" - }, - { - "$ref": "#/parameters/Range" - }, - { - "$ref": "#/parameters/LeaseIdOptional" - }, - { - "$ref": "#/parameters/IfModifiedSince" - }, - { - "$ref": "#/parameters/IfUnmodifiedSince" - }, - { - "$ref": "#/parameters/IfMatch" - }, - { - "$ref": "#/parameters/IfNoneMatch" - }, - { - "$ref": "#/parameters/ApiVersionParameter" - }, - { - "$ref": "#/parameters/ClientRequestId" - } - ], - "responses": { - "200": { - "description": "Information on the page blob was found.", - "headers": { - "Last-Modified": { - "type": "string", - "format": "date-time-rfc1123", - "description": "Returns the date and time the container was last modified. Any operation that modifies the blob, including an update of the blob's metadata or properties, changes the last-modified time of the blob." - }, - "ETag": { - "type": "string", - "format": "etag", - "description": "The ETag contains a value that you can use to perform operations conditionally. If the request version is 2011-08-18 or newer, the ETag value will be in quotes." - }, - "x-ms-blob-content-length": { - "x-ms-client-name": "BlobContentLength", - "type": "integer", - "format": "int64", - "description": "The size of the blob in bytes." - }, - "x-ms-client-request-id": { - "x-ms-client-name": "ClientRequestId", - "type": "string", - "description": "If a client request id header is sent in the request, this header will be present in the response with the same value." - }, - "x-ms-request-id": { - "x-ms-client-name": "RequestId", - "type": "string", - "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." - }, - "x-ms-version": { - "x-ms-client-name": "Version", - "type": "string", - "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." - }, - "Date": { - "type": "string", - "format": "date-time-rfc1123", - "description": "UTC date/time value generated by the service that indicates the time at which the response was initiated" - } - }, - "schema": { - "$ref": "#/definitions/PageList" - } - }, - "default": { - "description": "Failure", - "headers": { - "x-ms-error-code": { - "x-ms-client-name": "ErrorCode", - "type": "string" - } - }, - "schema": { - "$ref": "#/definitions/StorageError" - } - } - } - }, - "parameters": [ - { - "name": "comp", - "in": "query", - "required": true, - "type": "string", - "enum": [ - "pagelist" - ] - } - ] - }, - "/{containerName}/{blob}?comp=properties&Resize": { - "put": { - "tags": [ - "pageblob" - ], - "operationId": "PageBlob_Resize", - "description": "Resize the Blob", - "parameters": [ - { - "$ref": "#/parameters/Timeout" - }, - { - "$ref": "#/parameters/LeaseIdOptional" - }, - { - "$ref": "#/parameters/EncryptionKey" - }, - { - "$ref": "#/parameters/EncryptionKeySha256" - }, - { - "$ref": "#/parameters/EncryptionAlgorithm" - }, - { - "$ref": "#/parameters/IfModifiedSince" - }, - { - "$ref": "#/parameters/IfUnmodifiedSince" - }, - { - "$ref": "#/parameters/IfMatch" - }, - { - "$ref": "#/parameters/IfNoneMatch" - }, - { - "$ref": "#/parameters/BlobContentLengthRequired" - }, - { - "$ref": "#/parameters/ApiVersionParameter" - }, - { - "$ref": "#/parameters/ClientRequestId" - } - ], - "responses": { - "200": { - "description": "The Blob was resized successfully", - "headers": { - "ETag": { - "type": "string", - "format": "etag", - "description": "The ETag contains a value that you can use to perform operations conditionally. If the request version is 2011-08-18 or newer, the ETag value will be in quotes." - }, - "Last-Modified": { - "type": "string", - "format": "date-time-rfc1123", - "description": "Returns the date and time the container was last modified. Any operation that modifies the blob, including an update of the blob's metadata or properties, changes the last-modified time of the blob." - }, - "x-ms-blob-sequence-number": { - "x-ms-client-name": "BlobSequenceNumber", - "type": "integer", - "format": "int64", - "description": "The current sequence number for a page blob. This header is not returned for block blobs or append blobs" - }, - "x-ms-client-request-id": { - "x-ms-client-name": "ClientRequestId", - "type": "string", - "description": "If a client request id header is sent in the request, this header will be present in the response with the same value." - }, - "x-ms-request-id": { - "x-ms-client-name": "RequestId", - "type": "string", - "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." - }, - "x-ms-version": { - "x-ms-client-name": "Version", - "type": "string", - "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." - }, - "Date": { - "type": "string", - "format": "date-time-rfc1123", - "description": "UTC date/time value generated by the service that indicates the time at which the response was initiated" - } - } - }, - "default": { - "description": "Failure", - "headers": { - "x-ms-error-code": { - "x-ms-client-name": "ErrorCode", - "type": "string" - } - }, - "schema": { - "$ref": "#/definitions/StorageError" - } - } - } - }, - "parameters": [ - { - "name": "comp", - "in": "query", - "required": true, - "type": "string", - "enum": [ - "properties" - ] - } - ] - }, - "/{containerName}/{blob}?comp=properties&UpdateSequenceNumber": { - "put": { - "tags": [ - "pageblob" - ], - "operationId": "PageBlob_UpdateSequenceNumber", - "description": "Update the sequence number of the blob", - "parameters": [ - { - "$ref": "#/parameters/Timeout" - }, - { - "$ref": "#/parameters/LeaseIdOptional" - }, - { - "$ref": "#/parameters/IfModifiedSince" - }, - { - "$ref": "#/parameters/IfUnmodifiedSince" - }, - { - "$ref": "#/parameters/IfMatch" - }, - { - "$ref": "#/parameters/IfNoneMatch" - }, - { - "$ref": "#/parameters/SequenceNumberAction" - }, - { - "$ref": "#/parameters/BlobSequenceNumber" - }, - { - "$ref": "#/parameters/ApiVersionParameter" - }, - { - "$ref": "#/parameters/ClientRequestId" - } - ], - "responses": { - "200": { - "description": "The sequence numbers were updated successfully.", - "headers": { - "ETag": { - "type": "string", - "format": "etag", - "description": "The ETag contains a value that you can use to perform operations conditionally. If the request version is 2011-08-18 or newer, the ETag value will be in quotes." - }, - "Last-Modified": { - "type": "string", - "format": "date-time-rfc1123", - "description": "Returns the date and time the container was last modified. Any operation that modifies the blob, including an update of the blob's metadata or properties, changes the last-modified time of the blob." - }, - "x-ms-blob-sequence-number": { - "x-ms-client-name": "BlobSequenceNumber", - "type": "integer", - "format": "int64", - "description": "The current sequence number for a page blob. This header is not returned for block blobs or append blobs" - }, - "x-ms-client-request-id": { - "x-ms-client-name": "ClientRequestId", - "type": "string", - "description": "If a client request id header is sent in the request, this header will be present in the response with the same value." - }, - "x-ms-request-id": { - "x-ms-client-name": "RequestId", - "type": "string", - "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." - }, - "x-ms-version": { - "x-ms-client-name": "Version", - "type": "string", - "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." - }, - "Date": { - "type": "string", - "format": "date-time-rfc1123", - "description": "UTC date/time value generated by the service that indicates the time at which the response was initiated" - } - } - }, - "default": { - "description": "Failure", - "headers": { - "x-ms-error-code": { - "x-ms-client-name": "ErrorCode", - "type": "string" - } - }, - "schema": { - "$ref": "#/definitions/StorageError" - } - } - } - }, - "parameters": [ - { - "name": "comp", - "in": "query", - "required": true, - "type": "string", - "enum": [ - "properties" - ] - } - ] - }, - "/{containerName}/{blob}?comp=incrementalcopy": { - "put": { - "tags": [ - "pageblob" - ], - "operationId": "PageBlob_CopyIncremental", - "description": "The Copy Incremental operation copies a snapshot of the source page blob to a destination page blob. The snapshot is copied such that only the differential changes between the previously copied snapshot are transferred to the destination. The copied snapshots are complete copies of the original snapshot and can be read or copied from as usual. This API is supported since REST version 2016-05-31.", - "parameters": [ - { - "$ref": "#/parameters/Timeout" - }, - { - "$ref": "#/parameters/Metadata" - }, - { - "$ref": "#/parameters/IfModifiedSince" - }, - { - "$ref": "#/parameters/IfUnmodifiedSince" - }, - { - "$ref": "#/parameters/IfMatch" - }, - { - "$ref": "#/parameters/IfNoneMatch" - }, - { - "$ref": "#/parameters/CopySource" - }, - { - "$ref": "#/parameters/ApiVersionParameter" - }, - { - "$ref": "#/parameters/ClientRequestId" - } - ], - "responses": { - "202": { - "description": "The blob was copied.", - "headers": { - "ETag": { - "type": "string", - "format": "etag", - "description": "The ETag contains a value that you can use to perform operations conditionally. If the request version is 2011-08-18 or newer, the ETag value will be in quotes." - }, - "Last-Modified": { - "type": "string", - "format": "date-time-rfc1123", - "description": "Returns the date and time the container was last modified. Any operation that modifies the blob, including an update of the blob's metadata or properties, changes the last-modified time of the blob." - }, - "x-ms-client-request-id": { - "x-ms-client-name": "ClientRequestId", - "type": "string", - "description": "If a client request id header is sent in the request, this header will be present in the response with the same value." - }, - "x-ms-request-id": { - "x-ms-client-name": "RequestId", - "type": "string", - "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." - }, - "x-ms-version": { - "x-ms-client-name": "Version", - "type": "string", - "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." - }, - "Date": { - "type": "string", - "format": "date-time-rfc1123", - "description": "UTC date/time value generated by the service that indicates the time at which the response was initiated" - }, - "x-ms-copy-id": { - "x-ms-client-name": "CopyId", - "type": "string", - "description": "String identifier for this copy operation. Use with Get Blob Properties to check the status of this copy operation, or pass to Abort Copy Blob to abort a pending copy." - }, - "x-ms-copy-status": { - "x-ms-client-name": "CopyStatus", - "description": "State of the copy operation identified by x-ms-copy-id.", - "type": "string", - "enum": [ - "pending", - "success", - "aborted", - "failed" - ], - "x-ms-enum": { - "name": "CopyStatusType", - "modelAsString": false - } - } - } - }, - "default": { - "description": "Failure", - "headers": { - "x-ms-error-code": { - "x-ms-client-name": "ErrorCode", - "type": "string" - } - }, - "schema": { - "$ref": "#/definitions/StorageError" - } - } - } - }, - "parameters": [ - { - "name": "comp", - "in": "query", - "required": true, - "type": "string", - "enum": [ - "incrementalcopy" - ] - } - ] - }, - "/{containerName}/{blob}?comp=appendblock": { - "put": { - "tags": [ - "appendblob" - ], - "operationId": "AppendBlob_AppendBlock", - "description": "The Append Block operation commits a new block of data to the end of an existing append blob. The Append Block operation is permitted only if the blob was created with x-ms-blob-type set to AppendBlob. Append Block is supported only on version 2015-02-21 version or later.", - "parameters": [ - { - "$ref": "#/parameters/Body" - }, - { - "$ref": "#/parameters/Timeout" - }, - { - "$ref": "#/parameters/ContentLength" - }, - { - "$ref": "#/parameters/ContentCrc64" - }, - { - "$ref": "#/parameters/LeaseIdOptional" - }, - { - "$ref": "#/parameters/BlobConditionMaxSize" - }, - { - "$ref": "#/parameters/BlobConditionAppendPos" - }, - { - "$ref": "#/parameters/EncryptionKey" - }, - { - "$ref": "#/parameters/EncryptionKeySha256" - }, - { - "$ref": "#/parameters/EncryptionAlgorithm" - }, - { - "$ref": "#/parameters/IfModifiedSince" - }, - { - "$ref": "#/parameters/IfUnmodifiedSince" - }, - { - "$ref": "#/parameters/IfMatch" - }, - { - "$ref": "#/parameters/IfNoneMatch" - }, - { - "$ref": "#/parameters/ApiVersionParameter" - }, - { - "$ref": "#/parameters/ClientRequestId" - } - ], - "responses": { - "201": { - "description": "The block was created.", - "headers": { - "ETag": { - "type": "string", - "format": "etag", - "description": "The ETag contains a value that you can use to perform operations conditionally. If the request version is 2011-08-18 or newer, the ETag value will be in quotes." - }, - "Last-Modified": { - "type": "string", - "format": "date-time-rfc1123", - "description": "Returns the date and time the container was last modified. Any operation that modifies the blob, including an update of the blob's metadata or properties, changes the last-modified time of the blob." - }, - "Content-MD5": { - "type": "string", - "format": "byte", - "description": "If the blob has an MD5 hash and this operation is to read the full blob, this response header is returned so that the client can check for message content integrity." - }, - "x-ms-content-crc64": { - "type": "string", - "format": "byte", - "description": "This header is returned so that the client can check for message content integrity. The value of this header is computed by the Blob service; it is not necessarily the same value specified in the request headers." - }, - "x-ms-client-request-id": { - "x-ms-client-name": "ClientRequestId", - "type": "string", - "description": "If a client request id header is sent in the request, this header will be present in the response with the same value." - }, - "x-ms-request-id": { - "x-ms-client-name": "RequestId", - "type": "string", - "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." - }, - "x-ms-version": { - "x-ms-client-name": "Version", - "type": "string", - "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." - }, - "Date": { - "type": "string", - "format": "date-time-rfc1123", - "description": "UTC date/time value generated by the service that indicates the time at which the response was initiated" - }, - "x-ms-blob-append-offset": { - "x-ms-client-name": "BlobAppendOffset", - "type": "string", - "description": "This response header is returned only for append operations. It returns the offset at which the block was committed, in bytes." - }, - "x-ms-blob-committed-block-count": { - "x-ms-client-name": "BlobCommittedBlockCount", - "type": "integer", - "description": "The number of committed blocks present in the blob. This header is returned only for append blobs." - }, - "x-ms-request-server-encrypted": { - "x-ms-client-name": "IsServerEncrypted", - "type": "boolean", - "description": "The value of this header is set to true if the contents of the request are successfully encrypted using the specified algorithm, and false otherwise." - }, - "x-ms-encryption-key-sha256": { - "x-ms-client-name": "EncryptionKeySha256", - "type": "string", - "description": "The SHA-256 hash of the encryption key used to encrypt the block. This header is only returned when the block was encrypted with a customer-provided key." - } - } - }, - "default": { - "description": "Failure", - "headers": { - "x-ms-error-code": { - "x-ms-client-name": "ErrorCode", - "type": "string" - } - }, - "schema": { - "$ref": "#/definitions/StorageError" - } - } - } - }, - "parameters": [ - { - "name": "comp", - "in": "query", - "required": true, - "type": "string", - "enum": [ - "appendblock" - ] - } - ] - }, - "/{containerName}/{blob}?comp=appendblock&fromUrl": { - "put": { - "tags": [ - "appendblob" - ], - "operationId": "AppendBlob_AppendBlockFromUrl", - "description": "The Append Block operation commits a new block of data to the end of an existing append blob where the contents are read from a source url. The Append Block operation is permitted only if the blob was created with x-ms-blob-type set to AppendBlob. Append Block is supported only on version 2015-02-21 version or later.", - "parameters": [ - { - "$ref": "#/parameters/SourceUrl" - }, - { - "$ref": "#/parameters/SourceRange" - }, - { - "$ref": "#/parameters/SourceContentMD5" - }, - { - "$ref": "#/parameters/SourceContentCRC64" - }, - { - "$ref": "#/parameters/Timeout" - }, - { - "$ref": "#/parameters/ContentLength" - }, - { - "$ref": "#/parameters/EncryptionKey" - }, - { - "$ref": "#/parameters/EncryptionKeySha256" - }, - { - "$ref": "#/parameters/EncryptionAlgorithm" - }, - { - "$ref": "#/parameters/LeaseIdOptional" - }, - { - "$ref": "#/parameters/BlobConditionMaxSize" - }, - { - "$ref": "#/parameters/BlobConditionAppendPos" - }, - { - "$ref": "#/parameters/IfModifiedSince" - }, - { - "$ref": "#/parameters/IfUnmodifiedSince" - }, - { - "$ref": "#/parameters/IfMatch" - }, - { - "$ref": "#/parameters/IfNoneMatch" - }, - { - "$ref": "#/parameters/SourceIfModifiedSince" - }, - { - "$ref": "#/parameters/SourceIfUnmodifiedSince" - }, - { - "$ref": "#/parameters/SourceIfMatch" - }, - { - "$ref": "#/parameters/SourceIfNoneMatch" - }, - { - "$ref": "#/parameters/ApiVersionParameter" - }, - { - "$ref": "#/parameters/ClientRequestId" - } - ], - "responses": { - "201": { - "description": "The block was created.", - "headers": { - "ETag": { - "type": "string", - "format": "etag", - "description": "The ETag contains a value that you can use to perform operations conditionally. If the request version is 2011-08-18 or newer, the ETag value will be in quotes." - }, - "Last-Modified": { - "type": "string", - "format": "date-time-rfc1123", - "description": "Returns the date and time the container was last modified. Any operation that modifies the blob, including an update of the blob's metadata or properties, changes the last-modified time of the blob." - }, - "Content-MD5": { - "type": "string", - "format": "byte", - "description": "If the blob has an MD5 hash and this operation is to read the full blob, this response header is returned so that the client can check for message content integrity." - }, - "x-ms-content-crc64": { - "type": "string", - "format": "byte", - "description": "This header is returned so that the client can check for message content integrity. The value of this header is computed by the Blob service; it is not necessarily the same value specified in the request headers." - }, - "x-ms-request-id": { - "x-ms-client-name": "RequestId", - "type": "string", - "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." - }, - "x-ms-version": { - "x-ms-client-name": "Version", - "type": "string", - "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." - }, - "Date": { - "type": "string", - "format": "date-time-rfc1123", - "description": "UTC date/time value generated by the service that indicates the time at which the response was initiated" - }, - "x-ms-blob-append-offset": { - "x-ms-client-name": "BlobAppendOffset", - "type": "string", - "description": "This response header is returned only for append operations. It returns the offset at which the block was committed, in bytes." - }, - "x-ms-blob-committed-block-count": { - "x-ms-client-name": "BlobCommittedBlockCount", - "type": "integer", - "description": "The number of committed blocks present in the blob. This header is returned only for append blobs." - }, - "x-ms-encryption-key-sha256": { - "x-ms-client-name": "EncryptionKeySha256", - "type": "string", - "description": "The SHA-256 hash of the encryption key used to encrypt the block. This header is only returned when the block was encrypted with a customer-provided key." - } - } - }, - "default": { - "description": "Failure", - "headers": { - "x-ms-error-code": { - "x-ms-client-name": "ErrorCode", - "type": "string" - } - }, - "schema": { - "$ref": "#/definitions/StorageError" - } - } - } - }, - "parameters": [ - { - "name": "comp", - "in": "query", - "required": true, - "type": "string", - "enum": [ - "appendblock" - ] - } - ] - } - }, - "definitions": { - "KeyInfo": { - "type": "object", - "required": [ - "Start", - "Expiry" - ], - "description": "Key information", - "properties": { - "Start": { - "description": "The date-time the key is active in ISO 8601 UTC time", - "type": "string" - }, - "Expiry": { - "description": "The date-time the key expires in ISO 8601 UTC time", - "type": "string" - } - } - }, - "UserDelegationKey": { - "type": "object", - "required": [ - "SignedOid", - "SignedTid", - "SignedStart", - "SignedExpiry", - "SignedService", - "SignedVersion", - "Value" - ], - "description": "A user delegation key", - "properties": { - "SignedOid": { - "description": "The Azure Active Directory object ID in GUID format.", - "type": "string" - }, - "SignedTid": { - "description": "The Azure Active Directory tenant ID in GUID format", - "type": "string" - }, - "SignedStart": { - "description": "The date-time the key is active", - "type": "string", - "format": "date-time" - }, - "SignedExpiry": { - "description": "The date-time the key expires", - "type": "string", - "format": "date-time" - }, - "SignedService": { - "description": "Abbreviation of the Azure Storage service that accepts the key", - "type": "string" - }, - "SignedVersion": { - "description": "The service version that created the key", - "type": "string" - }, - "Value": { - "description": "The key as a base64 string", - "type": "string" - } - } - }, - "PublicAccessType": { - "type": "string", - "enum": [ - "container", - "blob" - ], - "x-ms-enum": { - "name": "PublicAccessType", - "modelAsString": true - } - }, - "CopyStatus": { - "type": "string", - "enum": [ - "pending", - "success", - "aborted", - "failed" - ], - "x-ms-enum": { - "name": "CopyStatusType", - "modelAsString": false - } - }, - "LeaseDuration": { - "type": "string", - "enum": [ - "infinite", - "fixed" - ], - "x-ms-enum": { - "name": "LeaseDurationType", - "modelAsString": false - } - }, - "LeaseState": { - "type": "string", - "enum": [ - "available", - "leased", - "expired", - "breaking", - "broken" - ], - "x-ms-enum": { - "name": "LeaseStateType", - "modelAsString": false - } - }, - "LeaseStatus": { - "type": "string", - "enum": [ - "locked", - "unlocked" - ], - "x-ms-enum": { - "name": "LeaseStatusType", - "modelAsString": false - } - }, - "StorageError": { - "type": "object", - "properties": { - "Message": { - "type": "string" - } - } - }, - "DataLakeStorageError": { - "type": "object", - "properties": { - "error": { - "description": "The service error response object.", - "properties": { - "Code": { - "description": "The service error code.", - "type": "string" - }, - "Message": { - "description": "The service error message.", - "type": "string" - } - } - } - } - }, - "AccessPolicy": { - "type": "object", - "required": [ - "Permission" - ], - "description": "An Access policy", - "properties": { - "Start": { - "description": "the date-time the policy is active", - "type": "string", - "format": "date-time" - }, - "Expiry": { - "description": "the date-time the policy expires", - "type": "string", - "format": "date-time" - }, - "Permission": { - "description": "the permissions for the acl policy", - "type": "string" - } - } - }, - "AccessTier": { - "type": "string", - "enum": [ - "P4", - "P6", - "P10", - "P15", - "P20", - "P30", - "P40", - "P50", - "P60", - "P70", - "P80", - "Hot", - "Cool", - "Archive" - ], - "x-ms-enum": { - "name": "AccessTier", - "modelAsString": true - } - }, - "ArchiveStatus": { - "type": "string", - "enum": [ - "rehydrate-pending-to-hot", - "rehydrate-pending-to-cool" - ], - "x-ms-enum": { - "name": "ArchiveStatus", - "modelAsString": true - } - }, - "BlobItem": { - "xml": { - "name": "Blob" - }, - "description": "An Azure Storage blob", - "type": "object", - "required": [ - "Name", - "Properties" - ], - "properties": { - "Name": { - "type": "string" - }, - "Deleted": { - "type": "boolean" - }, - "Snapshot": { - "type": "string" - }, - "Properties": { - "$ref": "#/definitions/BlobProperties" - }, - "Metadata": { - "$ref": "#/definitions/BlobMetadata" - } - } - }, - "BlobProperties": { - "xml": { - "name": "Properties" - }, - "description": "Properties of a blob", - "type": "object", - "required": [ - "Etag", - "Last-Modified" - ], - "properties": { - "Creation-Time": { - "type": "string", - "format": "date-time-rfc1123" - }, - "Last-Modified": { - "type": "string", - "format": "date-time-rfc1123" - }, - "Etag": { - "type": "string", - "format": "etag" - }, - "Content-Length": { - "type": "integer", - "format": "int64", - "description": "Size in bytes" - }, - "Content-Type": { - "type": "string" - }, - "Content-Encoding": { - "type": "string" - }, - "Content-Language": { - "type": "string" - }, - "Content-MD5": { - "type": "string", - "format": "byte" - }, - "Content-Disposition": { - "type": "string" - }, - "Cache-Control": { - "type": "string" - }, - "x-ms-blob-sequence-number": { - "x-ms-client-name": "blobSequenceNumber", - "type": "integer", - "format": "int64" - }, - "BlobType": { - "type": "string", - "enum": [ - "BlockBlob", - "PageBlob", - "AppendBlob" - ], - "x-ms-enum": { - "name": "BlobType", - "modelAsString": false - } - }, - "LeaseStatus": { - "$ref": "#/definitions/LeaseStatus" - }, - "LeaseState": { - "$ref": "#/definitions/LeaseState" - }, - "LeaseDuration": { - "$ref": "#/definitions/LeaseDuration" - }, - "CopyId": { - "type": "string" - }, - "CopyStatus": { - "$ref": "#/definitions/CopyStatus" - }, - "CopySource": { - "type": "string" - }, - "CopyProgress": { - "type": "string" - }, - "CopyCompletionTime": { - "type": "string", - "format": "date-time-rfc1123" - }, - "CopyStatusDescription": { - "type": "string" - }, - "ServerEncrypted": { - "type": "boolean" - }, - "IncrementalCopy": { - "type": "boolean" - }, - "DestinationSnapshot": { - "type": "string" - }, - "DeletedTime": { - "type": "string", - "format": "date-time-rfc1123" - }, - "RemainingRetentionDays": { - "type": "integer" - }, - "AccessTier": { - "$ref": "#/definitions/AccessTier" - }, - "AccessTierInferred": { - "type": "boolean" - }, - "ArchiveStatus": { - "$ref": "#/definitions/ArchiveStatus" - }, - "CustomerProvidedKeySha256": { - "type": "string" - }, - "AccessTierChangeTime": { - "type": "string", - "format": "date-time-rfc1123" - } - } - }, - "ListBlobsFlatSegmentResponse": { - "xml": { - "name": "EnumerationResults" - }, - "description": "An enumeration of blobs", - "type": "object", - "required": [ - "ServiceEndpoint", - "ContainerName", - "Segment" - ], - "properties": { - "ServiceEndpoint": { - "type": "string", - "xml": { - "attribute": true - } - }, - "ContainerName": { - "type": "string", - "xml": { - "attribute": true - } - }, - "Prefix": { - "type": "string" - }, - "Marker": { - "type": "string" - }, - "MaxResults": { - "type": "integer" - }, - "Delimiter": { - "type": "string" - }, - "Segment": { - "$ref": "#/definitions/BlobFlatListSegment" - }, - "NextMarker": { - "type": "string" - } - } - }, - "ListBlobsHierarchySegmentResponse": { - "xml": { - "name": "EnumerationResults" - }, - "description": "An enumeration of blobs", - "type": "object", - "required": [ - "ServiceEndpoint", - "ContainerName", - "Segment" - ], - "properties": { - "ServiceEndpoint": { - "type": "string", - "xml": { - "attribute": true - } - }, - "ContainerName": { - "type": "string", - "xml": { - "attribute": true - } - }, - "Prefix": { - "type": "string" - }, - "Marker": { - "type": "string" - }, - "MaxResults": { - "type": "integer" - }, - "Delimiter": { - "type": "string" - }, - "Segment": { - "$ref": "#/definitions/BlobHierarchyListSegment" - }, - "NextMarker": { - "type": "string" - } - } - }, - "BlobFlatListSegment": { - "xml": { - "name": "Blobs" - }, - "required": [ - "BlobItems" - ], - "type": "object", - "properties": { - "BlobItems": { - "type": "array", - "items": { - "$ref": "#/definitions/BlobItem" - } - } - } - }, - "BlobHierarchyListSegment": { - "xml": { - "name": "Blobs" - }, - "type": "object", - "required": [ - "BlobItems" - ], - "properties": { - "BlobPrefixes": { - "type": "array", - "items": { - "$ref": "#/definitions/BlobPrefix" - } - }, - "BlobItems": { - "type": "array", - "items": { - "$ref": "#/definitions/BlobItem" - } - } - } - }, - "BlobPrefix": { - "type": "object", - "required": [ - "Name" - ], - "properties": { - "Name": { - "type": "string" - } - } - }, - "Block": { - "type": "object", - "required": [ - "Name", - "Size" - ], - "description": "Represents a single block in a block blob. It describes the block's ID and size.", - "properties": { - "Name": { - "description": "The base64 encoded block ID.", - "type": "string" - }, - "Size": { - "description": "The block size in bytes.", - "type": "integer" - } - } - }, - "BlockList": { - "type": "object", - "properties": { - "CommittedBlocks": { - "xml": { - "wrapped": true - }, - "type": "array", - "items": { - "$ref": "#/definitions/Block" - } - }, - "UncommittedBlocks": { - "xml": { - "wrapped": true - }, - "type": "array", - "items": { - "$ref": "#/definitions/Block" - } - } - } - }, - "BlockLookupList": { - "type": "object", - "properties": { - "Committed": { - "type": "array", - "items": { - "type": "string", - "xml": { - "name": "Committed" - } - } - }, - "Uncommitted": { - "type": "array", - "items": { - "type": "string", - "xml": { - "name": "Uncommitted" - } - } - }, - "Latest": { - "type": "array", - "items": { - "type": "string", - "xml": { - "name": "Latest" - } - } - } - }, - "xml": { - "name": "BlockList" - } - }, - "ContainerItem": { - "xml": { - "name": "Container" - }, - "type": "object", - "required": [ - "Name", - "Properties" - ], - "description": "An Azure Storage container", - "properties": { - "Name": { - "type": "string" - }, - "Properties": { - "$ref": "#/definitions/ContainerProperties" - }, - "Metadata": { - "$ref": "#/definitions/ContainerMetadata" - } - } - }, - "ContainerProperties": { - "type": "object", - "required": [ - "Last-Modified", - "Etag" - ], - "description": "Properties of a container", - "properties": { - "Last-Modified": { - "type": "string", - "format": "date-time-rfc1123" - }, - "Etag": { - "type": "string", - "format": "etag" - }, - "LeaseStatus": { - "$ref": "#/definitions/LeaseStatus" - }, - "LeaseState": { - "$ref": "#/definitions/LeaseState" - }, - "LeaseDuration": { - "$ref": "#/definitions/LeaseDuration" - }, - "PublicAccess": { - "$ref": "#/definitions/PublicAccessType" - }, - "HasImmutabilityPolicy": { - "type": "boolean" - }, - "HasLegalHold": { - "type": "boolean" - } - } - }, - "ListContainersSegmentResponse": { - "xml": { - "name": "EnumerationResults" - }, - "description": "An enumeration of containers", - "type": "object", - "required": [ - "ServiceEndpoint", - "ContainerItems" - ], - "properties": { - "ServiceEndpoint": { - "type": "string", - "xml": { - "attribute": true - } - }, - "Prefix": { - "type": "string" - }, - "Marker": { - "type": "string" - }, - "MaxResults": { - "type": "integer" - }, - "ContainerItems": { - "xml": { - "wrapped": true, - "name": "Containers" - }, - "type": "array", - "items": { - "$ref": "#/definitions/ContainerItem" - } - }, - "NextMarker": { - "type": "string" - } - } - }, - "CorsRule": { - "description": "CORS is an HTTP feature that enables a web application running under one domain to access resources in another domain. Web browsers implement a security restriction known as same-origin policy that prevents a web page from calling APIs in a different domain; CORS provides a secure way to allow one domain (the origin domain) to call APIs in another domain", - "type": "object", - "required": [ - "AllowedOrigins", - "AllowedMethods", - "MaxAgeInSeconds" - ], - "properties": { - "AllowedOrigins": { - "description": "The origin domains that are permitted to make a request against the storage service via CORS. The origin domain is the domain from which the request originates. Note that the origin must be an exact case-sensitive match with the origin that the user age sends to the service. You can also use the wildcard character '*' to allow all origin domains to make requests via CORS.", - "type": "string" - }, - "AllowedMethods": { - "description": "The methods (HTTP request verbs) that the origin domain may use for a CORS request. (comma separated)", - "type": "string" - }, - "AllowedHeaders": { - "description": "the request headers that the origin domain may specify on the CORS request.", - "type": "string" - }, - "ExposedHeaders": { - "description": "The response headers that may be sent in the response to the CORS request and exposed by the browser to the request issuer", - "type": "string" - }, - "MaxAgeInSeconds": { - "description": "The maximum amount time that a browser should cache the preflight OPTIONS request.", - "type": "integer", - "minimum": 0 - } - } - }, - "ErrorCode": { - "description": "Error codes returned by the service", - "type": "string", - "enum": [ - "AccountAlreadyExists", - "AccountBeingCreated", - "AccountIsDisabled", - "AuthenticationFailed", - "ConditionHeadersNotSupported", - "ConditionNotMet", - "EmptyMetadataKey", - "InsufficientAccountPermissions", - "InternalError", - "InvalidAuthenticationInfo", - "InvalidHeaderValue", - "InvalidHttpVerb", - "InvalidInput", - "InvalidMd5", - "InvalidMetadata", - "InvalidQueryParameterValue", - "InvalidRange", - "InvalidResourceName", - "InvalidUri", - "InvalidXmlDocument", - "InvalidXmlNodeValue", - "Md5Mismatch", - "MetadataTooLarge", - "MissingContentLengthHeader", - "MissingRequiredQueryParameter", - "MissingRequiredHeader", - "MissingRequiredXmlNode", - "MultipleConditionHeadersNotSupported", - "OperationTimedOut", - "OutOfRangeInput", - "OutOfRangeQueryParameterValue", - "RequestBodyTooLarge", - "ResourceTypeMismatch", - "RequestUrlFailedToParse", - "ResourceAlreadyExists", - "ResourceNotFound", - "ServerBusy", - "UnsupportedHeader", - "UnsupportedXmlNode", - "UnsupportedQueryParameter", - "UnsupportedHttpVerb", - "AppendPositionConditionNotMet", - "BlobAlreadyExists", - "BlobNotFound", - "BlobOverwritten", - "BlobTierInadequateForContentLength", - "BlockCountExceedsLimit", - "BlockListTooLong", - "CannotChangeToLowerTier", - "CannotVerifyCopySource", - "ContainerAlreadyExists", - "ContainerBeingDeleted", - "ContainerDisabled", - "ContainerNotFound", - "ContentLengthLargerThanTierLimit", - "CopyAcrossAccountsNotSupported", - "CopyIdMismatch", - "FeatureVersionMismatch", - "IncrementalCopyBlobMismatch", - "IncrementalCopyOfEralierVersionSnapshotNotAllowed", - "IncrementalCopySourceMustBeSnapshot", - "InfiniteLeaseDurationRequired", - "InvalidBlobOrBlock", - "InvalidBlobTier", - "InvalidBlobType", - "InvalidBlockId", - "InvalidBlockList", - "InvalidOperation", - "InvalidPageRange", - "InvalidSourceBlobType", - "InvalidSourceBlobUrl", - "InvalidVersionForPageBlobOperation", - "LeaseAlreadyPresent", - "LeaseAlreadyBroken", - "LeaseIdMismatchWithBlobOperation", - "LeaseIdMismatchWithContainerOperation", - "LeaseIdMismatchWithLeaseOperation", - "LeaseIdMissing", - "LeaseIsBreakingAndCannotBeAcquired", - "LeaseIsBreakingAndCannotBeChanged", - "LeaseIsBrokenAndCannotBeRenewed", - "LeaseLost", - "LeaseNotPresentWithBlobOperation", - "LeaseNotPresentWithContainerOperation", - "LeaseNotPresentWithLeaseOperation", - "MaxBlobSizeConditionNotMet", - "NoPendingCopyOperation", - "OperationNotAllowedOnIncrementalCopyBlob", - "PendingCopyOperation", - "PreviousSnapshotCannotBeNewer", - "PreviousSnapshotNotFound", - "PreviousSnapshotOperationNotSupported", - "SequenceNumberConditionNotMet", - "SequenceNumberIncrementTooLarge", - "SnapshotCountExceeded", - "SnaphotOperationRateExceeded", - "SnapshotsPresent", - "SourceConditionNotMet", - "SystemInUse", - "TargetConditionNotMet", - "UnauthorizedBlobOverwrite", - "BlobBeingRehydrated", - "BlobArchived", - "BlobNotArchived" - ], - "x-ms-enum": { - "name": "StorageErrorCode", - "modelAsString": true - } - }, - "GeoReplication": { - "description": "Geo-Replication information for the Secondary Storage Service", - "type": "object", - "required": [ - "Status", - "LastSyncTime" - ], - "properties": { - "Status": { - "description": "The status of the secondary location", - "type": "string", - "enum": [ - "live", - "bootstrap", - "unavailable" - ], - "x-ms-enum": { - "name": "GeoReplicationStatusType", - "modelAsString": true - } - }, - "LastSyncTime": { - "description": "A GMT date/time value, to the second. All primary writes preceding this value are guaranteed to be available for read operations at the secondary. Primary writes after this point in time may or may not be available for reads.", - "type": "string", - "format": "date-time-rfc1123" - } - } - }, - "Logging": { - "description": "Azure Analytics Logging settings.", - "type": "object", - "required": [ - "Version", - "Delete", - "Read", - "Write", - "RetentionPolicy" - ], - "properties": { - "Version": { - "description": "The version of Storage Analytics to configure.", - "type": "string" - }, - "Delete": { - "description": "Indicates whether all delete requests should be logged.", - "type": "boolean" - }, - "Read": { - "description": "Indicates whether all read requests should be logged.", - "type": "boolean" - }, - "Write": { - "description": "Indicates whether all write requests should be logged.", - "type": "boolean" - }, - "RetentionPolicy": { - "$ref": "#/definitions/RetentionPolicy" - } - } - }, - "ContainerMetadata": { - "type": "object", - "xml": { - "name": "Metadata" - }, - "additionalProperties": { - "type": "string" - } - }, - "BlobMetadata": { - "type": "object", - "xml": { - "name": "Metadata" - }, - "properties": { - "Encrypted": { - "type": "string", - "xml": { - "attribute": true - } - } - }, - "additionalProperties": { - "type": "string" - } - }, - "Metrics": { - "description": "a summary of request statistics grouped by API in hour or minute aggregates for blobs", - "required": [ - "Enabled" - ], - "properties": { - "Version": { - "description": "The version of Storage Analytics to configure.", - "type": "string" - }, - "Enabled": { - "description": "Indicates whether metrics are enabled for the Blob service.", - "type": "boolean" - }, - "IncludeAPIs": { - "description": "Indicates whether metrics should generate summary statistics for called API operations.", - "type": "boolean" - }, - "RetentionPolicy": { - "$ref": "#/definitions/RetentionPolicy" - } - } - }, - "PageList": { - "description": "the list of pages", - "type": "object", - "properties": { - "PageRange": { - "type": "array", - "items": { - "$ref": "#/definitions/PageRange" - } - }, - "ClearRange": { - "type": "array", - "items": { - "$ref": "#/definitions/ClearRange" - } - } - } - }, - "PageRange": { - "type": "object", - "required": [ - "Start", - "End" - ], - "properties": { - "Start": { - "type": "integer", - "format": "int64", - "xml": { - "name": "Start" - } - }, - "End": { - "type": "integer", - "format": "int64", - "xml": { - "name": "End" - } - } - }, - "xml": { - "name": "PageRange" - } - }, - "ClearRange": { - "type": "object", - "required": [ - "Start", - "End" - ], - "properties": { - "Start": { - "type": "integer", - "format": "int64", - "xml": { - "name": "Start" - } - }, - "End": { - "type": "integer", - "format": "int64", - "xml": { - "name": "End" - } - } - }, - "xml": { - "name": "ClearRange" - } - }, - "RetentionPolicy": { - "description": "the retention policy which determines how long the associated data should persist", - "type": "object", - "required": [ - "Enabled" - ], - "properties": { - "Enabled": { - "description": "Indicates whether a retention policy is enabled for the storage service", - "type": "boolean" - }, - "Days": { - "description": "Indicates the number of days that metrics or logging or soft-deleted data should be retained. All data older than this value will be deleted", - "type": "integer", - "minimum": 1 - } - } - }, - "SignedIdentifier": { - "xml": { - "name": "SignedIdentifier" - }, - "description": "signed identifier", - "type": "object", - "required": [ - "Id", - "AccessPolicy" - ], - "properties": { - "Id": { - "type": "string", - "description": "a unique id" - }, - "AccessPolicy": { - "$ref": "#/definitions/AccessPolicy" - } - } - }, - "SignedIdentifiers": { - "description": "a collection of signed identifiers", - "type": "array", - "items": { - "$ref": "#/definitions/SignedIdentifier" - }, - "xml": { - "wrapped": true, - "name": "SignedIdentifiers" - } - }, - "StaticWebsite": { - "description": "The properties that enable an account to host a static website", - "type": "object", - "required": [ - "Enabled" - ], - "properties": { - "Enabled": { - "description": "Indicates whether this account is hosting a static website", - "type": "boolean" - }, - "IndexDocument": { - "description": "The default name of the index page under each directory", - "type": "string" - }, - "ErrorDocument404Path": { - "description": "The absolute path of the custom 404 page", - "type": "string" - } - } - }, - "StorageServiceProperties": { - "description": "Storage Service Properties.", - "type": "object", - "properties": { - "Logging": { - "$ref": "#/definitions/Logging" - }, - "HourMetrics": { - "$ref": "#/definitions/Metrics" - }, - "MinuteMetrics": { - "$ref": "#/definitions/Metrics" - }, - "Cors": { - "description": "The set of CORS rules.", - "type": "array", - "items": { - "$ref": "#/definitions/CorsRule" - }, - "xml": { - "wrapped": true - } - }, - "DefaultServiceVersion": { - "description": "The default version to use for requests to the Blob service if an incoming request's version is not specified. Possible values include version 2008-10-27 and all more recent versions", - "type": "string" - }, - "DeleteRetentionPolicy": { - "$ref": "#/definitions/RetentionPolicy" - }, - "StaticWebsite": { - "$ref": "#/definitions/StaticWebsite" - } - } - }, - "StorageServiceStats": { - "description": "Stats for the storage service.", - "type": "object", - "properties": { - "GeoReplication": { - "$ref": "#/definitions/GeoReplication" - } - } - } - }, - "parameters": { - "Url": { - "name": "url", - "description": "The URL of the service account, container, or blob that is the targe of the desired operation.", - "required": true, - "type": "string", - "in": "path", - "x-ms-skip-url-encoding": true - }, - "ApiVersionParameter": { - "name": "x-ms-version", - "x-ms-client-name": "version", - "in": "header", - "required": false, - "type": "string", - "description": "Specifies the version of the operation to use for this request." - }, - "Blob": { - "name": "blob", - "in": "path", - "required": true, - "type": "string", - "pattern": "^[a-zA-Z0-9]+(?:/[a-zA-Z0-9]+)*(?:\\.[a-zA-Z0-9]+){0,1}$", - "minLength": 1, - "maxLength": 1024, - "x-ms-parameter-location": "method", - "description": "The blob name." - }, - "Filesystem": { - "name": "filesystem", - "in": "path", - "required": true, - "type": "string", - "x-ms-parameter-location": "method", - "description": "The filesystem name." - }, - "Path": { - "name": "path", - "in": "path", - "required": true, - "type": "string", - "x-ms-parameter-location": "method", - "description": "The namespace path to a file or directory." - }, - "BlobCacheControl": { - "name": "x-ms-blob-cache-control", - "x-ms-client-name": "blobCacheControl", - "in": "header", - "required": false, - "type": "string", - "x-ms-parameter-location": "method", - "x-ms-parameter-grouping": { - "name": "blob-HTTP-headers" - }, - "description": "Optional. Sets the blob's cache control. If specified, this property is stored with the blob and returned with a read request." - }, - "BlobConditionAppendPos": { - "name": "x-ms-blob-condition-appendpos", - "x-ms-client-name": "appendPosition", - "in": "header", - "required": false, - "type": "integer", - "format": "int64", - "x-ms-parameter-location": "method", - "x-ms-parameter-grouping": { - "name": "append-position-access-conditions" - }, - "description": "Optional conditional header, used only for the Append Block operation. A number indicating the byte offset to compare. Append Block will succeed only if the append position is equal to this number. If it is not, the request will fail with the AppendPositionConditionNotMet error (HTTP status code 412 - Precondition Failed)." - }, - "BlobConditionMaxSize": { - "name": "x-ms-blob-condition-maxsize", - "x-ms-client-name": "maxSize", - "in": "header", - "required": false, - "type": "integer", - "format": "int64", - "x-ms-parameter-location": "method", - "x-ms-parameter-grouping": { - "name": "append-position-access-conditions" - }, - "description": "Optional conditional header. The max length in bytes permitted for the append blob. If the Append Block operation would cause the blob to exceed that limit or if the blob size is already greater than the value specified in this header, the request will fail with MaxBlobSizeConditionNotMet error (HTTP status code 412 - Precondition Failed)." - }, - "BlobPublicAccess": { - "name": "x-ms-blob-public-access", - "x-ms-client-name": "access", - "in": "header", - "required": false, - "x-ms-parameter-location": "method", - "description": "Specifies whether data in the container may be accessed publicly and the level of access", - "type": "string", - "enum": [ - "container", - "blob" - ], - "x-ms-enum": { - "name": "PublicAccessType", - "modelAsString": true - } - }, - "AccessTierRequired": { - "name": "x-ms-access-tier", - "x-ms-client-name": "tier", - "in": "header", - "required": true, - "type": "string", - "enum": [ - "P4", - "P6", - "P10", - "P15", - "P20", - "P30", - "P40", - "P50", - "P60", - "P70", - "P80", - "Hot", - "Cool", - "Archive" - ], - "x-ms-enum": { - "name": "AccessTier", - "modelAsString": true - }, - "x-ms-parameter-location": "method", - "description": "Indicates the tier to be set on the blob." - }, - "AccessTierOptional": { - "name": "x-ms-access-tier", - "x-ms-client-name": "tier", - "in": "header", - "required": false, - "type": "string", - "enum": [ - "P4", - "P6", - "P10", - "P15", - "P20", - "P30", - "P40", - "P50", - "P60", - "P70", - "P80", - "Hot", - "Cool", - "Archive" - ], - "x-ms-enum": { - "name": "AccessTier", - "modelAsString": true - }, - "x-ms-parameter-location": "method", - "description": "Optional. Indicates the tier to be set on the blob." - }, - "RehydratePriority": { - "name": "x-ms-rehydrate-priority", - "x-ms-client-name": "rehydratePriority", - "in": "header", - "required": false, - "type": "string", - "enum": [ - "High", - "Standard" - ], - "x-ms-enum": { - "name": "RehydratePriority", - "modelAsString": true - }, - "x-ms-parameter-location": "method", - "description": "Optional: Indicates the priority with which to rehydrate an archived blob." - }, - "BlobContentDisposition": { - "name": "x-ms-blob-content-disposition", - "x-ms-client-name": "blobContentDisposition", - "in": "header", - "required": false, - "type": "string", - "x-ms-parameter-location": "method", - "x-ms-parameter-grouping": { - "name": "blob-HTTP-headers" - }, - "description": "Optional. Sets the blob's Content-Disposition header." - }, - "BlobContentEncoding": { - "name": "x-ms-blob-content-encoding", - "x-ms-client-name": "blobContentEncoding", - "in": "header", - "required": false, - "type": "string", - "x-ms-parameter-location": "method", - "x-ms-parameter-grouping": { - "name": "blob-HTTP-headers" - }, - "description": "Optional. Sets the blob's content encoding. If specified, this property is stored with the blob and returned with a read request." - }, - "BlobContentLanguage": { - "name": "x-ms-blob-content-language", - "x-ms-client-name": "blobContentLanguage", - "in": "header", - "required": false, - "type": "string", - "x-ms-parameter-location": "method", - "x-ms-parameter-grouping": { - "name": "blob-HTTP-headers" - }, - "description": "Optional. Set the blob's content language. If specified, this property is stored with the blob and returned with a read request." - }, - "BlobContentLengthOptional": { - "name": "x-ms-blob-content-length", - "x-ms-client-name": "blobContentLength", - "in": "header", - "required": false, - "type": "integer", - "format": "int64", - "x-ms-parameter-location": "method", - "description": "This header specifies the maximum size for the page blob, up to 1 TB. The page blob size must be aligned to a 512-byte boundary." - }, - "BlobContentLengthRequired": { - "name": "x-ms-blob-content-length", - "x-ms-client-name": "blobContentLength", - "in": "header", - "required": true, - "type": "integer", - "format": "int64", - "x-ms-parameter-location": "method", - "description": "This header specifies the maximum size for the page blob, up to 1 TB. The page blob size must be aligned to a 512-byte boundary." - }, - "BlobContentMD5": { - "name": "x-ms-blob-content-md5", - "x-ms-client-name": "blobContentMD5", - "in": "header", - "required": false, - "type": "string", - "format": "byte", - "x-ms-parameter-location": "method", - "x-ms-parameter-grouping": { - "name": "blob-HTTP-headers" - }, - "description": "Optional. An MD5 hash of the blob content. Note that this hash is not validated, as the hashes for the individual blocks were validated when each was uploaded." - }, - "BlobContentType": { - "name": "x-ms-blob-content-type", - "x-ms-client-name": "blobContentType", - "in": "header", - "required": false, - "type": "string", - "x-ms-parameter-location": "method", - "x-ms-parameter-grouping": { - "name": "blob-HTTP-headers" - }, - "description": "Optional. Sets the blob's content type. If specified, this property is stored with the blob and returned with a read request." - }, - "BlobSequenceNumber": { - "name": "x-ms-blob-sequence-number", - "x-ms-client-name": "blobSequenceNumber", - "in": "header", - "required": false, - "type": "integer", - "format": "int64", - "default": 0, - "x-ms-parameter-location": "method", - "description": "Set for page blobs only. The sequence number is a user-controlled value that you can use to track requests. The value of the sequence number must be between 0 and 2^63 - 1." - }, - "PageBlobAccessTier": { - "name": "x-ms-access-tier", - "x-ms-client-name": "pageBlobAccessTier", - "in": "header", - "required": false, - "type": "string", - "enum": [ - "P4", - "P6", - "P10", - "P15", - "P20", - "P30", - "P40", - "P50", - "P60", - "P70", - "P80" - ], - "x-ms-enum": { - "name": "PageBlobAccessTier", - "modelAsString": true - }, - "x-ms-parameter-location": "method", - "description": "Set for page blobs only. For page blobs on a premium storage account only. Specifies the tier to be set on the blob." - }, - "BlockId": { - "name": "blockid", - "x-ms-client-name": "blockId", - "in": "query", - "type": "string", - "required": true, - "x-ms-parameter-location": "method", - "description": "A valid Base64 string value that identifies the block. Prior to encoding, the string must be less than or equal to 64 bytes in size. For a given blob, the length of the value specified for the blockid parameter must be the same size for each block." - }, - "BlockListType": { - "name": "blocklisttype", - "x-ms-client-name": "listType", - "in": "query", - "required": false, - "default": "committed", - "x-ms-parameter-location": "method", - "description": "Specifies whether to return the list of committed blocks, the list of uncommitted blocks, or both lists together.", - "type": "string", - "enum": [ - "committed", - "uncommitted", - "all" - ], - "x-ms-enum": { - "name": "BlockListType", - "modelAsString": false - } - }, - "Body": { - "name": "body", - "in": "body", - "required": true, - "schema": { - "type": "object", - "format": "file" - }, - "x-ms-parameter-location": "method", - "description": "Initial data" - }, - "Continuation": { - "name": "continuation", - "x-ms-client-name": "marker", - "in": "query", - "required": false, - "type": "string", - "x-ms-parameter-location": "method", - "description": "When renaming a directory, the number of paths that are renamed with each invocation is limited. If the number of paths to be renamed exceeds this limit, a continuation token is returned in this response header. When a continuation token is returned in the response, it must be specified in a subsequent invocation of the rename operation to continue renaming the directory." - }, - "ContainerAcl": { - "name": "containerAcl", - "in": "body", - "schema": { - "$ref": "#/definitions/SignedIdentifiers" - }, - "x-ms-parameter-location": "method", - "description": "the acls for the container" - }, - "CopyId": { - "name": "copyid", - "x-ms-client-name": "copyId", - "in": "query", - "required": true, - "type": "string", - "x-ms-parameter-location": "method", - "description": "The copy identifier provided in the x-ms-copy-id header of the original Copy Blob operation." - }, - "ClientRequestId": { - "name": "x-ms-client-request-id", - "x-ms-client-name": "requestId", - "in": "header", - "required": false, - "type": "string", - "x-ms-parameter-location": "method", - "description": "Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage analytics logging is enabled." - }, - "ContainerName": { - "name": "containerName", - "in": "path", - "required": true, - "type": "string", - "x-ms-parameter-location": "method", - "description": "The container name." - }, - "ContentCrc64": { - "name": "x-ms-content-crc64", - "x-ms-client-name": "transactionalContentCrc64", - "in": "header", - "required": false, - "type": "string", - "format": "byte", - "x-ms-parameter-location": "method", - "description": "Specify the transactional crc64 for the body, to be validated by the service." - }, - "ContentLength": { - "name": "Content-Length", - "in": "header", - "required": true, - "type": "integer", - "format": "int64", - "x-ms-parameter-location": "method", - "description": "The length of the request." - }, - "CopySource": { - "name": "x-ms-copy-source", - "x-ms-client-name": "copySource", - "in": "header", - "required": true, - "type": "string", - "format": "url", - "x-ms-parameter-location": "method", - "description": "Specifies the name of the source page blob snapshot. This value is a URL of up to 2 KB in length that specifies a page blob snapshot. The value should be URL-encoded as it would appear in a request URI. The source blob must either be public or must be authenticated via a shared access signature." - }, - "DeleteSnapshots": { - "name": "x-ms-delete-snapshots", - "x-ms-client-name": "deleteSnapshots", - "description": "Required if the blob has associated snapshots. Specify one of the following two options: include: Delete the base blob and all of its snapshots. only: Delete only the blob's snapshots and not the blob itself", - "x-ms-parameter-location": "method", - "in": "header", - "required": false, - "type": "string", - "enum": [ - "include", - "only" - ], - "x-ms-enum": { - "name": "DeleteSnapshotsOptionType", - "modelAsString": false - } - }, - "Delimiter": { - "name": "delimiter", - "description": "When the request includes this parameter, the operation returns a BlobPrefix element in the response body that acts as a placeholder for all blobs whose names begin with the same substring up to the appearance of the delimiter character. The delimiter may be a single character or a string.", - "type": "string", - "x-ms-parameter-location": "method", - "in": "query", - "required": true - }, - "DirectoryProperties": { - "name": "x-ms-properties", - "description": "Optional. User-defined properties to be stored with the file or directory, in the format of a comma-separated list of name and value pairs \"n1=v1, n2=v2, ...\", where each value is base64 encoded.", - "x-ms-client-name": "directoryProperties", - "in": "header", - "required": false, - "type": "string", - "x-ms-parameter-location": "method" - }, - "EncryptionKey": { - "name": "x-ms-encryption-key", - "x-ms-client-name": "encryptionKey", - "type": "string", - "in": "header", - "required": false, - "x-ms-parameter-location": "method", - "x-ms-parameter-grouping": { - "name": "cpk-info" - }, - "description": "Optional. Specifies the encryption key to use to encrypt the data provided in the request. If not specified, encryption is performed with the root account encryption key. For more information, see Encryption at Rest for Azure Storage Services." - }, - "EncryptionKeySha256": { - "name": "x-ms-encryption-key-sha256", - "x-ms-client-name": "encryptionKeySha256", - "type": "string", - "in": "header", - "required": false, - "x-ms-parameter-location": "method", - "x-ms-parameter-grouping": { - "name": "cpk-info" - }, - "description": "The SHA-256 hash of the provided encryption key. Must be provided if the x-ms-encryption-key header is provided." - }, - "EncryptionAlgorithm": { - "name": "x-ms-encryption-algorithm", - "x-ms-client-name": "encryptionAlgorithm", - "type": "string", - "in": "header", - "required": false, - "enum": [ - "AES256" - ], - "x-ms-enum": { - "name": "EncryptionAlgorithmType", - "modelAsString": false - }, - "x-ms-parameter-location": "method", - "x-ms-parameter-grouping": { - "name": "cpk-info" - }, - "description": "The algorithm used to produce the encryption key hash. Currently, the only accepted value is \"AES256\". Must be provided if the x-ms-encryption-key header is provided." - }, - "FileRenameSource": { - "name": "x-ms-rename-source", - "x-ms-client-name": "renameSource", - "in": "header", - "required": true, - "type": "string", - "x-ms-parameter-location": "method", - "description": "The file or directory to be renamed. The value must have the following format: \"/{filesysystem}/{path}\". If \"x-ms-properties\" is specified, the properties will overwrite the existing properties; otherwise, the existing properties will be preserved." - }, - "GetRangeContentMD5": { - "name": "x-ms-range-get-content-md5", - "x-ms-client-name": "rangeGetContentMD5", - "in": "header", - "required": false, - "type": "boolean", - "x-ms-parameter-location": "method", - "description": "When set to true and specified together with the Range, the service returns the MD5 hash for the range, as long as the range is less than or equal to 4 MB in size." - }, - "GetRangeContentCRC64": { - "name": "x-ms-range-get-content-crc64", - "x-ms-client-name": "rangeGetContentCRC64", - "in": "header", - "required": false, - "type": "boolean", - "x-ms-parameter-location": "method", - "description": "When set to true and specified together with the Range, the service returns the CRC64 hash for the range, as long as the range is less than or equal to 4 MB in size." - }, - "IfMatch": { - "name": "If-Match", - "x-ms-client-name": "ifMatch", - "in": "header", - "required": false, - "type": "string", - "format": "etag", - "x-ms-parameter-location": "method", - "x-ms-parameter-grouping": { - "name": "modified-access-conditions" - }, - "description": "Specify an ETag value to operate only on blobs with a matching value." - }, - "IfModifiedSince": { - "name": "If-Modified-Since", - "x-ms-client-name": "ifModifiedSince", - "in": "header", - "required": false, - "type": "string", - "format": "date-time-rfc1123", - "x-ms-parameter-location": "method", - "x-ms-parameter-grouping": { - "name": "modified-access-conditions" - }, - "description": "Specify this header value to operate only on a blob if it has been modified since the specified date/time." - }, - "IfNoneMatch": { - "name": "If-None-Match", - "x-ms-client-name": "ifNoneMatch", - "in": "header", - "required": false, - "type": "string", - "format": "etag", - "x-ms-parameter-location": "method", - "x-ms-parameter-grouping": { - "name": "modified-access-conditions" - }, - "description": "Specify an ETag value to operate only on blobs without a matching value." - }, - "IfUnmodifiedSince": { - "name": "If-Unmodified-Since", - "x-ms-client-name": "ifUnmodifiedSince", - "in": "header", - "required": false, - "type": "string", - "format": "date-time-rfc1123", - "x-ms-parameter-location": "method", - "x-ms-parameter-grouping": { - "name": "modified-access-conditions" - }, - "description": "Specify this header value to operate only on a blob if it has not been modified since the specified date/time." - }, - "IfSequenceNumberEqualTo": { - "name": "x-ms-if-sequence-number-eq", - "x-ms-client-name": "ifSequenceNumberEqualTo", - "in": "header", - "required": false, - "type": "integer", - "format": "int64", - "x-ms-parameter-location": "method", - "x-ms-parameter-grouping": { - "name": "sequence-number-access-conditions" - }, - "description": "Specify this header value to operate only on a blob if it has the specified sequence number." - }, - "IfSequenceNumberLessThan": { - "name": "x-ms-if-sequence-number-lt", - "x-ms-client-name": "ifSequenceNumberLessThan", - "in": "header", - "required": false, - "type": "integer", - "format": "int64", - "x-ms-parameter-location": "method", - "x-ms-parameter-grouping": { - "name": "sequence-number-access-conditions" - }, - "description": "Specify this header value to operate only on a blob if it has a sequence number less than the specified." - }, - "IfSequenceNumberLessThanOrEqualTo": { - "name": "x-ms-if-sequence-number-le", - "x-ms-client-name": "ifSequenceNumberLessThanOrEqualTo", - "in": "header", - "required": false, - "type": "integer", - "format": "int64", - "x-ms-parameter-location": "method", - "x-ms-parameter-grouping": { - "name": "sequence-number-access-conditions" - }, - "description": "Specify this header value to operate only on a blob if it has a sequence number less than or equal to the specified." - }, - "KeyInfo": { - "name": "KeyInfo", - "in": "body", - "x-ms-parameter-location": "method", - "required": true, - "schema": { - "$ref": "#/definitions/KeyInfo" - } - }, - "ListBlobsInclude": { - "name": "include", - "in": "query", - "required": false, - "type": "array", - "collectionFormat": "csv", - "items": { - "type": "string", - "enum": [ - "", - "copy", - "deleted", - "metadata", - "snapshots", - "uncommittedblobs", - "tags", - "versions", - "deletedwithversions", - "immutabilitypolicy", - "legalhold", - "permissions" - ], - "x-ms-enum": { - "name": "ListBlobsIncludeItem", - "modelAsString": false - } - }, - "x-ms-parameter-location": "method", - "description": "Include this parameter to specify one or more datasets to include in the response." - }, - "ListContainersInclude": { - "name": "include", - "in": "query", - "required": false, - "type": "string", - "enum": [ - "", - "metadata", - "deleted" - ], - "x-ms-enum": { - "name": "ListContainersIncludeType", - "modelAsString": false - }, - "x-ms-parameter-location": "method", - "description": "Include this parameter to specify that the container's metadata be returned as part of the response body." - }, - "LeaseBreakPeriod": { - "name": "x-ms-lease-break-period", - "x-ms-client-name": "breakPeriod", - "in": "header", - "required": false, - "type": "integer", - "x-ms-parameter-location": "method", - "description": "For a break operation, proposed duration the lease should continue before it is broken, in seconds, between 0 and 60. This break period is only used if it is shorter than the time remaining on the lease. If longer, the time remaining on the lease is used. A new lease will not be available before the break period has expired, but the lease may be held for longer than the break period. If this header does not appear with a break operation, a fixed-duration lease breaks after the remaining lease period elapses, and an infinite lease breaks immediately." - }, - "LeaseDuration": { - "name": "x-ms-lease-duration", - "x-ms-client-name": "duration", - "in": "header", - "required": false, - "type": "integer", - "x-ms-parameter-location": "method", - "description": "Specifies the duration of the lease, in seconds, or negative one (-1) for a lease that never expires. A non-infinite lease can be between 15 and 60 seconds. A lease duration cannot be changed using renew or change." - }, - "LeaseIdOptional": { - "name": "x-ms-lease-id", - "x-ms-client-name": "leaseId", - "in": "header", - "required": false, - "type": "string", - "x-ms-parameter-location": "method", - "x-ms-parameter-grouping": { - "name": "lease-access-conditions" - }, - "description": "If specified, the operation only succeeds if the container's lease is active and matches this ID." - }, - "LeaseIdRequired": { - "name": "x-ms-lease-id", - "x-ms-client-name": "leaseId", - "in": "header", - "required": true, - "type": "string", - "x-ms-parameter-location": "method", - "description": "If specified, the operation only succeeds if the container's lease is active and matches this ID." - }, - "Owner": { - "name": "x-ms-owner", - "x-ms-client-name": "owner", - "in": "header", - "required": false, - "type": "string", - "description": "Optional. The owner of the blob or directory.", - "x-ms-parameter-location": "method" - }, - "Group": { - "name": "x-ms-group", - "x-ms-client-name": "group", - "in": "header", - "required": false, - "type": "string", - "description": "Optional. The owning group of the blob or directory.", - "x-ms-parameter-location": "method" - }, - "Upn": { - "name": "upn", - "x-ms-client-name": "upn", - "in": "query", - "description": "Optional. Valid only when Hierarchical Namespace is enabled for the account. If \"true\", the identity values returned in the x-ms-owner, x-ms-group, and x-ms-acl response headers will be transformed from Azure Active Directory Object IDs to User Principal Names. If \"false\", the values will be returned as Azure Active Directory Object IDs. The default value is false.", - "required": false, - "type": "boolean", - "x-ms-parameter-location": "method" - }, - "Marker": { - "name": "marker", - "in": "query", - "required": false, - "type": "string", - "description": "A string value that identifies the portion of the list of containers to be returned with the next listing operation. The operation returns the NextMarker value within the response body if the listing operation did not return all containers remaining to be listed with the current page. The NextMarker value can be used as the value for the marker parameter in a subsequent call to request the next page of list items. The marker value is opaque to the client.", - "x-ms-parameter-location": "method" - }, - "MaxResults": { - "name": "maxresults", - "in": "query", - "required": false, - "type": "integer", - "minimum": 1, - "x-ms-parameter-location": "method", - "description": "Specifies the maximum number of containers to return. If the request does not specify maxresults, or specifies a value greater than 5000, the server will return up to 5000 items. Note that if the listing operation crosses a partition boundary, then the service will return a continuation token for retrieving the remainder of the results. For this reason, it is possible that the service will return fewer results than specified by maxresults, or than the default of 5000." - }, - "Metadata": { - "name": "x-ms-meta", - "x-ms-client-name": "metadata", - "in": "header", - "required": false, - "type": "string", - "x-ms-parameter-location": "method", - "description": "Optional. Specifies a user-defined name-value pair associated with the blob. If no name-value pairs are specified, the operation will copy the metadata from the source blob or file to the destination blob. If one or more name-value pairs are specified, the destination blob is created with the specified metadata, and metadata is not copied from the source blob or file. Note that beginning with version 2009-09-19, metadata names must adhere to the naming rules for C# identifiers. See Naming and Referencing Containers, Blobs, and Metadata for more information.", - "x-ms-header-collection-prefix": "x-ms-meta-" - }, - "MultipartContentType": { - "name": "Content-Type", - "x-ms-client-name": "multipartContentType", - "in": "header", - "required": true, - "type": "string", - "x-ms-parameter-location": "method", - "description": "Required. The value of this header must be multipart/mixed with a batch boundary. Example header value: multipart/mixed; boundary=batch_" - }, - "PathRenameMode": { - "name": "mode", - "x-ms-client-name": "pathRenameMode", - "description": "Determines the behavior of the rename operation", - "in": "query", - "required": false, - "type": "string", - "enum": [ - "legacy", - "posix" - ], - "x-ms-enum": { - "name": "PathRenameMode", - "modelAsString": false - } - }, - "PosixPermissions": { - "name": "x-ms-permissions", - "description": "Optional and only valid if Hierarchical Namespace is enabled for the account. Sets POSIX access permissions for the file owner, the file owning group, and others. Each class may be granted read, write, or execute permission. The sticky bit is also supported. Both symbolic (rwxrw-rw-) and 4-digit octal notation (e.g. 0766) are supported.", - "x-ms-client-name": "posixPermissions", - "in": "header", - "required": false, - "type": "string", - "x-ms-parameter-location": "method" - }, - "PosixAcl": { - "name": "x-ms-acl", - "description": "Sets POSIX access control rights on files and directories. The value is a comma-separated list of access control entries. Each access control entry (ACE) consists of a scope, a type, a user or group identifier, and permissions in the format \"[scope:][type]:[id]:[permissions]\".", - "x-ms-client-name": "posixAcl", - "in": "header", - "required": false, - "type": "string", - "x-ms-parameter-location": "method" - }, - "PosixUmask": { - "name": "x-ms-umask", - "x-ms-client-name": "posixUmask", - "in": "header", - "required": false, - "type": "string", - "x-ms-parameter-location": "method", - "description": "Only valid if Hierarchical Namespace is enabled for the account. This umask restricts permission settings for file and directory, and will only be applied when default Acl does not exist in parent directory. If the umask bit has set, it means that the corresponding permission will be disabled. Otherwise the corresponding permission will be determined by the permission. A 4-digit octal notation (e.g. 0022) is supported here. If no umask was specified, a default umask - 0027 will be used." - }, - "Prefix": { - "name": "prefix", - "in": "query", - "required": false, - "type": "string", - "description": "Filters the results to return only containers whose name begins with the specified prefix.", - "x-ms-parameter-location": "method" - }, - "PrevSnapshot": { - "name": "prevsnapshot", - "in": "query", - "required": true, - "type": "string", - "x-ms-parameter-location": "method", - "description": "Optional in version 2015-07-08 and newer. The prevsnapshot parameter is a DateTime value that specifies that the response will contain only pages that were changed between target blob and previous snapshot. Changed pages include both updated and cleared pages. The target blob may be a snapshot, as long as the snapshot specified by prevsnapshot is the older of the two. Note that incremental snapshots are currently supported only for blobs created on or after January 1, 2016." - }, - "ProposedLeaseIdOptional": { - "name": "x-ms-proposed-lease-id", - "x-ms-client-name": "proposedLeaseId", - "in": "header", - "required": false, - "type": "string", - "x-ms-parameter-location": "method", - "description": "Proposed lease ID, in a GUID string format. The Blob service returns 400 (Invalid request) if the proposed lease ID is not in the correct format. See Guid Constructor (String) for a list of valid GUID string formats." - }, - "ProposedLeaseIdRequired": { - "name": "x-ms-proposed-lease-id", - "x-ms-client-name": "proposedLeaseId", - "in": "header", - "required": true, - "type": "string", - "x-ms-parameter-location": "method", - "description": "Proposed lease ID, in a GUID string format. The Blob service returns 400 (Invalid request) if the proposed lease ID is not in the correct format. See Guid Constructor (String) for a list of valid GUID string formats." - }, - "Range": { - "name": "x-ms-range", - "x-ms-client-name": "range", - "in": "header", - "required": false, - "type": "string", - "x-ms-parameter-location": "method", - "description": "Return only the bytes of the blob in the specified range." - }, - "RangeRequiredPutPageFromUrl": { - "name": "x-ms-range", - "x-ms-client-name": "range", - "in": "header", - "required": true, - "type": "string", - "x-ms-parameter-location": "method", - "description": "The range of bytes to which the source range would be written. The range should be 512 aligned and range-end is required." - }, - "RecursiveDirectoryDelete": { - "name": "recursive", - "x-ms-client-name": "recursiveDirectoryDelete", - "in": "query", - "required": true, - "type": "boolean", - "x-ms-parameter-location": "method", - "description": "If \"true\", all paths beneath the directory will be deleted. If \"false\" and the directory is non-empty, an error occurs." - }, - "SequenceNumberAction": { - "name": "x-ms-sequence-number-action", - "x-ms-client-name": "sequenceNumberAction", - "in": "header", - "required": true, - "x-ms-parameter-location": "method", - "description": "Required if the x-ms-blob-sequence-number header is set for the request. This property applies to page blobs only. This property indicates how the service should modify the blob's sequence number", - "type": "string", - "enum": [ - "max", - "update", - "increment" - ], - "x-ms-enum": { - "name": "SequenceNumberActionType", - "modelAsString": false - } - }, - "Snapshot": { - "name": "snapshot", - "in": "query", - "required": false, - "type": "string", - "x-ms-parameter-location": "method", - "description": "The snapshot parameter is an opaque DateTime value that, when present, specifies the blob snapshot to retrieve. For more information on working with blob snapshots, see Creating a Snapshot of a Blob." - }, - "SourceContentMD5": { - "name": "x-ms-source-content-md5", - "x-ms-client-name": "sourceContentMD5", - "in": "header", - "required": false, - "type": "string", - "format": "byte", - "x-ms-parameter-location": "method", - "description": "Specify the md5 calculated for the range of bytes that must be read from the copy source." - }, - "SourceContentCRC64": { - "name": "x-ms-source-content-crc64", - "x-ms-client-name": "sourceContentcrc64", - "in": "header", - "required": false, - "type": "string", - "format": "byte", - "x-ms-parameter-location": "method", - "description": "Specify the crc64 calculated for the range of bytes that must be read from the copy source." - }, - "SourceRange": { - "name": "x-ms-source-range", - "x-ms-client-name": "sourceRange", - "in": "header", - "required": false, - "type": "string", - "x-ms-parameter-location": "method", - "description": "Bytes of source data in the specified range." - }, - "SourceRangeRequiredPutPageFromUrl": { - "name": "x-ms-source-range", - "x-ms-client-name": "sourceRange", - "in": "header", - "required": true, - "type": "string", - "x-ms-parameter-location": "method", - "description": "Bytes of source data in the specified range. The length of this range should match the ContentLength header and x-ms-range/Range destination range header." - }, - "SourceIfMatch": { - "name": "x-ms-source-if-match", - "x-ms-client-name": "sourceIfMatches", - "in": "header", - "required": false, - "type": "string", - "format": "etag", - "x-ms-parameter-location": "method", - "x-ms-parameter-grouping": { - "name": "source-modified-access-conditions" - }, - "description": "Specify an ETag value to operate only on blobs with a matching value." - }, - "SourceIfModifiedSince": { - "name": "x-ms-source-if-modified-since", - "x-ms-client-name": "sourceIfModifiedSince", - "in": "header", - "required": false, - "type": "string", - "format": "date-time-rfc1123", - "x-ms-parameter-location": "method", - "x-ms-parameter-grouping": { - "name": "source-modified-access-conditions" - }, - "description": "Specify this header value to operate only on a blob if it has been modified since the specified date/time." - }, - "SourceIfNoneMatch": { - "name": "x-ms-source-if-none-match", - "x-ms-client-name": "sourceIfNoneMatch", - "in": "header", - "required": false, - "type": "string", - "format": "etag", - "x-ms-parameter-location": "method", - "x-ms-parameter-grouping": { - "name": "source-modified-access-conditions" - }, - "description": "Specify an ETag value to operate only on blobs without a matching value." - }, - "SourceIfUnmodifiedSince": { - "name": "x-ms-source-if-unmodified-since", - "x-ms-client-name": "sourceIfUnmodifiedSince", - "in": "header", - "required": false, - "type": "string", - "format": "date-time-rfc1123", - "x-ms-parameter-location": "method", - "x-ms-parameter-grouping": { - "name": "source-modified-access-conditions" - }, - "description": "Specify this header value to operate only on a blob if it has not been modified since the specified date/time." - }, - "SourceLeaseId": { - "name": "x-ms-source-lease-id", - "x-ms-client-name": "sourceLeaseId", - "in": "header", - "required": false, - "type": "string", - "x-ms-parameter-location": "method", - "description": "A lease ID for the source path. If specified, the source path must have an active lease and the leaase ID must match." - }, - "SourceUrl": { - "name": "x-ms-copy-source", - "x-ms-client-name": "sourceUrl", - "in": "header", - "required": true, - "type": "string", - "format": "url", - "x-ms-parameter-location": "method", - "description": "Specifiy an URL to the copy source." - }, - "StorageServiceProperties": { - "name": "StorageServiceProperties", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/StorageServiceProperties" - }, - "x-ms-parameter-location": "method", - "description": "The StorageService properties." - }, - "Timeout": { - "name": "timeout", - "in": "query", - "required": false, - "type": "integer", - "minimum": 0, - "x-ms-parameter-location": "method", - "description": "The timeout parameter is expressed in seconds. For more information, see Setting Timeouts for Blob Service Operations." - }, - "XMsCacheControl": { - "name": "x-ms-cache-control", - "x-ms-client-name": "cacheControl", - "in": "header", - "required": false, - "type": "string", - "x-ms-parameter-location": "method", - "x-ms-parameter-grouping": { - "name": "directory-http-headers" - }, - "description": "Cache control for given resource" - }, - "XMsContentType": { - "name": "x-ms-content-type", - "x-ms-client-name": "contentType", - "in": "header", - "required": false, - "type": "string", - "x-ms-parameter-location": "method", - "x-ms-parameter-grouping": { - "name": "directory-http-headers" - }, - "description": "Content type for given resource" - }, - "XMsContentEncoding": { - "name": "x-ms-content-encoding", - "x-ms-client-name": "contentEncoding", - "in": "header", - "required": false, - "type": "string", - "x-ms-parameter-location": "method", - "x-ms-parameter-grouping": { - "name": "directory-http-headers" - }, - "description": "Content encoding for given resource" - }, - "XMsContentLanguage": { - "name": "x-ms-content-language", - "x-ms-client-name": "contentLanguage", - "in": "header", - "required": false, - "type": "string", - "x-ms-parameter-location": "method", - "x-ms-parameter-grouping": { - "name": "directory-http-headers" - }, - "description": "Content language for given resource" - }, - "XMsContentDisposition": { - "name": "x-ms-content-disposition", - "x-ms-client-name": "contentDisposition", - "in": "header", - "required": false, - "type": "string", - "x-ms-parameter-location": "method", - "x-ms-parameter-grouping": { - "name": "directory-http-headers" - }, - "description": "Content disposition for given resource" - } - } -} \ No newline at end of file diff --git a/swagger/blob-storage-2021-10-04.json b/swagger/blob-storage.json similarity index 100% rename from swagger/blob-storage-2021-10-04.json rename to swagger/blob-storage.json diff --git a/swagger/blob.md b/swagger/blob.md index 5e5a3faeb..979e39bab 100644 --- a/swagger/blob.md +++ b/swagger/blob.md @@ -10,7 +10,7 @@ enable-xml: true generate-metadata: false license-header: MICROSOFT_MIT_NO_VERSION output-folder: ../src/blob/generated -input-file: blob-storage-2021-10-04.json +input-file: blob-storage.json model-date-time-as-string: true optional-response-headers: true enum-types: true @@ -22,24 +22,22 @@ enum-types: true 2. Updated blocklisttype for list blob blocks from required to optional. -3. Only for 2019-02-02, make "Deleted" and "Snapshot" from required to optional for BlobItem model. +3. Make "Deleted" and "Snapshot" from required to optional for "BlobItemInternal" model from: -4. Only for 2021-10-04, make "Deleted" and "Snapshot" from required to optional for "BlobItemInternal" model from: - -5. Change for 2021-10-04, change "Name" definition in "BlobItemInternal" from: +4. Change "Name" definition in "BlobItemInternal" from: "Name": { - "$ref": "#/definitions/BlobName" + "$ref": "#/definitions/BlobName" } to "Name": { "type": "string" } -6. Add "","deleted" to "ListContainersInclude" enum, add "","tags","versions","deletedwithversions","legalhold","permissions" to "ListBlobsInclude" enum. +5. Add "","deleted" to "ListContainersInclude" enum, add "","tags","versions","deletedwithversions","legalhold","permissions" to "ListBlobsInclude" enum. -7. Add section for "Container_SubmitBatch" operation. +6. Add section for "Container_SubmitBatch" operation. -8. Only for 2021-10-04, change "Name" definition in "BlobPrefix" from: +7. Change "Name" definition in "BlobPrefix" from: "Name": { "$ref": "#/definitions/BlobName" } @@ -52,15 +50,13 @@ enum-types: true 10. Add `x-ms-creation-time` to Blob_Download API responds -11. Only for 2019-02-02, add "", "deleted" to "ListContainersInclude" enum, add "", "tags", "versions", "deletedwithversions", "legalhold", "permissions" to "ListBlobsInclude" enum. - -12. Only for 2021-10-04, add "" to "ListContainersInclude" enum, add "", "permissions" to "ListBlobsInclude" enum. +11. Add "" to "ListContainersInclude" enum, add "", "permissions" to "ListBlobsInclude" enum. -13. Only for 2021-10-04, add "Premium" to "AccessTierRequired" enum and "AccessTierOptional" enum. +12. Add "Premium" to "AccessTierRequired" enum and "AccessTierOptional" enum. Add "Mutable" to "ImmutabilityPolicyMode" at around line #11994 -14. Only for 2021-10-04, add spec for: Blob_GetAccountInfoWithHead, Container_GetAccountInfoWithHead and Service_GetAccountInfoWithHead. +13. Add spec for: Blob_GetAccountInfoWithHead, Container_GetAccountInfoWithHead and Service_GetAccountInfoWithHead. -15. Only for 2021-10-04, change return code from '200' to '202' for service_submitbatch. +14. Change return code from '200' to '202' for service_submitbatch. -16. Only for 2021-10-04, change "AllowedHeaders" and "ExposedHeaders" to be not required. +15. Change "AllowedHeaders" and "ExposedHeaders" to be not required. From 146c973506e4c266df54fdc76a9decfd6a9e1f4f Mon Sep 17 00:00:00 2001 From: Sean Kennett Date: Thu, 23 Mar 2023 23:57:32 +0000 Subject: [PATCH 044/297] Fixed issue for user delegation key when uploading a blob from a container SAS --- ChangeLog.md | 4 ++ .../authentication/IBlobSASSignatureValues.ts | 4 +- tests/blob/oauth.test.ts | 54 +++++++++++++++++++ 3 files changed, 61 insertions(+), 1 deletion(-) diff --git a/ChangeLog.md b/ChangeLog.md index bed51787e..07afbd152 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -11,6 +11,10 @@ General: - Typescript upgraded from 4.2.4 to 4.9.5. - Migrated test pipeline from Node.js 10/12 to Node.js 14/16/18. +Blob: + +- Fixed issue for user delegation key when uploading a blob from a container SAS + Table: - Fixed issue for querying on identifiers starting with underscore. diff --git a/src/blob/authentication/IBlobSASSignatureValues.ts b/src/blob/authentication/IBlobSASSignatureValues.ts index ca4f2ead2..985e3c0ba 100644 --- a/src/blob/authentication/IBlobSASSignatureValues.ts +++ b/src/blob/authentication/IBlobSASSignatureValues.ts @@ -673,7 +673,9 @@ function generateBlobSASBlobSASSignatureWithUDK20201206( getCanonicalName( accountName, blobSASSignatureValues.containerName, - blobSASSignatureValues.blobName + resource === BlobSASResourceType.Blob + ? blobSASSignatureValues.blobName + : "" ), blobSASSignatureValues.signedObjectId, blobSASSignatureValues.signedTenantId, diff --git a/tests/blob/oauth.test.ts b/tests/blob/oauth.test.ts index a6ce726a4..6febeafab 100644 --- a/tests/blob/oauth.test.ts +++ b/tests/blob/oauth.test.ts @@ -241,6 +241,60 @@ describe("Blob OAuth Basic", () => { await containerClient.delete(); }); + it(`Should work with delegation SAS container client doing blob upload @loki @sql`, async () => { + const token = generateJWTToken( + new Date("2019/01/01"), + new Date("2019/01/01"), + new Date("2100/01/01"), + "https://sts.windows-ppe.net/ab1f708d-50f6-404c-a006-d71b2ac7a606/", + "https://storage.azure.com", + "user_impersonation", + "23657296-5cd5-45b0-a809-d972a7f4dfe1", + "dd0d0df1-06c3-436c-8034-4b9a153097ce" + ); + + const serviceClient = new BlobServiceClient( + baseURL, + newPipeline(new SimpleTokenCredential(token), { + retryOptions: { maxTries: 1 }, + // Make sure socket is closed once the operation is done. + keepAliveOptions: { enable: false } + }) + ); + + const startTime = new Date(); + startTime.setHours(startTime.getHours() - 1); + const expiryTime = new Date(); + expiryTime.setDate(expiryTime.getDate() + 1); + + const userDelegationKey = await serviceClient.getUserDelegationKey(startTime, expiryTime); + + const containerName: string = getUniqueName("1container-with-dash") + + const sasExpirytime = new Date(); + sasExpirytime.setHours(sasExpirytime.getHours() + 1); + + const containerSAS = generateBlobSASQueryParameters( + { + containerName: containerName, + expiresOn: sasExpirytime, + permissions: ContainerSASPermissions.parse("racwdl"), + }, + userDelegationKey, + "devstoreaccount1" + ); + + const containerClient = new ContainerClient( + `${serviceClient.url}/${containerName}?${containerSAS}`, + newPipeline(new AnonymousCredential()) + ); + await containerClient.create(); + const blobClient = await containerClient.getBlockBlobClient("test"); + const data = "Test Data"; + await blobClient.upload(data, data.length); + await containerClient.delete(); + }); + it(`Should fail with delegation SAS with invalid time duration @loki @sql`, async () => { const token = generateJWTToken( new Date("2019/01/01"), From 6fad1f7b891975b501a67359da4c1058c0a97905 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 24 Mar 2023 09:31:21 +0800 Subject: [PATCH 045/297] Bump prettier from 2.8.4 to 2.8.6 (#1860) Bumps [prettier](https://github.com/prettier/prettier) from 2.8.4 to 2.8.6. - [Release notes](https://github.com/prettier/prettier/releases) - [Changelog](https://github.com/prettier/prettier/blob/main/CHANGELOG.md) - [Commits](https://github.com/prettier/prettier/compare/2.8.4...2.8.6) --- updated-dependencies: - dependency-name: prettier dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 99f50eba6..99ddc5ca4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8246,9 +8246,9 @@ } }, "node_modules/prettier": { - "version": "2.8.4", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.4.tgz", - "integrity": "sha512-vIS4Rlc2FNh0BySk3Wkd6xmwxB0FpOndW5fisM5H8hsZSxU2VWVB5CWIkIjWvrHjIhxk2g3bfMKM87zNTrZddw==", + "version": "2.8.6", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.6.tgz", + "integrity": "sha512-mtuzdiBbHwPEgl7NxWlqOkithPyp4VN93V7VeHVWBF+ad3I5avc0RVDT4oImXQy9H/AqxA2NSQH8pSxHW6FYbQ==", "dev": true, "bin": { "prettier": "bin-prettier.js" @@ -16407,9 +16407,9 @@ "dev": true }, "prettier": { - "version": "2.8.4", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.4.tgz", - "integrity": "sha512-vIS4Rlc2FNh0BySk3Wkd6xmwxB0FpOndW5fisM5H8hsZSxU2VWVB5CWIkIjWvrHjIhxk2g3bfMKM87zNTrZddw==", + "version": "2.8.6", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.6.tgz", + "integrity": "sha512-mtuzdiBbHwPEgl7NxWlqOkithPyp4VN93V7VeHVWBF+ad3I5avc0RVDT4oImXQy9H/AqxA2NSQH8pSxHW6FYbQ==", "dev": true }, "private": { From d997085e00f9005176f91f67e3a533621f01d7d7 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 24 Mar 2023 09:33:30 +0800 Subject: [PATCH 046/297] Bump jsonwebtoken from 8.5.1 to 9.0.0 (#1777) Bumps [jsonwebtoken](https://github.com/auth0/node-jsonwebtoken) from 8.5.1 to 9.0.0. - [Release notes](https://github.com/auth0/node-jsonwebtoken/releases) - [Changelog](https://github.com/auth0/node-jsonwebtoken/blob/master/CHANGELOG.md) - [Commits](https://github.com/auth0/node-jsonwebtoken/compare/v8.5.1...v9.0.0) --- updated-dependencies: - dependency-name: jsonwebtoken dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 130 +++++++++++++++++++++++++++------------------- package.json | 2 +- 2 files changed, 79 insertions(+), 53 deletions(-) diff --git a/package-lock.json b/package-lock.json index 99ddc5ca4..d06ba7f70 100644 --- a/package-lock.json +++ b/package-lock.json @@ -16,7 +16,7 @@ "express": "^4.16.4", "fs-extra": "^11.1.1", "glob-to-regexp": "^0.4.1", - "jsonwebtoken": "^8.5.1", + "jsonwebtoken": "^9.0.0", "lokijs": "^1.5.6", "morgan": "^1.9.1", "multistream": "^2.1.1", @@ -582,11 +582,40 @@ } } }, + "node_modules/@azure/msal-node/node_modules/jsonwebtoken": { + "version": "8.5.1", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz", + "integrity": "sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w==", + "dependencies": { + "jws": "^3.2.2", + "lodash.includes": "^4.3.0", + "lodash.isboolean": "^3.0.3", + "lodash.isinteger": "^4.0.4", + "lodash.isnumber": "^3.0.3", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.once": "^4.0.0", + "ms": "^2.1.1", + "semver": "^5.6.0" + }, + "engines": { + "node": ">=4", + "npm": ">=1.4.28" + } + }, "node_modules/@azure/msal-node/node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, + "node_modules/@azure/msal-node/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "bin": { + "semver": "bin/semver" + } + }, "node_modules/@azure/msal-node/node_modules/uuid": { "version": "8.3.2", "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", @@ -6267,24 +6296,18 @@ ] }, "node_modules/jsonwebtoken": { - "version": "8.5.1", - "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz", - "integrity": "sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w==", + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.0.tgz", + "integrity": "sha512-tuGfYXxkQGDPnLJ7SibiQgVgeDgfbPq2k2ICcbgqW8WxWLBAxKQM/ZCu/IT8SOSwmaYl4dpTFCW5xZv7YbbWUw==", "dependencies": { "jws": "^3.2.2", - "lodash.includes": "^4.3.0", - "lodash.isboolean": "^3.0.3", - "lodash.isinteger": "^4.0.4", - "lodash.isnumber": "^3.0.3", - "lodash.isplainobject": "^4.0.6", - "lodash.isstring": "^4.0.1", - "lodash.once": "^4.0.0", + "lodash": "^4.17.21", "ms": "^2.1.1", - "semver": "^5.6.0" + "semver": "^7.3.8" }, "engines": { - "node": ">=4", - "npm": ">=1.4.28" + "node": ">=12", + "npm": ">=6" } }, "node_modules/jsonwebtoken/node_modules/ms": { @@ -6292,14 +6315,6 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, - "node_modules/jsonwebtoken/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "bin": { - "semver": "bin/semver" - } - }, "node_modules/jsprim": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", @@ -6826,32 +6841,32 @@ "node_modules/lodash.includes": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", - "integrity": "sha1-YLuYqHy5I8aMoeUTJUgzFISfVT8=" + "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==" }, "node_modules/lodash.isboolean": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", - "integrity": "sha1-bC4XHbKiV82WgC/UOwGyDV9YcPY=" + "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==" }, "node_modules/lodash.isinteger": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", - "integrity": "sha1-YZwK89A/iwTDH1iChAt3sRzWg0M=" + "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==" }, "node_modules/lodash.isnumber": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", - "integrity": "sha1-POdoEMWSjQM1IwGsKHMX8RwLH/w=" + "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==" }, "node_modules/lodash.isplainobject": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", - "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=" + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==" }, "node_modules/lodash.isstring": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", - "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE=" + "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==" }, "node_modules/lodash.merge": { "version": "4.6.2", @@ -6862,7 +6877,7 @@ "node_modules/lodash.once": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", - "integrity": "sha1-DdOXEhPHxW34gJd9UEyI+0cal6w=" + "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==" }, "node_modules/log-update": { "version": "4.0.0", @@ -10479,11 +10494,33 @@ "ms": "2.1.2" } }, + "jsonwebtoken": { + "version": "8.5.1", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz", + "integrity": "sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w==", + "requires": { + "jws": "^3.2.2", + "lodash.includes": "^4.3.0", + "lodash.isboolean": "^3.0.3", + "lodash.isinteger": "^4.0.4", + "lodash.isnumber": "^3.0.3", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.once": "^4.0.0", + "ms": "^2.1.1", + "semver": "^5.6.0" + } + }, "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + }, "uuid": { "version": "8.3.2", "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", @@ -14918,31 +14955,20 @@ "dev": true }, "jsonwebtoken": { - "version": "8.5.1", - "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz", - "integrity": "sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w==", + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.0.tgz", + "integrity": "sha512-tuGfYXxkQGDPnLJ7SibiQgVgeDgfbPq2k2ICcbgqW8WxWLBAxKQM/ZCu/IT8SOSwmaYl4dpTFCW5xZv7YbbWUw==", "requires": { "jws": "^3.2.2", - "lodash.includes": "^4.3.0", - "lodash.isboolean": "^3.0.3", - "lodash.isinteger": "^4.0.4", - "lodash.isnumber": "^3.0.3", - "lodash.isplainobject": "^4.0.6", - "lodash.isstring": "^4.0.1", - "lodash.once": "^4.0.0", + "lodash": "^4.17.21", "ms": "^2.1.1", - "semver": "^5.6.0" + "semver": "^7.3.8" }, "dependencies": { "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" } } }, @@ -15323,32 +15349,32 @@ "lodash.includes": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", - "integrity": "sha1-YLuYqHy5I8aMoeUTJUgzFISfVT8=" + "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==" }, "lodash.isboolean": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", - "integrity": "sha1-bC4XHbKiV82WgC/UOwGyDV9YcPY=" + "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==" }, "lodash.isinteger": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", - "integrity": "sha1-YZwK89A/iwTDH1iChAt3sRzWg0M=" + "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==" }, "lodash.isnumber": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", - "integrity": "sha1-POdoEMWSjQM1IwGsKHMX8RwLH/w=" + "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==" }, "lodash.isplainobject": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", - "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=" + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==" }, "lodash.isstring": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", - "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE=" + "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==" }, "lodash.merge": { "version": "4.6.2", @@ -15359,7 +15385,7 @@ "lodash.once": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", - "integrity": "sha1-DdOXEhPHxW34gJd9UEyI+0cal6w=" + "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==" }, "log-update": { "version": "4.0.0", diff --git a/package.json b/package.json index ba00b3af8..21657f4f0 100644 --- a/package.json +++ b/package.json @@ -27,7 +27,7 @@ "express": "^4.16.4", "fs-extra": "^11.1.1", "glob-to-regexp": "^0.4.1", - "jsonwebtoken": "^8.5.1", + "jsonwebtoken": "^9.0.0", "lokijs": "^1.5.6", "morgan": "^1.9.1", "multistream": "^2.1.1", From 362c3fc3c39f991a5ac3f54006085dacea7edda8 Mon Sep 17 00:00:00 2001 From: Emma Zhu Date: Thu, 23 Mar 2023 18:04:06 +0800 Subject: [PATCH 047/297] Resolve comments --- package.json | 4 +- src/blob/generated/artifacts/mappers.ts | 254 ++++++++++++++---- src/blob/generated/artifacts/models.ts | 238 +++++++++++----- src/blob/generated/artifacts/operation.ts | 1 - src/blob/generated/artifacts/parameters.ts | 66 ++--- .../generated/artifacts/specifications.ts | 116 +++----- .../generated/handlers/IAppendBlobHandler.ts | 4 +- src/blob/generated/handlers/IBlobHandler.ts | 4 +- .../generated/handlers/IBlockBlobHandler.ts | 4 +- .../generated/handlers/IContainerHandler.ts | 7 +- src/blob/generated/handlers/IHandlers.ts | 12 +- .../generated/handlers/IPageBlobHandler.ts | 4 +- .../generated/handlers/IServiceHandler.ts | 4 +- src/blob/generated/handlers/handlerMappers.ts | 12 +- src/blob/handlers/ContainerHandler.ts | 67 ++--- ...rage.json => blob-storage-2021-10-04.json} | 92 +------ swagger/blob.md | 16 +- 17 files changed, 498 insertions(+), 407 deletions(-) rename swagger/{blob-storage.json => blob-storage-2021-10-04.json} (99%) diff --git a/package.json b/package.json index 30f1957dd..7e5e6ff9a 100644 --- a/package.json +++ b/package.json @@ -273,7 +273,7 @@ "docker:publish-manifest-latest": "cross-var docker manifest push xstoreazurite.azurecr.io/public/azure-storage/azurite:latest", "prepare": "npm run build", "build": "tsc", - "build:autorest:debug": "autorest ./swagger/blob.md --typescript --typescript.debugger --use=E:/GitHub/XiaoningLiu/autorest.typescript.server", + "build:autorest:debug": "autorest ./swagger/blob.md --typescript --typescript.debugger --use=S:/GitHub/XiaoningLiu/autorest.typescript.server", "build:autorest:blob": "autorest ./swagger/blob.md --typescript --use=S:/GitHub/XiaoningLiu/autorest.typescript.server", "build:autorest:queue": "autorest ./swagger/queue.md --typescript --use=S:/GitHub/XiaoningLiu/autorest.typescript.server", "build:autorest:table": "autorest ./swagger/table.md --typescript --use=S:/GitHub/XiaoningLiu/autorest.typescript.server", @@ -320,4 +320,4 @@ "url": "https://github.com/azure/azurite/issues" }, "homepage": "https://github.com/azure/azurite#readme" -} +} \ No newline at end of file diff --git a/src/blob/generated/artifacts/mappers.ts b/src/blob/generated/artifacts/mappers.ts index ffd7cd416..accf7b9d6 100644 --- a/src/blob/generated/artifacts/mappers.ts +++ b/src/blob/generated/artifacts/mappers.ts @@ -7,7 +7,7 @@ */ // tslint:disable:object-literal-sort-keys -import * as msRest from '@azure/ms-rest-js'; +import * as msRest from "@azure/ms-rest-js"; export const KeyInfo: msRest.CompositeMapper = { serializedName: "KeyInfo", @@ -1399,7 +1399,6 @@ export const CorsRule: msRest.CompositeMapper = { }, allowedHeaders: { xmlName: "AllowedHeaders", - required: false, serializedName: "AllowedHeaders", type: { name: "String" @@ -1407,7 +1406,6 @@ export const CorsRule: msRest.CompositeMapper = { }, exposedHeaders: { xmlName: "ExposedHeaders", - required: false, serializedName: "ExposedHeaders", type: { name: "String" @@ -2566,6 +2564,78 @@ export const ServiceGetAccountInfoHeaders: msRest.CompositeMapper = { } }; +export const ServiceGetAccountInfoWithHeadHeaders: msRest.CompositeMapper = { + serializedName: "service-getaccountinfowithhead-headers", + type: { + name: "Composite", + className: "ServiceGetAccountInfoWithHeadHeaders", + modelProperties: { + clientRequestId: { + serializedName: "x-ms-client-request-id", + type: { + name: "String" + } + }, + requestId: { + serializedName: "x-ms-request-id", + type: { + name: "String" + } + }, + version: { + serializedName: "x-ms-version", + type: { + name: "String" + } + }, + date: { + serializedName: "date", + type: { + name: "DateTimeRfc1123" + } + }, + skuName: { + serializedName: "x-ms-sku-name", + type: { + name: "Enum", + allowedValues: [ + "Standard_LRS", + "Standard_GRS", + "Standard_RAGRS", + "Standard_ZRS", + "Premium_LRS" + ] + } + }, + accountKind: { + serializedName: "x-ms-account-kind", + type: { + name: "Enum", + allowedValues: [ + "Storage", + "BlobStorage", + "StorageV2", + "FileStorage", + "BlockBlobStorage" + ] + } + }, + isHierarchicalNamespaceEnabled: { + serializedName: "x-ms-is-hns-enabled", + type: { + name: "Boolean" + } + }, + errorCode: { + serializedName: "x-ms-error-code", + type: { + name: "String" + } + } + } + } +}; + export const ServiceSubmitBatchHeaders: msRest.CompositeMapper = { serializedName: "service-submitbatch-headers", type: { @@ -2825,11 +2895,11 @@ export const ContainerGetPropertiesHeaders: msRest.CompositeMapper = { } }; -export const ContainerGetPropertiesHeaders1: msRest.CompositeMapper = { - serializedName: "container-getproperties-headers", +export const ContainerGetPropertiesWithHeadHeaders: msRest.CompositeMapper = { + serializedName: "container-getpropertieswithhead-headers", type: { name: "Composite", - className: "ContainerGetPropertiesHeaders1", + className: "ContainerGetPropertiesWithHeadHeaders", modelProperties: { metadata: { serializedName: "x-ms-meta", @@ -3200,46 +3270,6 @@ export const ContainerRestoreHeaders: msRest.CompositeMapper = { } }; -export const ContainerRenameHeaders: msRest.CompositeMapper = { - serializedName: "container-rename-headers", - type: { - name: "Composite", - className: "ContainerRenameHeaders", - modelProperties: { - clientRequestId: { - serializedName: "x-ms-client-request-id", - type: { - name: "String" - } - }, - requestId: { - serializedName: "x-ms-request-id", - type: { - name: "String" - } - }, - version: { - serializedName: "x-ms-version", - type: { - name: "String" - } - }, - date: { - serializedName: "date", - type: { - name: "DateTimeRfc1123" - } - }, - errorCode: { - serializedName: "x-ms-error-code", - type: { - name: "String" - } - } - } - } -}; - export const ContainerSubmitBatchHeaders: msRest.CompositeMapper = { serializedName: "container-submitbatch-headers", type: { @@ -3756,6 +3786,72 @@ export const ContainerGetAccountInfoHeaders: msRest.CompositeMapper = { } }; +export const ContainerGetAccountInfoWithHeadHeaders: msRest.CompositeMapper = { + serializedName: "container-getaccountinfowithhead-headers", + type: { + name: "Composite", + className: "ContainerGetAccountInfoWithHeadHeaders", + modelProperties: { + clientRequestId: { + serializedName: "x-ms-client-request-id", + type: { + name: "String" + } + }, + requestId: { + serializedName: "x-ms-request-id", + type: { + name: "String" + } + }, + version: { + serializedName: "x-ms-version", + type: { + name: "String" + } + }, + date: { + serializedName: "date", + type: { + name: "DateTimeRfc1123" + } + }, + skuName: { + serializedName: "x-ms-sku-name", + type: { + name: "Enum", + allowedValues: [ + "Standard_LRS", + "Standard_GRS", + "Standard_RAGRS", + "Standard_ZRS", + "Premium_LRS" + ] + } + }, + accountKind: { + serializedName: "x-ms-account-kind", + type: { + name: "Enum", + allowedValues: [ + "Storage", + "BlobStorage", + "StorageV2", + "FileStorage", + "BlockBlobStorage" + ] + } + }, + errorCode: { + serializedName: "x-ms-error-code", + type: { + name: "String" + } + } + } + } +}; + export const BlobDownloadHeaders: msRest.CompositeMapper = { serializedName: "blob-download-headers", type: { @@ -5825,6 +5921,72 @@ export const BlobGetAccountInfoHeaders: msRest.CompositeMapper = { } }; +export const BlobGetAccountInfoWithHeadHeaders: msRest.CompositeMapper = { + serializedName: "blob-getaccountinfowithhead-headers", + type: { + name: "Composite", + className: "BlobGetAccountInfoWithHeadHeaders", + modelProperties: { + clientRequestId: { + serializedName: "x-ms-client-request-id", + type: { + name: "String" + } + }, + requestId: { + serializedName: "x-ms-request-id", + type: { + name: "String" + } + }, + version: { + serializedName: "x-ms-version", + type: { + name: "String" + } + }, + date: { + serializedName: "date", + type: { + name: "DateTimeRfc1123" + } + }, + skuName: { + serializedName: "x-ms-sku-name", + type: { + name: "Enum", + allowedValues: [ + "Standard_LRS", + "Standard_GRS", + "Standard_RAGRS", + "Standard_ZRS", + "Premium_LRS" + ] + } + }, + accountKind: { + serializedName: "x-ms-account-kind", + type: { + name: "Enum", + allowedValues: [ + "Storage", + "BlobStorage", + "StorageV2", + "FileStorage", + "BlockBlobStorage" + ] + } + }, + errorCode: { + serializedName: "x-ms-error-code", + type: { + name: "String" + } + } + } + } +}; + export const BlockBlobStageBlockHeaders: msRest.CompositeMapper = { serializedName: "blockblob-stageblock-headers", type: { diff --git a/src/blob/generated/artifacts/models.ts b/src/blob/generated/artifacts/models.ts index 373d75a0d..e362ab505 100644 --- a/src/blob/generated/artifacts/models.ts +++ b/src/blob/generated/artifacts/models.ts @@ -440,12 +440,12 @@ export interface CorsRule { /** * the request headers that the origin domain may specify on the CORS request. */ - allowedHeaders: string; + allowedHeaders?: string; /** * The response headers that may be sent in the response to the CORS request and exposed by the * browser to the request issuer */ - exposedHeaders: string; + exposedHeaders?: string; /** * The maximum amount time that a browser should cache the preflight OPTIONS request. */ @@ -1107,7 +1107,7 @@ export interface ContainerGetPropertiesOptionalParams { /** * Optional Parameters. */ -export interface ContainerGetProperties1OptionalParams { +export interface ContainerGetPropertiesWithHeadOptionalParams { /** * The timeout parameter is expressed in seconds. For more information, see Setting @@ -1267,28 +1267,6 @@ export interface ContainerRestoreOptionalParams { deletedContainerVersion?: string; } -/** - * Optional Parameters. - */ -export interface ContainerRenameOptionalParams { - /** - * The timeout parameter is expressed in seconds. For more information, see Setting - * Timeouts for Blob Service Operations. - */ - timeout?: number; - /** - * Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the - * analytics logs when storage analytics logging is enabled. - */ - requestId?: string; - /** - * A lease ID for the source path. If specified, the source path must have an active lease and - * the lease ID must match. - */ - sourceLeaseId?: string; -} - /** * Optional Parameters. */ @@ -3531,6 +3509,47 @@ export interface ServiceGetAccountInfoHeaders { errorCode?: string; } +/** + * Defines headers for GetAccountInfoWithHead operation. + */ +export interface ServiceGetAccountInfoWithHeadHeaders { + /** + * If a client request id header is sent in the request, this header will be present in the + * response with the same value. + */ + clientRequestId?: string; + /** + * This header uniquely identifies the request that was made and can be used for troubleshooting + * the request. + */ + requestId?: string; + /** + * Indicates the version of the Blob service used to execute the request. This header is returned + * for requests made against version 2009-09-19 and above. + */ + version?: string; + /** + * UTC date/time value generated by the service that indicates the time at which the response was + * initiated + */ + date?: Date; + /** + * Identifies the sku name of the account. Possible values include: 'Standard_LRS', + * 'Standard_GRS', 'Standard_RAGRS', 'Standard_ZRS', 'Premium_LRS' + */ + skuName?: SkuName; + /** + * Identifies the account kind. Possible values include: 'Storage', 'BlobStorage', 'StorageV2', + * 'FileStorage', 'BlockBlobStorage' + */ + accountKind?: AccountKind; + /** + * Version 2019-07-07 and newer. Indicates if the account has a hierarchical namespace enabled. + */ + isHierarchicalNamespaceEnabled?: boolean; + errorCode?: string; +} + /** * Defines headers for SubmitBatch operation. */ @@ -3697,9 +3716,9 @@ export interface ContainerGetPropertiesHeaders { } /** - * Defines headers for GetProperties operation. + * Defines headers for GetPropertiesWithHead operation. */ -export interface ContainerGetPropertiesHeaders1 { +export interface ContainerGetPropertiesWithHeadHeaders { metadata?: { [propertyName: string]: string }; /** * The ETag contains a value that you can use to perform operations conditionally. If the request @@ -3947,33 +3966,6 @@ export interface ContainerRestoreHeaders { errorCode?: string; } -/** - * Defines headers for Rename operation. - */ -export interface ContainerRenameHeaders { - /** - * If a client request id header is sent in the request, this header will be present in the - * response with the same value. - */ - clientRequestId?: string; - /** - * This header uniquely identifies the request that was made and can be used for troubleshooting - * the request. - */ - requestId?: string; - /** - * Indicates the version of the Blob service used to execute the request. This header is returned - * for requests made against version 2009-09-19 and above. - */ - version?: string; - /** - * UTC date/time value generated by the service that indicates the time at which the response was - * initiated - */ - date?: Date; - errorCode?: string; -} - /** * Defines headers for SubmitBatch operation. */ @@ -4328,6 +4320,43 @@ export interface ContainerGetAccountInfoHeaders { errorCode?: string; } +/** + * Defines headers for GetAccountInfoWithHead operation. + */ +export interface ContainerGetAccountInfoWithHeadHeaders { + /** + * If a client request id header is sent in the request, this header will be present in the + * response with the same value. + */ + clientRequestId?: string; + /** + * This header uniquely identifies the request that was made and can be used for troubleshooting + * the request. + */ + requestId?: string; + /** + * Indicates the version of the Blob service used to execute the request. This header is returned + * for requests made against version 2009-09-19 and above. + */ + version?: string; + /** + * UTC date/time value generated by the service that indicates the time at which the response was + * initiated + */ + date?: Date; + /** + * Identifies the sku name of the account. Possible values include: 'Standard_LRS', + * 'Standard_GRS', 'Standard_RAGRS', 'Standard_ZRS', 'Premium_LRS' + */ + skuName?: SkuName; + /** + * Identifies the account kind. Possible values include: 'Storage', 'BlobStorage', 'StorageV2', + * 'FileStorage', 'BlockBlobStorage' + */ + accountKind?: AccountKind; + errorCode?: string; +} + /** * Defines headers for Download operation. */ @@ -5830,6 +5859,43 @@ export interface BlobGetAccountInfoHeaders { errorCode?: string; } +/** + * Defines headers for GetAccountInfoWithHead operation. + */ +export interface BlobGetAccountInfoWithHeadHeaders { + /** + * If a client request id header is sent in the request, this header will be present in the + * response with the same value. + */ + clientRequestId?: string; + /** + * This header uniquely identifies the request that was made and can be used for troubleshooting + * the request. + */ + requestId?: string; + /** + * Indicates the version of the Blob service used to execute the request. This header is returned + * for requests made against version 2009-09-19 and above. + */ + version?: string; + /** + * UTC date/time value generated by the service that indicates the time at which the response was + * initiated + */ + date?: Date; + /** + * Identifies the sku name of the account. Possible values include: 'Standard_LRS', + * 'Standard_GRS', 'Standard_RAGRS', 'Standard_ZRS', 'Premium_LRS' + */ + skuName?: SkuName; + /** + * Identifies the account kind. Possible values include: 'Storage', 'BlobStorage', 'StorageV2', + * 'FileStorage', 'BlockBlobStorage' + */ + accountKind?: AccountKind; + errorCode?: string; +} + /** * Defines headers for StageBlock operation. */ @@ -8097,6 +8163,26 @@ export enum Version70 { TwoZeroTwoOneHyphenMinusOneZeroHyphenMinusZeroFour = '2021-10-04', } +/** + * Defines values for Version71. + * Possible values include: '2021-10-04' + * @readonly + * @enum {string} + */ +export enum Version71 { + TwoZeroTwoOneHyphenMinusOneZeroHyphenMinusZeroFour = '2021-10-04', +} + +/** + * Defines values for Version72. + * Possible values include: '2021-10-04' + * @readonly + * @enum {string} + */ +export enum Version72 { + TwoZeroTwoOneHyphenMinusOneZeroHyphenMinusZeroFour = '2021-10-04', +} + /** * Contains response data for the setProperties operation. */ @@ -8157,6 +8243,16 @@ export type ServiceGetAccountInfoResponse = ServiceGetAccountInfoHeaders & { statusCode: 200; }; +/** + * Contains response data for the getAccountInfoWithHead operation. + */ +export type ServiceGetAccountInfoWithHeadResponse = ServiceGetAccountInfoWithHeadHeaders & { + /** + * The response status code. + */ + statusCode: 200; +}; + /** * Contains response data for the submitBatch operation. */ @@ -8203,9 +8299,9 @@ export type ContainerGetPropertiesResponse = ContainerGetPropertiesHeaders & { }; /** - * Contains response data for the getProperties1 operation. + * Contains response data for the getPropertiesWithHead operation. */ -export type ContainerGetPropertiesHeaders12 = ContainerGetPropertiesHeaders1 & { +export type ContainerGetPropertiesWithHeadResponse = ContainerGetPropertiesWithHeadHeaders & { /** * The response status code. */ @@ -8262,16 +8358,6 @@ export type ContainerRestoreResponse = ContainerRestoreHeaders & { statusCode: 201; }; -/** - * Contains response data for the rename operation. - */ -export type ContainerRenameResponse = ContainerRenameHeaders & { - /** - * The response status code. - */ - statusCode: 200; -}; - /** * Contains response data for the submitBatch operation. */ @@ -8377,6 +8463,16 @@ export type ContainerGetAccountInfoResponse = ContainerGetAccountInfoHeaders & { statusCode: 200; }; +/** + * Contains response data for the getAccountInfoWithHead operation. + */ +export type ContainerGetAccountInfoWithHeadResponse = ContainerGetAccountInfoWithHeadHeaders & { + /** + * The response status code. + */ + statusCode: 200; +}; + /** * Contains response data for the download operation. */ @@ -8592,6 +8688,16 @@ export type BlobGetAccountInfoResponse = BlobGetAccountInfoHeaders & { statusCode: 200; }; +/** + * Contains response data for the getAccountInfoWithHead operation. + */ +export type BlobGetAccountInfoWithHeadResponse = BlobGetAccountInfoWithHeadHeaders & { + /** + * The response status code. + */ + statusCode: 200; +}; + /** * Contains response data for the query operation. */ diff --git a/src/blob/generated/artifacts/operation.ts b/src/blob/generated/artifacts/operation.ts index 386a66be7..fe710b0ac 100644 --- a/src/blob/generated/artifacts/operation.ts +++ b/src/blob/generated/artifacts/operation.ts @@ -24,7 +24,6 @@ export enum Operation { Container_GetAccessPolicy, Container_SetAccessPolicy, Container_Restore, - Container_Rename, Container_SubmitBatch, Container_FilterBlobs, Container_AcquireLease, diff --git a/src/blob/generated/artifacts/parameters.ts b/src/blob/generated/artifacts/parameters.ts index aaa867661..9f5509b5f 100644 --- a/src/blob/generated/artifacts/parameters.ts +++ b/src/blob/generated/artifacts/parameters.ts @@ -11,7 +11,7 @@ // tslint:disable:quotemark // tslint:disable:object-literal-sort-keys -import * as msRest from '@azure/ms-rest-js'; +import * as msRest from "@azure/ms-rest-js"; export const access: msRest.OperationParameter = { parameterPath: [ @@ -329,7 +329,7 @@ export const comp10: msRest.OperationQueryParameter = { required: true, isConstant: true, serializedName: "comp", - defaultValue: 'lease', + defaultValue: 'expiry', type: { name: "String" } @@ -341,7 +341,7 @@ export const comp11: msRest.OperationQueryParameter = { required: true, isConstant: true, serializedName: "comp", - defaultValue: 'expiry', + defaultValue: 'immutabilityPolicies', type: { name: "String" } @@ -353,7 +353,7 @@ export const comp12: msRest.OperationQueryParameter = { required: true, isConstant: true, serializedName: "comp", - defaultValue: 'immutabilityPolicies', + defaultValue: 'legalhold', type: { name: "String" } @@ -365,7 +365,7 @@ export const comp13: msRest.OperationQueryParameter = { required: true, isConstant: true, serializedName: "comp", - defaultValue: 'legalhold', + defaultValue: 'snapshot', type: { name: "String" } @@ -377,7 +377,7 @@ export const comp14: msRest.OperationQueryParameter = { required: true, isConstant: true, serializedName: "comp", - defaultValue: 'snapshot', + defaultValue: 'copy', type: { name: "String" } @@ -389,7 +389,7 @@ export const comp15: msRest.OperationQueryParameter = { required: true, isConstant: true, serializedName: "comp", - defaultValue: 'copy', + defaultValue: 'tier', type: { name: "String" } @@ -401,7 +401,7 @@ export const comp16: msRest.OperationQueryParameter = { required: true, isConstant: true, serializedName: "comp", - defaultValue: 'tier', + defaultValue: 'query', type: { name: "String" } @@ -413,7 +413,7 @@ export const comp17: msRest.OperationQueryParameter = { required: true, isConstant: true, serializedName: "comp", - defaultValue: 'query', + defaultValue: 'tags', type: { name: "String" } @@ -425,7 +425,7 @@ export const comp18: msRest.OperationQueryParameter = { required: true, isConstant: true, serializedName: "comp", - defaultValue: 'tags', + defaultValue: 'page', type: { name: "String" } @@ -437,7 +437,7 @@ export const comp19: msRest.OperationQueryParameter = { required: true, isConstant: true, serializedName: "comp", - defaultValue: 'page', + defaultValue: 'pagelist', type: { name: "String" } @@ -456,18 +456,6 @@ export const comp2: msRest.OperationQueryParameter = { } }; export const comp20: msRest.OperationQueryParameter = { - parameterPath: "comp", - mapper: { - required: true, - isConstant: true, - serializedName: "comp", - defaultValue: 'pagelist', - type: { - name: "String" - } - } -}; -export const comp21: msRest.OperationQueryParameter = { parameterPath: "comp", mapper: { required: true, @@ -479,7 +467,7 @@ export const comp21: msRest.OperationQueryParameter = { } } }; -export const comp22: msRest.OperationQueryParameter = { +export const comp21: msRest.OperationQueryParameter = { parameterPath: "comp", mapper: { required: true, @@ -491,7 +479,7 @@ export const comp22: msRest.OperationQueryParameter = { } } }; -export const comp23: msRest.OperationQueryParameter = { +export const comp22: msRest.OperationQueryParameter = { parameterPath: "comp", mapper: { required: true, @@ -503,7 +491,7 @@ export const comp23: msRest.OperationQueryParameter = { } } }; -export const comp24: msRest.OperationQueryParameter = { +export const comp23: msRest.OperationQueryParameter = { parameterPath: "comp", mapper: { required: true, @@ -515,7 +503,7 @@ export const comp24: msRest.OperationQueryParameter = { } } }; -export const comp25: msRest.OperationQueryParameter = { +export const comp24: msRest.OperationQueryParameter = { parameterPath: "comp", mapper: { required: true, @@ -605,7 +593,7 @@ export const comp9: msRest.OperationQueryParameter = { required: true, isConstant: true, serializedName: "comp", - defaultValue: 'rename', + defaultValue: 'lease', type: { name: "String" } @@ -1437,16 +1425,6 @@ export const snapshot: msRest.OperationQueryParameter = { } } }; -export const sourceContainerName: msRest.OperationParameter = { - parameterPath: "sourceContainerName", - mapper: { - required: true, - serializedName: "x-ms-source-container-name", - type: { - name: "String" - } - } -}; export const sourceContentcrc64: msRest.OperationParameter = { parameterPath: [ "options", @@ -1536,18 +1514,6 @@ export const sourceIfUnmodifiedSince: msRest.OperationParameter = { } } }; -export const sourceLeaseId: msRest.OperationParameter = { - parameterPath: [ - "options", - "sourceLeaseId" - ], - mapper: { - serializedName: "x-ms-source-lease-id", - type: { - name: "String" - } - } -}; export const sourceRange0: msRest.OperationParameter = { parameterPath: "sourceRange", mapper: { diff --git a/src/blob/generated/artifacts/specifications.ts b/src/blob/generated/artifacts/specifications.ts index 08953f547..c0b1f17e2 100644 --- a/src/blob/generated/artifacts/specifications.ts +++ b/src/blob/generated/artifacts/specifications.ts @@ -9,11 +9,11 @@ */ // tslint:disable:object-literal-sort-keys -import * as msRest from '@azure/ms-rest-js'; +import * as msRest from "@azure/ms-rest-js"; -import * as Mappers from './mappers'; -import { Operation } from './operation'; -import * as Parameters from './parameters'; +import * as Mappers from "./mappers"; +import { Operation } from "./operation"; +import * as Parameters from "./parameters"; const serializer = new msRest.Serializer(Mappers, true); // specifications for new method group start @@ -195,7 +195,7 @@ const serviceGetAccountInfoOperationSpec: msRest.OperationSpec = { }; const serviceGetAccountInfoWithHeadOperationSpec: msRest.OperationSpec = { - httpMethod: "GET", + httpMethod: "HEAD", urlParameters: [ Parameters.url ], @@ -208,7 +208,7 @@ const serviceGetAccountInfoWithHeadOperationSpec: msRest.OperationSpec = { ], responses: { 200: { - headersMapper: Mappers.ServiceGetAccountInfoHeaders + headersMapper: Mappers.ServiceGetAccountInfoWithHeadHeaders }, default: { bodyMapper: Mappers.StorageError @@ -370,7 +370,7 @@ const containerGetPropertiesWithHeadOperationSpec: msRest.OperationSpec = { ], responses: { 200: { - headersMapper: Mappers.ContainerGetPropertiesHeaders1 + headersMapper: Mappers.ContainerGetPropertiesWithHeadHeaders }, default: { bodyMapper: Mappers.StorageError @@ -566,36 +566,6 @@ const containerRestoreOperationSpec: msRest.OperationSpec = { serializer }; -const containerRenameOperationSpec: msRest.OperationSpec = { - httpMethod: "PUT", - path: "{containerName}", - urlParameters: [ - Parameters.url, - Parameters.containerName - ], - queryParameters: [ - Parameters.timeout, - Parameters.restype2, - Parameters.comp9 - ], - headerParameters: [ - Parameters.version, - Parameters.requestId, - Parameters.sourceContainerName, - Parameters.sourceLeaseId - ], - responses: { - 200: { - headersMapper: Mappers.ContainerRenameHeaders - }, - default: { - bodyMapper: Mappers.StorageError - } - }, - isXML: true, - serializer -}; - const containerSubmitBatchOperationSpec: msRest.OperationSpec = { httpMethod: "POST", path: "{containerName}", @@ -685,7 +655,7 @@ const containerAcquireLeaseOperationSpec: msRest.OperationSpec = { ], queryParameters: [ Parameters.timeout, - Parameters.comp10, + Parameters.comp9, Parameters.restype2 ], headerParameters: [ @@ -718,7 +688,7 @@ const containerReleaseLeaseOperationSpec: msRest.OperationSpec = { ], queryParameters: [ Parameters.timeout, - Parameters.comp10, + Parameters.comp9, Parameters.restype2 ], headerParameters: [ @@ -750,7 +720,7 @@ const containerRenewLeaseOperationSpec: msRest.OperationSpec = { ], queryParameters: [ Parameters.timeout, - Parameters.comp10, + Parameters.comp9, Parameters.restype2 ], headerParameters: [ @@ -782,7 +752,7 @@ const containerBreakLeaseOperationSpec: msRest.OperationSpec = { ], queryParameters: [ Parameters.timeout, - Parameters.comp10, + Parameters.comp9, Parameters.restype2 ], headerParameters: [ @@ -814,7 +784,7 @@ const containerChangeLeaseOperationSpec: msRest.OperationSpec = { ], queryParameters: [ Parameters.timeout, - Parameters.comp10, + Parameters.comp9, Parameters.restype2 ], headerParameters: [ @@ -931,7 +901,6 @@ const containerGetAccountInfoOperationSpec: msRest.OperationSpec = { serializer }; - const containerGetAccountInfoWithHeadOperationSpec: msRest.OperationSpec = { httpMethod: "HEAD", path: "{containerName}", @@ -948,7 +917,7 @@ const containerGetAccountInfoWithHeadOperationSpec: msRest.OperationSpec = { ], responses: { 200: { - headersMapper: Mappers.ContainerGetAccountInfoHeaders + headersMapper: Mappers.ContainerGetAccountInfoWithHeadHeaders }, default: { bodyMapper: Mappers.StorageError @@ -1128,7 +1097,7 @@ const blobSetExpiryOperationSpec: msRest.OperationSpec = { ], queryParameters: [ Parameters.timeout, - Parameters.comp11 + Parameters.comp10 ], headerParameters: [ Parameters.version, @@ -1198,7 +1167,7 @@ const blobSetImmutabilityPolicyOperationSpec: msRest.OperationSpec = { ], queryParameters: [ Parameters.timeout, - Parameters.comp12 + Parameters.comp11 ], headerParameters: [ Parameters.version, @@ -1229,7 +1198,7 @@ const blobDeleteImmutabilityPolicyOperationSpec: msRest.OperationSpec = { ], queryParameters: [ Parameters.timeout, - Parameters.comp12 + Parameters.comp11 ], headerParameters: [ Parameters.version, @@ -1257,7 +1226,7 @@ const blobSetLegalHoldOperationSpec: msRest.OperationSpec = { ], queryParameters: [ Parameters.timeout, - Parameters.comp13 + Parameters.comp12 ], headerParameters: [ Parameters.version, @@ -1325,7 +1294,7 @@ const blobAcquireLeaseOperationSpec: msRest.OperationSpec = { ], queryParameters: [ Parameters.timeout, - Parameters.comp10 + Parameters.comp9 ], headerParameters: [ Parameters.duration, @@ -1361,7 +1330,7 @@ const blobReleaseLeaseOperationSpec: msRest.OperationSpec = { ], queryParameters: [ Parameters.timeout, - Parameters.comp10 + Parameters.comp9 ], headerParameters: [ Parameters.leaseId1, @@ -1396,7 +1365,7 @@ const blobRenewLeaseOperationSpec: msRest.OperationSpec = { ], queryParameters: [ Parameters.timeout, - Parameters.comp10 + Parameters.comp9 ], headerParameters: [ Parameters.leaseId1, @@ -1431,7 +1400,7 @@ const blobChangeLeaseOperationSpec: msRest.OperationSpec = { ], queryParameters: [ Parameters.timeout, - Parameters.comp10 + Parameters.comp9 ], headerParameters: [ Parameters.leaseId1, @@ -1467,7 +1436,7 @@ const blobBreakLeaseOperationSpec: msRest.OperationSpec = { ], queryParameters: [ Parameters.timeout, - Parameters.comp10 + Parameters.comp9 ], headerParameters: [ Parameters.breakPeriod, @@ -1502,7 +1471,7 @@ const blobCreateSnapshotOperationSpec: msRest.OperationSpec = { ], queryParameters: [ Parameters.timeout, - Parameters.comp14 + Parameters.comp13 ], headerParameters: [ Parameters.metadata, @@ -1638,7 +1607,7 @@ const blobAbortCopyFromURLOperationSpec: msRest.OperationSpec = { queryParameters: [ Parameters.copyId, Parameters.timeout, - Parameters.comp15 + Parameters.comp14 ], headerParameters: [ Parameters.version, @@ -1670,7 +1639,7 @@ const blobSetTierOperationSpec: msRest.OperationSpec = { Parameters.snapshot, Parameters.versionId, Parameters.timeout, - Parameters.comp16 + Parameters.comp15 ], headerParameters: [ Parameters.tier1, @@ -1739,7 +1708,7 @@ const blobGetAccountInfoWithHeadOperationSpec: msRest.OperationSpec = { ], responses: { 200: { - headersMapper: Mappers.BlobGetAccountInfoHeaders + headersMapper: Mappers.BlobGetAccountInfoWithHeadHeaders }, default: { bodyMapper: Mappers.StorageError @@ -1760,7 +1729,7 @@ const blobQueryOperationSpec: msRest.OperationSpec = { queryParameters: [ Parameters.snapshot, Parameters.timeout, - Parameters.comp17 + Parameters.comp16 ], headerParameters: [ Parameters.version, @@ -1822,7 +1791,7 @@ const blobGetTagsOperationSpec: msRest.OperationSpec = { Parameters.timeout, Parameters.snapshot, Parameters.versionId, - Parameters.comp18 + Parameters.comp17 ], headerParameters: [ Parameters.version, @@ -1854,7 +1823,7 @@ const blobSetTagsOperationSpec: msRest.OperationSpec = { queryParameters: [ Parameters.timeout, Parameters.versionId, - Parameters.comp18 + Parameters.comp17 ], headerParameters: [ Parameters.version, @@ -1948,7 +1917,7 @@ const pageBlobUploadPagesOperationSpec: msRest.OperationSpec = { ], queryParameters: [ Parameters.timeout, - Parameters.comp19 + Parameters.comp18 ], headerParameters: [ Parameters.contentLength, @@ -2005,7 +1974,7 @@ const pageBlobClearPagesOperationSpec: msRest.OperationSpec = { ], queryParameters: [ Parameters.timeout, - Parameters.comp19 + Parameters.comp18 ], headerParameters: [ Parameters.contentLength, @@ -2049,7 +2018,7 @@ const pageBlobUploadPagesFromURLOperationSpec: msRest.OperationSpec = { ], queryParameters: [ Parameters.timeout, - Parameters.comp19 + Parameters.comp18 ], headerParameters: [ Parameters.sourceUrl, @@ -2105,7 +2074,7 @@ const pageBlobGetPageRangesOperationSpec: msRest.OperationSpec = { Parameters.timeout, Parameters.marker, Parameters.maxresults, - Parameters.comp20 + Parameters.comp19 ], headerParameters: [ Parameters.range0, @@ -2145,7 +2114,7 @@ const pageBlobGetPageRangesDiffOperationSpec: msRest.OperationSpec = { Parameters.prevsnapshot, Parameters.marker, Parameters.maxresults, - Parameters.comp20 + Parameters.comp19 ], headerParameters: [ Parameters.prevSnapshotUrl, @@ -2257,7 +2226,7 @@ const pageBlobCopyIncrementalOperationSpec: msRest.OperationSpec = { ], queryParameters: [ Parameters.timeout, - Parameters.comp21 + Parameters.comp20 ], headerParameters: [ Parameters.copySource, @@ -2342,7 +2311,7 @@ const appendBlobAppendBlockOperationSpec: msRest.OperationSpec = { ], queryParameters: [ Parameters.timeout, - Parameters.comp22 + Parameters.comp21 ], headerParameters: [ Parameters.contentLength, @@ -2396,7 +2365,7 @@ const appendBlobAppendBlockFromUrlOperationSpec: msRest.OperationSpec = { ], queryParameters: [ Parameters.timeout, - Parameters.comp22 + Parameters.comp21 ], headerParameters: [ Parameters.sourceUrl, @@ -2447,7 +2416,7 @@ const appendBlobSealOperationSpec: msRest.OperationSpec = { ], queryParameters: [ Parameters.timeout, - Parameters.comp23 + Parameters.comp22 ], headerParameters: [ Parameters.version, @@ -2606,7 +2575,7 @@ const blockBlobStageBlockOperationSpec: msRest.OperationSpec = { queryParameters: [ Parameters.blockId, Parameters.timeout, - Parameters.comp24 + Parameters.comp23 ], headerParameters: [ Parameters.contentLength, @@ -2654,7 +2623,7 @@ const blockBlobStageBlockFromURLOperationSpec: msRest.OperationSpec = { queryParameters: [ Parameters.blockId, Parameters.timeout, - Parameters.comp24 + Parameters.comp23 ], headerParameters: [ Parameters.contentLength, @@ -2697,7 +2666,7 @@ const blockBlobCommitBlockListOperationSpec: msRest.OperationSpec = { ], queryParameters: [ Parameters.timeout, - Parameters.comp25 + Parameters.comp24 ], headerParameters: [ Parameters.transactionalContentMD5, @@ -2759,7 +2728,7 @@ const blockBlobGetBlockListOperationSpec: msRest.OperationSpec = { Parameters.snapshot, Parameters.listType, Parameters.timeout, - Parameters.comp25 + Parameters.comp24 ], headerParameters: [ Parameters.version, @@ -2798,7 +2767,6 @@ Specifications[Operation.Container_SetMetadata] = containerSetMetadataOperationS Specifications[Operation.Container_GetAccessPolicy] = containerGetAccessPolicyOperationSpec; Specifications[Operation.Container_SetAccessPolicy] = containerSetAccessPolicyOperationSpec; Specifications[Operation.Container_Restore] = containerRestoreOperationSpec; -Specifications[Operation.Container_Rename] = containerRenameOperationSpec; Specifications[Operation.Container_SubmitBatch] = containerSubmitBatchOperationSpec; Specifications[Operation.Container_FilterBlobs] = containerFilterBlobsOperationSpec; Specifications[Operation.Container_AcquireLease] = containerAcquireLeaseOperationSpec; diff --git a/src/blob/generated/handlers/IAppendBlobHandler.ts b/src/blob/generated/handlers/IAppendBlobHandler.ts index b3fa59e65..a945212cb 100644 --- a/src/blob/generated/handlers/IAppendBlobHandler.ts +++ b/src/blob/generated/handlers/IAppendBlobHandler.ts @@ -9,8 +9,8 @@ */ // tslint:disable:max-line-length -import * as Models from '../artifacts/models'; -import Context from '../Context'; +import * as Models from "../artifacts/models"; +import Context from "../Context"; export default interface IAppendBlobHandler { create(contentLength: number, options: Models.AppendBlobCreateOptionalParams, context: Context): Promise; diff --git a/src/blob/generated/handlers/IBlobHandler.ts b/src/blob/generated/handlers/IBlobHandler.ts index 565263ef6..da348f143 100644 --- a/src/blob/generated/handlers/IBlobHandler.ts +++ b/src/blob/generated/handlers/IBlobHandler.ts @@ -9,8 +9,8 @@ */ // tslint:disable:max-line-length -import * as Models from '../artifacts/models'; -import Context from '../Context'; +import * as Models from "../artifacts/models"; +import Context from "../Context"; export default interface IBlobHandler { download(options: Models.BlobDownloadOptionalParams, context: Context): Promise; diff --git a/src/blob/generated/handlers/IBlockBlobHandler.ts b/src/blob/generated/handlers/IBlockBlobHandler.ts index ab29e6497..44ae0a430 100644 --- a/src/blob/generated/handlers/IBlockBlobHandler.ts +++ b/src/blob/generated/handlers/IBlockBlobHandler.ts @@ -9,8 +9,8 @@ */ // tslint:disable:max-line-length -import * as Models from '../artifacts/models'; -import Context from '../Context'; +import * as Models from "../artifacts/models"; +import Context from "../Context"; export default interface IBlockBlobHandler { upload(body: NodeJS.ReadableStream, contentLength: number, options: Models.BlockBlobUploadOptionalParams, context: Context): Promise; diff --git a/src/blob/generated/handlers/IContainerHandler.ts b/src/blob/generated/handlers/IContainerHandler.ts index f66abbc46..f04e429fa 100644 --- a/src/blob/generated/handlers/IContainerHandler.ts +++ b/src/blob/generated/handlers/IContainerHandler.ts @@ -9,19 +9,18 @@ */ // tslint:disable:max-line-length -import * as Models from '../artifacts/models'; -import Context from '../Context'; +import * as Models from "../artifacts/models"; +import Context from "../Context"; export default interface IContainerHandler { create(options: Models.ContainerCreateOptionalParams, context: Context): Promise; getProperties(options: Models.ContainerGetPropertiesOptionalParams, context: Context): Promise; - getProperties(options: Models.ContainerGetProperties1OptionalParams, context: Context): Promise; + getPropertiesWithHead(options: Models.ContainerGetPropertiesWithHeadOptionalParams, context: Context): Promise; delete(options: Models.ContainerDeleteMethodOptionalParams, context: Context): Promise; setMetadata(options: Models.ContainerSetMetadataOptionalParams, context: Context): Promise; getAccessPolicy(options: Models.ContainerGetAccessPolicyOptionalParams, context: Context): Promise; setAccessPolicy(options: Models.ContainerSetAccessPolicyOptionalParams, context: Context): Promise; restore(options: Models.ContainerRestoreOptionalParams, context: Context): Promise; - rename(sourceContainerName: string, options: Models.ContainerRenameOptionalParams, context: Context): Promise; submitBatch(body: NodeJS.ReadableStream, contentLength: number, multipartContentType: string, options: Models.ContainerSubmitBatchOptionalParams, context: Context): Promise; filterBlobs(options: Models.ContainerFilterBlobsOptionalParams, context: Context): Promise; acquireLease(options: Models.ContainerAcquireLeaseOptionalParams, context: Context): Promise; diff --git a/src/blob/generated/handlers/IHandlers.ts b/src/blob/generated/handlers/IHandlers.ts index a1e51cb0b..3ce9b1a7c 100644 --- a/src/blob/generated/handlers/IHandlers.ts +++ b/src/blob/generated/handlers/IHandlers.ts @@ -1,10 +1,10 @@ -import IAppendBlobHandler from './IAppendBlobHandler'; -import IBlobHandler from './IBlobHandler'; -import IBlockBlobHandler from './IBlockBlobHandler'; -import IContainerHandler from './IContainerHandler'; -import IPageBlobHandler from './IPageBlobHandler'; // tslint:disable:ordered-imports -import IServiceHandler from './IServiceHandler'; +import IServiceHandler from "./IServiceHandler"; +import IContainerHandler from "./IContainerHandler"; +import IBlobHandler from "./IBlobHandler"; +import IPageBlobHandler from "./IPageBlobHandler"; +import IAppendBlobHandler from "./IAppendBlobHandler"; +import IBlockBlobHandler from "./IBlockBlobHandler"; export interface IHandlers { serviceHandler: IServiceHandler; diff --git a/src/blob/generated/handlers/IPageBlobHandler.ts b/src/blob/generated/handlers/IPageBlobHandler.ts index 1c472367c..64162e650 100644 --- a/src/blob/generated/handlers/IPageBlobHandler.ts +++ b/src/blob/generated/handlers/IPageBlobHandler.ts @@ -9,8 +9,8 @@ */ // tslint:disable:max-line-length -import * as Models from '../artifacts/models'; -import Context from '../Context'; +import * as Models from "../artifacts/models"; +import Context from "../Context"; export default interface IPageBlobHandler { create(contentLength: number, blobContentLength: number, options: Models.PageBlobCreateOptionalParams, context: Context): Promise; diff --git a/src/blob/generated/handlers/IServiceHandler.ts b/src/blob/generated/handlers/IServiceHandler.ts index fd3725dab..468d4e8e0 100644 --- a/src/blob/generated/handlers/IServiceHandler.ts +++ b/src/blob/generated/handlers/IServiceHandler.ts @@ -9,8 +9,8 @@ */ // tslint:disable:max-line-length -import * as Models from '../artifacts/models'; -import Context from '../Context'; +import * as Models from "../artifacts/models"; +import Context from "../Context"; export default interface IServiceHandler { setProperties(storageServiceProperties: Models.StorageServiceProperties, options: Models.ServiceSetPropertiesOptionalParams, context: Context): Promise; diff --git a/src/blob/generated/handlers/handlerMappers.ts b/src/blob/generated/handlers/handlerMappers.ts index 41cce7ce1..df0fe4d4d 100644 --- a/src/blob/generated/handlers/handlerMappers.ts +++ b/src/blob/generated/handlers/handlerMappers.ts @@ -1,4 +1,4 @@ -import Operation from '../artifacts/operation'; +import Operation from "../artifacts/operation"; // tslint:disable:one-line @@ -8,7 +8,7 @@ export interface IHandlerPath { arguments: string[]; } -const operationHandlerMapping: {[key: number]: IHandlerPath} = {}; +const operationHandlerMapping: { [key: number]: IHandlerPath } = {}; operationHandlerMapping[Operation.Service_SetProperties] = { arguments: [ @@ -130,14 +130,6 @@ operationHandlerMapping[Operation.Container_Restore] = { handler: "containerHandler", method: "restore" }; -operationHandlerMapping[Operation.Container_Rename] = { - arguments: [ - "sourceContainerName", - "options" - ], - handler: "containerHandler", - method: "rename" -}; operationHandlerMapping[Operation.Container_SubmitBatch] = { arguments: [ "body", diff --git a/src/blob/handlers/ContainerHandler.ts b/src/blob/handlers/ContainerHandler.ts index 1167066b7..9d639da5e 100644 --- a/src/blob/handlers/ContainerHandler.ts +++ b/src/blob/handlers/ContainerHandler.ts @@ -328,54 +328,43 @@ export default class ContainerHandler extends BaseHandler throw new NotImplementedError(context.contextId!); } - // Service doesn't support this feature either. - // The SDK marked rename function to be private to hide it from customer. - // From SDK comments: Need to hide this interface for now. Make it public and turn on the live tests for it when the service is ready. - public async rename( - sourceContainerName: string, - options: Models.ContainerRenameOptionalParams, - context: Context - ): Promise{ - throw new NotImplementedError(context.contextId!); - } - public async submitBatch( body: NodeJS.ReadableStream, contentLength: number, multipartContentType: string, options: Models.ContainerSubmitBatchOptionalParams, context: Context): Promise { - const blobServiceCtx = new BlobStorageContext(context); - const requestBatchBoundary = blobServiceCtx.request!.getHeader("content-type")!.split("=")[1]; - - const blobBatchHandler = new BlobBatchHandler(this.accountDataStore, this.oauth, - this.metadataStore, this.extentStore, this.logger, this.loose); - - const responseBodyString = await blobBatchHandler.submitBatch(body, - requestBatchBoundary, - blobServiceCtx.request!.getPath(), - context.request!, - context); - - const responseBody = new Readable(); - responseBody.push(responseBodyString); - responseBody.push(null); - - // No client request id defined in batch response, should refine swagger and regenerate from it. - // batch response succeed code should be 202 instead of 200, should refine swagger and regenerate from it. - const response: Models.ContainerSubmitBatchResponse = { - statusCode: 202, - requestId: context.contextId, - version: BLOB_API_VERSION, - contentType: "multipart/mixed; boundary=" + requestBatchBoundary, - body: responseBody - }; - - return response; + const blobServiceCtx = new BlobStorageContext(context); + const requestBatchBoundary = blobServiceCtx.request!.getHeader("content-type")!.split("=")[1]; + + const blobBatchHandler = new BlobBatchHandler(this.accountDataStore, this.oauth, + this.metadataStore, this.extentStore, this.logger, this.loose); + + const responseBodyString = await blobBatchHandler.submitBatch(body, + requestBatchBoundary, + blobServiceCtx.request!.getPath(), + context.request!, + context); + + const responseBody = new Readable(); + responseBody.push(responseBodyString); + responseBody.push(null); + + // No client request id defined in batch response, should refine swagger and regenerate from it. + // batch response succeed code should be 202 instead of 200, should refine swagger and regenerate from it. + const response: Models.ContainerSubmitBatchResponse = { + statusCode: 202, + requestId: context.contextId, + version: BLOB_API_VERSION, + contentType: "multipart/mixed; boundary=" + requestBatchBoundary, + body: responseBody + }; + + return response; } public async filterBlobs(options: Models.ContainerFilterBlobsOptionalParams, context: Context - ): Promise { + ): Promise { throw new NotImplementedError(context.contextId!); } diff --git a/swagger/blob-storage.json b/swagger/blob-storage-2021-10-04.json similarity index 99% rename from swagger/blob-storage.json rename to swagger/blob-storage-2021-10-04.json index 258b1426c..a0812ce2e 100644 --- a/swagger/blob-storage.json +++ b/swagger/blob-storage-2021-10-04.json @@ -1019,7 +1019,7 @@ "tags": [ "container" ], - "operationId": "Container_GetProperties", + "operationId": "Container_GetPropertiesWithHead", "description": "returns all user-defined metadata and system properties for the specified container. The data returned does not include the container's list of blobs", "parameters": [ { @@ -1636,96 +1636,6 @@ } ] }, - "/{containerName}?restype=container&comp=rename": { - "put": { - "tags": [ - "container" - ], - "operationId": "Container_Rename", - "description": "Renames an existing container.", - "parameters": [ - { - "$ref": "#/parameters/Timeout" - }, - { - "$ref": "#/parameters/ApiVersionParameter" - }, - { - "$ref": "#/parameters/ClientRequestId" - }, - { - "$ref": "#/parameters/SourceContainerName" - }, - { - "$ref": "#/parameters/SourceLeaseId" - } - ], - "responses": { - "200": { - "description": "Created.", - "headers": { - "x-ms-client-request-id": { - "x-ms-client-name": "ClientRequestId", - "type": "string", - "description": "If a client request id header is sent in the request, this header will be present in the response with the same value." - }, - "x-ms-request-id": { - "x-ms-client-name": "RequestId", - "type": "string", - "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." - }, - "x-ms-version": { - "x-ms-client-name": "Version", - "type": "string", - "description": "Indicates the version of the Blob service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." - }, - "Date": { - "type": "string", - "format": "date-time-rfc1123", - "description": "UTC date/time value generated by the service that indicates the time at which the response was initiated" - } - } - }, - "default": { - "description": "Failure", - "headers": { - "x-ms-error-code": { - "x-ms-client-name": "ErrorCode", - "type": "string" - } - }, - "schema": { - "$ref": "#/definitions/StorageError" - } - } - } - }, - "parameters": [ - { - "$ref": "#/parameters/ContainerName" - }, - { - "name": "restype", - "description": "restype", - "in": "query", - "required": true, - "type": "string", - "enum": [ - "container" - ] - }, - { - "name": "comp", - "description": "comp", - "in": "query", - "required": true, - "type": "string", - "enum": [ - "rename" - ] - } - ] - }, "/{containerName}?restype=container&comp=batch": { "post": { "tags": [ diff --git a/swagger/blob.md b/swagger/blob.md index 979e39bab..9d805c6f3 100644 --- a/swagger/blob.md +++ b/swagger/blob.md @@ -10,7 +10,7 @@ enable-xml: true generate-metadata: false license-header: MICROSOFT_MIT_NO_VERSION output-folder: ../src/blob/generated -input-file: blob-storage.json +input-file: blob-storage-2021-10-04.json model-date-time-as-string: true optional-response-headers: true enum-types: true @@ -48,15 +48,15 @@ enum-types: true 9. Make `ApiVersionParameter` parameter from required to optional. -10. Add `x-ms-creation-time` to Blob_Download API responds +10. Add `x-ms-creation-time` to Blob_Download API response. -11. Add "" to "ListContainersInclude" enum, add "", "permissions" to "ListBlobsInclude" enum. - -12. Add "Premium" to "AccessTierRequired" enum and "AccessTierOptional" enum. +11. Add "Premium" to "AccessTierRequired" enum and "AccessTierOptional" enum. Add "Mutable" to "ImmutabilityPolicyMode" at around line #11994 -13. Add spec for: Blob_GetAccountInfoWithHead, Container_GetAccountInfoWithHead and Service_GetAccountInfoWithHead. +12. Add spec for: Blob_GetAccountInfoWithHead, Container_GetAccountInfoWithHead and Service_GetAccountInfoWithHead. + +13. Change return code from '200' to '202' for service_submitbatch. -14. Change return code from '200' to '202' for service_submitbatch. +14. Change "AllowedHeaders" and "ExposedHeaders" to from required to optional. -15. Change "AllowedHeaders" and "ExposedHeaders" to be not required. +15. Remove "Container_Rename" section. From 19e67d00aab8364ed20b35797e56769210684d03 Mon Sep 17 00:00:00 2001 From: Makoto Oda Date: Fri, 24 Mar 2023 14:55:21 +0900 Subject: [PATCH 048/297] Update README.md (#1862) * Update README.md according to [this GitHub issue](https://github.com/Azure/Azurite/issues/1854) * Update README.md reflect blueww's review comment. --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index 78db58752..f9effa8ef 100644 --- a/README.md +++ b/README.md @@ -466,6 +466,9 @@ Azurite will refresh customized account name and key from environment variable e > Note. Use `export` keyword to set environment variable in Linux like environment, `set` in Windows. +> Note. When changing storage account name, keep these rules in mind as same as [Azure Storage Account](https://learn.microsoft.com/en-us/azure/storage/common/storage-account-overview#storage-account-name): +> - Storage account names must be between 3 and 24 characters in length and may contain numbers and lowercase letters only. + ### Customized Metadata Storage by External Database (Preview) By default, Azurite leverages [loki](https://github.com/techfort/LokiJS) as metadata database. From 1c61a1d76d8814b13a43cd375b65e183a030f539 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 25 Mar 2023 10:02:39 +0800 Subject: [PATCH 049/297] Bump @types/jsonwebtoken from 8.5.9 to 9.0.1 (#1866) Bumps [@types/jsonwebtoken](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/jsonwebtoken) from 8.5.9 to 9.0.1. - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/jsonwebtoken) --- updated-dependencies: - dependency-name: "@types/jsonwebtoken" dependency-type: direct:development update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 14 +++++++------- package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index d06ba7f70..d6c5e07ba 100644 --- a/package-lock.json +++ b/package-lock.json @@ -51,7 +51,7 @@ "@types/express": "^4.16.0", "@types/fs-extra": "^11.0.1", "@types/glob-to-regexp": "^0.4.1", - "@types/jsonwebtoken": "^8.3.9", + "@types/jsonwebtoken": "^9.0.1", "@types/lokijs": "^1.5.2", "@types/mocha": "^9.0.0", "@types/morgan": "^1.7.35", @@ -1367,9 +1367,9 @@ } }, "node_modules/@types/jsonwebtoken": { - "version": "8.5.9", - "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-8.5.9.tgz", - "integrity": "sha512-272FMnFGzAVMGtu9tkr29hRL6bZj4Zs1KZNeHLnKqAvp06tAIcarTMwOh8/8bz4FmKRcMxZhZNeUAQsNLoiPhg==", + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-9.0.1.tgz", + "integrity": "sha512-c5ltxazpWabia/4UzhIoaDcIza4KViOQhdbjRlfcIGVnsE3c3brkz9Z+F/EeJIECOQP7W7US2hNE930cWWkPiw==", "dev": true, "dependencies": { "@types/node": "*" @@ -11111,9 +11111,9 @@ } }, "@types/jsonwebtoken": { - "version": "8.5.9", - "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-8.5.9.tgz", - "integrity": "sha512-272FMnFGzAVMGtu9tkr29hRL6bZj4Zs1KZNeHLnKqAvp06tAIcarTMwOh8/8bz4FmKRcMxZhZNeUAQsNLoiPhg==", + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-9.0.1.tgz", + "integrity": "sha512-c5ltxazpWabia/4UzhIoaDcIza4KViOQhdbjRlfcIGVnsE3c3brkz9Z+F/EeJIECOQP7W7US2hNE930cWWkPiw==", "dev": true, "requires": { "@types/node": "*" diff --git a/package.json b/package.json index 21657f4f0..c983818ae 100644 --- a/package.json +++ b/package.json @@ -56,7 +56,7 @@ "@types/express": "^4.16.0", "@types/fs-extra": "^11.0.1", "@types/glob-to-regexp": "^0.4.1", - "@types/jsonwebtoken": "^8.3.9", + "@types/jsonwebtoken": "^9.0.1", "@types/lokijs": "^1.5.2", "@types/mocha": "^9.0.0", "@types/morgan": "^1.7.35", From ccd770996612fc8c37bd464d3b55a55bb140ed4f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 25 Mar 2023 10:07:22 +0800 Subject: [PATCH 050/297] Bump @azure/data-tables from 13.2.0 to 13.2.1 (#1864) Bumps [@azure/data-tables](https://github.com/Azure/azure-sdk-for-js) from 13.2.0 to 13.2.1. - [Release notes](https://github.com/Azure/azure-sdk-for-js/releases) - [Changelog](https://github.com/Azure/azure-sdk-for-js/blob/main/documentation/Changelog-for-next-generation.md) - [Commits](https://github.com/Azure/azure-sdk-for-js/compare/@azure/data-tables_13.2.0...@azure/data-tables_13.2.1) --- updated-dependencies: - dependency-name: "@azure/data-tables" dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/package-lock.json b/package-lock.json index d6c5e07ba..b8a2bf6a3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -306,9 +306,9 @@ } }, "node_modules/@azure/data-tables": { - "version": "13.2.0", - "resolved": "https://registry.npmjs.org/@azure/data-tables/-/data-tables-13.2.0.tgz", - "integrity": "sha512-o16WVzcCYuZRh8M43R+twJyB9fZnhG2Y4ZfGmV2jX3HgV7TSBIXysuwgVYkdqYd3cyBVzpHW3pLY7IasOjvO7w==", + "version": "13.2.1", + "resolved": "https://registry.npmjs.org/@azure/data-tables/-/data-tables-13.2.1.tgz", + "integrity": "sha512-5pboUpSpxjTgZ499MxkLLR0i+lyUUwN6M5pTLZ2D4mUfKVz+vqiCijvxij0V0OfknMxVpQ+NrZcUdarw6a1Few==", "dev": true, "dependencies": { "@azure/core-auth": "^1.3.0", @@ -322,7 +322,7 @@ "uuid": "^8.3.0" }, "engines": { - "node": ">=12.0.0" + "node": ">=14.0.0" } }, "node_modules/@azure/data-tables/node_modules/@azure/core-tracing": { @@ -10263,9 +10263,9 @@ } }, "@azure/data-tables": { - "version": "13.2.0", - "resolved": "https://registry.npmjs.org/@azure/data-tables/-/data-tables-13.2.0.tgz", - "integrity": "sha512-o16WVzcCYuZRh8M43R+twJyB9fZnhG2Y4ZfGmV2jX3HgV7TSBIXysuwgVYkdqYd3cyBVzpHW3pLY7IasOjvO7w==", + "version": "13.2.1", + "resolved": "https://registry.npmjs.org/@azure/data-tables/-/data-tables-13.2.1.tgz", + "integrity": "sha512-5pboUpSpxjTgZ499MxkLLR0i+lyUUwN6M5pTLZ2D4mUfKVz+vqiCijvxij0V0OfknMxVpQ+NrZcUdarw6a1Few==", "dev": true, "requires": { "@azure/core-auth": "^1.3.0", From 6d740d3783319649faee122691969eedf8d29bab Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 25 Mar 2023 15:11:46 +0800 Subject: [PATCH 051/297] Bump @types/morgan from 1.9.3 to 1.9.4 (#1859) Bumps [@types/morgan](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/morgan) from 1.9.3 to 1.9.4. - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/morgan) --- updated-dependencies: - dependency-name: "@types/morgan" dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index b8a2bf6a3..30e805f9c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1400,9 +1400,9 @@ "dev": true }, "node_modules/@types/morgan": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/@types/morgan/-/morgan-1.9.3.tgz", - "integrity": "sha512-BiLcfVqGBZCyNCnCH3F4o2GmDLrpy0HeBVnNlyZG4fo88ZiE9SoiBe3C+2ezuwbjlEyT+PDZ17//TAlRxAn75Q==", + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/@types/morgan/-/morgan-1.9.4.tgz", + "integrity": "sha512-cXoc4k+6+YAllH3ZHmx4hf7La1dzUk6keTR4bF4b4Sc0mZxU/zK4wO7l+ZzezXm/jkYj/qC+uYGZrarZdIVvyQ==", "dev": true, "dependencies": { "@types/node": "*" @@ -11144,9 +11144,9 @@ "dev": true }, "@types/morgan": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/@types/morgan/-/morgan-1.9.3.tgz", - "integrity": "sha512-BiLcfVqGBZCyNCnCH3F4o2GmDLrpy0HeBVnNlyZG4fo88ZiE9SoiBe3C+2ezuwbjlEyT+PDZ17//TAlRxAn75Q==", + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/@types/morgan/-/morgan-1.9.4.tgz", + "integrity": "sha512-cXoc4k+6+YAllH3ZHmx4hf7La1dzUk6keTR4bF4b4Sc0mZxU/zK4wO7l+ZzezXm/jkYj/qC+uYGZrarZdIVvyQ==", "dev": true, "requires": { "@types/node": "*" From a2097347508eae81a9eeef1862234bc7eba9e36f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 28 Mar 2023 10:32:04 +0800 Subject: [PATCH 052/297] Bump @azure/core-rest-pipeline from 1.10.1 to 1.10.2 (#1870) Bumps [@azure/core-rest-pipeline](https://github.com/Azure/azure-sdk-for-js) from 1.10.1 to 1.10.2. - [Release notes](https://github.com/Azure/azure-sdk-for-js/releases) - [Changelog](https://github.com/Azure/azure-sdk-for-js/blob/main/documentation/Changelog-for-next-generation.md) - [Commits](https://github.com/Azure/azure-sdk-for-js/compare/@azure/core-rest-pipeline_1.10.1...@azure/core-rest-pipeline_1.10.2) --- updated-dependencies: - dependency-name: "@azure/core-rest-pipeline" dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 30e805f9c..2f1b58ae6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -217,9 +217,9 @@ } }, "node_modules/@azure/core-rest-pipeline": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/@azure/core-rest-pipeline/-/core-rest-pipeline-1.10.1.tgz", - "integrity": "sha512-Kji9k6TOFRDB5ZMTw8qUf2IJ+CeJtsuMdAHox9eqpTf1cefiNMpzrfnF6sINEBZJsaVaWgQ0o48B6kcUH68niA==", + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/@azure/core-rest-pipeline/-/core-rest-pipeline-1.10.2.tgz", + "integrity": "sha512-e3WzAsRKLor5EgK2bQqR1OY5D7VBqzORHtlqtygZZQGCYOIBsynqrZBa8MFD1Ue9r8TPtofOLditalnlQHS45Q==", "dependencies": { "@azure/abort-controller": "^1.0.0", "@azure/core-auth": "^1.4.0", @@ -10193,9 +10193,9 @@ } }, "@azure/core-rest-pipeline": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/@azure/core-rest-pipeline/-/core-rest-pipeline-1.10.1.tgz", - "integrity": "sha512-Kji9k6TOFRDB5ZMTw8qUf2IJ+CeJtsuMdAHox9eqpTf1cefiNMpzrfnF6sINEBZJsaVaWgQ0o48B6kcUH68niA==", + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/@azure/core-rest-pipeline/-/core-rest-pipeline-1.10.2.tgz", + "integrity": "sha512-e3WzAsRKLor5EgK2bQqR1OY5D7VBqzORHtlqtygZZQGCYOIBsynqrZBa8MFD1Ue9r8TPtofOLditalnlQHS45Q==", "requires": { "@azure/abort-controller": "^1.0.0", "@azure/core-auth": "^1.4.0", From 96bee9614cf56e3d94087cd486b2f8db071d8b97 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 28 Mar 2023 10:39:18 +0800 Subject: [PATCH 053/297] Bump eslint from 8.35.0 to 8.36.0 (#1869) Bumps [eslint](https://github.com/eslint/eslint) from 8.35.0 to 8.36.0. - [Release notes](https://github.com/eslint/eslint/releases) - [Changelog](https://github.com/eslint/eslint/blob/main/CHANGELOG.md) - [Commits](https://github.com/eslint/eslint/compare/v8.35.0...v8.36.0) --- updated-dependencies: - dependency-name: eslint dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 245 +++++++++++++--------------------------------- 1 file changed, 69 insertions(+), 176 deletions(-) diff --git a/package-lock.json b/package-lock.json index 2f1b58ae6..b2645dcd6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -842,14 +842,14 @@ } }, "node_modules/@eslint/eslintrc": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.0.tgz", - "integrity": "sha512-fluIaaV+GyV24CCu/ggiHdV+j4RNh85yQnAYS/G2mZODZgGmmlrgCydjUcV3YvxCm9x8nMAfThsqTni4KiXT4A==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.1.tgz", + "integrity": "sha512-eFRmABvW2E5Ho6f5fHLqgena46rOj7r7OKHYfLElqcBfGFHHpjBhivyi5+jOEQuSpdc/1phIZJlbC2te+tZNIw==", "dev": true, "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", - "espree": "^9.4.0", + "espree": "^9.5.0", "globals": "^13.19.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", @@ -864,12 +864,6 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/@eslint/eslintrc/node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, "node_modules/@eslint/eslintrc/node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -902,18 +896,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@eslint/eslintrc/node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, "node_modules/@eslint/eslintrc/node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -957,9 +939,9 @@ } }, "node_modules/@eslint/js": { - "version": "8.35.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.35.0.tgz", - "integrity": "sha512-JXdzbRiWclLVoD8sNUjR443VVlYqiYmDVT6rGUEIEHU5YJW0gaVZwV2xgM7D4arkvASqD0IlLUVjHiFuxaftRw==", + "version": "8.36.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.36.0.tgz", + "integrity": "sha512-lxJ9R5ygVm8ZWgYdUweoq5ownDlJ4upvoWmO4eLxBYHdMo+vZ/Rx0EN6MbKWDJOSUGrqJy2Gt+Dyv/VKml0fjg==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -2037,6 +2019,12 @@ "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", "dev": true }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, "node_modules/args": { "version": "5.0.3", "resolved": "https://registry.npmjs.org/args/-/args-5.0.3.tgz", @@ -4179,13 +4167,15 @@ } }, "node_modules/eslint": { - "version": "8.35.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.35.0.tgz", - "integrity": "sha512-BxAf1fVL7w+JLRQhWl2pzGeSiGqbWumV4WNvc9Rhp6tiCtm4oHnyPBSEtMGZwrQgudFQ+otqzWoPB7x+hxoWsw==", + "version": "8.36.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.36.0.tgz", + "integrity": "sha512-Y956lmS7vDqomxlaaQAHVmeb4tNMp2FWIvU/RnU5BD3IKMD/MJPr76xdyr68P8tV1iNMvN2mRK0yy3c+UjL+bw==", "dev": true, "dependencies": { - "@eslint/eslintrc": "^2.0.0", - "@eslint/js": "8.35.0", + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.4.0", + "@eslint/eslintrc": "^2.0.1", + "@eslint/js": "8.36.0", "@humanwhocodes/config-array": "^0.11.8", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", @@ -4196,9 +4186,8 @@ "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", "eslint-scope": "^7.1.1", - "eslint-utils": "^3.0.0", "eslint-visitor-keys": "^3.3.0", - "espree": "^9.4.0", + "espree": "^9.5.0", "esquery": "^1.4.2", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", @@ -4220,7 +4209,6 @@ "minimatch": "^3.1.2", "natural-compare": "^1.4.0", "optionator": "^0.9.1", - "regexpp": "^3.2.0", "strip-ansi": "^6.0.1", "strip-json-comments": "^3.1.0", "text-table": "^0.2.0" @@ -4248,33 +4236,6 @@ "node": ">=8.0.0" } }, - "node_modules/eslint-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", - "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", - "dev": true, - "dependencies": { - "eslint-visitor-keys": "^2.0.0" - }, - "engines": { - "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - }, - "peerDependencies": { - "eslint": ">=5" - } - }, - "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "dev": true, - "engines": { - "node": ">=10" - } - }, "node_modules/eslint-visitor-keys": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", @@ -4308,12 +4269,6 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/eslint/node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, "node_modules/eslint/node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -4449,18 +4404,6 @@ "node": ">=8" } }, - "node_modules/eslint/node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, "node_modules/eslint/node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -4573,9 +4516,9 @@ } }, "node_modules/espree": { - "version": "9.4.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.1.tgz", - "integrity": "sha512-XwctdmTO6SIvCzd9810yyNzIrOrqNYV9Koizx4C/mRhf9uq0o4yHoCEU/670pOxOL/MSraektvSAji79kX90Vg==", + "version": "9.5.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.0.tgz", + "integrity": "sha512-JPbJGhKc47++oo4JkEoTe2wjy4fmMwvFpgJT9cQzmfXKp22Dr6Hf1tdCteLz1h0P3t+mGvWZ+4Uankvh8+c6zw==", "dev": true, "dependencies": { "acorn": "^8.8.0", @@ -6205,6 +6148,18 @@ "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", "dev": true }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, "node_modules/jsbi": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/jsbi/-/jsbi-4.3.0.tgz", @@ -7076,12 +7031,6 @@ "markdown-it": "bin/markdown-it.js" } }, - "node_modules/markdown-it/node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, "node_modules/markdown-it/node_modules/entities": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/entities/-/entities-2.1.0.tgz", @@ -8479,18 +8428,6 @@ "private": "^0.1.6" } }, - "node_modules/regexpp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", - "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - } - }, "node_modules/regexpu-core": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-2.0.0.tgz", @@ -10695,14 +10632,14 @@ "dev": true }, "@eslint/eslintrc": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.0.tgz", - "integrity": "sha512-fluIaaV+GyV24CCu/ggiHdV+j4RNh85yQnAYS/G2mZODZgGmmlrgCydjUcV3YvxCm9x8nMAfThsqTni4KiXT4A==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.1.tgz", + "integrity": "sha512-eFRmABvW2E5Ho6f5fHLqgena46rOj7r7OKHYfLElqcBfGFHHpjBhivyi5+jOEQuSpdc/1phIZJlbC2te+tZNIw==", "dev": true, "requires": { "ajv": "^6.12.4", "debug": "^4.3.2", - "espree": "^9.4.0", + "espree": "^9.5.0", "globals": "^13.19.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", @@ -10711,12 +10648,6 @@ "strip-json-comments": "^3.1.1" }, "dependencies": { - "argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, "debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -10735,15 +10666,6 @@ "type-fest": "^0.20.2" } }, - "js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "requires": { - "argparse": "^2.0.1" - } - }, "minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -10774,9 +10696,9 @@ } }, "@eslint/js": { - "version": "8.35.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.35.0.tgz", - "integrity": "sha512-JXdzbRiWclLVoD8sNUjR443VVlYqiYmDVT6rGUEIEHU5YJW0gaVZwV2xgM7D4arkvASqD0IlLUVjHiFuxaftRw==", + "version": "8.36.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.36.0.tgz", + "integrity": "sha512-lxJ9R5ygVm8ZWgYdUweoq5ownDlJ4upvoWmO4eLxBYHdMo+vZ/Rx0EN6MbKWDJOSUGrqJy2Gt+Dyv/VKml0fjg==", "dev": true }, "@humanwhocodes/config-array": { @@ -11589,6 +11511,12 @@ "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", "dev": true }, + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, "args": { "version": "5.0.3", "resolved": "https://registry.npmjs.org/args/-/args-5.0.3.tgz", @@ -13417,13 +13345,15 @@ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" }, "eslint": { - "version": "8.35.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.35.0.tgz", - "integrity": "sha512-BxAf1fVL7w+JLRQhWl2pzGeSiGqbWumV4WNvc9Rhp6tiCtm4oHnyPBSEtMGZwrQgudFQ+otqzWoPB7x+hxoWsw==", + "version": "8.36.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.36.0.tgz", + "integrity": "sha512-Y956lmS7vDqomxlaaQAHVmeb4tNMp2FWIvU/RnU5BD3IKMD/MJPr76xdyr68P8tV1iNMvN2mRK0yy3c+UjL+bw==", "dev": true, "requires": { - "@eslint/eslintrc": "^2.0.0", - "@eslint/js": "8.35.0", + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.4.0", + "@eslint/eslintrc": "^2.0.1", + "@eslint/js": "8.36.0", "@humanwhocodes/config-array": "^0.11.8", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", @@ -13434,9 +13364,8 @@ "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", "eslint-scope": "^7.1.1", - "eslint-utils": "^3.0.0", "eslint-visitor-keys": "^3.3.0", - "espree": "^9.4.0", + "espree": "^9.5.0", "esquery": "^1.4.2", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", @@ -13458,7 +13387,6 @@ "minimatch": "^3.1.2", "natural-compare": "^1.4.0", "optionator": "^0.9.1", - "regexpp": "^3.2.0", "strip-ansi": "^6.0.1", "strip-json-comments": "^3.1.0", "text-table": "^0.2.0" @@ -13479,12 +13407,6 @@ "color-convert": "^2.0.1" } }, - "argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, "chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -13576,15 +13498,6 @@ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, - "js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "requires": { - "argparse": "^2.0.1" - } - }, "minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -13672,23 +13585,6 @@ "estraverse": "^4.1.1" } }, - "eslint-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", - "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^2.0.0" - }, - "dependencies": { - "eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "dev": true - } - } - }, "eslint-visitor-keys": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", @@ -13696,9 +13592,9 @@ "dev": true }, "espree": { - "version": "9.4.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.1.tgz", - "integrity": "sha512-XwctdmTO6SIvCzd9810yyNzIrOrqNYV9Koizx4C/mRhf9uq0o4yHoCEU/670pOxOL/MSraektvSAji79kX90Vg==", + "version": "9.5.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.0.tgz", + "integrity": "sha512-JPbJGhKc47++oo4JkEoTe2wjy4fmMwvFpgJT9cQzmfXKp22Dr6Hf1tdCteLz1h0P3t+mGvWZ+4Uankvh8+c6zw==", "dev": true, "requires": { "acorn": "^8.8.0", @@ -14876,6 +14772,15 @@ "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", "dev": true }, + "js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "requires": { + "argparse": "^2.0.1" + } + }, "jsbi": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/jsbi/-/jsbi-4.3.0.tgz", @@ -15546,12 +15451,6 @@ "uc.micro": "^1.0.5" }, "dependencies": { - "argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, "entities": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/entities/-/entities-2.1.0.tgz", @@ -16592,12 +16491,6 @@ "private": "^0.1.6" } }, - "regexpp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", - "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", - "dev": true - }, "regexpu-core": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-2.0.0.tgz", From 1f84420845c2c90afcfc7b20bc39df5ea703e45c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 28 Mar 2023 10:39:27 +0800 Subject: [PATCH 054/297] Bump @azure/storage-queue from 12.11.0 to 12.12.0 (#1868) Bumps [@azure/storage-queue](https://github.com/Azure/azure-sdk-for-js) from 12.11.0 to 12.12.0. - [Release notes](https://github.com/Azure/azure-sdk-for-js/releases) - [Changelog](https://github.com/Azure/azure-sdk-for-js/blob/main/documentation/Changelog-for-next-generation.md) - [Commits](https://github.com/Azure/azure-sdk-for-js/compare/@azure/storage-queue_12.11.0...@azure/storage-queue_12.12.0) --- updated-dependencies: - dependency-name: "@azure/storage-queue" dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 107 ++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 98 insertions(+), 9 deletions(-) diff --git a/package-lock.json b/package-lock.json index b2645dcd6..d164506ab 100644 --- a/package-lock.json +++ b/package-lock.json @@ -692,20 +692,68 @@ } }, "node_modules/@azure/storage-queue": { - "version": "12.11.0", - "resolved": "https://registry.npmjs.org/@azure/storage-queue/-/storage-queue-12.11.0.tgz", - "integrity": "sha512-fP8tfFrdLN6n7Q0SMtTBJevr0Pr5pgCsUKww7VJg6FxPkP/1Mtv45hGBQvufU71LuYdSwVGJXa0H6BLDm+K8Qg==", + "version": "12.12.0", + "resolved": "https://registry.npmjs.org/@azure/storage-queue/-/storage-queue-12.12.0.tgz", + "integrity": "sha512-I3PBS9OKsLmXGvF0f9EymoNKf1kZ2+H9csdkOyxriZBhrK85SklQ3LYsFceIK7N1CTkzk/f695Q6ziryENvtVQ==", "dev": true, "dependencies": { "@azure/abort-controller": "^1.0.0", - "@azure/core-http": "^2.0.0", + "@azure/core-http": "^3.0.0", "@azure/core-paging": "^1.1.1", "@azure/core-tracing": "1.0.0-preview.13", "@azure/logger": "^1.0.0", "tslib": "^2.2.0" }, "engines": { - "node": ">=12.0.0" + "node": ">=14.0.0" + } + }, + "node_modules/@azure/storage-queue/node_modules/@azure/core-http": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@azure/core-http/-/core-http-3.0.0.tgz", + "integrity": "sha512-BxI2SlGFPPz6J1XyZNIVUf0QZLBKFX+ViFjKOkzqD18J1zOINIQ8JSBKKr+i+v8+MB6LacL6Nn/sP/TE13+s2Q==", + "dev": true, + "dependencies": { + "@azure/abort-controller": "^1.0.0", + "@azure/core-auth": "^1.3.0", + "@azure/core-tracing": "1.0.0-preview.13", + "@azure/core-util": "^1.1.1", + "@azure/logger": "^1.0.0", + "@types/node-fetch": "^2.5.0", + "@types/tunnel": "^0.0.3", + "form-data": "^4.0.0", + "node-fetch": "^2.6.7", + "process": "^0.11.10", + "tslib": "^2.2.0", + "tunnel": "^0.0.6", + "uuid": "^8.3.0", + "xml2js": "^0.4.19" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@azure/storage-queue/node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dev": true, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@azure/storage-queue/node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "dev": true, + "bin": { + "uuid": "dist/bin/uuid" } }, "node_modules/@babel/generator": { @@ -10523,17 +10571,58 @@ } }, "@azure/storage-queue": { - "version": "12.11.0", - "resolved": "https://registry.npmjs.org/@azure/storage-queue/-/storage-queue-12.11.0.tgz", - "integrity": "sha512-fP8tfFrdLN6n7Q0SMtTBJevr0Pr5pgCsUKww7VJg6FxPkP/1Mtv45hGBQvufU71LuYdSwVGJXa0H6BLDm+K8Qg==", + "version": "12.12.0", + "resolved": "https://registry.npmjs.org/@azure/storage-queue/-/storage-queue-12.12.0.tgz", + "integrity": "sha512-I3PBS9OKsLmXGvF0f9EymoNKf1kZ2+H9csdkOyxriZBhrK85SklQ3LYsFceIK7N1CTkzk/f695Q6ziryENvtVQ==", "dev": true, "requires": { "@azure/abort-controller": "^1.0.0", - "@azure/core-http": "^2.0.0", + "@azure/core-http": "^3.0.0", "@azure/core-paging": "^1.1.1", "@azure/core-tracing": "1.0.0-preview.13", "@azure/logger": "^1.0.0", "tslib": "^2.2.0" + }, + "dependencies": { + "@azure/core-http": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@azure/core-http/-/core-http-3.0.0.tgz", + "integrity": "sha512-BxI2SlGFPPz6J1XyZNIVUf0QZLBKFX+ViFjKOkzqD18J1zOINIQ8JSBKKr+i+v8+MB6LacL6Nn/sP/TE13+s2Q==", + "dev": true, + "requires": { + "@azure/abort-controller": "^1.0.0", + "@azure/core-auth": "^1.3.0", + "@azure/core-tracing": "1.0.0-preview.13", + "@azure/core-util": "^1.1.1", + "@azure/logger": "^1.0.0", + "@types/node-fetch": "^2.5.0", + "@types/tunnel": "^0.0.3", + "form-data": "^4.0.0", + "node-fetch": "^2.6.7", + "process": "^0.11.10", + "tslib": "^2.2.0", + "tunnel": "^0.0.6", + "uuid": "^8.3.0", + "xml2js": "^0.4.19" + } + }, + "form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } + }, + "uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "dev": true + } } }, "@babel/generator": { From a1527fc0ec75137de6982b8dd3ce60fd38f9504d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 28 Mar 2023 10:39:36 +0800 Subject: [PATCH 055/297] Bump prettier from 2.8.6 to 2.8.7 (#1867) Bumps [prettier](https://github.com/prettier/prettier) from 2.8.6 to 2.8.7. - [Release notes](https://github.com/prettier/prettier/releases) - [Changelog](https://github.com/prettier/prettier/blob/main/CHANGELOG.md) - [Commits](https://github.com/prettier/prettier/compare/2.8.6...2.8.7) --- updated-dependencies: - dependency-name: prettier dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index d164506ab..c71cc93d4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8258,9 +8258,9 @@ } }, "node_modules/prettier": { - "version": "2.8.6", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.6.tgz", - "integrity": "sha512-mtuzdiBbHwPEgl7NxWlqOkithPyp4VN93V7VeHVWBF+ad3I5avc0RVDT4oImXQy9H/AqxA2NSQH8pSxHW6FYbQ==", + "version": "2.8.7", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.7.tgz", + "integrity": "sha512-yPngTo3aXUUmyuTjeTUT75txrf+aMh9FiD7q9ZE/i6r0bPb22g4FsE6Y338PQX1bmfy08i9QQCB7/rcUAVntfw==", "dev": true, "bin": { "prettier": "bin-prettier.js" @@ -16421,9 +16421,9 @@ "dev": true }, "prettier": { - "version": "2.8.6", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.6.tgz", - "integrity": "sha512-mtuzdiBbHwPEgl7NxWlqOkithPyp4VN93V7VeHVWBF+ad3I5avc0RVDT4oImXQy9H/AqxA2NSQH8pSxHW6FYbQ==", + "version": "2.8.7", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.7.tgz", + "integrity": "sha512-yPngTo3aXUUmyuTjeTUT75txrf+aMh9FiD7q9ZE/i6r0bPb22g4FsE6Y338PQX1bmfy08i9QQCB7/rcUAVntfw==", "dev": true }, "private": { From ef1e0056af79b8961cea007e2c69dd65d2957329 Mon Sep 17 00:00:00 2001 From: Emma Zhu Date: Wed, 29 Mar 2023 17:19:27 +0800 Subject: [PATCH 056/297] Upgrade API version to 2022-11-02 Bump package version to 3.23.0 --- ChangeLog.md | 1 + README.md | 16 ++++++++-------- package-lock.json | 4 ++-- package.json | 2 +- src/blob/utils/constants.ts | 5 +++-- src/queue/utils/constants.ts | 5 +++-- src/table/utils/constants.ts | 5 +++-- 7 files changed, 21 insertions(+), 17 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index d73abc1e9..1d2d311f3 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -10,6 +10,7 @@ General: - Migrated tslint to eslint. - Typescript upgraded from 4.2.4 to 4.9.5. - Migrated test pipeline from Node.js 10/12 to Node.js 14/16/18. +- Bump up service API version to 2022-11-02 Blob: diff --git a/README.md b/README.md index f9effa8ef..e4d01c416 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,7 @@ | Version | Azure Storage API Version | Service Support | Description | Reference Links | | ------------------------------------------------------------------ | ------------------------- | ------------------------------ | ------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| 3.22.0 | 2021-12-02 | Blob, Queue and Table(preview) | Azurite V3 based on TypeScript & New Architecture | [NPM](https://www.npmjs.com/package/azurite) - [Docker](https://hub.docker.com/_/microsoft-azure-storage-azurite) - [Visual Studio Code Extension](https://marketplace.visualstudio.com/items?itemName=Azurite.azurite) | +| 3.23.0 | 2022-11-02 | Blob, Queue and Table(preview) | Azurite V3 based on TypeScript & New Architecture | [NPM](https://www.npmjs.com/package/azurite) - [Docker](https://hub.docker.com/_/microsoft-azure-storage-azurite) - [Visual Studio Code Extension](https://marketplace.visualstudio.com/items?itemName=Azurite.azurite) | | [Legacy (v2)](https://github.com/Azure/Azurite/tree/legacy-master) | 2016-05-31 | Blob, Queue and Table | Legacy Azurite V2 | [NPM](https://www.npmjs.com/package/azurite) | - [Azurite V3](#azurite-v3) @@ -76,19 +76,19 @@ Compared to V2, Azurite V3 implements a new architecture leveraging code generat ## Features & Key Changes in Azurite V3 -- Blob storage features align with Azure Storage API version 2021-12-02 (Refer to support matrix section below) +- Blob storage features align with Azure Storage API version 2022-11-02 (Refer to support matrix section below) - SharedKey/Account SAS/Service SAS/Public Access Authentications/OAuth - Get/Set Blob Service Properties - Create/List/Delete Containers - Create/Read/List/Update/Delete Block Blobs - Create/Read/List/Update/Delete Page Blobs -- Queue storage features align with Azure Storage API version 2021-12-02 (Refer to support matrix section below) +- Queue storage features align with Azure Storage API version 2022-11-02 (Refer to support matrix section below) - SharedKey/Account SAS/Service SAS/OAuth - Get/Set Queue Service Properties - Preflight Request - Create/List/Delete Queues - Put/Get/Peek/Updata/Deleta/Clear Messages -- Table storage features align with Azure Storage API version 2021-12-02 (Refer to support matrix section below) +- Table storage features align with Azure Storage API version 2022-11-02 (Refer to support matrix section below) - SharedKey/Account SAS/Service SAS/OAuth - Create/List/Delete Tables - Insert/Update/Query/Delete Table Entities @@ -909,7 +909,7 @@ Legacy Azurite V2 supports Azure Storage Blob, Queue and Table services. Azurite V3 currently only supports Azure Storage blob service. Queue service is supported after V3.2.0-preview. Table service support is currently under discussion. -Azurite V3 supports features from Azure Storage API version 2021-12-02, and will maintain parity with the latest API versions, in a more frequent update frequency than legacy Azurite V2. +Azurite V3 supports features from Azure Storage API version 2022-11-02, and will maintain parity with the latest API versions, in a more frequent update frequency than legacy Azurite V2. ## TypeScript Server Code Generator @@ -920,7 +920,7 @@ All the generated code is kept in `generated` folder, including the generated mi ## Support Matrix -Latest release targets **2021-12-02** API version **blob** service. +Latest release targets **2022-11-02** API version **blob** service. Detailed support matrix: @@ -979,7 +979,7 @@ Detailed support matrix: - Get Page Ranges Continuation Token - Cold Tier -Latest version supports for **2021-12-02** API version **queue** service. +Latest version supports for **2022-11-02** API version **queue** service. Detailed support matrix: - Supported Vertical Features @@ -1008,7 +1008,7 @@ Detailed support matrix: - Following features or REST APIs are NOT supported or limited supported in this release (will support more features per customers feedback in future releases) - SharedKey Lite -Latest version supports for **2021-12-02** API version **table** service (preview). +Latest version supports for **2022-11-02** API version **table** service (preview). Detailed support matrix: - Supported Vertical Features diff --git a/package-lock.json b/package-lock.json index c71cc93d4..2f851ef9b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "azurite", - "version": "3.22.0", + "version": "3.23.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "azurite", - "version": "3.22.0", + "version": "3.23.0", "license": "MIT", "dependencies": { "@azure/ms-rest-js": "^1.5.0", diff --git a/package.json b/package.json index 41672b686..7711b4e33 100644 --- a/package.json +++ b/package.json @@ -3,7 +3,7 @@ "displayName": "Azurite", "description": "An open source Azure Storage API compatible server", "icon": "icon.png", - "version": "3.22.0", + "version": "3.23.0", "publisher": "Azurite", "categories": [ "Other" diff --git a/src/blob/utils/constants.ts b/src/blob/utils/constants.ts index 0de227d1d..32f6f2f13 100644 --- a/src/blob/utils/constants.ts +++ b/src/blob/utils/constants.ts @@ -1,8 +1,8 @@ import { StoreDestinationArray } from "../../common/persistence/IExtentStore"; import * as Models from "../generated/artifacts/models"; -export const VERSION = "3.22.0"; -export const BLOB_API_VERSION = "2021-12-02"; +export const VERSION = "3.23.0"; +export const BLOB_API_VERSION = "2022-11-02"; export const DEFAULT_BLOB_SERVER_HOST_NAME = "127.0.0.1"; // Change to 0.0.0.0 when needs external access export const DEFAULT_LIST_BLOBS_MAX_RESULTS = 5000; export const DEFAULT_LIST_CONTAINERS_MAX_RESULTS = 5000; @@ -96,6 +96,7 @@ export const DEFAULT_BLOB_PERSISTENCE_ARRAY: StoreDestinationArray = [ ]; export const ValidAPIVersions = [ + "2022-11-02", "2021-12-02", "2021-10-04", "2021-08-06", diff --git a/src/queue/utils/constants.ts b/src/queue/utils/constants.ts index bd4f74a2e..74afe3e32 100644 --- a/src/queue/utils/constants.ts +++ b/src/queue/utils/constants.ts @@ -1,7 +1,7 @@ import { StoreDestinationArray } from "../../common/persistence/IExtentStore"; -export const VERSION = "3.22.0"; -export const QUEUE_API_VERSION = "2021-10-04"; +export const VERSION = "3.23.0"; +export const QUEUE_API_VERSION = "2022-11-02"; export const DEFAULT_QUEUE_SERVER_HOST_NAME = "127.0.0.1"; // Change to 0.0.0.0 when needs external access export const DEFAULT_QUEUE_LISTENING_PORT = 10001; export const IS_PRODUCTION = process.env.NODE_ENV === "production"; @@ -90,6 +90,7 @@ export const DEFAULT_QUEUE_PERSISTENCE_ARRAY: StoreDestinationArray = [ ]; export const ValidAPIVersions = [ + "2022-11-02", "2021-12-02", "2021-10-04", "2021-08-06", diff --git a/src/table/utils/constants.ts b/src/table/utils/constants.ts index e834ec019..673f10f31 100644 --- a/src/table/utils/constants.ts +++ b/src/table/utils/constants.ts @@ -17,8 +17,8 @@ export enum TABLE_STATUSCODE { } export const DEFAULT_TABLE_CONTEXT_PATH = "azurite_table_context"; -export const TABLE_API_VERSION = "2021-12-02"; -export const VERSION = "3.22.0"; +export const TABLE_API_VERSION = "2022-11-02"; +export const VERSION = "3.23.0"; // Max Body size is 4 MB export const BODY_SIZE_MAX = 1024 * 1024 * 4; // Max Entity sizxe is 1 MB @@ -73,6 +73,7 @@ export const DEFAULT_TABLE_PERSISTENCE_ARRAY: StoreDestinationArray = [ export const QUERY_RESULT_MAX_NUM = 1000; export const ValidAPIVersions = [ + "2022-11-02", "2021-12-02", "2021-10-04", "2021-08-06", From 3b7a88da5351907d090f8e6faa0f900c6cf3e746 Mon Sep 17 00:00:00 2001 From: Emma Zhu Date: Thu, 30 Mar 2023 10:13:24 +0800 Subject: [PATCH 057/297] Resolve comments --- ChangeLog.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/ChangeLog.md b/ChangeLog.md index 1d2d311f3..3eac70ae4 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -4,6 +4,8 @@ ## Upcoming Release +## 2023.03 Version 3.23.0 + General: - Return 404 StatusCode when Storage account not exist From 31238b83f02db7607983de46fa312d78a15db94c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 31 Mar 2023 09:40:40 +0800 Subject: [PATCH 058/297] Bump @typescript-eslint/eslint-plugin from 5.56.0 to 5.57.0 (#1886) Bumps [@typescript-eslint/eslint-plugin](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/eslint-plugin) from 5.56.0 to 5.57.0. - [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases) - [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/eslint-plugin/CHANGELOG.md) - [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v5.57.0/packages/eslint-plugin) --- updated-dependencies: - dependency-name: "@typescript-eslint/eslint-plugin" dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 136 +++++++++++++++++++++++----------------------- 1 file changed, 68 insertions(+), 68 deletions(-) diff --git a/package-lock.json b/package-lock.json index 2f851ef9b..1881497e1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1551,15 +1551,15 @@ } }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.56.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.56.0.tgz", - "integrity": "sha512-ZNW37Ccl3oMZkzxrYDUX4o7cnuPgU+YrcaYXzsRtLB16I1FR5SHMqga3zGsaSliZADCWo2v8qHWqAYIj8nWCCg==", + "version": "5.57.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.57.0.tgz", + "integrity": "sha512-itag0qpN6q2UMM6Xgk6xoHa0D0/P+M17THnr4SVgqn9Rgam5k/He33MA7/D7QoJcdMxHFyX7U9imaBonAX/6qA==", "dev": true, "dependencies": { "@eslint-community/regexpp": "^4.4.0", - "@typescript-eslint/scope-manager": "5.56.0", - "@typescript-eslint/type-utils": "5.56.0", - "@typescript-eslint/utils": "5.56.0", + "@typescript-eslint/scope-manager": "5.57.0", + "@typescript-eslint/type-utils": "5.57.0", + "@typescript-eslint/utils": "5.57.0", "debug": "^4.3.4", "grapheme-splitter": "^1.0.4", "ignore": "^5.2.0", @@ -1732,13 +1732,13 @@ "dev": true }, "node_modules/@typescript-eslint/scope-manager": { - "version": "5.56.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.56.0.tgz", - "integrity": "sha512-jGYKyt+iBakD0SA5Ww8vFqGpoV2asSjwt60Gl6YcO8ksQ8s2HlUEyHBMSa38bdLopYqGf7EYQMUIGdT/Luw+sw==", + "version": "5.57.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.57.0.tgz", + "integrity": "sha512-NANBNOQvllPlizl9LatX8+MHi7bx7WGIWYjPHDmQe5Si/0YEYfxSljJpoTyTWFTgRy3X8gLYSE4xQ2U+aCozSw==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.56.0", - "@typescript-eslint/visitor-keys": "5.56.0" + "@typescript-eslint/types": "5.57.0", + "@typescript-eslint/visitor-keys": "5.57.0" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -1749,13 +1749,13 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "5.56.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.56.0.tgz", - "integrity": "sha512-8WxgOgJjWRy6m4xg9KoSHPzBNZeQbGlQOH7l2QEhQID/+YseaFxg5J/DLwWSsi9Axj4e/cCiKx7PVzOq38tY4A==", + "version": "5.57.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.57.0.tgz", + "integrity": "sha512-kxXoq9zOTbvqzLbdNKy1yFrxLC6GDJFE2Yuo3KqSwTmDOFjUGeWSakgoXT864WcK5/NAJkkONCiKb1ddsqhLXQ==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "5.56.0", - "@typescript-eslint/utils": "5.56.0", + "@typescript-eslint/typescript-estree": "5.57.0", + "@typescript-eslint/utils": "5.57.0", "debug": "^4.3.4", "tsutils": "^3.21.0" }, @@ -1799,9 +1799,9 @@ "dev": true }, "node_modules/@typescript-eslint/types": { - "version": "5.56.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.56.0.tgz", - "integrity": "sha512-JyAzbTJcIyhuUhogmiu+t79AkdnqgPUEsxMTMc/dCZczGMJQh1MK2wgrju++yMN6AWroVAy2jxyPcPr3SWCq5w==", + "version": "5.57.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.57.0.tgz", + "integrity": "sha512-mxsod+aZRSyLT+jiqHw1KK6xrANm19/+VFALVFP5qa/aiJnlP38qpyaTd0fEKhWvQk6YeNZ5LGwI1pDpBRBhtQ==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -1812,13 +1812,13 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.56.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.56.0.tgz", - "integrity": "sha512-41CH/GncsLXOJi0jb74SnC7jVPWeVJ0pxQj8bOjH1h2O26jXN3YHKDT1ejkVz5YeTEQPeLCCRY0U2r68tfNOcg==", + "version": "5.57.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.57.0.tgz", + "integrity": "sha512-LTzQ23TV82KpO8HPnWuxM2V7ieXW8O142I7hQTxWIHDcCEIjtkat6H96PFkYBQqGFLW/G/eVVOB9Z8rcvdY/Vw==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.56.0", - "@typescript-eslint/visitor-keys": "5.56.0", + "@typescript-eslint/types": "5.57.0", + "@typescript-eslint/visitor-keys": "5.57.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -1862,17 +1862,17 @@ "dev": true }, "node_modules/@typescript-eslint/utils": { - "version": "5.56.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.56.0.tgz", - "integrity": "sha512-XhZDVdLnUJNtbzaJeDSCIYaM+Tgr59gZGbFuELgF7m0IY03PlciidS7UQNKLE0+WpUTn1GlycEr6Ivb/afjbhA==", + "version": "5.57.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.57.0.tgz", + "integrity": "sha512-ps/4WohXV7C+LTSgAL5CApxvxbMkl9B9AUZRtnEFonpIxZDIT7wC1xfvuJONMidrkB9scs4zhtRyIwHh4+18kw==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@types/json-schema": "^7.0.9", "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.56.0", - "@typescript-eslint/types": "5.56.0", - "@typescript-eslint/typescript-estree": "5.56.0", + "@typescript-eslint/scope-manager": "5.57.0", + "@typescript-eslint/types": "5.57.0", + "@typescript-eslint/typescript-estree": "5.57.0", "eslint-scope": "^5.1.1", "semver": "^7.3.7" }, @@ -1888,12 +1888,12 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.56.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.56.0.tgz", - "integrity": "sha512-1mFdED7u5bZpX6Xxf5N9U2c18sb+8EvU3tyOIj6LQZ5OOvnmj8BVeNNP603OFPm5KkS1a7IvCIcwrdHXaEMG/Q==", + "version": "5.57.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.57.0.tgz", + "integrity": "sha512-ery2g3k0hv5BLiKpPuwYt9KBkAp2ugT6VvyShXdLOkax895EC55sP0Tx5L0fZaQueiK3fBLvHVvEl3jFS5ia+g==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.56.0", + "@typescript-eslint/types": "5.57.0", "eslint-visitor-keys": "^3.3.0" }, "engines": { @@ -11276,15 +11276,15 @@ } }, "@typescript-eslint/eslint-plugin": { - "version": "5.56.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.56.0.tgz", - "integrity": "sha512-ZNW37Ccl3oMZkzxrYDUX4o7cnuPgU+YrcaYXzsRtLB16I1FR5SHMqga3zGsaSliZADCWo2v8qHWqAYIj8nWCCg==", + "version": "5.57.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.57.0.tgz", + "integrity": "sha512-itag0qpN6q2UMM6Xgk6xoHa0D0/P+M17THnr4SVgqn9Rgam5k/He33MA7/D7QoJcdMxHFyX7U9imaBonAX/6qA==", "dev": true, "requires": { "@eslint-community/regexpp": "^4.4.0", - "@typescript-eslint/scope-manager": "5.56.0", - "@typescript-eslint/type-utils": "5.56.0", - "@typescript-eslint/utils": "5.56.0", + "@typescript-eslint/scope-manager": "5.57.0", + "@typescript-eslint/type-utils": "5.57.0", + "@typescript-eslint/utils": "5.57.0", "debug": "^4.3.4", "grapheme-splitter": "^1.0.4", "ignore": "^5.2.0", @@ -11381,23 +11381,23 @@ } }, "@typescript-eslint/scope-manager": { - "version": "5.56.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.56.0.tgz", - "integrity": "sha512-jGYKyt+iBakD0SA5Ww8vFqGpoV2asSjwt60Gl6YcO8ksQ8s2HlUEyHBMSa38bdLopYqGf7EYQMUIGdT/Luw+sw==", + "version": "5.57.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.57.0.tgz", + "integrity": "sha512-NANBNOQvllPlizl9LatX8+MHi7bx7WGIWYjPHDmQe5Si/0YEYfxSljJpoTyTWFTgRy3X8gLYSE4xQ2U+aCozSw==", "dev": true, "requires": { - "@typescript-eslint/types": "5.56.0", - "@typescript-eslint/visitor-keys": "5.56.0" + "@typescript-eslint/types": "5.57.0", + "@typescript-eslint/visitor-keys": "5.57.0" } }, "@typescript-eslint/type-utils": { - "version": "5.56.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.56.0.tgz", - "integrity": "sha512-8WxgOgJjWRy6m4xg9KoSHPzBNZeQbGlQOH7l2QEhQID/+YseaFxg5J/DLwWSsi9Axj4e/cCiKx7PVzOq38tY4A==", + "version": "5.57.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.57.0.tgz", + "integrity": "sha512-kxXoq9zOTbvqzLbdNKy1yFrxLC6GDJFE2Yuo3KqSwTmDOFjUGeWSakgoXT864WcK5/NAJkkONCiKb1ddsqhLXQ==", "dev": true, "requires": { - "@typescript-eslint/typescript-estree": "5.56.0", - "@typescript-eslint/utils": "5.56.0", + "@typescript-eslint/typescript-estree": "5.57.0", + "@typescript-eslint/utils": "5.57.0", "debug": "^4.3.4", "tsutils": "^3.21.0" }, @@ -11420,19 +11420,19 @@ } }, "@typescript-eslint/types": { - "version": "5.56.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.56.0.tgz", - "integrity": "sha512-JyAzbTJcIyhuUhogmiu+t79AkdnqgPUEsxMTMc/dCZczGMJQh1MK2wgrju++yMN6AWroVAy2jxyPcPr3SWCq5w==", + "version": "5.57.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.57.0.tgz", + "integrity": "sha512-mxsod+aZRSyLT+jiqHw1KK6xrANm19/+VFALVFP5qa/aiJnlP38qpyaTd0fEKhWvQk6YeNZ5LGwI1pDpBRBhtQ==", "dev": true }, "@typescript-eslint/typescript-estree": { - "version": "5.56.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.56.0.tgz", - "integrity": "sha512-41CH/GncsLXOJi0jb74SnC7jVPWeVJ0pxQj8bOjH1h2O26jXN3YHKDT1ejkVz5YeTEQPeLCCRY0U2r68tfNOcg==", + "version": "5.57.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.57.0.tgz", + "integrity": "sha512-LTzQ23TV82KpO8HPnWuxM2V7ieXW8O142I7hQTxWIHDcCEIjtkat6H96PFkYBQqGFLW/G/eVVOB9Z8rcvdY/Vw==", "dev": true, "requires": { - "@typescript-eslint/types": "5.56.0", - "@typescript-eslint/visitor-keys": "5.56.0", + "@typescript-eslint/types": "5.57.0", + "@typescript-eslint/visitor-keys": "5.57.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -11458,28 +11458,28 @@ } }, "@typescript-eslint/utils": { - "version": "5.56.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.56.0.tgz", - "integrity": "sha512-XhZDVdLnUJNtbzaJeDSCIYaM+Tgr59gZGbFuELgF7m0IY03PlciidS7UQNKLE0+WpUTn1GlycEr6Ivb/afjbhA==", + "version": "5.57.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.57.0.tgz", + "integrity": "sha512-ps/4WohXV7C+LTSgAL5CApxvxbMkl9B9AUZRtnEFonpIxZDIT7wC1xfvuJONMidrkB9scs4zhtRyIwHh4+18kw==", "dev": true, "requires": { "@eslint-community/eslint-utils": "^4.2.0", "@types/json-schema": "^7.0.9", "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.56.0", - "@typescript-eslint/types": "5.56.0", - "@typescript-eslint/typescript-estree": "5.56.0", + "@typescript-eslint/scope-manager": "5.57.0", + "@typescript-eslint/types": "5.57.0", + "@typescript-eslint/typescript-estree": "5.57.0", "eslint-scope": "^5.1.1", "semver": "^7.3.7" } }, "@typescript-eslint/visitor-keys": { - "version": "5.56.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.56.0.tgz", - "integrity": "sha512-1mFdED7u5bZpX6Xxf5N9U2c18sb+8EvU3tyOIj6LQZ5OOvnmj8BVeNNP603OFPm5KkS1a7IvCIcwrdHXaEMG/Q==", + "version": "5.57.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.57.0.tgz", + "integrity": "sha512-ery2g3k0hv5BLiKpPuwYt9KBkAp2ugT6VvyShXdLOkax895EC55sP0Tx5L0fZaQueiK3fBLvHVvEl3jFS5ia+g==", "dev": true, "requires": { - "@typescript-eslint/types": "5.56.0", + "@typescript-eslint/types": "5.57.0", "eslint-visitor-keys": "^3.3.0" } }, From 2f19ab2357ca50c1b5f9701b24cef6be22d12e29 Mon Sep 17 00:00:00 2001 From: Emma Zhu Date: Thu, 30 Mar 2023 13:38:37 +0800 Subject: [PATCH 059/297] Fix issue of batch blob request from cpp SDK doesn't work: 1822 --- ChangeLog.md | 4 ++++ src/blob/handlers/BlobBatchHandler.ts | 1 + 2 files changed, 5 insertions(+) diff --git a/ChangeLog.md b/ChangeLog.md index 3eac70ae4..31178c8ef 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -4,6 +4,10 @@ ## Upcoming Release +Blob: + +- Fixed issue of: blob batch subresponse is slightly different from the on from Azure serivce, which causes exception in CPP SDK. + ## 2023.03 Version 3.23.0 General: diff --git a/src/blob/handlers/BlobBatchHandler.ts b/src/blob/handlers/BlobBatchHandler.ts index 9902c2995..2c14aa8ff 100644 --- a/src/blob/handlers/BlobBatchHandler.ts +++ b/src/blob/handlers/BlobBatchHandler.ts @@ -449,6 +449,7 @@ private serializeSubResponse( if (bodyContent !== "") { responseBody += HTTP_LINE_ENDING + bodyContent + HTTP_LINE_ENDING; } + responseBody += HTTP_LINE_ENDING; }); responseBody += responseEnding; From ebbdffc90f89ec3f6f0fa77d85bc4f65ce04ae96 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 31 Mar 2023 14:23:23 +0800 Subject: [PATCH 060/297] Bump typescript from 4.9.5 to 5.0.3 (#1887) Bumps [typescript](https://github.com/Microsoft/TypeScript) from 4.9.5 to 5.0.3. - [Release notes](https://github.com/Microsoft/TypeScript/releases) - [Commits](https://github.com/Microsoft/TypeScript/commits) --- updated-dependencies: - dependency-name: typescript dependency-type: direct:development update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 16 ++++++++-------- package.json | 2 +- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/package-lock.json b/package-lock.json index 1881497e1..3a52811bd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -80,7 +80,7 @@ "rcedit": "^3.0.1", "ts-mockito": "^2.6.1", "ts-node": "^10.0.0", - "typescript": "^4.9.5", + "typescript": "^5.0.3", "vsce": "^2.7.0" }, "engines": { @@ -9568,16 +9568,16 @@ } }, "node_modules/typescript": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", - "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.3.tgz", + "integrity": "sha512-xv8mOEDnigb/tN9PSMTwSEqAnUvkoXMQlicOb0IUVDBSQCgBSaAAROUZYy2IcUy5qU6XajK5jjjO7TMWqBTKZA==", "dev": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" }, "engines": { - "node": ">=4.2.0" + "node": ">=12.20" } }, "node_modules/uc.micro": { @@ -17382,9 +17382,9 @@ } }, "typescript": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", - "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.3.tgz", + "integrity": "sha512-xv8mOEDnigb/tN9PSMTwSEqAnUvkoXMQlicOb0IUVDBSQCgBSaAAROUZYy2IcUy5qU6XajK5jjjO7TMWqBTKZA==", "dev": true }, "uc.micro": { diff --git a/package.json b/package.json index 7711b4e33..abc4688e6 100644 --- a/package.json +++ b/package.json @@ -85,7 +85,7 @@ "rcedit": "^3.0.1", "ts-mockito": "^2.6.1", "ts-node": "^10.0.0", - "typescript": "^4.9.5", + "typescript": "^5.0.3", "vsce": "^2.7.0" }, "activationEvents": [ From a03dc2a9e43ad9c70ec49cf1a2834db0425007bb Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 31 Mar 2023 14:24:01 +0800 Subject: [PATCH 061/297] Bump tedious from 15.1.0 to 15.1.3 (#1876) Bumps [tedious](https://github.com/tediousjs/tedious) from 15.1.0 to 15.1.3. - [Release notes](https://github.com/tediousjs/tedious/releases) - [Commits](https://github.com/tediousjs/tedious/compare/v15.1.0...v15.1.3) --- updated-dependencies: - dependency-name: tedious dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 30 ++++++------------------------ 1 file changed, 6 insertions(+), 24 deletions(-) diff --git a/package-lock.json b/package-lock.json index 3a52811bd..528daba5f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1317,14 +1317,6 @@ "@types/ms": "*" } }, - "node_modules/@types/es-aggregate-error": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@types/es-aggregate-error/-/es-aggregate-error-1.0.2.tgz", - "integrity": "sha512-erqUpFXksaeR2kejKnhnjZjbFxUpGZx4Z7ydNL9ie8tEhXPiZTsLeUDJ6aR1F8j5wWUAtOAQWUqkc7givBJbBA==", - "dependencies": { - "@types/node": "*" - } - }, "node_modules/@types/etag": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/@types/etag/-/etag-1.8.1.tgz", @@ -9279,14 +9271,13 @@ } }, "node_modules/tedious": { - "version": "15.1.0", - "resolved": "https://registry.npmjs.org/tedious/-/tedious-15.1.0.tgz", - "integrity": "sha512-D96Z8SL4ALE/rS6rOAfzWd/x+RD9vWbnNT3w5KZ0e0Tdh5FX1bKEODS+1oemSQM2ok5SktLHqSJqYQRx4yu3WA==", + "version": "15.1.3", + "resolved": "https://registry.npmjs.org/tedious/-/tedious-15.1.3.tgz", + "integrity": "sha512-166EpRm5qknwhEisjZqz/mF7k14fXKJYHRg6XiAXVovd/YkyHJ3SG4Ppy89caPaNFfRr7PVYe+s4dAvKaCMFvw==", "dependencies": { "@azure/identity": "^2.0.4", "@azure/keyvault-keys": "^4.4.0", "@js-joda/core": "^5.2.0", - "@types/es-aggregate-error": "^1.0.2", "bl": "^5.0.0", "es-aggregate-error": "^1.0.8", "iconv-lite": "^0.6.3", @@ -11042,14 +11033,6 @@ "@types/ms": "*" } }, - "@types/es-aggregate-error": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@types/es-aggregate-error/-/es-aggregate-error-1.0.2.tgz", - "integrity": "sha512-erqUpFXksaeR2kejKnhnjZjbFxUpGZx4Z7ydNL9ie8tEhXPiZTsLeUDJ6aR1F8j5wWUAtOAQWUqkc7givBJbBA==", - "requires": { - "@types/node": "*" - } - }, "@types/etag": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/@types/etag/-/etag-1.8.1.tgz", @@ -17160,14 +17143,13 @@ } }, "tedious": { - "version": "15.1.0", - "resolved": "https://registry.npmjs.org/tedious/-/tedious-15.1.0.tgz", - "integrity": "sha512-D96Z8SL4ALE/rS6rOAfzWd/x+RD9vWbnNT3w5KZ0e0Tdh5FX1bKEODS+1oemSQM2ok5SktLHqSJqYQRx4yu3WA==", + "version": "15.1.3", + "resolved": "https://registry.npmjs.org/tedious/-/tedious-15.1.3.tgz", + "integrity": "sha512-166EpRm5qknwhEisjZqz/mF7k14fXKJYHRg6XiAXVovd/YkyHJ3SG4Ppy89caPaNFfRr7PVYe+s4dAvKaCMFvw==", "requires": { "@azure/identity": "^2.0.4", "@azure/keyvault-keys": "^4.4.0", "@js-joda/core": "^5.2.0", - "@types/es-aggregate-error": "^1.0.2", "bl": "^5.0.0", "es-aggregate-error": "^1.0.8", "iconv-lite": "^0.6.3", From 7bde09fc0a5d765b477b01f4fb3ca5d780f25ce6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 31 Mar 2023 14:24:21 +0800 Subject: [PATCH 062/297] Bump lint-staged from 13.0.3 to 13.2.0 (#1875) Bumps [lint-staged](https://github.com/okonet/lint-staged) from 13.0.3 to 13.2.0. - [Release notes](https://github.com/okonet/lint-staged/releases) - [Commits](https://github.com/okonet/lint-staged/compare/v13.0.3...v13.2.0) --- updated-dependencies: - dependency-name: lint-staged dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 1042 ++++++++++++++++++++------------------------- 1 file changed, 472 insertions(+), 570 deletions(-) diff --git a/package-lock.json b/package-lock.json index 528daba5f..b7577da06 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3587,6 +3587,15 @@ "node": ">= 0.8" } }, + "node_modules/commander": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.0.tgz", + "integrity": "sha512-zS5PnTI22FIRM6ylNW8G4Ap0IEOyk62fhLSD0+uHRT9McRCLGpkVNvao4bjimpK/GShynyQkFFxHhwMcETmduA==", + "dev": true, + "engines": { + "node": ">=14" + } + }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -4648,6 +4657,88 @@ "node": ">=0.8.x" } }, + "node_modules/execa": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-7.1.1.tgz", + "integrity": "sha512-wH0eMf/UXckdUYnO21+HDztteVv05rq2GXksxT4fCGeHkBhw1DROXh40wcjMcRqDOWE7iPJ4n3M7e2+YFP+76Q==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.1", + "human-signals": "^4.3.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^3.0.7", + "strip-final-newline": "^3.0.0" + }, + "engines": { + "node": "^14.18.0 || ^16.14.0 || >=18.0.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/execa/node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/execa/node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/execa/node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/execa/node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/execa/node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, "node_modules/exit": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", @@ -5163,6 +5254,18 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/get-symbol-description": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", @@ -5735,12 +5838,12 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "node_modules/human-signals": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-3.0.1.tgz", - "integrity": "sha512-rQLskxnM/5OCldHo+wNXbpVgDn5A17CUoKX+7Sokwaknlq7CdSnphy0W39GU8dw59XiCXmFXDg4fRuckQRKewQ==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz", + "integrity": "sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==", "dev": true, "engines": { - "node": ">=12.20.0" + "node": ">=14.18.0" } }, "node_modules/husky": { @@ -6017,6 +6120,15 @@ "node": ">=0.10.0" } }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", @@ -6094,6 +6206,18 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-string": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", @@ -6382,9 +6506,9 @@ } }, "node_modules/lilconfig": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.5.tgz", - "integrity": "sha512-xaYmXZtTHPAw5m+xLN8ab9C+3a8YmV3asNSPOATITbtwrfbwaLJj8h66H1WMIpALCkqsIzK3h7oQ+PdX+LQ9Eg==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", + "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", "dev": true, "engines": { "node": ">=10" @@ -6400,24 +6524,24 @@ } }, "node_modules/lint-staged": { - "version": "13.0.3", - "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-13.0.3.tgz", - "integrity": "sha512-9hmrwSCFroTSYLjflGI8Uk+GWAwMB4OlpU4bMJEAT5d/llQwtYKoim4bLOyLCuWFAhWEupE0vkIFqtw/WIsPug==", + "version": "13.2.0", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-13.2.0.tgz", + "integrity": "sha512-GbyK5iWinax5Dfw5obm2g2ccUiZXNGtAS4mCbJ0Lv4rq6iEtfBSjOYdcbOtAIFtM114t0vdpViDDetjVTSd8Vw==", "dev": true, "dependencies": { + "chalk": "5.2.0", "cli-truncate": "^3.1.0", - "colorette": "^2.0.17", - "commander": "^9.3.0", + "commander": "^10.0.0", "debug": "^4.3.4", - "execa": "^6.1.0", - "lilconfig": "2.0.5", - "listr2": "^4.0.5", + "execa": "^7.0.0", + "lilconfig": "2.1.0", + "listr2": "^5.0.7", "micromatch": "^4.0.5", "normalize-path": "^3.0.0", - "object-inspect": "^1.12.2", + "object-inspect": "^1.12.3", "pidtree": "^0.6.0", "string-argv": "^0.3.1", - "yaml": "^2.1.1" + "yaml": "^2.2.1" }, "bin": { "lint-staged": "bin/lint-staged.js" @@ -6441,27 +6565,16 @@ "node": ">=8" } }, - "node_modules/lint-staged/node_modules/commander": { - "version": "9.3.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-9.3.0.tgz", - "integrity": "sha512-hv95iU5uXPbK83mjrJKuZyFM/LBAoCV/XhVGkS5Je6tl7sxr6A0ITMw5WoRV46/UaJ46Nllm3Xt7IaJhXTIkzw==", + "node_modules/lint-staged/node_modules/chalk": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.2.0.tgz", + "integrity": "sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==", "dev": true, "engines": { - "node": "^12.20.0 || >=14" - } - }, - "node_modules/lint-staged/node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" + "node": "^12.17.0 || ^14.13 || >=16.0.0" }, - "engines": { - "node": ">= 8" + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/lint-staged/node_modules/debug": { @@ -6481,29 +6594,6 @@ } } }, - "node_modules/lint-staged/node_modules/execa": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-6.1.0.tgz", - "integrity": "sha512-QVWlX2e50heYJcCPG0iWtf8r0xjEYfz/OYLGDYH+IyjWezzPNxz63qNFOu0l4YftGWuizFVZHHs8PrLU5p2IDA==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.1", - "human-signals": "^3.0.1", - "is-stream": "^3.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^5.1.0", - "onetime": "^6.0.0", - "signal-exit": "^3.0.7", - "strip-final-newline": "^3.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, "node_modules/lint-staged/node_modules/fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", @@ -6516,18 +6606,6 @@ "node": ">=8" } }, - "node_modules/lint-staged/node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/lint-staged/node_modules/is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", @@ -6537,18 +6615,6 @@ "node": ">=0.12.0" } }, - "node_modules/lint-staged/node_modules/is-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", - "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", - "dev": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/lint-staged/node_modules/micromatch": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", @@ -6562,96 +6628,12 @@ "node": ">=8.6" } }, - "node_modules/lint-staged/node_modules/mimic-fn": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", - "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/lint-staged/node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, - "node_modules/lint-staged/node_modules/npm-run-path": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz", - "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==", - "dev": true, - "dependencies": { - "path-key": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lint-staged/node_modules/npm-run-path/node_modules/path-key": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", - "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lint-staged/node_modules/onetime": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", - "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", - "dev": true, - "dependencies": { - "mimic-fn": "^4.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lint-staged/node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/lint-staged/node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/lint-staged/node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/lint-staged/node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -6664,55 +6646,31 @@ "node": ">=8.0" } }, - "node_modules/lint-staged/node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, "node_modules/listr2": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/listr2/-/listr2-4.0.5.tgz", - "integrity": "sha512-juGHV1doQdpNT3GSTs9IUN43QJb7KHdF9uqg7Vufs/tG9VTzpFphqF4pm/ICdAABGQxsyNn9CiYA3StkI6jpwA==", + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-5.0.8.tgz", + "integrity": "sha512-mC73LitKHj9w6v30nLNGPetZIlfpUniNSsxxrbaPcWOjDb92SHPzJPi/t+v1YC/lxKz/AJ9egOjww0qUuFxBpA==", "dev": true, "dependencies": { "cli-truncate": "^2.1.0", - "colorette": "^2.0.16", + "colorette": "^2.0.19", "log-update": "^4.0.0", "p-map": "^4.0.0", "rfdc": "^1.3.0", - "rxjs": "^7.5.5", + "rxjs": "^7.8.0", "through": "^2.3.8", "wrap-ansi": "^7.0.0" }, "engines": { - "node": ">=12" + "node": "^14.13.1 || >=16.0.0" }, "peerDependencies": { "enquirer": ">= 2.3.0 < 3" }, "peerDependenciesMeta": { "enquirer": { - "optional": true - } - } - }, - "node_modules/listr2/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "engines": { - "node": ">=8" + "optional": true + } } }, "node_modules/listr2/node_modules/ansi-styles": { @@ -6764,15 +6722,6 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "node_modules/listr2/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/listr2/node_modules/slice-ansi": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", @@ -6787,32 +6736,6 @@ "node": ">=8" } }, - "node_modules/listr2/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/listr2/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", @@ -6934,15 +6857,6 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "node_modules/log-update/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/log-update/node_modules/slice-ansi": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", @@ -6960,20 +6874,6 @@ "url": "https://github.com/chalk/slice-ansi?sponsor=1" } }, - "node_modules/log-update/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/log-update/node_modules/strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", @@ -7154,12 +7054,15 @@ } }, "node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", "dev": true, "engines": { - "node": ">=6" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/mimic-response": { @@ -7497,6 +7400,21 @@ "node": ">=0.10.0" } }, + "node_modules/npm-run-path": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz", + "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==", + "dev": true, + "dependencies": { + "path-key": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/nth-check": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.0.1.tgz", @@ -7528,9 +7446,9 @@ } }, "node_modules/object-inspect": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", - "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -7596,15 +7514,15 @@ } }, "node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", "dev": true, "dependencies": { - "mimic-fn": "^2.1.0" + "mimic-fn": "^4.0.0" }, "engines": { - "node": ">=6" + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -7767,6 +7685,18 @@ "node": ">=0.10.0" } }, + "node_modules/path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/path-parse": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", @@ -7973,29 +7903,6 @@ "node": ">=8" } }, - "node_modules/pkg-fetch/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-fetch/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/pkg-fetch/node_modules/strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", @@ -8595,6 +8502,30 @@ "node": ">=8" } }, + "node_modules/restore-cursor/node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/restore-cursor/node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/retry-as-promised": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/retry-as-promised/-/retry-as-promised-5.0.0.tgz", @@ -8654,9 +8585,9 @@ } }, "node_modules/rxjs": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.5.5.tgz", - "integrity": "sha512-sy+H0pQofO95VDmFLzyaw9xNJU4KTRSwQIGM6+iG3SypAtCiLDzpeG8sJrNCWn2Up9km+KhkvTdbkrdy+yzZdw==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.0.tgz", + "integrity": "sha512-F2+gxDshqmIub1KdvZkaEfGDwLNpPvk9Fs6LD/MyQxNgMds/WH9OdDDXOmxUZpME+iSK3rQCctkL0DYyytUqMg==", "dev": true, "dependencies": { "tslib": "^2.1.0" @@ -9129,6 +9060,41 @@ "node": ">=0.6.19" } }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/string.prototype.trimend": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz", @@ -9322,7 +9288,7 @@ "node_modules/through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", "dev": true }, "node_modules/tmp": { @@ -9940,29 +9906,6 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "node_modules/wrap-ansi/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi/node_modules/string-width": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", - "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/wrap-ansi/node_modules/strip-ansi": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", @@ -10007,9 +9950,9 @@ "dev": true }, "node_modules/yaml": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.1.1.tgz", - "integrity": "sha512-o96x3OPo8GjWeSLF+wOAbrPfhFOGY0W00GNaxCDv+9hkcDJEnev1yh8S7pgHF0ik6zc8sQLuL8hjHjJULZp8bw==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.2.1.tgz", + "integrity": "sha512-e0WHiYql7+9wr4cWMx3TVQrNwejKaEe7/rHNmQmqRjazfOP5W8PB6Jpebb5o6fIapbz9o9+2ipcaTM2ZwDI6lw==", "dev": true, "engines": { "node": ">= 14" @@ -12966,6 +12909,12 @@ "delayed-stream": "~1.0.0" } }, + "commander": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.0.tgz", + "integrity": "sha512-zS5PnTI22FIRM6ylNW8G4Ap0IEOyk62fhLSD0+uHRT9McRCLGpkVNvao4bjimpK/GShynyQkFFxHhwMcETmduA==", + "dev": true + }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -13708,28 +13657,88 @@ } } }, - "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true - }, - "esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true - }, - "etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" - }, - "events": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.1.0.tgz", - "integrity": "sha512-Rv+u8MLHNOdMjTAFeT3nCjHn2aGlx435FP/sDHNaRhDEMwyI/aB22Kj2qIN8R0cw3z28psEQLYwxVKLsKrMgWg==" - }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" + }, + "events": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.1.0.tgz", + "integrity": "sha512-Rv+u8MLHNOdMjTAFeT3nCjHn2aGlx435FP/sDHNaRhDEMwyI/aB22Kj2qIN8R0cw3z28psEQLYwxVKLsKrMgWg==" + }, + "execa": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-7.1.1.tgz", + "integrity": "sha512-wH0eMf/UXckdUYnO21+HDztteVv05rq2GXksxT4fCGeHkBhw1DROXh40wcjMcRqDOWE7iPJ4n3M7e2+YFP+76Q==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.1", + "human-signals": "^4.3.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^3.0.7", + "strip-final-newline": "^3.0.0" + }, + "dependencies": { + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, "exit": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", @@ -14125,6 +14134,12 @@ "has-symbols": "^1.0.1" } }, + "get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true + }, "get-symbol-description": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", @@ -14539,9 +14554,9 @@ } }, "human-signals": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-3.0.1.tgz", - "integrity": "sha512-rQLskxnM/5OCldHo+wNXbpVgDn5A17CUoKX+7Sokwaknlq7CdSnphy0W39GU8dw59XiCXmFXDg4fRuckQRKewQ==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz", + "integrity": "sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==", "dev": true }, "husky": { @@ -14722,6 +14737,12 @@ "number-is-nan": "^1.0.0" } }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, "is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", @@ -14772,6 +14793,12 @@ "call-bind": "^1.0.2" } }, + "is-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "dev": true + }, "is-string": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", @@ -15011,9 +15038,9 @@ } }, "lilconfig": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.5.tgz", - "integrity": "sha512-xaYmXZtTHPAw5m+xLN8ab9C+3a8YmV3asNSPOATITbtwrfbwaLJj8h66H1WMIpALCkqsIzK3h7oQ+PdX+LQ9Eg==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", + "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", "dev": true }, "linkify-it": { @@ -15026,24 +15053,24 @@ } }, "lint-staged": { - "version": "13.0.3", - "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-13.0.3.tgz", - "integrity": "sha512-9hmrwSCFroTSYLjflGI8Uk+GWAwMB4OlpU4bMJEAT5d/llQwtYKoim4bLOyLCuWFAhWEupE0vkIFqtw/WIsPug==", + "version": "13.2.0", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-13.2.0.tgz", + "integrity": "sha512-GbyK5iWinax5Dfw5obm2g2ccUiZXNGtAS4mCbJ0Lv4rq6iEtfBSjOYdcbOtAIFtM114t0vdpViDDetjVTSd8Vw==", "dev": true, "requires": { + "chalk": "5.2.0", "cli-truncate": "^3.1.0", - "colorette": "^2.0.17", - "commander": "^9.3.0", + "commander": "^10.0.0", "debug": "^4.3.4", - "execa": "^6.1.0", - "lilconfig": "2.0.5", - "listr2": "^4.0.5", + "execa": "^7.0.0", + "lilconfig": "2.1.0", + "listr2": "^5.0.7", "micromatch": "^4.0.5", "normalize-path": "^3.0.0", - "object-inspect": "^1.12.2", + "object-inspect": "^1.12.3", "pidtree": "^0.6.0", "string-argv": "^0.3.1", - "yaml": "^2.1.1" + "yaml": "^2.2.1" }, "dependencies": { "braces": { @@ -15055,23 +15082,12 @@ "fill-range": "^7.0.1" } }, - "commander": { - "version": "9.3.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-9.3.0.tgz", - "integrity": "sha512-hv95iU5uXPbK83mjrJKuZyFM/LBAoCV/XhVGkS5Je6tl7sxr6A0ITMw5WoRV46/UaJ46Nllm3Xt7IaJhXTIkzw==", + "chalk": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.2.0.tgz", + "integrity": "sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==", "dev": true }, - "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, "debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -15081,23 +15097,6 @@ "ms": "2.1.2" } }, - "execa": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-6.1.0.tgz", - "integrity": "sha512-QVWlX2e50heYJcCPG0iWtf8r0xjEYfz/OYLGDYH+IyjWezzPNxz63qNFOu0l4YftGWuizFVZHHs8PrLU5p2IDA==", - "dev": true, - "requires": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.1", - "human-signals": "^3.0.1", - "is-stream": "^3.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^5.1.0", - "onetime": "^6.0.0", - "signal-exit": "^3.0.7", - "strip-final-newline": "^3.0.0" - } - }, "fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", @@ -15107,24 +15106,12 @@ "to-regex-range": "^5.0.1" } }, - "get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true - }, "is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true }, - "is-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", - "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", - "dev": true - }, "micromatch": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", @@ -15135,65 +15122,12 @@ "picomatch": "^2.3.1" } }, - "mimic-fn": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", - "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", - "dev": true - }, "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, - "npm-run-path": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz", - "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==", - "dev": true, - "requires": { - "path-key": "^4.0.0" - }, - "dependencies": { - "path-key": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", - "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", - "dev": true - } - } - }, - "onetime": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", - "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", - "dev": true, - "requires": { - "mimic-fn": "^4.0.0" - } - }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true - }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true - }, "to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -15202,40 +15136,25 @@ "requires": { "is-number": "^7.0.0" } - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } } } }, "listr2": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/listr2/-/listr2-4.0.5.tgz", - "integrity": "sha512-juGHV1doQdpNT3GSTs9IUN43QJb7KHdF9uqg7Vufs/tG9VTzpFphqF4pm/ICdAABGQxsyNn9CiYA3StkI6jpwA==", + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-5.0.8.tgz", + "integrity": "sha512-mC73LitKHj9w6v30nLNGPetZIlfpUniNSsxxrbaPcWOjDb92SHPzJPi/t+v1YC/lxKz/AJ9egOjww0qUuFxBpA==", "dev": true, "requires": { "cli-truncate": "^2.1.0", - "colorette": "^2.0.16", + "colorette": "^2.0.19", "log-update": "^4.0.0", "p-map": "^4.0.0", "rfdc": "^1.3.0", - "rxjs": "^7.5.5", + "rxjs": "^7.8.0", "through": "^2.3.8", "wrap-ansi": "^7.0.0" }, "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true - }, "ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", @@ -15270,12 +15189,6 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, "slice-ansi": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", @@ -15286,26 +15199,6 @@ "astral-regex": "^2.0.0", "is-fullwidth-code-point": "^3.0.0" } - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1" - } } } }, @@ -15406,12 +15299,6 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, "slice-ansi": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", @@ -15423,17 +15310,6 @@ "is-fullwidth-code-point": "^3.0.0" } }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, "strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", @@ -15587,9 +15463,9 @@ } }, "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", "dev": true }, "mimic-response": { @@ -15859,6 +15735,15 @@ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "dev": true }, + "npm-run-path": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz", + "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==", + "dev": true, + "requires": { + "path-key": "^4.0.0" + } + }, "nth-check": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.0.1.tgz", @@ -15881,9 +15766,9 @@ "dev": true }, "object-inspect": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", - "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==" + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==" }, "object-keys": { "version": "1.1.1", @@ -15931,12 +15816,12 @@ } }, "onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", "dev": true, "requires": { - "mimic-fn": "^2.1.0" + "mimic-fn": "^4.0.0" } }, "open": { @@ -16053,6 +15938,12 @@ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" }, + "path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "dev": true + }, "path-parse": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", @@ -16307,23 +16198,6 @@ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, "strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", @@ -16665,6 +16539,23 @@ "requires": { "onetime": "^5.1.0", "signal-exit": "^3.0.2" + }, + "dependencies": { + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true + }, + "onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "requires": { + "mimic-fn": "^2.1.0" + } + } } }, "retry-as-promised": { @@ -16702,9 +16593,9 @@ } }, "rxjs": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.5.5.tgz", - "integrity": "sha512-sy+H0pQofO95VDmFLzyaw9xNJU4KTRSwQIGM6+iG3SypAtCiLDzpeG8sJrNCWn2Up9km+KhkvTdbkrdy+yzZdw==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.0.tgz", + "integrity": "sha512-F2+gxDshqmIub1KdvZkaEfGDwLNpPvk9Fs6LD/MyQxNgMds/WH9OdDDXOmxUZpME+iSK3rQCctkL0DYyytUqMg==", "dev": true, "requires": { "tslib": "^2.1.0" @@ -17032,6 +16923,34 @@ "integrity": "sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg==", "dev": true }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + } + } + } + }, "string.prototype.trimend": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz", @@ -17190,7 +17109,7 @@ "through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", "dev": true }, "tmp": { @@ -17658,23 +17577,6 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "string-width": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", - "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - } - }, "strip-ansi": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", @@ -17712,9 +17614,9 @@ "dev": true }, "yaml": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.1.1.tgz", - "integrity": "sha512-o96x3OPo8GjWeSLF+wOAbrPfhFOGY0W00GNaxCDv+9hkcDJEnev1yh8S7pgHF0ik6zc8sQLuL8hjHjJULZp8bw==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.2.1.tgz", + "integrity": "sha512-e0WHiYql7+9wr4cWMx3TVQrNwejKaEe7/rHNmQmqRjazfOP5W8PB6Jpebb5o6fIapbz9o9+2ipcaTM2ZwDI6lw==", "dev": true }, "yauzl": { From d2ba0a6e501530202555c571d1cb40f85c33c65b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 3 Apr 2023 10:36:54 +0800 Subject: [PATCH 063/297] Bump @types/vscode from 1.76.0 to 1.77.0 (#1891) Bumps [@types/vscode](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/vscode) from 1.76.0 to 1.77.0. - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/vscode) --- updated-dependencies: - dependency-name: "@types/vscode" dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index b7577da06..e3ccba150 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1528,9 +1528,9 @@ "dev": true }, "node_modules/@types/vscode": { - "version": "1.76.0", - "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.76.0.tgz", - "integrity": "sha512-CQcY3+Fe5hNewHnOEAVYj4dd1do/QHliXaknAEYSXx2KEHUzFibDZSKptCon+HPgK55xx20pR+PBJjf0MomnBA==", + "version": "1.77.0", + "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.77.0.tgz", + "integrity": "sha512-MWFN5R7a33n8eJZJmdVlifjig3LWUNRrPeO1xemIcZ0ae0TEQuRc7G2xV0LUX78RZFECY1plYBn+dP/Acc3L0Q==", "dev": true }, "node_modules/@types/xml2js": { @@ -11187,9 +11187,9 @@ "dev": true }, "@types/vscode": { - "version": "1.76.0", - "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.76.0.tgz", - "integrity": "sha512-CQcY3+Fe5hNewHnOEAVYj4dd1do/QHliXaknAEYSXx2KEHUzFibDZSKptCon+HPgK55xx20pR+PBJjf0MomnBA==", + "version": "1.77.0", + "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.77.0.tgz", + "integrity": "sha512-MWFN5R7a33n8eJZJmdVlifjig3LWUNRrPeO1xemIcZ0ae0TEQuRc7G2xV0LUX78RZFECY1plYBn+dP/Acc3L0Q==", "dev": true }, "@types/xml2js": { From 5c0687a2746270819962867f5eb96f8965dec725 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 3 Apr 2023 10:37:04 +0800 Subject: [PATCH 064/297] Bump @typescript-eslint/parser from 5.56.0 to 5.57.0 (#1890) Bumps [@typescript-eslint/parser](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/parser) from 5.56.0 to 5.57.0. - [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases) - [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/parser/CHANGELOG.md) - [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v5.57.0/packages/parser) --- updated-dependencies: - dependency-name: "@typescript-eslint/parser" dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 139 ++++------------------------------------------ 1 file changed, 12 insertions(+), 127 deletions(-) diff --git a/package-lock.json b/package-lock.json index e3ccba150..5b8b057ee 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1600,14 +1600,14 @@ "dev": true }, "node_modules/@typescript-eslint/parser": { - "version": "5.56.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.56.0.tgz", - "integrity": "sha512-sn1OZmBxUsgxMmR8a8U5QM/Wl+tyqlH//jTqCg8daTAmhAk26L2PFhcqPLlYBhYUJMZJK276qLXlHN3a83o2cg==", + "version": "5.57.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.57.0.tgz", + "integrity": "sha512-orrduvpWYkgLCyAdNtR1QIWovcNZlEm6yL8nwH/eTxWLd8gsP+25pdLHYzL2QdkqrieaDwLpytHqycncv0woUQ==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "5.56.0", - "@typescript-eslint/types": "5.56.0", - "@typescript-eslint/typescript-estree": "5.56.0", + "@typescript-eslint/scope-manager": "5.57.0", + "@typescript-eslint/types": "5.57.0", + "@typescript-eslint/typescript-estree": "5.57.0", "debug": "^4.3.4" }, "engines": { @@ -1626,80 +1626,6 @@ } } }, - "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/scope-manager": { - "version": "5.56.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.56.0.tgz", - "integrity": "sha512-jGYKyt+iBakD0SA5Ww8vFqGpoV2asSjwt60Gl6YcO8ksQ8s2HlUEyHBMSa38bdLopYqGf7EYQMUIGdT/Luw+sw==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.56.0", - "@typescript-eslint/visitor-keys": "5.56.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/types": { - "version": "5.56.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.56.0.tgz", - "integrity": "sha512-JyAzbTJcIyhuUhogmiu+t79AkdnqgPUEsxMTMc/dCZczGMJQh1MK2wgrju++yMN6AWroVAy2jxyPcPr3SWCq5w==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/typescript-estree": { - "version": "5.56.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.56.0.tgz", - "integrity": "sha512-41CH/GncsLXOJi0jb74SnC7jVPWeVJ0pxQj8bOjH1h2O26jXN3YHKDT1ejkVz5YeTEQPeLCCRY0U2r68tfNOcg==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.56.0", - "@typescript-eslint/visitor-keys": "5.56.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/visitor-keys": { - "version": "5.56.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.56.0.tgz", - "integrity": "sha512-1mFdED7u5bZpX6Xxf5N9U2c18sb+8EvU3tyOIj6LQZ5OOvnmj8BVeNNP603OFPm5KkS1a7IvCIcwrdHXaEMG/Q==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.56.0", - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, "node_modules/@typescript-eslint/parser/node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -11237,58 +11163,17 @@ } }, "@typescript-eslint/parser": { - "version": "5.56.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.56.0.tgz", - "integrity": "sha512-sn1OZmBxUsgxMmR8a8U5QM/Wl+tyqlH//jTqCg8daTAmhAk26L2PFhcqPLlYBhYUJMZJK276qLXlHN3a83o2cg==", + "version": "5.57.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.57.0.tgz", + "integrity": "sha512-orrduvpWYkgLCyAdNtR1QIWovcNZlEm6yL8nwH/eTxWLd8gsP+25pdLHYzL2QdkqrieaDwLpytHqycncv0woUQ==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "5.56.0", - "@typescript-eslint/types": "5.56.0", - "@typescript-eslint/typescript-estree": "5.56.0", + "@typescript-eslint/scope-manager": "5.57.0", + "@typescript-eslint/types": "5.57.0", + "@typescript-eslint/typescript-estree": "5.57.0", "debug": "^4.3.4" }, "dependencies": { - "@typescript-eslint/scope-manager": { - "version": "5.56.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.56.0.tgz", - "integrity": "sha512-jGYKyt+iBakD0SA5Ww8vFqGpoV2asSjwt60Gl6YcO8ksQ8s2HlUEyHBMSa38bdLopYqGf7EYQMUIGdT/Luw+sw==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.56.0", - "@typescript-eslint/visitor-keys": "5.56.0" - } - }, - "@typescript-eslint/types": { - "version": "5.56.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.56.0.tgz", - "integrity": "sha512-JyAzbTJcIyhuUhogmiu+t79AkdnqgPUEsxMTMc/dCZczGMJQh1MK2wgrju++yMN6AWroVAy2jxyPcPr3SWCq5w==", - "dev": true - }, - "@typescript-eslint/typescript-estree": { - "version": "5.56.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.56.0.tgz", - "integrity": "sha512-41CH/GncsLXOJi0jb74SnC7jVPWeVJ0pxQj8bOjH1h2O26jXN3YHKDT1ejkVz5YeTEQPeLCCRY0U2r68tfNOcg==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.56.0", - "@typescript-eslint/visitor-keys": "5.56.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - } - }, - "@typescript-eslint/visitor-keys": { - "version": "5.56.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.56.0.tgz", - "integrity": "sha512-1mFdED7u5bZpX6Xxf5N9U2c18sb+8EvU3tyOIj6LQZ5OOvnmj8BVeNNP603OFPm5KkS1a7IvCIcwrdHXaEMG/Q==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.56.0", - "eslint-visitor-keys": "^3.3.0" - } - }, "debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", From c31d66464779fc44cb011830921dcaa0c2444763 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 3 Apr 2023 10:37:19 +0800 Subject: [PATCH 065/297] Bump @types/validator from 13.7.10 to 13.7.14 (#1888) Bumps [@types/validator](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/validator) from 13.7.10 to 13.7.14. - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/validator) --- updated-dependencies: - dependency-name: "@types/validator" dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 5b8b057ee..45fdfa7a5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1522,9 +1522,9 @@ } }, "node_modules/@types/validator": { - "version": "13.7.10", - "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.7.10.tgz", - "integrity": "sha512-t1yxFAR2n0+VO6hd/FJ9F2uezAZVWHLmpmlJzm1eX03+H7+HsuTAp7L8QJs+2pQCfWkP1+EXsGK9Z9v7o/qPVQ==", + "version": "13.7.14", + "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.7.14.tgz", + "integrity": "sha512-J6OAed6rhN6zyqL9Of6ZMamhlsOEU/poBVvbHr/dKOYKTeuYYMlDkMv+b6UUV0o2i0tw73cgyv/97WTWaUl0/g==", "dev": true }, "node_modules/@types/vscode": { @@ -11107,9 +11107,9 @@ } }, "@types/validator": { - "version": "13.7.10", - "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.7.10.tgz", - "integrity": "sha512-t1yxFAR2n0+VO6hd/FJ9F2uezAZVWHLmpmlJzm1eX03+H7+HsuTAp7L8QJs+2pQCfWkP1+EXsGK9Z9v7o/qPVQ==", + "version": "13.7.14", + "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.7.14.tgz", + "integrity": "sha512-J6OAed6rhN6zyqL9Of6ZMamhlsOEU/poBVvbHr/dKOYKTeuYYMlDkMv+b6UUV0o2i0tw73cgyv/97WTWaUl0/g==", "dev": true }, "@types/vscode": { From 0595b7156ae1005106d816cea977dc122842a587 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 3 Apr 2023 10:48:24 +0800 Subject: [PATCH 066/297] Bump eslint from 8.36.0 to 8.37.0 (#1889) Bumps [eslint](https://github.com/eslint/eslint) from 8.36.0 to 8.37.0. - [Release notes](https://github.com/eslint/eslint/releases) - [Changelog](https://github.com/eslint/eslint/blob/main/CHANGELOG.md) - [Commits](https://github.com/eslint/eslint/compare/v8.36.0...v8.37.0) --- updated-dependencies: - dependency-name: eslint dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 87 ++++++++++++++++++++++++----------------------- 1 file changed, 45 insertions(+), 42 deletions(-) diff --git a/package-lock.json b/package-lock.json index 45fdfa7a5..6537c2f97 100644 --- a/package-lock.json +++ b/package-lock.json @@ -890,14 +890,14 @@ } }, "node_modules/@eslint/eslintrc": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.1.tgz", - "integrity": "sha512-eFRmABvW2E5Ho6f5fHLqgena46rOj7r7OKHYfLElqcBfGFHHpjBhivyi5+jOEQuSpdc/1phIZJlbC2te+tZNIw==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.2.tgz", + "integrity": "sha512-3W4f5tDUra+pA+FzgugqL2pRimUTDJWKr7BINqOpkZrC0uYI0NIc0/JFgBROCU07HR6GieA5m3/rsPIhDmCXTQ==", "dev": true, "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", - "espree": "^9.5.0", + "espree": "^9.5.1", "globals": "^13.19.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", @@ -987,9 +987,9 @@ } }, "node_modules/@eslint/js": { - "version": "8.36.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.36.0.tgz", - "integrity": "sha512-lxJ9R5ygVm8ZWgYdUweoq5ownDlJ4upvoWmO4eLxBYHdMo+vZ/Rx0EN6MbKWDJOSUGrqJy2Gt+Dyv/VKml0fjg==", + "version": "8.37.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.37.0.tgz", + "integrity": "sha512-x5vzdtOOGgFVDCUs81QRB2+liax8rFg3+7hqM+QhBG0/G3F1ZsoYl97UrqgHgQ9KKT7G6c4V+aTUCgu/n22v1A==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -4142,15 +4142,15 @@ } }, "node_modules/eslint": { - "version": "8.36.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.36.0.tgz", - "integrity": "sha512-Y956lmS7vDqomxlaaQAHVmeb4tNMp2FWIvU/RnU5BD3IKMD/MJPr76xdyr68P8tV1iNMvN2mRK0yy3c+UjL+bw==", + "version": "8.37.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.37.0.tgz", + "integrity": "sha512-NU3Ps9nI05GUoVMxcZx1J8CNR6xOvUT4jAUMH5+z8lpp3aEdPVCImKw6PWG4PY+Vfkpr+jvMpxs/qoE7wq0sPw==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.4.0", - "@eslint/eslintrc": "^2.0.1", - "@eslint/js": "8.36.0", + "@eslint/eslintrc": "^2.0.2", + "@eslint/js": "8.37.0", "@humanwhocodes/config-array": "^0.11.8", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", @@ -4161,8 +4161,8 @@ "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", "eslint-scope": "^7.1.1", - "eslint-visitor-keys": "^3.3.0", - "espree": "^9.5.0", + "eslint-visitor-keys": "^3.4.0", + "espree": "^9.5.1", "esquery": "^1.4.2", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", @@ -4212,12 +4212,15 @@ } }, "node_modules/eslint-visitor-keys": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", - "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.0.tgz", + "integrity": "sha512-HPpKPUBQcAsZOsHAFwTtIKcYlCje62XB7SEAcxjtmW6TD1WVpkS6i6/hOVtTZIl4zGj/mBqpFVGvaDneik+VoQ==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, "node_modules/eslint/node_modules/ansi-regex": { @@ -4491,14 +4494,14 @@ } }, "node_modules/espree": { - "version": "9.5.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.0.tgz", - "integrity": "sha512-JPbJGhKc47++oo4JkEoTe2wjy4fmMwvFpgJT9cQzmfXKp22Dr6Hf1tdCteLz1h0P3t+mGvWZ+4Uankvh8+c6zw==", + "version": "9.5.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.1.tgz", + "integrity": "sha512-5yxtHSZXRSW5pvv3hAlXM5+/Oswi1AUFqBmbibKb5s6bp3rGIDkyXU6xCoyuuLhijr4SFwPrXRoZjz0AZDN9tg==", "dev": true, "dependencies": { "acorn": "^8.8.0", "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.3.0" + "eslint-visitor-keys": "^3.4.0" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -10581,14 +10584,14 @@ "dev": true }, "@eslint/eslintrc": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.1.tgz", - "integrity": "sha512-eFRmABvW2E5Ho6f5fHLqgena46rOj7r7OKHYfLElqcBfGFHHpjBhivyi5+jOEQuSpdc/1phIZJlbC2te+tZNIw==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.2.tgz", + "integrity": "sha512-3W4f5tDUra+pA+FzgugqL2pRimUTDJWKr7BINqOpkZrC0uYI0NIc0/JFgBROCU07HR6GieA5m3/rsPIhDmCXTQ==", "dev": true, "requires": { "ajv": "^6.12.4", "debug": "^4.3.2", - "espree": "^9.5.0", + "espree": "^9.5.1", "globals": "^13.19.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", @@ -10645,9 +10648,9 @@ } }, "@eslint/js": { - "version": "8.36.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.36.0.tgz", - "integrity": "sha512-lxJ9R5ygVm8ZWgYdUweoq5ownDlJ4upvoWmO4eLxBYHdMo+vZ/Rx0EN6MbKWDJOSUGrqJy2Gt+Dyv/VKml0fjg==", + "version": "8.37.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.37.0.tgz", + "integrity": "sha512-x5vzdtOOGgFVDCUs81QRB2+liax8rFg3+7hqM+QhBG0/G3F1ZsoYl97UrqgHgQ9KKT7G6c4V+aTUCgu/n22v1A==", "dev": true }, "@humanwhocodes/config-array": { @@ -13251,15 +13254,15 @@ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" }, "eslint": { - "version": "8.36.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.36.0.tgz", - "integrity": "sha512-Y956lmS7vDqomxlaaQAHVmeb4tNMp2FWIvU/RnU5BD3IKMD/MJPr76xdyr68P8tV1iNMvN2mRK0yy3c+UjL+bw==", + "version": "8.37.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.37.0.tgz", + "integrity": "sha512-NU3Ps9nI05GUoVMxcZx1J8CNR6xOvUT4jAUMH5+z8lpp3aEdPVCImKw6PWG4PY+Vfkpr+jvMpxs/qoE7wq0sPw==", "dev": true, "requires": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.4.0", - "@eslint/eslintrc": "^2.0.1", - "@eslint/js": "8.36.0", + "@eslint/eslintrc": "^2.0.2", + "@eslint/js": "8.37.0", "@humanwhocodes/config-array": "^0.11.8", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", @@ -13270,8 +13273,8 @@ "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", "eslint-scope": "^7.1.1", - "eslint-visitor-keys": "^3.3.0", - "espree": "^9.5.0", + "eslint-visitor-keys": "^3.4.0", + "espree": "^9.5.1", "esquery": "^1.4.2", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", @@ -13492,20 +13495,20 @@ } }, "eslint-visitor-keys": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", - "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.0.tgz", + "integrity": "sha512-HPpKPUBQcAsZOsHAFwTtIKcYlCje62XB7SEAcxjtmW6TD1WVpkS6i6/hOVtTZIl4zGj/mBqpFVGvaDneik+VoQ==", "dev": true }, "espree": { - "version": "9.5.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.0.tgz", - "integrity": "sha512-JPbJGhKc47++oo4JkEoTe2wjy4fmMwvFpgJT9cQzmfXKp22Dr6Hf1tdCteLz1h0P3t+mGvWZ+4Uankvh8+c6zw==", + "version": "9.5.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.1.tgz", + "integrity": "sha512-5yxtHSZXRSW5pvv3hAlXM5+/Oswi1AUFqBmbibKb5s6bp3rGIDkyXU6xCoyuuLhijr4SFwPrXRoZjz0AZDN9tg==", "dev": true, "requires": { "acorn": "^8.8.0", "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.3.0" + "eslint-visitor-keys": "^3.4.0" } }, "esquery": { From 7dd63170230c034ce01116185decc122748fd74c Mon Sep 17 00:00:00 2001 From: Edwin Huber Date: Mon, 3 Apr 2023 19:38:39 +0200 Subject: [PATCH 067/297] Allow single NOT operator in Table Query (#1881) * updated query parsing and associated tests --- ChangeLog.md | 1 + .../PredicateModel/StringPredicate.ts | 11 ++ .../StatePredicateFinished.ts | 5 +- .../QueryTranscriber/StatePredicateStarted.ts | 32 +++++- .../QueryTranscriber/StateProcessValue.ts | 28 ++++- tests/table/apis/table.entity.query.test.ts | 53 +++++++++ .../LokiJsQueryTranscriber.unit.test.2.ts | 103 +++++++++++------- .../unit/LokiJsQueryTranscriber.unit.test.ts | 36 +++--- 8 files changed, 204 insertions(+), 65 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index 31178c8ef..eec0536fa 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -26,6 +26,7 @@ Blob: Table: - Fixed issue for querying on identifiers starting with underscore. +- Corrected query parsing logic for single boolean terms. - Fixed issue for querying GUIDs using operators other than eq and ne - GUID queries only support persistent storage on legacy (string) format GUIDs for eq and ne operators, other operators will only evaluate newly stored entities. diff --git a/src/table/persistence/QueryTranscriber/PredicateModel/StringPredicate.ts b/src/table/persistence/QueryTranscriber/PredicateModel/StringPredicate.ts index b4e402f4a..d0c22004b 100644 --- a/src/table/persistence/QueryTranscriber/PredicateModel/StringPredicate.ts +++ b/src/table/persistence/QueryTranscriber/PredicateModel/StringPredicate.ts @@ -39,10 +39,21 @@ export default class StringPredicate implements IPredicate { */ private pushValue(taggedToken: TaggedToken, newTokens: TaggedToken[]) { if (taggedToken.type.isValue()) { + taggedToken.token = + "`" + + // need to convert double apostrope to single + this.replaceDoubleApostrophes( + taggedToken.token.substring(1, taggedToken.token.length - 1) + ) + + "`"; newTokens.push(new TaggedToken(taggedToken.token, new ValueToken())); } } + private replaceDoubleApostrophes(token: string) { + return token.replace(/(\'\')/g, "'"); + } + /** * Pushes the identifier to the string predicate * diff --git a/src/table/persistence/QueryTranscriber/StatePredicateFinished.ts b/src/table/persistence/QueryTranscriber/StatePredicateFinished.ts index 31960ce74..0964c61fe 100644 --- a/src/table/persistence/QueryTranscriber/StatePredicateFinished.ts +++ b/src/table/persistence/QueryTranscriber/StatePredicateFinished.ts @@ -35,6 +35,7 @@ export default class StatePredicateFinished onProcess = (context: QueryContext) => { let token = ""; + // when first predicate is a single operator, our token map is empty context = this.validatePredicate(context); [context, token] = this.getNextToken(context); @@ -349,11 +350,11 @@ export default class StatePredicateFinished const predicateType = context.taggedPredicates[offset].tokenMap.tokens[0].type; const predicateValue = - context.taggedPredicates[offset].tokenMap.tokens[0].token; + context.taggedPredicates[offset].tokenMap.tokens[0].token; if ( predicateType.isParensOpen() || predicateType.isParensClose() || - predicateType.isOperator()|| + predicateType.isOperator() || (predicateType.isValue() && this.isBooleanValue(predicateValue)) ) { return; diff --git a/src/table/persistence/QueryTranscriber/StatePredicateStarted.ts b/src/table/persistence/QueryTranscriber/StatePredicateStarted.ts index 3e79f66ff..827d71ada 100644 --- a/src/table/persistence/QueryTranscriber/StatePredicateStarted.ts +++ b/src/table/persistence/QueryTranscriber/StatePredicateStarted.ts @@ -40,9 +40,7 @@ export default class StatePredicateStarted extends QPState implements IQPState { } else if (token === ")") { context.stateQueue.push(QueryStateName.ProcessParensClose); } else if (this.isPredicateOperator(token)) { - context.stateQueue.push(QueryStateName.PredicateFinished); - - // will need to end current predicate and create a new predicate + this.presdicateStartingOperator(context); } else if (this.isOperand(token)) { // match operand (specific set) throw new Error( @@ -71,4 +69,32 @@ export default class StatePredicateStarted extends QPState implements IQPState { onExit = (context: QueryContext) => { return context; }; + + /** + * There are 2 cases that will get us here: + * 1. a filter without parens + * - we will have processed a predicate + * - we should finish the predicate + * 2. a not operator on it's own + * - we will not have processed a value or identifier + * - we must process the operator + * - will need to end current predicate and create a new predicate + * + * @private + * @param {QueryContext} context + * @memberof StatePredicateStarted + */ + private presdicateStartingOperator(context: QueryContext) { + if ( + context.currentPos === 0 || + context.taggedPredicates[context.currentPredicate].tokenMap.tokens === + undefined || + context.taggedPredicates[context.currentPredicate].tokenMap.tokens + .length === 0 + ) { + context.stateQueue.push(QueryStateName.ProcessOperator); + } else { + context.stateQueue.push(QueryStateName.PredicateFinished); + } + } } diff --git a/src/table/persistence/QueryTranscriber/StateProcessValue.ts b/src/table/persistence/QueryTranscriber/StateProcessValue.ts index f6476220c..943ee4590 100644 --- a/src/table/persistence/QueryTranscriber/StateProcessValue.ts +++ b/src/table/persistence/QueryTranscriber/StateProcessValue.ts @@ -62,8 +62,34 @@ export default class StateProcessValue extends QPState implements IQPState { * @memberof StateProcessValue */ private handleStringValue(context: QueryContext, tokenStart: number) { + // need to account for apostrophe escaping + // http://docs.oasis-open.org/odata/odata/v4.0/errata03/os/complete/part2-url-conventions/odata-v4.0-errata03-os-part2-url-conventions-complete.html#ABNF + // OData the ABNF rules explicitly state whether the percent-encoded representation is treated identical to the plain literal representation. + // This is done to make the input strings in the ABNF test cases more readable. + // One of these rules is that single quotes within string literals are represented as two consecutive single quotes. + // Example 3: valid OData URLs: + // http://host/service/People('O''Neil') + // http://host/service/People(%27O%27%27Neil%27) + // http://host/service/People%28%27O%27%27Neil%27%29 + // http://host/service/Categories('Smartphone%2FTablet') if (context.originalQuery[tokenStart] === "'") { - return context.originalQuery.indexOf("'", tokenStart + 1) + 1; + // if we have a string, we need to check for double appostrophe each time we find a valid end + let posApostrophe = context.originalQuery.indexOf("'", tokenStart + 1); + + // Why minus 2 : becuase there must be enough room for 3 apostrophe otherwise + // the syntax would be invalid. + while (posApostrophe < context.originalQuery.length - 2) { + const nextChar = context.originalQuery.charAt(posApostrophe + 1); + if (nextChar === "'") { + // double apostrophe used as litteral ' + posApostrophe += 1; + } else { + break; + } + posApostrophe = context.originalQuery.indexOf("'", posApostrophe + 1); + } + + return posApostrophe + 1; } return this.endOfToken(context, tokenStart); } diff --git a/tests/table/apis/table.entity.query.test.ts b/tests/table/apis/table.entity.query.test.ts index 8c239029f..755d98d56 100644 --- a/tests/table/apis/table.entity.query.test.ts +++ b/tests/table/apis/table.entity.query.test.ts @@ -1004,6 +1004,8 @@ describe("table Entity APIs test - using Azure/data-tables", () => { await tableClient.deleteTable(); }); + // issue 1828 + it("16. should find guids when using filter with ge, lt, gt and ne, @loki", async () => { const tableClient = createAzureDataTablesClient( testLocalAzuriteInstance, @@ -1115,4 +1117,55 @@ describe("table Entity APIs test - using Azure/data-tables", () => { assert.strictEqual(testsCompleted, queriesAndExpectedResult.length); await tableClient.deleteTable(); }); + + it("17. should work correctly when query filter single boolean and partition filter, @loki", async () => { + const tableClient = createAzureDataTablesClient( + testLocalAzuriteInstance, + getUniqueName("partwithnot") + ); + + await tableClient.createTable(); + + const result1 = await tableClient.createEntity({ + partitionKey: `Part1`, + rowKey: `1`, + foo: "testEntity1" + }); + assert.notStrictEqual(result1.etag, undefined); + + const result2 = await tableClient.createEntity({ + partitionKey: `Part2`, + rowKey: `1`, + foo: "testEntity2" + }); + assert.notStrictEqual(result2.etag, undefined); + + const result3 = await tableClient.createEntity({ + partitionKey: `Part3`, + rowKey: `1`, + foo: "testEntity3" + }); + assert.notStrictEqual(result3.etag, undefined); + + const maxPageSize = 5; + const entities = tableClient.listEntities>({ + queryOptions: { + filter: odata`not (PartitionKey lt 'Part2')` + } + }); + let all: TableEntity<{ foo: string }>[] = []; + for await (const entity of entities.byPage({ + maxPageSize + })) { + all = [...all, ...entity]; + } + assert.strictEqual(all.length, 2); + all.forEach((entity) => { + assert.ok( + entity.partitionKey === `Part2` || entity.partitionKey === `Part3` + ); + }); + + await tableClient.deleteTable(); + }); }); diff --git a/tests/table/unit/LokiJsQueryTranscriber.unit.test.2.ts b/tests/table/unit/LokiJsQueryTranscriber.unit.test.2.ts index 0c4ac60c6..beb734847 100644 --- a/tests/table/unit/LokiJsQueryTranscriber.unit.test.2.ts +++ b/tests/table/unit/LokiJsQueryTranscriber.unit.test.2.ts @@ -2,42 +2,64 @@ import * as assert from "assert"; import LokiJsQueryTranscriberFactory from "../../../src/table/persistence/QueryTranscriber/LokiJsQueryTranscriberFactory"; const entityQueries = [ + { + input: "PartitionKey eq 'azurite' and RowKey eq 'tables'", + expected: + "return ( item.properties.PartitionKey === `azurite` && item.properties.RowKey === `tables` )" + }, + { + input: "PartitionKey eq 'azurite' or RowKey eq 'tables'", + expected: + "return ( item.properties.PartitionKey === `azurite` || item.properties.RowKey === `tables` )" + }, + { + input: "PartitionKey eq 'Foo '''' Bar'", + expected: "return ( item.properties.PartitionKey === `Foo '' Bar` )" + }, + { + input: "PartitionKey eq 'Foo '' Bar'", + expected: "return ( item.properties.PartitionKey === `Foo ' Bar` )" + }, + { + input: "not (PartitionKey lt 'Part2')", + expected: "return ( ! ( item.properties.PartitionKey < `Part2` ) )" + }, { input: "PartitionKey eq 'azurite'", - expected: "return ( item.PartitionKey === `azurite` )" + expected: "return ( item.properties.PartitionKey === `azurite` )" }, { input: "RowKey eq 'azurite'", - expected: "return ( item.RowKey === `azurite` )" + expected: "return ( item.properties.RowKey === `azurite` )" }, { input: "PartitionKey gt 'azurite'", - expected: "return ( item.PartitionKey > `azurite` )" + expected: "return ( item.properties.PartitionKey > `azurite` )" }, { input: "PartitionKey ge 'azurite'", - expected: "return ( item.PartitionKey >= `azurite` )" + expected: "return ( item.properties.PartitionKey >= `azurite` )" }, { input: "PartitionKey lt 'azurite'", - expected: "return ( item.PartitionKey < `azurite` )" + expected: "return ( item.properties.PartitionKey < `azurite` )" }, { input: "PartitionKey le 'azurite'", - expected: "return ( item.PartitionKey <= `azurite` )" + expected: "return ( item.properties.PartitionKey <= `azurite` )" }, { input: "PartitionKey ne 'azurite'", - expected: "return ( item.PartitionKey !== `azurite` )" + expected: "return ( item.properties.PartitionKey !== `azurite` )" }, { input: "not (PartitionKey eq 'azurite')", - expected: "return ( ! ( item.PartitionKey === `azurite` ) )" + expected: "return ( ! ( item.properties.PartitionKey === `azurite` ) )" }, { input: "MyField gt datetime'2021-06-05T16:20:00'", expected: - "return ( new Date(item.properties.MyField).getTime() > new Date(`2021-06-05T16:20:00`).getTime() )" + "return ( new Date(item.properties.MyField).getTime() > new Date('2021-06-05T16:20:00').getTime() )" }, { input: "MyField gt 1337", @@ -47,28 +69,19 @@ const entityQueries = [ input: "MyField gt 1337L", expected: "return ( item.properties.MyField > '1337' )" }, - { - input: "PartitionKey eq 'azurite' and RowKey eq 'tables'", - expected: - "return ( item.PartitionKey === `azurite` && item.RowKey === `tables` )" - }, - { - input: "PartitionKey eq 'azurite' or RowKey eq 'tables'", - expected: - "return ( item.PartitionKey === `azurite` || item.RowKey === `tables` )" - }, { input: "MyField eq guid'00000000-0000-0000-0000-000000000000'", expected: - "return ( item.properties.MyField === `00000000-0000-0000-0000-000000000000` )" + "return ( ( item.properties.MyField === '00000000-0000-0000-0000-000000000000' ) || ( item.properties.MyField === 'MDAwMDAwMDAtMDAwMC0wMDAwLTAwMDAtMDAwMDAwMDAwMDAw' ) )" }, { input: "PartitionKey eq 'Iam''good''atTypeScript'", - expected: "return ( item.PartitionKey === `Iam'good'atTypeScript` )" + expected: + "return ( item.properties.PartitionKey === `Iam'good'atTypeScript` )" }, { input: "PartitionKey eq 'Isn''tThisANastyPK'", - expected: "return ( item.PartitionKey === `Isn'tThisANastyPK` )" + expected: "return ( item.properties.PartitionKey === `Isn'tThisANastyPK` )" }, { input: "1 eq 1", @@ -76,67 +89,70 @@ const entityQueries = [ }, { input: "PartitionKey eq 'a'", - expected: "return ( item.PartitionKey === `a` )" + expected: "return ( item.properties.PartitionKey === `a` )" }, { input: "PartitionKey eq ' '", - expected: "return ( item.PartitionKey === ` ` )" + expected: "return ( item.properties.PartitionKey === ` ` )" }, { input: "PartitionKey eq 'Foo Bar'", - expected: "return ( item.PartitionKey === `Foo Bar` )" + expected: "return ( item.properties.PartitionKey === `Foo Bar` )" }, { input: "PartitionKey eq 'A''Foo Bar''Z'", - expected: "return ( item.PartitionKey === `A'Foo Bar'Z` )" + expected: "return ( item.properties.PartitionKey === `A'Foo Bar'Z` )" }, { input: "PartitionKey eq '''Foo Bar'", - expected: "return ( item.PartitionKey === `'Foo Bar` )" - }, - { - input: "PartitionKey eq 'Foo '' Bar'", - expected: "return ( item.PartitionKey === `Foo ' Bar` )" + expected: "return ( item.properties.PartitionKey === `'Foo Bar` )" }, { input: "PartitionKey eq 'Foo Bar'''", - expected: "return ( item.PartitionKey === `Foo Bar'` )" + expected: "return ( item.properties.PartitionKey === `Foo Bar'` )" }, { input: "PartitionKey eq ' Foo Bar '", - expected: "return ( item.PartitionKey === ` Foo Bar ` )" + expected: "return ( item.properties.PartitionKey === ` Foo Bar ` )" }, { input: "PartitionKey eq ''", - expected: "return ( item.PartitionKey === `` )" + expected: "return ( item.properties.PartitionKey === `` )" }, { input: "PartitionKey eq '''Foo Bar'''", - expected: "return ( item.PartitionKey === `'Foo Bar'` )" + expected: "return ( item.properties.PartitionKey === `'Foo Bar'` )" }, { input: "PartitionKey eq ''''", - expected: "return ( item.PartitionKey === `'` )" + expected: "return ( item.properties.PartitionKey === `'` )" }, { input: "PartitionKey eq ''''''", - expected: "return ( item.PartitionKey === `''` )" + expected: "return ( item.properties.PartitionKey === `''` )" }, { input: "PartitionKey eq ''''''''", - expected: "return ( item.PartitionKey === `'''` )" + expected: "return ( item.properties.PartitionKey === `'''` )" }, { input: "PartitionKey eq ''''''''''", - expected: "return ( item.PartitionKey === `''''` )" + expected: "return ( item.properties.PartitionKey === `''''` )" }, { input: "PartitionKey eq 'I am ''good'' at TypeScript'", - expected: "return ( item.PartitionKey === `I am 'good' at TypeScript` )" + expected: + "return ( item.properties.PartitionKey === `I am 'good' at TypeScript` )" }, { input: "_foo eq 'bar'", - expected: "return ( _foo === `bar` )" + expected: "return ( item.properties._foo === `bar` )" + }, + { + input: + "please eq 'never query ''this'' eq this or suchandsuch eq ''worse'''", + expected: + "return ( item.properties.please === `never query 'this' eq this or suchandsuch eq 'worse'` )" } ]; @@ -154,12 +170,15 @@ describe("Unit tests for converting an entity OData query to a JavaScript query const actual = queryTranscriber.getTranscribedQuery(); assert.strictEqual(actual, expected); } catch (err: any) { - if (input === "1 eq 1") + if (input === "1 eq 1") { assert.strictEqual( err.message, "Invalid number of terms in query!", `Did not get expected error on invalid query ${input}` ); + } else { + assert.ifError(err); + } } done(); }); diff --git a/tests/table/unit/LokiJsQueryTranscriber.unit.test.ts b/tests/table/unit/LokiJsQueryTranscriber.unit.test.ts index 1798a53d8..442effb9f 100644 --- a/tests/table/unit/LokiJsQueryTranscriber.unit.test.ts +++ b/tests/table/unit/LokiJsQueryTranscriber.unit.test.ts @@ -11,19 +11,19 @@ describe("LokiJs Query Transcribing unit tests, also ensures backward compatabil }, { originalQuery: "(partitionKey eq 'test')", - expectedQuery: "return ( ( item.properties.partitionKey === 'test' ) )" + expectedQuery: "return ( ( item.properties.partitionKey === `test` ) )" }, { originalQuery: "( partitionKey eq 'test' )", - expectedQuery: "return ( ( item.properties.partitionKey === 'test' ) )" + expectedQuery: "return ( ( item.properties.partitionKey === `test` ) )" }, { originalQuery: "('test' eq partitionKey)", - expectedQuery: "return ( ( 'test' === item.properties.partitionKey ) )" + expectedQuery: "return ( ( `test` === item.properties.partitionKey ) )" }, { originalQuery: "( 'test' eq partitionKey )", - expectedQuery: "return ( ( 'test' === item.properties.partitionKey ) )" + expectedQuery: "return ( ( `test` === item.properties.partitionKey ) )" } ]; @@ -143,16 +143,16 @@ describe("LokiJs Query Transcribing unit tests, also ensures backward compatabil const testArray = [ { originalQuery: "(myString eq '123.01' )", - expectedQuery: "return ( ( item.properties.myString === '123.01' ) )" + expectedQuery: "return ( ( item.properties.myString === `123.01` ) )" }, { originalQuery: "( '123.01L' eq myString )", - expectedQuery: "return ( ( '123.01L' === item.properties.myString ) )" + expectedQuery: "return ( ( `123.01L` === item.properties.myString ) )" }, { originalQuery: "( 'I am a string' eq myString )", expectedQuery: - "return ( ( 'I am a string' === item.properties.myString ) )" + "return ( ( `I am a string` === item.properties.myString ) )" } ]; @@ -219,7 +219,7 @@ describe("LokiJs Query Transcribing unit tests, also ensures backward compatabil { originalQuery: "PartitionKey eq 'partition1' and int64Field eq 12345L", expectedQuery: - "return ( item.properties.PartitionKey === 'partition1' && item.properties.int64Field === '12345' )" + "return ( item.properties.PartitionKey === `partition1` && item.properties.int64Field === '12345' )" } ]; @@ -257,15 +257,15 @@ describe("LokiJs Query Transcribing unit tests, also ensures backward compatabil }, { originalQuery: `PartitionKey eq 'partition1' and number gt 11 and Timestamp lt datetime'${newTimeStamp}'`, - expectedQuery: `return ( item.properties.PartitionKey === 'partition1' && item.properties.number > 11 && new Date(item.properties.Timestamp).getTime() < new Date('${newTimeStamp}').getTime() )` + expectedQuery: `return ( item.properties.PartitionKey === \`partition1\` && item.properties.number > 11 && new Date(item.properties.Timestamp).getTime() < new Date('${newTimeStamp}').getTime() )` }, { originalQuery: `PartitionKey eq 'partition1' and number lt 11 and Timestamp lt datetime'${newTimeStamp}'`, - expectedQuery: `return ( item.properties.PartitionKey === 'partition1' && item.properties.number < 11 && new Date(item.properties.Timestamp).getTime() < new Date('${newTimeStamp}').getTime() )` + expectedQuery: `return ( item.properties.PartitionKey === \`partition1\` && item.properties.number < 11 && new Date(item.properties.Timestamp).getTime() < new Date('${newTimeStamp}').getTime() )` }, { originalQuery: `(PartitionKey eq 'partition1') and (number lt 12) and (Timestamp lt datetime'${newTimeStamp}')`, - expectedQuery: `return ( ( item.properties.PartitionKey === 'partition1' ) && ( item.properties.number < 12 ) && ( new Date(item.properties.Timestamp).getTime() < new Date('${newTimeStamp}').getTime() ) )` + expectedQuery: `return ( ( item.properties.PartitionKey === \`partition1\` ) && ( item.properties.number < 12 ) && ( new Date(item.properties.Timestamp).getTime() < new Date('${newTimeStamp}').getTime() ) )` } ]; @@ -293,7 +293,7 @@ describe("LokiJs Query Transcribing unit tests, also ensures backward compatabil { originalQuery: "(myInt eq 123 ) and (myString eq 'hello')", expectedQuery: - "return ( ( item.properties.myInt === 123 ) && ( item.properties.myString === 'hello' ) )" + "return ( ( item.properties.myInt === 123 ) && ( item.properties.myString === `hello` ) )" } ]; @@ -321,7 +321,7 @@ describe("LokiJs Query Transcribing unit tests, also ensures backward compatabil { originalQuery: "PartitionKey eq 'partitionKey' and int32Field eq 54321", expectedQuery: - "return ( item.properties.PartitionKey === 'partitionKey' && item.properties.int32Field === 54321 )" + "return ( item.properties.PartitionKey === `partitionKey` && item.properties.int32Field === 54321 )" } ]; @@ -348,11 +348,13 @@ describe("LokiJs Query Transcribing unit tests, also ensures backward compatabil const testArray = [ { originalQuery: `(PartitionKey eq 'part1') and (binaryField eq binary'62696e61727944617461')`, - expectedQuery: `return ( ( item.properties.PartitionKey === 'part1' ) && ( item.properties.binaryField === 'YmluYXJ5RGF0YQ==' ) )` + expectedQuery: + "return ( ( item.properties.PartitionKey === `part1` ) && ( item.properties.binaryField === 'YmluYXJ5RGF0YQ==' ) )" }, { originalQuery: `(PartitionKey eq 'part1') and (binaryField eq X'62696e61727944617461')`, - expectedQuery: `return ( ( item.properties.PartitionKey === 'part1' ) && ( item.properties.binaryField === 'YmluYXJ5RGF0YQ==' ) )` + expectedQuery: + "return ( ( item.properties.PartitionKey === `part1` ) && ( item.properties.binaryField === 'YmluYXJ5RGF0YQ==' ) )" } ]; @@ -381,7 +383,7 @@ describe("LokiJs Query Transcribing unit tests, also ensures backward compatabil { originalQuery: "TableName ge 'myTable' and TableName lt 'myTable{'", expectedQuery: - "return ( item.table >= 'myTable' && item.table < 'myTable{' )" + "return ( item.table >= `myTable` && item.table < `myTable{` )" } ]; @@ -409,7 +411,7 @@ describe("LokiJs Query Transcribing unit tests, also ensures backward compatabil originalQuery: "(PartitionKey eq '6e4ab0516fca4122bff05fb23a5f6adf') and (((RowKey eq 'user%2fsomeraondomuser_cf9e6f1fc7264c9c8148d6050e27ee3e') and (ActivationId eq '512b5a68bc1c46b480a1a052da681f45')) or ((RowKey eq 'user%2fsomeraondomuser_267f6d72c0874408a021043138c6e395') and (ActivationId eq 'e195014973754b11ae1b74cb4be9aab1')) or ((RowKey eq 'user%2fsomeraondomuser_34b4d10839ba48928a3ceee0ea6a1175') and (ActivationId eq '4573eccdaf8d42148907fd3b654b72c3')) or ((RowKey eq 'user%2fsomeraondomuser_931d172de3034561af4d210aa4007b8f') and (ActivationId eq 'd3e7ffeb439b4acf912006b2f01aa5a9')) or ((RowKey eq 'user%2fsomeraondomuser_6db90a01fab7429ca52698534629dd5d') and (ActivationId eq '492fe8afa0514a919fc0c491afc88e18')) or ((RowKey eq 'user%2fsomeraondomuser_b4710ac467ea46678d3b692d552b4573') and (ActivationId eq 'ed3a90e556474a4486196d7d20c7e0a8')) or ((RowKey eq 'user%2fsomeraondomuser_9a7d0ed9e934457790c4af955a5d0aa2') and (ActivationId eq 'e6098dd0457a438b8c8810381e72b103')) or ((RowKey eq 'user%2fsomeraondomuser_5f45717f56d14f6ebc1df2d3195609d8') and (ActivationId eq '1001b0b9b2224ab08c9b3e1413e733e3')) or ((RowKey eq 'user%2fsomeraondomuser_593e5eb5533f41998a6946d37748d1c4') and (ActivationId eq '100df8cda69a4101bd038f097073dcf0')) or ((RowKey eq 'user%2fsomeraondomuser_5c837b849f024914b694ebf978129210') and (ActivationId eq 'd4b38859695c4b31892053e2f8f16ce1')) or ((RowKey eq 'user%2fsomeraondomuser_0d59188361ed46b8967ff553fc31da22') and (ActivationId eq 'cc235fce46ca4dcf9c24a12eda86a23e')) or ((RowKey eq 'user%2fsomeraondomuser_46daebbc6d214de1b724a6d1bd909f2e') and (ActivationId eq 'f901237d1de5466bb350013841f7e1d9')) or ((RowKey eq 'user%2fsomeraondomuser_4bf3d38ef9664a17b8acbe6e6f4475e6') and (ActivationId eq '0d8b22f41df443f4956b4cef9ddccc7b')) or ((RowKey eq 'user%2fsomeraondomuser_7d157b7f3a3a4508a182b47394444a97') and (ActivationId eq '391cbd2712e94a10b1e8f7f5566ad1d1')) or ((RowKey eq 'user%2fsomeraondomuser_3173c9fea0124785a6dce8bb1ce22ff5') and (ActivationId eq '5926f7967953443089276d4011de4586')) or ((RowKey eq 'user%2fsomeraondomuser_855b9f1c9b1d4793b633dd312f97acee') and (ActivationId eq 'acbb6b581b604bd9bdb7d8109ad80c25')) or ((RowKey eq 'user%2fsomeraondomuser_0f11694546a049df89c234f5aca29594') and (ActivationId eq '83a8b6c565e74569a3d1f358ae1b4767')) or ((RowKey eq 'user%2fsomeraondomuser_5bd0f86dc2a74ba18848156fd4384fa0') and (ActivationId eq '430dcf95b539468cbfb99886949840b5')) or ((RowKey eq 'user%2fsomeraondomuser_85c207c588dd4c9697a921b29481152b') and (ActivationId eq 'e114211645144d8581b279cc8b780879')) or ((RowKey eq 'user%2fsomeraondomuser_d2d48e3e8e594b7ea755a6df291c55a4') and (ActivationId eq 'a9f50b02fa634628b56622602733d2df')) or ((RowKey eq 'user%2fsomeraondomuser_3f1c4bcf08c34efb8b64a40ee4e33698') and (ActivationId eq 'e7180ac71c6a4fb3b5e68c3a6d3c5ce6')) or ((RowKey eq 'user%2fsomeraondomuser_3871c563cd0e433fbb7d4ebbd6db4856') and (ActivationId eq 'c05eab92d0b44f4b8ea57b6cf9339cc2')) or ((RowKey eq 'user%2fsomeraondomuser_beb39451febe40aa9b51b051a5940b7c') and (ActivationId eq '51998e3e875c4c499f4ebb14bc9a91e6')) or ((RowKey eq 'user%2fsomeraondomuser_1258f93c3b054ee2b80a52f9f9bdc170') and (ActivationId eq 'cb3d1fd19e2d45eeb0ebd9a704e6d576')) or ((RowKey eq 'user%2fsomeraondomuser_b37d9915799047988a1b0598a47f7ba4') and (ActivationId eq '2560bf1bcde5461eb4899ef8ae009a7a')) or ((RowKey eq 'user%2fsomeraondomuser_37a27899265b4125ba98bc7fd2f9c000') and (ActivationId eq '166e0f18cd744666b3684c406493945e')) or ((RowKey eq 'user%2fsomeraondomuser_240b39fd90d94b54b0e923134b4cba55') and (ActivationId eq '329c6825c2754dd3b18411083b7b58e4')) or ((RowKey eq 'user%2fsomeraondomuser_e7c33f051c3c42a8883712e255635bbf') and (ActivationId eq 'f127763cb6374f49bf52b7876e594147')) or ((RowKey eq 'user%2fsomeraondomuser_3d5d8beeafac4b0aa6a146f7f2e5eadb') and (ActivationId eq '6f89c9bda1d74977997b1415db56a21e')) or ((RowKey eq 'user%2fsomeraondomuser_21d9c87ed89646e88be406cb57db4e1c') and (ActivationId eq '640d3e743baa4c969e4292aa80efbac2')) or ((RowKey eq 'user%2fsomeraondomuser_6d71d83c8083415a835943b18b9d6d99') and (ActivationId eq 'd4f8417dab4544ed972b288bae03efa3')) or ((RowKey eq 'user%2fsomeraondomuser_44253ea6cadc4165994fd4501998190b') and (ActivationId eq 'a099990633bb441a852ff00266c372ee')) or ((RowKey eq 'user%2fsomeraondomuser_169185ee08b446ee9a1dd329997f4b50') and (ActivationId eq '6928aeac8dfe4caeb44b275d3765bb9c')) or ((RowKey eq 'user%2fsomeraondomuser_5639229f610444df9ff2c3a598ba5ff3') and (ActivationId eq 'afd94604d549455983d4bb043b9bf4fc')) or ((RowKey eq 'user%2fsomeraondomuser_6e8177f40d924eecad86fe29cf042c5b') and (ActivationId eq 'ef6dff8131634580a05602b12b3c7030')) or ((RowKey eq 'user%2fsomeraondomuser_82c02c372d274b12b42eb613a94f0032') and (ActivationId eq 'c629d8827dec4946918fac970b0b01fc')) or ((RowKey eq 'user%2fsomeraondomuser_82d799f96a8341a888e823e7e6c680aa') and (ActivationId eq '6a430683a6864d518747c5613aae81f7')) or ((RowKey eq 'user%2fsomeraondomuser_eee54678565d4c62b3ee75ff595a639f') and (ActivationId eq '05b779023a86487291c54274f2351763')) or ((RowKey eq 'user%2fsomeraondomuser_d61b2e412be74d449cbe2e32c040b054') and (ActivationId eq 'abd89950074c455eabf0ce6507cff05b')) or ((RowKey eq 'user%2fsomeraondomuser_7d3b47e40a40403bac3c879f8ccc785a') and (ActivationId eq 'f37b30e2b99944ad8951924d890d6514')) or ((RowKey eq 'user%2fsomeraondomuser_fa9e78d2c68447928d3b5bcc7170f112') and (ActivationId eq 'bc9c4dde5ba443dea12137e5da919c41')) or ((RowKey eq 'user%2fsomeraondomuser_3bb66b8c2abb45c8b33e75ce4baa93ac') and (ActivationId eq '49c8905d49bc47bc9fea7d859c7812dd')) or ((RowKey eq 'user%2fsomeraondomuser_55b23534d04c4efe9d580c3740230486') and (ActivationId eq '1322e451d37145f4b1b41559f30b58e9')) or ((RowKey eq 'user%2fsomeraondomuser_8b8d04a70b8f43ab87d065e89d84aefb') and (ActivationId eq '3f7b8e9d039d4d788597d5fe7bb37666')) or ((RowKey eq 'user%2fsomeraondomuser_0d5ec8bb559d4e34a2d4c4b5d935386d') and (ActivationId eq '6eb87695c16f4289b48374a57fcc2bab')) or ((RowKey eq 'user%2fsomeraondomuser_a0ba488c7b0542d49cb2b406a7b3cca4') and (ActivationId eq 'fb20d88f4b6d4193aad4511c8951ef59')) or ((RowKey eq 'user%2fsomeraondomuser_25de238770ab41399d8cbe0343b9d0d3') and (ActivationId eq 'b587806d63324a4084cde9c92af04065')) or ((RowKey eq 'user%2fsomeraondomuser_7688796792e245d0913f050a3a7c6c02') and (ActivationId eq 'd95909aedd96417f945834151d397f51')) or ((RowKey eq 'user%2fsomeraondomuser_72967c3265ce4996b12001ea1814d62f') and (ActivationId eq 'd046ebb2304b4ff0be1c9d5a4c8a8831')) or ((RowKey eq 'user%2fsomeraondomuser_6238575aaee54a628caebb48b44584e5') and (ActivationId eq '6ac73966adb6496cb2a4553c7b9fe8ce')) or ((RowKey eq 'user%2fsomeraondomuser_fb89e80d21ed4b17a850f9021c4b1d2a') and (ActivationId eq '3833b18cabc344dab1dbdbb62c99accd')) or ((RowKey eq 'user%2fsomeraondomuser_f7aa848f4c7243b892fd979326884e3d') and (ActivationId eq '6911fe2a462e44aab8a143603e1af98f')) or ((RowKey eq 'user%2fsomeraondomuser_349234378ad34ec99c3ea00cb9149f80') and (ActivationId eq '62e351ea6ba44be8b45b2cb1a42efea3')) or ((RowKey eq 'user%2fsomeraondomuser_25707be4343f4f89955ea71bb2d75fe2') and (ActivationId eq '757fdf560e6e4fb0acc1d0578bc4bc83')) or ((RowKey eq 'user%2fsomeraondomuser_fdfe656c1e47438286a19ce4147201d1') and (ActivationId eq '5f417d1d6d9c498da973d30a26ac4c0f')) or ((RowKey eq 'user%2fsomeraondomuser_a4d0398c7b004774b638156dba8050b6') and (ActivationId eq '824bfc22f638402c99aa844984bc6814')) or ((RowKey eq 'user%2fsomeraondomuser_744afd919a134feb8167ea55d036a659') and (ActivationId eq 'b3cc18bb13254e95befa49486e7b7b9c')) or ((RowKey eq 'user%2fsomeraondomuser_6c8dbd201e6d4755a505586d669fb639') and (ActivationId eq 'e1aae7d578604f018c757fe76af995dd')) or ((RowKey eq 'user%2fsomeraondomuser_bcc2eecd8f6d4b53b22bc974e6ff5342') and (ActivationId eq '97916e010c614aa9873307d81cda8447')) or ((RowKey eq 'user%2fsomeraondomuser_be43c3586cf341318cee5941dab73f25') and (ActivationId eq 'a4cb2c286df54db89ddfa6a81ae7a4b8')) or ((RowKey eq 'user%2fsomeraondomuser_131c2342fa9f469ab2448122979901b2') and (ActivationId eq 'fb44869a714c49c6964ff7a14be19f77')) or ((RowKey eq 'user%2fsomeraondomuser_c01e6722572449bf9fd84be9911dd293') and (ActivationId eq 'cbfa2c14f69846ce9c3875b22652c5d9')) or ((RowKey eq 'user%2fsomeraondomuser_add4d77de01d455eaded6a1aa09185d2') and (ActivationId eq '6f9fa3a41f574fbebf7abcac08dd04b2')) or ((RowKey eq 'user%2fsomeraondomuser_ce38323206534df6a9764036fa08c6f9') and (ActivationId eq 'c0ec0e42e5fa4c03a5cb760d2c6323f5')) or ((RowKey eq 'user%2fsomeraondomuser_3f1d9bb315f84ef090977234ef50b78d') and (ActivationId eq '9314a7399ee24c039c05a1b242cd7dbd')) or ((RowKey eq 'user%2fsomeraondomuser_21cd31ddb97343d1b519799652af5a9a') and (ActivationId eq 'db93c80c878642f2974ca4589031c59c')) or ((RowKey eq 'user%2fsomeraondomuser_a53b1e377c774e539b9ee17e59d84028') and (ActivationId eq '12f4c570e1774c3f9cd5e9ba53ba24b0')) or ((RowKey eq 'user%2fsomeraondomuser_35629a332fb4418a8285c5a6e5ac1acb') and (ActivationId eq 'c6b4759436d9450aa5d6d06f0d493df3')) or ((RowKey eq 'user%2fsomeraondomuser_1fb4bd8083ed46c2a5a63acbba0f62f2') and (ActivationId eq '70b0af2656c04a7eb357556d5406bad1')) or ((RowKey eq 'user%2fsomeraondomuser_63968d03c6364bf281240cc5f66fa76d') and (ActivationId eq '2cc36dfd68a24892a3125ff93da1466c')) or ((RowKey eq 'user%2fsomeraondomuser_c1dac4848b6f42a2a49a5e74c8e23624') and (ActivationId eq 'bdd07a677e6841809f2580163d41f4cb')) or ((RowKey eq 'user%2fsomeraondomuser_e33ddf101a174c388a5f8b0b0aa589a5') and (ActivationId eq '71520233b5624b188e1f79b7acd64117')) or ((RowKey eq 'user%2fsomeraondomuser_1894548c3c164d88b28aa8ca81eec52e') and (ActivationId eq '4c5ffd05b895460695bb25e2f6445f80')) or ((RowKey eq 'user%2fsomeraondomuser_6072680f29f240cea960b4cb5d760a96') and (ActivationId eq 'a050286a236643bab071993b4816fe24')) or ((RowKey eq 'user%2fsomeraondomuser_530b499f40bc4d94830ac93e7cbf91c7') and (ActivationId eq '0b2848508785441aa8ac1b54ab74d37e')) or ((RowKey eq 'user%2fsomeraondomuser_fec06bded49c45629b38f019b2f2b1b5') and (ActivationId eq '963fb89616d6449fa26df30b0467fd3c')) or ((RowKey eq 'user%2fsomeraondomuser_f3163586cec543669edaa7a6b3dea09c') and (ActivationId eq '400088d1a343455ea5dbccd0e41aa143')) or ((RowKey eq 'user%2fsomeraondomuser_1d8cc8d9f1c149e4800b0982ca098cb4') and (ActivationId eq '1594d642ac864bebb1a24cec9e517fde')) or ((RowKey eq 'user%2fsomeraondomuser_cf63930ad32244e19795d6a36aab026b') and (ActivationId eq '7d79e95eea21479b84b294bb0163ed59')) or ((RowKey eq 'user%2fsomeraondomuser_f1a529712bc04e19b6a53b5900532059') and (ActivationId eq '53873144412d4846adff21d4efc3d83f')) or ((RowKey eq 'user%2fsomeraondomuser_ea51485ea2a145bd89a17c7584100c3a') and (ActivationId eq 'be0e6b64f793467691256ead12aa9232')) or ((RowKey eq 'user%2fsomeraondomuser_e007bb2d411f46dd90f0b1a426e66e93') and (ActivationId eq '1dd8fa52775748b385da70094b8b2094')) or ((RowKey eq 'user%2fsomeraondomuser_9ee4348df9c041ac9eace6ade2d76ecf') and (ActivationId eq '465722690f4f42df8cd602f7197d3be8')) or ((RowKey eq 'user%2fsomeraondomuser_b7307b3c66424fe3b1a7adb04e7477af') and (ActivationId eq '2956c4fbdda74079ba840a40f290cd7d')) or ((RowKey eq 'user%2fsomeraondomuser_92c5168aba054ba4bdf6d12fee1314f6') and (ActivationId eq 'ea1009a1d59d4550bbcb58978aef3cdd')) or ((RowKey eq 'user%2fsomeraondomuser_b454f3f44a0747f59a5b16bad9e468e1') and (ActivationId eq '6308e191701147e4a9a72bc3473fbdb2')) or ((RowKey eq 'user%2fsomeraondomuser_24af472a228f4c38b30b78c4ed9076f8') and (ActivationId eq '3e518a0f7a0f49149422f65c7043caa3')) or ((RowKey eq 'user%2fsomeraondomuser_574ddad0703a4b5d96d9231ab0e42fc7') and (ActivationId eq 'eb2baddcdc334ac3b5d4497b4adbd6a4')) or ((RowKey eq 'user%2fsomeraondomuser_3c772b3dfbab4de09523fd1805cc5ba2') and (ActivationId eq 'c64844c4eee14533b5d5319c25190908')) or ((RowKey eq 'user%2fsomeraondomuser_527e8e5da4d9469f9487af8e2566366d') and (ActivationId eq '461322a278544e90a0df05efdd840c46')) or ((RowKey eq 'user%2fsomeraondomuser_ef61d4ecc9544f5da29145c6f8bcfa9d') and (ActivationId eq '20f8029af34a4c3eaf24df390e89f427')) or ((RowKey eq 'user%2fsomeraondomuser_8678a87f705e41aba41c3925220f23fe') and (ActivationId eq '6cb3b765a2dd48958ef0537826804b4b')) or ((RowKey eq 'user%2fsomeraondomuser_d271d9a5cb354e0691dacaebdb9281f3') and (ActivationId eq '66ac01d677c34f9cae99dfb4cdaa00e5')) or ((RowKey eq 'user%2fsomeraondomuser_5d982fbac181413295310c6c8fc93c5f') and (ActivationId eq 'd94b900aec6249ee9e1856e3805b091b')) or ((RowKey eq 'user%2fsomeraondomuser_81b88cb28e69458d9b80067476f7c1af') and (ActivationId eq '2c53f55e7203418b91a360bdb28e5028')) or ((RowKey eq 'user%2fsomeraondomuser_a7ac9f7d851840579b8db4bf8ac61a7b') and (ActivationId eq '3c55ef4b112b4e4fbefd1df5ea871018')) or ((RowKey eq 'user%2fsomeraondomuser_3c100e76c2f14dcf97146a67a835c702') and (ActivationId eq '4e03bb4eb4364e6fa88f736b561eae82')) or ((RowKey eq 'user%2fsomeraondomuser_ff86a95db64f492d8c23296215ba1d54') and (ActivationId eq '4e29d0707ccb42e3b5b054eec8c040e4')) or ((RowKey eq 'user%2fsomeraondomuser_f443ac2a7bc9433bad7ec2b1c4228ef7') and (ActivationId eq 'b03811e7f6e94158a75912e71edffa06')) or ((RowKey eq 'user%2fsomeraondomuser_9baa6c0b81d34a6d8c9cef39d9a5f4e6') and (ActivationId eq '71cb5917ddf34a5baaf0f78810910a95')))", expectedQuery: - "return ( ( item.properties.PartitionKey === '6e4ab0516fca4122bff05fb23a5f6adf' ) && ( ( ( item.properties.RowKey === 'user%2fsomeraondomuser_cf9e6f1fc7264c9c8148d6050e27ee3e' ) && ( item.properties.ActivationId === '512b5a68bc1c46b480a1a052da681f45' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_267f6d72c0874408a021043138c6e395' ) && ( item.properties.ActivationId === 'e195014973754b11ae1b74cb4be9aab1' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_34b4d10839ba48928a3ceee0ea6a1175' ) && ( item.properties.ActivationId === '4573eccdaf8d42148907fd3b654b72c3' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_931d172de3034561af4d210aa4007b8f' ) && ( item.properties.ActivationId === 'd3e7ffeb439b4acf912006b2f01aa5a9' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_6db90a01fab7429ca52698534629dd5d' ) && ( item.properties.ActivationId === '492fe8afa0514a919fc0c491afc88e18' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_b4710ac467ea46678d3b692d552b4573' ) && ( item.properties.ActivationId === 'ed3a90e556474a4486196d7d20c7e0a8' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_9a7d0ed9e934457790c4af955a5d0aa2' ) && ( item.properties.ActivationId === 'e6098dd0457a438b8c8810381e72b103' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_5f45717f56d14f6ebc1df2d3195609d8' ) && ( item.properties.ActivationId === '1001b0b9b2224ab08c9b3e1413e733e3' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_593e5eb5533f41998a6946d37748d1c4' ) && ( item.properties.ActivationId === '100df8cda69a4101bd038f097073dcf0' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_5c837b849f024914b694ebf978129210' ) && ( item.properties.ActivationId === 'd4b38859695c4b31892053e2f8f16ce1' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_0d59188361ed46b8967ff553fc31da22' ) && ( item.properties.ActivationId === 'cc235fce46ca4dcf9c24a12eda86a23e' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_46daebbc6d214de1b724a6d1bd909f2e' ) && ( item.properties.ActivationId === 'f901237d1de5466bb350013841f7e1d9' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_4bf3d38ef9664a17b8acbe6e6f4475e6' ) && ( item.properties.ActivationId === '0d8b22f41df443f4956b4cef9ddccc7b' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_7d157b7f3a3a4508a182b47394444a97' ) && ( item.properties.ActivationId === '391cbd2712e94a10b1e8f7f5566ad1d1' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_3173c9fea0124785a6dce8bb1ce22ff5' ) && ( item.properties.ActivationId === '5926f7967953443089276d4011de4586' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_855b9f1c9b1d4793b633dd312f97acee' ) && ( item.properties.ActivationId === 'acbb6b581b604bd9bdb7d8109ad80c25' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_0f11694546a049df89c234f5aca29594' ) && ( item.properties.ActivationId === '83a8b6c565e74569a3d1f358ae1b4767' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_5bd0f86dc2a74ba18848156fd4384fa0' ) && ( item.properties.ActivationId === '430dcf95b539468cbfb99886949840b5' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_85c207c588dd4c9697a921b29481152b' ) && ( item.properties.ActivationId === 'e114211645144d8581b279cc8b780879' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_d2d48e3e8e594b7ea755a6df291c55a4' ) && ( item.properties.ActivationId === 'a9f50b02fa634628b56622602733d2df' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_3f1c4bcf08c34efb8b64a40ee4e33698' ) && ( item.properties.ActivationId === 'e7180ac71c6a4fb3b5e68c3a6d3c5ce6' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_3871c563cd0e433fbb7d4ebbd6db4856' ) && ( item.properties.ActivationId === 'c05eab92d0b44f4b8ea57b6cf9339cc2' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_beb39451febe40aa9b51b051a5940b7c' ) && ( item.properties.ActivationId === '51998e3e875c4c499f4ebb14bc9a91e6' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_1258f93c3b054ee2b80a52f9f9bdc170' ) && ( item.properties.ActivationId === 'cb3d1fd19e2d45eeb0ebd9a704e6d576' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_b37d9915799047988a1b0598a47f7ba4' ) && ( item.properties.ActivationId === '2560bf1bcde5461eb4899ef8ae009a7a' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_37a27899265b4125ba98bc7fd2f9c000' ) && ( item.properties.ActivationId === '166e0f18cd744666b3684c406493945e' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_240b39fd90d94b54b0e923134b4cba55' ) && ( item.properties.ActivationId === '329c6825c2754dd3b18411083b7b58e4' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_e7c33f051c3c42a8883712e255635bbf' ) && ( item.properties.ActivationId === 'f127763cb6374f49bf52b7876e594147' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_3d5d8beeafac4b0aa6a146f7f2e5eadb' ) && ( item.properties.ActivationId === '6f89c9bda1d74977997b1415db56a21e' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_21d9c87ed89646e88be406cb57db4e1c' ) && ( item.properties.ActivationId === '640d3e743baa4c969e4292aa80efbac2' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_6d71d83c8083415a835943b18b9d6d99' ) && ( item.properties.ActivationId === 'd4f8417dab4544ed972b288bae03efa3' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_44253ea6cadc4165994fd4501998190b' ) && ( item.properties.ActivationId === 'a099990633bb441a852ff00266c372ee' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_169185ee08b446ee9a1dd329997f4b50' ) && ( item.properties.ActivationId === '6928aeac8dfe4caeb44b275d3765bb9c' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_5639229f610444df9ff2c3a598ba5ff3' ) && ( item.properties.ActivationId === 'afd94604d549455983d4bb043b9bf4fc' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_6e8177f40d924eecad86fe29cf042c5b' ) && ( item.properties.ActivationId === 'ef6dff8131634580a05602b12b3c7030' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_82c02c372d274b12b42eb613a94f0032' ) && ( item.properties.ActivationId === 'c629d8827dec4946918fac970b0b01fc' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_82d799f96a8341a888e823e7e6c680aa' ) && ( item.properties.ActivationId === '6a430683a6864d518747c5613aae81f7' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_eee54678565d4c62b3ee75ff595a639f' ) && ( item.properties.ActivationId === '05b779023a86487291c54274f2351763' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_d61b2e412be74d449cbe2e32c040b054' ) && ( item.properties.ActivationId === 'abd89950074c455eabf0ce6507cff05b' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_7d3b47e40a40403bac3c879f8ccc785a' ) && ( item.properties.ActivationId === 'f37b30e2b99944ad8951924d890d6514' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_fa9e78d2c68447928d3b5bcc7170f112' ) && ( item.properties.ActivationId === 'bc9c4dde5ba443dea12137e5da919c41' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_3bb66b8c2abb45c8b33e75ce4baa93ac' ) && ( item.properties.ActivationId === '49c8905d49bc47bc9fea7d859c7812dd' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_55b23534d04c4efe9d580c3740230486' ) && ( item.properties.ActivationId === '1322e451d37145f4b1b41559f30b58e9' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_8b8d04a70b8f43ab87d065e89d84aefb' ) && ( item.properties.ActivationId === '3f7b8e9d039d4d788597d5fe7bb37666' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_0d5ec8bb559d4e34a2d4c4b5d935386d' ) && ( item.properties.ActivationId === '6eb87695c16f4289b48374a57fcc2bab' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_a0ba488c7b0542d49cb2b406a7b3cca4' ) && ( item.properties.ActivationId === 'fb20d88f4b6d4193aad4511c8951ef59' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_25de238770ab41399d8cbe0343b9d0d3' ) && ( item.properties.ActivationId === 'b587806d63324a4084cde9c92af04065' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_7688796792e245d0913f050a3a7c6c02' ) && ( item.properties.ActivationId === 'd95909aedd96417f945834151d397f51' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_72967c3265ce4996b12001ea1814d62f' ) && ( item.properties.ActivationId === 'd046ebb2304b4ff0be1c9d5a4c8a8831' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_6238575aaee54a628caebb48b44584e5' ) && ( item.properties.ActivationId === '6ac73966adb6496cb2a4553c7b9fe8ce' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_fb89e80d21ed4b17a850f9021c4b1d2a' ) && ( item.properties.ActivationId === '3833b18cabc344dab1dbdbb62c99accd' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_f7aa848f4c7243b892fd979326884e3d' ) && ( item.properties.ActivationId === '6911fe2a462e44aab8a143603e1af98f' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_349234378ad34ec99c3ea00cb9149f80' ) && ( item.properties.ActivationId === '62e351ea6ba44be8b45b2cb1a42efea3' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_25707be4343f4f89955ea71bb2d75fe2' ) && ( item.properties.ActivationId === '757fdf560e6e4fb0acc1d0578bc4bc83' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_fdfe656c1e47438286a19ce4147201d1' ) && ( item.properties.ActivationId === '5f417d1d6d9c498da973d30a26ac4c0f' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_a4d0398c7b004774b638156dba8050b6' ) && ( item.properties.ActivationId === '824bfc22f638402c99aa844984bc6814' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_744afd919a134feb8167ea55d036a659' ) && ( item.properties.ActivationId === 'b3cc18bb13254e95befa49486e7b7b9c' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_6c8dbd201e6d4755a505586d669fb639' ) && ( item.properties.ActivationId === 'e1aae7d578604f018c757fe76af995dd' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_bcc2eecd8f6d4b53b22bc974e6ff5342' ) && ( item.properties.ActivationId === '97916e010c614aa9873307d81cda8447' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_be43c3586cf341318cee5941dab73f25' ) && ( item.properties.ActivationId === 'a4cb2c286df54db89ddfa6a81ae7a4b8' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_131c2342fa9f469ab2448122979901b2' ) && ( item.properties.ActivationId === 'fb44869a714c49c6964ff7a14be19f77' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_c01e6722572449bf9fd84be9911dd293' ) && ( item.properties.ActivationId === 'cbfa2c14f69846ce9c3875b22652c5d9' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_add4d77de01d455eaded6a1aa09185d2' ) && ( item.properties.ActivationId === '6f9fa3a41f574fbebf7abcac08dd04b2' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_ce38323206534df6a9764036fa08c6f9' ) && ( item.properties.ActivationId === 'c0ec0e42e5fa4c03a5cb760d2c6323f5' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_3f1d9bb315f84ef090977234ef50b78d' ) && ( item.properties.ActivationId === '9314a7399ee24c039c05a1b242cd7dbd' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_21cd31ddb97343d1b519799652af5a9a' ) && ( item.properties.ActivationId === 'db93c80c878642f2974ca4589031c59c' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_a53b1e377c774e539b9ee17e59d84028' ) && ( item.properties.ActivationId === '12f4c570e1774c3f9cd5e9ba53ba24b0' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_35629a332fb4418a8285c5a6e5ac1acb' ) && ( item.properties.ActivationId === 'c6b4759436d9450aa5d6d06f0d493df3' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_1fb4bd8083ed46c2a5a63acbba0f62f2' ) && ( item.properties.ActivationId === '70b0af2656c04a7eb357556d5406bad1' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_63968d03c6364bf281240cc5f66fa76d' ) && ( item.properties.ActivationId === '2cc36dfd68a24892a3125ff93da1466c' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_c1dac4848b6f42a2a49a5e74c8e23624' ) && ( item.properties.ActivationId === 'bdd07a677e6841809f2580163d41f4cb' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_e33ddf101a174c388a5f8b0b0aa589a5' ) && ( item.properties.ActivationId === '71520233b5624b188e1f79b7acd64117' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_1894548c3c164d88b28aa8ca81eec52e' ) && ( item.properties.ActivationId === '4c5ffd05b895460695bb25e2f6445f80' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_6072680f29f240cea960b4cb5d760a96' ) && ( item.properties.ActivationId === 'a050286a236643bab071993b4816fe24' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_530b499f40bc4d94830ac93e7cbf91c7' ) && ( item.properties.ActivationId === '0b2848508785441aa8ac1b54ab74d37e' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_fec06bded49c45629b38f019b2f2b1b5' ) && ( item.properties.ActivationId === '963fb89616d6449fa26df30b0467fd3c' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_f3163586cec543669edaa7a6b3dea09c' ) && ( item.properties.ActivationId === '400088d1a343455ea5dbccd0e41aa143' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_1d8cc8d9f1c149e4800b0982ca098cb4' ) && ( item.properties.ActivationId === '1594d642ac864bebb1a24cec9e517fde' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_cf63930ad32244e19795d6a36aab026b' ) && ( item.properties.ActivationId === '7d79e95eea21479b84b294bb0163ed59' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_f1a529712bc04e19b6a53b5900532059' ) && ( item.properties.ActivationId === '53873144412d4846adff21d4efc3d83f' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_ea51485ea2a145bd89a17c7584100c3a' ) && ( item.properties.ActivationId === 'be0e6b64f793467691256ead12aa9232' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_e007bb2d411f46dd90f0b1a426e66e93' ) && ( item.properties.ActivationId === '1dd8fa52775748b385da70094b8b2094' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_9ee4348df9c041ac9eace6ade2d76ecf' ) && ( item.properties.ActivationId === '465722690f4f42df8cd602f7197d3be8' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_b7307b3c66424fe3b1a7adb04e7477af' ) && ( item.properties.ActivationId === '2956c4fbdda74079ba840a40f290cd7d' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_92c5168aba054ba4bdf6d12fee1314f6' ) && ( item.properties.ActivationId === 'ea1009a1d59d4550bbcb58978aef3cdd' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_b454f3f44a0747f59a5b16bad9e468e1' ) && ( item.properties.ActivationId === '6308e191701147e4a9a72bc3473fbdb2' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_24af472a228f4c38b30b78c4ed9076f8' ) && ( item.properties.ActivationId === '3e518a0f7a0f49149422f65c7043caa3' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_574ddad0703a4b5d96d9231ab0e42fc7' ) && ( item.properties.ActivationId === 'eb2baddcdc334ac3b5d4497b4adbd6a4' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_3c772b3dfbab4de09523fd1805cc5ba2' ) && ( item.properties.ActivationId === 'c64844c4eee14533b5d5319c25190908' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_527e8e5da4d9469f9487af8e2566366d' ) && ( item.properties.ActivationId === '461322a278544e90a0df05efdd840c46' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_ef61d4ecc9544f5da29145c6f8bcfa9d' ) && ( item.properties.ActivationId === '20f8029af34a4c3eaf24df390e89f427' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_8678a87f705e41aba41c3925220f23fe' ) && ( item.properties.ActivationId === '6cb3b765a2dd48958ef0537826804b4b' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_d271d9a5cb354e0691dacaebdb9281f3' ) && ( item.properties.ActivationId === '66ac01d677c34f9cae99dfb4cdaa00e5' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_5d982fbac181413295310c6c8fc93c5f' ) && ( item.properties.ActivationId === 'd94b900aec6249ee9e1856e3805b091b' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_81b88cb28e69458d9b80067476f7c1af' ) && ( item.properties.ActivationId === '2c53f55e7203418b91a360bdb28e5028' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_a7ac9f7d851840579b8db4bf8ac61a7b' ) && ( item.properties.ActivationId === '3c55ef4b112b4e4fbefd1df5ea871018' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_3c100e76c2f14dcf97146a67a835c702' ) && ( item.properties.ActivationId === '4e03bb4eb4364e6fa88f736b561eae82' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_ff86a95db64f492d8c23296215ba1d54' ) && ( item.properties.ActivationId === '4e29d0707ccb42e3b5b054eec8c040e4' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_f443ac2a7bc9433bad7ec2b1c4228ef7' ) && ( item.properties.ActivationId === 'b03811e7f6e94158a75912e71edffa06' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_9baa6c0b81d34a6d8c9cef39d9a5f4e6' ) && ( item.properties.ActivationId === '71cb5917ddf34a5baaf0f78810910a95' ) ) ) )" + "return ( ( item.properties.PartitionKey === `6e4ab0516fca4122bff05fb23a5f6adf` ) && ( ( ( item.properties.RowKey === `user%2fsomeraondomuser_cf9e6f1fc7264c9c8148d6050e27ee3e` ) && ( item.properties.ActivationId === `512b5a68bc1c46b480a1a052da681f45` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_267f6d72c0874408a021043138c6e395` ) && ( item.properties.ActivationId === `e195014973754b11ae1b74cb4be9aab1` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_34b4d10839ba48928a3ceee0ea6a1175` ) && ( item.properties.ActivationId === `4573eccdaf8d42148907fd3b654b72c3` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_931d172de3034561af4d210aa4007b8f` ) && ( item.properties.ActivationId === `d3e7ffeb439b4acf912006b2f01aa5a9` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_6db90a01fab7429ca52698534629dd5d` ) && ( item.properties.ActivationId === `492fe8afa0514a919fc0c491afc88e18` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_b4710ac467ea46678d3b692d552b4573` ) && ( item.properties.ActivationId === `ed3a90e556474a4486196d7d20c7e0a8` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_9a7d0ed9e934457790c4af955a5d0aa2` ) && ( item.properties.ActivationId === `e6098dd0457a438b8c8810381e72b103` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_5f45717f56d14f6ebc1df2d3195609d8` ) && ( item.properties.ActivationId === `1001b0b9b2224ab08c9b3e1413e733e3` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_593e5eb5533f41998a6946d37748d1c4` ) && ( item.properties.ActivationId === `100df8cda69a4101bd038f097073dcf0` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_5c837b849f024914b694ebf978129210` ) && ( item.properties.ActivationId === `d4b38859695c4b31892053e2f8f16ce1` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_0d59188361ed46b8967ff553fc31da22` ) && ( item.properties.ActivationId === `cc235fce46ca4dcf9c24a12eda86a23e` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_46daebbc6d214de1b724a6d1bd909f2e` ) && ( item.properties.ActivationId === `f901237d1de5466bb350013841f7e1d9` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_4bf3d38ef9664a17b8acbe6e6f4475e6` ) && ( item.properties.ActivationId === `0d8b22f41df443f4956b4cef9ddccc7b` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_7d157b7f3a3a4508a182b47394444a97` ) && ( item.properties.ActivationId === `391cbd2712e94a10b1e8f7f5566ad1d1` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_3173c9fea0124785a6dce8bb1ce22ff5` ) && ( item.properties.ActivationId === `5926f7967953443089276d4011de4586` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_855b9f1c9b1d4793b633dd312f97acee` ) && ( item.properties.ActivationId === `acbb6b581b604bd9bdb7d8109ad80c25` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_0f11694546a049df89c234f5aca29594` ) && ( item.properties.ActivationId === `83a8b6c565e74569a3d1f358ae1b4767` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_5bd0f86dc2a74ba18848156fd4384fa0` ) && ( item.properties.ActivationId === `430dcf95b539468cbfb99886949840b5` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_85c207c588dd4c9697a921b29481152b` ) && ( item.properties.ActivationId === `e114211645144d8581b279cc8b780879` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_d2d48e3e8e594b7ea755a6df291c55a4` ) && ( item.properties.ActivationId === `a9f50b02fa634628b56622602733d2df` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_3f1c4bcf08c34efb8b64a40ee4e33698` ) && ( item.properties.ActivationId === `e7180ac71c6a4fb3b5e68c3a6d3c5ce6` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_3871c563cd0e433fbb7d4ebbd6db4856` ) && ( item.properties.ActivationId === `c05eab92d0b44f4b8ea57b6cf9339cc2` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_beb39451febe40aa9b51b051a5940b7c` ) && ( item.properties.ActivationId === `51998e3e875c4c499f4ebb14bc9a91e6` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_1258f93c3b054ee2b80a52f9f9bdc170` ) && ( item.properties.ActivationId === `cb3d1fd19e2d45eeb0ebd9a704e6d576` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_b37d9915799047988a1b0598a47f7ba4` ) && ( item.properties.ActivationId === `2560bf1bcde5461eb4899ef8ae009a7a` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_37a27899265b4125ba98bc7fd2f9c000` ) && ( item.properties.ActivationId === `166e0f18cd744666b3684c406493945e` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_240b39fd90d94b54b0e923134b4cba55` ) && ( item.properties.ActivationId === `329c6825c2754dd3b18411083b7b58e4` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_e7c33f051c3c42a8883712e255635bbf` ) && ( item.properties.ActivationId === `f127763cb6374f49bf52b7876e594147` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_3d5d8beeafac4b0aa6a146f7f2e5eadb` ) && ( item.properties.ActivationId === `6f89c9bda1d74977997b1415db56a21e` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_21d9c87ed89646e88be406cb57db4e1c` ) && ( item.properties.ActivationId === `640d3e743baa4c969e4292aa80efbac2` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_6d71d83c8083415a835943b18b9d6d99` ) && ( item.properties.ActivationId === `d4f8417dab4544ed972b288bae03efa3` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_44253ea6cadc4165994fd4501998190b` ) && ( item.properties.ActivationId === `a099990633bb441a852ff00266c372ee` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_169185ee08b446ee9a1dd329997f4b50` ) && ( item.properties.ActivationId === `6928aeac8dfe4caeb44b275d3765bb9c` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_5639229f610444df9ff2c3a598ba5ff3` ) && ( item.properties.ActivationId === `afd94604d549455983d4bb043b9bf4fc` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_6e8177f40d924eecad86fe29cf042c5b` ) && ( item.properties.ActivationId === `ef6dff8131634580a05602b12b3c7030` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_82c02c372d274b12b42eb613a94f0032` ) && ( item.properties.ActivationId === `c629d8827dec4946918fac970b0b01fc` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_82d799f96a8341a888e823e7e6c680aa` ) && ( item.properties.ActivationId === `6a430683a6864d518747c5613aae81f7` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_eee54678565d4c62b3ee75ff595a639f` ) && ( item.properties.ActivationId === `05b779023a86487291c54274f2351763` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_d61b2e412be74d449cbe2e32c040b054` ) && ( item.properties.ActivationId === `abd89950074c455eabf0ce6507cff05b` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_7d3b47e40a40403bac3c879f8ccc785a` ) && ( item.properties.ActivationId === `f37b30e2b99944ad8951924d890d6514` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_fa9e78d2c68447928d3b5bcc7170f112` ) && ( item.properties.ActivationId === `bc9c4dde5ba443dea12137e5da919c41` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_3bb66b8c2abb45c8b33e75ce4baa93ac` ) && ( item.properties.ActivationId === `49c8905d49bc47bc9fea7d859c7812dd` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_55b23534d04c4efe9d580c3740230486` ) && ( item.properties.ActivationId === `1322e451d37145f4b1b41559f30b58e9` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_8b8d04a70b8f43ab87d065e89d84aefb` ) && ( item.properties.ActivationId === `3f7b8e9d039d4d788597d5fe7bb37666` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_0d5ec8bb559d4e34a2d4c4b5d935386d` ) && ( item.properties.ActivationId === `6eb87695c16f4289b48374a57fcc2bab` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_a0ba488c7b0542d49cb2b406a7b3cca4` ) && ( item.properties.ActivationId === `fb20d88f4b6d4193aad4511c8951ef59` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_25de238770ab41399d8cbe0343b9d0d3` ) && ( item.properties.ActivationId === `b587806d63324a4084cde9c92af04065` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_7688796792e245d0913f050a3a7c6c02` ) && ( item.properties.ActivationId === `d95909aedd96417f945834151d397f51` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_72967c3265ce4996b12001ea1814d62f` ) && ( item.properties.ActivationId === `d046ebb2304b4ff0be1c9d5a4c8a8831` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_6238575aaee54a628caebb48b44584e5` ) && ( item.properties.ActivationId === `6ac73966adb6496cb2a4553c7b9fe8ce` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_fb89e80d21ed4b17a850f9021c4b1d2a` ) && ( item.properties.ActivationId === `3833b18cabc344dab1dbdbb62c99accd` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_f7aa848f4c7243b892fd979326884e3d` ) && ( item.properties.ActivationId === `6911fe2a462e44aab8a143603e1af98f` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_349234378ad34ec99c3ea00cb9149f80` ) && ( item.properties.ActivationId === `62e351ea6ba44be8b45b2cb1a42efea3` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_25707be4343f4f89955ea71bb2d75fe2` ) && ( item.properties.ActivationId === `757fdf560e6e4fb0acc1d0578bc4bc83` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_fdfe656c1e47438286a19ce4147201d1` ) && ( item.properties.ActivationId === `5f417d1d6d9c498da973d30a26ac4c0f` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_a4d0398c7b004774b638156dba8050b6` ) && ( item.properties.ActivationId === `824bfc22f638402c99aa844984bc6814` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_744afd919a134feb8167ea55d036a659` ) && ( item.properties.ActivationId === `b3cc18bb13254e95befa49486e7b7b9c` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_6c8dbd201e6d4755a505586d669fb639` ) && ( item.properties.ActivationId === `e1aae7d578604f018c757fe76af995dd` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_bcc2eecd8f6d4b53b22bc974e6ff5342` ) && ( item.properties.ActivationId === `97916e010c614aa9873307d81cda8447` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_be43c3586cf341318cee5941dab73f25` ) && ( item.properties.ActivationId === `a4cb2c286df54db89ddfa6a81ae7a4b8` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_131c2342fa9f469ab2448122979901b2` ) && ( item.properties.ActivationId === `fb44869a714c49c6964ff7a14be19f77` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_c01e6722572449bf9fd84be9911dd293` ) && ( item.properties.ActivationId === `cbfa2c14f69846ce9c3875b22652c5d9` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_add4d77de01d455eaded6a1aa09185d2` ) && ( item.properties.ActivationId === `6f9fa3a41f574fbebf7abcac08dd04b2` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_ce38323206534df6a9764036fa08c6f9` ) && ( item.properties.ActivationId === `c0ec0e42e5fa4c03a5cb760d2c6323f5` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_3f1d9bb315f84ef090977234ef50b78d` ) && ( item.properties.ActivationId === `9314a7399ee24c039c05a1b242cd7dbd` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_21cd31ddb97343d1b519799652af5a9a` ) && ( item.properties.ActivationId === `db93c80c878642f2974ca4589031c59c` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_a53b1e377c774e539b9ee17e59d84028` ) && ( item.properties.ActivationId === `12f4c570e1774c3f9cd5e9ba53ba24b0` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_35629a332fb4418a8285c5a6e5ac1acb` ) && ( item.properties.ActivationId === `c6b4759436d9450aa5d6d06f0d493df3` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_1fb4bd8083ed46c2a5a63acbba0f62f2` ) && ( item.properties.ActivationId === `70b0af2656c04a7eb357556d5406bad1` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_63968d03c6364bf281240cc5f66fa76d` ) && ( item.properties.ActivationId === `2cc36dfd68a24892a3125ff93da1466c` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_c1dac4848b6f42a2a49a5e74c8e23624` ) && ( item.properties.ActivationId === `bdd07a677e6841809f2580163d41f4cb` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_e33ddf101a174c388a5f8b0b0aa589a5` ) && ( item.properties.ActivationId === `71520233b5624b188e1f79b7acd64117` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_1894548c3c164d88b28aa8ca81eec52e` ) && ( item.properties.ActivationId === `4c5ffd05b895460695bb25e2f6445f80` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_6072680f29f240cea960b4cb5d760a96` ) && ( item.properties.ActivationId === `a050286a236643bab071993b4816fe24` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_530b499f40bc4d94830ac93e7cbf91c7` ) && ( item.properties.ActivationId === `0b2848508785441aa8ac1b54ab74d37e` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_fec06bded49c45629b38f019b2f2b1b5` ) && ( item.properties.ActivationId === `963fb89616d6449fa26df30b0467fd3c` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_f3163586cec543669edaa7a6b3dea09c` ) && ( item.properties.ActivationId === `400088d1a343455ea5dbccd0e41aa143` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_1d8cc8d9f1c149e4800b0982ca098cb4` ) && ( item.properties.ActivationId === `1594d642ac864bebb1a24cec9e517fde` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_cf63930ad32244e19795d6a36aab026b` ) && ( item.properties.ActivationId === `7d79e95eea21479b84b294bb0163ed59` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_f1a529712bc04e19b6a53b5900532059` ) && ( item.properties.ActivationId === `53873144412d4846adff21d4efc3d83f` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_ea51485ea2a145bd89a17c7584100c3a` ) && ( item.properties.ActivationId === `be0e6b64f793467691256ead12aa9232` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_e007bb2d411f46dd90f0b1a426e66e93` ) && ( item.properties.ActivationId === `1dd8fa52775748b385da70094b8b2094` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_9ee4348df9c041ac9eace6ade2d76ecf` ) && ( item.properties.ActivationId === `465722690f4f42df8cd602f7197d3be8` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_b7307b3c66424fe3b1a7adb04e7477af` ) && ( item.properties.ActivationId === `2956c4fbdda74079ba840a40f290cd7d` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_92c5168aba054ba4bdf6d12fee1314f6` ) && ( item.properties.ActivationId === `ea1009a1d59d4550bbcb58978aef3cdd` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_b454f3f44a0747f59a5b16bad9e468e1` ) && ( item.properties.ActivationId === `6308e191701147e4a9a72bc3473fbdb2` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_24af472a228f4c38b30b78c4ed9076f8` ) && ( item.properties.ActivationId === `3e518a0f7a0f49149422f65c7043caa3` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_574ddad0703a4b5d96d9231ab0e42fc7` ) && ( item.properties.ActivationId === `eb2baddcdc334ac3b5d4497b4adbd6a4` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_3c772b3dfbab4de09523fd1805cc5ba2` ) && ( item.properties.ActivationId === `c64844c4eee14533b5d5319c25190908` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_527e8e5da4d9469f9487af8e2566366d` ) && ( item.properties.ActivationId === `461322a278544e90a0df05efdd840c46` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_ef61d4ecc9544f5da29145c6f8bcfa9d` ) && ( item.properties.ActivationId === `20f8029af34a4c3eaf24df390e89f427` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_8678a87f705e41aba41c3925220f23fe` ) && ( item.properties.ActivationId === `6cb3b765a2dd48958ef0537826804b4b` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_d271d9a5cb354e0691dacaebdb9281f3` ) && ( item.properties.ActivationId === `66ac01d677c34f9cae99dfb4cdaa00e5` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_5d982fbac181413295310c6c8fc93c5f` ) && ( item.properties.ActivationId === `d94b900aec6249ee9e1856e3805b091b` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_81b88cb28e69458d9b80067476f7c1af` ) && ( item.properties.ActivationId === `2c53f55e7203418b91a360bdb28e5028` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_a7ac9f7d851840579b8db4bf8ac61a7b` ) && ( item.properties.ActivationId === `3c55ef4b112b4e4fbefd1df5ea871018` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_3c100e76c2f14dcf97146a67a835c702` ) && ( item.properties.ActivationId === `4e03bb4eb4364e6fa88f736b561eae82` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_ff86a95db64f492d8c23296215ba1d54` ) && ( item.properties.ActivationId === `4e29d0707ccb42e3b5b054eec8c040e4` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_f443ac2a7bc9433bad7ec2b1c4228ef7` ) && ( item.properties.ActivationId === `b03811e7f6e94158a75912e71edffa06` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_9baa6c0b81d34a6d8c9cef39d9a5f4e6` ) && ( item.properties.ActivationId === `71cb5917ddf34a5baaf0f78810910a95` ) ) ) )" } ]; From 5abbce2d6cd54ec37dc46b1d8a191c5ba0397786 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 4 Apr 2023 10:59:15 +0800 Subject: [PATCH 068/297] Bump @typescript-eslint/parser from 5.57.0 to 5.57.1 (#1894) Bumps [@typescript-eslint/parser](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/parser) from 5.57.0 to 5.57.1. - [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases) - [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/parser/CHANGELOG.md) - [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v5.57.1/packages/parser) --- updated-dependencies: - dependency-name: "@typescript-eslint/parser" dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 139 ++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 127 insertions(+), 12 deletions(-) diff --git a/package-lock.json b/package-lock.json index 6537c2f97..50376fe90 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1600,14 +1600,14 @@ "dev": true }, "node_modules/@typescript-eslint/parser": { - "version": "5.57.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.57.0.tgz", - "integrity": "sha512-orrduvpWYkgLCyAdNtR1QIWovcNZlEm6yL8nwH/eTxWLd8gsP+25pdLHYzL2QdkqrieaDwLpytHqycncv0woUQ==", + "version": "5.57.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.57.1.tgz", + "integrity": "sha512-hlA0BLeVSA/wBPKdPGxoVr9Pp6GutGoY380FEhbVi0Ph4WNe8kLvqIRx76RSQt1lynZKfrXKs0/XeEk4zZycuA==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "5.57.0", - "@typescript-eslint/types": "5.57.0", - "@typescript-eslint/typescript-estree": "5.57.0", + "@typescript-eslint/scope-manager": "5.57.1", + "@typescript-eslint/types": "5.57.1", + "@typescript-eslint/typescript-estree": "5.57.1", "debug": "^4.3.4" }, "engines": { @@ -1626,6 +1626,80 @@ } } }, + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/scope-manager": { + "version": "5.57.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.57.1.tgz", + "integrity": "sha512-N/RrBwEUKMIYxSKl0oDK5sFVHd6VI7p9K5MyUlVYAY6dyNb/wHUqndkTd3XhpGlXgnQsBkRZuu4f9kAHghvgPw==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.57.1", + "@typescript-eslint/visitor-keys": "5.57.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/types": { + "version": "5.57.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.57.1.tgz", + "integrity": "sha512-bSs4LOgyV3bJ08F5RDqO2KXqg3WAdwHCu06zOqcQ6vqbTJizyBhuh1o1ImC69X4bV2g1OJxbH71PJqiO7Y1RuA==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/typescript-estree": { + "version": "5.57.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.57.1.tgz", + "integrity": "sha512-A2MZqD8gNT0qHKbk2wRspg7cHbCDCk2tcqt6ScCFLr5Ru8cn+TCfM786DjPhqwseiS+PrYwcXht5ztpEQ6TFTw==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.57.1", + "@typescript-eslint/visitor-keys": "5.57.1", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/visitor-keys": { + "version": "5.57.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.57.1.tgz", + "integrity": "sha512-RjQrAniDU0CEk5r7iphkm731zKlFiUjvcBS2yHAg8WWqFMCaCrD0rKEVOMUyMMcbGPZ0bPp56srkGWrgfZqLRA==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.57.1", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, "node_modules/@typescript-eslint/parser/node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -11166,17 +11240,58 @@ } }, "@typescript-eslint/parser": { - "version": "5.57.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.57.0.tgz", - "integrity": "sha512-orrduvpWYkgLCyAdNtR1QIWovcNZlEm6yL8nwH/eTxWLd8gsP+25pdLHYzL2QdkqrieaDwLpytHqycncv0woUQ==", + "version": "5.57.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.57.1.tgz", + "integrity": "sha512-hlA0BLeVSA/wBPKdPGxoVr9Pp6GutGoY380FEhbVi0Ph4WNe8kLvqIRx76RSQt1lynZKfrXKs0/XeEk4zZycuA==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "5.57.0", - "@typescript-eslint/types": "5.57.0", - "@typescript-eslint/typescript-estree": "5.57.0", + "@typescript-eslint/scope-manager": "5.57.1", + "@typescript-eslint/types": "5.57.1", + "@typescript-eslint/typescript-estree": "5.57.1", "debug": "^4.3.4" }, "dependencies": { + "@typescript-eslint/scope-manager": { + "version": "5.57.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.57.1.tgz", + "integrity": "sha512-N/RrBwEUKMIYxSKl0oDK5sFVHd6VI7p9K5MyUlVYAY6dyNb/wHUqndkTd3XhpGlXgnQsBkRZuu4f9kAHghvgPw==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.57.1", + "@typescript-eslint/visitor-keys": "5.57.1" + } + }, + "@typescript-eslint/types": { + "version": "5.57.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.57.1.tgz", + "integrity": "sha512-bSs4LOgyV3bJ08F5RDqO2KXqg3WAdwHCu06zOqcQ6vqbTJizyBhuh1o1ImC69X4bV2g1OJxbH71PJqiO7Y1RuA==", + "dev": true + }, + "@typescript-eslint/typescript-estree": { + "version": "5.57.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.57.1.tgz", + "integrity": "sha512-A2MZqD8gNT0qHKbk2wRspg7cHbCDCk2tcqt6ScCFLr5Ru8cn+TCfM786DjPhqwseiS+PrYwcXht5ztpEQ6TFTw==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.57.1", + "@typescript-eslint/visitor-keys": "5.57.1", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + } + }, + "@typescript-eslint/visitor-keys": { + "version": "5.57.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.57.1.tgz", + "integrity": "sha512-RjQrAniDU0CEk5r7iphkm731zKlFiUjvcBS2yHAg8WWqFMCaCrD0rKEVOMUyMMcbGPZ0bPp56srkGWrgfZqLRA==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.57.1", + "eslint-visitor-keys": "^3.3.0" + } + }, "debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", From 704e39b568faf1a80751bbb32683d2abae8396e2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 4 Apr 2023 15:22:08 +0800 Subject: [PATCH 069/297] Bump @typescript-eslint/eslint-plugin from 5.57.0 to 5.57.1 (#1895) Bumps [@typescript-eslint/eslint-plugin](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/eslint-plugin) from 5.57.0 to 5.57.1. - [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases) - [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/eslint-plugin/CHANGELOG.md) - [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v5.57.1/packages/eslint-plugin) --- updated-dependencies: - dependency-name: "@typescript-eslint/eslint-plugin" dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 384 ++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 350 insertions(+), 34 deletions(-) diff --git a/package-lock.json b/package-lock.json index 50376fe90..562f45149 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1543,15 +1543,15 @@ } }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.57.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.57.0.tgz", - "integrity": "sha512-itag0qpN6q2UMM6Xgk6xoHa0D0/P+M17THnr4SVgqn9Rgam5k/He33MA7/D7QoJcdMxHFyX7U9imaBonAX/6qA==", + "version": "5.57.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.57.1.tgz", + "integrity": "sha512-1MeobQkQ9tztuleT3v72XmY0XuKXVXusAhryoLuU5YZ+mXoYKZP9SQ7Flulh1NX4DTjpGTc2b/eMu4u7M7dhnQ==", "dev": true, "dependencies": { "@eslint-community/regexpp": "^4.4.0", - "@typescript-eslint/scope-manager": "5.57.0", - "@typescript-eslint/type-utils": "5.57.0", - "@typescript-eslint/utils": "5.57.0", + "@typescript-eslint/scope-manager": "5.57.1", + "@typescript-eslint/type-utils": "5.57.1", + "@typescript-eslint/utils": "5.57.1", "debug": "^4.3.4", "grapheme-splitter": "^1.0.4", "ignore": "^5.2.0", @@ -1576,6 +1576,53 @@ } } }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/scope-manager": { + "version": "5.57.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.57.1.tgz", + "integrity": "sha512-N/RrBwEUKMIYxSKl0oDK5sFVHd6VI7p9K5MyUlVYAY6dyNb/wHUqndkTd3XhpGlXgnQsBkRZuu4f9kAHghvgPw==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.57.1", + "@typescript-eslint/visitor-keys": "5.57.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/types": { + "version": "5.57.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.57.1.tgz", + "integrity": "sha512-bSs4LOgyV3bJ08F5RDqO2KXqg3WAdwHCu06zOqcQ6vqbTJizyBhuh1o1ImC69X4bV2g1OJxbH71PJqiO7Y1RuA==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/visitor-keys": { + "version": "5.57.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.57.1.tgz", + "integrity": "sha512-RjQrAniDU0CEk5r7iphkm731zKlFiUjvcBS2yHAg8WWqFMCaCrD0rKEVOMUyMMcbGPZ0bPp56srkGWrgfZqLRA==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.57.1", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -1741,13 +1788,13 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "5.57.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.57.0.tgz", - "integrity": "sha512-kxXoq9zOTbvqzLbdNKy1yFrxLC6GDJFE2Yuo3KqSwTmDOFjUGeWSakgoXT864WcK5/NAJkkONCiKb1ddsqhLXQ==", + "version": "5.57.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.57.1.tgz", + "integrity": "sha512-/RIPQyx60Pt6ga86hKXesXkJ2WOS4UemFrmmq/7eOyiYjYv/MUSHPlkhU6k9T9W1ytnTJueqASW+wOmW4KrViw==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "5.57.0", - "@typescript-eslint/utils": "5.57.0", + "@typescript-eslint/typescript-estree": "5.57.1", + "@typescript-eslint/utils": "5.57.1", "debug": "^4.3.4", "tsutils": "^3.21.0" }, @@ -1767,6 +1814,63 @@ } } }, + "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/types": { + "version": "5.57.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.57.1.tgz", + "integrity": "sha512-bSs4LOgyV3bJ08F5RDqO2KXqg3WAdwHCu06zOqcQ6vqbTJizyBhuh1o1ImC69X4bV2g1OJxbH71PJqiO7Y1RuA==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree": { + "version": "5.57.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.57.1.tgz", + "integrity": "sha512-A2MZqD8gNT0qHKbk2wRspg7cHbCDCk2tcqt6ScCFLr5Ru8cn+TCfM786DjPhqwseiS+PrYwcXht5ztpEQ6TFTw==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.57.1", + "@typescript-eslint/visitor-keys": "5.57.1", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/visitor-keys": { + "version": "5.57.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.57.1.tgz", + "integrity": "sha512-RjQrAniDU0CEk5r7iphkm731zKlFiUjvcBS2yHAg8WWqFMCaCrD0rKEVOMUyMMcbGPZ0bPp56srkGWrgfZqLRA==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.57.1", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, "node_modules/@typescript-eslint/type-utils/node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -1854,17 +1958,17 @@ "dev": true }, "node_modules/@typescript-eslint/utils": { - "version": "5.57.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.57.0.tgz", - "integrity": "sha512-ps/4WohXV7C+LTSgAL5CApxvxbMkl9B9AUZRtnEFonpIxZDIT7wC1xfvuJONMidrkB9scs4zhtRyIwHh4+18kw==", + "version": "5.57.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.57.1.tgz", + "integrity": "sha512-kN6vzzf9NkEtawECqze6v99LtmDiUJCVpvieTFA1uL7/jDghiJGubGZ5csicYHU1Xoqb3oH/R5cN5df6W41Nfg==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@types/json-schema": "^7.0.9", "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.57.0", - "@typescript-eslint/types": "5.57.0", - "@typescript-eslint/typescript-estree": "5.57.0", + "@typescript-eslint/scope-manager": "5.57.1", + "@typescript-eslint/types": "5.57.1", + "@typescript-eslint/typescript-estree": "5.57.1", "eslint-scope": "^5.1.1", "semver": "^7.3.7" }, @@ -1879,6 +1983,103 @@ "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, + "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/scope-manager": { + "version": "5.57.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.57.1.tgz", + "integrity": "sha512-N/RrBwEUKMIYxSKl0oDK5sFVHd6VI7p9K5MyUlVYAY6dyNb/wHUqndkTd3XhpGlXgnQsBkRZuu4f9kAHghvgPw==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.57.1", + "@typescript-eslint/visitor-keys": "5.57.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/types": { + "version": "5.57.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.57.1.tgz", + "integrity": "sha512-bSs4LOgyV3bJ08F5RDqO2KXqg3WAdwHCu06zOqcQ6vqbTJizyBhuh1o1ImC69X4bV2g1OJxbH71PJqiO7Y1RuA==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree": { + "version": "5.57.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.57.1.tgz", + "integrity": "sha512-A2MZqD8gNT0qHKbk2wRspg7cHbCDCk2tcqt6ScCFLr5Ru8cn+TCfM786DjPhqwseiS+PrYwcXht5ztpEQ6TFTw==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.57.1", + "@typescript-eslint/visitor-keys": "5.57.1", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/visitor-keys": { + "version": "5.57.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.57.1.tgz", + "integrity": "sha512-RjQrAniDU0CEk5r7iphkm731zKlFiUjvcBS2yHAg8WWqFMCaCrD0rKEVOMUyMMcbGPZ0bPp56srkGWrgfZqLRA==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.57.1", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/utils/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, "node_modules/@typescript-eslint/visitor-keys": { "version": "5.57.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.57.0.tgz", @@ -11205,15 +11406,15 @@ } }, "@typescript-eslint/eslint-plugin": { - "version": "5.57.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.57.0.tgz", - "integrity": "sha512-itag0qpN6q2UMM6Xgk6xoHa0D0/P+M17THnr4SVgqn9Rgam5k/He33MA7/D7QoJcdMxHFyX7U9imaBonAX/6qA==", + "version": "5.57.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.57.1.tgz", + "integrity": "sha512-1MeobQkQ9tztuleT3v72XmY0XuKXVXusAhryoLuU5YZ+mXoYKZP9SQ7Flulh1NX4DTjpGTc2b/eMu4u7M7dhnQ==", "dev": true, "requires": { "@eslint-community/regexpp": "^4.4.0", - "@typescript-eslint/scope-manager": "5.57.0", - "@typescript-eslint/type-utils": "5.57.0", - "@typescript-eslint/utils": "5.57.0", + "@typescript-eslint/scope-manager": "5.57.1", + "@typescript-eslint/type-utils": "5.57.1", + "@typescript-eslint/utils": "5.57.1", "debug": "^4.3.4", "grapheme-splitter": "^1.0.4", "ignore": "^5.2.0", @@ -11222,6 +11423,32 @@ "tsutils": "^3.21.0" }, "dependencies": { + "@typescript-eslint/scope-manager": { + "version": "5.57.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.57.1.tgz", + "integrity": "sha512-N/RrBwEUKMIYxSKl0oDK5sFVHd6VI7p9K5MyUlVYAY6dyNb/wHUqndkTd3XhpGlXgnQsBkRZuu4f9kAHghvgPw==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.57.1", + "@typescript-eslint/visitor-keys": "5.57.1" + } + }, + "@typescript-eslint/types": { + "version": "5.57.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.57.1.tgz", + "integrity": "sha512-bSs4LOgyV3bJ08F5RDqO2KXqg3WAdwHCu06zOqcQ6vqbTJizyBhuh1o1ImC69X4bV2g1OJxbH71PJqiO7Y1RuA==", + "dev": true + }, + "@typescript-eslint/visitor-keys": { + "version": "5.57.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.57.1.tgz", + "integrity": "sha512-RjQrAniDU0CEk5r7iphkm731zKlFiUjvcBS2yHAg8WWqFMCaCrD0rKEVOMUyMMcbGPZ0bPp56srkGWrgfZqLRA==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.57.1", + "eslint-visitor-keys": "^3.3.0" + } + }, "debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -11320,17 +11547,48 @@ } }, "@typescript-eslint/type-utils": { - "version": "5.57.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.57.0.tgz", - "integrity": "sha512-kxXoq9zOTbvqzLbdNKy1yFrxLC6GDJFE2Yuo3KqSwTmDOFjUGeWSakgoXT864WcK5/NAJkkONCiKb1ddsqhLXQ==", + "version": "5.57.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.57.1.tgz", + "integrity": "sha512-/RIPQyx60Pt6ga86hKXesXkJ2WOS4UemFrmmq/7eOyiYjYv/MUSHPlkhU6k9T9W1ytnTJueqASW+wOmW4KrViw==", "dev": true, "requires": { - "@typescript-eslint/typescript-estree": "5.57.0", - "@typescript-eslint/utils": "5.57.0", + "@typescript-eslint/typescript-estree": "5.57.1", + "@typescript-eslint/utils": "5.57.1", "debug": "^4.3.4", "tsutils": "^3.21.0" }, "dependencies": { + "@typescript-eslint/types": { + "version": "5.57.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.57.1.tgz", + "integrity": "sha512-bSs4LOgyV3bJ08F5RDqO2KXqg3WAdwHCu06zOqcQ6vqbTJizyBhuh1o1ImC69X4bV2g1OJxbH71PJqiO7Y1RuA==", + "dev": true + }, + "@typescript-eslint/typescript-estree": { + "version": "5.57.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.57.1.tgz", + "integrity": "sha512-A2MZqD8gNT0qHKbk2wRspg7cHbCDCk2tcqt6ScCFLr5Ru8cn+TCfM786DjPhqwseiS+PrYwcXht5ztpEQ6TFTw==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.57.1", + "@typescript-eslint/visitor-keys": "5.57.1", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + } + }, + "@typescript-eslint/visitor-keys": { + "version": "5.57.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.57.1.tgz", + "integrity": "sha512-RjQrAniDU0CEk5r7iphkm731zKlFiUjvcBS2yHAg8WWqFMCaCrD0rKEVOMUyMMcbGPZ0bPp56srkGWrgfZqLRA==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.57.1", + "eslint-visitor-keys": "^3.3.0" + } + }, "debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -11387,19 +11645,77 @@ } }, "@typescript-eslint/utils": { - "version": "5.57.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.57.0.tgz", - "integrity": "sha512-ps/4WohXV7C+LTSgAL5CApxvxbMkl9B9AUZRtnEFonpIxZDIT7wC1xfvuJONMidrkB9scs4zhtRyIwHh4+18kw==", + "version": "5.57.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.57.1.tgz", + "integrity": "sha512-kN6vzzf9NkEtawECqze6v99LtmDiUJCVpvieTFA1uL7/jDghiJGubGZ5csicYHU1Xoqb3oH/R5cN5df6W41Nfg==", "dev": true, "requires": { "@eslint-community/eslint-utils": "^4.2.0", "@types/json-schema": "^7.0.9", "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.57.0", - "@typescript-eslint/types": "5.57.0", - "@typescript-eslint/typescript-estree": "5.57.0", + "@typescript-eslint/scope-manager": "5.57.1", + "@typescript-eslint/types": "5.57.1", + "@typescript-eslint/typescript-estree": "5.57.1", "eslint-scope": "^5.1.1", "semver": "^7.3.7" + }, + "dependencies": { + "@typescript-eslint/scope-manager": { + "version": "5.57.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.57.1.tgz", + "integrity": "sha512-N/RrBwEUKMIYxSKl0oDK5sFVHd6VI7p9K5MyUlVYAY6dyNb/wHUqndkTd3XhpGlXgnQsBkRZuu4f9kAHghvgPw==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.57.1", + "@typescript-eslint/visitor-keys": "5.57.1" + } + }, + "@typescript-eslint/types": { + "version": "5.57.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.57.1.tgz", + "integrity": "sha512-bSs4LOgyV3bJ08F5RDqO2KXqg3WAdwHCu06zOqcQ6vqbTJizyBhuh1o1ImC69X4bV2g1OJxbH71PJqiO7Y1RuA==", + "dev": true + }, + "@typescript-eslint/typescript-estree": { + "version": "5.57.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.57.1.tgz", + "integrity": "sha512-A2MZqD8gNT0qHKbk2wRspg7cHbCDCk2tcqt6ScCFLr5Ru8cn+TCfM786DjPhqwseiS+PrYwcXht5ztpEQ6TFTw==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.57.1", + "@typescript-eslint/visitor-keys": "5.57.1", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + } + }, + "@typescript-eslint/visitor-keys": { + "version": "5.57.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.57.1.tgz", + "integrity": "sha512-RjQrAniDU0CEk5r7iphkm731zKlFiUjvcBS2yHAg8WWqFMCaCrD0rKEVOMUyMMcbGPZ0bPp56srkGWrgfZqLRA==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.57.1", + "eslint-visitor-keys": "^3.3.0" + } + }, + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } } }, "@typescript-eslint/visitor-keys": { From 9e51bd2638cf377e5c1385bb162d8f8d92d7afce Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 8 Apr 2023 11:18:37 +0800 Subject: [PATCH 070/297] Bump lint-staged from 13.2.0 to 13.2.1 (#1898) Bumps [lint-staged](https://github.com/okonet/lint-staged) from 13.2.0 to 13.2.1. - [Release notes](https://github.com/okonet/lint-staged/releases) - [Commits](https://github.com/okonet/lint-staged/compare/v13.2.0...v13.2.1) --- updated-dependencies: - dependency-name: lint-staged dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 167 ++-------------------------------------------- 1 file changed, 6 insertions(+), 161 deletions(-) diff --git a/package-lock.json b/package-lock.json index 562f45149..26ec67bf9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1770,23 +1770,6 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "5.57.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.57.0.tgz", - "integrity": "sha512-NANBNOQvllPlizl9LatX8+MHi7bx7WGIWYjPHDmQe5Si/0YEYfxSljJpoTyTWFTgRy3X8gLYSE4xQ2U+aCozSw==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.57.0", - "@typescript-eslint/visitor-keys": "5.57.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, "node_modules/@typescript-eslint/type-utils": { "version": "5.57.1", "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.57.1.tgz", @@ -1894,69 +1877,6 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, - "node_modules/@typescript-eslint/types": { - "version": "5.57.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.57.0.tgz", - "integrity": "sha512-mxsod+aZRSyLT+jiqHw1KK6xrANm19/+VFALVFP5qa/aiJnlP38qpyaTd0fEKhWvQk6YeNZ5LGwI1pDpBRBhtQ==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.57.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.57.0.tgz", - "integrity": "sha512-LTzQ23TV82KpO8HPnWuxM2V7ieXW8O142I7hQTxWIHDcCEIjtkat6H96PFkYBQqGFLW/G/eVVOB9Z8rcvdY/Vw==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.57.0", - "@typescript-eslint/visitor-keys": "5.57.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, "node_modules/@typescript-eslint/utils": { "version": "5.57.1", "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.57.1.tgz", @@ -2080,23 +2000,6 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.57.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.57.0.tgz", - "integrity": "sha512-ery2g3k0hv5BLiKpPuwYt9KBkAp2ugT6VvyShXdLOkax895EC55sP0Tx5L0fZaQueiK3fBLvHVvEl3jFS5ia+g==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.57.0", - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, "node_modules/accepts": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", @@ -6728,9 +6631,9 @@ } }, "node_modules/lint-staged": { - "version": "13.2.0", - "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-13.2.0.tgz", - "integrity": "sha512-GbyK5iWinax5Dfw5obm2g2ccUiZXNGtAS4mCbJ0Lv4rq6iEtfBSjOYdcbOtAIFtM114t0vdpViDDetjVTSd8Vw==", + "version": "13.2.1", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-13.2.1.tgz", + "integrity": "sha512-8gfzinVXoPfga5Dz/ZOn8I2GOhf81Wvs+KwbEXQn/oWZAvCVS2PivrXfVbFJc93zD16uC0neS47RXHIjXKYZQw==", "dev": true, "dependencies": { "chalk": "5.2.0", @@ -11536,16 +11439,6 @@ } } }, - "@typescript-eslint/scope-manager": { - "version": "5.57.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.57.0.tgz", - "integrity": "sha512-NANBNOQvllPlizl9LatX8+MHi7bx7WGIWYjPHDmQe5Si/0YEYfxSljJpoTyTWFTgRy3X8gLYSE4xQ2U+aCozSw==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.57.0", - "@typescript-eslint/visitor-keys": "5.57.0" - } - }, "@typescript-eslint/type-utils": { "version": "5.57.1", "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.57.1.tgz", @@ -11606,44 +11499,6 @@ } } }, - "@typescript-eslint/types": { - "version": "5.57.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.57.0.tgz", - "integrity": "sha512-mxsod+aZRSyLT+jiqHw1KK6xrANm19/+VFALVFP5qa/aiJnlP38qpyaTd0fEKhWvQk6YeNZ5LGwI1pDpBRBhtQ==", - "dev": true - }, - "@typescript-eslint/typescript-estree": { - "version": "5.57.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.57.0.tgz", - "integrity": "sha512-LTzQ23TV82KpO8HPnWuxM2V7ieXW8O142I7hQTxWIHDcCEIjtkat6H96PFkYBQqGFLW/G/eVVOB9Z8rcvdY/Vw==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.57.0", - "@typescript-eslint/visitor-keys": "5.57.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - }, - "dependencies": { - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } - } - }, "@typescript-eslint/utils": { "version": "5.57.1", "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.57.1.tgz", @@ -11718,16 +11573,6 @@ } } }, - "@typescript-eslint/visitor-keys": { - "version": "5.57.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.57.0.tgz", - "integrity": "sha512-ery2g3k0hv5BLiKpPuwYt9KBkAp2ugT6VvyShXdLOkax895EC55sP0Tx5L0fZaQueiK3fBLvHVvEl3jFS5ia+g==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.57.0", - "eslint-visitor-keys": "^3.3.0" - } - }, "accepts": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", @@ -15372,9 +15217,9 @@ } }, "lint-staged": { - "version": "13.2.0", - "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-13.2.0.tgz", - "integrity": "sha512-GbyK5iWinax5Dfw5obm2g2ccUiZXNGtAS4mCbJ0Lv4rq6iEtfBSjOYdcbOtAIFtM114t0vdpViDDetjVTSd8Vw==", + "version": "13.2.1", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-13.2.1.tgz", + "integrity": "sha512-8gfzinVXoPfga5Dz/ZOn8I2GOhf81Wvs+KwbEXQn/oWZAvCVS2PivrXfVbFJc93zD16uC0neS47RXHIjXKYZQw==", "dev": true, "requires": { "chalk": "5.2.0", From 76d08acc8cfdb26a726cf643011074a4a22efcf4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 8 Apr 2023 11:18:48 +0800 Subject: [PATCH 071/297] Bump typescript from 5.0.3 to 5.0.4 (#1900) Bumps [typescript](https://github.com/Microsoft/TypeScript) from 5.0.3 to 5.0.4. - [Release notes](https://github.com/Microsoft/TypeScript/releases) - [Commits](https://github.com/Microsoft/TypeScript/compare/v5.0.3...v5.0.4) --- updated-dependencies: - dependency-name: typescript dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 26ec67bf9..1660d6024 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9632,9 +9632,9 @@ } }, "node_modules/typescript": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.3.tgz", - "integrity": "sha512-xv8mOEDnigb/tN9PSMTwSEqAnUvkoXMQlicOb0IUVDBSQCgBSaAAROUZYy2IcUy5qU6XajK5jjjO7TMWqBTKZA==", + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.4.tgz", + "integrity": "sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw==", "dev": true, "bin": { "tsc": "bin/tsc", @@ -17447,9 +17447,9 @@ } }, "typescript": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.3.tgz", - "integrity": "sha512-xv8mOEDnigb/tN9PSMTwSEqAnUvkoXMQlicOb0IUVDBSQCgBSaAAROUZYy2IcUy5qU6XajK5jjjO7TMWqBTKZA==", + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.4.tgz", + "integrity": "sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw==", "dev": true }, "uc.micro": { From d05d9a7f25aa6f20fba46f42af026c167e4bbc55 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 11 Apr 2023 11:46:03 +0800 Subject: [PATCH 072/297] Bump eslint from 8.37.0 to 8.38.0 (#1902) Bumps [eslint](https://github.com/eslint/eslint) from 8.37.0 to 8.38.0. - [Release notes](https://github.com/eslint/eslint/releases) - [Changelog](https://github.com/eslint/eslint/blob/main/CHANGELOG.md) - [Commits](https://github.com/eslint/eslint/compare/v8.37.0...v8.38.0) --- updated-dependencies: - dependency-name: eslint dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/package-lock.json b/package-lock.json index 1660d6024..68943d060 100644 --- a/package-lock.json +++ b/package-lock.json @@ -987,9 +987,9 @@ } }, "node_modules/@eslint/js": { - "version": "8.37.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.37.0.tgz", - "integrity": "sha512-x5vzdtOOGgFVDCUs81QRB2+liax8rFg3+7hqM+QhBG0/G3F1ZsoYl97UrqgHgQ9KKT7G6c4V+aTUCgu/n22v1A==", + "version": "8.38.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.38.0.tgz", + "integrity": "sha512-IoD2MfUnOV58ghIHCiil01PcohxjbYR/qCxsoC+xNgUwh1EY8jOOrYmu3d3a71+tJJ23uscEV4X2HJWMsPJu4g==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -4320,15 +4320,15 @@ } }, "node_modules/eslint": { - "version": "8.37.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.37.0.tgz", - "integrity": "sha512-NU3Ps9nI05GUoVMxcZx1J8CNR6xOvUT4jAUMH5+z8lpp3aEdPVCImKw6PWG4PY+Vfkpr+jvMpxs/qoE7wq0sPw==", + "version": "8.38.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.38.0.tgz", + "integrity": "sha512-pIdsD2jwlUGf/U38Jv97t8lq6HpaU/G9NKbYmpWpZGw3LdTNhZLbJePqxOXGB5+JEKfOPU/XLxYxFh03nr1KTg==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.4.0", "@eslint/eslintrc": "^2.0.2", - "@eslint/js": "8.37.0", + "@eslint/js": "8.38.0", "@humanwhocodes/config-array": "^0.11.8", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", @@ -10826,9 +10826,9 @@ } }, "@eslint/js": { - "version": "8.37.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.37.0.tgz", - "integrity": "sha512-x5vzdtOOGgFVDCUs81QRB2+liax8rFg3+7hqM+QhBG0/G3F1ZsoYl97UrqgHgQ9KKT7G6c4V+aTUCgu/n22v1A==", + "version": "8.38.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.38.0.tgz", + "integrity": "sha512-IoD2MfUnOV58ghIHCiil01PcohxjbYR/qCxsoC+xNgUwh1EY8jOOrYmu3d3a71+tJJ23uscEV4X2HJWMsPJu4g==", "dev": true }, "@humanwhocodes/config-array": { @@ -13530,15 +13530,15 @@ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" }, "eslint": { - "version": "8.37.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.37.0.tgz", - "integrity": "sha512-NU3Ps9nI05GUoVMxcZx1J8CNR6xOvUT4jAUMH5+z8lpp3aEdPVCImKw6PWG4PY+Vfkpr+jvMpxs/qoE7wq0sPw==", + "version": "8.38.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.38.0.tgz", + "integrity": "sha512-pIdsD2jwlUGf/U38Jv97t8lq6HpaU/G9NKbYmpWpZGw3LdTNhZLbJePqxOXGB5+JEKfOPU/XLxYxFh03nr1KTg==", "dev": true, "requires": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.4.0", "@eslint/eslintrc": "^2.0.2", - "@eslint/js": "8.37.0", + "@eslint/js": "8.38.0", "@humanwhocodes/config-array": "^0.11.8", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", From 160e91551c3138207ce6be8945ca407faecb1d8d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 11 Apr 2023 11:58:10 +0800 Subject: [PATCH 073/297] Bump @typescript-eslint/eslint-plugin from 5.57.1 to 5.58.0 (#1904) Bumps [@typescript-eslint/eslint-plugin](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/eslint-plugin) from 5.57.1 to 5.58.0. - [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases) - [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/eslint-plugin/CHANGELOG.md) - [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v5.58.0/packages/eslint-plugin) --- updated-dependencies: - dependency-name: "@typescript-eslint/eslint-plugin" dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 437 +++++++++++++++------------------------------- 1 file changed, 138 insertions(+), 299 deletions(-) diff --git a/package-lock.json b/package-lock.json index 68943d060..e08f6f58d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1543,15 +1543,15 @@ } }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.57.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.57.1.tgz", - "integrity": "sha512-1MeobQkQ9tztuleT3v72XmY0XuKXVXusAhryoLuU5YZ+mXoYKZP9SQ7Flulh1NX4DTjpGTc2b/eMu4u7M7dhnQ==", + "version": "5.58.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.58.0.tgz", + "integrity": "sha512-vxHvLhH0qgBd3/tW6/VccptSfc8FxPQIkmNTVLWcCOVqSBvqpnKkBTYrhcGlXfSnd78azwe+PsjYFj0X34/njA==", "dev": true, "dependencies": { "@eslint-community/regexpp": "^4.4.0", - "@typescript-eslint/scope-manager": "5.57.1", - "@typescript-eslint/type-utils": "5.57.1", - "@typescript-eslint/utils": "5.57.1", + "@typescript-eslint/scope-manager": "5.58.0", + "@typescript-eslint/type-utils": "5.58.0", + "@typescript-eslint/utils": "5.58.0", "debug": "^4.3.4", "grapheme-splitter": "^1.0.4", "ignore": "^5.2.0", @@ -1576,53 +1576,6 @@ } } }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/scope-manager": { - "version": "5.57.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.57.1.tgz", - "integrity": "sha512-N/RrBwEUKMIYxSKl0oDK5sFVHd6VI7p9K5MyUlVYAY6dyNb/wHUqndkTd3XhpGlXgnQsBkRZuu4f9kAHghvgPw==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.57.1", - "@typescript-eslint/visitor-keys": "5.57.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/types": { - "version": "5.57.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.57.1.tgz", - "integrity": "sha512-bSs4LOgyV3bJ08F5RDqO2KXqg3WAdwHCu06zOqcQ6vqbTJizyBhuh1o1ImC69X4bV2g1OJxbH71PJqiO7Y1RuA==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/visitor-keys": { - "version": "5.57.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.57.1.tgz", - "integrity": "sha512-RjQrAniDU0CEk5r7iphkm731zKlFiUjvcBS2yHAg8WWqFMCaCrD0rKEVOMUyMMcbGPZ0bPp56srkGWrgfZqLRA==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.57.1", - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -1770,14 +1723,31 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "5.58.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.58.0.tgz", + "integrity": "sha512-b+w8ypN5CFvrXWQb9Ow9T4/6LC2MikNf1viLkYTiTbkQl46CnR69w7lajz1icW0TBsYmlpg+mRzFJ4LEJ8X9NA==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.58.0", + "@typescript-eslint/visitor-keys": "5.58.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, "node_modules/@typescript-eslint/type-utils": { - "version": "5.57.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.57.1.tgz", - "integrity": "sha512-/RIPQyx60Pt6ga86hKXesXkJ2WOS4UemFrmmq/7eOyiYjYv/MUSHPlkhU6k9T9W1ytnTJueqASW+wOmW4KrViw==", + "version": "5.58.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.58.0.tgz", + "integrity": "sha512-FF5vP/SKAFJ+LmR9PENql7fQVVgGDOS+dq3j+cKl9iW/9VuZC/8CFmzIP0DLKXfWKpRHawJiG70rVH+xZZbp8w==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "5.57.1", - "@typescript-eslint/utils": "5.57.1", + "@typescript-eslint/typescript-estree": "5.58.0", + "@typescript-eslint/utils": "5.58.0", "debug": "^4.3.4", "tsutils": "^3.21.0" }, @@ -1797,10 +1767,33 @@ } } }, - "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/types": { - "version": "5.57.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.57.1.tgz", - "integrity": "sha512-bSs4LOgyV3bJ08F5RDqO2KXqg3WAdwHCu06zOqcQ6vqbTJizyBhuh1o1ImC69X4bV2g1OJxbH71PJqiO7Y1RuA==", + "node_modules/@typescript-eslint/type-utils/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/@typescript-eslint/types": { + "version": "5.58.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.58.0.tgz", + "integrity": "sha512-JYV4eITHPzVQMnHZcYJXl2ZloC7thuUHrcUmxtzvItyKPvQ50kb9QXBkgNAt90OYMqwaodQh2kHutWZl1fc+1g==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -1810,14 +1803,14 @@ "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree": { - "version": "5.57.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.57.1.tgz", - "integrity": "sha512-A2MZqD8gNT0qHKbk2wRspg7cHbCDCk2tcqt6ScCFLr5Ru8cn+TCfM786DjPhqwseiS+PrYwcXht5ztpEQ6TFTw==", + "node_modules/@typescript-eslint/typescript-estree": { + "version": "5.58.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.58.0.tgz", + "integrity": "sha512-cRACvGTodA+UxnYM2uwA2KCwRL7VAzo45syNysqlMyNyjw0Z35Icc9ihPJZjIYuA5bXJYiJ2YGUB59BqlOZT1Q==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.57.1", - "@typescript-eslint/visitor-keys": "5.57.1", + "@typescript-eslint/types": "5.58.0", + "@typescript-eslint/visitor-keys": "5.58.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -1837,24 +1830,7 @@ } } }, - "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/visitor-keys": { - "version": "5.57.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.57.1.tgz", - "integrity": "sha512-RjQrAniDU0CEk5r7iphkm731zKlFiUjvcBS2yHAg8WWqFMCaCrD0rKEVOMUyMMcbGPZ0bPp56srkGWrgfZqLRA==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.57.1", - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/type-utils/node_modules/debug": { + "node_modules/@typescript-eslint/typescript-estree/node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", @@ -1871,24 +1847,24 @@ } } }, - "node_modules/@typescript-eslint/type-utils/node_modules/ms": { + "node_modules/@typescript-eslint/typescript-estree/node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, "node_modules/@typescript-eslint/utils": { - "version": "5.57.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.57.1.tgz", - "integrity": "sha512-kN6vzzf9NkEtawECqze6v99LtmDiUJCVpvieTFA1uL7/jDghiJGubGZ5csicYHU1Xoqb3oH/R5cN5df6W41Nfg==", + "version": "5.58.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.58.0.tgz", + "integrity": "sha512-gAmLOTFXMXOC+zP1fsqm3VceKSBQJNzV385Ok3+yzlavNHZoedajjS4UyS21gabJYcobuigQPs/z71A9MdJFqQ==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@types/json-schema": "^7.0.9", "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.57.1", - "@typescript-eslint/types": "5.57.1", - "@typescript-eslint/typescript-estree": "5.57.1", + "@typescript-eslint/scope-manager": "5.58.0", + "@typescript-eslint/types": "5.58.0", + "@typescript-eslint/typescript-estree": "5.58.0", "eslint-scope": "^5.1.1", "semver": "^7.3.7" }, @@ -1903,70 +1879,13 @@ "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, - "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/scope-manager": { - "version": "5.57.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.57.1.tgz", - "integrity": "sha512-N/RrBwEUKMIYxSKl0oDK5sFVHd6VI7p9K5MyUlVYAY6dyNb/wHUqndkTd3XhpGlXgnQsBkRZuu4f9kAHghvgPw==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.57.1", - "@typescript-eslint/visitor-keys": "5.57.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/types": { - "version": "5.57.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.57.1.tgz", - "integrity": "sha512-bSs4LOgyV3bJ08F5RDqO2KXqg3WAdwHCu06zOqcQ6vqbTJizyBhuh1o1ImC69X4bV2g1OJxbH71PJqiO7Y1RuA==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree": { - "version": "5.57.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.57.1.tgz", - "integrity": "sha512-A2MZqD8gNT0qHKbk2wRspg7cHbCDCk2tcqt6ScCFLr5Ru8cn+TCfM786DjPhqwseiS+PrYwcXht5ztpEQ6TFTw==", + "node_modules/@typescript-eslint/visitor-keys": { + "version": "5.58.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.58.0.tgz", + "integrity": "sha512-/fBraTlPj0jwdyTwLyrRTxv/3lnU2H96pNTVM6z3esTWLtA5MZ9ghSMJ7Rb+TtUAdtEw9EyJzJ0EydIMKxQ9gA==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.57.1", - "@typescript-eslint/visitor-keys": "5.57.1", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/visitor-keys": { - "version": "5.57.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.57.1.tgz", - "integrity": "sha512-RjQrAniDU0CEk5r7iphkm731zKlFiUjvcBS2yHAg8WWqFMCaCrD0rKEVOMUyMMcbGPZ0bPp56srkGWrgfZqLRA==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.57.1", + "@typescript-eslint/types": "5.58.0", "eslint-visitor-keys": "^3.3.0" }, "engines": { @@ -1977,29 +1896,6 @@ "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@typescript-eslint/utils/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/utils/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, "node_modules/accepts": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", @@ -11309,15 +11205,15 @@ } }, "@typescript-eslint/eslint-plugin": { - "version": "5.57.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.57.1.tgz", - "integrity": "sha512-1MeobQkQ9tztuleT3v72XmY0XuKXVXusAhryoLuU5YZ+mXoYKZP9SQ7Flulh1NX4DTjpGTc2b/eMu4u7M7dhnQ==", + "version": "5.58.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.58.0.tgz", + "integrity": "sha512-vxHvLhH0qgBd3/tW6/VccptSfc8FxPQIkmNTVLWcCOVqSBvqpnKkBTYrhcGlXfSnd78azwe+PsjYFj0X34/njA==", "dev": true, "requires": { "@eslint-community/regexpp": "^4.4.0", - "@typescript-eslint/scope-manager": "5.57.1", - "@typescript-eslint/type-utils": "5.57.1", - "@typescript-eslint/utils": "5.57.1", + "@typescript-eslint/scope-manager": "5.58.0", + "@typescript-eslint/type-utils": "5.58.0", + "@typescript-eslint/utils": "5.58.0", "debug": "^4.3.4", "grapheme-splitter": "^1.0.4", "ignore": "^5.2.0", @@ -11326,32 +11222,6 @@ "tsutils": "^3.21.0" }, "dependencies": { - "@typescript-eslint/scope-manager": { - "version": "5.57.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.57.1.tgz", - "integrity": "sha512-N/RrBwEUKMIYxSKl0oDK5sFVHd6VI7p9K5MyUlVYAY6dyNb/wHUqndkTd3XhpGlXgnQsBkRZuu4f9kAHghvgPw==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.57.1", - "@typescript-eslint/visitor-keys": "5.57.1" - } - }, - "@typescript-eslint/types": { - "version": "5.57.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.57.1.tgz", - "integrity": "sha512-bSs4LOgyV3bJ08F5RDqO2KXqg3WAdwHCu06zOqcQ6vqbTJizyBhuh1o1ImC69X4bV2g1OJxbH71PJqiO7Y1RuA==", - "dev": true - }, - "@typescript-eslint/visitor-keys": { - "version": "5.57.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.57.1.tgz", - "integrity": "sha512-RjQrAniDU0CEk5r7iphkm731zKlFiUjvcBS2yHAg8WWqFMCaCrD0rKEVOMUyMMcbGPZ0bPp56srkGWrgfZqLRA==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.57.1", - "eslint-visitor-keys": "^3.3.0" - } - }, "debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -11439,49 +11309,28 @@ } } }, + "@typescript-eslint/scope-manager": { + "version": "5.58.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.58.0.tgz", + "integrity": "sha512-b+w8ypN5CFvrXWQb9Ow9T4/6LC2MikNf1viLkYTiTbkQl46CnR69w7lajz1icW0TBsYmlpg+mRzFJ4LEJ8X9NA==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.58.0", + "@typescript-eslint/visitor-keys": "5.58.0" + } + }, "@typescript-eslint/type-utils": { - "version": "5.57.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.57.1.tgz", - "integrity": "sha512-/RIPQyx60Pt6ga86hKXesXkJ2WOS4UemFrmmq/7eOyiYjYv/MUSHPlkhU6k9T9W1ytnTJueqASW+wOmW4KrViw==", + "version": "5.58.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.58.0.tgz", + "integrity": "sha512-FF5vP/SKAFJ+LmR9PENql7fQVVgGDOS+dq3j+cKl9iW/9VuZC/8CFmzIP0DLKXfWKpRHawJiG70rVH+xZZbp8w==", "dev": true, "requires": { - "@typescript-eslint/typescript-estree": "5.57.1", - "@typescript-eslint/utils": "5.57.1", + "@typescript-eslint/typescript-estree": "5.58.0", + "@typescript-eslint/utils": "5.58.0", "debug": "^4.3.4", "tsutils": "^3.21.0" }, "dependencies": { - "@typescript-eslint/types": { - "version": "5.57.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.57.1.tgz", - "integrity": "sha512-bSs4LOgyV3bJ08F5RDqO2KXqg3WAdwHCu06zOqcQ6vqbTJizyBhuh1o1ImC69X4bV2g1OJxbH71PJqiO7Y1RuA==", - "dev": true - }, - "@typescript-eslint/typescript-estree": { - "version": "5.57.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.57.1.tgz", - "integrity": "sha512-A2MZqD8gNT0qHKbk2wRspg7cHbCDCk2tcqt6ScCFLr5Ru8cn+TCfM786DjPhqwseiS+PrYwcXht5ztpEQ6TFTw==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.57.1", - "@typescript-eslint/visitor-keys": "5.57.1", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - } - }, - "@typescript-eslint/visitor-keys": { - "version": "5.57.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.57.1.tgz", - "integrity": "sha512-RjQrAniDU0CEk5r7iphkm731zKlFiUjvcBS2yHAg8WWqFMCaCrD0rKEVOMUyMMcbGPZ0bPp56srkGWrgfZqLRA==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.57.1", - "eslint-visitor-keys": "^3.3.0" - } - }, "debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -11499,63 +11348,27 @@ } } }, - "@typescript-eslint/utils": { - "version": "5.57.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.57.1.tgz", - "integrity": "sha512-kN6vzzf9NkEtawECqze6v99LtmDiUJCVpvieTFA1uL7/jDghiJGubGZ5csicYHU1Xoqb3oH/R5cN5df6W41Nfg==", + "@typescript-eslint/types": { + "version": "5.58.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.58.0.tgz", + "integrity": "sha512-JYV4eITHPzVQMnHZcYJXl2ZloC7thuUHrcUmxtzvItyKPvQ50kb9QXBkgNAt90OYMqwaodQh2kHutWZl1fc+1g==", + "dev": true + }, + "@typescript-eslint/typescript-estree": { + "version": "5.58.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.58.0.tgz", + "integrity": "sha512-cRACvGTodA+UxnYM2uwA2KCwRL7VAzo45syNysqlMyNyjw0Z35Icc9ihPJZjIYuA5bXJYiJ2YGUB59BqlOZT1Q==", "dev": true, "requires": { - "@eslint-community/eslint-utils": "^4.2.0", - "@types/json-schema": "^7.0.9", - "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.57.1", - "@typescript-eslint/types": "5.57.1", - "@typescript-eslint/typescript-estree": "5.57.1", - "eslint-scope": "^5.1.1", - "semver": "^7.3.7" + "@typescript-eslint/types": "5.58.0", + "@typescript-eslint/visitor-keys": "5.58.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" }, "dependencies": { - "@typescript-eslint/scope-manager": { - "version": "5.57.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.57.1.tgz", - "integrity": "sha512-N/RrBwEUKMIYxSKl0oDK5sFVHd6VI7p9K5MyUlVYAY6dyNb/wHUqndkTd3XhpGlXgnQsBkRZuu4f9kAHghvgPw==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.57.1", - "@typescript-eslint/visitor-keys": "5.57.1" - } - }, - "@typescript-eslint/types": { - "version": "5.57.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.57.1.tgz", - "integrity": "sha512-bSs4LOgyV3bJ08F5RDqO2KXqg3WAdwHCu06zOqcQ6vqbTJizyBhuh1o1ImC69X4bV2g1OJxbH71PJqiO7Y1RuA==", - "dev": true - }, - "@typescript-eslint/typescript-estree": { - "version": "5.57.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.57.1.tgz", - "integrity": "sha512-A2MZqD8gNT0qHKbk2wRspg7cHbCDCk2tcqt6ScCFLr5Ru8cn+TCfM786DjPhqwseiS+PrYwcXht5ztpEQ6TFTw==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.57.1", - "@typescript-eslint/visitor-keys": "5.57.1", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - } - }, - "@typescript-eslint/visitor-keys": { - "version": "5.57.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.57.1.tgz", - "integrity": "sha512-RjQrAniDU0CEk5r7iphkm731zKlFiUjvcBS2yHAg8WWqFMCaCrD0rKEVOMUyMMcbGPZ0bPp56srkGWrgfZqLRA==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.57.1", - "eslint-visitor-keys": "^3.3.0" - } - }, "debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -11573,6 +11386,32 @@ } } }, + "@typescript-eslint/utils": { + "version": "5.58.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.58.0.tgz", + "integrity": "sha512-gAmLOTFXMXOC+zP1fsqm3VceKSBQJNzV385Ok3+yzlavNHZoedajjS4UyS21gabJYcobuigQPs/z71A9MdJFqQ==", + "dev": true, + "requires": { + "@eslint-community/eslint-utils": "^4.2.0", + "@types/json-schema": "^7.0.9", + "@types/semver": "^7.3.12", + "@typescript-eslint/scope-manager": "5.58.0", + "@typescript-eslint/types": "5.58.0", + "@typescript-eslint/typescript-estree": "5.58.0", + "eslint-scope": "^5.1.1", + "semver": "^7.3.7" + } + }, + "@typescript-eslint/visitor-keys": { + "version": "5.58.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.58.0.tgz", + "integrity": "sha512-/fBraTlPj0jwdyTwLyrRTxv/3lnU2H96pNTVM6z3esTWLtA5MZ9ghSMJ7Rb+TtUAdtEw9EyJzJ0EydIMKxQ9gA==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.58.0", + "eslint-visitor-keys": "^3.3.0" + } + }, "accepts": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", From 0bb1539784c26f39c38118fd873a6c1a936e076d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 12 Apr 2023 09:57:18 +0800 Subject: [PATCH 074/297] Bump @azure/data-tables from 13.2.1 to 13.2.2 (#1910) Bumps [@azure/data-tables](https://github.com/Azure/azure-sdk-for-js) from 13.2.1 to 13.2.2. - [Release notes](https://github.com/Azure/azure-sdk-for-js/releases) - [Changelog](https://github.com/Azure/azure-sdk-for-js/blob/main/documentation/Changelog-for-next-generation.md) - [Commits](https://github.com/Azure/azure-sdk-for-js/compare/@azure/data-tables_13.2.1...@azure/data-tables_13.2.2) --- updated-dependencies: - dependency-name: "@azure/data-tables" dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index e08f6f58d..34137f759 100644 --- a/package-lock.json +++ b/package-lock.json @@ -306,9 +306,9 @@ } }, "node_modules/@azure/data-tables": { - "version": "13.2.1", - "resolved": "https://registry.npmjs.org/@azure/data-tables/-/data-tables-13.2.1.tgz", - "integrity": "sha512-5pboUpSpxjTgZ499MxkLLR0i+lyUUwN6M5pTLZ2D4mUfKVz+vqiCijvxij0V0OfknMxVpQ+NrZcUdarw6a1Few==", + "version": "13.2.2", + "resolved": "https://registry.npmjs.org/@azure/data-tables/-/data-tables-13.2.2.tgz", + "integrity": "sha512-Dq2Aq0mMMF0BPzYQKdBY/OtO7VemP/foh6z+mJpUO1hRL+65C1rGQUJf20LJHotSyU8wHb4HJzOs+Z50GXSy1w==", "dev": true, "dependencies": { "@azure/core-auth": "^1.3.0", @@ -10185,9 +10185,9 @@ } }, "@azure/data-tables": { - "version": "13.2.1", - "resolved": "https://registry.npmjs.org/@azure/data-tables/-/data-tables-13.2.1.tgz", - "integrity": "sha512-5pboUpSpxjTgZ499MxkLLR0i+lyUUwN6M5pTLZ2D4mUfKVz+vqiCijvxij0V0OfknMxVpQ+NrZcUdarw6a1Few==", + "version": "13.2.2", + "resolved": "https://registry.npmjs.org/@azure/data-tables/-/data-tables-13.2.2.tgz", + "integrity": "sha512-Dq2Aq0mMMF0BPzYQKdBY/OtO7VemP/foh6z+mJpUO1hRL+65C1rGQUJf20LJHotSyU8wHb4HJzOs+Z50GXSy1w==", "dev": true, "requires": { "@azure/core-auth": "^1.3.0", From 89a68e9682d88d99c5abc1c4f78bd08decc85e9f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 12 Apr 2023 09:57:39 +0800 Subject: [PATCH 075/297] Bump @typescript-eslint/parser from 5.57.1 to 5.58.0 (#1908) Bumps [@typescript-eslint/parser](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/parser) from 5.57.1 to 5.58.0. - [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases) - [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/parser/CHANGELOG.md) - [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v5.58.0/packages/parser) --- updated-dependencies: - dependency-name: "@typescript-eslint/parser" dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 139 ++++------------------------------------------ 1 file changed, 12 insertions(+), 127 deletions(-) diff --git a/package-lock.json b/package-lock.json index 34137f759..0423f1faa 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1600,14 +1600,14 @@ "dev": true }, "node_modules/@typescript-eslint/parser": { - "version": "5.57.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.57.1.tgz", - "integrity": "sha512-hlA0BLeVSA/wBPKdPGxoVr9Pp6GutGoY380FEhbVi0Ph4WNe8kLvqIRx76RSQt1lynZKfrXKs0/XeEk4zZycuA==", + "version": "5.58.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.58.0.tgz", + "integrity": "sha512-ixaM3gRtlfrKzP8N6lRhBbjTow1t6ztfBvQNGuRM8qH1bjFFXIJ35XY+FC0RRBKn3C6cT+7VW1y8tNm7DwPHDQ==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "5.57.1", - "@typescript-eslint/types": "5.57.1", - "@typescript-eslint/typescript-estree": "5.57.1", + "@typescript-eslint/scope-manager": "5.58.0", + "@typescript-eslint/types": "5.58.0", + "@typescript-eslint/typescript-estree": "5.58.0", "debug": "^4.3.4" }, "engines": { @@ -1626,80 +1626,6 @@ } } }, - "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/scope-manager": { - "version": "5.57.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.57.1.tgz", - "integrity": "sha512-N/RrBwEUKMIYxSKl0oDK5sFVHd6VI7p9K5MyUlVYAY6dyNb/wHUqndkTd3XhpGlXgnQsBkRZuu4f9kAHghvgPw==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.57.1", - "@typescript-eslint/visitor-keys": "5.57.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/types": { - "version": "5.57.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.57.1.tgz", - "integrity": "sha512-bSs4LOgyV3bJ08F5RDqO2KXqg3WAdwHCu06zOqcQ6vqbTJizyBhuh1o1ImC69X4bV2g1OJxbH71PJqiO7Y1RuA==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/typescript-estree": { - "version": "5.57.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.57.1.tgz", - "integrity": "sha512-A2MZqD8gNT0qHKbk2wRspg7cHbCDCk2tcqt6ScCFLr5Ru8cn+TCfM786DjPhqwseiS+PrYwcXht5ztpEQ6TFTw==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.57.1", - "@typescript-eslint/visitor-keys": "5.57.1", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/visitor-keys": { - "version": "5.57.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.57.1.tgz", - "integrity": "sha512-RjQrAniDU0CEk5r7iphkm731zKlFiUjvcBS2yHAg8WWqFMCaCrD0rKEVOMUyMMcbGPZ0bPp56srkGWrgfZqLRA==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.57.1", - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, "node_modules/@typescript-eslint/parser/node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -11240,58 +11166,17 @@ } }, "@typescript-eslint/parser": { - "version": "5.57.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.57.1.tgz", - "integrity": "sha512-hlA0BLeVSA/wBPKdPGxoVr9Pp6GutGoY380FEhbVi0Ph4WNe8kLvqIRx76RSQt1lynZKfrXKs0/XeEk4zZycuA==", + "version": "5.58.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.58.0.tgz", + "integrity": "sha512-ixaM3gRtlfrKzP8N6lRhBbjTow1t6ztfBvQNGuRM8qH1bjFFXIJ35XY+FC0RRBKn3C6cT+7VW1y8tNm7DwPHDQ==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "5.57.1", - "@typescript-eslint/types": "5.57.1", - "@typescript-eslint/typescript-estree": "5.57.1", + "@typescript-eslint/scope-manager": "5.58.0", + "@typescript-eslint/types": "5.58.0", + "@typescript-eslint/typescript-estree": "5.58.0", "debug": "^4.3.4" }, "dependencies": { - "@typescript-eslint/scope-manager": { - "version": "5.57.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.57.1.tgz", - "integrity": "sha512-N/RrBwEUKMIYxSKl0oDK5sFVHd6VI7p9K5MyUlVYAY6dyNb/wHUqndkTd3XhpGlXgnQsBkRZuu4f9kAHghvgPw==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.57.1", - "@typescript-eslint/visitor-keys": "5.57.1" - } - }, - "@typescript-eslint/types": { - "version": "5.57.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.57.1.tgz", - "integrity": "sha512-bSs4LOgyV3bJ08F5RDqO2KXqg3WAdwHCu06zOqcQ6vqbTJizyBhuh1o1ImC69X4bV2g1OJxbH71PJqiO7Y1RuA==", - "dev": true - }, - "@typescript-eslint/typescript-estree": { - "version": "5.57.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.57.1.tgz", - "integrity": "sha512-A2MZqD8gNT0qHKbk2wRspg7cHbCDCk2tcqt6ScCFLr5Ru8cn+TCfM786DjPhqwseiS+PrYwcXht5ztpEQ6TFTw==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.57.1", - "@typescript-eslint/visitor-keys": "5.57.1", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - } - }, - "@typescript-eslint/visitor-keys": { - "version": "5.57.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.57.1.tgz", - "integrity": "sha512-RjQrAniDU0CEk5r7iphkm731zKlFiUjvcBS2yHAg8WWqFMCaCrD0rKEVOMUyMMcbGPZ0bPp56srkGWrgfZqLRA==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.57.1", - "eslint-visitor-keys": "^3.3.0" - } - }, "debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", From 6ad20ae50b763aef141efff2432158fe5c46d151 Mon Sep 17 00:00:00 2001 From: Wei Wei Date: Wed, 12 Apr 2023 14:01:52 +0800 Subject: [PATCH 076/297] Bump xml2js from 0.4.23 to 0.5.0 (#1911) --- package-lock.json | 125 +++++++++++++++++++++++-- package.json | 2 +- src/blob/handlers/ServiceHandler.ts | 4 +- src/queue/handlers/MessageIdHandler.ts | 2 +- src/queue/handlers/MessagesHandler.ts | 2 +- src/queue/handlers/ServiceHandler.ts | 4 +- src/table/handlers/ServiceHandler.ts | 4 +- 7 files changed, 127 insertions(+), 16 deletions(-) diff --git a/package-lock.json b/package-lock.json index 0423f1faa..f25dd7fef 100644 --- a/package-lock.json +++ b/package-lock.json @@ -30,7 +30,7 @@ "uri-templates": "^0.2.0", "uuid": "^3.3.2", "winston": "^3.1.0", - "xml2js": "^0.4.19" + "xml2js": "^0.5.0" }, "bin": { "azurite": "dist/src/azurite.js", @@ -194,6 +194,18 @@ "uuid": "dist/bin/uuid" } }, + "node_modules/@azure/core-http/node_modules/xml2js": { + "version": "0.4.23", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", + "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", + "dependencies": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, "node_modules/@azure/core-lro": { "version": "2.2.4", "resolved": "https://registry.npmjs.org/@azure/core-lro/-/core-lro-2.2.4.tgz", @@ -457,6 +469,18 @@ "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" }, + "node_modules/@azure/ms-rest-js/node_modules/xml2js": { + "version": "0.4.23", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", + "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", + "dependencies": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, "node_modules/@azure/msal-browser": { "version": "2.22.1", "resolved": "https://registry.npmjs.org/@azure/msal-browser/-/msal-browser-2.22.1.tgz", @@ -691,6 +715,19 @@ "uuid": "dist/bin/uuid" } }, + "node_modules/@azure/storage-blob/node_modules/xml2js": { + "version": "0.4.23", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", + "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", + "dev": true, + "dependencies": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, "node_modules/@azure/storage-queue": { "version": "12.12.0", "resolved": "https://registry.npmjs.org/@azure/storage-queue/-/storage-queue-12.12.0.tgz", @@ -756,6 +793,19 @@ "uuid": "dist/bin/uuid" } }, + "node_modules/@azure/storage-queue/node_modules/xml2js": { + "version": "0.4.23", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", + "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", + "dev": true, + "dependencies": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, "node_modules/@babel/generator": { "version": "7.18.2", "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.2.tgz", @@ -9648,6 +9698,19 @@ "semver": "bin/semver" } }, + "node_modules/vsce/node_modules/xml2js": { + "version": "0.4.23", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", + "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", + "dev": true, + "dependencies": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, "node_modules/webidl-conversions": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", @@ -9853,9 +9916,9 @@ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, "node_modules/xml2js": { - "version": "0.4.23", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", - "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.5.0.tgz", + "integrity": "sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA==", "dependencies": { "sax": ">=0.6.0", "xmlbuilder": "~11.0.0" @@ -10018,6 +10081,15 @@ "version": "8.3.2", "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" + }, + "xml2js": { + "version": "0.4.23", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", + "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", + "requires": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + } } } }, @@ -10249,6 +10321,15 @@ "version": "1.14.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "xml2js": { + "version": "0.4.23", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", + "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", + "requires": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + } } } }, @@ -10430,6 +10511,16 @@ "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", "dev": true + }, + "xml2js": { + "version": "0.4.23", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", + "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", + "dev": true, + "requires": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + } } } }, @@ -10485,6 +10576,16 @@ "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", "dev": true + }, + "xml2js": { + "version": "0.4.23", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", + "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", + "dev": true, + "requires": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + } } } }, @@ -17316,6 +17417,16 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", "dev": true + }, + "xml2js": { + "version": "0.4.23", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", + "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", + "dev": true, + "requires": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + } } } }, @@ -17482,9 +17593,9 @@ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, "xml2js": { - "version": "0.4.23", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", - "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.5.0.tgz", + "integrity": "sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA==", "requires": { "sax": ">=0.6.0", "xmlbuilder": "~11.0.0" diff --git a/package.json b/package.json index abc4688e6..4426d44a6 100644 --- a/package.json +++ b/package.json @@ -41,7 +41,7 @@ "uri-templates": "^0.2.0", "uuid": "^3.3.2", "winston": "^3.1.0", - "xml2js": "^0.4.19" + "xml2js": "^0.5.0" }, "devDependencies": { "@azure/core-auth": "^1.3.2", diff --git a/src/blob/handlers/ServiceHandler.ts b/src/blob/handlers/ServiceHandler.ts index 191e0b75a..92e3bc38f 100644 --- a/src/blob/handlers/ServiceHandler.ts +++ b/src/blob/handlers/ServiceHandler.ts @@ -172,8 +172,8 @@ export default class ServiceHandler extends BaseHandler const body = blobCtx.request!.getBody(); const parsedBody = await parseXML(body || ""); if ( - !parsedBody.hasOwnProperty("cors") && - !parsedBody.hasOwnProperty("Cors") + !Object.hasOwnProperty.bind(parsedBody)('cors')&& + !Object.hasOwnProperty.bind(parsedBody)('Cors') ) { storageServiceProperties.cors = undefined; } diff --git a/src/queue/handlers/MessageIdHandler.ts b/src/queue/handlers/MessageIdHandler.ts index 484967c01..d5f74ce90 100644 --- a/src/queue/handlers/MessageIdHandler.ts +++ b/src/queue/handlers/MessageIdHandler.ts @@ -57,7 +57,7 @@ export default class MessageIdHandler extends BaseHandler const parsedBody = await parseXMLwithEmpty(body || ""); for (const text in parsedBody) { if ( - parsedBody.hasOwnProperty(text) && + Object.hasOwnProperty.bind(parsedBody)(text) && text.toLowerCase() === "messagetext" ) { queueMessage.messageText = parsedBody[text]; diff --git a/src/queue/handlers/MessagesHandler.ts b/src/queue/handlers/MessagesHandler.ts index 4b36c05d1..5c1002d89 100644 --- a/src/queue/handlers/MessagesHandler.ts +++ b/src/queue/handlers/MessagesHandler.ts @@ -193,7 +193,7 @@ export default class MessagesHandler extends BaseHandler const parsedBody = await parseXMLwithEmpty(body || ""); for (const text in parsedBody) { if ( - parsedBody.hasOwnProperty(text) && + Object.hasOwnProperty.bind(parsedBody)(text) && text.toLowerCase() === "messagetext" ) { queueMessage.messageText = parsedBody[text]; diff --git a/src/queue/handlers/ServiceHandler.ts b/src/queue/handlers/ServiceHandler.ts index 6954a6374..cd81ae2e2 100644 --- a/src/queue/handlers/ServiceHandler.ts +++ b/src/queue/handlers/ServiceHandler.ts @@ -87,8 +87,8 @@ export default class ServiceHandler extends BaseHandler const body = queueCtx.request!.getBody(); const parsedBody = await parseXML(body || ""); if ( - !parsedBody.hasOwnProperty("cors") && - !parsedBody.hasOwnProperty("Cors") + !Object.hasOwnProperty.bind(parsedBody)('cors')&& + !Object.hasOwnProperty.bind(parsedBody)('Cors') ) { storageServiceProperties.cors = undefined; } diff --git a/src/table/handlers/ServiceHandler.ts b/src/table/handlers/ServiceHandler.ts index 4c9123bda..51bd3e003 100644 --- a/src/table/handlers/ServiceHandler.ts +++ b/src/table/handlers/ServiceHandler.ts @@ -99,8 +99,8 @@ export default class ServiceHandler const body = tableCtx.request!.getBody(); const parsedBody = await parseXML(body || ""); if ( - !parsedBody.hasOwnProperty("cors") && - !parsedBody.hasOwnProperty("Cors") + !Object.hasOwnProperty.bind(parsedBody)('cors')&& + !Object.hasOwnProperty.bind(parsedBody)('Cors') ) { tableServiceProperties.cors = undefined; } From f651781acd2183622818f88e461fa61f98d9f52d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 17 Apr 2023 10:27:33 +0800 Subject: [PATCH 077/297] Bump @azure/storage-queue from 12.12.0 to 12.13.0 (#1919) Bumps [@azure/storage-queue](https://github.com/Azure/azure-sdk-for-js) from 12.12.0 to 12.13.0. - [Release notes](https://github.com/Azure/azure-sdk-for-js/releases) - [Changelog](https://github.com/Azure/azure-sdk-for-js/blob/main/documentation/Changelog-for-next-generation.md) - [Commits](https://github.com/Azure/azure-sdk-for-js/compare/@azure/storage-queue_12.12.0...@azure/storage-queue_12.13.0) --- updated-dependencies: - dependency-name: "@azure/storage-queue" dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index f25dd7fef..16e46d7b1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -729,9 +729,9 @@ } }, "node_modules/@azure/storage-queue": { - "version": "12.12.0", - "resolved": "https://registry.npmjs.org/@azure/storage-queue/-/storage-queue-12.12.0.tgz", - "integrity": "sha512-I3PBS9OKsLmXGvF0f9EymoNKf1kZ2+H9csdkOyxriZBhrK85SklQ3LYsFceIK7N1CTkzk/f695Q6ziryENvtVQ==", + "version": "12.13.0", + "resolved": "https://registry.npmjs.org/@azure/storage-queue/-/storage-queue-12.13.0.tgz", + "integrity": "sha512-baU7QlFwKFat8zLUMzfLHTgcpdKpvUsGl05zKVRslKIb3iPB7TPudqDfkpaFf2YL5hv88joz/fyuuYJnzz7log==", "dev": true, "dependencies": { "@azure/abort-controller": "^1.0.0", @@ -10525,9 +10525,9 @@ } }, "@azure/storage-queue": { - "version": "12.12.0", - "resolved": "https://registry.npmjs.org/@azure/storage-queue/-/storage-queue-12.12.0.tgz", - "integrity": "sha512-I3PBS9OKsLmXGvF0f9EymoNKf1kZ2+H9csdkOyxriZBhrK85SklQ3LYsFceIK7N1CTkzk/f695Q6ziryENvtVQ==", + "version": "12.13.0", + "resolved": "https://registry.npmjs.org/@azure/storage-queue/-/storage-queue-12.13.0.tgz", + "integrity": "sha512-baU7QlFwKFat8zLUMzfLHTgcpdKpvUsGl05zKVRslKIb3iPB7TPudqDfkpaFf2YL5hv88joz/fyuuYJnzz7log==", "dev": true, "requires": { "@azure/abort-controller": "^1.0.0", From 9095f8c21b99378158e3dc324fb660e54e2fa00f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 17 Apr 2023 10:27:52 +0800 Subject: [PATCH 078/297] Bump @azure/storage-blob from 12.13.0 to 12.14.0 (#1917) Bumps [@azure/storage-blob](https://github.com/Azure/azure-sdk-for-js) from 12.13.0 to 12.14.0. - [Release notes](https://github.com/Azure/azure-sdk-for-js/releases) - [Changelog](https://github.com/Azure/azure-sdk-for-js/blob/main/documentation/Changelog-for-next-generation.md) - [Commits](https://github.com/Azure/azure-sdk-for-js/compare/@azure/storage-blob_12.13.0...@azure/storage-blob_12.14.0) --- updated-dependencies: - dependency-name: "@azure/storage-blob" dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 16e46d7b1..cf85a84ad 100644 --- a/package-lock.json +++ b/package-lock.json @@ -649,9 +649,9 @@ } }, "node_modules/@azure/storage-blob": { - "version": "12.13.0", - "resolved": "https://registry.npmjs.org/@azure/storage-blob/-/storage-blob-12.13.0.tgz", - "integrity": "sha512-t3Q2lvBMJucgTjQcP5+hvEJMAsJSk0qmAnjDLie2td017IiduZbbC9BOcFfmwzR6y6cJdZOuewLCNFmEx9IrXA==", + "version": "12.14.0", + "resolved": "https://registry.npmjs.org/@azure/storage-blob/-/storage-blob-12.14.0.tgz", + "integrity": "sha512-g8GNUDpMisGXzBeD+sKphhH5yLwesB4JkHr1U6be/X3F+cAMcyGLPD1P89g2M7wbEtUJWoikry1rlr83nNRBzg==", "dev": true, "dependencies": { "@azure/abort-controller": "^1.0.0", @@ -10458,9 +10458,9 @@ } }, "@azure/storage-blob": { - "version": "12.13.0", - "resolved": "https://registry.npmjs.org/@azure/storage-blob/-/storage-blob-12.13.0.tgz", - "integrity": "sha512-t3Q2lvBMJucgTjQcP5+hvEJMAsJSk0qmAnjDLie2td017IiduZbbC9BOcFfmwzR6y6cJdZOuewLCNFmEx9IrXA==", + "version": "12.14.0", + "resolved": "https://registry.npmjs.org/@azure/storage-blob/-/storage-blob-12.14.0.tgz", + "integrity": "sha512-g8GNUDpMisGXzBeD+sKphhH5yLwesB4JkHr1U6be/X3F+cAMcyGLPD1P89g2M7wbEtUJWoikry1rlr83nNRBzg==", "dev": true, "requires": { "@azure/abort-controller": "^1.0.0", From 80ff71e7fb97f18fa55ff4575b5b8de32596c9df Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 17 Apr 2023 10:28:04 +0800 Subject: [PATCH 079/297] Bump @types/validator from 13.7.14 to 13.7.15 (#1916) Bumps [@types/validator](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/validator) from 13.7.14 to 13.7.15. - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/validator) --- updated-dependencies: - dependency-name: "@types/validator" dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index cf85a84ad..74e9fd86c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1572,9 +1572,9 @@ } }, "node_modules/@types/validator": { - "version": "13.7.14", - "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.7.14.tgz", - "integrity": "sha512-J6OAed6rhN6zyqL9Of6ZMamhlsOEU/poBVvbHr/dKOYKTeuYYMlDkMv+b6UUV0o2i0tw73cgyv/97WTWaUl0/g==", + "version": "13.7.15", + "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.7.15.tgz", + "integrity": "sha512-yeinDVQunb03AEP8luErFcyf/7Lf7AzKCD0NXfgVoGCCQDNpZET8Jgq74oBgqKld3hafLbfzt/3inUdQvaFeXQ==", "dev": true }, "node_modules/@types/vscode": { @@ -11211,9 +11211,9 @@ } }, "@types/validator": { - "version": "13.7.14", - "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.7.14.tgz", - "integrity": "sha512-J6OAed6rhN6zyqL9Of6ZMamhlsOEU/poBVvbHr/dKOYKTeuYYMlDkMv+b6UUV0o2i0tw73cgyv/97WTWaUl0/g==", + "version": "13.7.15", + "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.7.15.tgz", + "integrity": "sha512-yeinDVQunb03AEP8luErFcyf/7Lf7AzKCD0NXfgVoGCCQDNpZET8Jgq74oBgqKld3hafLbfzt/3inUdQvaFeXQ==", "dev": true }, "@types/vscode": { From 3d3712b1bdf0c0d658a769a15d0730981349fb5a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 17 Apr 2023 10:56:12 +0800 Subject: [PATCH 080/297] Bump mysql2 from 3.2.0 to 3.2.1 (#1918) Bumps [mysql2](https://github.com/sidorares/node-mysql2) from 3.2.0 to 3.2.1. - [Release notes](https://github.com/sidorares/node-mysql2/releases) - [Changelog](https://github.com/sidorares/node-mysql2/blob/master/Changelog.md) - [Commits](https://github.com/sidorares/node-mysql2/compare/v3.2.0...v3.2.1) --- updated-dependencies: - dependency-name: mysql2 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/package-lock.json b/package-lock.json index 74e9fd86c..126131d54 100644 --- a/package-lock.json +++ b/package-lock.json @@ -7242,15 +7242,15 @@ "dev": true }, "node_modules/mysql2": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.2.0.tgz", - "integrity": "sha512-0Vn6a9WSrq6fWwvPgrvIwnOCldiEcgbzapVRDAtDZ4cMTxN7pnGqCTx8EG32S/NYXl6AXkdO+9hV1tSIi/LigA==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.2.1.tgz", + "integrity": "sha512-o/5GH3/NwgOk6fO+AaVoZfyCAliFWUzTXaPUa80ZPzJFHy9kQyR/D2OSJW9gyB1TFATyY3ZsKY3/srZXMZCKUg==", "dependencies": { "denque": "^2.1.0", "generate-function": "^2.3.1", "iconv-lite": "^0.6.3", "long": "^5.2.1", - "lru-cache": "^7.14.1", + "lru-cache": "^8.0.0", "named-placeholders": "^1.1.3", "seq-queue": "^0.0.5", "sqlstring": "^2.3.2" @@ -7271,11 +7271,11 @@ } }, "node_modules/mysql2/node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "version": "8.0.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-8.0.5.tgz", + "integrity": "sha512-MhWWlVnuab1RG5/zMRRcVGXZLCXrZTgfwMikgzCegsPnG62yDQo5JnqKkrK4jO5iKqDAZGItAqN5CtKBCBWRUA==", "engines": { - "node": ">=12" + "node": ">=16.14" } }, "node_modules/named-placeholders": { @@ -15618,15 +15618,15 @@ "dev": true }, "mysql2": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.2.0.tgz", - "integrity": "sha512-0Vn6a9WSrq6fWwvPgrvIwnOCldiEcgbzapVRDAtDZ4cMTxN7pnGqCTx8EG32S/NYXl6AXkdO+9hV1tSIi/LigA==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.2.1.tgz", + "integrity": "sha512-o/5GH3/NwgOk6fO+AaVoZfyCAliFWUzTXaPUa80ZPzJFHy9kQyR/D2OSJW9gyB1TFATyY3ZsKY3/srZXMZCKUg==", "requires": { "denque": "^2.1.0", "generate-function": "^2.3.1", "iconv-lite": "^0.6.3", "long": "^5.2.1", - "lru-cache": "^7.14.1", + "lru-cache": "^8.0.0", "named-placeholders": "^1.1.3", "seq-queue": "^0.0.5", "sqlstring": "^2.3.2" @@ -15641,9 +15641,9 @@ } }, "lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==" + "version": "8.0.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-8.0.5.tgz", + "integrity": "sha512-MhWWlVnuab1RG5/zMRRcVGXZLCXrZTgfwMikgzCegsPnG62yDQo5JnqKkrK4jO5iKqDAZGItAqN5CtKBCBWRUA==" } } }, From a81ceb18380c258a52ae81620b1e2cd0e936824b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 18 Apr 2023 11:18:48 +0800 Subject: [PATCH 081/297] Bump @typescript-eslint/eslint-plugin from 5.58.0 to 5.59.0 (#1924) Bumps [@typescript-eslint/eslint-plugin](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/eslint-plugin) from 5.58.0 to 5.59.0. - [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases) - [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/eslint-plugin/CHANGELOG.md) - [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v5.59.0/packages/eslint-plugin) --- updated-dependencies: - dependency-name: "@typescript-eslint/eslint-plugin" dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 384 ++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 350 insertions(+), 34 deletions(-) diff --git a/package-lock.json b/package-lock.json index 126131d54..b28abf3bc 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1593,15 +1593,15 @@ } }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.58.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.58.0.tgz", - "integrity": "sha512-vxHvLhH0qgBd3/tW6/VccptSfc8FxPQIkmNTVLWcCOVqSBvqpnKkBTYrhcGlXfSnd78azwe+PsjYFj0X34/njA==", + "version": "5.59.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.59.0.tgz", + "integrity": "sha512-p0QgrEyrxAWBecR56gyn3wkG15TJdI//eetInP3zYRewDh0XS+DhB3VUAd3QqvziFsfaQIoIuZMxZRB7vXYaYw==", "dev": true, "dependencies": { "@eslint-community/regexpp": "^4.4.0", - "@typescript-eslint/scope-manager": "5.58.0", - "@typescript-eslint/type-utils": "5.58.0", - "@typescript-eslint/utils": "5.58.0", + "@typescript-eslint/scope-manager": "5.59.0", + "@typescript-eslint/type-utils": "5.59.0", + "@typescript-eslint/utils": "5.59.0", "debug": "^4.3.4", "grapheme-splitter": "^1.0.4", "ignore": "^5.2.0", @@ -1626,6 +1626,53 @@ } } }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/scope-manager": { + "version": "5.59.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.59.0.tgz", + "integrity": "sha512-tsoldKaMh7izN6BvkK6zRMINj4Z2d6gGhO2UsI8zGZY3XhLq1DndP3Ycjhi1JwdwPRwtLMW4EFPgpuKhbCGOvQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.59.0", + "@typescript-eslint/visitor-keys": "5.59.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/types": { + "version": "5.59.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.0.tgz", + "integrity": "sha512-yR2h1NotF23xFFYKHZs17QJnB51J/s+ud4PYU4MqdZbzeNxpgUr05+dNeCN/bb6raslHvGdd6BFCkVhpPk/ZeA==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/visitor-keys": { + "version": "5.59.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.0.tgz", + "integrity": "sha512-qZ3iXxQhanchCeaExlKPV3gDQFxMUmU35xfd5eCXB6+kUw1TUAbIy2n7QIrwz9s98DQLzNWyHp61fY0da4ZcbA==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.59.0", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -1717,13 +1764,13 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "5.58.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.58.0.tgz", - "integrity": "sha512-FF5vP/SKAFJ+LmR9PENql7fQVVgGDOS+dq3j+cKl9iW/9VuZC/8CFmzIP0DLKXfWKpRHawJiG70rVH+xZZbp8w==", + "version": "5.59.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.59.0.tgz", + "integrity": "sha512-d/B6VSWnZwu70kcKQSCqjcXpVH+7ABKH8P1KNn4K7j5PXXuycZTPXF44Nui0TEm6rbWGi8kc78xRgOC4n7xFgA==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "5.58.0", - "@typescript-eslint/utils": "5.58.0", + "@typescript-eslint/typescript-estree": "5.59.0", + "@typescript-eslint/utils": "5.59.0", "debug": "^4.3.4", "tsutils": "^3.21.0" }, @@ -1743,6 +1790,63 @@ } } }, + "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/types": { + "version": "5.59.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.0.tgz", + "integrity": "sha512-yR2h1NotF23xFFYKHZs17QJnB51J/s+ud4PYU4MqdZbzeNxpgUr05+dNeCN/bb6raslHvGdd6BFCkVhpPk/ZeA==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree": { + "version": "5.59.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.0.tgz", + "integrity": "sha512-sUNnktjmI8DyGzPdZ8dRwW741zopGxltGs/SAPgGL/AAgDpiLsCFLcMNSpbfXfmnNeHmK9h3wGmCkGRGAoUZAg==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.59.0", + "@typescript-eslint/visitor-keys": "5.59.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/visitor-keys": { + "version": "5.59.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.0.tgz", + "integrity": "sha512-qZ3iXxQhanchCeaExlKPV3gDQFxMUmU35xfd5eCXB6+kUw1TUAbIy2n7QIrwz9s98DQLzNWyHp61fY0da4ZcbA==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.59.0", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, "node_modules/@typescript-eslint/type-utils/node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -1830,17 +1934,17 @@ "dev": true }, "node_modules/@typescript-eslint/utils": { - "version": "5.58.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.58.0.tgz", - "integrity": "sha512-gAmLOTFXMXOC+zP1fsqm3VceKSBQJNzV385Ok3+yzlavNHZoedajjS4UyS21gabJYcobuigQPs/z71A9MdJFqQ==", + "version": "5.59.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.59.0.tgz", + "integrity": "sha512-GGLFd+86drlHSvPgN/el6dRQNYYGOvRSDVydsUaQluwIW3HvbXuxyuD5JETvBt/9qGYe+lOrDk6gRrWOHb/FvA==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@types/json-schema": "^7.0.9", "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.58.0", - "@typescript-eslint/types": "5.58.0", - "@typescript-eslint/typescript-estree": "5.58.0", + "@typescript-eslint/scope-manager": "5.59.0", + "@typescript-eslint/types": "5.59.0", + "@typescript-eslint/typescript-estree": "5.59.0", "eslint-scope": "^5.1.1", "semver": "^7.3.7" }, @@ -1855,6 +1959,103 @@ "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, + "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/scope-manager": { + "version": "5.59.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.59.0.tgz", + "integrity": "sha512-tsoldKaMh7izN6BvkK6zRMINj4Z2d6gGhO2UsI8zGZY3XhLq1DndP3Ycjhi1JwdwPRwtLMW4EFPgpuKhbCGOvQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.59.0", + "@typescript-eslint/visitor-keys": "5.59.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/types": { + "version": "5.59.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.0.tgz", + "integrity": "sha512-yR2h1NotF23xFFYKHZs17QJnB51J/s+ud4PYU4MqdZbzeNxpgUr05+dNeCN/bb6raslHvGdd6BFCkVhpPk/ZeA==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree": { + "version": "5.59.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.0.tgz", + "integrity": "sha512-sUNnktjmI8DyGzPdZ8dRwW741zopGxltGs/SAPgGL/AAgDpiLsCFLcMNSpbfXfmnNeHmK9h3wGmCkGRGAoUZAg==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.59.0", + "@typescript-eslint/visitor-keys": "5.59.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/visitor-keys": { + "version": "5.59.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.0.tgz", + "integrity": "sha512-qZ3iXxQhanchCeaExlKPV3gDQFxMUmU35xfd5eCXB6+kUw1TUAbIy2n7QIrwz9s98DQLzNWyHp61fY0da4ZcbA==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.59.0", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/utils/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, "node_modules/@typescript-eslint/visitor-keys": { "version": "5.58.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.58.0.tgz", @@ -11232,15 +11433,15 @@ } }, "@typescript-eslint/eslint-plugin": { - "version": "5.58.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.58.0.tgz", - "integrity": "sha512-vxHvLhH0qgBd3/tW6/VccptSfc8FxPQIkmNTVLWcCOVqSBvqpnKkBTYrhcGlXfSnd78azwe+PsjYFj0X34/njA==", + "version": "5.59.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.59.0.tgz", + "integrity": "sha512-p0QgrEyrxAWBecR56gyn3wkG15TJdI//eetInP3zYRewDh0XS+DhB3VUAd3QqvziFsfaQIoIuZMxZRB7vXYaYw==", "dev": true, "requires": { "@eslint-community/regexpp": "^4.4.0", - "@typescript-eslint/scope-manager": "5.58.0", - "@typescript-eslint/type-utils": "5.58.0", - "@typescript-eslint/utils": "5.58.0", + "@typescript-eslint/scope-manager": "5.59.0", + "@typescript-eslint/type-utils": "5.59.0", + "@typescript-eslint/utils": "5.59.0", "debug": "^4.3.4", "grapheme-splitter": "^1.0.4", "ignore": "^5.2.0", @@ -11249,6 +11450,32 @@ "tsutils": "^3.21.0" }, "dependencies": { + "@typescript-eslint/scope-manager": { + "version": "5.59.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.59.0.tgz", + "integrity": "sha512-tsoldKaMh7izN6BvkK6zRMINj4Z2d6gGhO2UsI8zGZY3XhLq1DndP3Ycjhi1JwdwPRwtLMW4EFPgpuKhbCGOvQ==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.59.0", + "@typescript-eslint/visitor-keys": "5.59.0" + } + }, + "@typescript-eslint/types": { + "version": "5.59.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.0.tgz", + "integrity": "sha512-yR2h1NotF23xFFYKHZs17QJnB51J/s+ud4PYU4MqdZbzeNxpgUr05+dNeCN/bb6raslHvGdd6BFCkVhpPk/ZeA==", + "dev": true + }, + "@typescript-eslint/visitor-keys": { + "version": "5.59.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.0.tgz", + "integrity": "sha512-qZ3iXxQhanchCeaExlKPV3gDQFxMUmU35xfd5eCXB6+kUw1TUAbIy2n7QIrwz9s98DQLzNWyHp61fY0da4ZcbA==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.59.0", + "eslint-visitor-keys": "^3.3.0" + } + }, "debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -11306,17 +11533,48 @@ } }, "@typescript-eslint/type-utils": { - "version": "5.58.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.58.0.tgz", - "integrity": "sha512-FF5vP/SKAFJ+LmR9PENql7fQVVgGDOS+dq3j+cKl9iW/9VuZC/8CFmzIP0DLKXfWKpRHawJiG70rVH+xZZbp8w==", + "version": "5.59.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.59.0.tgz", + "integrity": "sha512-d/B6VSWnZwu70kcKQSCqjcXpVH+7ABKH8P1KNn4K7j5PXXuycZTPXF44Nui0TEm6rbWGi8kc78xRgOC4n7xFgA==", "dev": true, "requires": { - "@typescript-eslint/typescript-estree": "5.58.0", - "@typescript-eslint/utils": "5.58.0", + "@typescript-eslint/typescript-estree": "5.59.0", + "@typescript-eslint/utils": "5.59.0", "debug": "^4.3.4", "tsutils": "^3.21.0" }, "dependencies": { + "@typescript-eslint/types": { + "version": "5.59.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.0.tgz", + "integrity": "sha512-yR2h1NotF23xFFYKHZs17QJnB51J/s+ud4PYU4MqdZbzeNxpgUr05+dNeCN/bb6raslHvGdd6BFCkVhpPk/ZeA==", + "dev": true + }, + "@typescript-eslint/typescript-estree": { + "version": "5.59.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.0.tgz", + "integrity": "sha512-sUNnktjmI8DyGzPdZ8dRwW741zopGxltGs/SAPgGL/AAgDpiLsCFLcMNSpbfXfmnNeHmK9h3wGmCkGRGAoUZAg==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.59.0", + "@typescript-eslint/visitor-keys": "5.59.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + } + }, + "@typescript-eslint/visitor-keys": { + "version": "5.59.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.0.tgz", + "integrity": "sha512-qZ3iXxQhanchCeaExlKPV3gDQFxMUmU35xfd5eCXB6+kUw1TUAbIy2n7QIrwz9s98DQLzNWyHp61fY0da4ZcbA==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.59.0", + "eslint-visitor-keys": "^3.3.0" + } + }, "debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -11373,19 +11631,77 @@ } }, "@typescript-eslint/utils": { - "version": "5.58.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.58.0.tgz", - "integrity": "sha512-gAmLOTFXMXOC+zP1fsqm3VceKSBQJNzV385Ok3+yzlavNHZoedajjS4UyS21gabJYcobuigQPs/z71A9MdJFqQ==", + "version": "5.59.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.59.0.tgz", + "integrity": "sha512-GGLFd+86drlHSvPgN/el6dRQNYYGOvRSDVydsUaQluwIW3HvbXuxyuD5JETvBt/9qGYe+lOrDk6gRrWOHb/FvA==", "dev": true, "requires": { "@eslint-community/eslint-utils": "^4.2.0", "@types/json-schema": "^7.0.9", "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.58.0", - "@typescript-eslint/types": "5.58.0", - "@typescript-eslint/typescript-estree": "5.58.0", + "@typescript-eslint/scope-manager": "5.59.0", + "@typescript-eslint/types": "5.59.0", + "@typescript-eslint/typescript-estree": "5.59.0", "eslint-scope": "^5.1.1", "semver": "^7.3.7" + }, + "dependencies": { + "@typescript-eslint/scope-manager": { + "version": "5.59.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.59.0.tgz", + "integrity": "sha512-tsoldKaMh7izN6BvkK6zRMINj4Z2d6gGhO2UsI8zGZY3XhLq1DndP3Ycjhi1JwdwPRwtLMW4EFPgpuKhbCGOvQ==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.59.0", + "@typescript-eslint/visitor-keys": "5.59.0" + } + }, + "@typescript-eslint/types": { + "version": "5.59.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.0.tgz", + "integrity": "sha512-yR2h1NotF23xFFYKHZs17QJnB51J/s+ud4PYU4MqdZbzeNxpgUr05+dNeCN/bb6raslHvGdd6BFCkVhpPk/ZeA==", + "dev": true + }, + "@typescript-eslint/typescript-estree": { + "version": "5.59.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.0.tgz", + "integrity": "sha512-sUNnktjmI8DyGzPdZ8dRwW741zopGxltGs/SAPgGL/AAgDpiLsCFLcMNSpbfXfmnNeHmK9h3wGmCkGRGAoUZAg==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.59.0", + "@typescript-eslint/visitor-keys": "5.59.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + } + }, + "@typescript-eslint/visitor-keys": { + "version": "5.59.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.0.tgz", + "integrity": "sha512-qZ3iXxQhanchCeaExlKPV3gDQFxMUmU35xfd5eCXB6+kUw1TUAbIy2n7QIrwz9s98DQLzNWyHp61fY0da4ZcbA==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.59.0", + "eslint-visitor-keys": "^3.3.0" + } + }, + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } } }, "@typescript-eslint/visitor-keys": { From dce224eb98c3c0b0d0da39c1db2450f3d1b8de33 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 18 Apr 2023 11:18:56 +0800 Subject: [PATCH 082/297] Bump tedious from 15.1.3 to 16.0.0 (#1922) Bumps [tedious](https://github.com/tediousjs/tedious) from 15.1.3 to 16.0.0. - [Release notes](https://github.com/tediousjs/tedious/releases) - [Commits](https://github.com/tediousjs/tedious/compare/v15.1.3...v16.0.0) --- updated-dependencies: - dependency-name: tedious dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 16 ++++++++-------- package.json | 2 +- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/package-lock.json b/package-lock.json index b28abf3bc..dde2838c6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -24,7 +24,7 @@ "rimraf": "^3.0.2", "sequelize": "^6.3.0", "stoppable": "^1.1.0", - "tedious": "^15.0.0", + "tedious": "^16.0.0", "to-readable-stream": "^2.1.0", "tslib": "^2.3.0", "uri-templates": "^0.2.0", @@ -9417,9 +9417,9 @@ } }, "node_modules/tedious": { - "version": "15.1.3", - "resolved": "https://registry.npmjs.org/tedious/-/tedious-15.1.3.tgz", - "integrity": "sha512-166EpRm5qknwhEisjZqz/mF7k14fXKJYHRg6XiAXVovd/YkyHJ3SG4Ppy89caPaNFfRr7PVYe+s4dAvKaCMFvw==", + "version": "16.0.0", + "resolved": "https://registry.npmjs.org/tedious/-/tedious-16.0.0.tgz", + "integrity": "sha512-8Obq4NoAgjr4iTihRU8tGFX6FbUQc5fbn5vsTbScQQhLsi7nrY7h2rPBE+JS8wjLLKYMmZBt9KfpTFqDdLf93w==", "dependencies": { "@azure/identity": "^2.0.4", "@azure/keyvault-keys": "^4.4.0", @@ -9435,7 +9435,7 @@ "sprintf-js": "^1.1.2" }, "engines": { - "node": ">=14" + "node": ">=16" } }, "node_modules/tedious/node_modules/iconv-lite": { @@ -17367,9 +17367,9 @@ } }, "tedious": { - "version": "15.1.3", - "resolved": "https://registry.npmjs.org/tedious/-/tedious-15.1.3.tgz", - "integrity": "sha512-166EpRm5qknwhEisjZqz/mF7k14fXKJYHRg6XiAXVovd/YkyHJ3SG4Ppy89caPaNFfRr7PVYe+s4dAvKaCMFvw==", + "version": "16.0.0", + "resolved": "https://registry.npmjs.org/tedious/-/tedious-16.0.0.tgz", + "integrity": "sha512-8Obq4NoAgjr4iTihRU8tGFX6FbUQc5fbn5vsTbScQQhLsi7nrY7h2rPBE+JS8wjLLKYMmZBt9KfpTFqDdLf93w==", "requires": { "@azure/identity": "^2.0.4", "@azure/keyvault-keys": "^4.4.0", diff --git a/package.json b/package.json index 4426d44a6..0947eca7d 100644 --- a/package.json +++ b/package.json @@ -35,7 +35,7 @@ "rimraf": "^3.0.2", "sequelize": "^6.3.0", "stoppable": "^1.1.0", - "tedious": "^15.0.0", + "tedious": "^16.0.0", "to-readable-stream": "^2.1.0", "tslib": "^2.3.0", "uri-templates": "^0.2.0", From 8a8f1885a3279c917ecb1600b45c4e4ebe7194aa Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 18 Apr 2023 11:19:06 +0800 Subject: [PATCH 083/297] Bump @typescript-eslint/parser from 5.58.0 to 5.59.0 (#1923) Bumps [@typescript-eslint/parser](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/parser) from 5.58.0 to 5.59.0. - [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases) - [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/parser/CHANGELOG.md) - [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v5.59.0/packages/parser) --- updated-dependencies: - dependency-name: "@typescript-eslint/parser" dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 139 ++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 127 insertions(+), 12 deletions(-) diff --git a/package-lock.json b/package-lock.json index dde2838c6..df9cab5f8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1697,14 +1697,14 @@ "dev": true }, "node_modules/@typescript-eslint/parser": { - "version": "5.58.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.58.0.tgz", - "integrity": "sha512-ixaM3gRtlfrKzP8N6lRhBbjTow1t6ztfBvQNGuRM8qH1bjFFXIJ35XY+FC0RRBKn3C6cT+7VW1y8tNm7DwPHDQ==", + "version": "5.59.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.59.0.tgz", + "integrity": "sha512-qK9TZ70eJtjojSUMrrEwA9ZDQ4N0e/AuoOIgXuNBorXYcBDk397D2r5MIe1B3cok/oCtdNC5j+lUUpVB+Dpb+w==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "5.58.0", - "@typescript-eslint/types": "5.58.0", - "@typescript-eslint/typescript-estree": "5.58.0", + "@typescript-eslint/scope-manager": "5.59.0", + "@typescript-eslint/types": "5.59.0", + "@typescript-eslint/typescript-estree": "5.59.0", "debug": "^4.3.4" }, "engines": { @@ -1723,6 +1723,80 @@ } } }, + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/scope-manager": { + "version": "5.59.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.59.0.tgz", + "integrity": "sha512-tsoldKaMh7izN6BvkK6zRMINj4Z2d6gGhO2UsI8zGZY3XhLq1DndP3Ycjhi1JwdwPRwtLMW4EFPgpuKhbCGOvQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.59.0", + "@typescript-eslint/visitor-keys": "5.59.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/types": { + "version": "5.59.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.0.tgz", + "integrity": "sha512-yR2h1NotF23xFFYKHZs17QJnB51J/s+ud4PYU4MqdZbzeNxpgUr05+dNeCN/bb6raslHvGdd6BFCkVhpPk/ZeA==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/typescript-estree": { + "version": "5.59.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.0.tgz", + "integrity": "sha512-sUNnktjmI8DyGzPdZ8dRwW741zopGxltGs/SAPgGL/AAgDpiLsCFLcMNSpbfXfmnNeHmK9h3wGmCkGRGAoUZAg==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.59.0", + "@typescript-eslint/visitor-keys": "5.59.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/visitor-keys": { + "version": "5.59.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.0.tgz", + "integrity": "sha512-qZ3iXxQhanchCeaExlKPV3gDQFxMUmU35xfd5eCXB6+kUw1TUAbIy2n7QIrwz9s98DQLzNWyHp61fY0da4ZcbA==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.59.0", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, "node_modules/@typescript-eslint/parser/node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -11494,17 +11568,58 @@ } }, "@typescript-eslint/parser": { - "version": "5.58.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.58.0.tgz", - "integrity": "sha512-ixaM3gRtlfrKzP8N6lRhBbjTow1t6ztfBvQNGuRM8qH1bjFFXIJ35XY+FC0RRBKn3C6cT+7VW1y8tNm7DwPHDQ==", + "version": "5.59.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.59.0.tgz", + "integrity": "sha512-qK9TZ70eJtjojSUMrrEwA9ZDQ4N0e/AuoOIgXuNBorXYcBDk397D2r5MIe1B3cok/oCtdNC5j+lUUpVB+Dpb+w==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "5.58.0", - "@typescript-eslint/types": "5.58.0", - "@typescript-eslint/typescript-estree": "5.58.0", + "@typescript-eslint/scope-manager": "5.59.0", + "@typescript-eslint/types": "5.59.0", + "@typescript-eslint/typescript-estree": "5.59.0", "debug": "^4.3.4" }, "dependencies": { + "@typescript-eslint/scope-manager": { + "version": "5.59.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.59.0.tgz", + "integrity": "sha512-tsoldKaMh7izN6BvkK6zRMINj4Z2d6gGhO2UsI8zGZY3XhLq1DndP3Ycjhi1JwdwPRwtLMW4EFPgpuKhbCGOvQ==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.59.0", + "@typescript-eslint/visitor-keys": "5.59.0" + } + }, + "@typescript-eslint/types": { + "version": "5.59.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.0.tgz", + "integrity": "sha512-yR2h1NotF23xFFYKHZs17QJnB51J/s+ud4PYU4MqdZbzeNxpgUr05+dNeCN/bb6raslHvGdd6BFCkVhpPk/ZeA==", + "dev": true + }, + "@typescript-eslint/typescript-estree": { + "version": "5.59.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.0.tgz", + "integrity": "sha512-sUNnktjmI8DyGzPdZ8dRwW741zopGxltGs/SAPgGL/AAgDpiLsCFLcMNSpbfXfmnNeHmK9h3wGmCkGRGAoUZAg==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.59.0", + "@typescript-eslint/visitor-keys": "5.59.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + } + }, + "@typescript-eslint/visitor-keys": { + "version": "5.59.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.0.tgz", + "integrity": "sha512-qZ3iXxQhanchCeaExlKPV3gDQFxMUmU35xfd5eCXB6+kUw1TUAbIy2n7QIrwz9s98DQLzNWyHp61fY0da4ZcbA==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.59.0", + "eslint-visitor-keys": "^3.3.0" + } + }, "debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", From e27151607be75bd04285ea791a9f6989de9c8257 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 18 Apr 2023 11:19:17 +0800 Subject: [PATCH 084/297] Bump mysql2 from 3.2.1 to 3.2.3 (#1921) Bumps [mysql2](https://github.com/sidorares/node-mysql2) from 3.2.1 to 3.2.3. - [Release notes](https://github.com/sidorares/node-mysql2/releases) - [Changelog](https://github.com/sidorares/node-mysql2/blob/master/Changelog.md) - [Commits](https://github.com/sidorares/node-mysql2/compare/v3.2.1...v3.2.3) --- updated-dependencies: - dependency-name: mysql2 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index df9cab5f8..9b74c3d4a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -7517,9 +7517,9 @@ "dev": true }, "node_modules/mysql2": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.2.1.tgz", - "integrity": "sha512-o/5GH3/NwgOk6fO+AaVoZfyCAliFWUzTXaPUa80ZPzJFHy9kQyR/D2OSJW9gyB1TFATyY3ZsKY3/srZXMZCKUg==", + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.2.3.tgz", + "integrity": "sha512-aethLO9cSAGba9gOXzNayuyq2GAVTKc3vwr+uETOX1yjUuH6MS6D5ewhUqkaukmtjzrb5C9ML7YmmmRBjQ3r3Q==", "dependencies": { "denque": "^2.1.0", "generate-function": "^2.3.1", @@ -16049,9 +16049,9 @@ "dev": true }, "mysql2": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.2.1.tgz", - "integrity": "sha512-o/5GH3/NwgOk6fO+AaVoZfyCAliFWUzTXaPUa80ZPzJFHy9kQyR/D2OSJW9gyB1TFATyY3ZsKY3/srZXMZCKUg==", + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.2.3.tgz", + "integrity": "sha512-aethLO9cSAGba9gOXzNayuyq2GAVTKc3vwr+uETOX1yjUuH6MS6D5ewhUqkaukmtjzrb5C9ML7YmmmRBjQ3r3Q==", "requires": { "denque": "^2.1.0", "generate-function": "^2.3.1", From 9a6a39d3c20349d19d7f0a7d527823d2296f2428 Mon Sep 17 00:00:00 2001 From: Wei Wei Date: Tue, 18 Apr 2023 15:14:48 +0800 Subject: [PATCH 085/297] Fixed #532: setMetadata API allows invalid metadata name with hyphen. (#1920) --- ChangeLog.md | 1 + src/blob/errors/StorageErrorFactory.ts | 10 ++++++++++ src/blob/handlers/BlobHandler.ts | 10 ++++++++++ tests/blob/apis/blob.test.ts | 21 +++++++++++++++++++++ 4 files changed, 42 insertions(+) diff --git a/ChangeLog.md b/ChangeLog.md index eec0536fa..66a7cb588 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -7,6 +7,7 @@ Blob: - Fixed issue of: blob batch subresponse is slightly different from the on from Azure serivce, which causes exception in CPP SDK. +- Fixed issue of: setMetadata API allows invalid metadata name with hyphen. ## 2023.03 Version 3.23.0 diff --git a/src/blob/errors/StorageErrorFactory.ts b/src/blob/errors/StorageErrorFactory.ts index 48a99b13d..573fe45b6 100644 --- a/src/blob/errors/StorageErrorFactory.ts +++ b/src/blob/errors/StorageErrorFactory.ts @@ -762,4 +762,14 @@ export default class StorageErrorFactory { { ReceivedCopyStatus: copyStatus } ); } + + + public static getInvalidMetadata(contextID: string): StorageError { + return new StorageError( + 400, + "InvalidMetadata", + "The metadata specified is invalid. It has characters that are not permitted.", + contextID + ); + } } diff --git a/src/blob/handlers/BlobHandler.ts b/src/blob/handlers/BlobHandler.ts index 182999ddf..4770426d5 100644 --- a/src/blob/handlers/BlobHandler.ts +++ b/src/blob/handlers/BlobHandler.ts @@ -325,6 +325,16 @@ export default class BlobHandler extends BaseHandler implements IBlobHandler { const metadata = convertRawHeadersToMetadata( blobCtx.request!.getRawHeaders() ); + + if (metadata != undefined) + { + Object.entries(metadata).forEach(([key, value]) => { + if (key.includes("-")) + { + throw StorageErrorFactory.getInvalidMetadata(context.contextId!); + } + }); + } const res = await this.metadataStore.setBlobMetadata( context, diff --git a/tests/blob/apis/blob.test.ts b/tests/blob/apis/blob.test.ts index 17d56d108..2e80a2a00 100644 --- a/tests/blob/apis/blob.test.ts +++ b/tests/blob/apis/blob.test.ts @@ -470,6 +470,27 @@ describe("BlobAPIs", () => { ); }); + it("should fail when setMetadata with invalid metadata name with hyphen @loki @sql", async () => { + const metadata = { + "Content-SHA256": "a" + }; + + // set metadata should fail + let hasError = false; + try { + await blobClient.setMetadata(metadata); + } catch (error) { + assert.deepStrictEqual(error.statusCode, 400); + assert.strictEqual(error.code, 'InvalidMetadata'); + hasError = true; + } + if (!hasError) + { + assert.fail(); + } + + }); + it("acquireLease_available_proposedLeaseId_fixed @loki @sql", async () => { const guid = "ca761232ed4211cebacd00aa0057b223"; const duration = 30; From 0cc272c2f0e0a8dc02f87342a41db4e36ed7c674 Mon Sep 17 00:00:00 2001 From: Emma Zhu Date: Tue, 18 Apr 2023 16:12:36 +0800 Subject: [PATCH 086/297] Upgrade sequelize to 6.31.0 --- package-lock.json | 232 ++++--------------- package.json | 2 +- src/blob/persistence/SqlBlobMetadataStore.ts | 4 +- 3 files changed, 43 insertions(+), 195 deletions(-) diff --git a/package-lock.json b/package-lock.json index 9b74c3d4a..2172d60b2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -22,7 +22,7 @@ "multistream": "^2.1.1", "mysql2": "^3.2.0", "rimraf": "^3.0.2", - "sequelize": "^6.3.0", + "sequelize": "^6.31.0", "stoppable": "^1.1.0", "tedious": "^16.0.0", "to-readable-stream": "^2.1.0", @@ -1574,8 +1574,7 @@ "node_modules/@types/validator": { "version": "13.7.15", "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.7.15.tgz", - "integrity": "sha512-yeinDVQunb03AEP8luErFcyf/7Lf7AzKCD0NXfgVoGCCQDNpZET8Jgq74oBgqKld3hafLbfzt/3inUdQvaFeXQ==", - "dev": true + "integrity": "sha512-yeinDVQunb03AEP8luErFcyf/7Lf7AzKCD0NXfgVoGCCQDNpZET8Jgq74oBgqKld3hafLbfzt/3inUdQvaFeXQ==" }, "node_modules/@types/vscode": { "version": "1.77.0", @@ -1820,23 +1819,6 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "5.58.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.58.0.tgz", - "integrity": "sha512-b+w8ypN5CFvrXWQb9Ow9T4/6LC2MikNf1viLkYTiTbkQl46CnR69w7lajz1icW0TBsYmlpg+mRzFJ4LEJ8X9NA==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.58.0", - "@typescript-eslint/visitor-keys": "5.58.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, "node_modules/@typescript-eslint/type-utils": { "version": "5.59.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.59.0.tgz", @@ -1944,69 +1926,6 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, - "node_modules/@typescript-eslint/types": { - "version": "5.58.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.58.0.tgz", - "integrity": "sha512-JYV4eITHPzVQMnHZcYJXl2ZloC7thuUHrcUmxtzvItyKPvQ50kb9QXBkgNAt90OYMqwaodQh2kHutWZl1fc+1g==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.58.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.58.0.tgz", - "integrity": "sha512-cRACvGTodA+UxnYM2uwA2KCwRL7VAzo45syNysqlMyNyjw0Z35Icc9ihPJZjIYuA5bXJYiJ2YGUB59BqlOZT1Q==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.58.0", - "@typescript-eslint/visitor-keys": "5.58.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, "node_modules/@typescript-eslint/utils": { "version": "5.59.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.59.0.tgz", @@ -2130,23 +2049,6 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.58.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.58.0.tgz", - "integrity": "sha512-/fBraTlPj0jwdyTwLyrRTxv/3lnU2H96pNTVM6z3esTWLtA5MZ9ghSMJ7Rb+TtUAdtEw9EyJzJ0EydIMKxQ9gA==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.58.0", - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, "node_modules/accepts": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", @@ -6189,9 +6091,9 @@ } }, "node_modules/inflection": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/inflection/-/inflection-1.13.1.tgz", - "integrity": "sha512-dldYtl2WlN0QDkIDtg8+xFwOS2Tbmp12t1cHa5/YClU6ZQjTFm7B66UcVbh9NQB+HvT5BAd2t5+yKsBkw5pcqA==", + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/inflection/-/inflection-1.13.4.tgz", + "integrity": "sha512-6I/HUDeYFfuNCVS3td055BaXBwKYuzw7K3ExVMStBowKo9oOAMJIXIHvdyR3iboTCp1b+1i5DSkIZTcwIktuDw==", "engines": [ "node >= 0.4.0" ] @@ -7455,11 +7357,11 @@ } }, "node_modules/moment-timezone": { - "version": "0.5.34", - "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.34.tgz", - "integrity": "sha512-3zAEHh2hKUs3EXLESx/wsgw6IQdusOT8Bxm3D9UrHPQR7zlMmzwybC8zHEM1tQ4LJwP7fcxrWr8tuBg05fFCbg==", + "version": "0.5.43", + "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.43.tgz", + "integrity": "sha512-72j3aNyuIsDxdF1i7CEgV2FfxM1r6aaqJyLB2vwb33mXYyoyLly+F1zbWqhA3/bVIoJ4szlUoMbUnVdid32NUQ==", "dependencies": { - "moment": ">= 2.9.0" + "moment": "^2.29.4" }, "engines": { "node": "*" @@ -8781,9 +8683,9 @@ } }, "node_modules/retry-as-promised": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/retry-as-promised/-/retry-as-promised-5.0.0.tgz", - "integrity": "sha512-6S+5LvtTl2ggBumk04hBo/4Uf6fRJUwIgunGZ7CYEBCeufGFW1Pu6ucUf/UskHeWOIsUcLOGLFXPig5tR5V1nA==" + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/retry-as-promised/-/retry-as-promised-7.0.4.tgz", + "integrity": "sha512-XgmCoxKWkDofwH8WddD0w85ZfqYz+ZHlr5yo+3YUCfycWawU56T5ckWXsScsj5B8tqUcIG67DxXByo3VUgiAdA==" }, "node_modules/reusify": { "version": "1.0.4", @@ -8958,9 +8860,9 @@ "integrity": "sha1-1WgS4cAXpuTnw+Ojeh2m143TyT4=" }, "node_modules/sequelize": { - "version": "6.12.4", - "resolved": "https://registry.npmjs.org/sequelize/-/sequelize-6.12.4.tgz", - "integrity": "sha512-P2E8TzlV3VwdvPqTS58ctIpcAOytXdaylUUfxxnALjtMmF6I+kfNtrqTP7WQFaenOboAtXPCJReZ9MPy+Zy/Ig==", + "version": "6.31.0", + "resolved": "https://registry.npmjs.org/sequelize/-/sequelize-6.31.0.tgz", + "integrity": "sha512-nCPVtv+QydBmb3Us2jCNAr1Dx3gST83VZxxrUQn/JAVFCOrmYOgUaPUz5bevummyNf30zfHsZhIKYAOD3ULfTA==", "funding": [ { "type": "opencollective", @@ -8969,14 +8871,15 @@ ], "dependencies": { "@types/debug": "^4.1.7", + "@types/validator": "^13.7.1", "debug": "^4.3.3", "dottie": "^2.0.2", - "inflection": "^1.13.1", + "inflection": "^1.13.2", "lodash": "^4.17.21", "moment": "^2.29.1", - "moment-timezone": "^0.5.34", + "moment-timezone": "^0.5.35", "pg-connection-string": "^2.5.0", - "retry-as-promised": "^5.0.0", + "retry-as-promised": "^7.0.3", "semver": "^7.3.5", "sequelize-pool": "^7.1.0", "toposort-class": "^1.0.1", @@ -8997,6 +8900,9 @@ "mysql2": { "optional": true }, + "oracledb": { + "optional": true + }, "pg": { "optional": true }, @@ -11488,8 +11394,7 @@ "@types/validator": { "version": "13.7.15", "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.7.15.tgz", - "integrity": "sha512-yeinDVQunb03AEP8luErFcyf/7Lf7AzKCD0NXfgVoGCCQDNpZET8Jgq74oBgqKld3hafLbfzt/3inUdQvaFeXQ==", - "dev": true + "integrity": "sha512-yeinDVQunb03AEP8luErFcyf/7Lf7AzKCD0NXfgVoGCCQDNpZET8Jgq74oBgqKld3hafLbfzt/3inUdQvaFeXQ==" }, "@types/vscode": { "version": "1.77.0", @@ -11637,16 +11542,6 @@ } } }, - "@typescript-eslint/scope-manager": { - "version": "5.58.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.58.0.tgz", - "integrity": "sha512-b+w8ypN5CFvrXWQb9Ow9T4/6LC2MikNf1viLkYTiTbkQl46CnR69w7lajz1icW0TBsYmlpg+mRzFJ4LEJ8X9NA==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.58.0", - "@typescript-eslint/visitor-keys": "5.58.0" - } - }, "@typescript-eslint/type-utils": { "version": "5.59.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.59.0.tgz", @@ -11707,44 +11602,6 @@ } } }, - "@typescript-eslint/types": { - "version": "5.58.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.58.0.tgz", - "integrity": "sha512-JYV4eITHPzVQMnHZcYJXl2ZloC7thuUHrcUmxtzvItyKPvQ50kb9QXBkgNAt90OYMqwaodQh2kHutWZl1fc+1g==", - "dev": true - }, - "@typescript-eslint/typescript-estree": { - "version": "5.58.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.58.0.tgz", - "integrity": "sha512-cRACvGTodA+UxnYM2uwA2KCwRL7VAzo45syNysqlMyNyjw0Z35Icc9ihPJZjIYuA5bXJYiJ2YGUB59BqlOZT1Q==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.58.0", - "@typescript-eslint/visitor-keys": "5.58.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - }, - "dependencies": { - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } - } - }, "@typescript-eslint/utils": { "version": "5.59.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.59.0.tgz", @@ -11819,16 +11676,6 @@ } } }, - "@typescript-eslint/visitor-keys": { - "version": "5.58.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.58.0.tgz", - "integrity": "sha512-/fBraTlPj0jwdyTwLyrRTxv/3lnU2H96pNTVM6z3esTWLtA5MZ9ghSMJ7Rb+TtUAdtEw9EyJzJ0EydIMKxQ9gA==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.58.0", - "eslint-visitor-keys": "^3.3.0" - } - }, "accepts": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", @@ -15027,9 +14874,9 @@ "dev": true }, "inflection": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/inflection/-/inflection-1.13.1.tgz", - "integrity": "sha512-dldYtl2WlN0QDkIDtg8+xFwOS2Tbmp12t1cHa5/YClU6ZQjTFm7B66UcVbh9NQB+HvT5BAd2t5+yKsBkw5pcqA==" + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/inflection/-/inflection-1.13.4.tgz", + "integrity": "sha512-6I/HUDeYFfuNCVS3td055BaXBwKYuzw7K3ExVMStBowKo9oOAMJIXIHvdyR3iboTCp1b+1i5DSkIZTcwIktuDw==" }, "inflight": { "version": "1.0.6", @@ -15994,11 +15841,11 @@ "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==" }, "moment-timezone": { - "version": "0.5.34", - "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.34.tgz", - "integrity": "sha512-3zAEHh2hKUs3EXLESx/wsgw6IQdusOT8Bxm3D9UrHPQR7zlMmzwybC8zHEM1tQ4LJwP7fcxrWr8tuBg05fFCbg==", + "version": "0.5.43", + "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.43.tgz", + "integrity": "sha512-72j3aNyuIsDxdF1i7CEgV2FfxM1r6aaqJyLB2vwb33mXYyoyLly+F1zbWqhA3/bVIoJ4szlUoMbUnVdid32NUQ==", "requires": { - "moment": ">= 2.9.0" + "moment": "^2.29.4" } }, "morgan": { @@ -16979,9 +16826,9 @@ } }, "retry-as-promised": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/retry-as-promised/-/retry-as-promised-5.0.0.tgz", - "integrity": "sha512-6S+5LvtTl2ggBumk04hBo/4Uf6fRJUwIgunGZ7CYEBCeufGFW1Pu6ucUf/UskHeWOIsUcLOGLFXPig5tR5V1nA==" + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/retry-as-promised/-/retry-as-promised-7.0.4.tgz", + "integrity": "sha512-XgmCoxKWkDofwH8WddD0w85ZfqYz+ZHlr5yo+3YUCfycWawU56T5ckWXsScsj5B8tqUcIG67DxXByo3VUgiAdA==" }, "reusify": { "version": "1.0.4", @@ -17120,19 +16967,20 @@ "integrity": "sha1-1WgS4cAXpuTnw+Ojeh2m143TyT4=" }, "sequelize": { - "version": "6.12.4", - "resolved": "https://registry.npmjs.org/sequelize/-/sequelize-6.12.4.tgz", - "integrity": "sha512-P2E8TzlV3VwdvPqTS58ctIpcAOytXdaylUUfxxnALjtMmF6I+kfNtrqTP7WQFaenOboAtXPCJReZ9MPy+Zy/Ig==", + "version": "6.31.0", + "resolved": "https://registry.npmjs.org/sequelize/-/sequelize-6.31.0.tgz", + "integrity": "sha512-nCPVtv+QydBmb3Us2jCNAr1Dx3gST83VZxxrUQn/JAVFCOrmYOgUaPUz5bevummyNf30zfHsZhIKYAOD3ULfTA==", "requires": { "@types/debug": "^4.1.7", + "@types/validator": "^13.7.1", "debug": "^4.3.3", "dottie": "^2.0.2", - "inflection": "^1.13.1", + "inflection": "^1.13.2", "lodash": "^4.17.21", "moment": "^2.29.1", - "moment-timezone": "^0.5.34", + "moment-timezone": "^0.5.35", "pg-connection-string": "^2.5.0", - "retry-as-promised": "^5.0.0", + "retry-as-promised": "^7.0.3", "semver": "^7.3.5", "sequelize-pool": "^7.1.0", "toposort-class": "^1.0.1", diff --git a/package.json b/package.json index 0947eca7d..cdc477e1f 100644 --- a/package.json +++ b/package.json @@ -33,7 +33,7 @@ "multistream": "^2.1.1", "mysql2": "^3.2.0", "rimraf": "^3.0.2", - "sequelize": "^6.3.0", + "sequelize": "^6.31.0", "stoppable": "^1.1.0", "tedious": "^16.0.0", "to-readable-stream": "^2.1.0", diff --git a/src/blob/persistence/SqlBlobMetadataStore.ts b/src/blob/persistence/SqlBlobMetadataStore.ts index 0013185e2..7b7ca5333 100644 --- a/src/blob/persistence/SqlBlobMetadataStore.ts +++ b/src/blob/persistence/SqlBlobMetadataStore.ts @@ -3048,7 +3048,7 @@ export default class SqlBlobMetadataStore implements IBlobMetadataStore { return ret; } - private convertContainerModelToDbModel(container: ContainerModel): object { + private convertContainerModelToDbModel(container: ContainerModel): any { const lease = new ContainerLeaseAdapter(container).toString(); return { accountName: container.accountName, @@ -3136,7 +3136,7 @@ export default class SqlBlobMetadataStore implements IBlobMetadataStore { }; } - private convertBlobModelToDbModel(blob: BlobModel): object { + private convertBlobModelToDbModel(blob: BlobModel): any { const contentProperties = this.convertBlobContentPropertiesToDbModel( blob.properties ); From 239fd01d8e9139f29d2794fbb65ca94b764c28dc Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 24 Apr 2023 09:59:44 +0800 Subject: [PATCH 087/297] Bump @types/async from 3.2.18 to 3.2.19 (#1931) Bumps [@types/async](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/async) from 3.2.18 to 3.2.19. - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/async) --- updated-dependencies: - dependency-name: "@types/async" dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 167 ++-------------------------------------------- 1 file changed, 6 insertions(+), 161 deletions(-) diff --git a/package-lock.json b/package-lock.json index 9b74c3d4a..787cd8918 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1329,9 +1329,9 @@ "dev": true }, "node_modules/@types/async": { - "version": "3.2.18", - "resolved": "https://registry.npmjs.org/@types/async/-/async-3.2.18.tgz", - "integrity": "sha512-/IsuXp3B9R//uRLi40VlIYoMp7OzhkunPe2fDu7jGfQXI9y3CDCx6FC4juRLSqrpmLst3vgsiK536AAGJFl4Ww==", + "version": "3.2.19", + "resolved": "https://registry.npmjs.org/@types/async/-/async-3.2.19.tgz", + "integrity": "sha512-MSgZeRq5H2zm212k1uzlBM/67MTco4O8EFsUmyK96Xg0dOGQMReXKuB9QiBzGz6B0XPWPasjNBbPtMuy3qvtmQ==", "dev": true }, "node_modules/@types/bluebird": { @@ -1820,23 +1820,6 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "5.58.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.58.0.tgz", - "integrity": "sha512-b+w8ypN5CFvrXWQb9Ow9T4/6LC2MikNf1viLkYTiTbkQl46CnR69w7lajz1icW0TBsYmlpg+mRzFJ4LEJ8X9NA==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.58.0", - "@typescript-eslint/visitor-keys": "5.58.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, "node_modules/@typescript-eslint/type-utils": { "version": "5.59.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.59.0.tgz", @@ -1944,69 +1927,6 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, - "node_modules/@typescript-eslint/types": { - "version": "5.58.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.58.0.tgz", - "integrity": "sha512-JYV4eITHPzVQMnHZcYJXl2ZloC7thuUHrcUmxtzvItyKPvQ50kb9QXBkgNAt90OYMqwaodQh2kHutWZl1fc+1g==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.58.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.58.0.tgz", - "integrity": "sha512-cRACvGTodA+UxnYM2uwA2KCwRL7VAzo45syNysqlMyNyjw0Z35Icc9ihPJZjIYuA5bXJYiJ2YGUB59BqlOZT1Q==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.58.0", - "@typescript-eslint/visitor-keys": "5.58.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, "node_modules/@typescript-eslint/utils": { "version": "5.59.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.59.0.tgz", @@ -2130,23 +2050,6 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.58.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.58.0.tgz", - "integrity": "sha512-/fBraTlPj0jwdyTwLyrRTxv/3lnU2H96pNTVM6z3esTWLtA5MZ9ghSMJ7Rb+TtUAdtEw9EyJzJ0EydIMKxQ9gA==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.58.0", - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, "node_modules/accepts": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", @@ -11243,9 +11146,9 @@ "dev": true }, "@types/async": { - "version": "3.2.18", - "resolved": "https://registry.npmjs.org/@types/async/-/async-3.2.18.tgz", - "integrity": "sha512-/IsuXp3B9R//uRLi40VlIYoMp7OzhkunPe2fDu7jGfQXI9y3CDCx6FC4juRLSqrpmLst3vgsiK536AAGJFl4Ww==", + "version": "3.2.19", + "resolved": "https://registry.npmjs.org/@types/async/-/async-3.2.19.tgz", + "integrity": "sha512-MSgZeRq5H2zm212k1uzlBM/67MTco4O8EFsUmyK96Xg0dOGQMReXKuB9QiBzGz6B0XPWPasjNBbPtMuy3qvtmQ==", "dev": true }, "@types/bluebird": { @@ -11637,16 +11540,6 @@ } } }, - "@typescript-eslint/scope-manager": { - "version": "5.58.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.58.0.tgz", - "integrity": "sha512-b+w8ypN5CFvrXWQb9Ow9T4/6LC2MikNf1viLkYTiTbkQl46CnR69w7lajz1icW0TBsYmlpg+mRzFJ4LEJ8X9NA==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.58.0", - "@typescript-eslint/visitor-keys": "5.58.0" - } - }, "@typescript-eslint/type-utils": { "version": "5.59.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.59.0.tgz", @@ -11707,44 +11600,6 @@ } } }, - "@typescript-eslint/types": { - "version": "5.58.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.58.0.tgz", - "integrity": "sha512-JYV4eITHPzVQMnHZcYJXl2ZloC7thuUHrcUmxtzvItyKPvQ50kb9QXBkgNAt90OYMqwaodQh2kHutWZl1fc+1g==", - "dev": true - }, - "@typescript-eslint/typescript-estree": { - "version": "5.58.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.58.0.tgz", - "integrity": "sha512-cRACvGTodA+UxnYM2uwA2KCwRL7VAzo45syNysqlMyNyjw0Z35Icc9ihPJZjIYuA5bXJYiJ2YGUB59BqlOZT1Q==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.58.0", - "@typescript-eslint/visitor-keys": "5.58.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - }, - "dependencies": { - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } - } - }, "@typescript-eslint/utils": { "version": "5.59.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.59.0.tgz", @@ -11819,16 +11674,6 @@ } } }, - "@typescript-eslint/visitor-keys": { - "version": "5.58.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.58.0.tgz", - "integrity": "sha512-/fBraTlPj0jwdyTwLyrRTxv/3lnU2H96pNTVM6z3esTWLtA5MZ9ghSMJ7Rb+TtUAdtEw9EyJzJ0EydIMKxQ9gA==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.58.0", - "eslint-visitor-keys": "^3.3.0" - } - }, "accepts": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", From 7e0446b488f4c19c16d88ecb57f622eaf261ddcd Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 25 Apr 2023 09:42:08 +0800 Subject: [PATCH 088/297] Bump prettier from 2.8.7 to 2.8.8 (#1938) Bumps [prettier](https://github.com/prettier/prettier) from 2.8.7 to 2.8.8. - [Release notes](https://github.com/prettier/prettier/releases) - [Changelog](https://github.com/prettier/prettier/blob/main/CHANGELOG.md) - [Commits](https://github.com/prettier/prettier/compare/2.8.7...2.8.8) --- updated-dependencies: - dependency-name: prettier dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 914ab0050..b66e86c3a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8313,9 +8313,9 @@ } }, "node_modules/prettier": { - "version": "2.8.7", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.7.tgz", - "integrity": "sha512-yPngTo3aXUUmyuTjeTUT75txrf+aMh9FiD7q9ZE/i6r0bPb22g4FsE6Y338PQX1bmfy08i9QQCB7/rcUAVntfw==", + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", + "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", "dev": true, "bin": { "prettier": "bin-prettier.js" @@ -16545,9 +16545,9 @@ "dev": true }, "prettier": { - "version": "2.8.7", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.7.tgz", - "integrity": "sha512-yPngTo3aXUUmyuTjeTUT75txrf+aMh9FiD7q9ZE/i6r0bPb22g4FsE6Y338PQX1bmfy08i9QQCB7/rcUAVntfw==", + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", + "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", "dev": true }, "private": { From 42d398a888408c6488d6bf998a992c0681512266 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 27 Apr 2023 09:47:49 +0800 Subject: [PATCH 089/297] Bump lint-staged from 13.2.1 to 13.2.2 (#1945) Bumps [lint-staged](https://github.com/okonet/lint-staged) from 13.2.1 to 13.2.2. - [Release notes](https://github.com/okonet/lint-staged/releases) - [Commits](https://github.com/okonet/lint-staged/compare/v13.2.1...v13.2.2) --- updated-dependencies: - dependency-name: lint-staged dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/package-lock.json b/package-lock.json index b66e86c3a..24610188c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6680,9 +6680,9 @@ } }, "node_modules/lint-staged": { - "version": "13.2.1", - "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-13.2.1.tgz", - "integrity": "sha512-8gfzinVXoPfga5Dz/ZOn8I2GOhf81Wvs+KwbEXQn/oWZAvCVS2PivrXfVbFJc93zD16uC0neS47RXHIjXKYZQw==", + "version": "13.2.2", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-13.2.2.tgz", + "integrity": "sha512-71gSwXKy649VrSU09s10uAT0rWCcY3aewhMaHyl2N84oBk4Xs9HgxvUp3AYu+bNsK4NrOYYxvSgg7FyGJ+jGcA==", "dev": true, "dependencies": { "chalk": "5.2.0", @@ -6697,7 +6697,7 @@ "object-inspect": "^1.12.3", "pidtree": "^0.6.0", "string-argv": "^0.3.1", - "yaml": "^2.2.1" + "yaml": "^2.2.2" }, "bin": { "lint-staged": "bin/lint-staged.js" @@ -10123,9 +10123,9 @@ "dev": true }, "node_modules/yaml": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.2.1.tgz", - "integrity": "sha512-e0WHiYql7+9wr4cWMx3TVQrNwejKaEe7/rHNmQmqRjazfOP5W8PB6Jpebb5o6fIapbz9o9+2ipcaTM2ZwDI6lw==", + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.2.2.tgz", + "integrity": "sha512-CBKFWExMn46Foo4cldiChEzn7S7SRV+wqiluAb6xmueD/fGyRHIhX8m14vVGgeFWjN540nKCNVj6P21eQjgTuA==", "dev": true, "engines": { "node": ">= 14" @@ -15320,9 +15320,9 @@ } }, "lint-staged": { - "version": "13.2.1", - "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-13.2.1.tgz", - "integrity": "sha512-8gfzinVXoPfga5Dz/ZOn8I2GOhf81Wvs+KwbEXQn/oWZAvCVS2PivrXfVbFJc93zD16uC0neS47RXHIjXKYZQw==", + "version": "13.2.2", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-13.2.2.tgz", + "integrity": "sha512-71gSwXKy649VrSU09s10uAT0rWCcY3aewhMaHyl2N84oBk4Xs9HgxvUp3AYu+bNsK4NrOYYxvSgg7FyGJ+jGcA==", "dev": true, "requires": { "chalk": "5.2.0", @@ -15337,7 +15337,7 @@ "object-inspect": "^1.12.3", "pidtree": "^0.6.0", "string-argv": "^0.3.1", - "yaml": "^2.2.1" + "yaml": "^2.2.2" }, "dependencies": { "braces": { @@ -17892,9 +17892,9 @@ "dev": true }, "yaml": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.2.1.tgz", - "integrity": "sha512-e0WHiYql7+9wr4cWMx3TVQrNwejKaEe7/rHNmQmqRjazfOP5W8PB6Jpebb5o6fIapbz9o9+2ipcaTM2ZwDI6lw==", + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.2.2.tgz", + "integrity": "sha512-CBKFWExMn46Foo4cldiChEzn7S7SRV+wqiluAb6xmueD/fGyRHIhX8m14vVGgeFWjN540nKCNVj6P21eQjgTuA==", "dev": true }, "yauzl": { From d98f532840c6da5c01d4e0477007c44a4bf825ac Mon Sep 17 00:00:00 2001 From: Andrea Bettich Date: Thu, 4 May 2023 11:00:57 +0200 Subject: [PATCH 090/297] upgrade image to alpine 3.17 (#1941) fixes #1814 --- Dockerfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Dockerfile b/Dockerfile index d1274d046..414b1a18e 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,7 +1,7 @@ # # Builder # -FROM node:lts-alpine3.10 AS builder +FROM node:14-alpine3.17 AS builder WORKDIR /opt/azurite @@ -20,7 +20,7 @@ RUN npm run build && \ # # Production image # -FROM node:lts-alpine3.10 +FROM node:14-alpine3.17 ENV NODE_ENV=production From 400b9e215329ddf2a80b4d2343262a47475a43f3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 5 May 2023 11:54:17 +0800 Subject: [PATCH 091/297] Bump @types/vscode from 1.77.0 to 1.78.0 (#1951) Bumps [@types/vscode](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/vscode) from 1.77.0 to 1.78.0. - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/vscode) --- updated-dependencies: - dependency-name: "@types/vscode" dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 24610188c..24dd6b5fe 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1577,9 +1577,9 @@ "integrity": "sha512-yeinDVQunb03AEP8luErFcyf/7Lf7AzKCD0NXfgVoGCCQDNpZET8Jgq74oBgqKld3hafLbfzt/3inUdQvaFeXQ==" }, "node_modules/@types/vscode": { - "version": "1.77.0", - "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.77.0.tgz", - "integrity": "sha512-MWFN5R7a33n8eJZJmdVlifjig3LWUNRrPeO1xemIcZ0ae0TEQuRc7G2xV0LUX78RZFECY1plYBn+dP/Acc3L0Q==", + "version": "1.78.0", + "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.78.0.tgz", + "integrity": "sha512-LJZIJpPvKJ0HVQDqfOy6W4sNKUBBwyDu1Bs8chHBZOe9MNuKTJtidgZ2bqjhmmWpUb0TIIqv47BFUcVmAsgaVA==", "dev": true }, "node_modules/@types/xml2js": { @@ -11397,9 +11397,9 @@ "integrity": "sha512-yeinDVQunb03AEP8luErFcyf/7Lf7AzKCD0NXfgVoGCCQDNpZET8Jgq74oBgqKld3hafLbfzt/3inUdQvaFeXQ==" }, "@types/vscode": { - "version": "1.77.0", - "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.77.0.tgz", - "integrity": "sha512-MWFN5R7a33n8eJZJmdVlifjig3LWUNRrPeO1xemIcZ0ae0TEQuRc7G2xV0LUX78RZFECY1plYBn+dP/Acc3L0Q==", + "version": "1.78.0", + "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.78.0.tgz", + "integrity": "sha512-LJZIJpPvKJ0HVQDqfOy6W4sNKUBBwyDu1Bs8chHBZOe9MNuKTJtidgZ2bqjhmmWpUb0TIIqv47BFUcVmAsgaVA==", "dev": true }, "@types/xml2js": { From 511ba1adddcae060d8e2acd08aea1fe278d9d2d0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 5 May 2023 12:09:25 +0800 Subject: [PATCH 092/297] Bump @typescript-eslint/parser from 5.59.0 to 5.59.2 (#1953) Bumps [@typescript-eslint/parser](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/parser) from 5.59.0 to 5.59.2. - [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases) - [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/parser/CHANGELOG.md) - [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v5.59.2/packages/parser) --- updated-dependencies: - dependency-name: "@typescript-eslint/parser" dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 278 ++++++++++++++++++++++++++-------------------- 1 file changed, 159 insertions(+), 119 deletions(-) diff --git a/package-lock.json b/package-lock.json index 24dd6b5fe..a5a076a93 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1696,14 +1696,14 @@ "dev": true }, "node_modules/@typescript-eslint/parser": { - "version": "5.59.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.59.0.tgz", - "integrity": "sha512-qK9TZ70eJtjojSUMrrEwA9ZDQ4N0e/AuoOIgXuNBorXYcBDk397D2r5MIe1B3cok/oCtdNC5j+lUUpVB+Dpb+w==", + "version": "5.59.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.59.2.tgz", + "integrity": "sha512-uq0sKyw6ao1iFOZZGk9F8Nro/8+gfB5ezl1cA06SrqbgJAt0SRoFhb9pXaHvkrxUpZaoLxt8KlovHNk8Gp6/HQ==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "5.59.0", - "@typescript-eslint/types": "5.59.0", - "@typescript-eslint/typescript-estree": "5.59.0", + "@typescript-eslint/scope-manager": "5.59.2", + "@typescript-eslint/types": "5.59.2", + "@typescript-eslint/typescript-estree": "5.59.2", "debug": "^4.3.4" }, "engines": { @@ -1722,14 +1722,56 @@ } } }, - "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/scope-manager": { + "node_modules/@typescript-eslint/parser/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/parser/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "5.59.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.59.2.tgz", + "integrity": "sha512-dB1v7ROySwQWKqQ8rEWcdbTsFjh2G0vn8KUyvTXdPoyzSL6lLGkiXEV5CvpJsEe9xIdKV+8Zqb7wif2issoOFA==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.59.2", + "@typescript-eslint/visitor-keys": "5.59.2" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { "version": "5.59.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.59.0.tgz", - "integrity": "sha512-tsoldKaMh7izN6BvkK6zRMINj4Z2d6gGhO2UsI8zGZY3XhLq1DndP3Ycjhi1JwdwPRwtLMW4EFPgpuKhbCGOvQ==", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.59.0.tgz", + "integrity": "sha512-d/B6VSWnZwu70kcKQSCqjcXpVH+7ABKH8P1KNn4K7j5PXXuycZTPXF44Nui0TEm6rbWGi8kc78xRgOC4n7xFgA==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.59.0", - "@typescript-eslint/visitor-keys": "5.59.0" + "@typescript-eslint/typescript-estree": "5.59.0", + "@typescript-eslint/utils": "5.59.0", + "debug": "^4.3.4", + "tsutils": "^3.21.0" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -1737,9 +1779,17 @@ "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/types": { + "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/types": { "version": "5.59.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.0.tgz", "integrity": "sha512-yR2h1NotF23xFFYKHZs17QJnB51J/s+ud4PYU4MqdZbzeNxpgUr05+dNeCN/bb6raslHvGdd6BFCkVhpPk/ZeA==", @@ -1752,7 +1802,7 @@ "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/typescript-estree": { + "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree": { "version": "5.59.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.0.tgz", "integrity": "sha512-sUNnktjmI8DyGzPdZ8dRwW741zopGxltGs/SAPgGL/AAgDpiLsCFLcMNSpbfXfmnNeHmK9h3wGmCkGRGAoUZAg==", @@ -1779,7 +1829,7 @@ } } }, - "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/visitor-keys": { + "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/visitor-keys": { "version": "5.59.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.0.tgz", "integrity": "sha512-qZ3iXxQhanchCeaExlKPV3gDQFxMUmU35xfd5eCXB6+kUw1TUAbIy2n7QIrwz9s98DQLzNWyHp61fY0da4ZcbA==", @@ -1796,7 +1846,7 @@ "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@typescript-eslint/parser/node_modules/debug": { + "node_modules/@typescript-eslint/type-utils/node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", @@ -1813,43 +1863,16 @@ } } }, - "node_modules/@typescript-eslint/parser/node_modules/ms": { + "node_modules/@typescript-eslint/type-utils/node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, - "node_modules/@typescript-eslint/type-utils": { - "version": "5.59.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.59.0.tgz", - "integrity": "sha512-d/B6VSWnZwu70kcKQSCqjcXpVH+7ABKH8P1KNn4K7j5PXXuycZTPXF44Nui0TEm6rbWGi8kc78xRgOC4n7xFgA==", - "dev": true, - "dependencies": { - "@typescript-eslint/typescript-estree": "5.59.0", - "@typescript-eslint/utils": "5.59.0", - "debug": "^4.3.4", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "*" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/types": { - "version": "5.59.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.0.tgz", - "integrity": "sha512-yR2h1NotF23xFFYKHZs17QJnB51J/s+ud4PYU4MqdZbzeNxpgUr05+dNeCN/bb6raslHvGdd6BFCkVhpPk/ZeA==", + "node_modules/@typescript-eslint/types": { + "version": "5.59.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.2.tgz", + "integrity": "sha512-LbJ/HqoVs2XTGq5shkiKaNTuVv5tTejdHgfdjqRUGdYhjW1crm/M7og2jhVskMt8/4wS3T1+PfFvL1K3wqYj4w==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -1859,14 +1882,14 @@ "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree": { - "version": "5.59.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.0.tgz", - "integrity": "sha512-sUNnktjmI8DyGzPdZ8dRwW741zopGxltGs/SAPgGL/AAgDpiLsCFLcMNSpbfXfmnNeHmK9h3wGmCkGRGAoUZAg==", + "node_modules/@typescript-eslint/typescript-estree": { + "version": "5.59.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.2.tgz", + "integrity": "sha512-+j4SmbwVmZsQ9jEyBMgpuBD0rKwi9RxRpjX71Brr73RsYnEr3Lt5QZ624Bxphp8HUkSKfqGnPJp1kA5nl0Sh7Q==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.59.0", - "@typescript-eslint/visitor-keys": "5.59.0", + "@typescript-eslint/types": "5.59.2", + "@typescript-eslint/visitor-keys": "5.59.2", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -1886,24 +1909,7 @@ } } }, - "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/visitor-keys": { - "version": "5.59.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.0.tgz", - "integrity": "sha512-qZ3iXxQhanchCeaExlKPV3gDQFxMUmU35xfd5eCXB6+kUw1TUAbIy2n7QIrwz9s98DQLzNWyHp61fY0da4ZcbA==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.59.0", - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/type-utils/node_modules/debug": { + "node_modules/@typescript-eslint/typescript-estree/node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", @@ -1920,7 +1926,7 @@ } } }, - "node_modules/@typescript-eslint/type-utils/node_modules/ms": { + "node_modules/@typescript-eslint/typescript-estree/node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", @@ -2049,6 +2055,23 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "5.59.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.2.tgz", + "integrity": "sha512-EEpsO8m3RASrKAHI9jpavNv9NlEUebV4qmF1OWxSTtKSFBpC1NCmWazDQHFivRf0O1DV11BA645yrLEVQ0/Lig==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.59.2", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, "node_modules/accepts": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", @@ -11473,58 +11496,17 @@ } }, "@typescript-eslint/parser": { - "version": "5.59.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.59.0.tgz", - "integrity": "sha512-qK9TZ70eJtjojSUMrrEwA9ZDQ4N0e/AuoOIgXuNBorXYcBDk397D2r5MIe1B3cok/oCtdNC5j+lUUpVB+Dpb+w==", + "version": "5.59.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.59.2.tgz", + "integrity": "sha512-uq0sKyw6ao1iFOZZGk9F8Nro/8+gfB5ezl1cA06SrqbgJAt0SRoFhb9pXaHvkrxUpZaoLxt8KlovHNk8Gp6/HQ==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "5.59.0", - "@typescript-eslint/types": "5.59.0", - "@typescript-eslint/typescript-estree": "5.59.0", + "@typescript-eslint/scope-manager": "5.59.2", + "@typescript-eslint/types": "5.59.2", + "@typescript-eslint/typescript-estree": "5.59.2", "debug": "^4.3.4" }, "dependencies": { - "@typescript-eslint/scope-manager": { - "version": "5.59.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.59.0.tgz", - "integrity": "sha512-tsoldKaMh7izN6BvkK6zRMINj4Z2d6gGhO2UsI8zGZY3XhLq1DndP3Ycjhi1JwdwPRwtLMW4EFPgpuKhbCGOvQ==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.59.0", - "@typescript-eslint/visitor-keys": "5.59.0" - } - }, - "@typescript-eslint/types": { - "version": "5.59.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.0.tgz", - "integrity": "sha512-yR2h1NotF23xFFYKHZs17QJnB51J/s+ud4PYU4MqdZbzeNxpgUr05+dNeCN/bb6raslHvGdd6BFCkVhpPk/ZeA==", - "dev": true - }, - "@typescript-eslint/typescript-estree": { - "version": "5.59.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.0.tgz", - "integrity": "sha512-sUNnktjmI8DyGzPdZ8dRwW741zopGxltGs/SAPgGL/AAgDpiLsCFLcMNSpbfXfmnNeHmK9h3wGmCkGRGAoUZAg==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.59.0", - "@typescript-eslint/visitor-keys": "5.59.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - } - }, - "@typescript-eslint/visitor-keys": { - "version": "5.59.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.0.tgz", - "integrity": "sha512-qZ3iXxQhanchCeaExlKPV3gDQFxMUmU35xfd5eCXB6+kUw1TUAbIy2n7QIrwz9s98DQLzNWyHp61fY0da4ZcbA==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.59.0", - "eslint-visitor-keys": "^3.3.0" - } - }, "debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -11542,6 +11524,16 @@ } } }, + "@typescript-eslint/scope-manager": { + "version": "5.59.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.59.2.tgz", + "integrity": "sha512-dB1v7ROySwQWKqQ8rEWcdbTsFjh2G0vn8KUyvTXdPoyzSL6lLGkiXEV5CvpJsEe9xIdKV+8Zqb7wif2issoOFA==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.59.2", + "@typescript-eslint/visitor-keys": "5.59.2" + } + }, "@typescript-eslint/type-utils": { "version": "5.59.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.59.0.tgz", @@ -11602,6 +11594,44 @@ } } }, + "@typescript-eslint/types": { + "version": "5.59.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.2.tgz", + "integrity": "sha512-LbJ/HqoVs2XTGq5shkiKaNTuVv5tTejdHgfdjqRUGdYhjW1crm/M7og2jhVskMt8/4wS3T1+PfFvL1K3wqYj4w==", + "dev": true + }, + "@typescript-eslint/typescript-estree": { + "version": "5.59.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.2.tgz", + "integrity": "sha512-+j4SmbwVmZsQ9jEyBMgpuBD0rKwi9RxRpjX71Brr73RsYnEr3Lt5QZ624Bxphp8HUkSKfqGnPJp1kA5nl0Sh7Q==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.59.2", + "@typescript-eslint/visitor-keys": "5.59.2", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "dependencies": { + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, "@typescript-eslint/utils": { "version": "5.59.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.59.0.tgz", @@ -11676,6 +11706,16 @@ } } }, + "@typescript-eslint/visitor-keys": { + "version": "5.59.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.2.tgz", + "integrity": "sha512-EEpsO8m3RASrKAHI9jpavNv9NlEUebV4qmF1OWxSTtKSFBpC1NCmWazDQHFivRf0O1DV11BA645yrLEVQ0/Lig==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.59.2", + "eslint-visitor-keys": "^3.3.0" + } + }, "accepts": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", From 2875be6a4098820b9a5614d57d76f9d0dab75dd8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 8 May 2023 10:46:14 +0800 Subject: [PATCH 093/297] Bump @types/lokijs from 1.5.7 to 1.5.8 (#1956) Bumps [@types/lokijs](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/lokijs) from 1.5.7 to 1.5.8. - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/lokijs) --- updated-dependencies: - dependency-name: "@types/lokijs" dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index a5a076a93..f5b31f10e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1448,9 +1448,9 @@ } }, "node_modules/@types/lokijs": { - "version": "1.5.7", - "resolved": "https://registry.npmjs.org/@types/lokijs/-/lokijs-1.5.7.tgz", - "integrity": "sha512-WEFQLgO3u2Wa7yFybqkTZYumqF1GcHvUwx8Tv2SUHy2qpnIainMMoLmEUGdjhPNp/v5pyC9e91fSMC3mkxBIDw==", + "version": "1.5.8", + "resolved": "https://registry.npmjs.org/@types/lokijs/-/lokijs-1.5.8.tgz", + "integrity": "sha512-HN4vmoYHqF0mx91Cci6xaH1uN1JAMbakqNFXggpbd2L/RTUMrvx//dJTJehEtEF+a/qXfLbVSeO6p3Oegx/hDg==", "dev": true }, "node_modules/@types/mime": { @@ -11291,9 +11291,9 @@ } }, "@types/lokijs": { - "version": "1.5.7", - "resolved": "https://registry.npmjs.org/@types/lokijs/-/lokijs-1.5.7.tgz", - "integrity": "sha512-WEFQLgO3u2Wa7yFybqkTZYumqF1GcHvUwx8Tv2SUHy2qpnIainMMoLmEUGdjhPNp/v5pyC9e91fSMC3mkxBIDw==", + "version": "1.5.8", + "resolved": "https://registry.npmjs.org/@types/lokijs/-/lokijs-1.5.8.tgz", + "integrity": "sha512-HN4vmoYHqF0mx91Cci6xaH1uN1JAMbakqNFXggpbd2L/RTUMrvx//dJTJehEtEF+a/qXfLbVSeO6p3Oegx/hDg==", "dev": true }, "@types/mime": { From a5d4d7e4f27b945dff23e0f12851e57e553e95c3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 8 May 2023 10:53:16 +0800 Subject: [PATCH 094/297] Bump @typescript-eslint/eslint-plugin from 5.59.0 to 5.59.2 (#1957) Bumps [@typescript-eslint/eslint-plugin](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/eslint-plugin) from 5.59.0 to 5.59.2. - [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases) - [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/eslint-plugin/CHANGELOG.md) - [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v5.59.2/packages/eslint-plugin) --- updated-dependencies: - dependency-name: "@typescript-eslint/eslint-plugin" dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 384 ++++------------------------------------------ 1 file changed, 34 insertions(+), 350 deletions(-) diff --git a/package-lock.json b/package-lock.json index f5b31f10e..ab7494b76 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1592,15 +1592,15 @@ } }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.59.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.59.0.tgz", - "integrity": "sha512-p0QgrEyrxAWBecR56gyn3wkG15TJdI//eetInP3zYRewDh0XS+DhB3VUAd3QqvziFsfaQIoIuZMxZRB7vXYaYw==", + "version": "5.59.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.59.2.tgz", + "integrity": "sha512-yVrXupeHjRxLDcPKL10sGQ/QlVrA8J5IYOEWVqk0lJaSZP7X5DfnP7Ns3cc74/blmbipQ1htFNVGsHX6wsYm0A==", "dev": true, "dependencies": { "@eslint-community/regexpp": "^4.4.0", - "@typescript-eslint/scope-manager": "5.59.0", - "@typescript-eslint/type-utils": "5.59.0", - "@typescript-eslint/utils": "5.59.0", + "@typescript-eslint/scope-manager": "5.59.2", + "@typescript-eslint/type-utils": "5.59.2", + "@typescript-eslint/utils": "5.59.2", "debug": "^4.3.4", "grapheme-splitter": "^1.0.4", "ignore": "^5.2.0", @@ -1625,53 +1625,6 @@ } } }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/scope-manager": { - "version": "5.59.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.59.0.tgz", - "integrity": "sha512-tsoldKaMh7izN6BvkK6zRMINj4Z2d6gGhO2UsI8zGZY3XhLq1DndP3Ycjhi1JwdwPRwtLMW4EFPgpuKhbCGOvQ==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.59.0", - "@typescript-eslint/visitor-keys": "5.59.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/types": { - "version": "5.59.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.0.tgz", - "integrity": "sha512-yR2h1NotF23xFFYKHZs17QJnB51J/s+ud4PYU4MqdZbzeNxpgUr05+dNeCN/bb6raslHvGdd6BFCkVhpPk/ZeA==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/visitor-keys": { - "version": "5.59.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.0.tgz", - "integrity": "sha512-qZ3iXxQhanchCeaExlKPV3gDQFxMUmU35xfd5eCXB6+kUw1TUAbIy2n7QIrwz9s98DQLzNWyHp61fY0da4ZcbA==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.59.0", - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -1763,13 +1716,13 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "5.59.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.59.0.tgz", - "integrity": "sha512-d/B6VSWnZwu70kcKQSCqjcXpVH+7ABKH8P1KNn4K7j5PXXuycZTPXF44Nui0TEm6rbWGi8kc78xRgOC4n7xFgA==", + "version": "5.59.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.59.2.tgz", + "integrity": "sha512-b1LS2phBOsEy/T381bxkkywfQXkV1dWda/z0PhnIy3bC5+rQWQDS7fk9CSpcXBccPY27Z6vBEuaPBCKCgYezyQ==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "5.59.0", - "@typescript-eslint/utils": "5.59.0", + "@typescript-eslint/typescript-estree": "5.59.2", + "@typescript-eslint/utils": "5.59.2", "debug": "^4.3.4", "tsutils": "^3.21.0" }, @@ -1789,63 +1742,6 @@ } } }, - "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/types": { - "version": "5.59.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.0.tgz", - "integrity": "sha512-yR2h1NotF23xFFYKHZs17QJnB51J/s+ud4PYU4MqdZbzeNxpgUr05+dNeCN/bb6raslHvGdd6BFCkVhpPk/ZeA==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree": { - "version": "5.59.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.0.tgz", - "integrity": "sha512-sUNnktjmI8DyGzPdZ8dRwW741zopGxltGs/SAPgGL/AAgDpiLsCFLcMNSpbfXfmnNeHmK9h3wGmCkGRGAoUZAg==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.59.0", - "@typescript-eslint/visitor-keys": "5.59.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/visitor-keys": { - "version": "5.59.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.0.tgz", - "integrity": "sha512-qZ3iXxQhanchCeaExlKPV3gDQFxMUmU35xfd5eCXB6+kUw1TUAbIy2n7QIrwz9s98DQLzNWyHp61fY0da4ZcbA==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.59.0", - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, "node_modules/@typescript-eslint/type-utils/node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -1933,17 +1829,17 @@ "dev": true }, "node_modules/@typescript-eslint/utils": { - "version": "5.59.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.59.0.tgz", - "integrity": "sha512-GGLFd+86drlHSvPgN/el6dRQNYYGOvRSDVydsUaQluwIW3HvbXuxyuD5JETvBt/9qGYe+lOrDk6gRrWOHb/FvA==", + "version": "5.59.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.59.2.tgz", + "integrity": "sha512-kSuF6/77TZzyGPhGO4uVp+f0SBoYxCDf+lW3GKhtKru/L8k/Hd7NFQxyWUeY7Z/KGB2C6Fe3yf2vVi4V9TsCSQ==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@types/json-schema": "^7.0.9", "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.59.0", - "@typescript-eslint/types": "5.59.0", - "@typescript-eslint/typescript-estree": "5.59.0", + "@typescript-eslint/scope-manager": "5.59.2", + "@typescript-eslint/types": "5.59.2", + "@typescript-eslint/typescript-estree": "5.59.2", "eslint-scope": "^5.1.1", "semver": "^7.3.7" }, @@ -1958,103 +1854,6 @@ "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, - "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/scope-manager": { - "version": "5.59.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.59.0.tgz", - "integrity": "sha512-tsoldKaMh7izN6BvkK6zRMINj4Z2d6gGhO2UsI8zGZY3XhLq1DndP3Ycjhi1JwdwPRwtLMW4EFPgpuKhbCGOvQ==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.59.0", - "@typescript-eslint/visitor-keys": "5.59.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/types": { - "version": "5.59.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.0.tgz", - "integrity": "sha512-yR2h1NotF23xFFYKHZs17QJnB51J/s+ud4PYU4MqdZbzeNxpgUr05+dNeCN/bb6raslHvGdd6BFCkVhpPk/ZeA==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree": { - "version": "5.59.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.0.tgz", - "integrity": "sha512-sUNnktjmI8DyGzPdZ8dRwW741zopGxltGs/SAPgGL/AAgDpiLsCFLcMNSpbfXfmnNeHmK9h3wGmCkGRGAoUZAg==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.59.0", - "@typescript-eslint/visitor-keys": "5.59.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/visitor-keys": { - "version": "5.59.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.0.tgz", - "integrity": "sha512-qZ3iXxQhanchCeaExlKPV3gDQFxMUmU35xfd5eCXB6+kUw1TUAbIy2n7QIrwz9s98DQLzNWyHp61fY0da4ZcbA==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.59.0", - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/utils/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/utils/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, "node_modules/@typescript-eslint/visitor-keys": { "version": "5.59.2", "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.2.tgz", @@ -11435,15 +11234,15 @@ } }, "@typescript-eslint/eslint-plugin": { - "version": "5.59.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.59.0.tgz", - "integrity": "sha512-p0QgrEyrxAWBecR56gyn3wkG15TJdI//eetInP3zYRewDh0XS+DhB3VUAd3QqvziFsfaQIoIuZMxZRB7vXYaYw==", + "version": "5.59.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.59.2.tgz", + "integrity": "sha512-yVrXupeHjRxLDcPKL10sGQ/QlVrA8J5IYOEWVqk0lJaSZP7X5DfnP7Ns3cc74/blmbipQ1htFNVGsHX6wsYm0A==", "dev": true, "requires": { "@eslint-community/regexpp": "^4.4.0", - "@typescript-eslint/scope-manager": "5.59.0", - "@typescript-eslint/type-utils": "5.59.0", - "@typescript-eslint/utils": "5.59.0", + "@typescript-eslint/scope-manager": "5.59.2", + "@typescript-eslint/type-utils": "5.59.2", + "@typescript-eslint/utils": "5.59.2", "debug": "^4.3.4", "grapheme-splitter": "^1.0.4", "ignore": "^5.2.0", @@ -11452,32 +11251,6 @@ "tsutils": "^3.21.0" }, "dependencies": { - "@typescript-eslint/scope-manager": { - "version": "5.59.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.59.0.tgz", - "integrity": "sha512-tsoldKaMh7izN6BvkK6zRMINj4Z2d6gGhO2UsI8zGZY3XhLq1DndP3Ycjhi1JwdwPRwtLMW4EFPgpuKhbCGOvQ==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.59.0", - "@typescript-eslint/visitor-keys": "5.59.0" - } - }, - "@typescript-eslint/types": { - "version": "5.59.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.0.tgz", - "integrity": "sha512-yR2h1NotF23xFFYKHZs17QJnB51J/s+ud4PYU4MqdZbzeNxpgUr05+dNeCN/bb6raslHvGdd6BFCkVhpPk/ZeA==", - "dev": true - }, - "@typescript-eslint/visitor-keys": { - "version": "5.59.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.0.tgz", - "integrity": "sha512-qZ3iXxQhanchCeaExlKPV3gDQFxMUmU35xfd5eCXB6+kUw1TUAbIy2n7QIrwz9s98DQLzNWyHp61fY0da4ZcbA==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.59.0", - "eslint-visitor-keys": "^3.3.0" - } - }, "debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -11535,48 +11308,17 @@ } }, "@typescript-eslint/type-utils": { - "version": "5.59.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.59.0.tgz", - "integrity": "sha512-d/B6VSWnZwu70kcKQSCqjcXpVH+7ABKH8P1KNn4K7j5PXXuycZTPXF44Nui0TEm6rbWGi8kc78xRgOC4n7xFgA==", + "version": "5.59.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.59.2.tgz", + "integrity": "sha512-b1LS2phBOsEy/T381bxkkywfQXkV1dWda/z0PhnIy3bC5+rQWQDS7fk9CSpcXBccPY27Z6vBEuaPBCKCgYezyQ==", "dev": true, "requires": { - "@typescript-eslint/typescript-estree": "5.59.0", - "@typescript-eslint/utils": "5.59.0", + "@typescript-eslint/typescript-estree": "5.59.2", + "@typescript-eslint/utils": "5.59.2", "debug": "^4.3.4", "tsutils": "^3.21.0" }, "dependencies": { - "@typescript-eslint/types": { - "version": "5.59.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.0.tgz", - "integrity": "sha512-yR2h1NotF23xFFYKHZs17QJnB51J/s+ud4PYU4MqdZbzeNxpgUr05+dNeCN/bb6raslHvGdd6BFCkVhpPk/ZeA==", - "dev": true - }, - "@typescript-eslint/typescript-estree": { - "version": "5.59.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.0.tgz", - "integrity": "sha512-sUNnktjmI8DyGzPdZ8dRwW741zopGxltGs/SAPgGL/AAgDpiLsCFLcMNSpbfXfmnNeHmK9h3wGmCkGRGAoUZAg==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.59.0", - "@typescript-eslint/visitor-keys": "5.59.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - } - }, - "@typescript-eslint/visitor-keys": { - "version": "5.59.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.0.tgz", - "integrity": "sha512-qZ3iXxQhanchCeaExlKPV3gDQFxMUmU35xfd5eCXB6+kUw1TUAbIy2n7QIrwz9s98DQLzNWyHp61fY0da4ZcbA==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.59.0", - "eslint-visitor-keys": "^3.3.0" - } - }, "debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -11633,77 +11375,19 @@ } }, "@typescript-eslint/utils": { - "version": "5.59.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.59.0.tgz", - "integrity": "sha512-GGLFd+86drlHSvPgN/el6dRQNYYGOvRSDVydsUaQluwIW3HvbXuxyuD5JETvBt/9qGYe+lOrDk6gRrWOHb/FvA==", + "version": "5.59.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.59.2.tgz", + "integrity": "sha512-kSuF6/77TZzyGPhGO4uVp+f0SBoYxCDf+lW3GKhtKru/L8k/Hd7NFQxyWUeY7Z/KGB2C6Fe3yf2vVi4V9TsCSQ==", "dev": true, "requires": { "@eslint-community/eslint-utils": "^4.2.0", "@types/json-schema": "^7.0.9", "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.59.0", - "@typescript-eslint/types": "5.59.0", - "@typescript-eslint/typescript-estree": "5.59.0", + "@typescript-eslint/scope-manager": "5.59.2", + "@typescript-eslint/types": "5.59.2", + "@typescript-eslint/typescript-estree": "5.59.2", "eslint-scope": "^5.1.1", "semver": "^7.3.7" - }, - "dependencies": { - "@typescript-eslint/scope-manager": { - "version": "5.59.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.59.0.tgz", - "integrity": "sha512-tsoldKaMh7izN6BvkK6zRMINj4Z2d6gGhO2UsI8zGZY3XhLq1DndP3Ycjhi1JwdwPRwtLMW4EFPgpuKhbCGOvQ==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.59.0", - "@typescript-eslint/visitor-keys": "5.59.0" - } - }, - "@typescript-eslint/types": { - "version": "5.59.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.0.tgz", - "integrity": "sha512-yR2h1NotF23xFFYKHZs17QJnB51J/s+ud4PYU4MqdZbzeNxpgUr05+dNeCN/bb6raslHvGdd6BFCkVhpPk/ZeA==", - "dev": true - }, - "@typescript-eslint/typescript-estree": { - "version": "5.59.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.0.tgz", - "integrity": "sha512-sUNnktjmI8DyGzPdZ8dRwW741zopGxltGs/SAPgGL/AAgDpiLsCFLcMNSpbfXfmnNeHmK9h3wGmCkGRGAoUZAg==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.59.0", - "@typescript-eslint/visitor-keys": "5.59.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - } - }, - "@typescript-eslint/visitor-keys": { - "version": "5.59.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.0.tgz", - "integrity": "sha512-qZ3iXxQhanchCeaExlKPV3gDQFxMUmU35xfd5eCXB6+kUw1TUAbIy2n7QIrwz9s98DQLzNWyHp61fY0da4ZcbA==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.59.0", - "eslint-visitor-keys": "^3.3.0" - } - }, - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } } }, "@typescript-eslint/visitor-keys": { From d96169a5ffc7b40e1a2a83fd29c925a2d4c97d9b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 10 May 2023 13:21:46 +0800 Subject: [PATCH 095/297] Bump @typescript-eslint/eslint-plugin from 5.59.2 to 5.59.5 (#1963) Bumps [@typescript-eslint/eslint-plugin](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/eslint-plugin) from 5.59.2 to 5.59.5. - [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases) - [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/eslint-plugin/CHANGELOG.md) - [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v5.59.5/packages/eslint-plugin) --- updated-dependencies: - dependency-name: "@typescript-eslint/eslint-plugin" dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 396 +++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 356 insertions(+), 40 deletions(-) diff --git a/package-lock.json b/package-lock.json index ab7494b76..e313c8988 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1524,9 +1524,9 @@ } }, "node_modules/@types/semver": { - "version": "7.3.13", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.13.tgz", - "integrity": "sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==", + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.0.tgz", + "integrity": "sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==", "dev": true }, "node_modules/@types/serve-static": { @@ -1592,15 +1592,15 @@ } }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.59.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.59.2.tgz", - "integrity": "sha512-yVrXupeHjRxLDcPKL10sGQ/QlVrA8J5IYOEWVqk0lJaSZP7X5DfnP7Ns3cc74/blmbipQ1htFNVGsHX6wsYm0A==", + "version": "5.59.5", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.59.5.tgz", + "integrity": "sha512-feA9xbVRWJZor+AnLNAr7A8JRWeZqHUf4T9tlP+TN04b05pFVhO5eN7/O93Y/1OUlLMHKbnJisgDURs/qvtqdg==", "dev": true, "dependencies": { "@eslint-community/regexpp": "^4.4.0", - "@typescript-eslint/scope-manager": "5.59.2", - "@typescript-eslint/type-utils": "5.59.2", - "@typescript-eslint/utils": "5.59.2", + "@typescript-eslint/scope-manager": "5.59.5", + "@typescript-eslint/type-utils": "5.59.5", + "@typescript-eslint/utils": "5.59.5", "debug": "^4.3.4", "grapheme-splitter": "^1.0.4", "ignore": "^5.2.0", @@ -1625,6 +1625,53 @@ } } }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/scope-manager": { + "version": "5.59.5", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.59.5.tgz", + "integrity": "sha512-jVecWwnkX6ZgutF+DovbBJirZcAxgxC0EOHYt/niMROf8p4PwxxG32Qdhj/iIQQIuOflLjNkxoXyArkcIP7C3A==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.59.5", + "@typescript-eslint/visitor-keys": "5.59.5" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/types": { + "version": "5.59.5", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.5.tgz", + "integrity": "sha512-xkfRPHbqSH4Ggx4eHRIO/eGL8XL4Ysb4woL8c87YuAo8Md7AUjyWKa9YMwTL519SyDPrfEgKdewjkxNCVeJW7w==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/visitor-keys": { + "version": "5.59.5", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.5.tgz", + "integrity": "sha512-qL+Oz+dbeBRTeyJTIy0eniD3uvqU7x+y1QceBismZ41hd4aBSRh8UAw4pZP0+XzLuPZmx4raNMq/I+59W2lXKA==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.59.5", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -1716,13 +1763,13 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "5.59.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.59.2.tgz", - "integrity": "sha512-b1LS2phBOsEy/T381bxkkywfQXkV1dWda/z0PhnIy3bC5+rQWQDS7fk9CSpcXBccPY27Z6vBEuaPBCKCgYezyQ==", + "version": "5.59.5", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.59.5.tgz", + "integrity": "sha512-4eyhS7oGym67/pSxA2mmNq7X164oqDYNnZCUayBwJZIRVvKpBCMBzFnFxjeoDeShjtO6RQBHBuwybuX3POnDqg==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "5.59.2", - "@typescript-eslint/utils": "5.59.2", + "@typescript-eslint/typescript-estree": "5.59.5", + "@typescript-eslint/utils": "5.59.5", "debug": "^4.3.4", "tsutils": "^3.21.0" }, @@ -1742,6 +1789,63 @@ } } }, + "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/types": { + "version": "5.59.5", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.5.tgz", + "integrity": "sha512-xkfRPHbqSH4Ggx4eHRIO/eGL8XL4Ysb4woL8c87YuAo8Md7AUjyWKa9YMwTL519SyDPrfEgKdewjkxNCVeJW7w==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree": { + "version": "5.59.5", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.5.tgz", + "integrity": "sha512-+XXdLN2CZLZcD/mO7mQtJMvCkzRfmODbeSKuMY/yXbGkzvA9rJyDY5qDYNoiz2kP/dmyAxXquL2BvLQLJFPQIg==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.59.5", + "@typescript-eslint/visitor-keys": "5.59.5", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/visitor-keys": { + "version": "5.59.5", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.5.tgz", + "integrity": "sha512-qL+Oz+dbeBRTeyJTIy0eniD3uvqU7x+y1QceBismZ41hd4aBSRh8UAw4pZP0+XzLuPZmx4raNMq/I+59W2lXKA==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.59.5", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, "node_modules/@typescript-eslint/type-utils/node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -1829,17 +1933,17 @@ "dev": true }, "node_modules/@typescript-eslint/utils": { - "version": "5.59.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.59.2.tgz", - "integrity": "sha512-kSuF6/77TZzyGPhGO4uVp+f0SBoYxCDf+lW3GKhtKru/L8k/Hd7NFQxyWUeY7Z/KGB2C6Fe3yf2vVi4V9TsCSQ==", + "version": "5.59.5", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.59.5.tgz", + "integrity": "sha512-sCEHOiw+RbyTii9c3/qN74hYDPNORb8yWCoPLmB7BIflhplJ65u2PBpdRla12e3SSTJ2erRkPjz7ngLHhUegxA==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@types/json-schema": "^7.0.9", "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.59.2", - "@typescript-eslint/types": "5.59.2", - "@typescript-eslint/typescript-estree": "5.59.2", + "@typescript-eslint/scope-manager": "5.59.5", + "@typescript-eslint/types": "5.59.5", + "@typescript-eslint/typescript-estree": "5.59.5", "eslint-scope": "^5.1.1", "semver": "^7.3.7" }, @@ -1854,6 +1958,103 @@ "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, + "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/scope-manager": { + "version": "5.59.5", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.59.5.tgz", + "integrity": "sha512-jVecWwnkX6ZgutF+DovbBJirZcAxgxC0EOHYt/niMROf8p4PwxxG32Qdhj/iIQQIuOflLjNkxoXyArkcIP7C3A==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.59.5", + "@typescript-eslint/visitor-keys": "5.59.5" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/types": { + "version": "5.59.5", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.5.tgz", + "integrity": "sha512-xkfRPHbqSH4Ggx4eHRIO/eGL8XL4Ysb4woL8c87YuAo8Md7AUjyWKa9YMwTL519SyDPrfEgKdewjkxNCVeJW7w==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree": { + "version": "5.59.5", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.5.tgz", + "integrity": "sha512-+XXdLN2CZLZcD/mO7mQtJMvCkzRfmODbeSKuMY/yXbGkzvA9rJyDY5qDYNoiz2kP/dmyAxXquL2BvLQLJFPQIg==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.59.5", + "@typescript-eslint/visitor-keys": "5.59.5", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/visitor-keys": { + "version": "5.59.5", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.5.tgz", + "integrity": "sha512-qL+Oz+dbeBRTeyJTIy0eniD3uvqU7x+y1QceBismZ41hd4aBSRh8UAw4pZP0+XzLuPZmx4raNMq/I+59W2lXKA==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.59.5", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/utils/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, "node_modules/@typescript-eslint/visitor-keys": { "version": "5.59.2", "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.2.tgz", @@ -11166,9 +11367,9 @@ } }, "@types/semver": { - "version": "7.3.13", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.13.tgz", - "integrity": "sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==", + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.0.tgz", + "integrity": "sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==", "dev": true }, "@types/serve-static": { @@ -11234,15 +11435,15 @@ } }, "@typescript-eslint/eslint-plugin": { - "version": "5.59.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.59.2.tgz", - "integrity": "sha512-yVrXupeHjRxLDcPKL10sGQ/QlVrA8J5IYOEWVqk0lJaSZP7X5DfnP7Ns3cc74/blmbipQ1htFNVGsHX6wsYm0A==", + "version": "5.59.5", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.59.5.tgz", + "integrity": "sha512-feA9xbVRWJZor+AnLNAr7A8JRWeZqHUf4T9tlP+TN04b05pFVhO5eN7/O93Y/1OUlLMHKbnJisgDURs/qvtqdg==", "dev": true, "requires": { "@eslint-community/regexpp": "^4.4.0", - "@typescript-eslint/scope-manager": "5.59.2", - "@typescript-eslint/type-utils": "5.59.2", - "@typescript-eslint/utils": "5.59.2", + "@typescript-eslint/scope-manager": "5.59.5", + "@typescript-eslint/type-utils": "5.59.5", + "@typescript-eslint/utils": "5.59.5", "debug": "^4.3.4", "grapheme-splitter": "^1.0.4", "ignore": "^5.2.0", @@ -11251,6 +11452,32 @@ "tsutils": "^3.21.0" }, "dependencies": { + "@typescript-eslint/scope-manager": { + "version": "5.59.5", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.59.5.tgz", + "integrity": "sha512-jVecWwnkX6ZgutF+DovbBJirZcAxgxC0EOHYt/niMROf8p4PwxxG32Qdhj/iIQQIuOflLjNkxoXyArkcIP7C3A==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.59.5", + "@typescript-eslint/visitor-keys": "5.59.5" + } + }, + "@typescript-eslint/types": { + "version": "5.59.5", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.5.tgz", + "integrity": "sha512-xkfRPHbqSH4Ggx4eHRIO/eGL8XL4Ysb4woL8c87YuAo8Md7AUjyWKa9YMwTL519SyDPrfEgKdewjkxNCVeJW7w==", + "dev": true + }, + "@typescript-eslint/visitor-keys": { + "version": "5.59.5", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.5.tgz", + "integrity": "sha512-qL+Oz+dbeBRTeyJTIy0eniD3uvqU7x+y1QceBismZ41hd4aBSRh8UAw4pZP0+XzLuPZmx4raNMq/I+59W2lXKA==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.59.5", + "eslint-visitor-keys": "^3.3.0" + } + }, "debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -11308,17 +11535,48 @@ } }, "@typescript-eslint/type-utils": { - "version": "5.59.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.59.2.tgz", - "integrity": "sha512-b1LS2phBOsEy/T381bxkkywfQXkV1dWda/z0PhnIy3bC5+rQWQDS7fk9CSpcXBccPY27Z6vBEuaPBCKCgYezyQ==", + "version": "5.59.5", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.59.5.tgz", + "integrity": "sha512-4eyhS7oGym67/pSxA2mmNq7X164oqDYNnZCUayBwJZIRVvKpBCMBzFnFxjeoDeShjtO6RQBHBuwybuX3POnDqg==", "dev": true, "requires": { - "@typescript-eslint/typescript-estree": "5.59.2", - "@typescript-eslint/utils": "5.59.2", + "@typescript-eslint/typescript-estree": "5.59.5", + "@typescript-eslint/utils": "5.59.5", "debug": "^4.3.4", "tsutils": "^3.21.0" }, "dependencies": { + "@typescript-eslint/types": { + "version": "5.59.5", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.5.tgz", + "integrity": "sha512-xkfRPHbqSH4Ggx4eHRIO/eGL8XL4Ysb4woL8c87YuAo8Md7AUjyWKa9YMwTL519SyDPrfEgKdewjkxNCVeJW7w==", + "dev": true + }, + "@typescript-eslint/typescript-estree": { + "version": "5.59.5", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.5.tgz", + "integrity": "sha512-+XXdLN2CZLZcD/mO7mQtJMvCkzRfmODbeSKuMY/yXbGkzvA9rJyDY5qDYNoiz2kP/dmyAxXquL2BvLQLJFPQIg==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.59.5", + "@typescript-eslint/visitor-keys": "5.59.5", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + } + }, + "@typescript-eslint/visitor-keys": { + "version": "5.59.5", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.5.tgz", + "integrity": "sha512-qL+Oz+dbeBRTeyJTIy0eniD3uvqU7x+y1QceBismZ41hd4aBSRh8UAw4pZP0+XzLuPZmx4raNMq/I+59W2lXKA==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.59.5", + "eslint-visitor-keys": "^3.3.0" + } + }, "debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -11375,19 +11633,77 @@ } }, "@typescript-eslint/utils": { - "version": "5.59.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.59.2.tgz", - "integrity": "sha512-kSuF6/77TZzyGPhGO4uVp+f0SBoYxCDf+lW3GKhtKru/L8k/Hd7NFQxyWUeY7Z/KGB2C6Fe3yf2vVi4V9TsCSQ==", + "version": "5.59.5", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.59.5.tgz", + "integrity": "sha512-sCEHOiw+RbyTii9c3/qN74hYDPNORb8yWCoPLmB7BIflhplJ65u2PBpdRla12e3SSTJ2erRkPjz7ngLHhUegxA==", "dev": true, "requires": { "@eslint-community/eslint-utils": "^4.2.0", "@types/json-schema": "^7.0.9", "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.59.2", - "@typescript-eslint/types": "5.59.2", - "@typescript-eslint/typescript-estree": "5.59.2", + "@typescript-eslint/scope-manager": "5.59.5", + "@typescript-eslint/types": "5.59.5", + "@typescript-eslint/typescript-estree": "5.59.5", "eslint-scope": "^5.1.1", "semver": "^7.3.7" + }, + "dependencies": { + "@typescript-eslint/scope-manager": { + "version": "5.59.5", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.59.5.tgz", + "integrity": "sha512-jVecWwnkX6ZgutF+DovbBJirZcAxgxC0EOHYt/niMROf8p4PwxxG32Qdhj/iIQQIuOflLjNkxoXyArkcIP7C3A==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.59.5", + "@typescript-eslint/visitor-keys": "5.59.5" + } + }, + "@typescript-eslint/types": { + "version": "5.59.5", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.5.tgz", + "integrity": "sha512-xkfRPHbqSH4Ggx4eHRIO/eGL8XL4Ysb4woL8c87YuAo8Md7AUjyWKa9YMwTL519SyDPrfEgKdewjkxNCVeJW7w==", + "dev": true + }, + "@typescript-eslint/typescript-estree": { + "version": "5.59.5", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.5.tgz", + "integrity": "sha512-+XXdLN2CZLZcD/mO7mQtJMvCkzRfmODbeSKuMY/yXbGkzvA9rJyDY5qDYNoiz2kP/dmyAxXquL2BvLQLJFPQIg==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.59.5", + "@typescript-eslint/visitor-keys": "5.59.5", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + } + }, + "@typescript-eslint/visitor-keys": { + "version": "5.59.5", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.5.tgz", + "integrity": "sha512-qL+Oz+dbeBRTeyJTIy0eniD3uvqU7x+y1QceBismZ41hd4aBSRh8UAw4pZP0+XzLuPZmx4raNMq/I+59W2lXKA==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.59.5", + "eslint-visitor-keys": "^3.3.0" + } + }, + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } } }, "@typescript-eslint/visitor-keys": { From 801f25f63885caee6ec1a5cd13ebd55ec6ce49bb Mon Sep 17 00:00:00 2001 From: Edwin Huber Date: Wed, 10 May 2023 08:38:35 +0200 Subject: [PATCH 096/297] updated tests and query parsing for boolean case insensitivity (#1959) --- ChangeLog.md | 1 + .../PredicateModel/BooleanPredicate.ts | 4 +- .../persistence/QueryTranscriber/QPState.ts | 7 +- tests/table/apis/table.entity.query.test.ts | 73 +++++++++++++++++++ 4 files changed, 81 insertions(+), 4 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index 66a7cb588..d629d0deb 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -30,6 +30,7 @@ Table: - Corrected query parsing logic for single boolean terms. - Fixed issue for querying GUIDs using operators other than eq and ne - GUID queries only support persistent storage on legacy (string) format GUIDs for eq and ne operators, other operators will only evaluate newly stored entities. +- Fixed issue with boolean values not being recognized in query if using different cased characters. Queue: diff --git a/src/table/persistence/QueryTranscriber/PredicateModel/BooleanPredicate.ts b/src/table/persistence/QueryTranscriber/PredicateModel/BooleanPredicate.ts index b98cf3beb..096b22106 100644 --- a/src/table/persistence/QueryTranscriber/PredicateModel/BooleanPredicate.ts +++ b/src/table/persistence/QueryTranscriber/PredicateModel/BooleanPredicate.ts @@ -38,7 +38,9 @@ export default class BooleanPredicate implements IPredicate { */ pushValue(taggedToken: TaggedToken, newTokens: TaggedToken[]) { if (taggedToken.type.isValue()) { - newTokens.push(new TaggedToken(taggedToken.token, new ValueToken())); + newTokens.push( + new TaggedToken(taggedToken.token.toLowerCase(), new ValueToken()) + ); } } diff --git a/src/table/persistence/QueryTranscriber/QPState.ts b/src/table/persistence/QueryTranscriber/QPState.ts index c95b26c47..9ffc66488 100644 --- a/src/table/persistence/QueryTranscriber/QPState.ts +++ b/src/table/persistence/QueryTranscriber/QPState.ts @@ -169,8 +169,9 @@ export default class QPState implements IQPState { * @memberof QPState */ isValue(token: string): boolean { + // Is the syntax for other EDM types case sensitive? const match = token.match( - /^true$|^false$|^-?\d+|^guid'|^'|^"|^X'|^binary'|^datetime'/ + /^true$|^false$|^-?\d+|^guid'|^'|^"|^X'|^binary'|^datetime'/i ); if (match !== null && match!.length > 0) { return true; @@ -293,7 +294,7 @@ export default class QPState implements IQPState { * @memberof QPState */ isBooleanValue(token: string): boolean { - const match = token.match(/^true$|^false$/); + const match = token.match(/^true$|^false$/i); if (match !== null && match!.length > 0) { return true; } @@ -309,7 +310,7 @@ export default class QPState implements IQPState { */ isIdentifier(token: string): boolean { const match = token.match( - /^(?!true$)(?!false$)(?!guid')(?!binary')(?!X')(?!datetime')[_a-zA-Z]/ + /^(?!true$)(?!false$)(?!guid')(?!binary')(?!X')(?!datetime')[_a-zA-Z]/i ); if (match !== null && match!.length > 0) { return true; diff --git a/tests/table/apis/table.entity.query.test.ts b/tests/table/apis/table.entity.query.test.ts index 755d98d56..8809e4dd0 100644 --- a/tests/table/apis/table.entity.query.test.ts +++ b/tests/table/apis/table.entity.query.test.ts @@ -1168,4 +1168,77 @@ describe("table Entity APIs test - using Azure/data-tables", () => { await tableClient.deleteTable(); }); + + it("18. should return the correct number of results querying with a boolean field regardless of capitalization, @loki", async () => { + const tableClient = createAzureDataTablesClient( + testLocalAzuriteInstance, + getUniqueName("bool") + ); + const partitionKeyForQueryTest = createUniquePartitionKey("bool"); + const totalItems = 10; + await tableClient.createTable(); + const timestamp = new Date(); + timestamp.setDate(timestamp.getDate() + 1); + for (let i = 0; i < totalItems; i++) { + const myBool: boolean = i % 2 !== 0 ? true : false; + const result = await tableClient.createEntity({ + partitionKey: partitionKeyForQueryTest, + rowKey: `${i}`, + number: i, + myBool + }); + assert.notStrictEqual(result.etag, undefined); + } + const maxPageSize = 10; + let testsCompleted = 0; + // take note of the different whitespacing and query formatting: + const queriesAndExpectedResult = [ + { + queryOptions: { + filter: odata`(PartitionKey eq ${partitionKeyForQueryTest})and(myBool eq True )` + }, + expectedResult: 5 + }, + { + queryOptions: { + filter: odata`(PartitionKey eq ${partitionKeyForQueryTest}) and (myBool eq truE)` + }, + expectedResult: 5 + }, + { + queryOptions: { + filter: odata`(PartitionKey eq ${partitionKeyForQueryTest}) and (myBool eq FALSE)` + }, + expectedResult: 5 + }, + { + queryOptions: { + filter: odata`(PartitionKey eq ${partitionKeyForQueryTest})and (myBool eq faLsE)` + }, + expectedResult: 5 + } + ]; + + for (const queryTest of queriesAndExpectedResult) { + const entities = tableClient.listEntities< + TableEntity<{ number: number }> + >({ + queryOptions: queryTest.queryOptions + }); + let all: TableEntity<{ number: number }>[] = []; + for await (const entity of entities.byPage({ + maxPageSize + })) { + all = [...all, ...entity]; + } + assert.strictEqual( + all.length, + queryTest.expectedResult, + `Failed with query ${queryTest.queryOptions.filter}` + ); + testsCompleted++; + } + assert.strictEqual(testsCompleted, queriesAndExpectedResult.length); + await tableClient.deleteTable(); + }); }); From 8867c18241dee0127a5a47a5b323949d5e27abaa Mon Sep 17 00:00:00 2001 From: Deon <31973188+haodeon@users.noreply.github.com> Date: Thu, 11 May 2023 15:13:03 +1200 Subject: [PATCH 097/297] Fix subStringEnd calculation (#1843) * fix: Calculate subStringEnd properly * Add test for \r\n\r\n batch delete * fix: rawHeaders init in BatchOperation Correctly removes \r line endings after split. Correctly filters out empty lines from array. --- ChangeLog.md | 4 + src/common/batch/BatchOperation.ts | 4 +- src/table/batch/TableBatchSerialization.ts | 4 +- tests/table/unit/deserialization.unit.test.ts | 128 ++++++++++++++++++ .../mock.request.serialization.strings.ts | 8 ++ 5 files changed, 144 insertions(+), 4 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index d629d0deb..a8e7e25ae 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -9,6 +9,10 @@ Blob: - Fixed issue of: blob batch subresponse is slightly different from the on from Azure serivce, which causes exception in CPP SDK. - Fixed issue of: setMetadata API allows invalid metadata name with hyphen. +Table: + +- Fixed issue with headers length when deserializing batch deletes. + ## 2023.03 Version 3.23.0 General: diff --git a/src/common/batch/BatchOperation.ts b/src/common/batch/BatchOperation.ts index 6d3d1dd23..95e6db299 100644 --- a/src/common/batch/BatchOperation.ts +++ b/src/common/batch/BatchOperation.ts @@ -22,10 +22,10 @@ export default class BatchOperation { public jsonRequestBody?: string; // maybe we want the entity operation to be stored in a parsed format? public constructor(_batchType: BatchType, headers: string) { this.batchType = _batchType; - const dirtyHeaderArray = headers.split("\n"); + const dirtyHeaderArray = headers.split("\n").map(line => line.trim()); // filter out the blanks this.rawHeaders = dirtyHeaderArray.filter( - (candidate) => candidate.search(/\S/) < 1 + candidate => candidate ); } } diff --git a/src/table/batch/TableBatchSerialization.ts b/src/table/batch/TableBatchSerialization.ts index af508d6b8..a1d872dfb 100644 --- a/src/table/batch/TableBatchSerialization.ts +++ b/src/table/batch/TableBatchSerialization.ts @@ -109,8 +109,8 @@ export class TableBatchSerialization extends BatchSerialization { subStringEnd = subRequest.indexOf(jsonOperationBody[0]); jsonBody = jsonOperationBody[0]; } else { - // remove 1 \r\n - subStringEnd = subRequest.length - 4; + // trim "\r\n\r\n" or "\n\n" from subRequest + subStringEnd = subRequest.length - (HTTP_LINE_ENDING.length * 2); jsonBody = ""; } diff --git a/tests/table/unit/deserialization.unit.test.ts b/tests/table/unit/deserialization.unit.test.ts index 0a7bcc5d8..4b71355f1 100644 --- a/tests/table/unit/deserialization.unit.test.ts +++ b/tests/table/unit/deserialization.unit.test.ts @@ -506,4 +506,132 @@ describe("batch deserialization unit tests, these are not the API integration te ); done(); }); + + it("deserializes, mock table batch request containing 4 \\n\\n deletes correctly", (done) => { + const requestString = + SerializationRequestMockStrings.BatchFuncToolsDeleteString; + const serializer = new TableBatchSerialization(); + const batchOperationArray = + serializer.deserializeBatchRequest(requestString); + + // First Batch Operation is a Delete. + assert.strictEqual(batchOperationArray[0].batchType, BatchType.table); + assert.strictEqual( + batchOperationArray[0].httpMethod, + "DELETE", + "wrong HTTP Method parsed" + ); + assert.strictEqual( + batchOperationArray[0].path, + "TestHubNameHistory", + "wrong path parsed" + ); + assert.strictEqual( + batchOperationArray[0].uri, + "http://127.0.0.1:10002/devstoreaccount1/TestHubNameHistory(PartitionKey='00000000EDGC5674',RowKey='0000000000000000')", + "wrong url parsed" + ); + assert.strictEqual( + batchOperationArray[0].jsonRequestBody, + "", + "wrong jsonBody parsed" + ); + assert.strictEqual( + batchOperationArray[0].rawHeaders[4], + "If-Match: W/\"datetime'2023-03-17T15%3A06%3A18.3075721Z'\"", + "wrong Etag parsed" + ); + // Third Batch Operation is a Delete + assert.strictEqual(batchOperationArray[2].batchType, BatchType.table); + assert.strictEqual( + batchOperationArray[2].httpMethod, + "DELETE", + "wrong HTTP Method parsed" + ); + assert.strictEqual( + batchOperationArray[2].path, + "TestHubNameHistory", + "wrong path parsed" + ); + assert.strictEqual( + batchOperationArray[2].uri, + "http://127.0.0.1:10002/devstoreaccount1/TestHubNameHistory(PartitionKey='00000000EDGC5674',RowKey='0000000000000002')", + "wrong url parsed" + ); + assert.strictEqual( + batchOperationArray[2].jsonRequestBody, + "", + "wrong jsonBody parsed" + ); + assert.strictEqual( + batchOperationArray[2].rawHeaders[4], + "If-Match: W/\"datetime'2023-03-17T15%3A06%3A18.3075737Z'\"", + "wrong Etag parsed" + ); + done(); + }); + + it("deserializes, mock table batch request containing 2 \\r\\n\\r\\n deletes correctly", (done) => { + const requestString = + SerializationRequestMockStrings.BatchCloudNetDeleteString; + const serializer = new TableBatchSerialization(); + const batchOperationArray = + serializer.deserializeBatchRequest(requestString); + + // First Batch Operation is a Delete. + assert.strictEqual(batchOperationArray[0].batchType, BatchType.table); + assert.strictEqual( + batchOperationArray[0].httpMethod, + "DELETE", + "wrong HTTP Method parsed" + ); + assert.strictEqual( + batchOperationArray[0].path, + "GatewayManagerInventoryTable", + "wrong path parsed" + ); + assert.strictEqual( + batchOperationArray[0].uri, + "http://127.0.0.1:10002/devstoreaccount1/GatewayManagerInventoryTable(PartitionKey='0',RowKey='device_0_device1')", + "wrong url parsed" + ); + assert.strictEqual( + batchOperationArray[0].jsonRequestBody, + "", + "wrong jsonBody parsed" + ); + assert.strictEqual( + batchOperationArray[0].rawHeaders[4], + "If-Match: W/\"datetime'2022-07-19T15%3A36%3A46.297987Z'\"", + "wrong Etag parsed" + ); + // Second Batch Operation is a Delete + assert.strictEqual(batchOperationArray[1].batchType, BatchType.table); + assert.strictEqual( + batchOperationArray[1].httpMethod, + "DELETE", + "wrong HTTP Method parsed" + ); + assert.strictEqual( + batchOperationArray[1].path, + "GatewayManagerInventoryTable", + "wrong path parsed" + ); + assert.strictEqual( + batchOperationArray[1].uri, + "http://127.0.0.1:10002/devstoreaccount1/GatewayManagerInventoryTable(PartitionKey='0',RowKey='devicelocationmap_0_sanjose_0_device1')", + "wrong url parsed" + ); + assert.strictEqual( + batchOperationArray[1].jsonRequestBody, + "", + "wrong jsonBody parsed" + ); + assert.strictEqual( + batchOperationArray[1].rawHeaders[4], + "If-Match: W/\"datetime'2022-07-19T15%3A36%3A46.297103Z'\"", + "wrong Etag parsed" + ); + done(); + }); }); diff --git a/tests/table/unit/mock.request.serialization.strings.ts b/tests/table/unit/mock.request.serialization.strings.ts index 1ca6e35f8..2ecd2d3e6 100644 --- a/tests/table/unit/mock.request.serialization.strings.ts +++ b/tests/table/unit/mock.request.serialization.strings.ts @@ -80,4 +80,12 @@ export default class SerializationRequestMockStrings { public static BatchGoSDKInsertRequestString2: string = // prettier-ignore "--batch_5496aa30-4c31-467f-4a4d-d51307b6f323\r\nContent-Type: multipart/mixed; boundary=changeset_67ee7ecb-8e1d-42ba-5eb8-70569f8a7236\r\n\r\n--changeset_67ee7ecb-8e1d-42ba-5eb8-70569f8a7236\r\nContent-Transfer-Encoding: binary\r\nContent-Type: application/http\r\n\r\nPOST http://127.0.0.1:10002/devstoreaccount1/TestTable?%24format=application%2Fjson%3Bodata%3Dminimalmetadata HTTP/1.1\r\nAccept: application/json;odata=minimalmetadata\r\nContent-Length: 93\r\nContent-Type: application/json\r\nDataserviceversion: 3.0\r\nPrefer: return-no-content\r\nX-Ms-Version: 2019-02-02\r\n\r\n{\"PartitionKey\":\"5cad691a-3fb3-4016-8061-9a18fd8dea4a\",\"RowKey\":\"rkey1\",\"product\":\"product1\"}\r\n--changeset_67ee7ecb-8e1d-42ba-5eb8-70569f8a7236\r\nContent-Transfer-Encoding: binary\r\nContent-Type: application/http\r\n\r\nPOST http://127.0.0.1:10002/devstoreaccount1/TestTable?%24format=application%2Fjson%3Bodata%3Dminimalmetadata HTTP/1.1\r\nAccept: application/json;odata=minimalmetadata\r\nContent-Length: 93\r\nContent-Type: application/json\r\nDataserviceversion: 3.0\r\nPrefer: return-no-content\r\nX-Ms-Version: 2019-02-02\r\n\r\n{\"PartitionKey\":\"5cad691a-3fb3-4016-8061-9a18fd8dea4a\",\"RowKey\":\"rkey2\",\"product\":\"product2\"}\r\n--changeset_67ee7ecb-8e1d-42ba-5eb8-70569f8a7236--\r\n\r\n--batch_5496aa30-4c31-467f-4a4d-d51307b6f323--\r\n"; + + public static BatchFuncToolsDeleteString: string = + // prettier-ingore + "--batch_e6bedae0-33a0-4875-bf7a-dc3963071819\nContent-Type: multipart/mixed; boundary=changeset_f3679e9d-3491-4ba7-95f3-59a8e24cd7bf\n\n--changeset_f3679e9d-3491-4ba7-95f3-59a8e24cd7bf\nContent-Type: application/http\nContent-Transfer-Encoding: binary\n\nDELETE http://127.0.0.1:10002/devstoreaccount1/TestHubNameHistory(PartitionKey='00000000EDGC5674',RowKey='0000000000000000') HTTP/1.1\nAccept: application/json;odata=minimalmetadata\nContent-Type: application/json\nDataServiceVersion: 3.0;\nIf-Match: W/\"datetime'2023-03-17T15%3A06%3A18.3075721Z'\"\n\n--changeset_f3679e9d-3491-4ba7-95f3-59a8e24cd7bf\nContent-Type: application/http\nContent-Transfer-Encoding: binary\n\nDELETE http://127.0.0.1:10002/devstoreaccount1/TestHubNameHistory(PartitionKey='00000000EDGC5674',RowKey='0000000000000001') HTTP/1.1\nAccept: application/json;odata=minimalmetadata\nContent-Type: application/json\nDataServiceVersion: 3.0;\nIf-Match: W/\"datetime'2023-03-17T15%3A06%3A18.3075732Z'\"\n\n--changeset_f3679e9d-3491-4ba7-95f3-59a8e24cd7bf\nContent-Type: application/http\nContent-Transfer-Encoding: binary\n\nDELETE http://127.0.0.1:10002/devstoreaccount1/TestHubNameHistory(PartitionKey='00000000EDGC5674',RowKey='0000000000000002') HTTP/1.1\nAccept: application/json;odata=minimalmetadata\nContent-Type: application/json\nDataServiceVersion: 3.0;\nIf-Match: W/\"datetime'2023-03-17T15%3A06%3A18.3075737Z'\"\n\n--changeset_f3679e9d-3491-4ba7-95f3-59a8e24cd7bf\nContent-Type: application/http\nContent-Transfer-Encoding: binary\n\nDELETE http://127.0.0.1:10002/devstoreaccount1/TestHubNameHistory(PartitionKey='00000000EDGC5674',RowKey='0000000000000003') HTTP/1.1\nAccept: application/json;odata=minimalmetadata\nContent-Type: application/json\nDataServiceVersion: 3.0;\nIf-Match: W/\"datetime'2023-03-17T15%3A06%3A18.3075742Z'\"\n\n--changeset_f3679e9d-3491-4ba7-95f3-59a8e24cd7bf--\n--batch_e6bedae0-33a0-4875-bf7a-dc3963071819--"; + + public static BatchCloudNetDeleteString: string = + // prettier-ingore + "--batch_d5351566-6c65-4b24-b030-a3c1e7c459ab\r\nContent-Type: multipart/mixed; boundary=changeset_a8e76d7b-1421-4226-9e63-0fb67554be26\r\n\r\n--changeset_a8e76d7b-1421-4226-9e63-0fb67554be26\r\nContent-Type: application/http\r\nContent-Transfer-Encoding: binary\r\n\r\nDELETE http://127.0.0.1:10002/devstoreaccount1/GatewayManagerInventoryTable(PartitionKey='0',RowKey='device_0_device1') HTTP/1.1\r\nAccept: application/json;odata=minimalmetadata\r\nContent-Type: application/json\r\nDataServiceVersion: 3.0;\r\nIf-Match: W/\"datetime'2022-07-19T15%3A36%3A46.297987Z'\"\r\n\r\n--changeset_a8e76d7b-1421-4226-9e63-0fb67554be26\r\nContent-Type: application/http\r\nContent-Transfer-Encoding: binary\r\n\r\nDELETE http://127.0.0.1:10002/devstoreaccount1/GatewayManagerInventoryTable(PartitionKey='0',RowKey='devicelocationmap_0_sanjose_0_device1') HTTP/1.1\r\nAccept: application/json;odata=minimalmetadata\r\nContent-Type: application/json\r\nDataServiceVersion: 3.0;\r\nIf-Match: W/\"datetime'2022-07-19T15%3A36%3A46.297103Z'\"\r\n\r\n--changeset_a8e76d7b-1421-4226-9e63-0fb67554be26--\r\n--batch_d5351566-6c65-4b24-b030-a3c1e7c459ab--\r\n"; } From 8728cc81f1f277b9fb8976ae94df7858554664c2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 11 May 2023 17:37:51 +0800 Subject: [PATCH 098/297] Bump eslint from 8.38.0 to 8.40.0 (#1964) Bumps [eslint](https://github.com/eslint/eslint) from 8.38.0 to 8.40.0. - [Release notes](https://github.com/eslint/eslint/releases) - [Changelog](https://github.com/eslint/eslint/blob/main/CHANGELOG.md) - [Commits](https://github.com/eslint/eslint/compare/v8.38.0...v8.40.0) --- updated-dependencies: - dependency-name: eslint dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 103 ++++++++++++++++++++++++---------------------- 1 file changed, 53 insertions(+), 50 deletions(-) diff --git a/package-lock.json b/package-lock.json index e313c8988..930e13f95 100644 --- a/package-lock.json +++ b/package-lock.json @@ -940,14 +940,14 @@ } }, "node_modules/@eslint/eslintrc": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.2.tgz", - "integrity": "sha512-3W4f5tDUra+pA+FzgugqL2pRimUTDJWKr7BINqOpkZrC0uYI0NIc0/JFgBROCU07HR6GieA5m3/rsPIhDmCXTQ==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.3.tgz", + "integrity": "sha512-+5gy6OQfk+xx3q0d6jGZZC3f3KzAkXc/IanVxd1is/VIIziRqqt3ongQz0FiTUXqTk0c7aDB3OaFuKnuSoJicQ==", "dev": true, "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", - "espree": "^9.5.1", + "espree": "^9.5.2", "globals": "^13.19.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", @@ -1037,9 +1037,9 @@ } }, "node_modules/@eslint/js": { - "version": "8.38.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.38.0.tgz", - "integrity": "sha512-IoD2MfUnOV58ghIHCiil01PcohxjbYR/qCxsoC+xNgUwh1EY8jOOrYmu3d3a71+tJJ23uscEV4X2HJWMsPJu4g==", + "version": "8.40.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.40.0.tgz", + "integrity": "sha512-ElyB54bJIhXQYVKjDSvCkPO1iU1tSAeVQJbllWJq1XQSmmA4dgFk8CbiBGpiOPxleE48vDogxCtmMYku4HSVLA==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -4392,15 +4392,15 @@ } }, "node_modules/eslint": { - "version": "8.38.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.38.0.tgz", - "integrity": "sha512-pIdsD2jwlUGf/U38Jv97t8lq6HpaU/G9NKbYmpWpZGw3LdTNhZLbJePqxOXGB5+JEKfOPU/XLxYxFh03nr1KTg==", + "version": "8.40.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.40.0.tgz", + "integrity": "sha512-bvR+TsP9EHL3TqNtj9sCNJVAFK3fBN8Q7g5waghxyRsPLIMwL73XSKnZFK0hk/O2ANC+iAoq6PWMQ+IfBAJIiQ==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.4.0", - "@eslint/eslintrc": "^2.0.2", - "@eslint/js": "8.38.0", + "@eslint/eslintrc": "^2.0.3", + "@eslint/js": "8.40.0", "@humanwhocodes/config-array": "^0.11.8", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", @@ -4410,9 +4410,9 @@ "debug": "^4.3.2", "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.1.1", - "eslint-visitor-keys": "^3.4.0", - "espree": "^9.5.1", + "eslint-scope": "^7.2.0", + "eslint-visitor-keys": "^3.4.1", + "espree": "^9.5.2", "esquery": "^1.4.2", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", @@ -4462,9 +4462,9 @@ } }, "node_modules/eslint-visitor-keys": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.0.tgz", - "integrity": "sha512-HPpKPUBQcAsZOsHAFwTtIKcYlCje62XB7SEAcxjtmW6TD1WVpkS6i6/hOVtTZIl4zGj/mBqpFVGvaDneik+VoQ==", + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz", + "integrity": "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -4575,9 +4575,9 @@ } }, "node_modules/eslint/node_modules/eslint-scope": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", - "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.0.tgz", + "integrity": "sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw==", "dev": true, "dependencies": { "esrecurse": "^4.3.0", @@ -4585,6 +4585,9 @@ }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, "node_modules/eslint/node_modules/estraverse": { @@ -4744,14 +4747,14 @@ } }, "node_modules/espree": { - "version": "9.5.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.1.tgz", - "integrity": "sha512-5yxtHSZXRSW5pvv3hAlXM5+/Oswi1AUFqBmbibKb5s6bp3rGIDkyXU6xCoyuuLhijr4SFwPrXRoZjz0AZDN9tg==", + "version": "9.5.2", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.2.tgz", + "integrity": "sha512-7OASN1Wma5fum5SrNhFMAMJxOUAbhyfQ8dQ//PJaJbNw0URTPWqIghHWt1MmAANKhHZIYOHruW4Kw4ruUWOdGw==", "dev": true, "dependencies": { "acorn": "^8.8.0", "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.0" + "eslint-visitor-keys": "^3.4.1" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -10889,14 +10892,14 @@ "dev": true }, "@eslint/eslintrc": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.2.tgz", - "integrity": "sha512-3W4f5tDUra+pA+FzgugqL2pRimUTDJWKr7BINqOpkZrC0uYI0NIc0/JFgBROCU07HR6GieA5m3/rsPIhDmCXTQ==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.3.tgz", + "integrity": "sha512-+5gy6OQfk+xx3q0d6jGZZC3f3KzAkXc/IanVxd1is/VIIziRqqt3ongQz0FiTUXqTk0c7aDB3OaFuKnuSoJicQ==", "dev": true, "requires": { "ajv": "^6.12.4", "debug": "^4.3.2", - "espree": "^9.5.1", + "espree": "^9.5.2", "globals": "^13.19.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", @@ -10953,9 +10956,9 @@ } }, "@eslint/js": { - "version": "8.38.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.38.0.tgz", - "integrity": "sha512-IoD2MfUnOV58ghIHCiil01PcohxjbYR/qCxsoC+xNgUwh1EY8jOOrYmu3d3a71+tJJ23uscEV4X2HJWMsPJu4g==", + "version": "8.40.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.40.0.tgz", + "integrity": "sha512-ElyB54bJIhXQYVKjDSvCkPO1iU1tSAeVQJbllWJq1XQSmmA4dgFk8CbiBGpiOPxleE48vDogxCtmMYku4HSVLA==", "dev": true }, "@humanwhocodes/config-array": { @@ -13673,15 +13676,15 @@ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" }, "eslint": { - "version": "8.38.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.38.0.tgz", - "integrity": "sha512-pIdsD2jwlUGf/U38Jv97t8lq6HpaU/G9NKbYmpWpZGw3LdTNhZLbJePqxOXGB5+JEKfOPU/XLxYxFh03nr1KTg==", + "version": "8.40.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.40.0.tgz", + "integrity": "sha512-bvR+TsP9EHL3TqNtj9sCNJVAFK3fBN8Q7g5waghxyRsPLIMwL73XSKnZFK0hk/O2ANC+iAoq6PWMQ+IfBAJIiQ==", "dev": true, "requires": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.4.0", - "@eslint/eslintrc": "^2.0.2", - "@eslint/js": "8.38.0", + "@eslint/eslintrc": "^2.0.3", + "@eslint/js": "8.40.0", "@humanwhocodes/config-array": "^0.11.8", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", @@ -13691,9 +13694,9 @@ "debug": "^4.3.2", "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.1.1", - "eslint-visitor-keys": "^3.4.0", - "espree": "^9.5.1", + "eslint-scope": "^7.2.0", + "eslint-visitor-keys": "^3.4.1", + "espree": "^9.5.2", "esquery": "^1.4.2", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", @@ -13787,9 +13790,9 @@ "dev": true }, "eslint-scope": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", - "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.0.tgz", + "integrity": "sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw==", "dev": true, "requires": { "esrecurse": "^4.3.0", @@ -13914,20 +13917,20 @@ } }, "eslint-visitor-keys": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.0.tgz", - "integrity": "sha512-HPpKPUBQcAsZOsHAFwTtIKcYlCje62XB7SEAcxjtmW6TD1WVpkS6i6/hOVtTZIl4zGj/mBqpFVGvaDneik+VoQ==", + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz", + "integrity": "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==", "dev": true }, "espree": { - "version": "9.5.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.1.tgz", - "integrity": "sha512-5yxtHSZXRSW5pvv3hAlXM5+/Oswi1AUFqBmbibKb5s6bp3rGIDkyXU6xCoyuuLhijr4SFwPrXRoZjz0AZDN9tg==", + "version": "9.5.2", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.2.tgz", + "integrity": "sha512-7OASN1Wma5fum5SrNhFMAMJxOUAbhyfQ8dQ//PJaJbNw0URTPWqIghHWt1MmAANKhHZIYOHruW4Kw4ruUWOdGw==", "dev": true, "requires": { "acorn": "^8.8.0", "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.0" + "eslint-visitor-keys": "^3.4.1" } }, "esquery": { From 4b3004cdfa69ae7351d1ab6611a7bbc8a2a93cfb Mon Sep 17 00:00:00 2001 From: Benjamin Pannell <1760260+notheotherben@users.noreply.github.com> Date: Fri, 26 May 2023 07:17:31 +0100 Subject: [PATCH 099/297] fix: Resolve issues with reserved character use in query strings (allowing both interpolation injection and causing evaluation failures) (#1973) * fix: Resolve issues with reserved character use in query strings (allowing both interpolation injection and causing evaluation failures). * chore: Update changelog * Removed a couple trailing spaces --------- Co-authored-by: Edwin Huber --- ChangeLog.md | 1 + .../PredicateModel/StringPredicate.ts | 33 +++++++-- .../QueryTranscriber/StateQueryFinished.ts | 2 +- tests/table/apis/table.entity.query.test.ts | 41 +++++++++++- .../unit/LokiJsQueryTranscriber.unit.test.ts | 67 ++++++++++++------- 5 files changed, 108 insertions(+), 36 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index a8e7e25ae..187f30a76 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -12,6 +12,7 @@ Blob: Table: - Fixed issue with headers length when deserializing batch deletes. +- Fixed issues with the use of backticks in string query predicates. ## 2023.03 Version 3.23.0 diff --git a/src/table/persistence/QueryTranscriber/PredicateModel/StringPredicate.ts b/src/table/persistence/QueryTranscriber/PredicateModel/StringPredicate.ts index d0c22004b..0fb34380d 100644 --- a/src/table/persistence/QueryTranscriber/PredicateModel/StringPredicate.ts +++ b/src/table/persistence/QueryTranscriber/PredicateModel/StringPredicate.ts @@ -40,18 +40,39 @@ export default class StringPredicate implements IPredicate { private pushValue(taggedToken: TaggedToken, newTokens: TaggedToken[]) { if (taggedToken.type.isValue()) { taggedToken.token = - "`" + - // need to convert double apostrope to single + "'" + + // We also need to convert any double apostrophes into their corresponding backslash-escaped variant this.replaceDoubleApostrophes( - taggedToken.token.substring(1, taggedToken.token.length - 1) - ) + - "`"; + // Let's ensure that backslashes (which are valid characters in the OData space) are escaped correctly. + this.escapeReservedCharacters( + taggedToken.token.substring(1, taggedToken.token.length - 1) + )) + + "'"; + newTokens.push(new TaggedToken(taggedToken.token, new ValueToken())); } } + /** + * Ensure that the presence of a '' in the string is converted into the explicit ' (apostrophe) character. + * + * @param {string} token + * @memberof StringPredicate + * @returns {string} + */ private replaceDoubleApostrophes(token: string) { - return token.replace(/(\'\')/g, "'"); + return token.replace(/(\'\')/g, "\\'"); + } + + /** + * Ensures that backticks (which are used to encode the string) + * + * @param {string} token + * @memberof StringPredicate + * @returns {string} + */ + private escapeReservedCharacters(token: string) { + return token.replace(/\\/g, "\\\\"); } /** diff --git a/src/table/persistence/QueryTranscriber/StateQueryFinished.ts b/src/table/persistence/QueryTranscriber/StateQueryFinished.ts index 227d0b496..7f70acda8 100644 --- a/src/table/persistence/QueryTranscriber/StateQueryFinished.ts +++ b/src/table/persistence/QueryTranscriber/StateQueryFinished.ts @@ -29,7 +29,7 @@ export default class StateQueryFinished implements IQPState { const convertedPredicate = taggedPredicate.convertPredicateForLokiJS(); for (const taggedPredicateToken of convertedPredicate.tokenMap.tokens) { predicate += " "; - predicate += taggedPredicateToken.token.replace(/\\/g, "\\\\"); + predicate += taggedPredicateToken.token; } } diff --git a/tests/table/apis/table.entity.query.test.ts b/tests/table/apis/table.entity.query.test.ts index 8809e4dd0..caf81c2c5 100644 --- a/tests/table/apis/table.entity.query.test.ts +++ b/tests/table/apis/table.entity.query.test.ts @@ -973,9 +973,9 @@ describe("table Entity APIs test - using Azure/data-tables", () => { all.forEach((entity) => { assert.ok( entity.partitionKey === `${partitionKeyForQueryTest}3` || - ((entity.partitionKey === `${partitionKeyForQueryTest}1` || - entity.partitionKey === `${partitionKeyForQueryTest}2`) && - entity.rowKey === "1") + ((entity.partitionKey === `${partitionKeyForQueryTest}1` || + entity.partitionKey === `${partitionKeyForQueryTest}2`) && + entity.rowKey === "1") ); }); await tableClient.deleteTable(); @@ -1241,4 +1241,39 @@ describe("table Entity APIs test - using Azure/data-tables", () => { assert.strictEqual(testsCompleted, queriesAndExpectedResult.length); await tableClient.deleteTable(); }); + + it("20. should work when getting special characters, @loki", async () => { + const tableClient = createAzureDataTablesClient( + testLocalAzuriteInstance, + getUniqueName("specialcharactercheck") + ); + + await tableClient.createTable(); + + const partitionKey = createUniquePartitionKey(""); + + // Foo has some special characters + const result1 = await tableClient.createEntity({ + partitionKey: partitionKey, + rowKey: `1`, + foo: "TestVal`", + }); + assert.notStrictEqual(result1.etag, undefined); + + const maxPageSize = 5; + const entities = tableClient.listEntities>({ + queryOptions: { + filter: `PartitionKey eq '${partitionKey}' and foo eq 'TestVal\`'` + } + }); + let all: TableEntity<{ foo: string }>[] = []; + for await (const entity of entities.byPage({ + maxPageSize + })) { + all = [...all, ...entity]; + } + assert.strictEqual(all.length, 1); + + await tableClient.deleteTable(); + }); }); diff --git a/tests/table/unit/LokiJsQueryTranscriber.unit.test.ts b/tests/table/unit/LokiJsQueryTranscriber.unit.test.ts index 442effb9f..f8c98f797 100644 --- a/tests/table/unit/LokiJsQueryTranscriber.unit.test.ts +++ b/tests/table/unit/LokiJsQueryTranscriber.unit.test.ts @@ -11,19 +11,19 @@ describe("LokiJs Query Transcribing unit tests, also ensures backward compatabil }, { originalQuery: "(partitionKey eq 'test')", - expectedQuery: "return ( ( item.properties.partitionKey === `test` ) )" + expectedQuery: "return ( ( item.properties.partitionKey === 'test' ) )" }, { originalQuery: "( partitionKey eq 'test' )", - expectedQuery: "return ( ( item.properties.partitionKey === `test` ) )" + expectedQuery: "return ( ( item.properties.partitionKey === 'test' ) )" }, { originalQuery: "('test' eq partitionKey)", - expectedQuery: "return ( ( `test` === item.properties.partitionKey ) )" + expectedQuery: "return ( ( 'test' === item.properties.partitionKey ) )" }, { originalQuery: "( 'test' eq partitionKey )", - expectedQuery: "return ( ( `test` === item.properties.partitionKey ) )" + expectedQuery: "return ( ( 'test' === item.properties.partitionKey ) )" } ]; @@ -46,7 +46,7 @@ describe("LokiJs Query Transcribing unit tests, also ensures backward compatabil }); it("correctly transcribes a query for a value of type boolean", async () => { - // use the expected response string to compare the reult to. + // use the expected response string to compare the result to. const testArray = [ { originalQuery: "(myBoolean eq false )", @@ -77,7 +77,7 @@ describe("LokiJs Query Transcribing unit tests, also ensures backward compatabil }); it("correctly transcribes a query for a value of type double", async () => { - // use the expected response string to compare the reult to. + // use the expected response string to compare the result to. const testArray = [ { originalQuery: "(myDouble lt 123.01 )", @@ -139,20 +139,35 @@ describe("LokiJs Query Transcribing unit tests, also ensures backward compatabil }); it("correctly transcribes a query for a value of type string", async () => { - // use the expected response string to compare the reult to. + // use the expected response string to compare the result to. const testArray = [ { originalQuery: "(myString eq '123.01' )", - expectedQuery: "return ( ( item.properties.myString === `123.01` ) )" + expectedQuery: "return ( ( item.properties.myString === '123.01' ) )" }, { originalQuery: "( '123.01L' eq myString )", - expectedQuery: "return ( ( `123.01L` === item.properties.myString ) )" + expectedQuery: "return ( ( '123.01L' === item.properties.myString ) )" }, { originalQuery: "( 'I am a string' eq myString )", expectedQuery: - "return ( ( `I am a string` === item.properties.myString ) )" + "return ( ( 'I am a string' === item.properties.myString ) )" + }, + { + originalQuery: "( 'C:\\Windows\\System32' eq myString )", + expectedQuery: + "return ( ( 'C:\\\\Windows\\\\System32' === item.properties.myString ) )" + }, + { + originalQuery: "( 'I am a string with `backticks`' eq myString )", + expectedQuery: + "return ( ( 'I am a string with `backticks`' === item.properties.myString ) )" + }, + { + originalQuery: "( 'I am a string with ${an attempted interpolation escape}' eq myString )", + expectedQuery: + "return ( ( 'I am a string with ${an attempted interpolation escape}' === item.properties.myString ) )" } ]; @@ -175,7 +190,7 @@ describe("LokiJs Query Transcribing unit tests, also ensures backward compatabil }); it("correctly transcribes a query for a value of type integer", async () => { - // use the expected response string to compare the reult to. + // use the expected response string to compare the result to. const testArray = [ { originalQuery: "(myInt eq 123 )", @@ -206,7 +221,7 @@ describe("LokiJs Query Transcribing unit tests, also ensures backward compatabil }); it("correctly transcribes a query for a value of type long", async () => { - // use the expected response string to compare the reult to. + // use the expected response string to compare the result to. const testArray = [ { originalQuery: "(myLong eq 123.01L )", @@ -219,7 +234,7 @@ describe("LokiJs Query Transcribing unit tests, also ensures backward compatabil { originalQuery: "PartitionKey eq 'partition1' and int64Field eq 12345L", expectedQuery: - "return ( item.properties.PartitionKey === `partition1` && item.properties.int64Field === '12345' )" + "return ( item.properties.PartitionKey === 'partition1' && item.properties.int64Field === '12345' )" } ]; @@ -242,7 +257,7 @@ describe("LokiJs Query Transcribing unit tests, also ensures backward compatabil }); it("correctly transcribes a query for a value of type date", async () => { - // use the expected response string to compare the reult to. + // use the expected response string to compare the result to. const timestamp = new Date(); timestamp.setDate(timestamp.getDate() + 1); const newTimeStamp = timestamp.toISOString(); @@ -257,15 +272,15 @@ describe("LokiJs Query Transcribing unit tests, also ensures backward compatabil }, { originalQuery: `PartitionKey eq 'partition1' and number gt 11 and Timestamp lt datetime'${newTimeStamp}'`, - expectedQuery: `return ( item.properties.PartitionKey === \`partition1\` && item.properties.number > 11 && new Date(item.properties.Timestamp).getTime() < new Date('${newTimeStamp}').getTime() )` + expectedQuery: `return ( item.properties.PartitionKey === 'partition1' && item.properties.number > 11 && new Date(item.properties.Timestamp).getTime() < new Date('${newTimeStamp}').getTime() )` }, { originalQuery: `PartitionKey eq 'partition1' and number lt 11 and Timestamp lt datetime'${newTimeStamp}'`, - expectedQuery: `return ( item.properties.PartitionKey === \`partition1\` && item.properties.number < 11 && new Date(item.properties.Timestamp).getTime() < new Date('${newTimeStamp}').getTime() )` + expectedQuery: `return ( item.properties.PartitionKey === 'partition1' && item.properties.number < 11 && new Date(item.properties.Timestamp).getTime() < new Date('${newTimeStamp}').getTime() )` }, { originalQuery: `(PartitionKey eq 'partition1') and (number lt 12) and (Timestamp lt datetime'${newTimeStamp}')`, - expectedQuery: `return ( ( item.properties.PartitionKey === \`partition1\` ) && ( item.properties.number < 12 ) && ( new Date(item.properties.Timestamp).getTime() < new Date('${newTimeStamp}').getTime() ) )` + expectedQuery: `return ( ( item.properties.PartitionKey === 'partition1' ) && ( item.properties.number < 12 ) && ( new Date(item.properties.Timestamp).getTime() < new Date('${newTimeStamp}').getTime() ) )` } ]; @@ -288,12 +303,12 @@ describe("LokiJs Query Transcribing unit tests, also ensures backward compatabil }); it("correctly transcribes a query with multiple predicates", async () => { - // use the expected response string to compare the reult to. + // use the expected response string to compare the result to. const testArray = [ { originalQuery: "(myInt eq 123 ) and (myString eq 'hello')", expectedQuery: - "return ( ( item.properties.myInt === 123 ) && ( item.properties.myString === `hello` ) )" + "return ( ( item.properties.myInt === 123 ) && ( item.properties.myString === 'hello' ) )" } ]; @@ -316,12 +331,12 @@ describe("LokiJs Query Transcribing unit tests, also ensures backward compatabil }); it("correctly transcribes a query with multiple predicates and no brackets", async () => { - // use the expected response string to compare the reult to. + // use the expected response string to compare the result to. const testArray = [ { originalQuery: "PartitionKey eq 'partitionKey' and int32Field eq 54321", expectedQuery: - "return ( item.properties.PartitionKey === `partitionKey` && item.properties.int32Field === 54321 )" + "return ( item.properties.PartitionKey === 'partitionKey' && item.properties.int32Field === 54321 )" } ]; @@ -344,17 +359,17 @@ describe("LokiJs Query Transcribing unit tests, also ensures backward compatabil }); it("correctly transcribes a query for a value of type binary", async () => { - // use the expected response string to compare the reult to. + // use the expected response string to compare the result to. const testArray = [ { originalQuery: `(PartitionKey eq 'part1') and (binaryField eq binary'62696e61727944617461')`, expectedQuery: - "return ( ( item.properties.PartitionKey === `part1` ) && ( item.properties.binaryField === 'YmluYXJ5RGF0YQ==' ) )" + "return ( ( item.properties.PartitionKey === 'part1' ) && ( item.properties.binaryField === 'YmluYXJ5RGF0YQ==' ) )" }, { originalQuery: `(PartitionKey eq 'part1') and (binaryField eq X'62696e61727944617461')`, expectedQuery: - "return ( ( item.properties.PartitionKey === `part1` ) && ( item.properties.binaryField === 'YmluYXJ5RGF0YQ==' ) )" + "return ( ( item.properties.PartitionKey === 'part1' ) && ( item.properties.binaryField === 'YmluYXJ5RGF0YQ==' ) )" } ]; @@ -383,7 +398,7 @@ describe("LokiJs Query Transcribing unit tests, also ensures backward compatabil { originalQuery: "TableName ge 'myTable' and TableName lt 'myTable{'", expectedQuery: - "return ( item.table >= `myTable` && item.table < `myTable{` )" + "return ( item.table >= 'myTable' && item.table < 'myTable{' )" } ]; @@ -411,7 +426,7 @@ describe("LokiJs Query Transcribing unit tests, also ensures backward compatabil originalQuery: "(PartitionKey eq '6e4ab0516fca4122bff05fb23a5f6adf') and (((RowKey eq 'user%2fsomeraondomuser_cf9e6f1fc7264c9c8148d6050e27ee3e') and (ActivationId eq '512b5a68bc1c46b480a1a052da681f45')) or ((RowKey eq 'user%2fsomeraondomuser_267f6d72c0874408a021043138c6e395') and (ActivationId eq 'e195014973754b11ae1b74cb4be9aab1')) or ((RowKey eq 'user%2fsomeraondomuser_34b4d10839ba48928a3ceee0ea6a1175') and (ActivationId eq '4573eccdaf8d42148907fd3b654b72c3')) or ((RowKey eq 'user%2fsomeraondomuser_931d172de3034561af4d210aa4007b8f') and (ActivationId eq 'd3e7ffeb439b4acf912006b2f01aa5a9')) or ((RowKey eq 'user%2fsomeraondomuser_6db90a01fab7429ca52698534629dd5d') and (ActivationId eq '492fe8afa0514a919fc0c491afc88e18')) or ((RowKey eq 'user%2fsomeraondomuser_b4710ac467ea46678d3b692d552b4573') and (ActivationId eq 'ed3a90e556474a4486196d7d20c7e0a8')) or ((RowKey eq 'user%2fsomeraondomuser_9a7d0ed9e934457790c4af955a5d0aa2') and (ActivationId eq 'e6098dd0457a438b8c8810381e72b103')) or ((RowKey eq 'user%2fsomeraondomuser_5f45717f56d14f6ebc1df2d3195609d8') and (ActivationId eq '1001b0b9b2224ab08c9b3e1413e733e3')) or ((RowKey eq 'user%2fsomeraondomuser_593e5eb5533f41998a6946d37748d1c4') and (ActivationId eq '100df8cda69a4101bd038f097073dcf0')) or ((RowKey eq 'user%2fsomeraondomuser_5c837b849f024914b694ebf978129210') and (ActivationId eq 'd4b38859695c4b31892053e2f8f16ce1')) or ((RowKey eq 'user%2fsomeraondomuser_0d59188361ed46b8967ff553fc31da22') and (ActivationId eq 'cc235fce46ca4dcf9c24a12eda86a23e')) or ((RowKey eq 'user%2fsomeraondomuser_46daebbc6d214de1b724a6d1bd909f2e') and (ActivationId eq 'f901237d1de5466bb350013841f7e1d9')) or ((RowKey eq 'user%2fsomeraondomuser_4bf3d38ef9664a17b8acbe6e6f4475e6') and (ActivationId eq '0d8b22f41df443f4956b4cef9ddccc7b')) or ((RowKey eq 'user%2fsomeraondomuser_7d157b7f3a3a4508a182b47394444a97') and (ActivationId eq '391cbd2712e94a10b1e8f7f5566ad1d1')) or ((RowKey eq 'user%2fsomeraondomuser_3173c9fea0124785a6dce8bb1ce22ff5') and (ActivationId eq '5926f7967953443089276d4011de4586')) or ((RowKey eq 'user%2fsomeraondomuser_855b9f1c9b1d4793b633dd312f97acee') and (ActivationId eq 'acbb6b581b604bd9bdb7d8109ad80c25')) or ((RowKey eq 'user%2fsomeraondomuser_0f11694546a049df89c234f5aca29594') and (ActivationId eq '83a8b6c565e74569a3d1f358ae1b4767')) or ((RowKey eq 'user%2fsomeraondomuser_5bd0f86dc2a74ba18848156fd4384fa0') and (ActivationId eq '430dcf95b539468cbfb99886949840b5')) or ((RowKey eq 'user%2fsomeraondomuser_85c207c588dd4c9697a921b29481152b') and (ActivationId eq 'e114211645144d8581b279cc8b780879')) or ((RowKey eq 'user%2fsomeraondomuser_d2d48e3e8e594b7ea755a6df291c55a4') and (ActivationId eq 'a9f50b02fa634628b56622602733d2df')) or ((RowKey eq 'user%2fsomeraondomuser_3f1c4bcf08c34efb8b64a40ee4e33698') and (ActivationId eq 'e7180ac71c6a4fb3b5e68c3a6d3c5ce6')) or ((RowKey eq 'user%2fsomeraondomuser_3871c563cd0e433fbb7d4ebbd6db4856') and (ActivationId eq 'c05eab92d0b44f4b8ea57b6cf9339cc2')) or ((RowKey eq 'user%2fsomeraondomuser_beb39451febe40aa9b51b051a5940b7c') and (ActivationId eq '51998e3e875c4c499f4ebb14bc9a91e6')) or ((RowKey eq 'user%2fsomeraondomuser_1258f93c3b054ee2b80a52f9f9bdc170') and (ActivationId eq 'cb3d1fd19e2d45eeb0ebd9a704e6d576')) or ((RowKey eq 'user%2fsomeraondomuser_b37d9915799047988a1b0598a47f7ba4') and (ActivationId eq '2560bf1bcde5461eb4899ef8ae009a7a')) or ((RowKey eq 'user%2fsomeraondomuser_37a27899265b4125ba98bc7fd2f9c000') and (ActivationId eq '166e0f18cd744666b3684c406493945e')) or ((RowKey eq 'user%2fsomeraondomuser_240b39fd90d94b54b0e923134b4cba55') and (ActivationId eq '329c6825c2754dd3b18411083b7b58e4')) or ((RowKey eq 'user%2fsomeraondomuser_e7c33f051c3c42a8883712e255635bbf') and (ActivationId eq 'f127763cb6374f49bf52b7876e594147')) or ((RowKey eq 'user%2fsomeraondomuser_3d5d8beeafac4b0aa6a146f7f2e5eadb') and (ActivationId eq '6f89c9bda1d74977997b1415db56a21e')) or ((RowKey eq 'user%2fsomeraondomuser_21d9c87ed89646e88be406cb57db4e1c') and (ActivationId eq '640d3e743baa4c969e4292aa80efbac2')) or ((RowKey eq 'user%2fsomeraondomuser_6d71d83c8083415a835943b18b9d6d99') and (ActivationId eq 'd4f8417dab4544ed972b288bae03efa3')) or ((RowKey eq 'user%2fsomeraondomuser_44253ea6cadc4165994fd4501998190b') and (ActivationId eq 'a099990633bb441a852ff00266c372ee')) or ((RowKey eq 'user%2fsomeraondomuser_169185ee08b446ee9a1dd329997f4b50') and (ActivationId eq '6928aeac8dfe4caeb44b275d3765bb9c')) or ((RowKey eq 'user%2fsomeraondomuser_5639229f610444df9ff2c3a598ba5ff3') and (ActivationId eq 'afd94604d549455983d4bb043b9bf4fc')) or ((RowKey eq 'user%2fsomeraondomuser_6e8177f40d924eecad86fe29cf042c5b') and (ActivationId eq 'ef6dff8131634580a05602b12b3c7030')) or ((RowKey eq 'user%2fsomeraondomuser_82c02c372d274b12b42eb613a94f0032') and (ActivationId eq 'c629d8827dec4946918fac970b0b01fc')) or ((RowKey eq 'user%2fsomeraondomuser_82d799f96a8341a888e823e7e6c680aa') and (ActivationId eq '6a430683a6864d518747c5613aae81f7')) or ((RowKey eq 'user%2fsomeraondomuser_eee54678565d4c62b3ee75ff595a639f') and (ActivationId eq '05b779023a86487291c54274f2351763')) or ((RowKey eq 'user%2fsomeraondomuser_d61b2e412be74d449cbe2e32c040b054') and (ActivationId eq 'abd89950074c455eabf0ce6507cff05b')) or ((RowKey eq 'user%2fsomeraondomuser_7d3b47e40a40403bac3c879f8ccc785a') and (ActivationId eq 'f37b30e2b99944ad8951924d890d6514')) or ((RowKey eq 'user%2fsomeraondomuser_fa9e78d2c68447928d3b5bcc7170f112') and (ActivationId eq 'bc9c4dde5ba443dea12137e5da919c41')) or ((RowKey eq 'user%2fsomeraondomuser_3bb66b8c2abb45c8b33e75ce4baa93ac') and (ActivationId eq '49c8905d49bc47bc9fea7d859c7812dd')) or ((RowKey eq 'user%2fsomeraondomuser_55b23534d04c4efe9d580c3740230486') and (ActivationId eq '1322e451d37145f4b1b41559f30b58e9')) or ((RowKey eq 'user%2fsomeraondomuser_8b8d04a70b8f43ab87d065e89d84aefb') and (ActivationId eq '3f7b8e9d039d4d788597d5fe7bb37666')) or ((RowKey eq 'user%2fsomeraondomuser_0d5ec8bb559d4e34a2d4c4b5d935386d') and (ActivationId eq '6eb87695c16f4289b48374a57fcc2bab')) or ((RowKey eq 'user%2fsomeraondomuser_a0ba488c7b0542d49cb2b406a7b3cca4') and (ActivationId eq 'fb20d88f4b6d4193aad4511c8951ef59')) or ((RowKey eq 'user%2fsomeraondomuser_25de238770ab41399d8cbe0343b9d0d3') and (ActivationId eq 'b587806d63324a4084cde9c92af04065')) or ((RowKey eq 'user%2fsomeraondomuser_7688796792e245d0913f050a3a7c6c02') and (ActivationId eq 'd95909aedd96417f945834151d397f51')) or ((RowKey eq 'user%2fsomeraondomuser_72967c3265ce4996b12001ea1814d62f') and (ActivationId eq 'd046ebb2304b4ff0be1c9d5a4c8a8831')) or ((RowKey eq 'user%2fsomeraondomuser_6238575aaee54a628caebb48b44584e5') and (ActivationId eq '6ac73966adb6496cb2a4553c7b9fe8ce')) or ((RowKey eq 'user%2fsomeraondomuser_fb89e80d21ed4b17a850f9021c4b1d2a') and (ActivationId eq '3833b18cabc344dab1dbdbb62c99accd')) or ((RowKey eq 'user%2fsomeraondomuser_f7aa848f4c7243b892fd979326884e3d') and (ActivationId eq '6911fe2a462e44aab8a143603e1af98f')) or ((RowKey eq 'user%2fsomeraondomuser_349234378ad34ec99c3ea00cb9149f80') and (ActivationId eq '62e351ea6ba44be8b45b2cb1a42efea3')) or ((RowKey eq 'user%2fsomeraondomuser_25707be4343f4f89955ea71bb2d75fe2') and (ActivationId eq '757fdf560e6e4fb0acc1d0578bc4bc83')) or ((RowKey eq 'user%2fsomeraondomuser_fdfe656c1e47438286a19ce4147201d1') and (ActivationId eq '5f417d1d6d9c498da973d30a26ac4c0f')) or ((RowKey eq 'user%2fsomeraondomuser_a4d0398c7b004774b638156dba8050b6') and (ActivationId eq '824bfc22f638402c99aa844984bc6814')) or ((RowKey eq 'user%2fsomeraondomuser_744afd919a134feb8167ea55d036a659') and (ActivationId eq 'b3cc18bb13254e95befa49486e7b7b9c')) or ((RowKey eq 'user%2fsomeraondomuser_6c8dbd201e6d4755a505586d669fb639') and (ActivationId eq 'e1aae7d578604f018c757fe76af995dd')) or ((RowKey eq 'user%2fsomeraondomuser_bcc2eecd8f6d4b53b22bc974e6ff5342') and (ActivationId eq '97916e010c614aa9873307d81cda8447')) or ((RowKey eq 'user%2fsomeraondomuser_be43c3586cf341318cee5941dab73f25') and (ActivationId eq 'a4cb2c286df54db89ddfa6a81ae7a4b8')) or ((RowKey eq 'user%2fsomeraondomuser_131c2342fa9f469ab2448122979901b2') and (ActivationId eq 'fb44869a714c49c6964ff7a14be19f77')) or ((RowKey eq 'user%2fsomeraondomuser_c01e6722572449bf9fd84be9911dd293') and (ActivationId eq 'cbfa2c14f69846ce9c3875b22652c5d9')) or ((RowKey eq 'user%2fsomeraondomuser_add4d77de01d455eaded6a1aa09185d2') and (ActivationId eq '6f9fa3a41f574fbebf7abcac08dd04b2')) or ((RowKey eq 'user%2fsomeraondomuser_ce38323206534df6a9764036fa08c6f9') and (ActivationId eq 'c0ec0e42e5fa4c03a5cb760d2c6323f5')) or ((RowKey eq 'user%2fsomeraondomuser_3f1d9bb315f84ef090977234ef50b78d') and (ActivationId eq '9314a7399ee24c039c05a1b242cd7dbd')) or ((RowKey eq 'user%2fsomeraondomuser_21cd31ddb97343d1b519799652af5a9a') and (ActivationId eq 'db93c80c878642f2974ca4589031c59c')) or ((RowKey eq 'user%2fsomeraondomuser_a53b1e377c774e539b9ee17e59d84028') and (ActivationId eq '12f4c570e1774c3f9cd5e9ba53ba24b0')) or ((RowKey eq 'user%2fsomeraondomuser_35629a332fb4418a8285c5a6e5ac1acb') and (ActivationId eq 'c6b4759436d9450aa5d6d06f0d493df3')) or ((RowKey eq 'user%2fsomeraondomuser_1fb4bd8083ed46c2a5a63acbba0f62f2') and (ActivationId eq '70b0af2656c04a7eb357556d5406bad1')) or ((RowKey eq 'user%2fsomeraondomuser_63968d03c6364bf281240cc5f66fa76d') and (ActivationId eq '2cc36dfd68a24892a3125ff93da1466c')) or ((RowKey eq 'user%2fsomeraondomuser_c1dac4848b6f42a2a49a5e74c8e23624') and (ActivationId eq 'bdd07a677e6841809f2580163d41f4cb')) or ((RowKey eq 'user%2fsomeraondomuser_e33ddf101a174c388a5f8b0b0aa589a5') and (ActivationId eq '71520233b5624b188e1f79b7acd64117')) or ((RowKey eq 'user%2fsomeraondomuser_1894548c3c164d88b28aa8ca81eec52e') and (ActivationId eq '4c5ffd05b895460695bb25e2f6445f80')) or ((RowKey eq 'user%2fsomeraondomuser_6072680f29f240cea960b4cb5d760a96') and (ActivationId eq 'a050286a236643bab071993b4816fe24')) or ((RowKey eq 'user%2fsomeraondomuser_530b499f40bc4d94830ac93e7cbf91c7') and (ActivationId eq '0b2848508785441aa8ac1b54ab74d37e')) or ((RowKey eq 'user%2fsomeraondomuser_fec06bded49c45629b38f019b2f2b1b5') and (ActivationId eq '963fb89616d6449fa26df30b0467fd3c')) or ((RowKey eq 'user%2fsomeraondomuser_f3163586cec543669edaa7a6b3dea09c') and (ActivationId eq '400088d1a343455ea5dbccd0e41aa143')) or ((RowKey eq 'user%2fsomeraondomuser_1d8cc8d9f1c149e4800b0982ca098cb4') and (ActivationId eq '1594d642ac864bebb1a24cec9e517fde')) or ((RowKey eq 'user%2fsomeraondomuser_cf63930ad32244e19795d6a36aab026b') and (ActivationId eq '7d79e95eea21479b84b294bb0163ed59')) or ((RowKey eq 'user%2fsomeraondomuser_f1a529712bc04e19b6a53b5900532059') and (ActivationId eq '53873144412d4846adff21d4efc3d83f')) or ((RowKey eq 'user%2fsomeraondomuser_ea51485ea2a145bd89a17c7584100c3a') and (ActivationId eq 'be0e6b64f793467691256ead12aa9232')) or ((RowKey eq 'user%2fsomeraondomuser_e007bb2d411f46dd90f0b1a426e66e93') and (ActivationId eq '1dd8fa52775748b385da70094b8b2094')) or ((RowKey eq 'user%2fsomeraondomuser_9ee4348df9c041ac9eace6ade2d76ecf') and (ActivationId eq '465722690f4f42df8cd602f7197d3be8')) or ((RowKey eq 'user%2fsomeraondomuser_b7307b3c66424fe3b1a7adb04e7477af') and (ActivationId eq '2956c4fbdda74079ba840a40f290cd7d')) or ((RowKey eq 'user%2fsomeraondomuser_92c5168aba054ba4bdf6d12fee1314f6') and (ActivationId eq 'ea1009a1d59d4550bbcb58978aef3cdd')) or ((RowKey eq 'user%2fsomeraondomuser_b454f3f44a0747f59a5b16bad9e468e1') and (ActivationId eq '6308e191701147e4a9a72bc3473fbdb2')) or ((RowKey eq 'user%2fsomeraondomuser_24af472a228f4c38b30b78c4ed9076f8') and (ActivationId eq '3e518a0f7a0f49149422f65c7043caa3')) or ((RowKey eq 'user%2fsomeraondomuser_574ddad0703a4b5d96d9231ab0e42fc7') and (ActivationId eq 'eb2baddcdc334ac3b5d4497b4adbd6a4')) or ((RowKey eq 'user%2fsomeraondomuser_3c772b3dfbab4de09523fd1805cc5ba2') and (ActivationId eq 'c64844c4eee14533b5d5319c25190908')) or ((RowKey eq 'user%2fsomeraondomuser_527e8e5da4d9469f9487af8e2566366d') and (ActivationId eq '461322a278544e90a0df05efdd840c46')) or ((RowKey eq 'user%2fsomeraondomuser_ef61d4ecc9544f5da29145c6f8bcfa9d') and (ActivationId eq '20f8029af34a4c3eaf24df390e89f427')) or ((RowKey eq 'user%2fsomeraondomuser_8678a87f705e41aba41c3925220f23fe') and (ActivationId eq '6cb3b765a2dd48958ef0537826804b4b')) or ((RowKey eq 'user%2fsomeraondomuser_d271d9a5cb354e0691dacaebdb9281f3') and (ActivationId eq '66ac01d677c34f9cae99dfb4cdaa00e5')) or ((RowKey eq 'user%2fsomeraondomuser_5d982fbac181413295310c6c8fc93c5f') and (ActivationId eq 'd94b900aec6249ee9e1856e3805b091b')) or ((RowKey eq 'user%2fsomeraondomuser_81b88cb28e69458d9b80067476f7c1af') and (ActivationId eq '2c53f55e7203418b91a360bdb28e5028')) or ((RowKey eq 'user%2fsomeraondomuser_a7ac9f7d851840579b8db4bf8ac61a7b') and (ActivationId eq '3c55ef4b112b4e4fbefd1df5ea871018')) or ((RowKey eq 'user%2fsomeraondomuser_3c100e76c2f14dcf97146a67a835c702') and (ActivationId eq '4e03bb4eb4364e6fa88f736b561eae82')) or ((RowKey eq 'user%2fsomeraondomuser_ff86a95db64f492d8c23296215ba1d54') and (ActivationId eq '4e29d0707ccb42e3b5b054eec8c040e4')) or ((RowKey eq 'user%2fsomeraondomuser_f443ac2a7bc9433bad7ec2b1c4228ef7') and (ActivationId eq 'b03811e7f6e94158a75912e71edffa06')) or ((RowKey eq 'user%2fsomeraondomuser_9baa6c0b81d34a6d8c9cef39d9a5f4e6') and (ActivationId eq '71cb5917ddf34a5baaf0f78810910a95')))", expectedQuery: - "return ( ( item.properties.PartitionKey === `6e4ab0516fca4122bff05fb23a5f6adf` ) && ( ( ( item.properties.RowKey === `user%2fsomeraondomuser_cf9e6f1fc7264c9c8148d6050e27ee3e` ) && ( item.properties.ActivationId === `512b5a68bc1c46b480a1a052da681f45` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_267f6d72c0874408a021043138c6e395` ) && ( item.properties.ActivationId === `e195014973754b11ae1b74cb4be9aab1` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_34b4d10839ba48928a3ceee0ea6a1175` ) && ( item.properties.ActivationId === `4573eccdaf8d42148907fd3b654b72c3` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_931d172de3034561af4d210aa4007b8f` ) && ( item.properties.ActivationId === `d3e7ffeb439b4acf912006b2f01aa5a9` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_6db90a01fab7429ca52698534629dd5d` ) && ( item.properties.ActivationId === `492fe8afa0514a919fc0c491afc88e18` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_b4710ac467ea46678d3b692d552b4573` ) && ( item.properties.ActivationId === `ed3a90e556474a4486196d7d20c7e0a8` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_9a7d0ed9e934457790c4af955a5d0aa2` ) && ( item.properties.ActivationId === `e6098dd0457a438b8c8810381e72b103` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_5f45717f56d14f6ebc1df2d3195609d8` ) && ( item.properties.ActivationId === `1001b0b9b2224ab08c9b3e1413e733e3` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_593e5eb5533f41998a6946d37748d1c4` ) && ( item.properties.ActivationId === `100df8cda69a4101bd038f097073dcf0` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_5c837b849f024914b694ebf978129210` ) && ( item.properties.ActivationId === `d4b38859695c4b31892053e2f8f16ce1` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_0d59188361ed46b8967ff553fc31da22` ) && ( item.properties.ActivationId === `cc235fce46ca4dcf9c24a12eda86a23e` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_46daebbc6d214de1b724a6d1bd909f2e` ) && ( item.properties.ActivationId === `f901237d1de5466bb350013841f7e1d9` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_4bf3d38ef9664a17b8acbe6e6f4475e6` ) && ( item.properties.ActivationId === `0d8b22f41df443f4956b4cef9ddccc7b` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_7d157b7f3a3a4508a182b47394444a97` ) && ( item.properties.ActivationId === `391cbd2712e94a10b1e8f7f5566ad1d1` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_3173c9fea0124785a6dce8bb1ce22ff5` ) && ( item.properties.ActivationId === `5926f7967953443089276d4011de4586` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_855b9f1c9b1d4793b633dd312f97acee` ) && ( item.properties.ActivationId === `acbb6b581b604bd9bdb7d8109ad80c25` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_0f11694546a049df89c234f5aca29594` ) && ( item.properties.ActivationId === `83a8b6c565e74569a3d1f358ae1b4767` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_5bd0f86dc2a74ba18848156fd4384fa0` ) && ( item.properties.ActivationId === `430dcf95b539468cbfb99886949840b5` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_85c207c588dd4c9697a921b29481152b` ) && ( item.properties.ActivationId === `e114211645144d8581b279cc8b780879` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_d2d48e3e8e594b7ea755a6df291c55a4` ) && ( item.properties.ActivationId === `a9f50b02fa634628b56622602733d2df` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_3f1c4bcf08c34efb8b64a40ee4e33698` ) && ( item.properties.ActivationId === `e7180ac71c6a4fb3b5e68c3a6d3c5ce6` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_3871c563cd0e433fbb7d4ebbd6db4856` ) && ( item.properties.ActivationId === `c05eab92d0b44f4b8ea57b6cf9339cc2` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_beb39451febe40aa9b51b051a5940b7c` ) && ( item.properties.ActivationId === `51998e3e875c4c499f4ebb14bc9a91e6` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_1258f93c3b054ee2b80a52f9f9bdc170` ) && ( item.properties.ActivationId === `cb3d1fd19e2d45eeb0ebd9a704e6d576` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_b37d9915799047988a1b0598a47f7ba4` ) && ( item.properties.ActivationId === `2560bf1bcde5461eb4899ef8ae009a7a` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_37a27899265b4125ba98bc7fd2f9c000` ) && ( item.properties.ActivationId === `166e0f18cd744666b3684c406493945e` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_240b39fd90d94b54b0e923134b4cba55` ) && ( item.properties.ActivationId === `329c6825c2754dd3b18411083b7b58e4` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_e7c33f051c3c42a8883712e255635bbf` ) && ( item.properties.ActivationId === `f127763cb6374f49bf52b7876e594147` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_3d5d8beeafac4b0aa6a146f7f2e5eadb` ) && ( item.properties.ActivationId === `6f89c9bda1d74977997b1415db56a21e` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_21d9c87ed89646e88be406cb57db4e1c` ) && ( item.properties.ActivationId === `640d3e743baa4c969e4292aa80efbac2` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_6d71d83c8083415a835943b18b9d6d99` ) && ( item.properties.ActivationId === `d4f8417dab4544ed972b288bae03efa3` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_44253ea6cadc4165994fd4501998190b` ) && ( item.properties.ActivationId === `a099990633bb441a852ff00266c372ee` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_169185ee08b446ee9a1dd329997f4b50` ) && ( item.properties.ActivationId === `6928aeac8dfe4caeb44b275d3765bb9c` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_5639229f610444df9ff2c3a598ba5ff3` ) && ( item.properties.ActivationId === `afd94604d549455983d4bb043b9bf4fc` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_6e8177f40d924eecad86fe29cf042c5b` ) && ( item.properties.ActivationId === `ef6dff8131634580a05602b12b3c7030` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_82c02c372d274b12b42eb613a94f0032` ) && ( item.properties.ActivationId === `c629d8827dec4946918fac970b0b01fc` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_82d799f96a8341a888e823e7e6c680aa` ) && ( item.properties.ActivationId === `6a430683a6864d518747c5613aae81f7` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_eee54678565d4c62b3ee75ff595a639f` ) && ( item.properties.ActivationId === `05b779023a86487291c54274f2351763` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_d61b2e412be74d449cbe2e32c040b054` ) && ( item.properties.ActivationId === `abd89950074c455eabf0ce6507cff05b` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_7d3b47e40a40403bac3c879f8ccc785a` ) && ( item.properties.ActivationId === `f37b30e2b99944ad8951924d890d6514` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_fa9e78d2c68447928d3b5bcc7170f112` ) && ( item.properties.ActivationId === `bc9c4dde5ba443dea12137e5da919c41` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_3bb66b8c2abb45c8b33e75ce4baa93ac` ) && ( item.properties.ActivationId === `49c8905d49bc47bc9fea7d859c7812dd` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_55b23534d04c4efe9d580c3740230486` ) && ( item.properties.ActivationId === `1322e451d37145f4b1b41559f30b58e9` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_8b8d04a70b8f43ab87d065e89d84aefb` ) && ( item.properties.ActivationId === `3f7b8e9d039d4d788597d5fe7bb37666` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_0d5ec8bb559d4e34a2d4c4b5d935386d` ) && ( item.properties.ActivationId === `6eb87695c16f4289b48374a57fcc2bab` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_a0ba488c7b0542d49cb2b406a7b3cca4` ) && ( item.properties.ActivationId === `fb20d88f4b6d4193aad4511c8951ef59` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_25de238770ab41399d8cbe0343b9d0d3` ) && ( item.properties.ActivationId === `b587806d63324a4084cde9c92af04065` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_7688796792e245d0913f050a3a7c6c02` ) && ( item.properties.ActivationId === `d95909aedd96417f945834151d397f51` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_72967c3265ce4996b12001ea1814d62f` ) && ( item.properties.ActivationId === `d046ebb2304b4ff0be1c9d5a4c8a8831` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_6238575aaee54a628caebb48b44584e5` ) && ( item.properties.ActivationId === `6ac73966adb6496cb2a4553c7b9fe8ce` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_fb89e80d21ed4b17a850f9021c4b1d2a` ) && ( item.properties.ActivationId === `3833b18cabc344dab1dbdbb62c99accd` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_f7aa848f4c7243b892fd979326884e3d` ) && ( item.properties.ActivationId === `6911fe2a462e44aab8a143603e1af98f` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_349234378ad34ec99c3ea00cb9149f80` ) && ( item.properties.ActivationId === `62e351ea6ba44be8b45b2cb1a42efea3` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_25707be4343f4f89955ea71bb2d75fe2` ) && ( item.properties.ActivationId === `757fdf560e6e4fb0acc1d0578bc4bc83` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_fdfe656c1e47438286a19ce4147201d1` ) && ( item.properties.ActivationId === `5f417d1d6d9c498da973d30a26ac4c0f` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_a4d0398c7b004774b638156dba8050b6` ) && ( item.properties.ActivationId === `824bfc22f638402c99aa844984bc6814` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_744afd919a134feb8167ea55d036a659` ) && ( item.properties.ActivationId === `b3cc18bb13254e95befa49486e7b7b9c` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_6c8dbd201e6d4755a505586d669fb639` ) && ( item.properties.ActivationId === `e1aae7d578604f018c757fe76af995dd` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_bcc2eecd8f6d4b53b22bc974e6ff5342` ) && ( item.properties.ActivationId === `97916e010c614aa9873307d81cda8447` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_be43c3586cf341318cee5941dab73f25` ) && ( item.properties.ActivationId === `a4cb2c286df54db89ddfa6a81ae7a4b8` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_131c2342fa9f469ab2448122979901b2` ) && ( item.properties.ActivationId === `fb44869a714c49c6964ff7a14be19f77` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_c01e6722572449bf9fd84be9911dd293` ) && ( item.properties.ActivationId === `cbfa2c14f69846ce9c3875b22652c5d9` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_add4d77de01d455eaded6a1aa09185d2` ) && ( item.properties.ActivationId === `6f9fa3a41f574fbebf7abcac08dd04b2` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_ce38323206534df6a9764036fa08c6f9` ) && ( item.properties.ActivationId === `c0ec0e42e5fa4c03a5cb760d2c6323f5` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_3f1d9bb315f84ef090977234ef50b78d` ) && ( item.properties.ActivationId === `9314a7399ee24c039c05a1b242cd7dbd` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_21cd31ddb97343d1b519799652af5a9a` ) && ( item.properties.ActivationId === `db93c80c878642f2974ca4589031c59c` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_a53b1e377c774e539b9ee17e59d84028` ) && ( item.properties.ActivationId === `12f4c570e1774c3f9cd5e9ba53ba24b0` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_35629a332fb4418a8285c5a6e5ac1acb` ) && ( item.properties.ActivationId === `c6b4759436d9450aa5d6d06f0d493df3` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_1fb4bd8083ed46c2a5a63acbba0f62f2` ) && ( item.properties.ActivationId === `70b0af2656c04a7eb357556d5406bad1` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_63968d03c6364bf281240cc5f66fa76d` ) && ( item.properties.ActivationId === `2cc36dfd68a24892a3125ff93da1466c` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_c1dac4848b6f42a2a49a5e74c8e23624` ) && ( item.properties.ActivationId === `bdd07a677e6841809f2580163d41f4cb` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_e33ddf101a174c388a5f8b0b0aa589a5` ) && ( item.properties.ActivationId === `71520233b5624b188e1f79b7acd64117` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_1894548c3c164d88b28aa8ca81eec52e` ) && ( item.properties.ActivationId === `4c5ffd05b895460695bb25e2f6445f80` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_6072680f29f240cea960b4cb5d760a96` ) && ( item.properties.ActivationId === `a050286a236643bab071993b4816fe24` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_530b499f40bc4d94830ac93e7cbf91c7` ) && ( item.properties.ActivationId === `0b2848508785441aa8ac1b54ab74d37e` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_fec06bded49c45629b38f019b2f2b1b5` ) && ( item.properties.ActivationId === `963fb89616d6449fa26df30b0467fd3c` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_f3163586cec543669edaa7a6b3dea09c` ) && ( item.properties.ActivationId === `400088d1a343455ea5dbccd0e41aa143` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_1d8cc8d9f1c149e4800b0982ca098cb4` ) && ( item.properties.ActivationId === `1594d642ac864bebb1a24cec9e517fde` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_cf63930ad32244e19795d6a36aab026b` ) && ( item.properties.ActivationId === `7d79e95eea21479b84b294bb0163ed59` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_f1a529712bc04e19b6a53b5900532059` ) && ( item.properties.ActivationId === `53873144412d4846adff21d4efc3d83f` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_ea51485ea2a145bd89a17c7584100c3a` ) && ( item.properties.ActivationId === `be0e6b64f793467691256ead12aa9232` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_e007bb2d411f46dd90f0b1a426e66e93` ) && ( item.properties.ActivationId === `1dd8fa52775748b385da70094b8b2094` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_9ee4348df9c041ac9eace6ade2d76ecf` ) && ( item.properties.ActivationId === `465722690f4f42df8cd602f7197d3be8` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_b7307b3c66424fe3b1a7adb04e7477af` ) && ( item.properties.ActivationId === `2956c4fbdda74079ba840a40f290cd7d` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_92c5168aba054ba4bdf6d12fee1314f6` ) && ( item.properties.ActivationId === `ea1009a1d59d4550bbcb58978aef3cdd` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_b454f3f44a0747f59a5b16bad9e468e1` ) && ( item.properties.ActivationId === `6308e191701147e4a9a72bc3473fbdb2` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_24af472a228f4c38b30b78c4ed9076f8` ) && ( item.properties.ActivationId === `3e518a0f7a0f49149422f65c7043caa3` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_574ddad0703a4b5d96d9231ab0e42fc7` ) && ( item.properties.ActivationId === `eb2baddcdc334ac3b5d4497b4adbd6a4` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_3c772b3dfbab4de09523fd1805cc5ba2` ) && ( item.properties.ActivationId === `c64844c4eee14533b5d5319c25190908` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_527e8e5da4d9469f9487af8e2566366d` ) && ( item.properties.ActivationId === `461322a278544e90a0df05efdd840c46` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_ef61d4ecc9544f5da29145c6f8bcfa9d` ) && ( item.properties.ActivationId === `20f8029af34a4c3eaf24df390e89f427` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_8678a87f705e41aba41c3925220f23fe` ) && ( item.properties.ActivationId === `6cb3b765a2dd48958ef0537826804b4b` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_d271d9a5cb354e0691dacaebdb9281f3` ) && ( item.properties.ActivationId === `66ac01d677c34f9cae99dfb4cdaa00e5` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_5d982fbac181413295310c6c8fc93c5f` ) && ( item.properties.ActivationId === `d94b900aec6249ee9e1856e3805b091b` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_81b88cb28e69458d9b80067476f7c1af` ) && ( item.properties.ActivationId === `2c53f55e7203418b91a360bdb28e5028` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_a7ac9f7d851840579b8db4bf8ac61a7b` ) && ( item.properties.ActivationId === `3c55ef4b112b4e4fbefd1df5ea871018` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_3c100e76c2f14dcf97146a67a835c702` ) && ( item.properties.ActivationId === `4e03bb4eb4364e6fa88f736b561eae82` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_ff86a95db64f492d8c23296215ba1d54` ) && ( item.properties.ActivationId === `4e29d0707ccb42e3b5b054eec8c040e4` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_f443ac2a7bc9433bad7ec2b1c4228ef7` ) && ( item.properties.ActivationId === `b03811e7f6e94158a75912e71edffa06` ) ) || ( ( item.properties.RowKey === `user%2fsomeraondomuser_9baa6c0b81d34a6d8c9cef39d9a5f4e6` ) && ( item.properties.ActivationId === `71cb5917ddf34a5baaf0f78810910a95` ) ) ) )" + "return ( ( item.properties.PartitionKey === '6e4ab0516fca4122bff05fb23a5f6adf' ) && ( ( ( item.properties.RowKey === 'user%2fsomeraondomuser_cf9e6f1fc7264c9c8148d6050e27ee3e' ) && ( item.properties.ActivationId === '512b5a68bc1c46b480a1a052da681f45' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_267f6d72c0874408a021043138c6e395' ) && ( item.properties.ActivationId === 'e195014973754b11ae1b74cb4be9aab1' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_34b4d10839ba48928a3ceee0ea6a1175' ) && ( item.properties.ActivationId === '4573eccdaf8d42148907fd3b654b72c3' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_931d172de3034561af4d210aa4007b8f' ) && ( item.properties.ActivationId === 'd3e7ffeb439b4acf912006b2f01aa5a9' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_6db90a01fab7429ca52698534629dd5d' ) && ( item.properties.ActivationId === '492fe8afa0514a919fc0c491afc88e18' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_b4710ac467ea46678d3b692d552b4573' ) && ( item.properties.ActivationId === 'ed3a90e556474a4486196d7d20c7e0a8' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_9a7d0ed9e934457790c4af955a5d0aa2' ) && ( item.properties.ActivationId === 'e6098dd0457a438b8c8810381e72b103' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_5f45717f56d14f6ebc1df2d3195609d8' ) && ( item.properties.ActivationId === '1001b0b9b2224ab08c9b3e1413e733e3' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_593e5eb5533f41998a6946d37748d1c4' ) && ( item.properties.ActivationId === '100df8cda69a4101bd038f097073dcf0' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_5c837b849f024914b694ebf978129210' ) && ( item.properties.ActivationId === 'd4b38859695c4b31892053e2f8f16ce1' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_0d59188361ed46b8967ff553fc31da22' ) && ( item.properties.ActivationId === 'cc235fce46ca4dcf9c24a12eda86a23e' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_46daebbc6d214de1b724a6d1bd909f2e' ) && ( item.properties.ActivationId === 'f901237d1de5466bb350013841f7e1d9' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_4bf3d38ef9664a17b8acbe6e6f4475e6' ) && ( item.properties.ActivationId === '0d8b22f41df443f4956b4cef9ddccc7b' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_7d157b7f3a3a4508a182b47394444a97' ) && ( item.properties.ActivationId === '391cbd2712e94a10b1e8f7f5566ad1d1' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_3173c9fea0124785a6dce8bb1ce22ff5' ) && ( item.properties.ActivationId === '5926f7967953443089276d4011de4586' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_855b9f1c9b1d4793b633dd312f97acee' ) && ( item.properties.ActivationId === 'acbb6b581b604bd9bdb7d8109ad80c25' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_0f11694546a049df89c234f5aca29594' ) && ( item.properties.ActivationId === '83a8b6c565e74569a3d1f358ae1b4767' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_5bd0f86dc2a74ba18848156fd4384fa0' ) && ( item.properties.ActivationId === '430dcf95b539468cbfb99886949840b5' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_85c207c588dd4c9697a921b29481152b' ) && ( item.properties.ActivationId === 'e114211645144d8581b279cc8b780879' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_d2d48e3e8e594b7ea755a6df291c55a4' ) && ( item.properties.ActivationId === 'a9f50b02fa634628b56622602733d2df' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_3f1c4bcf08c34efb8b64a40ee4e33698' ) && ( item.properties.ActivationId === 'e7180ac71c6a4fb3b5e68c3a6d3c5ce6' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_3871c563cd0e433fbb7d4ebbd6db4856' ) && ( item.properties.ActivationId === 'c05eab92d0b44f4b8ea57b6cf9339cc2' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_beb39451febe40aa9b51b051a5940b7c' ) && ( item.properties.ActivationId === '51998e3e875c4c499f4ebb14bc9a91e6' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_1258f93c3b054ee2b80a52f9f9bdc170' ) && ( item.properties.ActivationId === 'cb3d1fd19e2d45eeb0ebd9a704e6d576' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_b37d9915799047988a1b0598a47f7ba4' ) && ( item.properties.ActivationId === '2560bf1bcde5461eb4899ef8ae009a7a' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_37a27899265b4125ba98bc7fd2f9c000' ) && ( item.properties.ActivationId === '166e0f18cd744666b3684c406493945e' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_240b39fd90d94b54b0e923134b4cba55' ) && ( item.properties.ActivationId === '329c6825c2754dd3b18411083b7b58e4' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_e7c33f051c3c42a8883712e255635bbf' ) && ( item.properties.ActivationId === 'f127763cb6374f49bf52b7876e594147' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_3d5d8beeafac4b0aa6a146f7f2e5eadb' ) && ( item.properties.ActivationId === '6f89c9bda1d74977997b1415db56a21e' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_21d9c87ed89646e88be406cb57db4e1c' ) && ( item.properties.ActivationId === '640d3e743baa4c969e4292aa80efbac2' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_6d71d83c8083415a835943b18b9d6d99' ) && ( item.properties.ActivationId === 'd4f8417dab4544ed972b288bae03efa3' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_44253ea6cadc4165994fd4501998190b' ) && ( item.properties.ActivationId === 'a099990633bb441a852ff00266c372ee' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_169185ee08b446ee9a1dd329997f4b50' ) && ( item.properties.ActivationId === '6928aeac8dfe4caeb44b275d3765bb9c' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_5639229f610444df9ff2c3a598ba5ff3' ) && ( item.properties.ActivationId === 'afd94604d549455983d4bb043b9bf4fc' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_6e8177f40d924eecad86fe29cf042c5b' ) && ( item.properties.ActivationId === 'ef6dff8131634580a05602b12b3c7030' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_82c02c372d274b12b42eb613a94f0032' ) && ( item.properties.ActivationId === 'c629d8827dec4946918fac970b0b01fc' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_82d799f96a8341a888e823e7e6c680aa' ) && ( item.properties.ActivationId === '6a430683a6864d518747c5613aae81f7' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_eee54678565d4c62b3ee75ff595a639f' ) && ( item.properties.ActivationId === '05b779023a86487291c54274f2351763' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_d61b2e412be74d449cbe2e32c040b054' ) && ( item.properties.ActivationId === 'abd89950074c455eabf0ce6507cff05b' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_7d3b47e40a40403bac3c879f8ccc785a' ) && ( item.properties.ActivationId === 'f37b30e2b99944ad8951924d890d6514' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_fa9e78d2c68447928d3b5bcc7170f112' ) && ( item.properties.ActivationId === 'bc9c4dde5ba443dea12137e5da919c41' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_3bb66b8c2abb45c8b33e75ce4baa93ac' ) && ( item.properties.ActivationId === '49c8905d49bc47bc9fea7d859c7812dd' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_55b23534d04c4efe9d580c3740230486' ) && ( item.properties.ActivationId === '1322e451d37145f4b1b41559f30b58e9' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_8b8d04a70b8f43ab87d065e89d84aefb' ) && ( item.properties.ActivationId === '3f7b8e9d039d4d788597d5fe7bb37666' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_0d5ec8bb559d4e34a2d4c4b5d935386d' ) && ( item.properties.ActivationId === '6eb87695c16f4289b48374a57fcc2bab' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_a0ba488c7b0542d49cb2b406a7b3cca4' ) && ( item.properties.ActivationId === 'fb20d88f4b6d4193aad4511c8951ef59' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_25de238770ab41399d8cbe0343b9d0d3' ) && ( item.properties.ActivationId === 'b587806d63324a4084cde9c92af04065' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_7688796792e245d0913f050a3a7c6c02' ) && ( item.properties.ActivationId === 'd95909aedd96417f945834151d397f51' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_72967c3265ce4996b12001ea1814d62f' ) && ( item.properties.ActivationId === 'd046ebb2304b4ff0be1c9d5a4c8a8831' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_6238575aaee54a628caebb48b44584e5' ) && ( item.properties.ActivationId === '6ac73966adb6496cb2a4553c7b9fe8ce' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_fb89e80d21ed4b17a850f9021c4b1d2a' ) && ( item.properties.ActivationId === '3833b18cabc344dab1dbdbb62c99accd' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_f7aa848f4c7243b892fd979326884e3d' ) && ( item.properties.ActivationId === '6911fe2a462e44aab8a143603e1af98f' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_349234378ad34ec99c3ea00cb9149f80' ) && ( item.properties.ActivationId === '62e351ea6ba44be8b45b2cb1a42efea3' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_25707be4343f4f89955ea71bb2d75fe2' ) && ( item.properties.ActivationId === '757fdf560e6e4fb0acc1d0578bc4bc83' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_fdfe656c1e47438286a19ce4147201d1' ) && ( item.properties.ActivationId === '5f417d1d6d9c498da973d30a26ac4c0f' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_a4d0398c7b004774b638156dba8050b6' ) && ( item.properties.ActivationId === '824bfc22f638402c99aa844984bc6814' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_744afd919a134feb8167ea55d036a659' ) && ( item.properties.ActivationId === 'b3cc18bb13254e95befa49486e7b7b9c' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_6c8dbd201e6d4755a505586d669fb639' ) && ( item.properties.ActivationId === 'e1aae7d578604f018c757fe76af995dd' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_bcc2eecd8f6d4b53b22bc974e6ff5342' ) && ( item.properties.ActivationId === '97916e010c614aa9873307d81cda8447' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_be43c3586cf341318cee5941dab73f25' ) && ( item.properties.ActivationId === 'a4cb2c286df54db89ddfa6a81ae7a4b8' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_131c2342fa9f469ab2448122979901b2' ) && ( item.properties.ActivationId === 'fb44869a714c49c6964ff7a14be19f77' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_c01e6722572449bf9fd84be9911dd293' ) && ( item.properties.ActivationId === 'cbfa2c14f69846ce9c3875b22652c5d9' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_add4d77de01d455eaded6a1aa09185d2' ) && ( item.properties.ActivationId === '6f9fa3a41f574fbebf7abcac08dd04b2' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_ce38323206534df6a9764036fa08c6f9' ) && ( item.properties.ActivationId === 'c0ec0e42e5fa4c03a5cb760d2c6323f5' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_3f1d9bb315f84ef090977234ef50b78d' ) && ( item.properties.ActivationId === '9314a7399ee24c039c05a1b242cd7dbd' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_21cd31ddb97343d1b519799652af5a9a' ) && ( item.properties.ActivationId === 'db93c80c878642f2974ca4589031c59c' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_a53b1e377c774e539b9ee17e59d84028' ) && ( item.properties.ActivationId === '12f4c570e1774c3f9cd5e9ba53ba24b0' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_35629a332fb4418a8285c5a6e5ac1acb' ) && ( item.properties.ActivationId === 'c6b4759436d9450aa5d6d06f0d493df3' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_1fb4bd8083ed46c2a5a63acbba0f62f2' ) && ( item.properties.ActivationId === '70b0af2656c04a7eb357556d5406bad1' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_63968d03c6364bf281240cc5f66fa76d' ) && ( item.properties.ActivationId === '2cc36dfd68a24892a3125ff93da1466c' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_c1dac4848b6f42a2a49a5e74c8e23624' ) && ( item.properties.ActivationId === 'bdd07a677e6841809f2580163d41f4cb' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_e33ddf101a174c388a5f8b0b0aa589a5' ) && ( item.properties.ActivationId === '71520233b5624b188e1f79b7acd64117' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_1894548c3c164d88b28aa8ca81eec52e' ) && ( item.properties.ActivationId === '4c5ffd05b895460695bb25e2f6445f80' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_6072680f29f240cea960b4cb5d760a96' ) && ( item.properties.ActivationId === 'a050286a236643bab071993b4816fe24' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_530b499f40bc4d94830ac93e7cbf91c7' ) && ( item.properties.ActivationId === '0b2848508785441aa8ac1b54ab74d37e' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_fec06bded49c45629b38f019b2f2b1b5' ) && ( item.properties.ActivationId === '963fb89616d6449fa26df30b0467fd3c' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_f3163586cec543669edaa7a6b3dea09c' ) && ( item.properties.ActivationId === '400088d1a343455ea5dbccd0e41aa143' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_1d8cc8d9f1c149e4800b0982ca098cb4' ) && ( item.properties.ActivationId === '1594d642ac864bebb1a24cec9e517fde' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_cf63930ad32244e19795d6a36aab026b' ) && ( item.properties.ActivationId === '7d79e95eea21479b84b294bb0163ed59' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_f1a529712bc04e19b6a53b5900532059' ) && ( item.properties.ActivationId === '53873144412d4846adff21d4efc3d83f' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_ea51485ea2a145bd89a17c7584100c3a' ) && ( item.properties.ActivationId === 'be0e6b64f793467691256ead12aa9232' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_e007bb2d411f46dd90f0b1a426e66e93' ) && ( item.properties.ActivationId === '1dd8fa52775748b385da70094b8b2094' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_9ee4348df9c041ac9eace6ade2d76ecf' ) && ( item.properties.ActivationId === '465722690f4f42df8cd602f7197d3be8' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_b7307b3c66424fe3b1a7adb04e7477af' ) && ( item.properties.ActivationId === '2956c4fbdda74079ba840a40f290cd7d' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_92c5168aba054ba4bdf6d12fee1314f6' ) && ( item.properties.ActivationId === 'ea1009a1d59d4550bbcb58978aef3cdd' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_b454f3f44a0747f59a5b16bad9e468e1' ) && ( item.properties.ActivationId === '6308e191701147e4a9a72bc3473fbdb2' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_24af472a228f4c38b30b78c4ed9076f8' ) && ( item.properties.ActivationId === '3e518a0f7a0f49149422f65c7043caa3' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_574ddad0703a4b5d96d9231ab0e42fc7' ) && ( item.properties.ActivationId === 'eb2baddcdc334ac3b5d4497b4adbd6a4' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_3c772b3dfbab4de09523fd1805cc5ba2' ) && ( item.properties.ActivationId === 'c64844c4eee14533b5d5319c25190908' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_527e8e5da4d9469f9487af8e2566366d' ) && ( item.properties.ActivationId === '461322a278544e90a0df05efdd840c46' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_ef61d4ecc9544f5da29145c6f8bcfa9d' ) && ( item.properties.ActivationId === '20f8029af34a4c3eaf24df390e89f427' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_8678a87f705e41aba41c3925220f23fe' ) && ( item.properties.ActivationId === '6cb3b765a2dd48958ef0537826804b4b' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_d271d9a5cb354e0691dacaebdb9281f3' ) && ( item.properties.ActivationId === '66ac01d677c34f9cae99dfb4cdaa00e5' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_5d982fbac181413295310c6c8fc93c5f' ) && ( item.properties.ActivationId === 'd94b900aec6249ee9e1856e3805b091b' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_81b88cb28e69458d9b80067476f7c1af' ) && ( item.properties.ActivationId === '2c53f55e7203418b91a360bdb28e5028' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_a7ac9f7d851840579b8db4bf8ac61a7b' ) && ( item.properties.ActivationId === '3c55ef4b112b4e4fbefd1df5ea871018' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_3c100e76c2f14dcf97146a67a835c702' ) && ( item.properties.ActivationId === '4e03bb4eb4364e6fa88f736b561eae82' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_ff86a95db64f492d8c23296215ba1d54' ) && ( item.properties.ActivationId === '4e29d0707ccb42e3b5b054eec8c040e4' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_f443ac2a7bc9433bad7ec2b1c4228ef7' ) && ( item.properties.ActivationId === 'b03811e7f6e94158a75912e71edffa06' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_9baa6c0b81d34a6d8c9cef39d9a5f4e6' ) && ( item.properties.ActivationId === '71cb5917ddf34a5baaf0f78810910a95' ) ) ) )" } ]; From 6b1d5fa36700921cc63169ee91964d42cfef4bd2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 26 May 2023 15:24:52 +0800 Subject: [PATCH 100/297] Bump mysql2 from 3.2.3 to 3.3.2 (#1974) Bumps [mysql2](https://github.com/sidorares/node-mysql2) from 3.2.3 to 3.3.2. - [Release notes](https://github.com/sidorares/node-mysql2/releases) - [Changelog](https://github.com/sidorares/node-mysql2/blob/master/Changelog.md) - [Commits](https://github.com/sidorares/node-mysql2/compare/v3.2.3...v3.3.2) --- updated-dependencies: - dependency-name: mysql2 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 930e13f95..b909fa7ae 100644 --- a/package-lock.json +++ b/package-lock.json @@ -7445,9 +7445,9 @@ "dev": true }, "node_modules/mysql2": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.2.3.tgz", - "integrity": "sha512-aethLO9cSAGba9gOXzNayuyq2GAVTKc3vwr+uETOX1yjUuH6MS6D5ewhUqkaukmtjzrb5C9ML7YmmmRBjQ3r3Q==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.3.2.tgz", + "integrity": "sha512-eAJX3avZcNmVjhm3tWA7PdC0xn5BfEROIyCHDu4L8yr53Ckcj7HmSlUTdCQ6Rhrs3kCgu97dSnodMXO7TGv/Nw==", "dependencies": { "denque": "^2.1.0", "generate-function": "^2.3.1", @@ -15939,9 +15939,9 @@ "dev": true }, "mysql2": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.2.3.tgz", - "integrity": "sha512-aethLO9cSAGba9gOXzNayuyq2GAVTKc3vwr+uETOX1yjUuH6MS6D5ewhUqkaukmtjzrb5C9ML7YmmmRBjQ3r3Q==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.3.2.tgz", + "integrity": "sha512-eAJX3avZcNmVjhm3tWA7PdC0xn5BfEROIyCHDu4L8yr53Ckcj7HmSlUTdCQ6Rhrs3kCgu97dSnodMXO7TGv/Nw==", "requires": { "denque": "^2.1.0", "generate-function": "^2.3.1", From 6330ea759ff34e67c9f59e94a90ff7dfb8251aa2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 26 May 2023 15:25:04 +0800 Subject: [PATCH 101/297] Bump @types/async from 3.2.19 to 3.2.20 (#1944) Bumps [@types/async](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/async) from 3.2.19 to 3.2.20. - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/async) --- updated-dependencies: - dependency-name: "@types/async" dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index b909fa7ae..aa828e6b8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1329,9 +1329,9 @@ "dev": true }, "node_modules/@types/async": { - "version": "3.2.19", - "resolved": "https://registry.npmjs.org/@types/async/-/async-3.2.19.tgz", - "integrity": "sha512-MSgZeRq5H2zm212k1uzlBM/67MTco4O8EFsUmyK96Xg0dOGQMReXKuB9QiBzGz6B0XPWPasjNBbPtMuy3qvtmQ==", + "version": "3.2.20", + "resolved": "https://registry.npmjs.org/@types/async/-/async-3.2.20.tgz", + "integrity": "sha512-6jSBQQugzyX1aWto0CbvOnmxrU9tMoXfA9gc4IrLEtvr3dTwSg5GLGoWiZnGLI6UG/kqpB3JOQKQrqnhUWGKQA==", "dev": true }, "node_modules/@types/bluebird": { @@ -11175,9 +11175,9 @@ "dev": true }, "@types/async": { - "version": "3.2.19", - "resolved": "https://registry.npmjs.org/@types/async/-/async-3.2.19.tgz", - "integrity": "sha512-MSgZeRq5H2zm212k1uzlBM/67MTco4O8EFsUmyK96Xg0dOGQMReXKuB9QiBzGz6B0XPWPasjNBbPtMuy3qvtmQ==", + "version": "3.2.20", + "resolved": "https://registry.npmjs.org/@types/async/-/async-3.2.20.tgz", + "integrity": "sha512-6jSBQQugzyX1aWto0CbvOnmxrU9tMoXfA9gc4IrLEtvr3dTwSg5GLGoWiZnGLI6UG/kqpB3JOQKQrqnhUWGKQA==", "dev": true }, "@types/bluebird": { From fa44e04191e7649dbc4e9d7a9d5391e3657c1ca3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 29 May 2023 09:51:26 +0800 Subject: [PATCH 102/297] Bump @types/vscode from 1.78.0 to 1.78.1 (#1978) Bumps [@types/vscode](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/vscode) from 1.78.0 to 1.78.1. - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/vscode) --- updated-dependencies: - dependency-name: "@types/vscode" dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index aa828e6b8..584f70085 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1577,9 +1577,9 @@ "integrity": "sha512-yeinDVQunb03AEP8luErFcyf/7Lf7AzKCD0NXfgVoGCCQDNpZET8Jgq74oBgqKld3hafLbfzt/3inUdQvaFeXQ==" }, "node_modules/@types/vscode": { - "version": "1.78.0", - "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.78.0.tgz", - "integrity": "sha512-LJZIJpPvKJ0HVQDqfOy6W4sNKUBBwyDu1Bs8chHBZOe9MNuKTJtidgZ2bqjhmmWpUb0TIIqv47BFUcVmAsgaVA==", + "version": "1.78.1", + "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.78.1.tgz", + "integrity": "sha512-wEA+54axejHu7DhcUfnFBan1IqFD1gBDxAFz8LoX06NbNDMRJv/T6OGthOs52yZccasKfN588EyffHWABkR0fg==", "dev": true }, "node_modules/@types/xml2js": { @@ -11423,9 +11423,9 @@ "integrity": "sha512-yeinDVQunb03AEP8luErFcyf/7Lf7AzKCD0NXfgVoGCCQDNpZET8Jgq74oBgqKld3hafLbfzt/3inUdQvaFeXQ==" }, "@types/vscode": { - "version": "1.78.0", - "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.78.0.tgz", - "integrity": "sha512-LJZIJpPvKJ0HVQDqfOy6W4sNKUBBwyDu1Bs8chHBZOe9MNuKTJtidgZ2bqjhmmWpUb0TIIqv47BFUcVmAsgaVA==", + "version": "1.78.1", + "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.78.1.tgz", + "integrity": "sha512-wEA+54axejHu7DhcUfnFBan1IqFD1gBDxAFz8LoX06NbNDMRJv/T6OGthOs52yZccasKfN588EyffHWABkR0fg==", "dev": true }, "@types/xml2js": { From 39c906745c5e10c10fa4f5d20fe9e25a4962c583 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 29 May 2023 10:16:32 +0800 Subject: [PATCH 103/297] Bump tslib from 2.5.0 to 2.5.2 (#1977) Bumps [tslib](https://github.com/Microsoft/tslib) from 2.5.0 to 2.5.2. - [Release notes](https://github.com/Microsoft/tslib/releases) - [Commits](https://github.com/Microsoft/tslib/compare/2.5.0...2.5.2) --- updated-dependencies: - dependency-name: tslib dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 584f70085..53d1f4d3c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9612,9 +9612,9 @@ } }, "node_modules/tslib": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", - "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==" + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.2.tgz", + "integrity": "sha512-5svOrSA2w3iGFDs1HibEVBGbDrAY82bFQ3HZ3ixB+88nsbsWQoKqDRb5UBYAUPEzbBn6dAp5gRNXglySbx1MlA==" }, "node_modules/tsutils": { "version": "3.21.0", @@ -17517,9 +17517,9 @@ } }, "tslib": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", - "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==" + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.2.tgz", + "integrity": "sha512-5svOrSA2w3iGFDs1HibEVBGbDrAY82bFQ3HZ3ixB+88nsbsWQoKqDRb5UBYAUPEzbBn6dAp5gRNXglySbx1MlA==" }, "tsutils": { "version": "3.21.0", From 1d63867fbf442d4241911609ce4f7be9b1f2f9d3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 May 2023 11:14:54 +0800 Subject: [PATCH 104/297] Bump eslint from 8.40.0 to 8.41.0 (#1980) Bumps [eslint](https://github.com/eslint/eslint) from 8.40.0 to 8.41.0. - [Release notes](https://github.com/eslint/eslint/releases) - [Changelog](https://github.com/eslint/eslint/blob/main/CHANGELOG.md) - [Commits](https://github.com/eslint/eslint/compare/v8.40.0...v8.41.0) --- updated-dependencies: - dependency-name: eslint dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 62 +++++++++++++++++++++-------------------------- 1 file changed, 28 insertions(+), 34 deletions(-) diff --git a/package-lock.json b/package-lock.json index 53d1f4d3c..71388ccf2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1037,9 +1037,9 @@ } }, "node_modules/@eslint/js": { - "version": "8.40.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.40.0.tgz", - "integrity": "sha512-ElyB54bJIhXQYVKjDSvCkPO1iU1tSAeVQJbllWJq1XQSmmA4dgFk8CbiBGpiOPxleE48vDogxCtmMYku4HSVLA==", + "version": "8.41.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.41.0.tgz", + "integrity": "sha512-LxcyMGxwmTh2lY9FwHPGWOHmYFCZvbrFCBZL4FzSSsxsRPuhrYUg/49/0KDfW8tnIEaEHtfmn6+NPN+1DqaNmA==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -4392,15 +4392,15 @@ } }, "node_modules/eslint": { - "version": "8.40.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.40.0.tgz", - "integrity": "sha512-bvR+TsP9EHL3TqNtj9sCNJVAFK3fBN8Q7g5waghxyRsPLIMwL73XSKnZFK0hk/O2ANC+iAoq6PWMQ+IfBAJIiQ==", + "version": "8.41.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.41.0.tgz", + "integrity": "sha512-WQDQpzGBOP5IrXPo4Hc0814r4/v2rrIsB0rhT7jtunIalgg6gYXWhRMOejVO8yH21T/FGaxjmFjBMNqcIlmH1Q==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.4.0", "@eslint/eslintrc": "^2.0.3", - "@eslint/js": "8.40.0", + "@eslint/js": "8.41.0", "@humanwhocodes/config-array": "^0.11.8", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", @@ -4420,13 +4420,12 @@ "find-up": "^5.0.0", "glob-parent": "^6.0.2", "globals": "^13.19.0", - "grapheme-splitter": "^1.0.4", + "graphemer": "^1.4.0", "ignore": "^5.2.0", "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "is-path-inside": "^3.0.3", - "js-sdsl": "^4.1.4", "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.4.1", @@ -5696,6 +5695,12 @@ "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", "dev": true }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true + }, "node_modules/growl": { "version": "1.10.5", "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", @@ -6478,16 +6483,6 @@ "resolved": "https://registry.npmjs.org/js-md4/-/js-md4-0.3.2.tgz", "integrity": "sha512-/GDnfQYsltsjRswQhN9fhv3EMw2sCpUdrdxyWDOUK7eyD++r3gRhzgiQgc/x4MAv2i1iuQ4lxO5mvqM3vj4bwA==" }, - "node_modules/js-sdsl": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.3.0.tgz", - "integrity": "sha512-mifzlm2+5nZ+lEcLJMoBK0/IH/bDg8XnJfd/Wq6IP+xoCjLZsTOnV2QpxlVbX9bMnkl5PdEjNtBJ9Cj1NjifhQ==", - "dev": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/js-sdsl" - } - }, "node_modules/js-tokens": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", @@ -10956,9 +10951,9 @@ } }, "@eslint/js": { - "version": "8.40.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.40.0.tgz", - "integrity": "sha512-ElyB54bJIhXQYVKjDSvCkPO1iU1tSAeVQJbllWJq1XQSmmA4dgFk8CbiBGpiOPxleE48vDogxCtmMYku4HSVLA==", + "version": "8.41.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.41.0.tgz", + "integrity": "sha512-LxcyMGxwmTh2lY9FwHPGWOHmYFCZvbrFCBZL4FzSSsxsRPuhrYUg/49/0KDfW8tnIEaEHtfmn6+NPN+1DqaNmA==", "dev": true }, "@humanwhocodes/config-array": { @@ -13676,15 +13671,15 @@ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" }, "eslint": { - "version": "8.40.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.40.0.tgz", - "integrity": "sha512-bvR+TsP9EHL3TqNtj9sCNJVAFK3fBN8Q7g5waghxyRsPLIMwL73XSKnZFK0hk/O2ANC+iAoq6PWMQ+IfBAJIiQ==", + "version": "8.41.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.41.0.tgz", + "integrity": "sha512-WQDQpzGBOP5IrXPo4Hc0814r4/v2rrIsB0rhT7jtunIalgg6gYXWhRMOejVO8yH21T/FGaxjmFjBMNqcIlmH1Q==", "dev": true, "requires": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.4.0", "@eslint/eslintrc": "^2.0.3", - "@eslint/js": "8.40.0", + "@eslint/js": "8.41.0", "@humanwhocodes/config-array": "^0.11.8", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", @@ -13704,13 +13699,12 @@ "find-up": "^5.0.0", "glob-parent": "^6.0.2", "globals": "^13.19.0", - "grapheme-splitter": "^1.0.4", + "graphemer": "^1.4.0", "ignore": "^5.2.0", "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "is-path-inside": "^3.0.3", - "js-sdsl": "^4.1.4", "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.4.1", @@ -14637,6 +14631,12 @@ "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", "dev": true }, + "graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true + }, "growl": { "version": "1.10.5", "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", @@ -15169,12 +15169,6 @@ "resolved": "https://registry.npmjs.org/js-md4/-/js-md4-0.3.2.tgz", "integrity": "sha512-/GDnfQYsltsjRswQhN9fhv3EMw2sCpUdrdxyWDOUK7eyD++r3gRhzgiQgc/x4MAv2i1iuQ4lxO5mvqM3vj4bwA==" }, - "js-sdsl": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.3.0.tgz", - "integrity": "sha512-mifzlm2+5nZ+lEcLJMoBK0/IH/bDg8XnJfd/Wq6IP+xoCjLZsTOnV2QpxlVbX9bMnkl5PdEjNtBJ9Cj1NjifhQ==", - "dev": true - }, "js-tokens": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", From 0352269d792e1e1ddc857324f6b072111c947aaf Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 31 May 2023 16:08:23 +0800 Subject: [PATCH 105/297] Bump winston from 3.8.1 to 3.9.0 (#1983) Bumps [winston](https://github.com/winstonjs/winston) from 3.8.1 to 3.9.0. - [Release notes](https://github.com/winstonjs/winston/releases) - [Changelog](https://github.com/winstonjs/winston/blob/master/CHANGELOG.md) - [Commits](https://github.com/winstonjs/winston/compare/v3.8.1...v3.9.0) --- updated-dependencies: - dependency-name: winston dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 71388ccf2..e90463c60 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9955,10 +9955,11 @@ } }, "node_modules/winston": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/winston/-/winston-3.8.1.tgz", - "integrity": "sha512-r+6YAiCR4uI3N8eQNOg8k3P3PqwAm20cLKlzVD9E66Ch39+LZC+VH1UKf9JemQj2B3QoUHfKD7Poewn0Pr3Y1w==", + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/winston/-/winston-3.9.0.tgz", + "integrity": "sha512-jW51iW/X95BCW6MMtZWr2jKQBP4hV5bIDq9QrIjfDk6Q9QuxvTKEAlpUNAzP+HYHFFCeENhph16s0zEunu4uuQ==", "dependencies": { + "@colors/colors": "1.5.0", "@dabh/diagnostics": "^2.0.2", "async": "^3.2.3", "is-stream": "^2.0.0", @@ -17782,10 +17783,11 @@ } }, "winston": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/winston/-/winston-3.8.1.tgz", - "integrity": "sha512-r+6YAiCR4uI3N8eQNOg8k3P3PqwAm20cLKlzVD9E66Ch39+LZC+VH1UKf9JemQj2B3QoUHfKD7Poewn0Pr3Y1w==", + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/winston/-/winston-3.9.0.tgz", + "integrity": "sha512-jW51iW/X95BCW6MMtZWr2jKQBP4hV5bIDq9QrIjfDk6Q9QuxvTKEAlpUNAzP+HYHFFCeENhph16s0zEunu4uuQ==", "requires": { + "@colors/colors": "1.5.0", "@dabh/diagnostics": "^2.0.2", "async": "^3.2.3", "is-stream": "^2.0.0", From e9735e225bff689a8275f6a146a3626b30256373 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 31 May 2023 17:39:14 +0800 Subject: [PATCH 106/297] Bump mysql2 from 3.3.2 to 3.3.3 (#1982) Bumps [mysql2](https://github.com/sidorares/node-mysql2) from 3.3.2 to 3.3.3. - [Release notes](https://github.com/sidorares/node-mysql2/releases) - [Changelog](https://github.com/sidorares/node-mysql2/blob/master/Changelog.md) - [Commits](https://github.com/sidorares/node-mysql2/compare/v3.3.2...v3.3.3) --- updated-dependencies: - dependency-name: mysql2 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index e90463c60..ca86f2fff 100644 --- a/package-lock.json +++ b/package-lock.json @@ -7440,9 +7440,9 @@ "dev": true }, "node_modules/mysql2": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.3.2.tgz", - "integrity": "sha512-eAJX3avZcNmVjhm3tWA7PdC0xn5BfEROIyCHDu4L8yr53Ckcj7HmSlUTdCQ6Rhrs3kCgu97dSnodMXO7TGv/Nw==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.3.3.tgz", + "integrity": "sha512-MxDQJztArk4JFX1PKVjDhIXRzAmVJfuqZrVU+my6NeYBAA/XZRaDw5q7vga8TNvgyy3Lv3rivBFBBuJFbsdjaw==", "dependencies": { "denque": "^2.1.0", "generate-function": "^2.3.1", @@ -15934,9 +15934,9 @@ "dev": true }, "mysql2": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.3.2.tgz", - "integrity": "sha512-eAJX3avZcNmVjhm3tWA7PdC0xn5BfEROIyCHDu4L8yr53Ckcj7HmSlUTdCQ6Rhrs3kCgu97dSnodMXO7TGv/Nw==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.3.3.tgz", + "integrity": "sha512-MxDQJztArk4JFX1PKVjDhIXRzAmVJfuqZrVU+my6NeYBAA/XZRaDw5q7vga8TNvgyy3Lv3rivBFBBuJFbsdjaw==", "requires": { "denque": "^2.1.0", "generate-function": "^2.3.1", From 1a967563a2dc0a45c974a545d61ab30d73db9908 Mon Sep 17 00:00:00 2001 From: Wei Wei Date: Thu, 1 Jun 2023 17:27:42 +0800 Subject: [PATCH 107/297] [Blob Tag] Phase I - Implement SetTag, GetTag on differenet blob APIs (#1912) * Implement SetTag/GetTag * Refine snapshot support * Support other API to set/get blob tag * Fix comments * Fix Blob SQL failure when run on an empty DB --- ChangeLog.md | 3 + .../OperationAccountSASPermission.ts | 36 ++ .../OperationBlobSASPermission.ts | 16 + src/blob/errors/StorageErrorFactory.ts | 36 ++ src/blob/handlers/AppendBlobHandler.ts | 4 +- src/blob/handlers/BlobHandler.ts | 65 ++- src/blob/handlers/BlockBlobHandler.ts | 7 +- src/blob/handlers/ContainerHandler.ts | 19 +- src/blob/handlers/PageBlobHandler.ts | 5 +- src/blob/persistence/IBlobMetadataStore.ts | 51 +- src/blob/persistence/LokiBlobMetadataStore.ts | 104 +++- src/blob/persistence/SqlBlobMetadataStore.ts | 125 ++++- src/blob/utils/utils.ts | 79 +++ .../persistence/SqlExtentMetadataStore.ts | 2 +- tests/blob/apis/blob.test.ts | 469 +++++++++++++++++- 15 files changed, 1001 insertions(+), 20 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index 187f30a76..6e738113f 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -8,6 +8,9 @@ Blob: - Fixed issue of: blob batch subresponse is slightly different from the on from Azure serivce, which causes exception in CPP SDK. - Fixed issue of: setMetadata API allows invalid metadata name with hyphen. +- Supported rest API GetBlobTag, SetBlobTag. +- Supported set Blob Tags in upload blob, copy blob. +- Supported get Blob Tags (count) in download blob, get blob properties, list blobs. Table: diff --git a/src/blob/authentication/OperationAccountSASPermission.ts b/src/blob/authentication/OperationAccountSASPermission.ts index 0cfb6b916..78cf7dfb5 100644 --- a/src/blob/authentication/OperationAccountSASPermission.ts +++ b/src/blob/authentication/OperationAccountSASPermission.ts @@ -621,4 +621,40 @@ OPERATION_ACCOUNT_SAS_PERMISSIONS.set( ) ); +OPERATION_ACCOUNT_SAS_PERMISSIONS.set( + Operation.Blob_SetTags, + new OperationAccountSASPermission( + AccountSASService.Blob, + AccountSASResourceType.Object, + AccountSASPermission.Tag + ) +); + +OPERATION_ACCOUNT_SAS_PERMISSIONS.set( + Operation.Blob_GetTags, + new OperationAccountSASPermission( + AccountSASService.Blob, + AccountSASResourceType.Object, + AccountSASPermission.Tag + ) +); + +OPERATION_ACCOUNT_SAS_PERMISSIONS.set( + Operation.Service_FilterBlobs, + new OperationAccountSASPermission( + AccountSASService.Blob, + AccountSASResourceType.Object, + AccountSASPermission.Filter + ) +); + +OPERATION_ACCOUNT_SAS_PERMISSIONS.set( + Operation.Container_FilterBlobs, + new OperationAccountSASPermission( + AccountSASService.Blob, + AccountSASResourceType.Container, + AccountSASPermission.Filter + ) +); + export default OPERATION_ACCOUNT_SAS_PERMISSIONS; diff --git a/src/blob/authentication/OperationBlobSASPermission.ts b/src/blob/authentication/OperationBlobSASPermission.ts index c538e20f2..6da16064a 100644 --- a/src/blob/authentication/OperationBlobSASPermission.ts +++ b/src/blob/authentication/OperationBlobSASPermission.ts @@ -274,6 +274,14 @@ OPERATION_BLOB_SAS_BLOB_PERMISSIONS.set( Operation.BlockBlob_GetBlockList, new OperationBlobSASPermission(BlobSASPermission.Read) ); +OPERATION_BLOB_SAS_BLOB_PERMISSIONS.set( + Operation.Blob_SetTags, + new OperationBlobSASPermission(BlobSASPermission.Tag) +); +OPERATION_BLOB_SAS_BLOB_PERMISSIONS.set( + Operation.Blob_GetTags, + new OperationBlobSASPermission(BlobSASPermission.Tag) +); // Blob Service SAS Permissions for container level export const OPERATION_BLOB_SAS_CONTAINER_PERMISSIONS = new Map< @@ -526,3 +534,11 @@ OPERATION_BLOB_SAS_CONTAINER_PERMISSIONS.set( Operation.BlockBlob_GetBlockList, new OperationBlobSASPermission(BlobSASPermission.Read) ); +OPERATION_BLOB_SAS_CONTAINER_PERMISSIONS.set( + Operation.Blob_SetTags, + new OperationBlobSASPermission(BlobSASPermission.Tag) +); +OPERATION_BLOB_SAS_CONTAINER_PERMISSIONS.set( + Operation.Blob_GetTags, + new OperationBlobSASPermission(BlobSASPermission.Tag) +); diff --git a/src/blob/errors/StorageErrorFactory.ts b/src/blob/errors/StorageErrorFactory.ts index 573fe45b6..022e7067a 100644 --- a/src/blob/errors/StorageErrorFactory.ts +++ b/src/blob/errors/StorageErrorFactory.ts @@ -772,4 +772,40 @@ export default class StorageErrorFactory { contextID ); } + + public static getEmptyTagName(contextID: string): StorageError { + return new StorageError( + 400, + "EmptyTagName", + "The name of one of the tag key-value pairs is empty.", + contextID + ); + } + + public static getDuplicateTagNames(contextID: string): StorageError { + return new StorageError( + 400, + "DuplicateTagNames", + "The tags specified contain duplicate names.", + contextID + ); + } + + public static getTagsTooLarge(contextID: string): StorageError { + return new StorageError( + 400, + "TagsTooLarge", + "The tags specified exceed the maximum permissible limit.", + contextID + ); + } + + public static getInvalidTag(contextID: string): StorageError { + return new StorageError( + 400, + "DuplicateTagNames", + "The tags specified are invalid. It contains characters that are not permitted.", + contextID + ); + } } diff --git a/src/blob/handlers/AppendBlobHandler.ts b/src/blob/handlers/AppendBlobHandler.ts index 129a880d1..a15930324 100644 --- a/src/blob/handlers/AppendBlobHandler.ts +++ b/src/blob/handlers/AppendBlobHandler.ts @@ -13,6 +13,7 @@ import { MAX_APPEND_BLOB_BLOCK_COUNT, MAX_APPEND_BLOB_BLOCK_SIZE } from "../utils/constants"; +import { getTagsFromString } from "../utils/utils"; import BaseHandler from "./BaseHandler"; export default class AppendBlobHandler extends BaseHandler @@ -71,7 +72,8 @@ export default class AppendBlobHandler extends BaseHandler }, snapshot: "", isCommitted: true, - committedBlocksInOrder: [] + committedBlocksInOrder: [], + blobTags: options.blobTagsString === undefined ? undefined : getTagsFromString(options.blobTagsString, context.contextId!), }; await this.metadataStore.createBlob( diff --git a/src/blob/handlers/BlobHandler.ts b/src/blob/handlers/BlobHandler.ts index 4770426d5..1087138e8 100644 --- a/src/blob/handlers/BlobHandler.ts +++ b/src/blob/handlers/BlobHandler.ts @@ -27,7 +27,9 @@ import { } from "../utils/constants"; import { deserializePageBlobRangeHeader, - deserializeRangeHeader + deserializeRangeHeader, + getBlobTagsCount, + validateBlobTag } from "../utils/utils"; import BaseHandler from "./BaseHandler"; import IPageBlobRangesManager from "./IPageBlobRangesManager"; @@ -151,6 +153,7 @@ export default class BlobHandler extends BaseHandler implements IBlobHandler { contentEncoding: context.request!.getQuery("rsce") ?? res.properties.contentEncoding, contentLanguage: context.request!.getQuery("rscl") ?? res.properties.contentLanguage, contentType: context.request!.getQuery("rsct") ?? res.properties.contentType, + tagCount: res.properties.tagCount, }; return response; @@ -1096,6 +1099,7 @@ export default class BlobHandler extends BaseHandler implements IBlobHandler { contentLength, contentRange, contentMD5, + tagCount: getBlobTagsCount(blob.blobTags), isServerEncrypted: true, clientRequestId: options.requestId, creationTime:blob.properties.creationTime, @@ -1226,6 +1230,7 @@ export default class BlobHandler extends BaseHandler implements IBlobHandler { contentRange, contentMD5, blobContentMD5: blob.properties.contentMD5, + tagCount: getBlobTagsCount(blob.blobTags), isServerEncrypted: true, creationTime:blob.properties.creationTime, clientRequestId: options.requestId @@ -1245,13 +1250,67 @@ export default class BlobHandler extends BaseHandler implements IBlobHandler { options: Models.BlobGetTagsOptionalParams, context: Context ): Promise { - throw new NotImplementedError(context.contextId); + const blobCtx = new BlobStorageContext(context); + const account = blobCtx.account!; + const container = blobCtx.container!; + const blob = blobCtx.blob!; + const tags = await this.metadataStore.getBlobTag( + context, + account, + container, + blob, + options.snapshot, + options.leaseAccessConditions, + options.modifiedAccessConditions + ); + + const response: Models.BlobGetTagsResponse = { + statusCode: 200, + blobTagSet: tags === undefined ? []: tags.blobTagSet, + requestId: context.contextId, + version: BLOB_API_VERSION, + date: context.startTime, + clientRequestId: options.requestId, + }; + + return response; } public async setTags( options: Models.BlobSetTagsOptionalParams, context: Context ): Promise { - throw new NotImplementedError(context.contextId); + const blobCtx = new BlobStorageContext(context); + const account = blobCtx.account!; + const container = blobCtx.container!; + const blob = blobCtx.blob!; + + // Blob Tags need to set + const tags = options.tags; + validateBlobTag(tags!, context.contextId!); + + // Get snapshot (swagger not defined snapshot as parameter, but server support set tag on blob snapshot) + let snapshot = context.request!.getQuery("snapshot"); + + await this.metadataStore.setBlobTag( + context, + account, + container, + blob, + snapshot, + options.leaseAccessConditions, + tags, + options.modifiedAccessConditions + ); + + const response: Models.BlobSetTagsResponse = { + statusCode: 204, + requestId: context.contextId, + date: context.startTime, + version: BLOB_API_VERSION, + clientRequestId: options.requestId + }; + + return response; } } diff --git a/src/blob/handlers/BlockBlobHandler.ts b/src/blob/handlers/BlockBlobHandler.ts index cd2ee32e5..b80951b62 100644 --- a/src/blob/handlers/BlockBlobHandler.ts +++ b/src/blob/handlers/BlockBlobHandler.ts @@ -14,6 +14,7 @@ import { parseXML } from "../generated/utils/xml"; import { BlobModel, BlockModel } from "../persistence/IBlobMetadataStore"; import { BLOB_API_VERSION } from "../utils/constants"; import BaseHandler from "./BaseHandler"; +import { getTagsFromString } from "../utils/utils"; /** * BlobHandler handles Azure Storage BlockBlob related requests. @@ -121,7 +122,8 @@ export default class BlockBlobHandler }, snapshot: "", isCommitted: true, - persistency + persistency, + blobTags: options.blobTagsString === undefined ? undefined : getTagsFromString(options.blobTagsString, context.contextId!), }; if (options.tier !== undefined) { @@ -322,7 +324,8 @@ export default class BlockBlobHandler accountName, containerName, name: blobName, - snapshot: "", + snapshot: "", + blobTags: options.blobTagsString === undefined ? undefined : getTagsFromString(options.blobTagsString, context.contextId!), properties: { lastModified: context.startTime!, creationTime: context.startTime!, diff --git a/src/blob/handlers/ContainerHandler.ts b/src/blob/handlers/ContainerHandler.ts index 9d639da5e..108af5f05 100644 --- a/src/blob/handlers/ContainerHandler.ts +++ b/src/blob/handlers/ContainerHandler.ts @@ -16,7 +16,7 @@ import { EMULATOR_ACCOUNT_SKUNAME } from "../utils/constants"; import { DEFAULT_LIST_BLOBS_MAX_RESULTS } from "../utils/constants"; -import { removeQuotationFromListBlobEtag } from "../utils/utils"; +import { getBlobTagsCount, removeQuotationFromListBlobEtag } from "../utils/utils"; import BaseHandler from "./BaseHandler"; import { BlobBatchHandler } from "./BlobBatchHandler"; @@ -601,6 +601,7 @@ export default class ContainerHandler extends BaseHandler options.marker = options.marker || ""; let includeSnapshots: boolean = false; let includeUncommittedBlobs: boolean = false; + let includeTags: boolean = false; if (options.include !== undefined) { options.include.forEach(element => { if (Models.ListBlobsIncludeItem.Snapshots.toLowerCase() === element.toLowerCase()) { @@ -609,8 +610,10 @@ export default class ContainerHandler extends BaseHandler if (Models.ListBlobsIncludeItem.Uncommittedblobs.toLowerCase() === element.toLowerCase()) { includeUncommittedBlobs = true; } - } - ) + if (Models.ListBlobsIncludeItem.Tags.toLowerCase() === element.toLowerCase()) { + includeTags = true; + } + }) } if ( options.maxresults === undefined || @@ -650,9 +653,11 @@ export default class ContainerHandler extends BaseHandler ...item, deleted: item.deleted !== true ? undefined : true, snapshot: item.snapshot || undefined, + blobTags: includeTags? item.blobTags: undefined, properties: { ...item.properties, etag: removeQuotationFromListBlobEtag(item.properties.etag), + tagCount: getBlobTagsCount(item.blobTags), accessTierInferred: item.properties.accessTierInferred === true ? true : undefined } @@ -696,6 +701,7 @@ export default class ContainerHandler extends BaseHandler options.marker = options.marker || ""; let includeSnapshots: boolean = false; let includeUncommittedBlobs: boolean = false; + let includeTags: boolean = false; if (options.include !== undefined) { options.include.forEach(element => { if (Models.ListBlobsIncludeItem.Snapshots.toLowerCase() === element.toLowerCase()) { @@ -704,6 +710,9 @@ export default class ContainerHandler extends BaseHandler if (Models.ListBlobsIncludeItem.Uncommittedblobs.toLowerCase() === element.toLowerCase()) { includeUncommittedBlobs = true; } + if (Models.ListBlobsIncludeItem.Tags.toLowerCase() === element.toLowerCase()) { + includeTags = true; + } } ) } @@ -746,10 +755,12 @@ export default class ContainerHandler extends BaseHandler item.deleted = item.deleted !== true ? undefined : true; return { ...item, - snapshot: item.snapshot || undefined, + snapshot: item.snapshot || undefined, + blobTags: includeTags? item.blobTags: undefined, properties: { ...item.properties, etag: removeQuotationFromListBlobEtag(item.properties.etag), + tagCount: getBlobTagsCount(item.blobTags), accessTierInferred: item.properties.accessTierInferred === true ? true : undefined } diff --git a/src/blob/handlers/PageBlobHandler.ts b/src/blob/handlers/PageBlobHandler.ts index 416ec8674..51ec16eaa 100644 --- a/src/blob/handlers/PageBlobHandler.ts +++ b/src/blob/handlers/PageBlobHandler.ts @@ -13,7 +13,7 @@ import IBlobMetadataStore, { BlobModel } from "../persistence/IBlobMetadataStore"; import { BLOB_API_VERSION } from "../utils/constants"; -import { deserializePageBlobRangeHeader } from "../utils/utils"; +import { deserializePageBlobRangeHeader, getTagsFromString } from "../utils/utils"; import BaseHandler from "./BaseHandler"; import IPageBlobRangesManager from "./IPageBlobRangesManager"; @@ -136,7 +136,8 @@ export default class PageBlobHandler extends BaseHandler }, snapshot: "", isCommitted: true, - pageRangesInOrder: [] + pageRangesInOrder: [], + blobTags: options.blobTagsString === undefined ? undefined : getTagsFromString(options.blobTagsString, context.contextId!), }; // TODO: What's happens when create page blob right before commit block list? Or should we lock diff --git a/src/blob/persistence/IBlobMetadataStore.ts b/src/blob/persistence/IBlobMetadataStore.ts index 429340c78..12d91ca7d 100644 --- a/src/blob/persistence/IBlobMetadataStore.ts +++ b/src/blob/persistence/IBlobMetadataStore.ts @@ -1,3 +1,4 @@ +import { BlobTags } from "@azure/storage-blob"; import ICleaner from "../../common/ICleaner"; import IDataStore from "../../common/IDataStore"; import IGCExtentProvider from "../../common/IGCExtentProvider"; @@ -1077,7 +1078,55 @@ export interface IBlobMetadataStore listUncommittedBlockPersistencyChunks( marker?: string, maxResults?: number - ): Promise<[IExtentChunk[], string | undefined]>; + ): Promise<[IExtentChunk[], string | undefined]>; + + /** + * Set blob tags. + * + * @param {Context} context + * @param {string} account + * @param {string} container + * @param {string} blob + * @param {(string | undefined)} snapshot + * @param {(Models.LeaseAccessConditions | undefined)} leaseAccessConditions + * @param {(Models.BlobMetadata | undefined)} metadata + * @param {Models.ModifiedAccessConditions} [modifiedAccessConditions] + * @returns {Promise} + * @memberof IBlobMetadataStore + */ + setBlobTag( + context: Context, + account: string, + container: string, + blob: string, + snapshot: string | undefined, + leaseAccessConditions: Models.LeaseAccessConditions | undefined, + tags: Models.BlobTags | undefined, + modifiedAccessConditions?: Models.ModifiedAccessConditions + ): Promise; + + /** + * Get blob tags. + * + * @param {Context} context + * @param {string} account + * @param {string} container + * @param {string} blob + * @param {(string | undefined)} snapshot + * @param {(Models.LeaseAccessConditions | undefined)} leaseAccessConditions + * @param {Models.ModifiedAccessConditions} [modifiedAccessConditions] + * @returns {Promise} + * @memberof IBlobMetadataStore + */ + getBlobTag( + context: Context, + account: string, + container: string, + blob: string, + snapshot: string | undefined, + leaseAccessConditions: Models.LeaseAccessConditions | undefined, + modifiedAccessConditions?: Models.ModifiedAccessConditions + ): Promise; } export default IBlobMetadataStore; diff --git a/src/blob/persistence/LokiBlobMetadataStore.ts b/src/blob/persistence/LokiBlobMetadataStore.ts index b7ecb7658..a425badbc 100644 --- a/src/blob/persistence/LokiBlobMetadataStore.ts +++ b/src/blob/persistence/LokiBlobMetadataStore.ts @@ -62,6 +62,7 @@ import IBlobMetadataStore, { SetContainerAccessPolicyOptions } from "./IBlobMetadataStore"; import PageWithDelimiter from "./PageWithDelimiter"; +import { getBlobTagsCount, getTagsFromString } from "../utils/utils"; /** * This is a metadata source implementation for blob based on loki DB. @@ -1037,6 +1038,7 @@ export default class LokiBlobMetadataStore snapshot: snapshotTime, properties: { ...doc.properties }, metadata: metadata ? { ...metadata } : { ...doc.metadata }, + blobTags: doc.blobTags, accountName: doc.accountName, containerName: doc.containerName, pageRangesInOrder: @@ -1198,6 +1200,8 @@ export default class LokiBlobMetadataStore context ); + doc.properties.tagCount = getBlobTagsCount(doc.blobTags); + return { properties: doc.properties, metadata: doc.metadata, @@ -1912,7 +1916,8 @@ export default class LokiBlobMetadataStore leaseBreakTime: destBlob !== undefined ? destBlob.leaseBreakTime : undefined, committedBlocksInOrder: sourceBlob.committedBlocksInOrder, - persistency: sourceBlob.persistency + persistency: sourceBlob.persistency, + blobTags: options.blobTagsString === undefined ? undefined : getTagsFromString(options.blobTagsString, context.contextId!) }; if ( @@ -2098,7 +2103,8 @@ export default class LokiBlobMetadataStore leaseBreakTime: destBlob !== undefined ? destBlob.leaseBreakTime : undefined, committedBlocksInOrder: sourceBlob.committedBlocksInOrder, - persistency: sourceBlob.persistency + persistency: sourceBlob.persistency, + blobTags: options.blobTagsString === undefined ? undefined : getTagsFromString(options.blobTagsString, context.contextId!) }; if ( @@ -2505,6 +2511,7 @@ export default class LokiBlobMetadataStore doc.properties.contentEncoding = blob.properties.contentEncoding; doc.properties.contentLanguage = blob.properties.contentLanguage; doc.properties.contentDisposition = blob.properties.contentDisposition; + doc.blobTags = blob.blobTags; doc.properties.contentLength = selectedBlockList .map((block) => block.size) .reduce((total, val) => { @@ -3299,6 +3306,99 @@ export default class LokiBlobMetadataStore return doc; } + /** + * Set blob tags. + * + * @param {Context} context + * @param {string} account + * @param {string} container + * @param {string} blob + * @param {(string | undefined)} snapshot + * @param {(Models.LeaseAccessConditions | undefined)} leaseAccessConditions + * @param {(Models.BlobTags | undefined)} tags + * @param {Models.ModifiedAccessConditions} [modifiedAccessConditions] + * @returns {Promise} + * @memberof LokiBlobMetadataStore + */ + public async setBlobTag( + context: Context, + account: string, + container: string, + blob: string, + snapshot: string | undefined, + leaseAccessConditions: Models.LeaseAccessConditions | undefined, + tags: Models.BlobTags | undefined, + modifiedAccessConditions?: Models.ModifiedAccessConditions + ): Promise { + const coll = this.db.getCollection(this.BLOBS_COLLECTION); + const doc = await this.getBlobWithLeaseUpdated( + account, + container, + blob, + snapshot, + context, + false, + true + ); + + if (!doc) { + throw StorageErrorFactory.getBlobNotFound(context.contextId); + } + + const lease = new BlobLeaseAdapter(doc); + new BlobWriteLeaseValidator(leaseAccessConditions).validate(lease, context); + new BlobWriteLeaseSyncer(doc).sync(lease); + doc.blobTags = tags; + doc.properties.etag = newEtag(); + doc.properties.lastModified = context.startTime || new Date(); + coll.update(doc); + } + + /** + * Get blob tags. + * + * @param {Context} context + * @param {string} account + * @param {string} container + * @param {string} blob + * @param {(string | undefined)} snapshot + * @param {(Models.LeaseAccessConditions | undefined)} leaseAccessConditions + * @param {Models.ModifiedAccessConditions} [modifiedAccessConditions] + * @returns {Promise} + * @memberof LokiBlobMetadataStore + */ + public async getBlobTag( + context: Context, + account: string, + container: string, + blob: string, + snapshot: string = "", + leaseAccessConditions: Models.LeaseAccessConditions | undefined, + modifiedAccessConditions?: Models.ModifiedAccessConditions + ): Promise { + const doc = await this.getBlobWithLeaseUpdated( + account, + container, + blob, + snapshot, + context, + false, + true + ); + + // When block blob don't have commited block, should return 404 + if (!doc) { + throw StorageErrorFactory.getBlobNotFound(context.contextId); + } + + new BlobReadLeaseValidator(leaseAccessConditions).validate( + new BlobLeaseAdapter(doc), + context + ); + + return doc.blobTags; + } + /** * Get the tier setting from request headers. * diff --git a/src/blob/persistence/SqlBlobMetadataStore.ts b/src/blob/persistence/SqlBlobMetadataStore.ts index 7b7ca5333..dfd596237 100644 --- a/src/blob/persistence/SqlBlobMetadataStore.ts +++ b/src/blob/persistence/SqlBlobMetadataStore.ts @@ -67,6 +67,7 @@ import IBlobMetadataStore, { SetContainerAccessPolicyOptions } from "./IBlobMetadataStore"; import PageWithDelimiter from "./PageWithDelimiter"; +import { getBlobTagsCount, getTagsFromString } from "../utils/utils"; // tslint:disable: max-classes-per-file class ServicesModel extends Model {} @@ -289,6 +290,9 @@ export default class SqlBlobMetadataStore implements IBlobMetadataStore { }, metadata: { type: "VARCHAR(2047)" + }, + blobTags: { + type: "VARCHAR(4096)" } }, { @@ -1725,12 +1729,19 @@ export default class SqlBlobMetadataStore implements IBlobMetadataStore { // TODO: Return blobCommittedBlockCount for append blob - return LeaseFactory.createLeaseState( + let responds = LeaseFactory.createLeaseState( new BlobLeaseAdapter(blobModel), context ) .validate(new BlobReadLeaseValidator(leaseAccessConditions)) .sync(new BlobLeaseSyncer(blobModel)); + return { + ...responds, + properties : { + ...responds.properties, + tagCount: getBlobTagsCount(blobModel.blobTags), + }, + } }); } @@ -1789,6 +1800,7 @@ export default class SqlBlobMetadataStore implements IBlobMetadataStore { snapshotBlob.snapshot = snapshotTime; snapshotBlob.metadata = metadata || snapshotBlob.metadata; + snapshotBlob.blobTags = snapshotBlob.blobTags; new BlobLeaseSyncer(snapshotBlob).sync({ leaseId: undefined, @@ -2616,7 +2628,8 @@ export default class SqlBlobMetadataStore implements IBlobMetadataStore { leaseBreakTime: destBlob !== undefined ? destBlob.leaseBreakTime : undefined, committedBlocksInOrder: sourceBlob.committedBlocksInOrder, - persistency: sourceBlob.persistency + persistency: sourceBlob.persistency, + blobTags: options.blobTagsString === undefined ? undefined : getTagsFromString(options.blobTagsString, context.contextId!) }; if ( @@ -3132,7 +3145,8 @@ export default class SqlBlobMetadataStore implements IBlobMetadataStore { dbModel, "committedBlocksInOrder" ), - metadata: this.deserializeModelValue(dbModel, "metadata") + metadata: this.deserializeModelValue(dbModel, "metadata"), + blobTags: this.deserializeModelValue(dbModel, "blobTags") }; } @@ -3168,6 +3182,7 @@ export default class SqlBlobMetadataStore implements IBlobMetadataStore { committedBlocksInOrder: this.serializeModelValue(blob.committedBlocksInOrder) || null, metadata: this.serializeModelValue(blob.metadata) || null, + blobTags: this.serializeModelValue(blob.blobTags) || null, ...contentProperties }; } @@ -3303,6 +3318,110 @@ export default class SqlBlobMetadataStore implements IBlobMetadataStore { return doc; } + public setBlobTag( + context: Context, + account: string, + container: string, + blob: string, + snapshot: string | undefined, + leaseAccessConditions: Models.LeaseAccessConditions | undefined, + tags: Models.BlobTags | undefined, + modifiedAccessConditions?: Models.ModifiedAccessConditions + ): Promise { + return this.sequelize.transaction(async (t) => { + await this.assertContainerExists(context, account, container, t); + + const blobFindResult = await BlobsModel.findOne({ + where: { + accountName: account, + containerName: container, + blobName: blob, + snapshot: snapshot === undefined ? "" : snapshot, + deleting: 0, + isCommitted: true + }, + transaction: t + }); + + if (blobFindResult === null || blobFindResult === undefined) { + throw StorageErrorFactory.getBlobNotFound(context.contextId); + } + + const blobModel = this.convertDbModelToBlobModel(blobFindResult); + + LeaseFactory.createLeaseState(new BlobLeaseAdapter(blobModel), context) + .validate(new BlobWriteLeaseValidator(leaseAccessConditions)) + .sync(new BlobWriteLeaseSyncer(blobModel)); + + const lastModified = context.startTime! || new Date(); + const etag = newEtag(); + + await BlobsModel.update( + { + blobTags: this.serializeModelValue(tags) || null, + lastModified, + etag, + ...this.convertLeaseToDbModel(new BlobLeaseAdapter(blobModel)) + }, + { + where: { + accountName: account, + containerName: container, + blobName: blob, + snapshot: snapshot === undefined ? "" : snapshot, + deleting: 0 + }, + transaction: t + } + ); + }); + } + + public async getBlobTag( + context: Context, + account: string, + container: string, + blob: string, + snapshot: string = "", + leaseAccessConditions?: Models.LeaseAccessConditions, + modifiedAccessConditions?: Models.ModifiedAccessConditions + ): Promise { + return this.sequelize.transaction(async (t) => { + await this.assertContainerExists(context, account, container, t); + + const blobFindResult = await BlobsModel.findOne({ + where: { + accountName: account, + containerName: container, + blobName: blob, + snapshot, + deleting: 0, + isCommitted: true + }, + transaction: t + }); + + if (blobFindResult === null || blobFindResult === undefined) { + throw StorageErrorFactory.getBlobNotFound(context.contextId); + } + + const blobModel: BlobModel = this.convertDbModelToBlobModel( + blobFindResult + ); + + if (!blobModel.isCommitted) { + throw StorageErrorFactory.getBlobNotFound(context.contextId); + } + + LeaseFactory.createLeaseState( + new BlobLeaseAdapter(blobModel), + context + ).validate(new BlobReadLeaseValidator(leaseAccessConditions)); + + return blobModel.blobTags; + }); + } + /** * Get the tier setting from request headers. * diff --git a/src/blob/utils/utils.ts b/src/blob/utils/utils.ts index cecc80544..38df653c6 100644 --- a/src/blob/utils/utils.ts +++ b/src/blob/utils/utils.ts @@ -2,6 +2,7 @@ import { createHmac } from "crypto"; import { createWriteStream, PathLike } from "fs"; import StorageErrorFactory from "../errors/StorageErrorFactory"; import { USERDELEGATIONKEY_BASIC_KEY } from "./constants"; +import { BlobTag, BlobTags } from "@azure/storage-blob"; export function checkApiVersion( inputApiVersion: string, @@ -164,3 +165,81 @@ export function getUserDelegationKeyValue( return createHmac("sha256", USERDELEGATIONKEY_BASIC_KEY).update(stringToSign, "utf8").digest("base64"); } + +export function getBlobTagsCount( + blobTags: BlobTags | undefined +) : number | undefined { + return (blobTags === undefined || blobTags?.blobTagSet.length === 0) ? undefined : blobTags?.blobTagSet.length +} + +export function getTagsFromString(blobTagsString: string, contextID: string): BlobTags | undefined { + if (blobTagsString === '' || blobTagsString === undefined) + { + return undefined; + } + let blobTags:BlobTag[] = []; + const rawTags = blobTagsString.split("&"); + rawTags.forEach((rawTag)=>{ + const tagpair = rawTag.split("="); + blobTags.push({ + // When the Blob tag is input with header, it's encoded, sometimes space will be encoded to "+" ("+" will be encoded to "%2B") + // But in decodeURIComponent(), "+" won't be decode to space, so we need first replace "+" to "%20", then decode the tag. + key: decodeURIComponent(tagpair[0].replace(/\+/g, '%20')), + value: decodeURIComponent(tagpair[1].replace(/\+/g, '%20')), + }); + }) + validateBlobTag( + { + blobTagSet:blobTags, + }, + contextID + ); + return { + blobTagSet:blobTags, + }; +} + +// validate as the limitation from https://learn.microsoft.com/en-us/rest/api/storageservices/set-blob-tags?tabs=azure-ad#request-body +export function validateBlobTag(tags: BlobTags, contextID: string): void { + if (tags.blobTagSet.length > 10){ + throw StorageErrorFactory.getTagsTooLarge(contextID); + } + tags.blobTagSet.forEach((tag)=>{ + if (tag.key.length == 0){ + throw StorageErrorFactory.getEmptyTagName(contextID); + } + if (tag.key.length > 128){ + throw StorageErrorFactory.getTagsTooLarge(contextID); + } + if (tag.value.length > 256){ + throw StorageErrorFactory.getTagsTooLarge(contextID); + } + if (ContainsInvalidTagCharacter(tag.key)) { + throw StorageErrorFactory.getInvalidTag(contextID); + } + if (ContainsInvalidTagCharacter(tag.value)) { + throw StorageErrorFactory.getInvalidTag(contextID); + } + }); +} + +function ContainsInvalidTagCharacter(s: string): boolean{ + for (let c of s) + { + if (!(c >= 'a' && c <= 'z' || + c >= 'A' && c <= 'Z' || + c >= '0' && c <= '9' || + c == ' ' || + c == '+' || + c == '-' || + c == '.' || + c == '/' || + c == ':' || + c == '=' || + c == '_')) + { + return true; + } + } + return false; +} \ No newline at end of file diff --git a/src/common/persistence/SqlExtentMetadataStore.ts b/src/common/persistence/SqlExtentMetadataStore.ts index b15691f4e..f8ffb6a28 100644 --- a/src/common/persistence/SqlExtentMetadataStore.ts +++ b/src/common/persistence/SqlExtentMetadataStore.ts @@ -75,7 +75,7 @@ export default class SqlExtentMetadataStore implements IExtentMetadataStore { ); // TODO: Remove this part which only for test. - this.sequelize.sync(); + await this.sequelize.sync(); this.initialized = true; } diff --git a/tests/blob/apis/blob.test.ts b/tests/blob/apis/blob.test.ts index 2e80a2a00..7c0614330 100644 --- a/tests/blob/apis/blob.test.ts +++ b/tests/blob/apis/blob.test.ts @@ -2,7 +2,8 @@ import { isNode } from "@azure/ms-rest-js"; import { StorageSharedKeyCredential, newPipeline, - BlobServiceClient + BlobServiceClient, + BlobItem } from "@azure/storage-blob"; import assert = require("assert"); @@ -1327,6 +1328,472 @@ describe("BlobAPIs", () => { result.contentDisposition, blobHTTPHeaders.blobContentDisposition ); + }); + + it("set/get blob tag should work, with base blob or snapshot @loki @sql", async () => { + const tags = { + tag1: "val1", + tag2: "val2", + }; + const tags2 = { + tag1: "val1", + tag2: "val22", + tag3: "val3", + }; + + // Set/get tags on base blob + await blobClient.setTags(tags); + let outputTags1 = (await blobClient.getTags()).tags; + assert.deepStrictEqual(outputTags1, tags); + + // create snapshot, the tags should be same as base blob + const snapshotResponse = await blobClient.createSnapshot(); + const blobClientSnapshot = blobClient.withSnapshot(snapshotResponse.snapshot!); + let outputTags2 = (await blobClientSnapshot.getTags()).tags; + assert.deepStrictEqual(outputTags2, tags); + + // Set/get tags on snapshot, base blob tags should not be impacted. + await blobClientSnapshot.setTags(tags2); + outputTags2 = (await blobClientSnapshot.getTags()).tags; + assert.deepStrictEqual(outputTags2, tags2); + + outputTags1 = (await blobClient.getTags()).tags; + assert.deepStrictEqual(outputTags1, tags); + + blobClientSnapshot.delete(); + }); + + it("set blob tag should work in put block blob, pubBlockList, and startCopyFromURL on block blob, and getBlobProperties, Download Blob, list blob can get blob tags. @loki @sql", async () => { + const tags = { + tag1: "val1", + tag2: "val2", + }; + const tags2 = { + tag1: "val1", + tag2: "val22", + tag3: "val3", + }; + + const blockBlobName1 = "block1"; + const blockBlobName2 = "block2"; + + let blockBlobClient1 = containerClient.getBlockBlobClient(blockBlobName1); + let blockBlobClient2 = containerClient.getBlockBlobClient(blockBlobName2); + + // Upload block blob with tags + await blockBlobClient1.upload(content, content.length, + { + tags: tags + }); + + // Get tags, can get detail tags + let outputTags = (await blockBlobClient1.getTags()).tags; + assert.deepStrictEqual(outputTags, tags); + + // Get blob properties, can get tag count + let blobProperties = await blockBlobClient1.getProperties(); + assert.deepStrictEqual(blobProperties._response.parsedHeaders.tagCount, 2); + + // download blob, can get tag count + const downloadResult = await blockBlobClient1.download(0); + assert.deepStrictEqual(downloadResult._response.parsedHeaders.tagCount, 2); + + // startCopyFromURL, can set tag + await blockBlobClient2.beginCopyFromURL(blockBlobClient1.url, { + tags: tags2 + }); + outputTags = (await blockBlobClient2.getTags()).tags; + assert.deepStrictEqual(outputTags, tags2); + + // listBlobsFlat can get tag count + let listResult = ( + await containerClient + .listBlobsFlat() + .byPage() + .next() + ).value; + let blobs = (await listResult).segment.blobItems; + let blobNotChecked = blobs!.length; + blobs.forEach((blobItem: BlobItem) => + { + if (blobItem.name === blockBlobName1) + { + assert.deepStrictEqual(blobItem.properties.tagCount, 2); + blobNotChecked--; + } + if (blobItem.name === blockBlobName2) + { + assert.deepStrictEqual(blobItem.properties.tagCount, 3); + blobNotChecked--; + } + }); + assert.deepStrictEqual(blobs!.length-2, blobNotChecked); + + // listBlobsFlat with include tags can get tag + listResult = ( + await containerClient + .listBlobsFlat({includeTags: true}) + .byPage() + .next() + ).value; + blobs = (await listResult).segment.blobItems; + blobNotChecked = blobs!.length; + blobs.forEach((blobItem: BlobItem) => + { + if (blobItem.name === blockBlobName1) + { + assert.deepStrictEqual(blobItem.properties.tagCount, 2); + assert.deepStrictEqual(blobItem.tags, tags); + blobNotChecked--; + } + if (blobItem.name === blockBlobName2) + { + assert.deepStrictEqual(blobItem.properties.tagCount, 3); + assert.deepStrictEqual(blobItem.tags, tags2); + blobNotChecked--; + } + }); + assert.deepStrictEqual(blobs!.length-2, blobNotChecked); + + // listBlobsByHierarchy can get tag count + const delimiter = "/"; + listResult = ( + await containerClient + .listBlobsByHierarchy(delimiter) + .byPage() + .next() + ).value; + blobs = (await listResult).segment.blobItems; + blobNotChecked = blobs!.length; + blobs.forEach((blobItem: BlobItem) => + { + if (blobItem.name === blockBlobName1) + { + assert.deepStrictEqual(blobItem.properties.tagCount, 2); + blobNotChecked--; + } + if (blobItem.name === blockBlobName2) + { + assert.deepStrictEqual(blobItem.properties.tagCount, 3); + blobNotChecked--; + } + }); + assert.deepStrictEqual(blobs!.length-2, blobNotChecked); + + // listBlobsByHierarchy include tags can get tag + listResult = ( + await containerClient + .listBlobsByHierarchy(delimiter, {includeTags: true}) + .byPage() + .next() + ).value; + blobs = (await listResult).segment.blobItems; + blobNotChecked = blobs!.length; + blobs.forEach((blobItem: BlobItem) => + { + if (blobItem.name === blockBlobName1) + { + assert.deepStrictEqual(blobItem.properties.tagCount, 2); + assert.deepStrictEqual(blobItem.tags, tags); + blobNotChecked--; + } + if (blobItem.name === blockBlobName2) + { + assert.deepStrictEqual(blobItem.properties.tagCount, 3); + assert.deepStrictEqual(blobItem.tags, tags2); + blobNotChecked--; + } + }); + assert.deepStrictEqual(blobs!.length-2, blobNotChecked); + + // clean up + blockBlobClient1.delete(); + blockBlobClient2.delete(); + }); + + it("set blob tag should work in create page/append blob, copyFromURL. @loki", async () => { + const tags = { + tag1: "val1", + tag2: "val2", + }; + const tags2 = { + tag1: "val1", + tag2: "val22", + tag3: "val3", + }; + + const blockBlobName1 = "block1"; + const blockBlobName2 = "block2"; + const pageBlobName1 = "page1"; + const pageBlobName2 = "page2"; + const appendBlobName1 = "append1"; + const appendBlobName2 = "append2"; + + let blockBlobClient1 = containerClient.getBlockBlobClient(blockBlobName1); + let blockBlobClient2 = containerClient.getBlockBlobClient(blockBlobName2); + let pageBlobClient1 = containerClient.getBlockBlobClient(pageBlobName1); + let pageBlobClient2 = containerClient.getBlockBlobClient(pageBlobName2); + let appendBlobClient1 = containerClient.getBlockBlobClient(appendBlobName1); + let appendBlobClient2 = containerClient.getBlockBlobClient(appendBlobName2); + + // Upload blob with tags + await blockBlobClient1.upload(content, content.length, + { + tags: tags + }); + await pageBlobClient1.upload(content, content.length, + { + tags: tags + }); + await appendBlobClient1.upload(content, content.length, + { + tags: tags + }); + + // Get tags, can get detail tags + let outputTags = (await blockBlobClient1.getTags()).tags; + assert.deepStrictEqual(outputTags, tags); + outputTags = (await pageBlobClient1.getTags()).tags; + assert.deepStrictEqual(outputTags, tags); + outputTags = (await appendBlobClient1.getTags()).tags; + assert.deepStrictEqual(outputTags, tags); + + // download blob, can get tag count + let downloadResult = await blockBlobClient1.download(0); + assert.deepStrictEqual(downloadResult._response.parsedHeaders.tagCount, 2); + downloadResult = await pageBlobClient1.download(0); + assert.deepStrictEqual(downloadResult._response.parsedHeaders.tagCount, 2); + downloadResult = await appendBlobClient1.download(0); + assert.deepStrictEqual(downloadResult._response.parsedHeaders.tagCount, 2); + + // startCopyFromURL, can set tag + await blockBlobClient2.syncCopyFromURL(blockBlobClient1.url, { + tags: tags2 + }); + await pageBlobClient2.syncCopyFromURL(pageBlobClient1.url, { + tags: tags2 + }); + await appendBlobClient2.syncCopyFromURL(appendBlobClient1.url, { + tags: tags2 + }); + outputTags = (await blockBlobClient2.getTags()).tags; + assert.deepStrictEqual(outputTags, tags2); + outputTags = (await pageBlobClient2.getTags()).tags; + assert.deepStrictEqual(outputTags, tags2); + outputTags = (await appendBlobClient2.getTags()).tags; + assert.deepStrictEqual(outputTags, tags2); + + // listBlobsFlat with include tags can get tag + let listResult = ( + await containerClient + .listBlobsFlat({includeTags: true}) + .byPage() + .next() + ).value; + let blobs = (await listResult).segment.blobItems; + let blobNotChecked = blobs!.length; + blobs.forEach((blobItem: BlobItem) => + { + if (blobItem.name === blockBlobName1 || blobItem.name === pageBlobName1 || blobItem.name === appendBlobName1 ) + { + assert.deepStrictEqual(blobItem.properties.tagCount, 2); + assert.deepStrictEqual(blobItem.tags, tags); + blobNotChecked--; + } + if (blobItem.name === blockBlobName2 || blobItem.name === pageBlobName2 || blobItem.name === appendBlobName2 ) + { + assert.deepStrictEqual(blobItem.properties.tagCount, 3); + assert.deepStrictEqual(blobItem.tags, tags2); + blobNotChecked--; + } + }); + assert.deepStrictEqual(blobs!.length-6, blobNotChecked); + + // clean up + blockBlobClient1.delete(); + blockBlobClient2.delete(); + pageBlobClient1.delete(); + pageBlobClient2.delete(); + appendBlobClient1.delete(); + appendBlobClient2.delete(); + }); + + it("set blob tag fail with invalid tag. @loki @sql", async () => { + + const blockBlobName1 = "block1"; + let blockBlobClient1 = containerClient.getBlockBlobClient(blockBlobName1); + await blockBlobClient1.upload(content, content.length); + + // tag acount should <= 10 + const tooManyTags = { + tag1: "val1", + tag2: "val2", + tag3: "val2", + tag4: "val2", + tag5: "val2", + tag6: "val2", + tag7: "val2", + tag8: "val2", + tag9: "val2", + tag10: "val2", + tag11: "val2", + }; + let statusCode = 0; + try { + await await blockBlobClient1.setTags(tooManyTags);; + } catch (error) { + statusCode = error.statusCode; + } + assert.deepStrictEqual(statusCode, 400); + let tags1 = { + tag1: "val1", + tag2: "val2", + tag3: "val2", + tag4: "val2", + tag5: "val2", + tag6: "val2", + tag7: "val2", + tag8: "val2", + tag9: "val2", + tag10: "val2", + }; + await blockBlobClient1.setTags(tags1); + let outputTags = (await blockBlobClient1.getTags()).tags; + assert.deepStrictEqual(outputTags, tags1); + + // key length should >0 and <= 128 + const emptyKeyTags = { + "": "123123123", + }; + statusCode = 0; + try { + await await blockBlobClient1.setTags(emptyKeyTags);; + } catch (error) { + statusCode = error.statusCode; + } + assert.deepStrictEqual(statusCode, 400); + const tooLongKeyTags = { + "key123401234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890012345678901234567890": "val1", + }; + statusCode = 0; + try { + await await blockBlobClient1.setTags(tooLongKeyTags);; + } catch (error) { + statusCode = error.statusCode; + } + assert.deepStrictEqual(statusCode, 400); + let tags2 = { + "key12301234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890012345678901234567890": "val1", + }; + await blockBlobClient1.setTags(tags2); + outputTags = (await blockBlobClient1.getTags()).tags; + assert.deepStrictEqual(outputTags, tags2); + + // value length should <= 256 + const tooLongvalueTags = { + tag1: "val12345678900123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789001234567890123456789001234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890012345678901234567890", + }; + statusCode = 0; + try { + await blockBlobClient1.upload(content, content.length, + { + tags: tooLongvalueTags + }); + } catch (error) { + statusCode = error.statusCode; + } + assert.deepStrictEqual(statusCode, 400); + let tags3 = { + tag1: "va12345678900123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789001234567890123456789001234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890012345678901234567890", + }; + await blockBlobClient1.upload(content, content.length, + { + tags: tags3 + }); + outputTags = (await blockBlobClient1.getTags()).tags; + assert.deepStrictEqual(outputTags, tags3); + + // invalid char in key + let invalidTags = { + tag1: "abc%abc", + }; + statusCode = 0; + try { + await blockBlobClient1.upload(content, content.length, + { + tags: invalidTags + }); + } catch (error) { + statusCode = error.statusCode; + } + assert.deepStrictEqual(statusCode, 400); + + let invalidTags1 = { + "abc#ew": "abc", + }; + statusCode = 0; + try { + await blockBlobClient1.upload(content, content.length, + { + tags: invalidTags1 + }); + } catch (error) { + statusCode = error.statusCode; + } + assert.deepStrictEqual(statusCode, 400); + + let tags4 = { + "azAz09 +-./:=_": "azAz09 +-./:=_", + }; + await blockBlobClient1.upload(content, content.length, + { + tags: tags4 + }); + outputTags = (await blockBlobClient1.getTags()).tags; + assert.deepStrictEqual(outputTags, tags4); + + // clean up + blockBlobClient1.delete(); + }); + + it("Set and get blob tags should work with lease condition @loki @sql", async () => { + const guid = "ca761232ed4211cebacd00aa0057b223"; + const leaseClient = blockBlobClient.getBlobLeaseClient(guid); + await leaseClient.acquireLease(-1); + + const tags = { + tag1: "val1", + tag2: "val2", + }; + await blockBlobClient.setTags(tags, { conditions: { leaseId: leaseClient.leaseId } }); + const response = await blockBlobClient.getTags({ + conditions: { leaseId: leaseClient.leaseId }, + }); + assert.deepStrictEqual(response.tags, tags); + + const tags1 = { + tag1: "val", + }; + try { + await blockBlobClient.setTags(tags1); + assert.fail( + "Should have failed when setting tags without the right lease condition of a leased blob" + ); + } catch (err: any) { + assert.deepStrictEqual(err.code, "LeaseIdMissing", err.msg); + } + + try { + const newGuid = "3c7e72ebb4304526bc53d8ecef03798f"; + await blockBlobClient.getTags({ conditions: { leaseId: newGuid } }); + assert.fail( + "Should have failed when setting tags without the right lease condition of a leased blob" + ); + } catch (err: any) { + assert.deepStrictEqual(err.code, "LeaseIdMismatchWithBlobOperation"); + } + + await leaseClient.releaseLease(); }); it("Acquire Lease on Breaking Lease status, if LeaseId not match, throw LeaseIdMismatchWithLease error @loki @sql", async () => { From 5393d59a38533a501eb98689256db2a4e998aa4c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 2 Jun 2023 09:30:37 +0800 Subject: [PATCH 108/297] Bump @typescript-eslint/eslint-plugin from 5.59.5 to 5.59.8 (#1985) Bumps [@typescript-eslint/eslint-plugin](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/eslint-plugin) from 5.59.5 to 5.59.8. - [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases) - [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/eslint-plugin/CHANGELOG.md) - [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v5.59.8/packages/eslint-plugin) --- updated-dependencies: - dependency-name: "@typescript-eslint/eslint-plugin" dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 244 +++++++++++++++++++++++----------------------- 1 file changed, 122 insertions(+), 122 deletions(-) diff --git a/package-lock.json b/package-lock.json index ca86f2fff..478eb083e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1424,9 +1424,9 @@ "dev": true }, "node_modules/@types/json-schema": { - "version": "7.0.11", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", - "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", + "version": "7.0.12", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.12.tgz", + "integrity": "sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==", "dev": true }, "node_modules/@types/jsonfile": { @@ -1592,15 +1592,15 @@ } }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.59.5", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.59.5.tgz", - "integrity": "sha512-feA9xbVRWJZor+AnLNAr7A8JRWeZqHUf4T9tlP+TN04b05pFVhO5eN7/O93Y/1OUlLMHKbnJisgDURs/qvtqdg==", + "version": "5.59.8", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.59.8.tgz", + "integrity": "sha512-JDMOmhXteJ4WVKOiHXGCoB96ADWg9q7efPWHRViT/f09bA8XOMLAVHHju3l0MkZnG1izaWXYmgvQcUjTRcpShQ==", "dev": true, "dependencies": { "@eslint-community/regexpp": "^4.4.0", - "@typescript-eslint/scope-manager": "5.59.5", - "@typescript-eslint/type-utils": "5.59.5", - "@typescript-eslint/utils": "5.59.5", + "@typescript-eslint/scope-manager": "5.59.8", + "@typescript-eslint/type-utils": "5.59.8", + "@typescript-eslint/utils": "5.59.8", "debug": "^4.3.4", "grapheme-splitter": "^1.0.4", "ignore": "^5.2.0", @@ -1626,13 +1626,13 @@ } }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/scope-manager": { - "version": "5.59.5", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.59.5.tgz", - "integrity": "sha512-jVecWwnkX6ZgutF+DovbBJirZcAxgxC0EOHYt/niMROf8p4PwxxG32Qdhj/iIQQIuOflLjNkxoXyArkcIP7C3A==", + "version": "5.59.8", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.59.8.tgz", + "integrity": "sha512-/w08ndCYI8gxGf+9zKf1vtx/16y8MHrZs5/tnjHhMLNSixuNcJavSX4wAiPf4aS5x41Es9YPCn44MIe4cxIlig==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.59.5", - "@typescript-eslint/visitor-keys": "5.59.5" + "@typescript-eslint/types": "5.59.8", + "@typescript-eslint/visitor-keys": "5.59.8" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -1643,9 +1643,9 @@ } }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/types": { - "version": "5.59.5", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.5.tgz", - "integrity": "sha512-xkfRPHbqSH4Ggx4eHRIO/eGL8XL4Ysb4woL8c87YuAo8Md7AUjyWKa9YMwTL519SyDPrfEgKdewjkxNCVeJW7w==", + "version": "5.59.8", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.8.tgz", + "integrity": "sha512-+uWuOhBTj/L6awoWIg0BlWy0u9TyFpCHrAuQ5bNfxDaZ1Ppb3mx6tUigc74LHcbHpOHuOTOJrBoAnhdHdaea1w==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -1656,12 +1656,12 @@ } }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/visitor-keys": { - "version": "5.59.5", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.5.tgz", - "integrity": "sha512-qL+Oz+dbeBRTeyJTIy0eniD3uvqU7x+y1QceBismZ41hd4aBSRh8UAw4pZP0+XzLuPZmx4raNMq/I+59W2lXKA==", + "version": "5.59.8", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.8.tgz", + "integrity": "sha512-pJhi2ms0x0xgloT7xYabil3SGGlojNNKjK/q6dB3Ey0uJLMjK2UDGJvHieiyJVW/7C3KI+Z4Q3pEHkm4ejA+xQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.59.5", + "@typescript-eslint/types": "5.59.8", "eslint-visitor-keys": "^3.3.0" }, "engines": { @@ -1763,13 +1763,13 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "5.59.5", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.59.5.tgz", - "integrity": "sha512-4eyhS7oGym67/pSxA2mmNq7X164oqDYNnZCUayBwJZIRVvKpBCMBzFnFxjeoDeShjtO6RQBHBuwybuX3POnDqg==", + "version": "5.59.8", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.59.8.tgz", + "integrity": "sha512-+5M518uEIHFBy3FnyqZUF3BMP+AXnYn4oyH8RF012+e7/msMY98FhGL5SrN29NQ9xDgvqCgYnsOiKp1VjZ/fpA==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "5.59.5", - "@typescript-eslint/utils": "5.59.5", + "@typescript-eslint/typescript-estree": "5.59.8", + "@typescript-eslint/utils": "5.59.8", "debug": "^4.3.4", "tsutils": "^3.21.0" }, @@ -1790,9 +1790,9 @@ } }, "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/types": { - "version": "5.59.5", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.5.tgz", - "integrity": "sha512-xkfRPHbqSH4Ggx4eHRIO/eGL8XL4Ysb4woL8c87YuAo8Md7AUjyWKa9YMwTL519SyDPrfEgKdewjkxNCVeJW7w==", + "version": "5.59.8", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.8.tgz", + "integrity": "sha512-+uWuOhBTj/L6awoWIg0BlWy0u9TyFpCHrAuQ5bNfxDaZ1Ppb3mx6tUigc74LHcbHpOHuOTOJrBoAnhdHdaea1w==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -1803,13 +1803,13 @@ } }, "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree": { - "version": "5.59.5", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.5.tgz", - "integrity": "sha512-+XXdLN2CZLZcD/mO7mQtJMvCkzRfmODbeSKuMY/yXbGkzvA9rJyDY5qDYNoiz2kP/dmyAxXquL2BvLQLJFPQIg==", + "version": "5.59.8", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.8.tgz", + "integrity": "sha512-Jy/lPSDJGNow14vYu6IrW790p7HIf/SOV1Bb6lZ7NUkLc2iB2Z9elESmsaUtLw8kVqogSbtLH9tut5GCX1RLDg==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.59.5", - "@typescript-eslint/visitor-keys": "5.59.5", + "@typescript-eslint/types": "5.59.8", + "@typescript-eslint/visitor-keys": "5.59.8", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -1830,12 +1830,12 @@ } }, "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/visitor-keys": { - "version": "5.59.5", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.5.tgz", - "integrity": "sha512-qL+Oz+dbeBRTeyJTIy0eniD3uvqU7x+y1QceBismZ41hd4aBSRh8UAw4pZP0+XzLuPZmx4raNMq/I+59W2lXKA==", + "version": "5.59.8", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.8.tgz", + "integrity": "sha512-pJhi2ms0x0xgloT7xYabil3SGGlojNNKjK/q6dB3Ey0uJLMjK2UDGJvHieiyJVW/7C3KI+Z4Q3pEHkm4ejA+xQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.59.5", + "@typescript-eslint/types": "5.59.8", "eslint-visitor-keys": "^3.3.0" }, "engines": { @@ -1933,17 +1933,17 @@ "dev": true }, "node_modules/@typescript-eslint/utils": { - "version": "5.59.5", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.59.5.tgz", - "integrity": "sha512-sCEHOiw+RbyTii9c3/qN74hYDPNORb8yWCoPLmB7BIflhplJ65u2PBpdRla12e3SSTJ2erRkPjz7ngLHhUegxA==", + "version": "5.59.8", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.59.8.tgz", + "integrity": "sha512-Tr65630KysnNn9f9G7ROF3w1b5/7f6QVCJ+WK9nhIocWmx9F+TmCAcglF26Vm7z8KCTwoKcNEBZrhlklla3CKg==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@types/json-schema": "^7.0.9", "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.59.5", - "@typescript-eslint/types": "5.59.5", - "@typescript-eslint/typescript-estree": "5.59.5", + "@typescript-eslint/scope-manager": "5.59.8", + "@typescript-eslint/types": "5.59.8", + "@typescript-eslint/typescript-estree": "5.59.8", "eslint-scope": "^5.1.1", "semver": "^7.3.7" }, @@ -1959,13 +1959,13 @@ } }, "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/scope-manager": { - "version": "5.59.5", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.59.5.tgz", - "integrity": "sha512-jVecWwnkX6ZgutF+DovbBJirZcAxgxC0EOHYt/niMROf8p4PwxxG32Qdhj/iIQQIuOflLjNkxoXyArkcIP7C3A==", + "version": "5.59.8", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.59.8.tgz", + "integrity": "sha512-/w08ndCYI8gxGf+9zKf1vtx/16y8MHrZs5/tnjHhMLNSixuNcJavSX4wAiPf4aS5x41Es9YPCn44MIe4cxIlig==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.59.5", - "@typescript-eslint/visitor-keys": "5.59.5" + "@typescript-eslint/types": "5.59.8", + "@typescript-eslint/visitor-keys": "5.59.8" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -1976,9 +1976,9 @@ } }, "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/types": { - "version": "5.59.5", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.5.tgz", - "integrity": "sha512-xkfRPHbqSH4Ggx4eHRIO/eGL8XL4Ysb4woL8c87YuAo8Md7AUjyWKa9YMwTL519SyDPrfEgKdewjkxNCVeJW7w==", + "version": "5.59.8", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.8.tgz", + "integrity": "sha512-+uWuOhBTj/L6awoWIg0BlWy0u9TyFpCHrAuQ5bNfxDaZ1Ppb3mx6tUigc74LHcbHpOHuOTOJrBoAnhdHdaea1w==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -1989,13 +1989,13 @@ } }, "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree": { - "version": "5.59.5", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.5.tgz", - "integrity": "sha512-+XXdLN2CZLZcD/mO7mQtJMvCkzRfmODbeSKuMY/yXbGkzvA9rJyDY5qDYNoiz2kP/dmyAxXquL2BvLQLJFPQIg==", + "version": "5.59.8", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.8.tgz", + "integrity": "sha512-Jy/lPSDJGNow14vYu6IrW790p7HIf/SOV1Bb6lZ7NUkLc2iB2Z9elESmsaUtLw8kVqogSbtLH9tut5GCX1RLDg==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.59.5", - "@typescript-eslint/visitor-keys": "5.59.5", + "@typescript-eslint/types": "5.59.8", + "@typescript-eslint/visitor-keys": "5.59.8", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -2016,12 +2016,12 @@ } }, "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/visitor-keys": { - "version": "5.59.5", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.5.tgz", - "integrity": "sha512-qL+Oz+dbeBRTeyJTIy0eniD3uvqU7x+y1QceBismZ41hd4aBSRh8UAw4pZP0+XzLuPZmx4raNMq/I+59W2lXKA==", + "version": "5.59.8", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.8.tgz", + "integrity": "sha512-pJhi2ms0x0xgloT7xYabil3SGGlojNNKjK/q6dB3Ey0uJLMjK2UDGJvHieiyJVW/7C3KI+Z4Q3pEHkm4ejA+xQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.59.5", + "@typescript-eslint/types": "5.59.8", "eslint-visitor-keys": "^3.3.0" }, "engines": { @@ -11266,9 +11266,9 @@ "dev": true }, "@types/json-schema": { - "version": "7.0.11", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", - "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", + "version": "7.0.12", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.12.tgz", + "integrity": "sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==", "dev": true }, "@types/jsonfile": { @@ -11434,15 +11434,15 @@ } }, "@typescript-eslint/eslint-plugin": { - "version": "5.59.5", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.59.5.tgz", - "integrity": "sha512-feA9xbVRWJZor+AnLNAr7A8JRWeZqHUf4T9tlP+TN04b05pFVhO5eN7/O93Y/1OUlLMHKbnJisgDURs/qvtqdg==", + "version": "5.59.8", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.59.8.tgz", + "integrity": "sha512-JDMOmhXteJ4WVKOiHXGCoB96ADWg9q7efPWHRViT/f09bA8XOMLAVHHju3l0MkZnG1izaWXYmgvQcUjTRcpShQ==", "dev": true, "requires": { "@eslint-community/regexpp": "^4.4.0", - "@typescript-eslint/scope-manager": "5.59.5", - "@typescript-eslint/type-utils": "5.59.5", - "@typescript-eslint/utils": "5.59.5", + "@typescript-eslint/scope-manager": "5.59.8", + "@typescript-eslint/type-utils": "5.59.8", + "@typescript-eslint/utils": "5.59.8", "debug": "^4.3.4", "grapheme-splitter": "^1.0.4", "ignore": "^5.2.0", @@ -11452,28 +11452,28 @@ }, "dependencies": { "@typescript-eslint/scope-manager": { - "version": "5.59.5", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.59.5.tgz", - "integrity": "sha512-jVecWwnkX6ZgutF+DovbBJirZcAxgxC0EOHYt/niMROf8p4PwxxG32Qdhj/iIQQIuOflLjNkxoXyArkcIP7C3A==", + "version": "5.59.8", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.59.8.tgz", + "integrity": "sha512-/w08ndCYI8gxGf+9zKf1vtx/16y8MHrZs5/tnjHhMLNSixuNcJavSX4wAiPf4aS5x41Es9YPCn44MIe4cxIlig==", "dev": true, "requires": { - "@typescript-eslint/types": "5.59.5", - "@typescript-eslint/visitor-keys": "5.59.5" + "@typescript-eslint/types": "5.59.8", + "@typescript-eslint/visitor-keys": "5.59.8" } }, "@typescript-eslint/types": { - "version": "5.59.5", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.5.tgz", - "integrity": "sha512-xkfRPHbqSH4Ggx4eHRIO/eGL8XL4Ysb4woL8c87YuAo8Md7AUjyWKa9YMwTL519SyDPrfEgKdewjkxNCVeJW7w==", + "version": "5.59.8", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.8.tgz", + "integrity": "sha512-+uWuOhBTj/L6awoWIg0BlWy0u9TyFpCHrAuQ5bNfxDaZ1Ppb3mx6tUigc74LHcbHpOHuOTOJrBoAnhdHdaea1w==", "dev": true }, "@typescript-eslint/visitor-keys": { - "version": "5.59.5", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.5.tgz", - "integrity": "sha512-qL+Oz+dbeBRTeyJTIy0eniD3uvqU7x+y1QceBismZ41hd4aBSRh8UAw4pZP0+XzLuPZmx4raNMq/I+59W2lXKA==", + "version": "5.59.8", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.8.tgz", + "integrity": "sha512-pJhi2ms0x0xgloT7xYabil3SGGlojNNKjK/q6dB3Ey0uJLMjK2UDGJvHieiyJVW/7C3KI+Z4Q3pEHkm4ejA+xQ==", "dev": true, "requires": { - "@typescript-eslint/types": "5.59.5", + "@typescript-eslint/types": "5.59.8", "eslint-visitor-keys": "^3.3.0" } }, @@ -11534,31 +11534,31 @@ } }, "@typescript-eslint/type-utils": { - "version": "5.59.5", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.59.5.tgz", - "integrity": "sha512-4eyhS7oGym67/pSxA2mmNq7X164oqDYNnZCUayBwJZIRVvKpBCMBzFnFxjeoDeShjtO6RQBHBuwybuX3POnDqg==", + "version": "5.59.8", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.59.8.tgz", + "integrity": "sha512-+5M518uEIHFBy3FnyqZUF3BMP+AXnYn4oyH8RF012+e7/msMY98FhGL5SrN29NQ9xDgvqCgYnsOiKp1VjZ/fpA==", "dev": true, "requires": { - "@typescript-eslint/typescript-estree": "5.59.5", - "@typescript-eslint/utils": "5.59.5", + "@typescript-eslint/typescript-estree": "5.59.8", + "@typescript-eslint/utils": "5.59.8", "debug": "^4.3.4", "tsutils": "^3.21.0" }, "dependencies": { "@typescript-eslint/types": { - "version": "5.59.5", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.5.tgz", - "integrity": "sha512-xkfRPHbqSH4Ggx4eHRIO/eGL8XL4Ysb4woL8c87YuAo8Md7AUjyWKa9YMwTL519SyDPrfEgKdewjkxNCVeJW7w==", + "version": "5.59.8", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.8.tgz", + "integrity": "sha512-+uWuOhBTj/L6awoWIg0BlWy0u9TyFpCHrAuQ5bNfxDaZ1Ppb3mx6tUigc74LHcbHpOHuOTOJrBoAnhdHdaea1w==", "dev": true }, "@typescript-eslint/typescript-estree": { - "version": "5.59.5", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.5.tgz", - "integrity": "sha512-+XXdLN2CZLZcD/mO7mQtJMvCkzRfmODbeSKuMY/yXbGkzvA9rJyDY5qDYNoiz2kP/dmyAxXquL2BvLQLJFPQIg==", + "version": "5.59.8", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.8.tgz", + "integrity": "sha512-Jy/lPSDJGNow14vYu6IrW790p7HIf/SOV1Bb6lZ7NUkLc2iB2Z9elESmsaUtLw8kVqogSbtLH9tut5GCX1RLDg==", "dev": true, "requires": { - "@typescript-eslint/types": "5.59.5", - "@typescript-eslint/visitor-keys": "5.59.5", + "@typescript-eslint/types": "5.59.8", + "@typescript-eslint/visitor-keys": "5.59.8", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -11567,12 +11567,12 @@ } }, "@typescript-eslint/visitor-keys": { - "version": "5.59.5", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.5.tgz", - "integrity": "sha512-qL+Oz+dbeBRTeyJTIy0eniD3uvqU7x+y1QceBismZ41hd4aBSRh8UAw4pZP0+XzLuPZmx4raNMq/I+59W2lXKA==", + "version": "5.59.8", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.8.tgz", + "integrity": "sha512-pJhi2ms0x0xgloT7xYabil3SGGlojNNKjK/q6dB3Ey0uJLMjK2UDGJvHieiyJVW/7C3KI+Z4Q3pEHkm4ejA+xQ==", "dev": true, "requires": { - "@typescript-eslint/types": "5.59.5", + "@typescript-eslint/types": "5.59.8", "eslint-visitor-keys": "^3.3.0" } }, @@ -11632,45 +11632,45 @@ } }, "@typescript-eslint/utils": { - "version": "5.59.5", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.59.5.tgz", - "integrity": "sha512-sCEHOiw+RbyTii9c3/qN74hYDPNORb8yWCoPLmB7BIflhplJ65u2PBpdRla12e3SSTJ2erRkPjz7ngLHhUegxA==", + "version": "5.59.8", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.59.8.tgz", + "integrity": "sha512-Tr65630KysnNn9f9G7ROF3w1b5/7f6QVCJ+WK9nhIocWmx9F+TmCAcglF26Vm7z8KCTwoKcNEBZrhlklla3CKg==", "dev": true, "requires": { "@eslint-community/eslint-utils": "^4.2.0", "@types/json-schema": "^7.0.9", "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.59.5", - "@typescript-eslint/types": "5.59.5", - "@typescript-eslint/typescript-estree": "5.59.5", + "@typescript-eslint/scope-manager": "5.59.8", + "@typescript-eslint/types": "5.59.8", + "@typescript-eslint/typescript-estree": "5.59.8", "eslint-scope": "^5.1.1", "semver": "^7.3.7" }, "dependencies": { "@typescript-eslint/scope-manager": { - "version": "5.59.5", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.59.5.tgz", - "integrity": "sha512-jVecWwnkX6ZgutF+DovbBJirZcAxgxC0EOHYt/niMROf8p4PwxxG32Qdhj/iIQQIuOflLjNkxoXyArkcIP7C3A==", + "version": "5.59.8", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.59.8.tgz", + "integrity": "sha512-/w08ndCYI8gxGf+9zKf1vtx/16y8MHrZs5/tnjHhMLNSixuNcJavSX4wAiPf4aS5x41Es9YPCn44MIe4cxIlig==", "dev": true, "requires": { - "@typescript-eslint/types": "5.59.5", - "@typescript-eslint/visitor-keys": "5.59.5" + "@typescript-eslint/types": "5.59.8", + "@typescript-eslint/visitor-keys": "5.59.8" } }, "@typescript-eslint/types": { - "version": "5.59.5", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.5.tgz", - "integrity": "sha512-xkfRPHbqSH4Ggx4eHRIO/eGL8XL4Ysb4woL8c87YuAo8Md7AUjyWKa9YMwTL519SyDPrfEgKdewjkxNCVeJW7w==", + "version": "5.59.8", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.8.tgz", + "integrity": "sha512-+uWuOhBTj/L6awoWIg0BlWy0u9TyFpCHrAuQ5bNfxDaZ1Ppb3mx6tUigc74LHcbHpOHuOTOJrBoAnhdHdaea1w==", "dev": true }, "@typescript-eslint/typescript-estree": { - "version": "5.59.5", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.5.tgz", - "integrity": "sha512-+XXdLN2CZLZcD/mO7mQtJMvCkzRfmODbeSKuMY/yXbGkzvA9rJyDY5qDYNoiz2kP/dmyAxXquL2BvLQLJFPQIg==", + "version": "5.59.8", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.8.tgz", + "integrity": "sha512-Jy/lPSDJGNow14vYu6IrW790p7HIf/SOV1Bb6lZ7NUkLc2iB2Z9elESmsaUtLw8kVqogSbtLH9tut5GCX1RLDg==", "dev": true, "requires": { - "@typescript-eslint/types": "5.59.5", - "@typescript-eslint/visitor-keys": "5.59.5", + "@typescript-eslint/types": "5.59.8", + "@typescript-eslint/visitor-keys": "5.59.8", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -11679,12 +11679,12 @@ } }, "@typescript-eslint/visitor-keys": { - "version": "5.59.5", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.5.tgz", - "integrity": "sha512-qL+Oz+dbeBRTeyJTIy0eniD3uvqU7x+y1QceBismZ41hd4aBSRh8UAw4pZP0+XzLuPZmx4raNMq/I+59W2lXKA==", + "version": "5.59.8", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.8.tgz", + "integrity": "sha512-pJhi2ms0x0xgloT7xYabil3SGGlojNNKjK/q6dB3Ey0uJLMjK2UDGJvHieiyJVW/7C3KI+Z4Q3pEHkm4ejA+xQ==", "dev": true, "requires": { - "@typescript-eslint/types": "5.59.5", + "@typescript-eslint/types": "5.59.8", "eslint-visitor-keys": "^3.3.0" } }, From a34a74b24844ed4b0b1461a1e2cf4a9633e62c23 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 2 Jun 2023 09:53:15 +0800 Subject: [PATCH 109/297] Bump sequelize from 6.31.0 to 6.32.0 (#1988) Bumps [sequelize](https://github.com/sequelize/sequelize) from 6.31.0 to 6.32.0. - [Release notes](https://github.com/sequelize/sequelize/releases) - [Commits](https://github.com/sequelize/sequelize/compare/v6.31.0...v6.32.0) --- updated-dependencies: - dependency-name: sequelize dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 478eb083e..3bfffb237 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8881,9 +8881,9 @@ "integrity": "sha1-1WgS4cAXpuTnw+Ojeh2m143TyT4=" }, "node_modules/sequelize": { - "version": "6.31.0", - "resolved": "https://registry.npmjs.org/sequelize/-/sequelize-6.31.0.tgz", - "integrity": "sha512-nCPVtv+QydBmb3Us2jCNAr1Dx3gST83VZxxrUQn/JAVFCOrmYOgUaPUz5bevummyNf30zfHsZhIKYAOD3ULfTA==", + "version": "6.32.0", + "resolved": "https://registry.npmjs.org/sequelize/-/sequelize-6.32.0.tgz", + "integrity": "sha512-gMd1M6kPANyrCeU/vtgEP5gnse7sVsiKbJyz7p4huuW8zZcRopj47UlglvdrMuIoqksZmsUPfApmMo6ZlJpcvg==", "funding": [ { "type": "opencollective", @@ -17005,9 +17005,9 @@ "integrity": "sha1-1WgS4cAXpuTnw+Ojeh2m143TyT4=" }, "sequelize": { - "version": "6.31.0", - "resolved": "https://registry.npmjs.org/sequelize/-/sequelize-6.31.0.tgz", - "integrity": "sha512-nCPVtv+QydBmb3Us2jCNAr1Dx3gST83VZxxrUQn/JAVFCOrmYOgUaPUz5bevummyNf30zfHsZhIKYAOD3ULfTA==", + "version": "6.32.0", + "resolved": "https://registry.npmjs.org/sequelize/-/sequelize-6.32.0.tgz", + "integrity": "sha512-gMd1M6kPANyrCeU/vtgEP5gnse7sVsiKbJyz7p4huuW8zZcRopj47UlglvdrMuIoqksZmsUPfApmMo6ZlJpcvg==", "requires": { "@types/debug": "^4.1.7", "@types/validator": "^13.7.1", From 390871d76bdea4abf85544005632c57419661236 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 2 Jun 2023 09:53:40 +0800 Subject: [PATCH 110/297] Bump xml2js from 0.5.0 to 0.6.0 (#1987) Bumps [xml2js](https://github.com/Leonidas-from-XIV/node-xml2js) from 0.5.0 to 0.6.0. - [Commits](https://github.com/Leonidas-from-XIV/node-xml2js/compare/0.5.0...0.6.0) --- updated-dependencies: - dependency-name: xml2js dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 14 +++++++------- package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index 3bfffb237..5cfbd3b50 100644 --- a/package-lock.json +++ b/package-lock.json @@ -30,7 +30,7 @@ "uri-templates": "^0.2.0", "uuid": "^3.3.2", "winston": "^3.1.0", - "xml2js": "^0.5.0" + "xml2js": "^0.6.0" }, "bin": { "azurite": "dist/src/azurite.js", @@ -10119,9 +10119,9 @@ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, "node_modules/xml2js": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.5.0.tgz", - "integrity": "sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA==", + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.6.0.tgz", + "integrity": "sha512-eLTh0kA8uHceqesPqSE+VvO1CDDJWMwlQfB6LuN6T8w6MaDJ8Txm8P7s5cHD0miF0V+GGTZrDQfxPZQVsur33w==", "dependencies": { "sax": ">=0.6.0", "xmlbuilder": "~11.0.0" @@ -17911,9 +17911,9 @@ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, "xml2js": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.5.0.tgz", - "integrity": "sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA==", + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.6.0.tgz", + "integrity": "sha512-eLTh0kA8uHceqesPqSE+VvO1CDDJWMwlQfB6LuN6T8w6MaDJ8Txm8P7s5cHD0miF0V+GGTZrDQfxPZQVsur33w==", "requires": { "sax": ">=0.6.0", "xmlbuilder": "~11.0.0" diff --git a/package.json b/package.json index cdc477e1f..d81c70baf 100644 --- a/package.json +++ b/package.json @@ -41,7 +41,7 @@ "uri-templates": "^0.2.0", "uuid": "^3.3.2", "winston": "^3.1.0", - "xml2js": "^0.5.0" + "xml2js": "^0.6.0" }, "devDependencies": { "@azure/core-auth": "^1.3.2", From 8721d56bf440e215393519b80b0f5ed449b00e62 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 5 Jun 2023 10:07:02 +0800 Subject: [PATCH 111/297] Bump @typescript-eslint/parser from 5.59.2 to 5.59.8 (#1990) Bumps [@typescript-eslint/parser](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/parser) from 5.59.2 to 5.59.8. - [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases) - [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/parser/CHANGELOG.md) - [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v5.59.8/packages/parser) --- updated-dependencies: - dependency-name: "@typescript-eslint/parser" dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 402 +++++----------------------------------------- 1 file changed, 43 insertions(+), 359 deletions(-) diff --git a/package-lock.json b/package-lock.json index 5cfbd3b50..59414ea46 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1625,53 +1625,6 @@ } } }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/scope-manager": { - "version": "5.59.8", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.59.8.tgz", - "integrity": "sha512-/w08ndCYI8gxGf+9zKf1vtx/16y8MHrZs5/tnjHhMLNSixuNcJavSX4wAiPf4aS5x41Es9YPCn44MIe4cxIlig==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.59.8", - "@typescript-eslint/visitor-keys": "5.59.8" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/types": { - "version": "5.59.8", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.8.tgz", - "integrity": "sha512-+uWuOhBTj/L6awoWIg0BlWy0u9TyFpCHrAuQ5bNfxDaZ1Ppb3mx6tUigc74LHcbHpOHuOTOJrBoAnhdHdaea1w==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/visitor-keys": { - "version": "5.59.8", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.8.tgz", - "integrity": "sha512-pJhi2ms0x0xgloT7xYabil3SGGlojNNKjK/q6dB3Ey0uJLMjK2UDGJvHieiyJVW/7C3KI+Z4Q3pEHkm4ejA+xQ==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.59.8", - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -1696,14 +1649,14 @@ "dev": true }, "node_modules/@typescript-eslint/parser": { - "version": "5.59.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.59.2.tgz", - "integrity": "sha512-uq0sKyw6ao1iFOZZGk9F8Nro/8+gfB5ezl1cA06SrqbgJAt0SRoFhb9pXaHvkrxUpZaoLxt8KlovHNk8Gp6/HQ==", + "version": "5.59.8", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.59.8.tgz", + "integrity": "sha512-AnR19RjJcpjoeGojmwZtCwBX/RidqDZtzcbG3xHrmz0aHHoOcbWnpDllenRDmDvsV0RQ6+tbb09/kyc+UT9Orw==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "5.59.2", - "@typescript-eslint/types": "5.59.2", - "@typescript-eslint/typescript-estree": "5.59.2", + "@typescript-eslint/scope-manager": "5.59.8", + "@typescript-eslint/types": "5.59.8", + "@typescript-eslint/typescript-estree": "5.59.8", "debug": "^4.3.4" }, "engines": { @@ -1746,13 +1699,13 @@ "dev": true }, "node_modules/@typescript-eslint/scope-manager": { - "version": "5.59.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.59.2.tgz", - "integrity": "sha512-dB1v7ROySwQWKqQ8rEWcdbTsFjh2G0vn8KUyvTXdPoyzSL6lLGkiXEV5CvpJsEe9xIdKV+8Zqb7wif2issoOFA==", + "version": "5.59.8", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.59.8.tgz", + "integrity": "sha512-/w08ndCYI8gxGf+9zKf1vtx/16y8MHrZs5/tnjHhMLNSixuNcJavSX4wAiPf4aS5x41Es9YPCn44MIe4cxIlig==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.59.2", - "@typescript-eslint/visitor-keys": "5.59.2" + "@typescript-eslint/types": "5.59.8", + "@typescript-eslint/visitor-keys": "5.59.8" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -1789,63 +1742,6 @@ } } }, - "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/types": { - "version": "5.59.8", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.8.tgz", - "integrity": "sha512-+uWuOhBTj/L6awoWIg0BlWy0u9TyFpCHrAuQ5bNfxDaZ1Ppb3mx6tUigc74LHcbHpOHuOTOJrBoAnhdHdaea1w==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree": { - "version": "5.59.8", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.8.tgz", - "integrity": "sha512-Jy/lPSDJGNow14vYu6IrW790p7HIf/SOV1Bb6lZ7NUkLc2iB2Z9elESmsaUtLw8kVqogSbtLH9tut5GCX1RLDg==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.59.8", - "@typescript-eslint/visitor-keys": "5.59.8", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/visitor-keys": { - "version": "5.59.8", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.8.tgz", - "integrity": "sha512-pJhi2ms0x0xgloT7xYabil3SGGlojNNKjK/q6dB3Ey0uJLMjK2UDGJvHieiyJVW/7C3KI+Z4Q3pEHkm4ejA+xQ==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.59.8", - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, "node_modules/@typescript-eslint/type-utils/node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -1870,9 +1766,9 @@ "dev": true }, "node_modules/@typescript-eslint/types": { - "version": "5.59.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.2.tgz", - "integrity": "sha512-LbJ/HqoVs2XTGq5shkiKaNTuVv5tTejdHgfdjqRUGdYhjW1crm/M7og2jhVskMt8/4wS3T1+PfFvL1K3wqYj4w==", + "version": "5.59.8", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.8.tgz", + "integrity": "sha512-+uWuOhBTj/L6awoWIg0BlWy0u9TyFpCHrAuQ5bNfxDaZ1Ppb3mx6tUigc74LHcbHpOHuOTOJrBoAnhdHdaea1w==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -1883,13 +1779,13 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.59.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.2.tgz", - "integrity": "sha512-+j4SmbwVmZsQ9jEyBMgpuBD0rKwi9RxRpjX71Brr73RsYnEr3Lt5QZ624Bxphp8HUkSKfqGnPJp1kA5nl0Sh7Q==", + "version": "5.59.8", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.8.tgz", + "integrity": "sha512-Jy/lPSDJGNow14vYu6IrW790p7HIf/SOV1Bb6lZ7NUkLc2iB2Z9elESmsaUtLw8kVqogSbtLH9tut5GCX1RLDg==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.59.2", - "@typescript-eslint/visitor-keys": "5.59.2", + "@typescript-eslint/types": "5.59.8", + "@typescript-eslint/visitor-keys": "5.59.8", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -1958,64 +1854,7 @@ "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, - "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/scope-manager": { - "version": "5.59.8", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.59.8.tgz", - "integrity": "sha512-/w08ndCYI8gxGf+9zKf1vtx/16y8MHrZs5/tnjHhMLNSixuNcJavSX4wAiPf4aS5x41Es9YPCn44MIe4cxIlig==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.59.8", - "@typescript-eslint/visitor-keys": "5.59.8" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/types": { - "version": "5.59.8", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.8.tgz", - "integrity": "sha512-+uWuOhBTj/L6awoWIg0BlWy0u9TyFpCHrAuQ5bNfxDaZ1Ppb3mx6tUigc74LHcbHpOHuOTOJrBoAnhdHdaea1w==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree": { - "version": "5.59.8", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.8.tgz", - "integrity": "sha512-Jy/lPSDJGNow14vYu6IrW790p7HIf/SOV1Bb6lZ7NUkLc2iB2Z9elESmsaUtLw8kVqogSbtLH9tut5GCX1RLDg==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.59.8", - "@typescript-eslint/visitor-keys": "5.59.8", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/visitor-keys": { + "node_modules/@typescript-eslint/visitor-keys": { "version": "5.59.8", "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.8.tgz", "integrity": "sha512-pJhi2ms0x0xgloT7xYabil3SGGlojNNKjK/q6dB3Ey0uJLMjK2UDGJvHieiyJVW/7C3KI+Z4Q3pEHkm4ejA+xQ==", @@ -2032,46 +1871,6 @@ "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@typescript-eslint/utils/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/utils/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.59.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.2.tgz", - "integrity": "sha512-EEpsO8m3RASrKAHI9jpavNv9NlEUebV4qmF1OWxSTtKSFBpC1NCmWazDQHFivRf0O1DV11BA645yrLEVQ0/Lig==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.59.2", - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, "node_modules/accepts": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", @@ -11451,32 +11250,6 @@ "tsutils": "^3.21.0" }, "dependencies": { - "@typescript-eslint/scope-manager": { - "version": "5.59.8", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.59.8.tgz", - "integrity": "sha512-/w08ndCYI8gxGf+9zKf1vtx/16y8MHrZs5/tnjHhMLNSixuNcJavSX4wAiPf4aS5x41Es9YPCn44MIe4cxIlig==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.59.8", - "@typescript-eslint/visitor-keys": "5.59.8" - } - }, - "@typescript-eslint/types": { - "version": "5.59.8", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.8.tgz", - "integrity": "sha512-+uWuOhBTj/L6awoWIg0BlWy0u9TyFpCHrAuQ5bNfxDaZ1Ppb3mx6tUigc74LHcbHpOHuOTOJrBoAnhdHdaea1w==", - "dev": true - }, - "@typescript-eslint/visitor-keys": { - "version": "5.59.8", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.8.tgz", - "integrity": "sha512-pJhi2ms0x0xgloT7xYabil3SGGlojNNKjK/q6dB3Ey0uJLMjK2UDGJvHieiyJVW/7C3KI+Z4Q3pEHkm4ejA+xQ==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.59.8", - "eslint-visitor-keys": "^3.3.0" - } - }, "debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -11495,14 +11268,14 @@ } }, "@typescript-eslint/parser": { - "version": "5.59.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.59.2.tgz", - "integrity": "sha512-uq0sKyw6ao1iFOZZGk9F8Nro/8+gfB5ezl1cA06SrqbgJAt0SRoFhb9pXaHvkrxUpZaoLxt8KlovHNk8Gp6/HQ==", + "version": "5.59.8", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.59.8.tgz", + "integrity": "sha512-AnR19RjJcpjoeGojmwZtCwBX/RidqDZtzcbG3xHrmz0aHHoOcbWnpDllenRDmDvsV0RQ6+tbb09/kyc+UT9Orw==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "5.59.2", - "@typescript-eslint/types": "5.59.2", - "@typescript-eslint/typescript-estree": "5.59.2", + "@typescript-eslint/scope-manager": "5.59.8", + "@typescript-eslint/types": "5.59.8", + "@typescript-eslint/typescript-estree": "5.59.8", "debug": "^4.3.4" }, "dependencies": { @@ -11524,13 +11297,13 @@ } }, "@typescript-eslint/scope-manager": { - "version": "5.59.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.59.2.tgz", - "integrity": "sha512-dB1v7ROySwQWKqQ8rEWcdbTsFjh2G0vn8KUyvTXdPoyzSL6lLGkiXEV5CvpJsEe9xIdKV+8Zqb7wif2issoOFA==", + "version": "5.59.8", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.59.8.tgz", + "integrity": "sha512-/w08ndCYI8gxGf+9zKf1vtx/16y8MHrZs5/tnjHhMLNSixuNcJavSX4wAiPf4aS5x41Es9YPCn44MIe4cxIlig==", "dev": true, "requires": { - "@typescript-eslint/types": "5.59.2", - "@typescript-eslint/visitor-keys": "5.59.2" + "@typescript-eslint/types": "5.59.8", + "@typescript-eslint/visitor-keys": "5.59.8" } }, "@typescript-eslint/type-utils": { @@ -11545,37 +11318,6 @@ "tsutils": "^3.21.0" }, "dependencies": { - "@typescript-eslint/types": { - "version": "5.59.8", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.8.tgz", - "integrity": "sha512-+uWuOhBTj/L6awoWIg0BlWy0u9TyFpCHrAuQ5bNfxDaZ1Ppb3mx6tUigc74LHcbHpOHuOTOJrBoAnhdHdaea1w==", - "dev": true - }, - "@typescript-eslint/typescript-estree": { - "version": "5.59.8", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.8.tgz", - "integrity": "sha512-Jy/lPSDJGNow14vYu6IrW790p7HIf/SOV1Bb6lZ7NUkLc2iB2Z9elESmsaUtLw8kVqogSbtLH9tut5GCX1RLDg==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.59.8", - "@typescript-eslint/visitor-keys": "5.59.8", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - } - }, - "@typescript-eslint/visitor-keys": { - "version": "5.59.8", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.8.tgz", - "integrity": "sha512-pJhi2ms0x0xgloT7xYabil3SGGlojNNKjK/q6dB3Ey0uJLMjK2UDGJvHieiyJVW/7C3KI+Z4Q3pEHkm4ejA+xQ==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.59.8", - "eslint-visitor-keys": "^3.3.0" - } - }, "debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -11594,19 +11336,19 @@ } }, "@typescript-eslint/types": { - "version": "5.59.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.2.tgz", - "integrity": "sha512-LbJ/HqoVs2XTGq5shkiKaNTuVv5tTejdHgfdjqRUGdYhjW1crm/M7og2jhVskMt8/4wS3T1+PfFvL1K3wqYj4w==", + "version": "5.59.8", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.8.tgz", + "integrity": "sha512-+uWuOhBTj/L6awoWIg0BlWy0u9TyFpCHrAuQ5bNfxDaZ1Ppb3mx6tUigc74LHcbHpOHuOTOJrBoAnhdHdaea1w==", "dev": true }, "@typescript-eslint/typescript-estree": { - "version": "5.59.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.2.tgz", - "integrity": "sha512-+j4SmbwVmZsQ9jEyBMgpuBD0rKwi9RxRpjX71Brr73RsYnEr3Lt5QZ624Bxphp8HUkSKfqGnPJp1kA5nl0Sh7Q==", + "version": "5.59.8", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.8.tgz", + "integrity": "sha512-Jy/lPSDJGNow14vYu6IrW790p7HIf/SOV1Bb6lZ7NUkLc2iB2Z9elESmsaUtLw8kVqogSbtLH9tut5GCX1RLDg==", "dev": true, "requires": { - "@typescript-eslint/types": "5.59.2", - "@typescript-eslint/visitor-keys": "5.59.2", + "@typescript-eslint/types": "5.59.8", + "@typescript-eslint/visitor-keys": "5.59.8", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -11645,73 +11387,15 @@ "@typescript-eslint/typescript-estree": "5.59.8", "eslint-scope": "^5.1.1", "semver": "^7.3.7" - }, - "dependencies": { - "@typescript-eslint/scope-manager": { - "version": "5.59.8", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.59.8.tgz", - "integrity": "sha512-/w08ndCYI8gxGf+9zKf1vtx/16y8MHrZs5/tnjHhMLNSixuNcJavSX4wAiPf4aS5x41Es9YPCn44MIe4cxIlig==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.59.8", - "@typescript-eslint/visitor-keys": "5.59.8" - } - }, - "@typescript-eslint/types": { - "version": "5.59.8", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.8.tgz", - "integrity": "sha512-+uWuOhBTj/L6awoWIg0BlWy0u9TyFpCHrAuQ5bNfxDaZ1Ppb3mx6tUigc74LHcbHpOHuOTOJrBoAnhdHdaea1w==", - "dev": true - }, - "@typescript-eslint/typescript-estree": { - "version": "5.59.8", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.8.tgz", - "integrity": "sha512-Jy/lPSDJGNow14vYu6IrW790p7HIf/SOV1Bb6lZ7NUkLc2iB2Z9elESmsaUtLw8kVqogSbtLH9tut5GCX1RLDg==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.59.8", - "@typescript-eslint/visitor-keys": "5.59.8", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - } - }, - "@typescript-eslint/visitor-keys": { - "version": "5.59.8", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.8.tgz", - "integrity": "sha512-pJhi2ms0x0xgloT7xYabil3SGGlojNNKjK/q6dB3Ey0uJLMjK2UDGJvHieiyJVW/7C3KI+Z4Q3pEHkm4ejA+xQ==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.59.8", - "eslint-visitor-keys": "^3.3.0" - } - }, - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } } }, "@typescript-eslint/visitor-keys": { - "version": "5.59.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.2.tgz", - "integrity": "sha512-EEpsO8m3RASrKAHI9jpavNv9NlEUebV4qmF1OWxSTtKSFBpC1NCmWazDQHFivRf0O1DV11BA645yrLEVQ0/Lig==", + "version": "5.59.8", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.8.tgz", + "integrity": "sha512-pJhi2ms0x0xgloT7xYabil3SGGlojNNKjK/q6dB3Ey0uJLMjK2UDGJvHieiyJVW/7C3KI+Z4Q3pEHkm4ejA+xQ==", "dev": true, "requires": { - "@typescript-eslint/types": "5.59.2", + "@typescript-eslint/types": "5.59.8", "eslint-visitor-keys": "^3.3.0" } }, From 479871d4856986e7e3885eb64792b0196f34745f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 5 Jun 2023 10:39:49 +0800 Subject: [PATCH 112/297] Bump @azure/core-rest-pipeline from 1.10.2 to 1.11.0 (#1989) Bumps [@azure/core-rest-pipeline](https://github.com/Azure/azure-sdk-for-js) from 1.10.2 to 1.11.0. - [Release notes](https://github.com/Azure/azure-sdk-for-js/releases) - [Changelog](https://github.com/Azure/azure-sdk-for-js/blob/main/documentation/Changelog-for-next-generation.md) - [Commits](https://github.com/Azure/azure-sdk-for-js/compare/@azure/core-rest-pipeline_1.10.2...@azure/core-rest-pipeline_1.11.0) --- updated-dependencies: - dependency-name: "@azure/core-rest-pipeline" dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 47 ++++++++++++++++------------------------------- 1 file changed, 16 insertions(+), 31 deletions(-) diff --git a/package-lock.json b/package-lock.json index 59414ea46..ea278b552 100644 --- a/package-lock.json +++ b/package-lock.json @@ -229,20 +229,19 @@ } }, "node_modules/@azure/core-rest-pipeline": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/@azure/core-rest-pipeline/-/core-rest-pipeline-1.10.2.tgz", - "integrity": "sha512-e3WzAsRKLor5EgK2bQqR1OY5D7VBqzORHtlqtygZZQGCYOIBsynqrZBa8MFD1Ue9r8TPtofOLditalnlQHS45Q==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@azure/core-rest-pipeline/-/core-rest-pipeline-1.11.0.tgz", + "integrity": "sha512-nB4KXl6qAyJmBVLWA7SakT4tzpYZTCk4pvRBeI+Ye0WYSOrlTqlMhc4MSS/8atD3ufeYWdkN380LLoXlUUzThw==", "dependencies": { "@azure/abort-controller": "^1.0.0", "@azure/core-auth": "^1.4.0", "@azure/core-tracing": "^1.0.1", - "@azure/core-util": "^1.0.0", + "@azure/core-util": "^1.3.0", "@azure/logger": "^1.0.0", "form-data": "^4.0.0", "http-proxy-agent": "^5.0.0", "https-proxy-agent": "^5.0.0", - "tslib": "^2.2.0", - "uuid": "^8.3.0" + "tslib": "^2.2.0" }, "engines": { "node": ">=14.0.0" @@ -272,14 +271,6 @@ "node": ">= 6" } }, - "node_modules/@azure/core-rest-pipeline/node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "bin": { - "uuid": "dist/bin/uuid" - } - }, "node_modules/@azure/core-tracing": { "version": "1.0.0-preview.13", "resolved": "https://registry.npmjs.org/@azure/core-tracing/-/core-tracing-1.0.0-preview.13.tgz", @@ -293,9 +284,9 @@ } }, "node_modules/@azure/core-util": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@azure/core-util/-/core-util-1.2.0.tgz", - "integrity": "sha512-ffGIw+Qs8bNKNLxz5UPkz4/VBM/EZY07mPve1ZYFqYUdPwFqRj0RPk0U7LZMOfT7GCck9YjuT1Rfp1PApNl1ng==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@azure/core-util/-/core-util-1.3.2.tgz", + "integrity": "sha512-2bECOUh88RvL1pMZTcc6OzfobBeWDBf5oBbhjIhT1MV9otMVWCzpOJkkiKtrnO88y5GGBelgY8At73KGAdbkeQ==", "dependencies": { "@azure/abort-controller": "^1.0.0", "tslib": "^2.2.0" @@ -10115,20 +10106,19 @@ } }, "@azure/core-rest-pipeline": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/@azure/core-rest-pipeline/-/core-rest-pipeline-1.10.2.tgz", - "integrity": "sha512-e3WzAsRKLor5EgK2bQqR1OY5D7VBqzORHtlqtygZZQGCYOIBsynqrZBa8MFD1Ue9r8TPtofOLditalnlQHS45Q==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@azure/core-rest-pipeline/-/core-rest-pipeline-1.11.0.tgz", + "integrity": "sha512-nB4KXl6qAyJmBVLWA7SakT4tzpYZTCk4pvRBeI+Ye0WYSOrlTqlMhc4MSS/8atD3ufeYWdkN380LLoXlUUzThw==", "requires": { "@azure/abort-controller": "^1.0.0", "@azure/core-auth": "^1.4.0", "@azure/core-tracing": "^1.0.1", - "@azure/core-util": "^1.0.0", + "@azure/core-util": "^1.3.0", "@azure/logger": "^1.0.0", "form-data": "^4.0.0", "http-proxy-agent": "^5.0.0", "https-proxy-agent": "^5.0.0", - "tslib": "^2.2.0", - "uuid": "^8.3.0" + "tslib": "^2.2.0" }, "dependencies": { "@azure/core-tracing": { @@ -10148,11 +10138,6 @@ "combined-stream": "^1.0.8", "mime-types": "^2.1.12" } - }, - "uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" } } }, @@ -10166,9 +10151,9 @@ } }, "@azure/core-util": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@azure/core-util/-/core-util-1.2.0.tgz", - "integrity": "sha512-ffGIw+Qs8bNKNLxz5UPkz4/VBM/EZY07mPve1ZYFqYUdPwFqRj0RPk0U7LZMOfT7GCck9YjuT1Rfp1PApNl1ng==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@azure/core-util/-/core-util-1.3.2.tgz", + "integrity": "sha512-2bECOUh88RvL1pMZTcc6OzfobBeWDBf5oBbhjIhT1MV9otMVWCzpOJkkiKtrnO88y5GGBelgY8At73KGAdbkeQ==", "requires": { "@azure/abort-controller": "^1.0.0", "tslib": "^2.2.0" From 2e2851ebb1b769fe642e56755b84e3a0fb1c5e6e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 5 Jun 2023 10:46:54 +0800 Subject: [PATCH 113/297] Bump @types/validator from 13.7.15 to 13.7.17 (#1965) Bumps [@types/validator](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/validator) from 13.7.15 to 13.7.17. - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/validator) --- updated-dependencies: - dependency-name: "@types/validator" dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index ea278b552..f01e15d7e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1563,9 +1563,9 @@ } }, "node_modules/@types/validator": { - "version": "13.7.15", - "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.7.15.tgz", - "integrity": "sha512-yeinDVQunb03AEP8luErFcyf/7Lf7AzKCD0NXfgVoGCCQDNpZET8Jgq74oBgqKld3hafLbfzt/3inUdQvaFeXQ==" + "version": "13.7.17", + "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.7.17.tgz", + "integrity": "sha512-aqayTNmeWrZcvnG2MG9eGYI6b7S5fl+yKgPs6bAjOTwPS316R5SxBGKvtSExfyoJU7pIeHJfsHI0Ji41RVMkvQ==" }, "node_modules/@types/vscode": { "version": "1.78.1", @@ -11198,9 +11198,9 @@ } }, "@types/validator": { - "version": "13.7.15", - "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.7.15.tgz", - "integrity": "sha512-yeinDVQunb03AEP8luErFcyf/7Lf7AzKCD0NXfgVoGCCQDNpZET8Jgq74oBgqKld3hafLbfzt/3inUdQvaFeXQ==" + "version": "13.7.17", + "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.7.17.tgz", + "integrity": "sha512-aqayTNmeWrZcvnG2MG9eGYI6b7S5fl+yKgPs6bAjOTwPS316R5SxBGKvtSExfyoJU7pIeHJfsHI0Ji41RVMkvQ==" }, "@types/vscode": { "version": "1.78.1", From 1d3fb0da8874e9883c51d0500afd0ae7f57aaa04 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 6 Jun 2023 10:20:13 +0800 Subject: [PATCH 114/297] Bump @typescript-eslint/parser from 5.59.8 to 5.59.9 (#1996) Bumps [@typescript-eslint/parser](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/parser) from 5.59.8 to 5.59.9. - [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases) - [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/parser/CHANGELOG.md) - [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v5.59.9/packages/parser) --- updated-dependencies: - dependency-name: "@typescript-eslint/parser" dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 139 ++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 127 insertions(+), 12 deletions(-) diff --git a/package-lock.json b/package-lock.json index f01e15d7e..12623cdd4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1640,14 +1640,14 @@ "dev": true }, "node_modules/@typescript-eslint/parser": { - "version": "5.59.8", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.59.8.tgz", - "integrity": "sha512-AnR19RjJcpjoeGojmwZtCwBX/RidqDZtzcbG3xHrmz0aHHoOcbWnpDllenRDmDvsV0RQ6+tbb09/kyc+UT9Orw==", + "version": "5.59.9", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.59.9.tgz", + "integrity": "sha512-FsPkRvBtcLQ/eVK1ivDiNYBjn3TGJdXy2fhXX+rc7czWl4ARwnpArwbihSOHI2Peg9WbtGHrbThfBUkZZGTtvQ==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "5.59.8", - "@typescript-eslint/types": "5.59.8", - "@typescript-eslint/typescript-estree": "5.59.8", + "@typescript-eslint/scope-manager": "5.59.9", + "@typescript-eslint/types": "5.59.9", + "@typescript-eslint/typescript-estree": "5.59.9", "debug": "^4.3.4" }, "engines": { @@ -1666,6 +1666,80 @@ } } }, + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/scope-manager": { + "version": "5.59.9", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.59.9.tgz", + "integrity": "sha512-8RA+E+w78z1+2dzvK/tGZ2cpGigBZ58VMEHDZtpE1v+LLjzrYGc8mMaTONSxKyEkz3IuXFM0IqYiGHlCsmlZxQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.59.9", + "@typescript-eslint/visitor-keys": "5.59.9" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/types": { + "version": "5.59.9", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.9.tgz", + "integrity": "sha512-uW8H5NRgTVneSVTfiCVffBb8AbwWSKg7qcA4Ot3JI3MPCJGsB4Db4BhvAODIIYE5mNj7Q+VJkK7JxmRhk2Lyjw==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/typescript-estree": { + "version": "5.59.9", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.9.tgz", + "integrity": "sha512-pmM0/VQ7kUhd1QyIxgS+aRvMgw+ZljB3eDb+jYyp6d2bC0mQWLzUDF+DLwCTkQ3tlNyVsvZRXjFyV0LkU/aXjA==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.59.9", + "@typescript-eslint/visitor-keys": "5.59.9", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/visitor-keys": { + "version": "5.59.9", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.9.tgz", + "integrity": "sha512-bT7s0td97KMaLwpEBckbzj/YohnvXtqbe2XgqNvTl6RJVakY5mvENOTPvw5u66nljfZxthESpDozs86U+oLY8Q==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.59.9", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, "node_modules/@typescript-eslint/parser/node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -11253,17 +11327,58 @@ } }, "@typescript-eslint/parser": { - "version": "5.59.8", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.59.8.tgz", - "integrity": "sha512-AnR19RjJcpjoeGojmwZtCwBX/RidqDZtzcbG3xHrmz0aHHoOcbWnpDllenRDmDvsV0RQ6+tbb09/kyc+UT9Orw==", + "version": "5.59.9", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.59.9.tgz", + "integrity": "sha512-FsPkRvBtcLQ/eVK1ivDiNYBjn3TGJdXy2fhXX+rc7czWl4ARwnpArwbihSOHI2Peg9WbtGHrbThfBUkZZGTtvQ==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "5.59.8", - "@typescript-eslint/types": "5.59.8", - "@typescript-eslint/typescript-estree": "5.59.8", + "@typescript-eslint/scope-manager": "5.59.9", + "@typescript-eslint/types": "5.59.9", + "@typescript-eslint/typescript-estree": "5.59.9", "debug": "^4.3.4" }, "dependencies": { + "@typescript-eslint/scope-manager": { + "version": "5.59.9", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.59.9.tgz", + "integrity": "sha512-8RA+E+w78z1+2dzvK/tGZ2cpGigBZ58VMEHDZtpE1v+LLjzrYGc8mMaTONSxKyEkz3IuXFM0IqYiGHlCsmlZxQ==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.59.9", + "@typescript-eslint/visitor-keys": "5.59.9" + } + }, + "@typescript-eslint/types": { + "version": "5.59.9", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.9.tgz", + "integrity": "sha512-uW8H5NRgTVneSVTfiCVffBb8AbwWSKg7qcA4Ot3JI3MPCJGsB4Db4BhvAODIIYE5mNj7Q+VJkK7JxmRhk2Lyjw==", + "dev": true + }, + "@typescript-eslint/typescript-estree": { + "version": "5.59.9", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.9.tgz", + "integrity": "sha512-pmM0/VQ7kUhd1QyIxgS+aRvMgw+ZljB3eDb+jYyp6d2bC0mQWLzUDF+DLwCTkQ3tlNyVsvZRXjFyV0LkU/aXjA==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.59.9", + "@typescript-eslint/visitor-keys": "5.59.9", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + } + }, + "@typescript-eslint/visitor-keys": { + "version": "5.59.9", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.9.tgz", + "integrity": "sha512-bT7s0td97KMaLwpEBckbzj/YohnvXtqbe2XgqNvTl6RJVakY5mvENOTPvw5u66nljfZxthESpDozs86U+oLY8Q==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.59.9", + "eslint-visitor-keys": "^3.3.0" + } + }, "debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", From 75c50fc854d1a40ff86c0f2b45d1f2ab178e68e6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 6 Jun 2023 10:21:04 +0800 Subject: [PATCH 115/297] Bump @typescript-eslint/eslint-plugin from 5.59.8 to 5.59.9 (#1995) Bumps [@typescript-eslint/eslint-plugin](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/eslint-plugin) from 5.59.8 to 5.59.9. - [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases) - [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/eslint-plugin/CHANGELOG.md) - [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v5.59.9/packages/eslint-plugin) --- updated-dependencies: - dependency-name: "@typescript-eslint/eslint-plugin" dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 384 ++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 350 insertions(+), 34 deletions(-) diff --git a/package-lock.json b/package-lock.json index 12623cdd4..04f91d407 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1583,15 +1583,15 @@ } }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.59.8", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.59.8.tgz", - "integrity": "sha512-JDMOmhXteJ4WVKOiHXGCoB96ADWg9q7efPWHRViT/f09bA8XOMLAVHHju3l0MkZnG1izaWXYmgvQcUjTRcpShQ==", + "version": "5.59.9", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.59.9.tgz", + "integrity": "sha512-4uQIBq1ffXd2YvF7MAvehWKW3zVv/w+mSfRAu+8cKbfj3nwzyqJLNcZJpQ/WZ1HLbJDiowwmQ6NO+63nCA+fqA==", "dev": true, "dependencies": { "@eslint-community/regexpp": "^4.4.0", - "@typescript-eslint/scope-manager": "5.59.8", - "@typescript-eslint/type-utils": "5.59.8", - "@typescript-eslint/utils": "5.59.8", + "@typescript-eslint/scope-manager": "5.59.9", + "@typescript-eslint/type-utils": "5.59.9", + "@typescript-eslint/utils": "5.59.9", "debug": "^4.3.4", "grapheme-splitter": "^1.0.4", "ignore": "^5.2.0", @@ -1616,6 +1616,53 @@ } } }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/scope-manager": { + "version": "5.59.9", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.59.9.tgz", + "integrity": "sha512-8RA+E+w78z1+2dzvK/tGZ2cpGigBZ58VMEHDZtpE1v+LLjzrYGc8mMaTONSxKyEkz3IuXFM0IqYiGHlCsmlZxQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.59.9", + "@typescript-eslint/visitor-keys": "5.59.9" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/types": { + "version": "5.59.9", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.9.tgz", + "integrity": "sha512-uW8H5NRgTVneSVTfiCVffBb8AbwWSKg7qcA4Ot3JI3MPCJGsB4Db4BhvAODIIYE5mNj7Q+VJkK7JxmRhk2Lyjw==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/visitor-keys": { + "version": "5.59.9", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.9.tgz", + "integrity": "sha512-bT7s0td97KMaLwpEBckbzj/YohnvXtqbe2XgqNvTl6RJVakY5mvENOTPvw5u66nljfZxthESpDozs86U+oLY8Q==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.59.9", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -1781,13 +1828,13 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "5.59.8", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.59.8.tgz", - "integrity": "sha512-+5M518uEIHFBy3FnyqZUF3BMP+AXnYn4oyH8RF012+e7/msMY98FhGL5SrN29NQ9xDgvqCgYnsOiKp1VjZ/fpA==", + "version": "5.59.9", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.59.9.tgz", + "integrity": "sha512-ksEsT0/mEHg9e3qZu98AlSrONAQtrSTljL3ow9CGej8eRo7pe+yaC/mvTjptp23Xo/xIf2mLZKC6KPv4Sji26Q==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "5.59.8", - "@typescript-eslint/utils": "5.59.8", + "@typescript-eslint/typescript-estree": "5.59.9", + "@typescript-eslint/utils": "5.59.9", "debug": "^4.3.4", "tsutils": "^3.21.0" }, @@ -1807,6 +1854,63 @@ } } }, + "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/types": { + "version": "5.59.9", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.9.tgz", + "integrity": "sha512-uW8H5NRgTVneSVTfiCVffBb8AbwWSKg7qcA4Ot3JI3MPCJGsB4Db4BhvAODIIYE5mNj7Q+VJkK7JxmRhk2Lyjw==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree": { + "version": "5.59.9", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.9.tgz", + "integrity": "sha512-pmM0/VQ7kUhd1QyIxgS+aRvMgw+ZljB3eDb+jYyp6d2bC0mQWLzUDF+DLwCTkQ3tlNyVsvZRXjFyV0LkU/aXjA==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.59.9", + "@typescript-eslint/visitor-keys": "5.59.9", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/visitor-keys": { + "version": "5.59.9", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.9.tgz", + "integrity": "sha512-bT7s0td97KMaLwpEBckbzj/YohnvXtqbe2XgqNvTl6RJVakY5mvENOTPvw5u66nljfZxthESpDozs86U+oLY8Q==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.59.9", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, "node_modules/@typescript-eslint/type-utils/node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -1894,17 +1998,17 @@ "dev": true }, "node_modules/@typescript-eslint/utils": { - "version": "5.59.8", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.59.8.tgz", - "integrity": "sha512-Tr65630KysnNn9f9G7ROF3w1b5/7f6QVCJ+WK9nhIocWmx9F+TmCAcglF26Vm7z8KCTwoKcNEBZrhlklla3CKg==", + "version": "5.59.9", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.59.9.tgz", + "integrity": "sha512-1PuMYsju/38I5Ggblaeb98TOoUvjhRvLpLa1DoTOFaLWqaXl/1iQ1eGurTXgBY58NUdtfTXKP5xBq7q9NDaLKg==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@types/json-schema": "^7.0.9", "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.59.8", - "@typescript-eslint/types": "5.59.8", - "@typescript-eslint/typescript-estree": "5.59.8", + "@typescript-eslint/scope-manager": "5.59.9", + "@typescript-eslint/types": "5.59.9", + "@typescript-eslint/typescript-estree": "5.59.9", "eslint-scope": "^5.1.1", "semver": "^7.3.7" }, @@ -1919,6 +2023,103 @@ "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, + "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/scope-manager": { + "version": "5.59.9", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.59.9.tgz", + "integrity": "sha512-8RA+E+w78z1+2dzvK/tGZ2cpGigBZ58VMEHDZtpE1v+LLjzrYGc8mMaTONSxKyEkz3IuXFM0IqYiGHlCsmlZxQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.59.9", + "@typescript-eslint/visitor-keys": "5.59.9" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/types": { + "version": "5.59.9", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.9.tgz", + "integrity": "sha512-uW8H5NRgTVneSVTfiCVffBb8AbwWSKg7qcA4Ot3JI3MPCJGsB4Db4BhvAODIIYE5mNj7Q+VJkK7JxmRhk2Lyjw==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree": { + "version": "5.59.9", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.9.tgz", + "integrity": "sha512-pmM0/VQ7kUhd1QyIxgS+aRvMgw+ZljB3eDb+jYyp6d2bC0mQWLzUDF+DLwCTkQ3tlNyVsvZRXjFyV0LkU/aXjA==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.59.9", + "@typescript-eslint/visitor-keys": "5.59.9", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/visitor-keys": { + "version": "5.59.9", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.9.tgz", + "integrity": "sha512-bT7s0td97KMaLwpEBckbzj/YohnvXtqbe2XgqNvTl6RJVakY5mvENOTPvw5u66nljfZxthESpDozs86U+oLY8Q==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.59.9", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/utils/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, "node_modules/@typescript-eslint/visitor-keys": { "version": "5.59.8", "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.8.tgz", @@ -11292,15 +11493,15 @@ } }, "@typescript-eslint/eslint-plugin": { - "version": "5.59.8", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.59.8.tgz", - "integrity": "sha512-JDMOmhXteJ4WVKOiHXGCoB96ADWg9q7efPWHRViT/f09bA8XOMLAVHHju3l0MkZnG1izaWXYmgvQcUjTRcpShQ==", + "version": "5.59.9", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.59.9.tgz", + "integrity": "sha512-4uQIBq1ffXd2YvF7MAvehWKW3zVv/w+mSfRAu+8cKbfj3nwzyqJLNcZJpQ/WZ1HLbJDiowwmQ6NO+63nCA+fqA==", "dev": true, "requires": { "@eslint-community/regexpp": "^4.4.0", - "@typescript-eslint/scope-manager": "5.59.8", - "@typescript-eslint/type-utils": "5.59.8", - "@typescript-eslint/utils": "5.59.8", + "@typescript-eslint/scope-manager": "5.59.9", + "@typescript-eslint/type-utils": "5.59.9", + "@typescript-eslint/utils": "5.59.9", "debug": "^4.3.4", "grapheme-splitter": "^1.0.4", "ignore": "^5.2.0", @@ -11309,6 +11510,32 @@ "tsutils": "^3.21.0" }, "dependencies": { + "@typescript-eslint/scope-manager": { + "version": "5.59.9", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.59.9.tgz", + "integrity": "sha512-8RA+E+w78z1+2dzvK/tGZ2cpGigBZ58VMEHDZtpE1v+LLjzrYGc8mMaTONSxKyEkz3IuXFM0IqYiGHlCsmlZxQ==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.59.9", + "@typescript-eslint/visitor-keys": "5.59.9" + } + }, + "@typescript-eslint/types": { + "version": "5.59.9", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.9.tgz", + "integrity": "sha512-uW8H5NRgTVneSVTfiCVffBb8AbwWSKg7qcA4Ot3JI3MPCJGsB4Db4BhvAODIIYE5mNj7Q+VJkK7JxmRhk2Lyjw==", + "dev": true + }, + "@typescript-eslint/visitor-keys": { + "version": "5.59.9", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.9.tgz", + "integrity": "sha512-bT7s0td97KMaLwpEBckbzj/YohnvXtqbe2XgqNvTl6RJVakY5mvENOTPvw5u66nljfZxthESpDozs86U+oLY8Q==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.59.9", + "eslint-visitor-keys": "^3.3.0" + } + }, "debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -11407,17 +11634,48 @@ } }, "@typescript-eslint/type-utils": { - "version": "5.59.8", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.59.8.tgz", - "integrity": "sha512-+5M518uEIHFBy3FnyqZUF3BMP+AXnYn4oyH8RF012+e7/msMY98FhGL5SrN29NQ9xDgvqCgYnsOiKp1VjZ/fpA==", + "version": "5.59.9", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.59.9.tgz", + "integrity": "sha512-ksEsT0/mEHg9e3qZu98AlSrONAQtrSTljL3ow9CGej8eRo7pe+yaC/mvTjptp23Xo/xIf2mLZKC6KPv4Sji26Q==", "dev": true, "requires": { - "@typescript-eslint/typescript-estree": "5.59.8", - "@typescript-eslint/utils": "5.59.8", + "@typescript-eslint/typescript-estree": "5.59.9", + "@typescript-eslint/utils": "5.59.9", "debug": "^4.3.4", "tsutils": "^3.21.0" }, "dependencies": { + "@typescript-eslint/types": { + "version": "5.59.9", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.9.tgz", + "integrity": "sha512-uW8H5NRgTVneSVTfiCVffBb8AbwWSKg7qcA4Ot3JI3MPCJGsB4Db4BhvAODIIYE5mNj7Q+VJkK7JxmRhk2Lyjw==", + "dev": true + }, + "@typescript-eslint/typescript-estree": { + "version": "5.59.9", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.9.tgz", + "integrity": "sha512-pmM0/VQ7kUhd1QyIxgS+aRvMgw+ZljB3eDb+jYyp6d2bC0mQWLzUDF+DLwCTkQ3tlNyVsvZRXjFyV0LkU/aXjA==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.59.9", + "@typescript-eslint/visitor-keys": "5.59.9", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + } + }, + "@typescript-eslint/visitor-keys": { + "version": "5.59.9", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.9.tgz", + "integrity": "sha512-bT7s0td97KMaLwpEBckbzj/YohnvXtqbe2XgqNvTl6RJVakY5mvENOTPvw5u66nljfZxthESpDozs86U+oLY8Q==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.59.9", + "eslint-visitor-keys": "^3.3.0" + } + }, "debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -11474,19 +11732,77 @@ } }, "@typescript-eslint/utils": { - "version": "5.59.8", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.59.8.tgz", - "integrity": "sha512-Tr65630KysnNn9f9G7ROF3w1b5/7f6QVCJ+WK9nhIocWmx9F+TmCAcglF26Vm7z8KCTwoKcNEBZrhlklla3CKg==", + "version": "5.59.9", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.59.9.tgz", + "integrity": "sha512-1PuMYsju/38I5Ggblaeb98TOoUvjhRvLpLa1DoTOFaLWqaXl/1iQ1eGurTXgBY58NUdtfTXKP5xBq7q9NDaLKg==", "dev": true, "requires": { "@eslint-community/eslint-utils": "^4.2.0", "@types/json-schema": "^7.0.9", "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.59.8", - "@typescript-eslint/types": "5.59.8", - "@typescript-eslint/typescript-estree": "5.59.8", + "@typescript-eslint/scope-manager": "5.59.9", + "@typescript-eslint/types": "5.59.9", + "@typescript-eslint/typescript-estree": "5.59.9", "eslint-scope": "^5.1.1", "semver": "^7.3.7" + }, + "dependencies": { + "@typescript-eslint/scope-manager": { + "version": "5.59.9", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.59.9.tgz", + "integrity": "sha512-8RA+E+w78z1+2dzvK/tGZ2cpGigBZ58VMEHDZtpE1v+LLjzrYGc8mMaTONSxKyEkz3IuXFM0IqYiGHlCsmlZxQ==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.59.9", + "@typescript-eslint/visitor-keys": "5.59.9" + } + }, + "@typescript-eslint/types": { + "version": "5.59.9", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.9.tgz", + "integrity": "sha512-uW8H5NRgTVneSVTfiCVffBb8AbwWSKg7qcA4Ot3JI3MPCJGsB4Db4BhvAODIIYE5mNj7Q+VJkK7JxmRhk2Lyjw==", + "dev": true + }, + "@typescript-eslint/typescript-estree": { + "version": "5.59.9", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.9.tgz", + "integrity": "sha512-pmM0/VQ7kUhd1QyIxgS+aRvMgw+ZljB3eDb+jYyp6d2bC0mQWLzUDF+DLwCTkQ3tlNyVsvZRXjFyV0LkU/aXjA==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.59.9", + "@typescript-eslint/visitor-keys": "5.59.9", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + } + }, + "@typescript-eslint/visitor-keys": { + "version": "5.59.9", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.9.tgz", + "integrity": "sha512-bT7s0td97KMaLwpEBckbzj/YohnvXtqbe2XgqNvTl6RJVakY5mvENOTPvw5u66nljfZxthESpDozs86U+oLY8Q==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.59.9", + "eslint-visitor-keys": "^3.3.0" + } + }, + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } } }, "@typescript-eslint/visitor-keys": { From 2d50a6f0132eae5a03de72c4439cf14f5fa3735e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 6 Jun 2023 10:21:25 +0800 Subject: [PATCH 116/297] Bump tslib from 2.5.2 to 2.5.3 (#1994) Bumps [tslib](https://github.com/Microsoft/tslib) from 2.5.2 to 2.5.3. - [Release notes](https://github.com/Microsoft/tslib/releases) - [Commits](https://github.com/Microsoft/tslib/compare/2.5.2...v2.5.3) --- updated-dependencies: - dependency-name: tslib dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 04f91d407..f306c2a95 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9672,9 +9672,9 @@ } }, "node_modules/tslib": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.2.tgz", - "integrity": "sha512-5svOrSA2w3iGFDs1HibEVBGbDrAY82bFQ3HZ3ixB+88nsbsWQoKqDRb5UBYAUPEzbBn6dAp5gRNXglySbx1MlA==" + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.3.tgz", + "integrity": "sha512-mSxlJJwl3BMEQCUNnxXBU9jP4JBktcEGhURcPR6VQVlnP0FdDEsIaz0C35dXNGLyRfrATNofF0F5p2KPxQgB+w==" }, "node_modules/tsutils": { "version": "3.21.0", @@ -17612,9 +17612,9 @@ } }, "tslib": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.2.tgz", - "integrity": "sha512-5svOrSA2w3iGFDs1HibEVBGbDrAY82bFQ3HZ3ixB+88nsbsWQoKqDRb5UBYAUPEzbBn6dAp5gRNXglySbx1MlA==" + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.3.tgz", + "integrity": "sha512-mSxlJJwl3BMEQCUNnxXBU9jP4JBktcEGhURcPR6VQVlnP0FdDEsIaz0C35dXNGLyRfrATNofF0F5p2KPxQgB+w==" }, "tsutils": { "version": "3.21.0", From c270ddf03b15157845be686268720022a80c959d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 6 Jun 2023 10:30:35 +0800 Subject: [PATCH 117/297] Bump eslint from 8.41.0 to 8.42.0 (#1993) Bumps [eslint](https://github.com/eslint/eslint) from 8.41.0 to 8.42.0. - [Release notes](https://github.com/eslint/eslint/releases) - [Changelog](https://github.com/eslint/eslint/blob/main/CHANGELOG.md) - [Commits](https://github.com/eslint/eslint/compare/v8.41.0...v8.42.0) --- updated-dependencies: - dependency-name: eslint dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 199 +++++----------------------------------------- 1 file changed, 22 insertions(+), 177 deletions(-) diff --git a/package-lock.json b/package-lock.json index f306c2a95..ffc4e875e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1028,18 +1028,18 @@ } }, "node_modules/@eslint/js": { - "version": "8.41.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.41.0.tgz", - "integrity": "sha512-LxcyMGxwmTh2lY9FwHPGWOHmYFCZvbrFCBZL4FzSSsxsRPuhrYUg/49/0KDfW8tnIEaEHtfmn6+NPN+1DqaNmA==", + "version": "8.42.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.42.0.tgz", + "integrity": "sha512-6SWlXpWU5AvId8Ac7zjzmIOqMOba/JWY8XZ4A7q7Gn1Vlfg/SFFIlrtHXt9nPn4op9ZPAkl91Jao+QQv3r/ukw==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, "node_modules/@humanwhocodes/config-array": { - "version": "0.11.8", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz", - "integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==", + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.10.tgz", + "integrity": "sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==", "dev": true, "dependencies": { "@humanwhocodes/object-schema": "^1.2.1", @@ -1810,23 +1810,6 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "5.59.8", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.59.8.tgz", - "integrity": "sha512-/w08ndCYI8gxGf+9zKf1vtx/16y8MHrZs5/tnjHhMLNSixuNcJavSX4wAiPf4aS5x41Es9YPCn44MIe4cxIlig==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.59.8", - "@typescript-eslint/visitor-keys": "5.59.8" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, "node_modules/@typescript-eslint/type-utils": { "version": "5.59.9", "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.59.9.tgz", @@ -1934,69 +1917,6 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, - "node_modules/@typescript-eslint/types": { - "version": "5.59.8", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.8.tgz", - "integrity": "sha512-+uWuOhBTj/L6awoWIg0BlWy0u9TyFpCHrAuQ5bNfxDaZ1Ppb3mx6tUigc74LHcbHpOHuOTOJrBoAnhdHdaea1w==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.59.8", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.8.tgz", - "integrity": "sha512-Jy/lPSDJGNow14vYu6IrW790p7HIf/SOV1Bb6lZ7NUkLc2iB2Z9elESmsaUtLw8kVqogSbtLH9tut5GCX1RLDg==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.59.8", - "@typescript-eslint/visitor-keys": "5.59.8", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, "node_modules/@typescript-eslint/utils": { "version": "5.59.9", "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.59.9.tgz", @@ -2120,23 +2040,6 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.59.8", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.8.tgz", - "integrity": "sha512-pJhi2ms0x0xgloT7xYabil3SGGlojNNKjK/q6dB3Ey0uJLMjK2UDGJvHieiyJVW/7C3KI+Z4Q3pEHkm4ejA+xQ==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.59.8", - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, "node_modules/accepts": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", @@ -4457,16 +4360,16 @@ } }, "node_modules/eslint": { - "version": "8.41.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.41.0.tgz", - "integrity": "sha512-WQDQpzGBOP5IrXPo4Hc0814r4/v2rrIsB0rhT7jtunIalgg6gYXWhRMOejVO8yH21T/FGaxjmFjBMNqcIlmH1Q==", + "version": "8.42.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.42.0.tgz", + "integrity": "sha512-ulg9Ms6E1WPf67PHaEY4/6E2tEn5/f7FXGzr3t9cBMugOmf1INYvuUwwh1aXQN4MfJ6a5K2iNwP3w4AColvI9A==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.4.0", "@eslint/eslintrc": "^2.0.3", - "@eslint/js": "8.41.0", - "@humanwhocodes/config-array": "^0.11.8", + "@eslint/js": "8.42.0", + "@humanwhocodes/config-array": "^0.11.10", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", "ajv": "^6.10.0", @@ -11011,15 +10914,15 @@ } }, "@eslint/js": { - "version": "8.41.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.41.0.tgz", - "integrity": "sha512-LxcyMGxwmTh2lY9FwHPGWOHmYFCZvbrFCBZL4FzSSsxsRPuhrYUg/49/0KDfW8tnIEaEHtfmn6+NPN+1DqaNmA==", + "version": "8.42.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.42.0.tgz", + "integrity": "sha512-6SWlXpWU5AvId8Ac7zjzmIOqMOba/JWY8XZ4A7q7Gn1Vlfg/SFFIlrtHXt9nPn4op9ZPAkl91Jao+QQv3r/ukw==", "dev": true }, "@humanwhocodes/config-array": { - "version": "0.11.8", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz", - "integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==", + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.10.tgz", + "integrity": "sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==", "dev": true, "requires": { "@humanwhocodes/object-schema": "^1.2.1", @@ -11623,16 +11526,6 @@ } } }, - "@typescript-eslint/scope-manager": { - "version": "5.59.8", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.59.8.tgz", - "integrity": "sha512-/w08ndCYI8gxGf+9zKf1vtx/16y8MHrZs5/tnjHhMLNSixuNcJavSX4wAiPf4aS5x41Es9YPCn44MIe4cxIlig==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.59.8", - "@typescript-eslint/visitor-keys": "5.59.8" - } - }, "@typescript-eslint/type-utils": { "version": "5.59.9", "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.59.9.tgz", @@ -11693,44 +11586,6 @@ } } }, - "@typescript-eslint/types": { - "version": "5.59.8", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.8.tgz", - "integrity": "sha512-+uWuOhBTj/L6awoWIg0BlWy0u9TyFpCHrAuQ5bNfxDaZ1Ppb3mx6tUigc74LHcbHpOHuOTOJrBoAnhdHdaea1w==", - "dev": true - }, - "@typescript-eslint/typescript-estree": { - "version": "5.59.8", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.8.tgz", - "integrity": "sha512-Jy/lPSDJGNow14vYu6IrW790p7HIf/SOV1Bb6lZ7NUkLc2iB2Z9elESmsaUtLw8kVqogSbtLH9tut5GCX1RLDg==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.59.8", - "@typescript-eslint/visitor-keys": "5.59.8", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - }, - "dependencies": { - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } - } - }, "@typescript-eslint/utils": { "version": "5.59.9", "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.59.9.tgz", @@ -11805,16 +11660,6 @@ } } }, - "@typescript-eslint/visitor-keys": { - "version": "5.59.8", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.8.tgz", - "integrity": "sha512-pJhi2ms0x0xgloT7xYabil3SGGlojNNKjK/q6dB3Ey0uJLMjK2UDGJvHieiyJVW/7C3KI+Z4Q3pEHkm4ejA+xQ==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.59.8", - "eslint-visitor-keys": "^3.3.0" - } - }, "accepts": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", @@ -13772,16 +13617,16 @@ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" }, "eslint": { - "version": "8.41.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.41.0.tgz", - "integrity": "sha512-WQDQpzGBOP5IrXPo4Hc0814r4/v2rrIsB0rhT7jtunIalgg6gYXWhRMOejVO8yH21T/FGaxjmFjBMNqcIlmH1Q==", + "version": "8.42.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.42.0.tgz", + "integrity": "sha512-ulg9Ms6E1WPf67PHaEY4/6E2tEn5/f7FXGzr3t9cBMugOmf1INYvuUwwh1aXQN4MfJ6a5K2iNwP3w4AColvI9A==", "dev": true, "requires": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.4.0", "@eslint/eslintrc": "^2.0.3", - "@eslint/js": "8.41.0", - "@humanwhocodes/config-array": "^0.11.8", + "@eslint/js": "8.42.0", + "@humanwhocodes/config-array": "^0.11.10", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", "ajv": "^6.10.0", From 2a0eabad0a7f5bf88ecbe21f50ed9020c553a112 Mon Sep 17 00:00:00 2001 From: Emma Zhu Date: Tue, 6 Jun 2023 10:36:57 +0800 Subject: [PATCH 118/297] Update service version to 2023-01-03 Update package version to 3.24.0 --- ChangeLog.md | 7 +++++++ README.md | 16 ++++++++-------- package-lock.json | 6 +++--- package.json | 2 +- src/blob/utils/constants.ts | 7 ++++--- src/queue/utils/constants.ts | 5 +++-- src/table/utils/constants.ts | 5 +++-- 7 files changed, 29 insertions(+), 19 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index 6e738113f..9839aa64b 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -4,6 +4,12 @@ ## Upcoming Release +## 2023.06 Version 3.24.0 + +General: + +- Bump up service API version to 2023-01-03 + Blob: - Fixed issue of: blob batch subresponse is slightly different from the on from Azure serivce, which causes exception in CPP SDK. @@ -11,6 +17,7 @@ Blob: - Supported rest API GetBlobTag, SetBlobTag. - Supported set Blob Tags in upload blob, copy blob. - Supported get Blob Tags (count) in download blob, get blob properties, list blobs. +- Added support for large append blob with bumping block size limitation to 100MB. Table: diff --git a/README.md b/README.md index e4d01c416..4c6d688aa 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,7 @@ | Version | Azure Storage API Version | Service Support | Description | Reference Links | | ------------------------------------------------------------------ | ------------------------- | ------------------------------ | ------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| 3.23.0 | 2022-11-02 | Blob, Queue and Table(preview) | Azurite V3 based on TypeScript & New Architecture | [NPM](https://www.npmjs.com/package/azurite) - [Docker](https://hub.docker.com/_/microsoft-azure-storage-azurite) - [Visual Studio Code Extension](https://marketplace.visualstudio.com/items?itemName=Azurite.azurite) | +| 3.24.0 | 2023-01-03 | Blob, Queue and Table(preview) | Azurite V3 based on TypeScript & New Architecture | [NPM](https://www.npmjs.com/package/azurite) - [Docker](https://hub.docker.com/_/microsoft-azure-storage-azurite) - [Visual Studio Code Extension](https://marketplace.visualstudio.com/items?itemName=Azurite.azurite) | | [Legacy (v2)](https://github.com/Azure/Azurite/tree/legacy-master) | 2016-05-31 | Blob, Queue and Table | Legacy Azurite V2 | [NPM](https://www.npmjs.com/package/azurite) | - [Azurite V3](#azurite-v3) @@ -76,19 +76,19 @@ Compared to V2, Azurite V3 implements a new architecture leveraging code generat ## Features & Key Changes in Azurite V3 -- Blob storage features align with Azure Storage API version 2022-11-02 (Refer to support matrix section below) +- Blob storage features align with Azure Storage API version 2023-01-03 (Refer to support matrix section below) - SharedKey/Account SAS/Service SAS/Public Access Authentications/OAuth - Get/Set Blob Service Properties - Create/List/Delete Containers - Create/Read/List/Update/Delete Block Blobs - Create/Read/List/Update/Delete Page Blobs -- Queue storage features align with Azure Storage API version 2022-11-02 (Refer to support matrix section below) +- Queue storage features align with Azure Storage API version 2023-01-03 (Refer to support matrix section below) - SharedKey/Account SAS/Service SAS/OAuth - Get/Set Queue Service Properties - Preflight Request - Create/List/Delete Queues - Put/Get/Peek/Updata/Deleta/Clear Messages -- Table storage features align with Azure Storage API version 2022-11-02 (Refer to support matrix section below) +- Table storage features align with Azure Storage API version 2023-01-03 (Refer to support matrix section below) - SharedKey/Account SAS/Service SAS/OAuth - Create/List/Delete Tables - Insert/Update/Query/Delete Table Entities @@ -909,7 +909,7 @@ Legacy Azurite V2 supports Azure Storage Blob, Queue and Table services. Azurite V3 currently only supports Azure Storage blob service. Queue service is supported after V3.2.0-preview. Table service support is currently under discussion. -Azurite V3 supports features from Azure Storage API version 2022-11-02, and will maintain parity with the latest API versions, in a more frequent update frequency than legacy Azurite V2. +Azurite V3 supports features from Azure Storage API version 2023-01-03, and will maintain parity with the latest API versions, in a more frequent update frequency than legacy Azurite V2. ## TypeScript Server Code Generator @@ -920,7 +920,7 @@ All the generated code is kept in `generated` folder, including the generated mi ## Support Matrix -Latest release targets **2022-11-02** API version **blob** service. +Latest release targets **2023-01-03** API version **blob** service. Detailed support matrix: @@ -979,7 +979,7 @@ Detailed support matrix: - Get Page Ranges Continuation Token - Cold Tier -Latest version supports for **2022-11-02** API version **queue** service. +Latest version supports for **2023-01-03** API version **queue** service. Detailed support matrix: - Supported Vertical Features @@ -1008,7 +1008,7 @@ Detailed support matrix: - Following features or REST APIs are NOT supported or limited supported in this release (will support more features per customers feedback in future releases) - SharedKey Lite -Latest version supports for **2022-11-02** API version **table** service (preview). +Latest version supports for **2023-01-03** API version **table** service (preview). Detailed support matrix: - Supported Vertical Features diff --git a/package-lock.json b/package-lock.json index ffc4e875e..ef0ac2f15 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "azurite", - "version": "3.23.0", + "version": "3.24.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "azurite", - "version": "3.23.0", + "version": "3.24.0", "license": "MIT", "dependencies": { "@azure/ms-rest-js": "^1.5.0", @@ -17913,4 +17913,4 @@ "dev": true } } -} +} \ No newline at end of file diff --git a/package.json b/package.json index d81c70baf..85ab38779 100644 --- a/package.json +++ b/package.json @@ -3,7 +3,7 @@ "displayName": "Azurite", "description": "An open source Azure Storage API compatible server", "icon": "icon.png", - "version": "3.23.0", + "version": "3.24.0", "publisher": "Azurite", "categories": [ "Other" diff --git a/src/blob/utils/constants.ts b/src/blob/utils/constants.ts index 32f6f2f13..ee48235ad 100644 --- a/src/blob/utils/constants.ts +++ b/src/blob/utils/constants.ts @@ -1,8 +1,8 @@ import { StoreDestinationArray } from "../../common/persistence/IExtentStore"; import * as Models from "../generated/artifacts/models"; -export const VERSION = "3.23.0"; -export const BLOB_API_VERSION = "2022-11-02"; +export const VERSION = "3.24.0"; +export const BLOB_API_VERSION = "2023-01-03"; export const DEFAULT_BLOB_SERVER_HOST_NAME = "127.0.0.1"; // Change to 0.0.0.0 when needs external access export const DEFAULT_LIST_BLOBS_MAX_RESULTS = 5000; export const DEFAULT_LIST_CONTAINERS_MAX_RESULTS = 5000; @@ -96,6 +96,7 @@ export const DEFAULT_BLOB_PERSISTENCE_ARRAY: StoreDestinationArray = [ ]; export const ValidAPIVersions = [ + "2023-01-03", "2022-11-02", "2021-12-02", "2021-10-04", @@ -132,7 +133,7 @@ export const ValidAPIVersions = [ "2009-04-14" ]; -export const MAX_APPEND_BLOB_BLOCK_SIZE = 4 * 1024 * 1024; // 4MB +export const MAX_APPEND_BLOB_BLOCK_SIZE = 100 * 1024 * 1024; // 100MB export const MAX_APPEND_BLOB_BLOCK_COUNT = 50000; // Validate audience, accept following audience patterns diff --git a/src/queue/utils/constants.ts b/src/queue/utils/constants.ts index 74afe3e32..618e398e3 100644 --- a/src/queue/utils/constants.ts +++ b/src/queue/utils/constants.ts @@ -1,7 +1,7 @@ import { StoreDestinationArray } from "../../common/persistence/IExtentStore"; -export const VERSION = "3.23.0"; -export const QUEUE_API_VERSION = "2022-11-02"; +export const VERSION = "3.24.0"; +export const QUEUE_API_VERSION = "2023-01-03"; export const DEFAULT_QUEUE_SERVER_HOST_NAME = "127.0.0.1"; // Change to 0.0.0.0 when needs external access export const DEFAULT_QUEUE_LISTENING_PORT = 10001; export const IS_PRODUCTION = process.env.NODE_ENV === "production"; @@ -90,6 +90,7 @@ export const DEFAULT_QUEUE_PERSISTENCE_ARRAY: StoreDestinationArray = [ ]; export const ValidAPIVersions = [ + "2023-01-03", "2022-11-02", "2021-12-02", "2021-10-04", diff --git a/src/table/utils/constants.ts b/src/table/utils/constants.ts index 673f10f31..a8a738363 100644 --- a/src/table/utils/constants.ts +++ b/src/table/utils/constants.ts @@ -17,8 +17,8 @@ export enum TABLE_STATUSCODE { } export const DEFAULT_TABLE_CONTEXT_PATH = "azurite_table_context"; -export const TABLE_API_VERSION = "2022-11-02"; -export const VERSION = "3.23.0"; +export const TABLE_API_VERSION = "2023-01-03"; +export const VERSION = "3.24.0"; // Max Body size is 4 MB export const BODY_SIZE_MAX = 1024 * 1024 * 4; // Max Entity sizxe is 1 MB @@ -73,6 +73,7 @@ export const DEFAULT_TABLE_PERSISTENCE_ARRAY: StoreDestinationArray = [ export const QUERY_RESULT_MAX_NUM = 1000; export const ValidAPIVersions = [ + "2023-01-03", "2022-11-02", "2021-12-02", "2021-10-04", From 7938cada88066baaf9d0ac94b4a1af2460d70267 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 12 Jun 2023 09:59:19 +0800 Subject: [PATCH 119/297] Bump @types/vscode from 1.78.1 to 1.79.0 (#1999) Bumps [@types/vscode](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/vscode) from 1.78.1 to 1.79.0. - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/vscode) --- updated-dependencies: - dependency-name: "@types/vscode" dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/package-lock.json b/package-lock.json index ef0ac2f15..4c08bc00f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1568,9 +1568,9 @@ "integrity": "sha512-aqayTNmeWrZcvnG2MG9eGYI6b7S5fl+yKgPs6bAjOTwPS316R5SxBGKvtSExfyoJU7pIeHJfsHI0Ji41RVMkvQ==" }, "node_modules/@types/vscode": { - "version": "1.78.1", - "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.78.1.tgz", - "integrity": "sha512-wEA+54axejHu7DhcUfnFBan1IqFD1gBDxAFz8LoX06NbNDMRJv/T6OGthOs52yZccasKfN588EyffHWABkR0fg==", + "version": "1.79.0", + "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.79.0.tgz", + "integrity": "sha512-Tfowu2rSW8hVGbqzQLSPlOEiIOYYryTkgJ+chMecpYiJcnw9n0essvSiclnK+Qh/TcSVJHgaK4EMrQDZjZJ/Sw==", "dev": true }, "node_modules/@types/xml2js": { @@ -11381,9 +11381,9 @@ "integrity": "sha512-aqayTNmeWrZcvnG2MG9eGYI6b7S5fl+yKgPs6bAjOTwPS316R5SxBGKvtSExfyoJU7pIeHJfsHI0Ji41RVMkvQ==" }, "@types/vscode": { - "version": "1.78.1", - "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.78.1.tgz", - "integrity": "sha512-wEA+54axejHu7DhcUfnFBan1IqFD1gBDxAFz8LoX06NbNDMRJv/T6OGthOs52yZccasKfN588EyffHWABkR0fg==", + "version": "1.79.0", + "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.79.0.tgz", + "integrity": "sha512-Tfowu2rSW8hVGbqzQLSPlOEiIOYYryTkgJ+chMecpYiJcnw9n0essvSiclnK+Qh/TcSVJHgaK4EMrQDZjZJ/Sw==", "dev": true }, "@types/xml2js": { @@ -17913,4 +17913,4 @@ "dev": true } } -} \ No newline at end of file +} From d0f4e8eed51e00a5a109f46a1d4087ee41dd2f34 Mon Sep 17 00:00:00 2001 From: Benjamin Pannell <1760260+notheotherben@users.noreply.github.com> Date: Mon, 12 Jun 2023 08:55:29 +0100 Subject: [PATCH 120/297] feat: Introduce a new Table query interpreter which removes the ability to conduct query injection (#1975) * feat: Introduce a new query interpreter which avoids the risk of eval * doc: Update changelog * test: Add additional tests and improvements to the parser to address found issues * refactor: Cleanup old parser code * refactor: Cleanup lexing logic and add documentation explaining how the new interpreter works * tweak: Add improved query examples for each of the AST node types * fix: Resolve missing semicolons on some lines --- .gitignore | 3 +- ChangeLog.md | 1 + .../LokiTableStoreQueryGenerator.ts | 34 +- .../QueryInterpreter/IQueryContext.ts | 23 + .../QueryInterpreter/QueryInterpreter.ts | 16 + .../QueryInterpreter/QueryLexer.ts | 195 +++++++ .../QueryInterpreter/QueryNodes/AndNode.ts | 22 + .../QueryNodes/BinaryDataNode.ts | 26 + .../QueryNodes/BinaryOperatorNode.ts | 21 + .../QueryNodes/ConstantNode.ts | 24 + .../QueryNodes/DateTimeNode.ts | 26 + .../QueryInterpreter/QueryNodes/EqualsNode.ts | 33 ++ .../QueryNodes/GreaterThanEqualNode.ts | 22 + .../QueryNodes/GreaterThanNode.ts | 22 + .../QueryInterpreter/QueryNodes/GuidNode.ts | 33 ++ .../QueryInterpreter/QueryNodes/IQueryNode.ts | 12 + .../QueryNodes/IdentifierNode.ts | 49 ++ .../QueryNodes/LessThanEqualNode.ts | 22 + .../QueryNodes/LessThanNode.ts | 22 + .../QueryNodes/NotEqualsNode.ts | 38 ++ .../QueryInterpreter/QueryNodes/NotNode.ts | 29 ++ .../QueryInterpreter/QueryNodes/OrNode.ts | 22 + .../QueryInterpreter/QueryParser.ts | 265 ++++++++++ .../QueryInterpreter/QueryValidator.ts | 37 ++ .../persistence/QueryInterpreter/README.md | 138 +++++ .../persistence/QueryTranscriber/IQPState.ts | 14 - .../LokiJsQueryTranscriber.ts | 26 - .../LokiJsQueryTranscriberFactory.ts | 93 ---- .../PredicateModel/BinaryPredicate.ts | 99 ---- .../PredicateModel/BooleanPredicate.ts | 77 --- .../PredicateModel/DatePredicate.ts | 82 --- .../PredicateModel/DoublePredicate.ts | 75 --- .../PredicateModel/GuidPredicate.ts | 190 ------- .../PredicateModel/IPredicate.ts | 13 - .../PredicateModel/IntegerPredicate.ts | 76 --- .../PredicateModel/LongPredicate.ts | 83 --- .../PredicateModel/ParensClose.ts | 19 - .../PredicateModel/ParensOpen.ts | 19 - .../PredicateModel/PredicateOperator.ts | 19 - .../PredicateModel/StringPredicate.ts | 121 ----- .../PredicateModel/TokenMap.ts | 15 - .../PredicateModel/UnknownPredicate.ts | 19 - .../persistence/QueryTranscriber/QPState.ts | 377 -------------- .../QueryTranscriber/QueryContext.ts | 26 - .../QueryTranscriber/QueryStateName.ts | 20 - .../QueryTranscriber/QueryTranscriber.ts | 143 ----- .../StatePredicateFinished.ts | 448 ---------------- .../QueryTranscriber/StatePredicateStarted.ts | 100 ---- .../StateProcessIdentifier.ts | 158 ------ .../QueryTranscriber/StateProcessOperator.ts | 151 ------ .../StateProcessParensClose.ts | 92 ---- .../StateProcessParensOpen.ts | 95 ---- .../StateProcessPredicateOperator.ts | 175 ------- .../QueryTranscriber/StateProcessValue.ts | 200 ------- .../QueryTranscriber/StateQueryFinished.ts | 54 -- .../QueryTranscriber/StateQueryStarted.ts | 74 --- .../QueryTranscriber/TokenModel/ITokenType.ts | 15 - .../TokenModel/IdentifierToken.ts | 22 - .../TokenModel/OperatorToken.ts | 22 - .../TokenModel/ParensCloseToken.ts | 22 - .../TokenModel/ParensOpenToken.ts | 22 - .../TokenModel/TaggedToken.ts | 11 - .../TokenModel/UnknownToken.ts | 22 - .../QueryTranscriber/TokenModel/ValueToken.ts | 22 - tests/table/apis/table.entity.query.test.ts | 110 ++-- .../LokiJsQueryTranscriber.unit.test.2.ts | 248 --------- .../unit/LokiJsQueryTranscriber.unit.test.ts | 450 ---------------- .../table/unit/query.interpreter.unit.test.ts | 271 ++++++++++ tests/table/unit/query.lexer.unit.test.ts | 157 ++++++ tests/table/unit/query.parser.unit.test.ts | 487 ++++++++++++++++++ 70 files changed, 2083 insertions(+), 4086 deletions(-) create mode 100644 src/table/persistence/QueryInterpreter/IQueryContext.ts create mode 100644 src/table/persistence/QueryInterpreter/QueryInterpreter.ts create mode 100644 src/table/persistence/QueryInterpreter/QueryLexer.ts create mode 100644 src/table/persistence/QueryInterpreter/QueryNodes/AndNode.ts create mode 100644 src/table/persistence/QueryInterpreter/QueryNodes/BinaryDataNode.ts create mode 100644 src/table/persistence/QueryInterpreter/QueryNodes/BinaryOperatorNode.ts create mode 100644 src/table/persistence/QueryInterpreter/QueryNodes/ConstantNode.ts create mode 100644 src/table/persistence/QueryInterpreter/QueryNodes/DateTimeNode.ts create mode 100644 src/table/persistence/QueryInterpreter/QueryNodes/EqualsNode.ts create mode 100644 src/table/persistence/QueryInterpreter/QueryNodes/GreaterThanEqualNode.ts create mode 100644 src/table/persistence/QueryInterpreter/QueryNodes/GreaterThanNode.ts create mode 100644 src/table/persistence/QueryInterpreter/QueryNodes/GuidNode.ts create mode 100644 src/table/persistence/QueryInterpreter/QueryNodes/IQueryNode.ts create mode 100644 src/table/persistence/QueryInterpreter/QueryNodes/IdentifierNode.ts create mode 100644 src/table/persistence/QueryInterpreter/QueryNodes/LessThanEqualNode.ts create mode 100644 src/table/persistence/QueryInterpreter/QueryNodes/LessThanNode.ts create mode 100644 src/table/persistence/QueryInterpreter/QueryNodes/NotEqualsNode.ts create mode 100644 src/table/persistence/QueryInterpreter/QueryNodes/NotNode.ts create mode 100644 src/table/persistence/QueryInterpreter/QueryNodes/OrNode.ts create mode 100644 src/table/persistence/QueryInterpreter/QueryParser.ts create mode 100644 src/table/persistence/QueryInterpreter/QueryValidator.ts create mode 100644 src/table/persistence/QueryInterpreter/README.md delete mode 100644 src/table/persistence/QueryTranscriber/IQPState.ts delete mode 100644 src/table/persistence/QueryTranscriber/LokiJsQueryTranscriber.ts delete mode 100644 src/table/persistence/QueryTranscriber/LokiJsQueryTranscriberFactory.ts delete mode 100644 src/table/persistence/QueryTranscriber/PredicateModel/BinaryPredicate.ts delete mode 100644 src/table/persistence/QueryTranscriber/PredicateModel/BooleanPredicate.ts delete mode 100644 src/table/persistence/QueryTranscriber/PredicateModel/DatePredicate.ts delete mode 100644 src/table/persistence/QueryTranscriber/PredicateModel/DoublePredicate.ts delete mode 100644 src/table/persistence/QueryTranscriber/PredicateModel/GuidPredicate.ts delete mode 100644 src/table/persistence/QueryTranscriber/PredicateModel/IPredicate.ts delete mode 100644 src/table/persistence/QueryTranscriber/PredicateModel/IntegerPredicate.ts delete mode 100644 src/table/persistence/QueryTranscriber/PredicateModel/LongPredicate.ts delete mode 100644 src/table/persistence/QueryTranscriber/PredicateModel/ParensClose.ts delete mode 100644 src/table/persistence/QueryTranscriber/PredicateModel/ParensOpen.ts delete mode 100644 src/table/persistence/QueryTranscriber/PredicateModel/PredicateOperator.ts delete mode 100644 src/table/persistence/QueryTranscriber/PredicateModel/StringPredicate.ts delete mode 100644 src/table/persistence/QueryTranscriber/PredicateModel/TokenMap.ts delete mode 100644 src/table/persistence/QueryTranscriber/PredicateModel/UnknownPredicate.ts delete mode 100644 src/table/persistence/QueryTranscriber/QPState.ts delete mode 100644 src/table/persistence/QueryTranscriber/QueryContext.ts delete mode 100644 src/table/persistence/QueryTranscriber/QueryStateName.ts delete mode 100644 src/table/persistence/QueryTranscriber/QueryTranscriber.ts delete mode 100644 src/table/persistence/QueryTranscriber/StatePredicateFinished.ts delete mode 100644 src/table/persistence/QueryTranscriber/StatePredicateStarted.ts delete mode 100644 src/table/persistence/QueryTranscriber/StateProcessIdentifier.ts delete mode 100644 src/table/persistence/QueryTranscriber/StateProcessOperator.ts delete mode 100644 src/table/persistence/QueryTranscriber/StateProcessParensClose.ts delete mode 100644 src/table/persistence/QueryTranscriber/StateProcessParensOpen.ts delete mode 100644 src/table/persistence/QueryTranscriber/StateProcessPredicateOperator.ts delete mode 100644 src/table/persistence/QueryTranscriber/StateProcessValue.ts delete mode 100644 src/table/persistence/QueryTranscriber/StateQueryFinished.ts delete mode 100644 src/table/persistence/QueryTranscriber/StateQueryStarted.ts delete mode 100644 src/table/persistence/QueryTranscriber/TokenModel/ITokenType.ts delete mode 100644 src/table/persistence/QueryTranscriber/TokenModel/IdentifierToken.ts delete mode 100644 src/table/persistence/QueryTranscriber/TokenModel/OperatorToken.ts delete mode 100644 src/table/persistence/QueryTranscriber/TokenModel/ParensCloseToken.ts delete mode 100644 src/table/persistence/QueryTranscriber/TokenModel/ParensOpenToken.ts delete mode 100644 src/table/persistence/QueryTranscriber/TokenModel/TaggedToken.ts delete mode 100644 src/table/persistence/QueryTranscriber/TokenModel/UnknownToken.ts delete mode 100644 src/table/persistence/QueryTranscriber/TokenModel/ValueToken.ts delete mode 100644 tests/table/unit/LokiJsQueryTranscriber.unit.test.2.ts delete mode 100644 tests/table/unit/LokiJsQueryTranscriber.unit.test.ts create mode 100644 tests/table/unit/query.interpreter.unit.test.ts create mode 100644 tests/table/unit/query.lexer.unit.test.ts create mode 100644 tests/table/unit/query.parser.unit.test.ts diff --git a/.gitignore b/.gitignore index 32dee9d64..c3f59e447 100644 --- a/.gitignore +++ b/.gitignore @@ -14,4 +14,5 @@ temp *.pem azurite.exe .pkg-cache -release \ No newline at end of file +release +querydb*.json \ No newline at end of file diff --git a/ChangeLog.md b/ChangeLog.md index 9839aa64b..8104ac0f0 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -23,6 +23,7 @@ Table: - Fixed issue with headers length when deserializing batch deletes. - Fixed issues with the use of backticks in string query predicates. +- Replaced the query filter implementation with a custom interpreter which mitigates the risk of JS-query injection. ## 2023.03 Version 3.23.0 diff --git a/src/table/persistence/LokiTableStoreQueryGenerator.ts b/src/table/persistence/LokiTableStoreQueryGenerator.ts index f86ccf42f..d06b50e4d 100644 --- a/src/table/persistence/LokiTableStoreQueryGenerator.ts +++ b/src/table/persistence/LokiTableStoreQueryGenerator.ts @@ -2,7 +2,9 @@ import StorageErrorFactory from "../errors/StorageErrorFactory"; import { Entity, Table } from "./ITableMetadataStore"; import Context from "../generated/Context"; import * as Models from "../generated/artifacts/models"; -import LokiJsQueryTranscriberFactory from "./QueryTranscriber/LokiJsQueryTranscriberFactory"; +import parseQuery from "./QueryInterpreter/QueryParser"; +import executeQuery from "./QueryInterpreter/QueryInterpreter"; +import { validateQueryTree } from "./QueryInterpreter/QueryValidator"; /** * Handles Query Logic For LokiJs Table Implementation @@ -49,10 +51,9 @@ export default class LokiTableStoreQueryGenerator { return () => true; } - const transformedQuery = - LokiTableStoreQueryGenerator.transformTableQuery(query); - - return new Function("item", transformedQuery) as any; + const queryTree = parseQuery(query); + validateQueryTree(queryTree); + return (entity) => executeQuery(entity, queryTree); } /** @@ -64,15 +65,8 @@ export default class LokiTableStoreQueryGenerator { * @memberof LokiTableStoreQueryGenerator */ public static transformTableQuery(query: string): string { - const queryTranscriber = - LokiJsQueryTranscriberFactory.createTableQueryTranscriber( - query, - "lokiJsTableQueryTranscriber" - ); - - queryTranscriber.transcribe(); - - return queryTranscriber.getTranscribedQuery(); + const queryTree = parseQuery(query); + return queryTree.toString(); } /** @@ -90,14 +84,8 @@ export default class LokiTableStoreQueryGenerator { return () => true; } - const queryTranscriber = - LokiJsQueryTranscriberFactory.createEntityQueryTranscriber( - query, - "lokiJsQueryTranscriber" - ); - - queryTranscriber.transcribe(); - - return new Function("item", queryTranscriber.getTranscribedQuery()) as any; + const queryTree = parseQuery(query); + validateQueryTree(queryTree); + return (entity) => executeQuery(entity, queryTree); } } diff --git a/src/table/persistence/QueryInterpreter/IQueryContext.ts b/src/table/persistence/QueryInterpreter/IQueryContext.ts new file mode 100644 index 000000000..2093b4671 --- /dev/null +++ b/src/table/persistence/QueryInterpreter/IQueryContext.ts @@ -0,0 +1,23 @@ +import { Entity, Table } from "../ITableMetadataStore"; + +export type IQueryContext = Entity | Table; + +/** + * Determines whether a given query context contains a table entity or not. + * + * @param {IQueryContext} context The context which should be tested. + * @returns {boolean} + */ +export function isEntity(context: IQueryContext): context is Entity { + return !!(context).PartitionKey; +} + +/** + * Determines whether a given query context contains a table or not. + * + * @param {IQueryContext} context + * @returns {boolean} + */ +export function isTable(context: IQueryContext): context is Table { + return !!(context).table; +} \ No newline at end of file diff --git a/src/table/persistence/QueryInterpreter/QueryInterpreter.ts b/src/table/persistence/QueryInterpreter/QueryInterpreter.ts new file mode 100644 index 000000000..80ce7ad72 --- /dev/null +++ b/src/table/persistence/QueryInterpreter/QueryInterpreter.ts @@ -0,0 +1,16 @@ +import { IQueryContext } from "./IQueryContext"; +import IQueryNode from "./QueryNodes/IQueryNode"; + +/** + * Executes a given query tree against a given context. + * + * This method is effectively a wrapper around IQueryNode.evaluate, + * ensuring that the result is a boolean value. + * + * @param {IQueryContext} context The query context to execute the query against. This may be either a table or an entity. + * @param {IQueryNode} queryTree The query tree to execute. + * @returns {boolean} The result of the query in this context. + */ +export default function executeQuery(context: IQueryContext, queryTree: IQueryNode): boolean { + return !!queryTree.evaluate(context); +} diff --git a/src/table/persistence/QueryInterpreter/QueryLexer.ts b/src/table/persistence/QueryInterpreter/QueryLexer.ts new file mode 100644 index 000000000..d8623ba85 --- /dev/null +++ b/src/table/persistence/QueryInterpreter/QueryLexer.ts @@ -0,0 +1,195 @@ + +export type QueryTokenKind = "identifier" | "bool" | "number" | "type-hint" | "string" | "open-paren" | "close-paren" | "unary-operator" | "comparison-operator" | "logic-operator" | "end-of-query"; + +/** + * Represents a single token in the query which can then be consumed by + * the parser to build the query tree. Each token consists of a token kind, + * a position in the query string, and a length. It may optionally also contain + * a value to uniquely distinguish between tokens of the same kind.. + */ +export interface QueryToken { + kind: QueryTokenKind; + position: number; + length: number; + value?: string; +} + +/** + * This is the lexer responsible for converting a query string into a stream of tokens. + * These tokens are logical chunks of the query which can then be consumed by the parser, + * while not technically necessary, this does help simplify the parsing logic (allowing it + * to operate on the higher-level tokens directly). + */ +export class QueryLexer { + constructor(private query: string) { } + + private tokenPosition: number = 0; + + /** + * The list of comparison operators which are supported by the query syntax. + */ + private comparisonOperators: string[] = [ + "eq", + "ne", + "gt", + "ge", + "lt", + "le", + ]; + + /** + * The list of unary operators which are supported by the query syntax. + */ + private unaryOperators: string[] = [ + "not", + ]; + + /** + * The list of logic operators which are supported by the query syntax. + */ + private logicOperators: string[] = [ + "and", + "or", + ]; + + /** + * The list of type hints which are supported by the query syntax. + * Type hints are used to explicitly specify the type of a value + * when it cannot be inferred from the value itself, such as a + * GUID or a binary data (which are represented as strings). + * + * Type hints are specified by prefixing the value with the hint + * e.g. `guid'00000000-0000-0000-0000-000000000000'`. + */ + private typeHints: string[] = [ + "datetime", + "guid", + "binary", + "x" + ]; + + /** + * Gets the next token from the query stream, advancing the token stream. + * Optionally, you may restrict the type of token returned by providing + * a predicate which will be used to evaluate the token's suitability + * for consumption. + * + * @returns {QueryToken} + */ + next(): QueryToken; + next(predicate: (token: QueryToken) => boolean): QueryToken | null; + next(predicate?: (token: QueryToken) => boolean): QueryToken | null { + const token = this.peek(); + + if (!predicate || predicate(token)) { + this.tokenPosition = token.position + token.length; + return token; + } else { + return null; + } + } + + /** + * Gets the next token in the query string without advancing the token stream. + * + * @returns {QueryToken} + */ + peek(): QueryToken { + // We ignore whitespace (tabs, spaces, newlines etc) in the lead-up to a token + this.skipWhitespace(); + + // If we're at the end of the query, then return an end-of-query token + if (!this.query[this.tokenPosition]) { + return { + kind: "end-of-query", + position: this.tokenPosition, + length: 0 + }; + } + + // We have a few special control characters which are composed of single tokens, + // namely the parentheses "()" which are used to group expressions, and the quotes + // ("') which are used to delimit strings. + switch (this.query[this.tokenPosition]) { + case "(": + return { kind: "open-paren", position: this.tokenPosition, length: 1 }; + case ")": + return { kind: "close-paren", position: this.tokenPosition, length: 1 }; + case '"': + case "'": + return this.peekString(); + default: + // If we encounter any other character, it is safe for us to proceed to the next token. + break; + } + + // If we get to this point, we're looking for either an operator, an identifier, a number, or a type hint. + // All of these cases are delimited by the above control characters, or by whitespace/end of query. + return this.peekWord(); + } + + private peekString(): QueryToken { + const start = this.tokenPosition; + const openCharacter = this.query[start]; + + let position = start + 1; + while (this.query[position]) { + if (this.query[position] === openCharacter && this.query[position + 1] === openCharacter) { + position += 2; + } else if (this.query[position] === openCharacter) { + position++; + break; + } else { + position++; + } + } + + return { kind: "string", position: start, length: position - start, value: this.query.substring(start + 1, position - 1).replace(new RegExp(`${openCharacter}${openCharacter}`, 'g'), openCharacter) }; + } + + private peekWord(): QueryToken { + const controlCharacters = `()"'`; + + const start = this.tokenPosition; + let position = this.tokenPosition; + while (this.query[position]?.trim() && !controlCharacters.includes(this.query[position])) { + position++; + } + + // At this point we've got the delimited token, but we need to determine whether it's one of + // our special keywords or an identifier. We can do this by checking against a list of known + const value = this.query.substring(start, position); + + if (this.logicOperators.includes(value.toLowerCase())) { + return { kind: "logic-operator", position: start, length: value.length, value }; + } + + if (this.unaryOperators.includes(value.toLowerCase())) { + return { kind: "unary-operator", position: start, length: value.length, value }; + } + + if (this.comparisonOperators.includes(value.toLowerCase())) { + return { kind: "comparison-operator", position: start, length: value.length, value }; + } + + if (value.toLowerCase() === "true" || value.toLowerCase() === "false") { + return { kind: "bool", position: start, length: value.length, value }; + } + + if (this.typeHints.includes(value.toLowerCase()) && `'"`.includes(this.query[position])) { + return { kind: "type-hint", position: start, length: value.length, value }; + } + + if (value.match(/^-?[0-9]+(\.[0-9]+)?L?$/)) { + return { kind: "number", position: start, length: value.length, value }; + } + + return { kind: "identifier", position: start, length: value.length, value }; + } + + private skipWhitespace() { + while (this.query[this.tokenPosition] && !this.query[this.tokenPosition].trim()) { + this.tokenPosition++; + } + } +} diff --git a/src/table/persistence/QueryInterpreter/QueryNodes/AndNode.ts b/src/table/persistence/QueryInterpreter/QueryNodes/AndNode.ts new file mode 100644 index 000000000..b8c5acba4 --- /dev/null +++ b/src/table/persistence/QueryInterpreter/QueryNodes/AndNode.ts @@ -0,0 +1,22 @@ +import { IQueryContext } from "../IQueryContext"; +import BinaryOperatorNode from "./BinaryOperatorNode"; + +/** + * Represents a logical AND operation between two nodes. + * + * This is used in queries which resemble the following: + * + * (PartitionKey eq 'foo') and (RowKey eq 'bar') + * + * In this case, the `AndNode` would be the root node, with the left and right nodes + * corresponding to `(PartitionKey eq 'foo')` and `(RowKey eq 'bar')`, respectively. + */ +export default class AndNode extends BinaryOperatorNode { + get name(): string { + return `and`; + } + + evaluate(context: IQueryContext): any { + return this.left.evaluate(context) && this.right.evaluate(context); + } +} \ No newline at end of file diff --git a/src/table/persistence/QueryInterpreter/QueryNodes/BinaryDataNode.ts b/src/table/persistence/QueryInterpreter/QueryNodes/BinaryDataNode.ts new file mode 100644 index 000000000..b2de93d05 --- /dev/null +++ b/src/table/persistence/QueryInterpreter/QueryNodes/BinaryDataNode.ts @@ -0,0 +1,26 @@ +import { IQueryContext } from "../IQueryContext"; +import IQueryNode from "./IQueryNode"; + +/** + * Represents a constant value which should be decoded from its `hex` representation + * and encoded as `base64` to match the underlying table storage format. + * + * This is used to hold binary values that are provided in the query (using the `binary'...'` syntax) + * and is used to ensure that these values are evaluated against their normalized base64 format. For + * example, the query `PartitionKey eq binary'0011'` would contain a `BinaryNode` with the value `0x0011`. + */ +export default class BinaryNode implements IQueryNode { + constructor(private value: string) { } + + get name(): string { + return "binary"; + } + + evaluate(_context: IQueryContext): any { + return Buffer.from(this.value, "hex").toString("base64"); + } + + toString(): string { + return `(${this.name} ${this.value})`; + } +} \ No newline at end of file diff --git a/src/table/persistence/QueryInterpreter/QueryNodes/BinaryOperatorNode.ts b/src/table/persistence/QueryInterpreter/QueryNodes/BinaryOperatorNode.ts new file mode 100644 index 000000000..bdd405c35 --- /dev/null +++ b/src/table/persistence/QueryInterpreter/QueryNodes/BinaryOperatorNode.ts @@ -0,0 +1,21 @@ +import { IQueryContext } from "../IQueryContext"; +import IQueryNode from "./IQueryNode"; + +/** + * Represents a binary operator node in a query tree. + * + * NOTE: This is an abstract class from which various other binary operator nodes are derived, + * such as AndNode and OrNode. It is used to enable easier traversal of the tree when + * performing validations etc. + */ +export default abstract class BinaryOperatorNode implements IQueryNode { + constructor(public left: IQueryNode, public right: IQueryNode) { } + + abstract evaluate(context: IQueryContext): any; + + abstract get name(): string; + + toString(): string { + return `(${this.name} ${this.left.toString()} ${this.right.toString()})`; + } +} \ No newline at end of file diff --git a/src/table/persistence/QueryInterpreter/QueryNodes/ConstantNode.ts b/src/table/persistence/QueryInterpreter/QueryNodes/ConstantNode.ts new file mode 100644 index 000000000..cd26df5e8 --- /dev/null +++ b/src/table/persistence/QueryInterpreter/QueryNodes/ConstantNode.ts @@ -0,0 +1,24 @@ +import { IQueryContext } from "../IQueryContext"; +import IQueryNode from "./IQueryNode"; + +/** + * Represents a constant value which is stored in its underlying JavaScript representation. + * + * This is used to hold boolean, number, and string values that are provided in the query. + * For example, the query `PartitionKey eq 'foo'` would contain a `ConstantNode` with the value `foo`. + */ +export default class ConstantNode implements IQueryNode { + constructor(private value: T) { } + + get name(): string { + return "constant"; + } + + evaluate(_context: IQueryContext): T { + return this.value; + } + + toString(): string { + return JSON.stringify(this.value); + } +} \ No newline at end of file diff --git a/src/table/persistence/QueryInterpreter/QueryNodes/DateTimeNode.ts b/src/table/persistence/QueryInterpreter/QueryNodes/DateTimeNode.ts new file mode 100644 index 000000000..6969bc80d --- /dev/null +++ b/src/table/persistence/QueryInterpreter/QueryNodes/DateTimeNode.ts @@ -0,0 +1,26 @@ +import { IQueryContext } from "../IQueryContext"; +import IQueryNode from "./IQueryNode"; + +/** + * Represents a constant value of type `datetime` which is stored in its underlying JavaScript representation. + * + * This is used to hold datetime values that are provided in the query (using the `datetime'...'` syntax) + * and is used to ensure that these values are evaluated against their normalized ISO8601 format. For example, + * the query `PartitionKey eq datetime'2019-01-01T00:00:00.000Z'` would contain a `DateTimeNode` with the value + * `2019-01-01T00:00:00.000Z`. + */ +export default class DateTimeNode implements IQueryNode { + constructor(private value: Date) { } + + get name(): string { + return "datetime"; + } + + evaluate(_context: IQueryContext): any { + return this.value.toISOString(); + } + + toString(): string { + return `(${this.name} ${this.value.toISOString()})`; + } +} \ No newline at end of file diff --git a/src/table/persistence/QueryInterpreter/QueryNodes/EqualsNode.ts b/src/table/persistence/QueryInterpreter/QueryNodes/EqualsNode.ts new file mode 100644 index 000000000..66021ccff --- /dev/null +++ b/src/table/persistence/QueryInterpreter/QueryNodes/EqualsNode.ts @@ -0,0 +1,33 @@ +import { IQueryContext } from "../IQueryContext"; +import BinaryOperatorNode from "./BinaryOperatorNode"; +import GuidNode from "./GuidNode"; + +/** + * Represents a logical equality operation between two nodes (the `eq` query operator). + * + * This is used in queries which resemble the following: + * + * PartitionKey eq 'foo' + * + * In this case, the `EqualsNode` would be the root node, with the left and right nodes + * corresponding to the identifier `PartitionKey` and the constant `foo`, respectively. + * + * NOTE: This operation includes backwards compatibility for the `guid` type hint, since + * earlier versions of Azurite stored guid values in their raw string format. + */ +export default class EqualsNode extends BinaryOperatorNode { + get name(): string { + return `eq`; + } + + evaluate(context: IQueryContext): any { + return this.left.evaluate(context) === this.right.evaluate(context) || this.backwardsCompatibleGuidEvaluate(context); + } + + private backwardsCompatibleGuidEvaluate(context: IQueryContext): boolean { + const left = this.left instanceof GuidNode ? this.left.legacyStorageFormat() : this.left.evaluate(context); + const right = this.right instanceof GuidNode ? this.right.legacyStorageFormat() : this.right.evaluate(context); + + return left === right; + } +} \ No newline at end of file diff --git a/src/table/persistence/QueryInterpreter/QueryNodes/GreaterThanEqualNode.ts b/src/table/persistence/QueryInterpreter/QueryNodes/GreaterThanEqualNode.ts new file mode 100644 index 000000000..137c18420 --- /dev/null +++ b/src/table/persistence/QueryInterpreter/QueryNodes/GreaterThanEqualNode.ts @@ -0,0 +1,22 @@ +import { IQueryContext } from "../IQueryContext"; +import BinaryOperatorNode from "./BinaryOperatorNode"; + +/** + * Represents a logical greater than or equal operation between two nodes (the `ge` query operator). + * + * This is used in queries which resemble the following: + * + * RowKey ge 'bar' + * + * In this case, the `GreaterThanEqualNode` would be the root node, with the left and right nodes + * corresponding to the identifier `RowKey` and the constant `bar`, respectively. + */ +export default class GreaterThanEqualNode extends BinaryOperatorNode { + get name(): string { + return `ge`; + } + + evaluate(context: IQueryContext): any { + return this.left.evaluate(context) >= this.right.evaluate(context); + } +} \ No newline at end of file diff --git a/src/table/persistence/QueryInterpreter/QueryNodes/GreaterThanNode.ts b/src/table/persistence/QueryInterpreter/QueryNodes/GreaterThanNode.ts new file mode 100644 index 000000000..935fc7628 --- /dev/null +++ b/src/table/persistence/QueryInterpreter/QueryNodes/GreaterThanNode.ts @@ -0,0 +1,22 @@ +import { IQueryContext } from "../IQueryContext"; +import BinaryOperatorNode from "./BinaryOperatorNode"; + +/** + * Represents a logical greater than operation between two nodes (the `gt` query operator). + * + * This is used in queries which resemble the following: + * + * RowKey gt 'bar' + * + * In this case, the `GreaterThanNode` would be the root node, with the left and right nodes + * corresponding to the identifier `RowKey` and the constant `bar`, respectively. + */ +export default class GreaterThanNode extends BinaryOperatorNode { + get name(): string { + return `gt`; + } + + evaluate(context: IQueryContext): any { + return this.left.evaluate(context) > this.right.evaluate(context); + } +} \ No newline at end of file diff --git a/src/table/persistence/QueryInterpreter/QueryNodes/GuidNode.ts b/src/table/persistence/QueryInterpreter/QueryNodes/GuidNode.ts new file mode 100644 index 000000000..3754e385e --- /dev/null +++ b/src/table/persistence/QueryInterpreter/QueryNodes/GuidNode.ts @@ -0,0 +1,33 @@ +import { IQueryContext } from "../IQueryContext"; +import IQueryNode from "./IQueryNode"; + +/** + * Represents a constant value of type GUID which can be compared against the base64 representation of the GUID + * that is stored in the underlying table storage. + * + * This is used to hold GUID values that are provided in the query (using the `guid'...'` syntax), for example + * the query `PartitionKey eq guid'00112233-4455-6677-8899-aabbccddeeff'` would contain a `GuidNode` with the value + * `00112233-4455-6677-8899-aabbccddeeff`. + * + * NOTE: This node type also exposes a `legacyStorageFormat()` method which returns the GUID in its string representation + * for backwards compatibility with the legacy table storage format. + */ +export default class GuidNode implements IQueryNode { + constructor(private value: string) { } + + get name(): string { + return "guid"; + } + + evaluate(_context: IQueryContext): any { + return Buffer.from(this.value).toString("base64"); + } + + legacyStorageFormat(): string { + return this.value; + } + + toString(): string { + return `(${this.name} ${this.value})`; + } +} \ No newline at end of file diff --git a/src/table/persistence/QueryInterpreter/QueryNodes/IQueryNode.ts b/src/table/persistence/QueryInterpreter/QueryNodes/IQueryNode.ts new file mode 100644 index 000000000..daded2ca2 --- /dev/null +++ b/src/table/persistence/QueryInterpreter/QueryNodes/IQueryNode.ts @@ -0,0 +1,12 @@ +import { IQueryContext } from "../IQueryContext"; + +/** + * The base interface for all query nodes. + */ +export default interface IQueryNode { + get name(): string; + + evaluate(context: IQueryContext): any; + + toString(): string; +} \ No newline at end of file diff --git a/src/table/persistence/QueryInterpreter/QueryNodes/IdentifierNode.ts b/src/table/persistence/QueryInterpreter/QueryNodes/IdentifierNode.ts new file mode 100644 index 000000000..7b3cd0610 --- /dev/null +++ b/src/table/persistence/QueryInterpreter/QueryNodes/IdentifierNode.ts @@ -0,0 +1,49 @@ +import { IQueryContext, isEntity, isTable } from "../IQueryContext"; +import IQueryNode from "./IQueryNode"; + +/** + * Represents a reference to an identifier (such as a property, or a table name). + * + * This is used in queries which resemble the following: + * + * PartitionKey eq 'foo' + * + * In this case, the expression `PartitionKey` would be represented by an `IdentifierNode` + * with the identifier `PartitionKey`. + * + * This node, when evaluated, will retrieve the corresponding value from the context. The + * specific behavior depends on the context type: + * - If the context is an entity, the identifier will be used to retrieve the corresponding + * partition key, row key, or property value from the entity. + * - If the context is a table, the identifier will be used to retrieve the corresponding + * table name from the table (or will raise an error if the identifier is not `TableName`). + */ +export default class IdentifierNode implements IQueryNode { + constructor(private identifier: string) { } + + get name(): string { + return "id"; + } + + evaluate(context: IQueryContext): any { + if (isEntity(context)) { + if (this.identifier === "PartitionKey") { + return context.PartitionKey; + } else if (this.identifier === "RowKey") { + return context.RowKey; + } + + return context.properties[this.identifier]; + } else if (isTable(context)) { + if (this.identifier.toLowerCase() === "tablename") { + return context.table; + } + + throw new Error(`Property queries cannot be used in this query context.`); + } + } + + toString(): string { + return `(${this.name} ${this.identifier})`; + } +} \ No newline at end of file diff --git a/src/table/persistence/QueryInterpreter/QueryNodes/LessThanEqualNode.ts b/src/table/persistence/QueryInterpreter/QueryNodes/LessThanEqualNode.ts new file mode 100644 index 000000000..2da9a8879 --- /dev/null +++ b/src/table/persistence/QueryInterpreter/QueryNodes/LessThanEqualNode.ts @@ -0,0 +1,22 @@ +import { IQueryContext } from "../IQueryContext"; +import BinaryOperatorNode from "./BinaryOperatorNode"; + +/** + * Represents a logical less than or equal operation between two nodes (the `le` query operator). + * + * This is used in queries which resemble the following: + * + * RowKey le 'bar' + * + * In this case, the `LessThanEqualNode` would be the root node, with the left and right nodes + * corresponding to the identifier `RowKey` and the constant `bar`, respectively. + */ +export default class LessThanEqualNode extends BinaryOperatorNode { + get name(): string { + return `le`; + } + + evaluate(context: IQueryContext): any { + return this.left.evaluate(context) <= this.right.evaluate(context); + } +} \ No newline at end of file diff --git a/src/table/persistence/QueryInterpreter/QueryNodes/LessThanNode.ts b/src/table/persistence/QueryInterpreter/QueryNodes/LessThanNode.ts new file mode 100644 index 000000000..6a0a826b6 --- /dev/null +++ b/src/table/persistence/QueryInterpreter/QueryNodes/LessThanNode.ts @@ -0,0 +1,22 @@ +import { IQueryContext } from "../IQueryContext"; +import BinaryOperatorNode from "./BinaryOperatorNode"; + +/** + * Represents a logical less than operation between two nodes (the `lt` query operator). + * + * This is used in queries which resemble the following: + * + * RowKey lt 'bar' + * + * In this case, the `LessThanNode` would be the root node, with the left and right nodes + * corresponding to the identifier `RowKey` and the constant `bar`, respectively. + */ +export default class LessThanNode extends BinaryOperatorNode { + get name(): string { + return `lt`; + } + + evaluate(context: IQueryContext): any { + return this.left.evaluate(context) < this.right.evaluate(context); + } +} \ No newline at end of file diff --git a/src/table/persistence/QueryInterpreter/QueryNodes/NotEqualsNode.ts b/src/table/persistence/QueryInterpreter/QueryNodes/NotEqualsNode.ts new file mode 100644 index 000000000..352543a0f --- /dev/null +++ b/src/table/persistence/QueryInterpreter/QueryNodes/NotEqualsNode.ts @@ -0,0 +1,38 @@ +import { IQueryContext } from "../IQueryContext"; +import BinaryOperatorNode from "./BinaryOperatorNode"; +import GuidNode from "./GuidNode"; + +/** + * Represents a logical not equal operation between two nodes (the `ne` query operator). + * + * This is used in queries which resemble the following: + * + * RowKey ne 'bar' + * + * In this case, the `NotEqualsNode` would be the root node, with the left and right nodes + * corresponding to the identifier `RowKey` and the constant `bar`, respectively. + * + * NOTE: This operation includes backwards compatibility for the `guid` type hint, since + * earlier versions of Azurite stored guid values in their raw string format. + */ +export default class NotEqualsNode extends BinaryOperatorNode { + get name(): string { + return `ne` + } + + evaluate(context: IQueryContext): any { + const left = this.left.evaluate(context); + const right = this.right.evaluate(context); + + // If either side is undefined, we should not match - this only occurs in scenarios where + // the field itself doesn't exist on the entity. + return left !== right && left !== undefined && right !== undefined && this.backwardsCompatibleGuidEvaluate(context); + } + + private backwardsCompatibleGuidEvaluate(context: IQueryContext): boolean { + const left = this.left instanceof GuidNode ? this.left.legacyStorageFormat() : this.left.evaluate(context); + const right = this.right instanceof GuidNode ? this.right.legacyStorageFormat() : this.right.evaluate(context); + + return left !== right; + } +} \ No newline at end of file diff --git a/src/table/persistence/QueryInterpreter/QueryNodes/NotNode.ts b/src/table/persistence/QueryInterpreter/QueryNodes/NotNode.ts new file mode 100644 index 000000000..0333c1975 --- /dev/null +++ b/src/table/persistence/QueryInterpreter/QueryNodes/NotNode.ts @@ -0,0 +1,29 @@ +import { IQueryContext } from "../IQueryContext"; +import IQueryNode from "./IQueryNode"; + +/** + * Represents a unary "not" operation within the query. + * + * This is used in queries which resemble the following: + * + * not (PartitionKey eq 'foo') + * + * In this case, the `NotNode` would be the root node, with the right node + * corresponding to `(PartitionKey eq 'foo')`. As a unary operator, there + * is no left node. + */ +export default class NotNode implements IQueryNode { + constructor(public right: IQueryNode) { } + + get name(): string { + return "not"; + } + + evaluate(context: IQueryContext): any { + return !this.right.evaluate(context); + } + + toString(): string { + return `(${this.name} ${this.right.toString()})`; + } +} \ No newline at end of file diff --git a/src/table/persistence/QueryInterpreter/QueryNodes/OrNode.ts b/src/table/persistence/QueryInterpreter/QueryNodes/OrNode.ts new file mode 100644 index 000000000..0c5186b6e --- /dev/null +++ b/src/table/persistence/QueryInterpreter/QueryNodes/OrNode.ts @@ -0,0 +1,22 @@ +import { IQueryContext } from "../IQueryContext"; +import BinaryOperatorNode from "./BinaryOperatorNode"; + +/** + * Represents a logical OR operation between two nodes. + * + * This is used in queries which resemble the following: + * + * (PartitionKey eq 'foo') or (RowKey eq 'bar') + * + * In this case, the `OrNode` would be the root node, with the left and right nodes + * corresponding to `(PartitionKey eq 'foo')` and `(RowKey eq 'bar')`, respectively. + */ +export default class OrNode extends BinaryOperatorNode { + get name(): string { + return `or`; + } + + evaluate(context: IQueryContext): any { + return this.left.evaluate(context) || this.right.evaluate(context); + } +} \ No newline at end of file diff --git a/src/table/persistence/QueryInterpreter/QueryParser.ts b/src/table/persistence/QueryInterpreter/QueryParser.ts new file mode 100644 index 000000000..f448b0f7e --- /dev/null +++ b/src/table/persistence/QueryInterpreter/QueryParser.ts @@ -0,0 +1,265 @@ +import { QueryLexer, QueryTokenKind } from "./QueryLexer"; +import AndNode from "./QueryNodes/AndNode"; +import BinaryDataNode from "./QueryNodes/BinaryDataNode"; +import ConstantNode from "./QueryNodes/ConstantNode"; +import DateTimeNode from "./QueryNodes/DateTimeNode"; +import EqualsNode from "./QueryNodes/EqualsNode"; +import GreaterThanEqualNode from "./QueryNodes/GreaterThanEqualNode"; +import GreaterThanNode from "./QueryNodes/GreaterThanNode"; +import GuidNode from "./QueryNodes/GuidNode"; +import IQueryNode from "./QueryNodes/IQueryNode"; +import IdentifierNode from "./QueryNodes/IdentifierNode"; +import LessThanEqualNode from "./QueryNodes/LessThanEqualNode"; +import LessThanNode from "./QueryNodes/LessThanNode"; +import NotEqualsNode from "./QueryNodes/NotEqualsNode"; +import NotNode from "./QueryNodes/NotNode"; +import OrNode from "./QueryNodes/OrNode"; + + +export default function parseQuery(query: string): IQueryNode { + return new QueryParser(query).visit(); +} + +/** + * A recursive descent parser for the Azure Table Storage $filter query syntax. + * + * This parser is implemented using a recursive descent strategy, which composes + * layers of syntax hierarchy, roughly corresponding to the structure of an EBNF + * grammar. Each layer of the hierarchy is implemented as a method which consumes + * the syntax for that layer, and then calls the next layer of the hierarchy. + * + * So for example, the syntax tree that we currently use is composed of: + * - QUERY := EXPRESSION + * - EXPRESSION := OR + * - OR := AND ("or" OR)* + * - AND := UNARY ("and" AND)* + * - UNARY := ("not")? EXPRESSION_GROUP + * - EXPRESSION_GROUP := ("(" EXPRESSION ")") | BINARY + * - BINARY := IDENTIFIER_OR_CONSTANT (OPERATOR IDENTIFIER_OR_CONSTANT)? + * - IDENTIFIER_OR_CONSTANT := CONSTANT | IDENTIFIER + * - CONSTANT := NUMBER | STRING | BOOLEAN | DATETIME | GUID | BINARY + * - NUMBER := ("-" | "+")? [0-9]+ ("." [0-9]+)? ("L")? + */ +class QueryParser { + constructor(query: string) { + this.tokens = new QueryLexer(query); + } + + private tokens: QueryLexer + + /** + * Visits the root of the query syntax tree, returning the corresponding root node. + * + * @returns {IQueryNode} + */ + visit(): IQueryNode { + return this.visitQuery(); + } + + /** + * Visits the QUERY layer of the query syntax tree, returning the appropriate node. + * + * @returns {IQueryNode} + */ + private visitQuery(): IQueryNode { + const tree = this.visitExpression(); + + this.tokens.next(token => token.kind === "end-of-query") || this.throwUnexpectedToken("end-of-query"); + + return tree; + } + + /** + * Visits the EXPRESSION layer of the query syntax tree, returning the appropriate node. + * + * EXPRESSION := OR + * + * @returns {IQueryNode} + */ + private visitExpression(): IQueryNode { + return this.visitOr(); + } + + /** + * Visits the OR layer of the query syntax tree, returning the appropriate node. + * + * OR := AND ("or" OR)* + * + * @returns {IQueryNode} + */ + private visitOr(): IQueryNode { + const left = this.visitAnd(); + + if (this.tokens.next(t => t.kind === "logic-operator" && t.value?.toLowerCase() === "or")) { + const right = this.visitOr(); + + return new OrNode(left, right); + } else { + return left; + } + } + + /** + * Visits the AND layer of the query syntax tree, returning the appropriate node. + * + * AND := UNARY ("and" AND)* + * + * @returns {IQueryNode} + */ + private visitAnd(): IQueryNode { + const left = this.visitUnary(); + + if (this.tokens.next(t => t.kind === "logic-operator" && t.value?.toLowerCase() === "and")) { + const right = this.visitAnd(); + + return new AndNode(left, right); + } else { + return left; + } + } + + /** + * Visits the UNARY layer of the query syntax tree, returning the appropriate node. + * + * UNARY := ("not")? EXPRESSION_GROUP + * + * @returns {IQueryNode} + */ + private visitUnary(): IQueryNode { + const hasNot = !!this.tokens.next(t => t.kind === "unary-operator" && t.value?.toLowerCase() === "not"); + + const right = this.visitExpressionGroup(); + + if (hasNot) { + return new NotNode(right); + } else { + return right; + } + } + + /** + * Visits the EXPRESSION_GROUP layer of the query syntax tree, returning the appropriate node. + * + * EXPRESSION_GROUP := ("(" OR ")") | BINARY + * + * @returns {IQueryNode} + */ + private visitExpressionGroup(): IQueryNode { + if (this.tokens.next(t => t.kind === "open-paren")) { + const child = this.visitExpression(); + + this.tokens.next(t => t.kind === "close-paren") || this.throwUnexpectedToken("close-paren"); + + return child; + } else { + return this.visitBinary(); + } + } + + /** + * Visits the BINARY layer of the query syntax tree, returning the appropriate node. + * + * BINARY := IDENTIFIER_OR_CONSTANT (OPERATOR IDENTIFIER_OR_CONSTANT)? + * + * @returns {IQueryNode} + */ + private visitBinary(): IQueryNode { + const left = this.visitIdentifierOrConstant(); + + const operator = this.tokens.next(t => t.kind === "comparison-operator"); + if (!operator) { + return left; + } + + const binaryOperators: { + [type: string]: new (left: IQueryNode, right: IQueryNode) => IQueryNode + } = { + "eq": EqualsNode, + "ne": NotEqualsNode, + "ge": GreaterThanEqualNode, + "gt": GreaterThanNode, + "le": LessThanEqualNode, + "lt": LessThanNode + }; + + const operatorType = binaryOperators[operator.value?.toLowerCase() || ""] || null; + + if (!operatorType) { + throw new Error(`Got an unexpected operator '${operator?.value}' at :${operator?.position}, expected one of: ${Object.keys(binaryOperators).join(", ")}.`); + } + + const right = this.visitIdentifierOrConstant(); + return new operatorType(left, right); + } + + /** + * Visits the IDENTIFIER_OR_CONSTANT layer of the query syntax tree, returning the appropriate node. + * + * IDENTIFIER_OR_CONSTANT := (TYPE_HINT STRING) | NUMBER | STRING | BOOL | IDENTIFIER + * + * @returns {IQueryNode} + */ + private visitIdentifierOrConstant(): IQueryNode { + + switch (this.tokens.peek().kind) { + case "identifier": + return new IdentifierNode(this.tokens.next().value!); + case "bool": + return new ConstantNode(this.tokens.next().value?.toLowerCase() === "true"); + case "string": + return new ConstantNode(this.tokens.next().value); + case "number": + return this.visitNumber(); + case "type-hint": + return this.visitTypeHint(); + default: + this.throwUnexpectedToken("identifier", "bool", "string", "number", "type-hint"); + } + } + + private visitTypeHint(): IQueryNode { + const typeHint = this.tokens.next(t => t.kind === "type-hint") || this.throwUnexpectedToken("type-hint"); + const value = this.tokens.next(t => t.kind === "string") || this.throwUnexpectedToken("string"); + + switch (typeHint.value?.toLowerCase()) { + case "datetime": + return new DateTimeNode(new Date(value.value!)); + case "guid": + return new GuidNode(value.value!); + case "binary": + case "x": + return new BinaryDataNode(value.value!); + default: + throw new Error(`Got an unexpected type hint '${typeHint.value}' at :${typeHint.position} (this implies that the parser is missing a match arm).`); + } + } + + /** + * Visits the NUMBER layer of the query syntax tree, returning the appropriate node. + * + * NUMBER := ("-" | "+")? [0-9]+ ("." [0-9]+)? ("L")? + * + * @returns {IQueryNode} + */ + private visitNumber(): IQueryNode { + const token = this.tokens.next(t => t.kind === "number") || this.throwUnexpectedToken("number"); + + if (token.value!.endsWith("L")) { + // This is a "long" number, which should be represented by its string equivalent + return new ConstantNode(token.value!.substring(0, token.value!.length - 1)); + } else { + return new ConstantNode(parseFloat(token.value!)); + } + } + + /** + * Raises an exception if the next token in the query is not one of the expected tokens. + * + * @param {QueryTokenKind} expected The type of tokens which were expected. + */ + private throwUnexpectedToken(...expected: QueryTokenKind[]): never { + const actualToken = this.tokens.peek(); + + throw new Error(`Unexpected token '${actualToken.kind}' at ${actualToken.value || ''}:${actualToken.position}+${actualToken.length} (expected one of: ${expected.join(", ")}).`); + } +} diff --git a/src/table/persistence/QueryInterpreter/QueryValidator.ts b/src/table/persistence/QueryInterpreter/QueryValidator.ts new file mode 100644 index 000000000..2a917d3ad --- /dev/null +++ b/src/table/persistence/QueryInterpreter/QueryValidator.ts @@ -0,0 +1,37 @@ +import BinaryOperatorNode from "./QueryNodes/BinaryOperatorNode"; +import IQueryNode from "./QueryNodes/IQueryNode"; +import IdentifierNode from "./QueryNodes/IdentifierNode"; +import NotNode from "./QueryNodes/NotNode"; + +/** + * Validates that the provided query tree represents a valid query. + * + * That is, a query containing at least one conditional expression, + * where every conditional expression operates on at least + * one column or built-in identifier (i.e. comparison between two constants is not allowed). + * + * @param {IQueryNode} queryTree + */ +export function validateQueryTree(queryTree: IQueryNode) { + const identifierReferences = countIdentifierReferences(queryTree); + + if (identifierReferences === 0) { + throw new Error("Invalid Query, no identifier references found."); + } +} + +function countIdentifierReferences(queryTree: IQueryNode): number { + if (queryTree instanceof IdentifierNode) { + return 1; + } + + if (queryTree instanceof BinaryOperatorNode) { + return countIdentifierReferences(queryTree.left) + countIdentifierReferences(queryTree.right); + } + + if (queryTree instanceof NotNode) { + return countIdentifierReferences(queryTree.right); + } + + return 0; +} \ No newline at end of file diff --git a/src/table/persistence/QueryInterpreter/README.md b/src/table/persistence/QueryInterpreter/README.md new file mode 100644 index 000000000..06b68caf2 --- /dev/null +++ b/src/table/persistence/QueryInterpreter/README.md @@ -0,0 +1,138 @@ +# Table Query Interpreter +This directory contains the logic behind the Azurite Table query interpreter, which +is responsible for implementing the OData query API used to perform `$filter`-ing +of query results from a Table. + +The interpreter is broken into several distinct layers. + +## Components +### Lexer (`./QueryLexer.ts`) +The lexer is responsible for converting a query string into a sequence of tokens +which can be more easily parsed. In theory you don't need this component (the parser +can worry about how to break down these tokens) but in practice this tends to make +the parser easier to read and maintain by separating the logic of "how do we break this +into logical components" from the logic of "how do these components come together to +form a query?". + +Effectively, the lexer takes a query string like +`PartitionKey eq 'test' and MyField ne guid"00000000-0000-0000-0000-000000000000"` +and converts it into the following tokens which can then be easily reasoned about: + +- `identifier (PartitionKey)` +- `comparison-operator (eq)` +- `string (test)` +- `logic-operator (and)` +- `identifier (MyField)` +- `comparison-operator (ne)` +- `type-hint (guid)` +- `string (00000000-0000-0000-0000-000000000000)` + +You'll immediately notice that this structure is "flat" and doesn't have any sense of +which tokens are associated with one another, that's the job of the parser... + +### Parser (`./QueryParser.ts`) +The parser is responsible for taking a stream of tokens and constructing an Abstract +Syntax Tree (AST) representation based on the rules of the language. These rules are +commonly written in [EBNF](https://en.wikipedia.org/wiki/Extended_Backus%E2%80%93Naur_form) +and describe the relationships between tokens. + +For example, we might describe an `or` operation using the following format: + +``` +OR = AND ("or" OR)? +``` + +These components are then recursively resolved to build up a tree describing the query. +We use a **Recursive Descent** parsing strategy to achieve this, and you'll notice that +there are methods in `./QueryParser.ts` to do things like `visitOr()` and `visitAnd()` +which compose to provide this functionality. + +```typescript +class QueryParser { + visitOr(): IQueryNode { + // We first visit the left hand side of the expression, which will return the most appropriate node for the left hand branch. + const left = this.visitAnd(); + + // If the next token is not the "and" operator, then we ignore the right hand side (it is optional) + if (!this.tokens.next(t => t.kind == "logic-operation" && t.value == "or")) { + return left; + } + + // We recursively visit "OR" branches to allow queries like "x or y or z". + const right = this.visitOr(); + + return new OrNode(left, right); + } +} +``` + +By combining this pattern, we can unambiguously parse the query into the correct +AST node representation, however if by the time we finish parsing there are still +tokens remaining in the stream (other than the `end-of-query` meta-token) we know +that the query was not valid. This can occur in scenarios like `x eq y eq z` which +is not a supported query structure for OData. + +Something to pay attention to when implementing these methods is that the order of +traversal matters (i.e. if you have `visitAnd()` call `visitOr()` then `or` statements +will take precedence over `and` statements, and vice versa). + +### AST (`./QueryNodes/*.ts`) +The parser's output is a tree structure that describes the query it processed, and this +tree is composed of nodes that describe the operations that should be executed by the +query. In the world of language parsing, this is called an "abstract syntax tree" +and the node classes in the `./QueryNodes` folder provide the types used to represent +it. + +Each of these node types can have zero or more children and is required to implement the +`evaluate(context: IQueryContext)` method to resolve a runtime value for the query at +this point. For example, the `ConstantNode` may be used to represent the string value +`"hello"` and its `evaluate(context)` method will simply return `"hello"` as a result. + +More complex node types like `EqualsNode` contain references to their `left` and `right` +child nodes, and we evaluate using a depth-first strategy here such that the +`evaluate(context)` method in the `EqualsNode` returns +the result of `left.evaluate(context) === right.evaluate(context)`. + +As a result of this structure, the root node for the query will eventually evaluate +to a single value, which is the result of the query - and we're able to achieve this +without needing to dynamically emit code at runtime. + +### Validator (`./QueryValidator.ts`) +The final step before we run a query is to perform some semantic validation against it. +There are certain queries which are not valid in the real world (like `1 eq 1`, which will +always return `true` and isn't practically querying anything) and the role of the validator +is to spot these issues and reject the query. + +It does this by applying a visitor-style pattern which looks at the nodes in the AST to +determine whether they meet certain criteria. In our case, the only validation being +performed is that the query itself must reference at last one identifier (a property, +`PartitionKey`, `RowKey` or `TableName`). + +## Future Improvements +The following are some of the potential future enhancements which may be made to this +parser/interpreter to improve its support for the Azure Table Storage query API. + +### Type-Aware Queries (Breaking Change) +Currently queries are evaluated without regard for the data type they are representing. +This means that `123.0L eq '123.0'` is technically `true` even though the data types for +these two entities are clearly not the same. The same applies to `datetime`, `binary`, +`X`, and `guid` data types - which leaves plenty of room for queries to work in Azurite +but fail when they hit Azure Table Storage. + +Unfortunately, introducing this change would be a backwards incompatible shift in the +Azurite API (which we need to be careful about). + + +That said, the way we would go about doing this would be to have the `IQueryNode.evaluate` +function return a typed data interface, something like the following: + +```typescript +export interface TypedValue { + value: any; + type: "Undefined" | "Null" | "Edm.Guid" | "Edm.DateTime" | "Edm.Int64" | "Edm.Binary" | "Edm.Boolean" | "Edm.String" | "Edm.Int32" | "Edm.Double"; +} +``` + +This would allow us to then compare type-wise equality for any of our operations, and the +`IdentifierNode` would be responsible for extracting the appropriate type from the `@odata.type` +meta-property when retrieving a field. \ No newline at end of file diff --git a/src/table/persistence/QueryTranscriber/IQPState.ts b/src/table/persistence/QueryTranscriber/IQPState.ts deleted file mode 100644 index d466cce7d..000000000 --- a/src/table/persistence/QueryTranscriber/IQPState.ts +++ /dev/null @@ -1,14 +0,0 @@ -import QueryContext from "./QueryContext"; -import { QueryStateName } from "./QueryStateName"; - -/** - * Interface for Query Predicate State - * - * @export - * @interface IQPState - */ -export default interface IQPState { - name: QueryStateName; - onProcess: (context: QueryContext) => QueryContext; - onExit: (context: QueryContext) => QueryContext; -} diff --git a/src/table/persistence/QueryTranscriber/LokiJsQueryTranscriber.ts b/src/table/persistence/QueryTranscriber/LokiJsQueryTranscriber.ts deleted file mode 100644 index 2e77b0d70..000000000 --- a/src/table/persistence/QueryTranscriber/LokiJsQueryTranscriber.ts +++ /dev/null @@ -1,26 +0,0 @@ -import QueryContext from "./QueryContext"; -import { QueryStateName } from "./QueryStateName"; -import QueryTranscriber from "./QueryTranscriber"; - -/** - * provides a facade over the QueryTranscriber to hide state - * implementation from callers - * - * @export - * @class LokiJsQueryTranscriber - * @extends {QueryTranscriber} - */ -export default class LokiJsQueryTranscriber extends QueryTranscriber { - constructor(queryContext: QueryContext, name: string) { - super(queryContext, name); - } - - /** - * Starts the statemachine without the need to know what states were used - * - * @memberof LokiJsQueryTranscriber - */ - public transcribe() { - this.setState(QueryStateName.QueryStarted); - } -} diff --git a/src/table/persistence/QueryTranscriber/LokiJsQueryTranscriberFactory.ts b/src/table/persistence/QueryTranscriber/LokiJsQueryTranscriberFactory.ts deleted file mode 100644 index bdc220408..000000000 --- a/src/table/persistence/QueryTranscriber/LokiJsQueryTranscriberFactory.ts +++ /dev/null @@ -1,93 +0,0 @@ -import QueryContext from "./QueryContext"; -import { QueryStateName } from "./QueryStateName"; -import StatePredicateFinished from "./StatePredicateFinished"; -import StatePredicateStarted from "./StatePredicateStarted"; -import StateProcessIdentifier from "./StateProcessIdentifier"; -import StateProcessOperator from "./StateProcessOperator"; -import StateProcessValue from "./StateProcessValue"; -import StateQueryFinished from "./StateQueryFinished"; -import StateQueryStarted from "./StateQueryStarted"; -import LokiJsQueryTranscriber from "./LokiJsQueryTranscriber"; -import StateProcessPredicateOperator from "./StateProcessPredicateOperator"; -import StateProcessParensOpen from "./StateProcessParensOpen"; -import StateProcessParensClose from "./StateProcessParensClose"; - -export default class LokiJsQueryTranscriberFactory { - public static createEntityQueryTranscriber( - queryString: string, - name: string = "entity query transcriber" - ): LokiJsQueryTranscriber { - // initializes the data state for the query transcriber state machine - const queryContext = new QueryContext(queryString); - const transcriber = new LokiJsQueryTranscriber(queryContext, name); - - // Add the states to the transcriber. - transcriber.addState(QueryStateName.QueryStarted, new StateQueryStarted()); - transcriber.addState( - QueryStateName.ProcessParensOpen, - new StateProcessParensOpen() - ); - transcriber.addState( - QueryStateName.ProcessParensClose, - new StateProcessParensClose() - ); - transcriber.addState( - QueryStateName.PredicateStarted, - new StatePredicateStarted() - ); - transcriber.addState( - QueryStateName.ProcessIdentifier, - new StateProcessIdentifier() - ); - transcriber.addState( - QueryStateName.ProcessOperator, - new StateProcessOperator() - ); - transcriber.addState( - QueryStateName.ProcessPredicateOperator, - new StateProcessPredicateOperator() - ); - transcriber.addState(QueryStateName.ProcessValue, new StateProcessValue()); - transcriber.addState( - QueryStateName.PredicateFinished, - new StatePredicateFinished() - ); - transcriber.addState( - QueryStateName.QueryFinished, - new StateQueryFinished() - ); - - return transcriber; - } - - // ToDo: need to observe system props and not allow custom props - public static createTableQueryTranscriber( - queryString: string, - name: string = "table query transcriber" - ): LokiJsQueryTranscriber { - // initializes the data state for the query transcriber state machine - const queryContext = new QueryContext(queryString, true); - const transcriber = new LokiJsQueryTranscriber(queryContext, name); - - // Add the states to the transcriber. - transcriber - .addState(QueryStateName.QueryStarted, new StateQueryStarted()) - .addState(QueryStateName.ProcessParensOpen, new StateProcessParensOpen()) - .addState( - QueryStateName.ProcessParensClose, - new StateProcessParensClose() - ) - .addState(QueryStateName.PredicateStarted, new StatePredicateStarted()) - .addState(QueryStateName.ProcessIdentifier, new StateProcessIdentifier()) - .addState(QueryStateName.ProcessOperator, new StateProcessOperator()) - .addState( - QueryStateName.ProcessPredicateOperator, - new StateProcessPredicateOperator() - ) - .addState(QueryStateName.ProcessValue, new StateProcessValue()) - .addState(QueryStateName.PredicateFinished, new StatePredicateFinished()) - .addState(QueryStateName.QueryFinished, new StateQueryFinished()); - - return transcriber; - } -} diff --git a/src/table/persistence/QueryTranscriber/PredicateModel/BinaryPredicate.ts b/src/table/persistence/QueryTranscriber/PredicateModel/BinaryPredicate.ts deleted file mode 100644 index cd0f3e7d2..000000000 --- a/src/table/persistence/QueryTranscriber/PredicateModel/BinaryPredicate.ts +++ /dev/null @@ -1,99 +0,0 @@ -import { TokenMap } from "./TokenMap"; -import IPredicate from "./IPredicate"; -import IdentifierToken from "../TokenModel/IdentifierToken"; -import TaggedToken from "../TokenModel/TaggedToken"; -import ValueToken from "../TokenModel/ValueToken"; - -export default class BinaryPredicate implements IPredicate { - tokenMap: TokenMap; - constructor(tokenMap: TokenMap) { - this.tokenMap = tokenMap; - } - - /** - * Converts a binary predicate for LokiJs filter - * - * @return {*} - * @memberof BinaryPredicate - */ - public convertPredicateForLokiJS() { - const newTokens: TaggedToken[] = []; - try { - this.tokenMap.tokens.forEach((taggedToken) => { - this.pushValue(taggedToken, newTokens); - this.pushIdentifier(taggedToken, newTokens); - this.pushOperator(taggedToken, newTokens); - }); - this.tokenMap.tokens = newTokens; - } catch (err) { - throw err; - } - - return this; - } - - /** - * Pushes value for boolean predicate - * - * @param {TaggedToken} taggedToken - * @param {TaggedToken[]} newTokens - * @memberof BooleanPredicate - */ - pushValue(taggedToken: TaggedToken, newTokens: TaggedToken[]) { - if (taggedToken.type.isValue()) { - // assumption is that we have a binary value which needs to be - // converted to base64 - // decision on type is made earlier so no additional check - const trim = this.getTrimLength(taggedToken.token); - const binaryString = taggedToken.token.slice( - trim, - taggedToken.token.length - 1 - ); - - const base64String = Buffer.from(binaryString, "hex").toString("base64"); - newTokens.push( - new TaggedToken("'" + base64String + "'", new ValueToken()) - ); - } - } - - getTrimLength(token: string): number { - if (token.match(/^X\'/) !== null) { - return 2; - } else if (token.match(/^binary\'/) !== null) { - return 7; - } - return 0; - } - - /** - * pushes identifier for boolean predicate - * - * @param {TaggedToken} taggedToken - * @param {TaggedToken[]} newTokens - * @memberof BooleanPredicate - */ - pushIdentifier(taggedToken: TaggedToken, newTokens: TaggedToken[]) { - if (taggedToken.type.isIdentifier()) { - newTokens.push( - new TaggedToken( - `item.properties.${taggedToken.token}`, - new IdentifierToken() - ) - ); - } - } - - /** - * pushes operator for boolean predicate - * - * @param {TaggedToken} taggedToken - * @param {TaggedToken[]} newTokens - * @memberof BooleanPredicate - */ - pushOperator(taggedToken: TaggedToken, newTokens: TaggedToken[]) { - if (taggedToken.type.isOperator()) { - newTokens.push(taggedToken); - } - } -} diff --git a/src/table/persistence/QueryTranscriber/PredicateModel/BooleanPredicate.ts b/src/table/persistence/QueryTranscriber/PredicateModel/BooleanPredicate.ts deleted file mode 100644 index 096b22106..000000000 --- a/src/table/persistence/QueryTranscriber/PredicateModel/BooleanPredicate.ts +++ /dev/null @@ -1,77 +0,0 @@ -import TaggedToken from "../TokenModel/TaggedToken"; -import { TokenMap } from "./TokenMap"; -import IdentifierToken from "../TokenModel/IdentifierToken"; -import ValueToken from "../TokenModel/ValueToken"; -import IPredicate from "./IPredicate"; - -export default class BooleanPredicate implements IPredicate { - tokenMap: TokenMap; - constructor(tokenMap: TokenMap) { - this.tokenMap = tokenMap; - } - - /** - * converts a boolean predicate for lokijs schema - * - * @return {*} - * @memberof BooleanPredicate - */ - public convertPredicateForLokiJS() { - const newTokens: TaggedToken[] = []; - - this.tokenMap.tokens.forEach((taggedToken) => { - this.pushValue(taggedToken, newTokens); - this.pushIdentifier(taggedToken, newTokens); - this.pushOperator(taggedToken, newTokens); - }); - this.tokenMap.tokens = newTokens; - - return this; - } - - /** - * Pushes value for boolean predicate - * - * @param {TaggedToken} taggedToken - * @param {TaggedToken[]} newTokens - * @memberof BooleanPredicate - */ - pushValue(taggedToken: TaggedToken, newTokens: TaggedToken[]) { - if (taggedToken.type.isValue()) { - newTokens.push( - new TaggedToken(taggedToken.token.toLowerCase(), new ValueToken()) - ); - } - } - - /** - * pushes identifier for boolean predicate - * - * @param {TaggedToken} taggedToken - * @param {TaggedToken[]} newTokens - * @memberof BooleanPredicate - */ - pushIdentifier(taggedToken: TaggedToken, newTokens: TaggedToken[]) { - if (taggedToken.type.isIdentifier()) { - newTokens.push( - new TaggedToken( - `item.properties.${taggedToken.token}`, - new IdentifierToken() - ) - ); - } - } - - /** - * pushes operator for boolean predicate - * - * @param {TaggedToken} taggedToken - * @param {TaggedToken[]} newTokens - * @memberof BooleanPredicate - */ - pushOperator(taggedToken: TaggedToken, newTokens: TaggedToken[]) { - if (taggedToken.type.isOperator()) { - newTokens.push(taggedToken); - } - } -} diff --git a/src/table/persistence/QueryTranscriber/PredicateModel/DatePredicate.ts b/src/table/persistence/QueryTranscriber/PredicateModel/DatePredicate.ts deleted file mode 100644 index cf3783e11..000000000 --- a/src/table/persistence/QueryTranscriber/PredicateModel/DatePredicate.ts +++ /dev/null @@ -1,82 +0,0 @@ -import TaggedToken from "../TokenModel/TaggedToken"; -import { TokenMap } from "./TokenMap"; -import IdentifierToken from "../TokenModel/IdentifierToken"; -import ValueToken from "../TokenModel/ValueToken"; -import IPredicate from "./IPredicate"; - -export default class DatePredicate implements IPredicate { - tokenMap: TokenMap; - constructor(tokenMap: TokenMap) { - this.tokenMap = tokenMap; - } - - /** - * converts a datetime predicate for lokijs schema - * - * @return {*} - * @memberof DatePredicate - */ - public convertPredicateForLokiJS() { - const newTokens: TaggedToken[] = []; - - this.tokenMap.tokens.forEach((taggedToken) => { - this.pushValue(taggedToken, newTokens); - this.pushIdentifier(taggedToken, newTokens); - this.pushOperator(taggedToken, newTokens); - }); - this.tokenMap.tokens = newTokens; - - return this; - } - - /** - * pushes value for date predicate - * - * @param {TaggedToken} taggedToken - * @param {TaggedToken[]} newTokens - * @memberof DatePredicate - */ - pushValue(taggedToken: TaggedToken, newTokens: TaggedToken[]) { - if (taggedToken.type.isValue()) { - newTokens.push( - new TaggedToken( - "new Date(" + - taggedToken.token.substring(8, taggedToken.token.length) + - ").getTime()", - new ValueToken() - ) - ); - } - } - - /** - * pushes identifier in a date predicate - * - * @param {TaggedToken} taggedToken - * @param {TaggedToken[]} newTokens - * @memberof DatePredicate - */ - pushIdentifier(taggedToken: TaggedToken, newTokens: TaggedToken[]) { - if (taggedToken.type.isIdentifier()) { - newTokens.push( - new TaggedToken( - `new Date(item.properties.${taggedToken.token}).getTime()`, - new IdentifierToken() - ) - ); - } - } - - /** - * Pushes operator in a date predicate - * - * @param {TaggedToken} taggedToken - * @param {TaggedToken[]} newTokens - * @memberof DatePredicate - */ - pushOperator(taggedToken: TaggedToken, newTokens: TaggedToken[]) { - if (taggedToken.type.isOperator()) { - newTokens.push(taggedToken); - } - } -} diff --git a/src/table/persistence/QueryTranscriber/PredicateModel/DoublePredicate.ts b/src/table/persistence/QueryTranscriber/PredicateModel/DoublePredicate.ts deleted file mode 100644 index 76d8e065e..000000000 --- a/src/table/persistence/QueryTranscriber/PredicateModel/DoublePredicate.ts +++ /dev/null @@ -1,75 +0,0 @@ -import TaggedToken from "../TokenModel/TaggedToken"; -import { TokenMap } from "./TokenMap"; -import IdentifierToken from "../TokenModel/IdentifierToken"; -import ValueToken from "../TokenModel/ValueToken"; -import IPredicate from "./IPredicate"; - -export default class DoublePredicate implements IPredicate { - tokenMap: TokenMap; - constructor(tokenMap: TokenMap) { - this.tokenMap = tokenMap; - } - - /** - * converts a double predicate for lokijs schema - * - * @return {*} - * @memberof DoublePredicate - */ - public convertPredicateForLokiJS() { - const newTokens: TaggedToken[] = []; - - this.tokenMap.tokens.forEach((taggedToken) => { - this.pushValue(taggedToken, newTokens); - this.pushIdentifier(taggedToken, newTokens); - this.pushOperator(taggedToken, newTokens); - }); - this.tokenMap.tokens = newTokens; - - return this; - } - - /** - * pushes value for double predicate - * - * @param {TaggedToken} taggedToken - * @param {TaggedToken[]} newTokens - * @memberof DoublePredicate - */ - pushValue(taggedToken: TaggedToken, newTokens: TaggedToken[]) { - if (taggedToken.type.isValue()) { - newTokens.push(new TaggedToken(taggedToken.token, new ValueToken())); - } - } - - /** - * pushes identifier for double predicate - * - * @param {TaggedToken} taggedToken - * @param {TaggedToken[]} newTokens - * @memberof DoublePredicate - */ - pushIdentifier(taggedToken: TaggedToken, newTokens: TaggedToken[]) { - if (taggedToken.type.isIdentifier()) { - newTokens.push( - new TaggedToken( - `item.properties.${taggedToken.token}`, - new IdentifierToken() - ) - ); - } - } - - /** - * pushes operator for double predicate - * - * @param {TaggedToken} taggedToken - * @param {TaggedToken[]} newTokens - * @memberof DoublePredicate - */ - pushOperator(taggedToken: TaggedToken, newTokens: TaggedToken[]) { - if (taggedToken.type.isOperator()) { - newTokens.push(taggedToken); - } - } -} diff --git a/src/table/persistence/QueryTranscriber/PredicateModel/GuidPredicate.ts b/src/table/persistence/QueryTranscriber/PredicateModel/GuidPredicate.ts deleted file mode 100644 index ba3bdbecf..000000000 --- a/src/table/persistence/QueryTranscriber/PredicateModel/GuidPredicate.ts +++ /dev/null @@ -1,190 +0,0 @@ -import TaggedToken from "../TokenModel/TaggedToken"; -import { TokenMap } from "./TokenMap"; -import IdentifierToken from "../TokenModel/IdentifierToken"; -import OperatorToken from "../TokenModel/OperatorToken"; -import ParensCloseToken from "../TokenModel/ParensCloseToken"; -import ParensOpenToken from "../TokenModel/ParensOpenToken"; -import ValueToken from "../TokenModel/ValueToken"; -import IPredicate from "./IPredicate"; - -export default class GuidPredicate implements IPredicate { - tokenMap: TokenMap; - constructor(tokenMap: TokenMap) { - this.tokenMap = tokenMap; - } - - /** - * Converts a guid predicate for lokijs schema - * Guid predicate has special handling as we need to support - * older schema for the cases that database is not new before - * updating to new logic to differentiate between guid type - * and string type - * - * @return {*} - * @memberof GuidPredicate - */ - public convertPredicateForLokiJS() { - const newTokens: TaggedToken[] = []; - this.pushBase64GuidPredicate(newTokens, this.tokenMap); - this.backWardCompatibleGuidMatch(newTokens, this.tokenMap); - this.tokenMap.tokens = newTokens; - return this; - } - - /** - * GUIDs were originally stored as plain strings, but this diverged from the - * service, so we changed the storage format to base64 encoded strings. - * To allow for transition between schemas, we update "equals / not equals" - * queries to search for both plain string and base64 encoded. - * - * @param {TaggedToken[]} newTokens - * @param {TokenMap} tokenMap - * @memberof GuidPredicate - */ - backWardCompatibleGuidMatch(newTokens: TaggedToken[], tokenMap: TokenMap) { - if (this.isBackWardsCompatiblePredicate(tokenMap)) { - this.pushPredicate(newTokens, this.tokenMap); - this.pushStringGuidPredicate(newTokens, this.tokenMap); - } - } - - private isBackWardsCompatiblePredicate(tokenMap: TokenMap) { - return ( - tokenMap.tokens[1].token === "===" || tokenMap.tokens[1].token === "!==" - ); - } - - /** - * adds an OR operator to allow query to return both base64 and string GUIDs - * or an AND operator to retun GUIDs not matching either base64 or string rep - * other operators cannot support backwards compatibility and require the - * persistent storage (database) to be recreated - * - * @private - * @param {TaggedToken[]} newTokens - * @param {TokenMap} taggedPredicate - * @memberof GuidPredicate - */ - private pushPredicate(newTokens: TaggedToken[], tokenMap: TokenMap) { - if (tokenMap.tokens[1].token === "===") { - newTokens.push(new TaggedToken("||", new OperatorToken())); - } else { - newTokens.push(new TaggedToken("&&", new OperatorToken())); - } - } - - /** - * new schema converts guids to base64 representation - * - * @private - * @param {TaggedToken[]} newTokens - * @param {TokenMap} taggedPredicate - * @memberof GuidPredicate - */ - private pushBase64GuidPredicate( - newTokens: TaggedToken[], - taggedPredicate: TokenMap - ) { - if (this.isBackWardsCompatiblePredicate(taggedPredicate)) { - newTokens.push(new TaggedToken("(", new ParensOpenToken())); - } - taggedPredicate.tokens.forEach((taggedToken) => { - this.pushIdentifier(taggedToken, newTokens); - this.pushOperator(taggedToken, newTokens); - this.pushBase64Guid(taggedToken, newTokens); - }); - if (this.isBackWardsCompatiblePredicate(taggedPredicate)) { - newTokens.push(new TaggedToken(")", new ParensCloseToken())); - } - } - - /** - * Pushes the base64 guid to the predicate - * - * @private - * @param {TaggedToken} taggedToken - * @param {TaggedToken[]} newTokens - * @memberof GuidPredicate - */ - private pushBase64Guid(taggedToken: TaggedToken, newTokens: TaggedToken[]) { - if (taggedToken.type.isValue()) { - const newToken = taggedToken.token.substring( - 5, - taggedToken.token.length - 1 - ); - const guidBuff = Buffer.from(newToken); - newTokens.push( - new TaggedToken(`'${guidBuff.toString("base64")}'`, new ValueToken()) - ); - } - } - - /** - * old schema guids used string representation - * - * @private - * @param {TaggedToken[]} newTokens - * @param {TokenMap} taggedPredicate - * @memberof GuidPredicate - */ - private pushStringGuidPredicate( - newTokens: TaggedToken[], - taggedPredicate: TokenMap - ) { - newTokens.push(new TaggedToken("(", new ParensOpenToken())); - taggedPredicate.tokens.forEach((taggedToken) => { - this.pushStringGuid(taggedToken, newTokens); - this.pushIdentifier(taggedToken, newTokens); - this.pushOperator(taggedToken, newTokens); - }); - newTokens.push(new TaggedToken(")", new ParensCloseToken())); - } - - /** - * Pushes the string guid to the predicate - * - * @private - * @param {TaggedToken} taggedToken - * @param {TaggedToken[]} newTokens - * @memberof GuidPredicate - */ - private pushStringGuid(taggedToken: TaggedToken, newTokens: TaggedToken[]) { - if (taggedToken.type.isValue()) { - const newToken = taggedToken.token.substring(4); - newTokens.push(new TaggedToken(newToken, new ValueToken())); - } - } - - /** - * Pushes the guid identifier to the predicate - * - * @private - * @param {TaggedToken} taggedToken - * @param {TaggedToken[]} newTokens - * @memberof GuidPredicate - */ - private pushIdentifier(taggedToken: TaggedToken, newTokens: TaggedToken[]) { - if (taggedToken.type.isIdentifier()) { - newTokens.push( - new TaggedToken( - `item.properties.${taggedToken.token}`, - new IdentifierToken() - ) - ); - } - } - - /** - * Pushes the operator to the guid predicate - * - * @private - * @param {TaggedToken} taggedToken - * @param {TaggedToken[]} newTokens - * @memberof GuidPredicate - */ - private pushOperator(taggedToken: TaggedToken, newTokens: TaggedToken[]) { - if (taggedToken.type.isOperator()) { - newTokens.push(taggedToken); - } - } -} diff --git a/src/table/persistence/QueryTranscriber/PredicateModel/IPredicate.ts b/src/table/persistence/QueryTranscriber/PredicateModel/IPredicate.ts deleted file mode 100644 index 48054b680..000000000 --- a/src/table/persistence/QueryTranscriber/PredicateModel/IPredicate.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { TokenMap } from "./TokenMap"; - -/** - * Interface used with predicates to allow conversion - * to different database representation / schemas - * - * @export - * @interface IPredicate - */ -export default interface IPredicate { - convertPredicateForLokiJS(): IPredicate; - tokenMap: TokenMap; -} diff --git a/src/table/persistence/QueryTranscriber/PredicateModel/IntegerPredicate.ts b/src/table/persistence/QueryTranscriber/PredicateModel/IntegerPredicate.ts deleted file mode 100644 index e6841b9e9..000000000 --- a/src/table/persistence/QueryTranscriber/PredicateModel/IntegerPredicate.ts +++ /dev/null @@ -1,76 +0,0 @@ -import TaggedToken from "../TokenModel/TaggedToken"; -import { TokenMap } from "./TokenMap"; -import IdentifierToken from "../TokenModel/IdentifierToken"; -import ValueToken from "../TokenModel/ValueToken"; -import IPredicate from "./IPredicate"; - -export default class IntegerPredicate implements IPredicate { - tokenMap: TokenMap; - constructor(tokenMap: TokenMap) { - this.tokenMap = tokenMap; - } - - /** - * Converts an integer predicate for lokijs schema - * - * @return {*} - * @memberof IntegerPredicate - */ - public convertPredicateForLokiJS() { - const newTokens: TaggedToken[] = []; - - this.tokenMap.tokens.forEach((taggedToken) => { - this.pushValue(taggedToken, newTokens); - this.pushIdentifier(taggedToken, newTokens); - this.pushOperator(taggedToken, newTokens); - }); - this.tokenMap.tokens = newTokens; - - return this; - } - - /** - * Pushes the value to the integer predicate - * - * @param {TaggedToken} taggedToken - * @param {TaggedToken[]} newTokens - * @memberof IntegerPredicate - */ - pushValue(taggedToken: TaggedToken, newTokens: TaggedToken[]) { - if (taggedToken.type.isValue()) { - newTokens.push(new TaggedToken(taggedToken.token, new ValueToken())); - } - } - - /** - * Pushes the identifier to the integer predicate - * - * @param {TaggedToken} taggedToken - * @param {TaggedToken[]} newTokens - * @memberof IntegerPredicate - */ - pushIdentifier(taggedToken: TaggedToken, newTokens: TaggedToken[]) { - if (taggedToken.type.isIdentifier()) { - newTokens.push( - new TaggedToken( - `item.properties.${taggedToken.token}`, - new IdentifierToken() - ) - ); - } - } - - /** - * Pushes the operator to the integer predicate - * - * @private - * @param {TaggedToken} taggedToken - * @param {TaggedToken[]} newTokens - * @memberof IntegerPredicate - */ - private pushOperator(taggedToken: TaggedToken, newTokens: TaggedToken[]) { - if (taggedToken.type.isOperator()) { - newTokens.push(taggedToken); - } - } -} diff --git a/src/table/persistence/QueryTranscriber/PredicateModel/LongPredicate.ts b/src/table/persistence/QueryTranscriber/PredicateModel/LongPredicate.ts deleted file mode 100644 index d9a7d9896..000000000 --- a/src/table/persistence/QueryTranscriber/PredicateModel/LongPredicate.ts +++ /dev/null @@ -1,83 +0,0 @@ -import TaggedToken from "../TokenModel/TaggedToken"; -import { TokenMap } from "./TokenMap"; -import IdentifierToken from "../TokenModel/IdentifierToken"; -import ValueToken from "../TokenModel/ValueToken"; -import IPredicate from "./IPredicate"; - -export default class LongPredicate implements IPredicate { - tokenMap: TokenMap; - constructor(tokenMap: TokenMap) { - this.tokenMap = tokenMap; - } - - /** - * converts a long predicate for lokijs schema - * - * @return {*} - * @memberof LongPredicate - */ - public convertPredicateForLokiJS() { - const newTokens: TaggedToken[] = []; - - this.tokenMap.tokens.forEach((taggedToken) => { - this.pushValue(taggedToken, newTokens); - this.pushIdentifier(taggedToken, newTokens); - this.pushOperator(taggedToken, newTokens); - }); - this.tokenMap.tokens = newTokens; - - return this; - } - - /** - * pushes value for long predicate - * - * @param {TaggedToken} taggedToken - * @param {TaggedToken[]} newTokens - * @memberof LongPredicate - */ - pushValue(taggedToken: TaggedToken, newTokens: TaggedToken[]) { - if (taggedToken.type.isValue()) { - newTokens.push( - new TaggedToken( - "'" + - taggedToken.token.substring(0, taggedToken.token.length - 1) + - "'", - new ValueToken() - ) - ); - } - } - - /** - * pushes identifier for long predicate - * - * @param {TaggedToken} taggedToken - * @param {TaggedToken[]} newTokens - * @memberof LongPredicate - */ - pushIdentifier(taggedToken: TaggedToken, newTokens: TaggedToken[]) { - if (taggedToken.type.isIdentifier()) { - newTokens.push( - new TaggedToken( - `item.properties.${taggedToken.token}`, - new IdentifierToken() - ) - ); - } - } - - /** - * pushes operator for long predicate - * - * @private - * @param {TaggedToken} taggedToken - * @param {TaggedToken[]} newTokens - * @memberof LongPredicate - */ - private pushOperator(taggedToken: TaggedToken, newTokens: TaggedToken[]) { - if (taggedToken.type.isOperator()) { - newTokens.push(taggedToken); - } - } -} diff --git a/src/table/persistence/QueryTranscriber/PredicateModel/ParensClose.ts b/src/table/persistence/QueryTranscriber/PredicateModel/ParensClose.ts deleted file mode 100644 index 6e8f88f64..000000000 --- a/src/table/persistence/QueryTranscriber/PredicateModel/ParensClose.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { TokenMap } from "./TokenMap"; -import IPredicate from "./IPredicate"; - -export default class ParensClose implements IPredicate { - tokenMap: TokenMap; - constructor(tokenMap: TokenMap) { - this.tokenMap = tokenMap; - } - - /** - * currently no special handling required - * - * @return {*} - * @memberof ParensClose - */ - public convertPredicateForLokiJS() { - return this; - } -} diff --git a/src/table/persistence/QueryTranscriber/PredicateModel/ParensOpen.ts b/src/table/persistence/QueryTranscriber/PredicateModel/ParensOpen.ts deleted file mode 100644 index f9932a9cd..000000000 --- a/src/table/persistence/QueryTranscriber/PredicateModel/ParensOpen.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { TokenMap } from "./TokenMap"; -import IPredicate from "./IPredicate"; - -export default class ParensOpen implements IPredicate { - tokenMap: TokenMap; - constructor(tokenMap: TokenMap) { - this.tokenMap = tokenMap; - } - - /** - * currently no special handling required - * - * @return {*} - * @memberof ParensClose - */ - public convertPredicateForLokiJS() { - return this; - } -} diff --git a/src/table/persistence/QueryTranscriber/PredicateModel/PredicateOperator.ts b/src/table/persistence/QueryTranscriber/PredicateModel/PredicateOperator.ts deleted file mode 100644 index 1c1e9d04e..000000000 --- a/src/table/persistence/QueryTranscriber/PredicateModel/PredicateOperator.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { TokenMap } from "./TokenMap"; -import IPredicate from "./IPredicate"; - -export default class PredicateOperator implements IPredicate { - tokenMap: TokenMap; - constructor(tokenMap: TokenMap) { - this.tokenMap = tokenMap; - } - - /** - * currently no special handling required - * - * @return {*} - * @memberof PredicateOperator - */ - public convertPredicateForLokiJS() { - return this; - } -} diff --git a/src/table/persistence/QueryTranscriber/PredicateModel/StringPredicate.ts b/src/table/persistence/QueryTranscriber/PredicateModel/StringPredicate.ts deleted file mode 100644 index 0fb34380d..000000000 --- a/src/table/persistence/QueryTranscriber/PredicateModel/StringPredicate.ts +++ /dev/null @@ -1,121 +0,0 @@ -import TaggedToken from "../TokenModel/TaggedToken"; -import { TokenMap } from "./TokenMap"; -import IdentifierToken from "../TokenModel/IdentifierToken"; -import ValueToken from "../TokenModel/ValueToken"; -import IPredicate from "./IPredicate"; - -export default class StringPredicate implements IPredicate { - tokenMap: TokenMap; - constructor(tokenMap: TokenMap) { - this.tokenMap = tokenMap; - } - - /** - * converts a string predicate for lokijs schema - * - * @return {*} - * @memberof StringPredicate - */ - public convertPredicateForLokiJS() { - const newTokens: TaggedToken[] = []; - - this.tokenMap.tokens.forEach((taggedToken) => { - this.pushValue(taggedToken, newTokens); - this.pushIdentifier(taggedToken, newTokens); - this.pushOperator(taggedToken, newTokens); - }); - this.tokenMap.tokens = newTokens; - - return this; - } - - /** - * Pushes the value to the string predicate - * - * @private - * @param {TaggedToken} taggedToken - * @param {TaggedToken[]} newTokens - * @memberof StringPredicate - */ - private pushValue(taggedToken: TaggedToken, newTokens: TaggedToken[]) { - if (taggedToken.type.isValue()) { - taggedToken.token = - "'" + - // We also need to convert any double apostrophes into their corresponding backslash-escaped variant - this.replaceDoubleApostrophes( - // Let's ensure that backslashes (which are valid characters in the OData space) are escaped correctly. - this.escapeReservedCharacters( - taggedToken.token.substring(1, taggedToken.token.length - 1) - )) + - "'"; - - newTokens.push(new TaggedToken(taggedToken.token, new ValueToken())); - } - } - - /** - * Ensure that the presence of a '' in the string is converted into the explicit ' (apostrophe) character. - * - * @param {string} token - * @memberof StringPredicate - * @returns {string} - */ - private replaceDoubleApostrophes(token: string) { - return token.replace(/(\'\')/g, "\\'"); - } - - /** - * Ensures that backticks (which are used to encode the string) - * - * @param {string} token - * @memberof StringPredicate - * @returns {string} - */ - private escapeReservedCharacters(token: string) { - return token.replace(/\\/g, "\\\\"); - } - - /** - * Pushes the identifier to the string predicate - * - * @private - * @param {TaggedToken} taggedToken - * @param {TaggedToken[]} newTokens - * @memberof StringPredicate - */ - private pushIdentifier(taggedToken: TaggedToken, newTokens: TaggedToken[]) { - if (taggedToken.type.isIdentifier()) { - const newToken = this.createStringIdentifierToken(taggedToken.token); - newTokens.push(newToken); - } - } - - /** - * handles the special case for "TableName" - * - * @param {string} token - * @return {*} - * @memberof StringPredicate - */ - createStringIdentifierToken(token: string) { - // asterisk is not allowed in an identifier - if (token.toLocaleLowerCase() === "**blena**") { - return new TaggedToken(`item.table`, new IdentifierToken()); - } - return new TaggedToken(`item.properties.${token}`, new IdentifierToken()); - } - - /** - * Pushes the operator to the string predicate - * - * @private - * @param {TaggedToken} taggedToken - * @param {TaggedToken[]} newTokens - * @memberof StringPredicate - */ - private pushOperator(taggedToken: TaggedToken, newTokens: TaggedToken[]) { - if (taggedToken.type.isOperator()) { - newTokens.push(taggedToken); - } - } -} diff --git a/src/table/persistence/QueryTranscriber/PredicateModel/TokenMap.ts b/src/table/persistence/QueryTranscriber/PredicateModel/TokenMap.ts deleted file mode 100644 index 10c23098f..000000000 --- a/src/table/persistence/QueryTranscriber/PredicateModel/TokenMap.ts +++ /dev/null @@ -1,15 +0,0 @@ -import TaggedToken from "../TokenModel/TaggedToken"; - -/** - * Contains a map of the predicate with tagged tokens indicating - * their role in the predicate. - * - * @export - * @class TokenMap - */ -export class TokenMap { - public tokens: TaggedToken[] = []; - constructor(tokens: TaggedToken[] = []) { - this.tokens = tokens; - } -} diff --git a/src/table/persistence/QueryTranscriber/PredicateModel/UnknownPredicate.ts b/src/table/persistence/QueryTranscriber/PredicateModel/UnknownPredicate.ts deleted file mode 100644 index dc2e305a3..000000000 --- a/src/table/persistence/QueryTranscriber/PredicateModel/UnknownPredicate.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { TokenMap } from "./TokenMap"; -import IPredicate from "./IPredicate"; - -export default class UnknownPredicate implements IPredicate { - tokenMap: TokenMap; - constructor(tokenMap: TokenMap) { - this.tokenMap = tokenMap; - } - - /** - * currently no special handling required - * - * @return {*} - * @memberof ParensClose - */ - public convertPredicateForLokiJS() { - return this; - } -} diff --git a/src/table/persistence/QueryTranscriber/QPState.ts b/src/table/persistence/QueryTranscriber/QPState.ts deleted file mode 100644 index 9ffc66488..000000000 --- a/src/table/persistence/QueryTranscriber/QPState.ts +++ /dev/null @@ -1,377 +0,0 @@ -import QueryContext from "./QueryContext"; -import IQPState from "./IQPState"; -import { QueryStateName } from "./QueryStateName"; -import { TokenMap } from "./PredicateModel/TokenMap"; -import TaggedToken from "./TokenModel/TaggedToken"; -import ParensOpenToken from "./TokenModel/ParensOpenToken"; -import ParensCloseToken from "./TokenModel/ParensCloseToken"; -import ParensClose from "./PredicateModel/ParensClose"; -import ParensOpen from "./PredicateModel/ParensOpen"; -import UnknownPredicate from "./PredicateModel/UnknownPredicate"; -import PredicateOperator from "./PredicateModel/PredicateOperator"; - -export default class QPState implements IQPState { - name: QueryStateName = QueryStateName.None; - - onProcess(context: QueryContext): QueryContext { - return context; - } - - onExit(context: QueryContext): QueryContext { - return context; - } - - /** - * Processes the first opening parens of a query - * @param context - * @returns - */ - protected processOpeningParens( - context: QueryContext, - token: string - ): QueryContext { - if (token.match(/\(/) && context.currentPos === 0) { - const taggedToken: TaggedToken = new TaggedToken( - "(", - new ParensOpenToken() - ); - context.taggedPredicates.push( - new ParensOpen(new TokenMap([taggedToken])) - ); - context.currentPos += 1; - } - return context; - } - - /** - * Processes the closing parens on a query - * @param context - * @returns - */ - protected processClosingParens(context: QueryContext): QueryContext { - if (context.originalQuery.match(/^\)/)) { - const taggedToken: TaggedToken = new TaggedToken( - ")", - new ParensCloseToken() - ); - context.taggedPredicates.push( - new ParensClose(new TokenMap([taggedToken])) - ); - context.currentPos += 1; - } - return context; - } - - protected startofNextRelevantToken( - context: QueryContext - ): [QueryContext, number] { - let pos = context.currentPos; - let token = context.originalQuery[pos]; - let relevantTokenFound = false; - while (relevantTokenFound === false && pos < context.originalQuery.length) { - token = context.originalQuery[pos]; - switch (token) { - case " ": - pos += 1; - context.currentPos += 1; - break; - default: - relevantTokenFound = true; - break; - } - } - return [context, pos]; - } - - protected endOfToken(context: QueryContext, startPos: number): number { - if ( - context.originalQuery[startPos] === "(" || - context.originalQuery[startPos] === ")" - ) { - return startPos + 1; - } - let pos = startPos + 1; - let token = context.originalQuery[pos]; - let endTokenFound = false; - while (endTokenFound === false && pos < context.originalQuery.length) { - token = context.originalQuery[pos]; - switch (token) { - case " ": - endTokenFound = true; - break; - case "(": - endTokenFound = true; - break; - case ")": - endTokenFound = true; - break; - default: - pos += 1; - break; - } - } - if (pos > context.originalQuery.length) { - return context.originalQuery.length - 1; - } - return pos; - } - - /** - * Determines the next token. - * @param context - * @returns - */ - protected getNextToken(context: QueryContext): [QueryContext, string] { - // detmermine what the next token should be. - // logic: - // from current position in query string - // determine start if token: - let tokenStart: number; - [context, tokenStart] = this.startofNextRelevantToken(context); - // determine end: - const tokenEnd = this.endOfToken(context, tokenStart); - return this.validateToken(context, tokenStart, tokenEnd); - } - - protected validateToken( - context: QueryContext, - tokenStart: number, - tokenEnd: number - ): [QueryContext, string] { - if (tokenEnd > context.originalQuery.length) { - return [context, ""]; - } - return [context, context.originalQuery.slice(tokenStart, tokenEnd)]; - } - - isPredicateOperator(token: string): boolean { - let isOperator = true; - switch (token) { - case "and": - break; - case "or": - break; - case "not": - break; - default: - isOperator = false; - } - return isOperator; - } - - /** - * checks if the token matches what should be a value - * Does not validate that the value is using correct - * Syntax! - * - * @param {string} token - * @return {*} {boolean} - * @memberof QPState - */ - isValue(token: string): boolean { - // Is the syntax for other EDM types case sensitive? - const match = token.match( - /^true$|^false$|^-?\d+|^guid'|^'|^"|^X'|^binary'|^datetime'/i - ); - if (match !== null && match!.length > 0) { - return true; - } - return false; - } - - /** - * Checks is value matches correct Guid syntax - * - * @param {string} token - * @return {boolean} - * @memberof QPState - */ - isGuidValue(token: string): boolean { - const match = token.match( - /^guid'[A-Z0-9]{8}-([A-Z0-9]{4}-){3}[A-Z0-9]{12}'/gim - ); - if (match !== null && match!.length > 0) { - return true; - } - return false; - } - - /** - * Checks if token matches binary syntax - * - * @param {string} token - * @return {*} {boolean} - * @memberof QPState - */ - isBinaryValue(token: string): boolean { - const match = token.match(/^X'|^binary'/); - if (match !== null && match!.length > 0) { - return true; - } - return false; - } - - /** - * Checks if token matches Long value syntax - * - * @param {string} token - * @return {*} {boolean} - * @memberof QPState - */ - isLongValue(token: string): boolean { - const match = token.match(/^-?\d+\.?\d*L$/); - if (match !== null && match!.length > 0) { - return true; - } - return false; - } - - /** - * Checks if token matches integer value syntax - * - * @param {string} token - * @return {*} {boolean} - * @memberof QPState - */ - isIntegerValue(token: string): boolean { - const match = token.match(/^-?\d+$/); - if (match !== null && match!.length > 0) { - return true; - } - return false; - } - - /** - * Checks if token matches string value syntax - * - * @param {string} token - * @return {*} {boolean} - * @memberof QPState - */ - isStringValue(token: string): boolean { - const match = token.match(/^\'.*\'$|^\".*\"$/); - if (match !== null && match!.length > 0) { - return true; - } - return false; - } - - /** - * Checks if token matches Long value syntax - * - * @param {string} token - * @return {*} {boolean} - * @memberof QPState - */ - isDoubleValue(token: string): boolean { - const match = token.match(/^-?\d+\.+\d+$/); - if (match !== null && match!.length > 0) { - return true; - } - return false; - } - - /** - * Checks if token matches datetime value syntax - * - * @param {string} token - * @return {*} {boolean} - * @memberof QPState - */ - isDateValue(token: string): boolean { - const match = token.match(/^datetime'/); - if (match !== null && match!.length > 0) { - return true; - } - return false; - } - - /** - * Checks if token matches boolean value syntax - * - * @param {string} token - * @return {*} {boolean} - * @memberof QPState - */ - isBooleanValue(token: string): boolean { - const match = token.match(/^true$|^false$/i); - if (match !== null && match!.length > 0) { - return true; - } - return false; - } - - /** - * Checks if token is an identifier - * - * @param {string} token - * @return {*} {boolean} - * @memberof QPState - */ - isIdentifier(token: string): boolean { - const match = token.match( - /^(?!true$)(?!false$)(?!guid')(?!binary')(?!X')(?!datetime')[_a-zA-Z]/i - ); - if (match !== null && match!.length > 0) { - return true; - } - return false; - } - - protected isOperand(token: string): boolean { - // ToDo: Validate performance vs regex or array / enum op - let isOperator = true; - switch (token) { - case "eq": - break; - case "gt": - break; - case "ge": - break; - case "lt": - break; - case "le": - break; - case "ne": - break; - default: - isOperator = false; - } - return isOperator; - } - - protected updateTaggedTokens( - context: QueryContext, - taggedToken: TaggedToken - ) { - let taggedTokens: TaggedToken[] = []; - if (context.taggedPredicates.length === context.currentPredicate + 1) { - taggedTokens = - context.taggedPredicates[context.currentPredicate].tokenMap.tokens; - } - taggedTokens.push(taggedToken); - return taggedTokens; - } - - /** - * Updates tagged predicate, will set to unknown - * PredicateType should be set correctly in the checking functions - * - * @protected - * @param {TaggedToken[]} taggedTokens - * @param {QueryContext} context - * @return {*} {QueryContext} - * @memberof QPState - */ - protected updateTaggedPredicate( - taggedTokens: TaggedToken[], - context: QueryContext, - isPredicateOperator: boolean = false - ): QueryContext { - const tokenMap: TokenMap = new TokenMap(taggedTokens); - context.taggedPredicates[context.currentPredicate] = isPredicateOperator - ? new PredicateOperator(tokenMap) - : new UnknownPredicate(tokenMap); - return context; - } -} diff --git a/src/table/persistence/QueryTranscriber/QueryContext.ts b/src/table/persistence/QueryTranscriber/QueryContext.ts deleted file mode 100644 index bf0c02c52..000000000 --- a/src/table/persistence/QueryTranscriber/QueryContext.ts +++ /dev/null @@ -1,26 +0,0 @@ -import IPredicate from "./PredicateModel/IPredicate"; -import { QueryStateName } from "./QueryStateName"; - -/** - * This object contains the state of the query - * as it undergoes transcription processing - * - * @export - * @class QueryContext - */ -export default class QueryContext { - public currentPos: number = 0; - // the original query string passed into the transcriber - public originalQuery: string = ""; - // a collection of predicates which are used in the query function - public taggedPredicates: IPredicate[] = []; - // represents the current predicate that is being processed - public currentPredicate: number = 0; - public transcribedQuery: string = ""; - public stateQueue: QueryStateName[] = []; - public isTableQuery: boolean = false; - constructor(queryString: string, isTableQuery: boolean = false) { - this.originalQuery = queryString; - this.isTableQuery = isTableQuery; - } -} diff --git a/src/table/persistence/QueryTranscriber/QueryStateName.ts b/src/table/persistence/QueryTranscriber/QueryStateName.ts deleted file mode 100644 index ce56fec49..000000000 --- a/src/table/persistence/QueryTranscriber/QueryStateName.ts +++ /dev/null @@ -1,20 +0,0 @@ -/** - * Query state names are used in state store to - * access and identify states - * - * @export - * @enum {number} - */ -export enum QueryStateName { - None, - QueryStarted, - QueryFinished, - PredicateStarted, - PredicateFinished, - ProcessIdentifier, - ProcessOperator, - ProcessValue, - ProcessPredicateOperator, - ProcessParensOpen, - ProcessParensClose -} diff --git a/src/table/persistence/QueryTranscriber/QueryTranscriber.ts b/src/table/persistence/QueryTranscriber/QueryTranscriber.ts deleted file mode 100644 index 7c81601cf..000000000 --- a/src/table/persistence/QueryTranscriber/QueryTranscriber.ts +++ /dev/null @@ -1,143 +0,0 @@ -import IQPState from "./IQPState"; -import QueryContext from "./QueryContext"; -import { QueryStateName } from "./QueryStateName"; - -/** - * Statemachine implementation for the Azurite query transcriber. - * - * @export - * @class QueryTranscriber - */ -export default class QueryTranscriber { - private queryContext: QueryContext; - private states = new Map(); - private currentState: IQPState; - private isSwitchingState = false; - - public name: string; - constructor(queryContext: QueryContext, name: string) { - this.queryContext = queryContext; - this.name = name ?? "machine"; - this.currentState = { - name: QueryStateName.None, - onProcess: (context: QueryContext) => { - return context; - }, - onExit: (context: QueryContext) => { - return context; - } - }; - } - - isCurrentState(name: QueryStateName): boolean { - return this.currentState?.name === name; - } - - /** - * Add a state to the machine. - * - * @param {string} name - * @param {IQPState} state - The state to add. - * @return {QueryTranscriber} - * @memberof LokiJsQueryTranscriber - */ - addState(name: QueryStateName, config: IQPState): QueryTranscriber { - this.states.set(name, { - name, - onProcess: config.onProcess?.bind(this.queryContext), - onExit: config.onExit?.bind(this.queryContext) - }); - - return this; - } - - /** - * Switch to the state with the given name. - * - * @param {string} name, - * @param {QueryContext} queryContext - * @return {QueryTranscriber} - * @memberof LokiJsQueryTranscriber - */ - setState(name: QueryStateName): QueryTranscriber { - if (this.states.has(name) === false) { - // This is a case which should only occur in testing - // or when adding new states. - // We do not expect to see this during run time! - throw new Error("Invalid State Name!"); - } - - if (this.isSwitchingState) { - this.queryContext.stateQueue.push(name); - return this; - } - - this.switchState(name); - - // processes state queue - // if there is a problem with state transitions, recursive call of - // setState will cause a stack overflow, which is OK: - // as otherwise we would hang the process... - while (this.queryContext.stateQueue.length > 0) { - if (this.queryContext.stateQueue.length > 0) { - const newState = this.queryContext.stateQueue.shift()!; - this.setState(newState); - } - } - this.currentState.onExit(this.queryContext); - return this; - } - - /** - * switches states by exiting last state and processing new state - * - * @private - * @param {QueryStateName} name - * @memberof QueryTranscriber - */ - private switchState(name: QueryStateName) { - this.isSwitchingState = true; - - this.queryContext = this.currentState.onExit(this.queryContext); - const state = this.states.get(name); - - this.updateState(state, name); - this.queryContext = this.currentState.onProcess(this.queryContext); - - this.isSwitchingState = false; - } - - private updateState(state: IQPState | undefined, name: QueryStateName) { - if (state !== undefined) { - this.currentState = state; - } else { - throw Error(`${this.name} does not have a state named ${name}`); - } - } - - /** - * Returns the query transcribed by the state machine. - * - * @return {*} {string} - * @memberof LokiJsQueryTranscriber - */ - getTranscribedQuery(): string { - if ( - this.queryContext === undefined || - this.queryContext.transcribedQuery === "" - ) { - throw new Error("Query failed to be transcribed!"); - } - return this.queryContext.transcribedQuery; - } - - /** - * - * - * @param {QueryStateName} name - * @memberof LokiJsQueryTranscriber - */ - setInitialState(name: QueryStateName) { - this.queryContext.stateQueue.push(name); - } -} diff --git a/src/table/persistence/QueryTranscriber/StatePredicateFinished.ts b/src/table/persistence/QueryTranscriber/StatePredicateFinished.ts deleted file mode 100644 index 0964c61fe..000000000 --- a/src/table/persistence/QueryTranscriber/StatePredicateFinished.ts +++ /dev/null @@ -1,448 +0,0 @@ -import IQPState from "./IQPState"; -import QPState from "./QPState"; -import QueryContext from "./QueryContext"; -import { QueryStateName } from "./QueryStateName"; -import GuidPredicate from "./PredicateModel/GuidPredicate"; -import BinaryPredicate from "./PredicateModel/BinaryPredicate"; -import LongPredicate from "./PredicateModel/LongPredicate"; -import DoublePredicate from "./PredicateModel/DoublePredicate"; -import IntegerPredicate from "./PredicateModel/IntegerPredicate"; -import StringPredicate from "./PredicateModel/StringPredicate"; -import DatePredicate from "./PredicateModel/DatePredicate"; -import BooleanPredicate from "./PredicateModel/BooleanPredicate"; - -/** - * contains the logic for checking a predicate when it is finished - * - * @export - * @class StatePredicateFinished - * @extends {QPState} - * @implements {IQPState} - */ -export default class StatePredicateFinished - extends QPState - implements IQPState -{ - name = QueryStateName.PredicateFinished; - - /** - * when finishing a predicate, we need to update the query type - * based on the value being queried - * - * @param {QueryContext} context - * @memberof StatePredicateFinished - */ - onProcess = (context: QueryContext) => { - let token = ""; - - // when first predicate is a single operator, our token map is empty - context = this.validatePredicate(context); - - [context, token] = this.getNextToken(context); - - context = this.handleToken(context, token); - - return context; - }; - - /** - * state transition logic - * - * @protected - * @param {QueryContext} context - * @param {string} token - * @return {*} {QueryContext} - * @memberof StatePredicateFinished - */ - protected handleToken(context: QueryContext, token: string): QueryContext { - // categorize the token - if (token === "") { - context.stateQueue.push(QueryStateName.QueryFinished); - } else if (token === "(") { - context.stateQueue.push(QueryStateName.PredicateStarted); - } else if (token === ")") { - context.stateQueue.push(QueryStateName.ProcessParensClose); - } else if (this.isPredicateOperator(token)) { - context.stateQueue.push(QueryStateName.ProcessPredicateOperator); - // will need to end current predicate and create a new predicate - } else if (this.isOperand(token)) { - // match operand (specific set) - throw new Error( - "Invalid Query, unable to process operand starting predicate!" - ); - } else if (this.isValue(token)) { - // match number (long & doubles? needed) - // match string (starts with ', or " ?) - // match guid (is exactly guid'') - context.stateQueue.push(QueryStateName.PredicateStarted); - } else if (this.isIdentifier(token)) { - // match identifier (can only start with letter) - context.stateQueue.push(QueryStateName.PredicateStarted); - } - - return context; - } - - /** - * validates the predicate using some simple logic - * ToDo: ensure correct error codes!!! - * - * @param {QueryContext} context - * @return {*} {QueryContext} - * @memberof StatePredicateFinished - */ - private validatePredicate(context: QueryContext): QueryContext { - const predicateOffset: number = this.getPredicateOffsetToCheck(context); - this.checkPredicateLength(predicateOffset, context); - this.checkSingleTerm(predicateOffset, context); - this.checkMultipleTerms(predicateOffset, context); - context = this.setPredicateType(context); - return context; - } - - private getPredicateOffsetToCheck(context: QueryContext): number { - return context.currentPredicate > 0 ? context.currentPredicate - 1 : 0; - } - - /** - * tags the predicate based on the type of value found in the - * predicate terms - * - * @param {QueryContext} context - * @return {*} {QueryContext} - * @memberof StatePredicateFinished - */ - private setPredicateType(context: QueryContext): QueryContext { - if (context.taggedPredicates[context.currentPredicate] === undefined) { - return context; - } - const taggedTokens = - context.taggedPredicates[context.currentPredicate].tokenMap.tokens; - - taggedTokens.forEach((taggedToken) => { - if (taggedToken.type.isValue()) { - context = this.ifGuidPredicate(context, taggedToken.token); - context = this.ifBinaryPredicate(context, taggedToken.token); - context = this.ifLongPredicate(context, taggedToken.token); - context = this.ifDoublePredicate(context, taggedToken.token); - context = this.ifIntegerPredicate(context, taggedToken.token); - context = this.ifStringPredicate(context, taggedToken.token); - context = this.ifDatePredicate(context, taggedToken.token); - context = this.ifBooleanPredicate(context, taggedToken.token); - } - }); - return context; - } - - /** - * tags predicate for the case of a guid predicate - * - * @param {QueryContext} context - * @param {string} tokenToCheck - * @return {*} {QueryContext} - * @memberof StatePredicateFinished - */ - private ifGuidPredicate( - context: QueryContext, - tokenToCheck: string - ): QueryContext { - if (this.isGuidValue(tokenToCheck)) { - context.taggedPredicates[context.currentPredicate] = new GuidPredicate( - context.taggedPredicates[context.currentPredicate].tokenMap - ); - return context; - } - return context; - } - - /** - * tags predicate for the case of a binary value - * - * @param {QueryContext} context - * @param {string} tokenToCheck - * @return {*} {QueryContext} - * @memberof StatePredicateFinished - */ - private ifBinaryPredicate( - context: QueryContext, - tokenToCheck: string - ): QueryContext { - if (this.isBinaryValue(tokenToCheck)) { - context.taggedPredicates[context.currentPredicate] = new BinaryPredicate( - context.taggedPredicates[context.currentPredicate].tokenMap - ); - return context; - } - return context; - } - - /** - * tags predicate for the case of a long value - * - * @param {QueryContext} context - * @param {string} tokenToCheck - * @return {*} {QueryContext} - * @memberof StatePredicateFinished - */ - private ifLongPredicate( - context: QueryContext, - tokenToCheck: string - ): QueryContext { - if (this.isLongValue(tokenToCheck)) { - context.taggedPredicates[context.currentPredicate] = new LongPredicate( - context.taggedPredicates[context.currentPredicate].tokenMap - ); - return context; - } - return context; - } - - /** - * tags predicate for the case of a double value - * - * @param {QueryContext} context - * @param {string} tokenToCheck - * @return {*} {QueryContext} - * @memberof StatePredicateFinished - */ - private ifDoublePredicate( - context: QueryContext, - tokenToCheck: string - ): QueryContext { - if (this.isDoubleValue(tokenToCheck)) { - context.taggedPredicates[context.currentPredicate] = new DoublePredicate( - context.taggedPredicates[context.currentPredicate].tokenMap - ); - return context; - } - return context; - } - - /** - * tags predicate for the case of an integer value - * - * @param {QueryContext} context - * @param {string} tokenToCheck - * @return {*} {QueryContext} - * @memberof StatePredicateFinished - */ - private ifIntegerPredicate( - context: QueryContext, - tokenToCheck: string - ): QueryContext { - if (this.isIntegerValue(tokenToCheck)) { - context.taggedPredicates[context.currentPredicate] = new IntegerPredicate( - context.taggedPredicates[context.currentPredicate].tokenMap - ); - return context; - } - return context; - } - - /** - * tags predicate for the case of a string value - * - * @param {QueryContext} context - * @param {string} tokenToCheck - * @return {*} {QueryContext} - * @memberof StatePredicateFinished - */ - private ifStringPredicate( - context: QueryContext, - tokenToCheck: string - ): QueryContext { - if (this.isStringValue(tokenToCheck)) { - context.taggedPredicates[context.currentPredicate] = new StringPredicate( - context.taggedPredicates[context.currentPredicate].tokenMap - ); - return context; - } - return context; - } - - /** - * tags predicate for the case of a date value - * - * @param {QueryContext} context - * @param {string} tokenToCheck - * @return {*} {QueryContext} - * @memberof StatePredicateFinished - */ - private ifDatePredicate( - context: QueryContext, - tokenToCheck: string - ): QueryContext { - if (this.isDateValue(tokenToCheck)) { - context.taggedPredicates[context.currentPredicate] = new DatePredicate( - context.taggedPredicates[context.currentPredicate].tokenMap - ); - return context; - } - return context; - } - - /** - * tags predicate for the case of a boolean value - * - * @param {QueryContext} context - * @param {string} tokenToCheck - * @return {*} {QueryContext} - * @memberof StatePredicateFinished - */ - private ifBooleanPredicate( - context: QueryContext, - tokenToCheck: string - ): QueryContext { - if (this.isBooleanValue(tokenToCheck)) { - context.taggedPredicates[context.currentPredicate] = new BooleanPredicate( - context.taggedPredicates[context.currentPredicate].tokenMap - ); - return context; - } - return context; - } - - /** - * optional post processing, here we can add logging - * or additional validation etc - * - * @param {QueryContext} context - * @memberof StateProcessValue - */ - onExit = (context: QueryContext) => { - // ToDo: validate current predicate early or during transcribing? - // might even be able to remove the onExit hooks. - return context; - }; - - /** - * checks the number of terms in a predicate based on the state - * machines own logic (1 or 3 terms) - * - * @private - * @param {QueryContext} context - * @memberof StatePredicateFinished - */ - private checkPredicateLength(offset: number, context: QueryContext) { - if ( - context.taggedPredicates[offset].tokenMap.tokens.length !== 1 && - context.taggedPredicates[offset].tokenMap.tokens.length !== 3 - ) { - // we must have form "x operator b", or a single value - throw new Error("Invalid Query"); - } - } - - /** - * checks a single term - * - * @private - * @param {QueryContext} context - * @return {*} - * @memberof StatePredicateFinished - */ - private checkSingleTerm(offset: number, context: QueryContext) { - if (context.taggedPredicates[offset].tokenMap.tokens.length === 1) { - // we must have a parens or a single value - // ToDo: validate this logic has parity with Azure service - // This checks that a single tagged token is of a type allowed to be - // on it's own in a predicate; - const predicateType = - context.taggedPredicates[offset].tokenMap.tokens[0].type; - const predicateValue = - context.taggedPredicates[offset].tokenMap.tokens[0].token; - if ( - predicateType.isParensOpen() || - predicateType.isParensClose() || - predicateType.isOperator() || - (predicateType.isValue() && this.isBooleanValue(predicateValue)) - ) { - return; - } - throw new Error("Invalid Query"); - } - } - - /** - * checks multiple terms - * - * @private - * @param {QueryContext} context - * @memberof StatePredicateFinished - */ - private checkMultipleTerms(offset: number, context: QueryContext) { - if (context.taggedPredicates[offset].tokenMap.tokens.length === 3) { - // we must have form "x operator b" - this.checkNumberOfValues(offset, context); - this.checkNumberOfOperators(offset, context); - this.checkNumberOfIdentifiers(offset, context); - } - } - - /** - * Checks that there is only 1 value in the predicate - * - * @private - * @param {number} offset - * @param {QueryContext} context - * @memberof StatePredicateFinished - */ - private checkNumberOfValues(offset: number, context: QueryContext) { - let valueCount = 0; - context.taggedPredicates[offset].tokenMap.tokens.forEach((taggedToken) => { - if (taggedToken.type.isValue()) { - valueCount++; - } - }); - this.checkPredicateTermCount(valueCount); - } - - /** - * Checks that there is only 1 identifier in the predicate - * - * @private - * @param {number} offset - * @param {QueryContext} context - * @memberof StatePredicateFinished - */ - private checkNumberOfIdentifiers(offset: number, context: QueryContext) { - let valueCount = 0; - context.taggedPredicates[offset].tokenMap.tokens.forEach((taggedToken) => { - if (taggedToken.type.isIdentifier()) { - valueCount++; - } - }); - this.checkPredicateTermCount(valueCount); - } - - /** - * Checks that there is only 1 operator in the predicate - * - * @private - * @param {number} offset - * @param {QueryContext} context - * @memberof StatePredicateFinished - */ - private checkNumberOfOperators(offset: number, context: QueryContext) { - let valueCount = 0; - context.taggedPredicates[offset].tokenMap.tokens.forEach((taggedToken) => { - if (taggedToken.type.isOperator()) { - valueCount++; - } - }); - this.checkPredicateTermCount(valueCount); - } - - /** - * checks that there is only 1 of this type of term - * - * @private - * @param {number} count - * @memberof StatePredicateFinished - */ - private checkPredicateTermCount(count: number) { - if (count !== 1) { - throw new Error("Invalid number of terms in query!"); - } - } -} diff --git a/src/table/persistence/QueryTranscriber/StatePredicateStarted.ts b/src/table/persistence/QueryTranscriber/StatePredicateStarted.ts deleted file mode 100644 index 827d71ada..000000000 --- a/src/table/persistence/QueryTranscriber/StatePredicateStarted.ts +++ /dev/null @@ -1,100 +0,0 @@ -import IQPState from "./IQPState"; -import QPState from "./QPState"; -import QueryContext from "./QueryContext"; -import { QueryStateName } from "./QueryStateName"; - -export default class StatePredicateStarted extends QPState implements IQPState { - name = QueryStateName.PredicateStarted; - - /** - * Starts the processing of a predicate clause - * these ar the units in which we need to maintain - * backwards schema compatibility - * - * @param {QueryContext} context - * @memberof StatePredicateStarted - */ - onProcess = (context: QueryContext) => { - let token = ""; - [context, token] = this.getNextToken(context); - context = this.handleToken(context, token); - - return context; - }; - - /** - * state transition logic - * - * @protected - * @param {QueryContext} context - * @param {string} token - * @return {*} {QueryContext} - * @memberof StatePredicateStarted - */ - protected handleToken(context: QueryContext, token: string): QueryContext { - // categorize the token - if (token === "") { - context.stateQueue.push(QueryStateName.PredicateFinished); - } else if (token === "(") { - context.stateQueue.push(QueryStateName.ProcessParensOpen); - } else if (token === ")") { - context.stateQueue.push(QueryStateName.ProcessParensClose); - } else if (this.isPredicateOperator(token)) { - this.presdicateStartingOperator(context); - } else if (this.isOperand(token)) { - // match operand (specific set) - throw new Error( - "Invalid Query, cannot start predicate with operator! " + token - ); - } else if (this.isValue(token)) { - // match number (long & doubles? needed) - // match string (starts with ', or " ?) - // match guid (is exactly guid'') - context.stateQueue.push(QueryStateName.ProcessValue); - } else if (this.isIdentifier(token)) { - // match identifier (can only start with letter) - context.stateQueue.push(QueryStateName.ProcessIdentifier); - } - - return context; - } - - /** - * optional post processing, here we can add logging - * or additional validation etc - * - * @param {QueryContext} context - * @memberof StateProcessValue - */ - onExit = (context: QueryContext) => { - return context; - }; - - /** - * There are 2 cases that will get us here: - * 1. a filter without parens - * - we will have processed a predicate - * - we should finish the predicate - * 2. a not operator on it's own - * - we will not have processed a value or identifier - * - we must process the operator - * - will need to end current predicate and create a new predicate - * - * @private - * @param {QueryContext} context - * @memberof StatePredicateStarted - */ - private presdicateStartingOperator(context: QueryContext) { - if ( - context.currentPos === 0 || - context.taggedPredicates[context.currentPredicate].tokenMap.tokens === - undefined || - context.taggedPredicates[context.currentPredicate].tokenMap.tokens - .length === 0 - ) { - context.stateQueue.push(QueryStateName.ProcessOperator); - } else { - context.stateQueue.push(QueryStateName.PredicateFinished); - } - } -} diff --git a/src/table/persistence/QueryTranscriber/StateProcessIdentifier.ts b/src/table/persistence/QueryTranscriber/StateProcessIdentifier.ts deleted file mode 100644 index 9b7f3712d..000000000 --- a/src/table/persistence/QueryTranscriber/StateProcessIdentifier.ts +++ /dev/null @@ -1,158 +0,0 @@ -import IQPState from "./IQPState"; -import QPState from "./QPState"; -import QueryContext from "./QueryContext"; -import { QueryStateName } from "./QueryStateName"; -import TaggedToken from "./TokenModel/TaggedToken"; -import IdentifierToken from "./TokenModel/IdentifierToken"; -import UnknownPredicate from "./PredicateModel/UnknownPredicate"; -import { TokenMap } from "./PredicateModel/TokenMap"; - -/** - * contains the logic to handle an identifier - * - * @export - * @class StateProcessIdentifier - * @extends {QPState} - * @implements {IQPState} - */ -export default class StateProcessIdentifier - extends QPState - implements IQPState -{ - name = QueryStateName.ProcessIdentifier; - - /** - * process current token which is an identifier - * - * @param {QueryContext} context - * @memberof StateProcessIdentifier - */ - onProcess = (context: QueryContext) => { - let token = ""; - [context, token] = this.getNextToken(context); - - context = this.storeTaggedTokens(context, token); - - [context, token] = this.getNextToken(context); - context = this.handleToken(context, token); - - return context; - }; - - /** - * state transition logic - * - * @protected - * @param {QueryContext} context - * @param {string} token - * @return {*} {QueryContext} - * @memberof StateProcessIdentifier - */ - protected handleToken(context: QueryContext, token: string): QueryContext { - // categorize the token - if (token === "") { - context.stateQueue.push(QueryStateName.PredicateFinished); - } else if (token === "(") { - context.stateQueue.push(QueryStateName.PredicateStarted); - } else if (token === ")") { - context.stateQueue.push(QueryStateName.PredicateFinished); - } else if (this.isPredicateOperator(token)) { - if (this.name === QueryStateName.PredicateFinished) { - context.stateQueue.push(QueryStateName.ProcessPredicateOperator); - } else { - context.stateQueue.push(QueryStateName.PredicateFinished); - } - // will need to end current predicate and create a new predicate - } else if (this.isOperand(token)) { - // match operand (specific set) - context.stateQueue.push(QueryStateName.ProcessOperator); - } else if (this.isValue(token)) { - // match number (long & doubles? needed) - // match string (starts with ', or " ?) - // match guid (is exactly guid'') - context.stateQueue.push(QueryStateName.ProcessValue); - } else if (this.isIdentifier(token)) { - // match identifier (can only start with letter) - context.stateQueue.push(QueryStateName.ProcessIdentifier); - } - - return context; - } - - /** - * optional post processing, here we can add logging - * or additional validation etc - * - * @param {QueryContext} context - * @memberof StateProcessValue - */ - onExit = (context: QueryContext) => { - return context; - }; - - /** - * stores the token as an identifier - * - * @private - * @param {QueryContext} context - * @param {string} token - * @return {*} {QueryContext} - * @memberof StateProcessIdentifier - */ - private storeTaggedTokens( - context: QueryContext, - token: string - ): QueryContext { - token = this.updateTableIdentifier(context, token); - - const taggedToken: TaggedToken = new TaggedToken( - token, - new IdentifierToken() - ); - - context = this.startNewPredicate(context); - - const taggedTokens = this.updateTaggedTokens(context, taggedToken); - context = this.updateTaggedPredicate(taggedTokens, context); - - context.currentPos += token.length; - - return context; - } - - private updateTableIdentifier(context: QueryContext, token: string) { - if (context.isTableQuery && token.toLowerCase() === "tablename") { - token = "**blena**"; - } - return token; - } - - /** - * This determines if we need to start a new predicate clause - * - * @private - * @param {QueryContext} context - * @return {*} {QueryContext} - * @memberof StateProcessIdentifier - */ - private startNewPredicate(context: QueryContext): QueryContext { - if ( - context.taggedPredicates[context.currentPredicate] !== undefined && - context.taggedPredicates[context.currentPredicate].tokenMap.tokens - .length !== 0 && - (context.taggedPredicates[ - context.currentPredicate - ].tokenMap.tokens[0].type.isParensOpen() || - context.taggedPredicates[ - context.currentPredicate - ].tokenMap.tokens[0].type.isParensClose() || - context.taggedPredicates[ - context.currentPredicate - ].tokenMap.tokens[0].type.isOperator()) - ) { - context.taggedPredicates.push(new UnknownPredicate(new TokenMap([]))); - context.currentPredicate += 1; - } - return context; - } -} diff --git a/src/table/persistence/QueryTranscriber/StateProcessOperator.ts b/src/table/persistence/QueryTranscriber/StateProcessOperator.ts deleted file mode 100644 index fcc0079af..000000000 --- a/src/table/persistence/QueryTranscriber/StateProcessOperator.ts +++ /dev/null @@ -1,151 +0,0 @@ -import IQPState from "./IQPState"; -import QPState from "./QPState"; -import QueryContext from "./QueryContext"; -import { QueryStateName } from "./QueryStateName"; -import TaggedToken from "./TokenModel/TaggedToken"; -import OperatorToken from "./TokenModel/OperatorToken"; - -/** - * contains logic to handle operators - * - * @export - * @class StateProcessOperator - * @extends {QPState} - * @implements {IQPState} - */ -export default class StateProcessOperator extends QPState implements IQPState { - name = QueryStateName.ProcessOperator; - - /** - * process current query token which is operator - * - * @param {QueryContext} context - * @memberof StateProcessOperator - */ - onProcess = (context: QueryContext) => { - let token = ""; - [context, token] = this.getNextToken(context); - const originalTokenLength = token.length; - token = this.convertOperatorToken(token); - context = this.storeTaggedTokens(context, token, originalTokenLength); - - [context, token] = this.getNextToken(context); - context = this.handleToken(context, token); - - return context; - }; - - /** - * state transition logic - * - * @protected - * @param {QueryContext} context - * @param {string} token - * @return {*} {QueryContext} - * @memberof StateProcessOperator - */ - protected handleToken(context: QueryContext, token: string): QueryContext { - // categorize the token - if (token === "") { - context.stateQueue.push(QueryStateName.PredicateFinished); - } else if (token === "(") { - context.stateQueue.push(QueryStateName.PredicateStarted); - } else if (token === ")") { - context.stateQueue.push(QueryStateName.PredicateFinished); - } else if (this.isPredicateOperator(token)) { - if (this.name === QueryStateName.PredicateFinished) { - context.stateQueue.push(QueryStateName.ProcessPredicateOperator); - } else { - context.stateQueue.push(QueryStateName.PredicateFinished); - } - // will need to end current predicate and create a new predicate - } else if (this.isOperand(token)) { - // match operand (specific set) - context.stateQueue.push(QueryStateName.ProcessOperator); - } else if (this.isValue(token)) { - // match number (long & doubles? needed) - // match string (starts with ', or " ?) - // match guid (is exactly guid'') - context.stateQueue.push(QueryStateName.ProcessValue); - } else if (this.isIdentifier(token)) { - // match identifier (can only start with letter) - context.stateQueue.push(QueryStateName.ProcessIdentifier); - } - - return context; - } - - /** - * optional post processing, here we can add logging - * or additional validation etc - * - * @param {QueryContext} context - * @memberof StateProcessValue - */ - onExit = (context: QueryContext) => { - return context; - }; - - /** - * Converts a token from query request to a type used in persistence - * layer query function. - * - * @private - * @static - * @param {string} token - * @return {*} {string} - * @memberof LokiTableMetadataStore - */ - private convertOperatorToken(token: string): string { - switch (token) { - case "eq": - return "==="; - case "gt": - return ">"; - case "ge": - return ">="; - case "lt": - return "<"; - case "le": - return "<="; - case "ne": - return "!=="; - case "and": - return "&&"; - case "or": - return "||"; - case "not": - return "!"; - default: - return token; - } - } - - /** - * stores and tags the token as an operator - * - * @private - * @param {QueryContext} context - * @param {string} token - * @param {number} originalTokenLength - * @return {*} {QueryContext} - * @memberof StateProcessOperator - */ - private storeTaggedTokens( - context: QueryContext, - token: string, - originalTokenLength: number - ): QueryContext { - const taggedToken: TaggedToken = new TaggedToken( - token, - new OperatorToken() - ); - - const taggedTokens = this.updateTaggedTokens(context, taggedToken); - context = this.updateTaggedPredicate(taggedTokens, context); - - context.currentPos += originalTokenLength; - - return context; - } -} diff --git a/src/table/persistence/QueryTranscriber/StateProcessParensClose.ts b/src/table/persistence/QueryTranscriber/StateProcessParensClose.ts deleted file mode 100644 index 9545a43df..000000000 --- a/src/table/persistence/QueryTranscriber/StateProcessParensClose.ts +++ /dev/null @@ -1,92 +0,0 @@ -import IQPState from "./IQPState"; -import QPState from "./QPState"; -import QueryContext from "./QueryContext"; -import { QueryStateName } from "./QueryStateName"; -import TaggedToken from "./TokenModel/TaggedToken"; -import { TokenMap } from "./PredicateModel/TokenMap"; -import ParensCloseToken from "./TokenModel/ParensCloseToken"; -import ParensClose from "./PredicateModel/ParensClose"; - -/** - * contains the logic to handle parens close - * - * @export - * @class StateProcessParensClose - * @extends {QPState} - * @implements {IQPState} - */ -export default class StateProcessParensClose - extends QPState - implements IQPState -{ - name = QueryStateName.ProcessParensClose; - - /** - * process current query token which is operator - * - * @param {QueryContext} context - * @memberof StateProcessOperator - */ - onProcess = (context: QueryContext) => { - let token = ""; - [context, token] = this.getNextToken(context); - - context = this.storeTaggedTokens(context, token); - - [context, token] = this.getNextToken(context); - context = this.handleToken(context, token); - - return context; - }; - - /** - * state transition logic - * - * @protected - * @param {QueryContext} context - * @param {string} token - * @return {*} {QueryContext} - * @memberof StateProcessParensClose - */ - protected handleToken(context: QueryContext, token: string): QueryContext { - // Parens Close will always end the predicate - context.stateQueue.push(QueryStateName.PredicateFinished); - return context; - } - - /** - * optional post processing, here we can add logging - * or additional validation etc - * - * @param {QueryContext} context - * @memberof StateProcessValue - */ - onExit = (context: QueryContext) => { - return context; - }; - - /** - * Stores the tokens - * - * @private - * @param {QueryContext} context - * @param {string} token - * @param {number} originalTokenLength - * @return {*} {QueryContext} - * @memberof StateProcessParensClose - */ - private storeTaggedTokens( - context: QueryContext, - token: string - ): QueryContext { - const taggedParensToken: TaggedToken = new TaggedToken( - token, - new ParensCloseToken() - ); - const parensTokenMap: TokenMap = new TokenMap([taggedParensToken]); - context.taggedPredicates.push(new ParensClose(parensTokenMap)); - context.currentPredicate += 1; - context.currentPos += token.length; - return context; - } -} diff --git a/src/table/persistence/QueryTranscriber/StateProcessParensOpen.ts b/src/table/persistence/QueryTranscriber/StateProcessParensOpen.ts deleted file mode 100644 index 2503b085c..000000000 --- a/src/table/persistence/QueryTranscriber/StateProcessParensOpen.ts +++ /dev/null @@ -1,95 +0,0 @@ -import IQPState from "./IQPState"; -import QPState from "./QPState"; -import QueryContext from "./QueryContext"; -import { QueryStateName } from "./QueryStateName"; -import TaggedToken from "./TokenModel/TaggedToken"; -import { TokenMap } from "./PredicateModel/TokenMap"; -import ParensOpenToken from "./TokenModel/ParensOpenToken"; -import ParensOpen from "./PredicateModel/ParensOpen"; - -/** - * contains the logic for parens open - * - * @export - * @class StateProcessParensOpen - * @extends {QPState} - * @implements {IQPState} - */ -export default class StateProcessParensOpen - extends QPState - implements IQPState -{ - name = QueryStateName.ProcessParensOpen; - - /** - * process current query token which is operator - * - * @param {QueryContext} context - * @memberof StateProcessOperator - */ - onProcess = (context: QueryContext) => { - let token = ""; - [context, token] = this.getNextToken(context); - - context = this.storeTaggedTokens(context, token); - - [context, token] = this.getNextToken(context); - context = this.handleToken(context, token); - return context; - }; - - /** - * state transition logic - * - * @protected - * @param {QueryContext} context - * @param {string} token - * @return {*} {QueryContext} - * @memberof StateProcessParensOpen - */ - protected handleToken(context: QueryContext, token: string): QueryContext { - // Parens Open will always start a predicate - context.stateQueue.push(QueryStateName.PredicateStarted); - - return context; - } - - /** - * optional post processing, here we can add logging - * or additional validation etc - * - * @param {QueryContext} context - * @memberof StateProcessValue - */ - onExit = (context: QueryContext) => { - return context; - }; - - /** - * Stores the tokens - * - * @private - * @param {QueryContext} context - * @param {string} token - * @return {*} {QueryContext} - * @memberof StateProcessParensOpen - */ - private storeTaggedTokens( - context: QueryContext, - token: string - ): QueryContext { - // predicate operator should be stored singly - - const taggedToken: TaggedToken = new TaggedToken( - token, - new ParensOpenToken() - ); - - context.taggedPredicates.push(new ParensOpen(new TokenMap([taggedToken]))); - context.currentPredicate += 1; - - context.currentPos += 1; // increment for parens - - return context; - } -} diff --git a/src/table/persistence/QueryTranscriber/StateProcessPredicateOperator.ts b/src/table/persistence/QueryTranscriber/StateProcessPredicateOperator.ts deleted file mode 100644 index ba0ef29a6..000000000 --- a/src/table/persistence/QueryTranscriber/StateProcessPredicateOperator.ts +++ /dev/null @@ -1,175 +0,0 @@ -import IQPState from "./IQPState"; -import QPState from "./QPState"; -import QueryContext from "./QueryContext"; -import { QueryStateName } from "./QueryStateName"; -import TaggedToken from "./TokenModel/TaggedToken"; -import OperatorToken from "./TokenModel/OperatorToken"; -import UnknownPredicate from "./PredicateModel/UnknownPredicate"; -import { TokenMap } from "./PredicateModel/TokenMap"; -import PredicateOperator from "./PredicateModel/PredicateOperator"; - -/** - * contains the logic for handling operators between predicates - * - * @export - * @class StateProcessPredicateOperator - * @extends {QPState} - * @implements {IQPState} - */ -export default class StateProcessPredicateOperator - extends QPState - implements IQPState -{ - name = QueryStateName.ProcessOperator; - - /** - * process current query token which is operator - * - * @param {QueryContext} context - * @memberof StateProcessOperator - */ - onProcess = (context: QueryContext) => { - let token = ""; - [context, token] = this.getNextToken(context); - const originalTokenLength = token.length; - token = this.convertOperatorToken(token); - context = this.storeTaggedTokens(context, token, originalTokenLength); - - [context, token] = this.getNextToken(context); - context = this.handleToken(context, token); - return context; - }; - - /** - * contains state transition logic - * - * @protected - * @param {QueryContext} context - * @param {string} token - * @return {*} {QueryContext} - * @memberof StateProcessPredicateOperator - */ - protected handleToken(context: QueryContext, token: string): QueryContext { - // with a predicate operator we always finish the last predicate and start another - - context.stateQueue.push(QueryStateName.PredicateFinished); - - return context; - } - - /** - * optional post processing, here we can add logging - * or additional validation etc - * - * @param {QueryContext} context - * @memberof StateProcessValue - */ - onExit = (context: QueryContext) => { - return context; - }; - - /** - * Converts a token from query request to a type used in persistence - * layer query function. - * - * @private - * @static - * @param {string} token - * @return {*} {string} - * @memberof LokiTableMetadataStore - */ - private convertOperatorToken(token: string): string { - switch (token) { - case "and": - return "&&"; - case "or": - return "||"; - case "not": - return "!"; - default: - return token; - } - } - - /** - * Stores the tokens - * - * @private - * @param {QueryContext} context - * @param {string} token - * @param {number} originalTokenLength - * @return {*} {QueryContext} - * @memberof StateProcessPredicateOperator - */ - private storeTaggedTokens( - context: QueryContext, - token: string, - originalTokenLength: number - ): QueryContext { - // predicate operator should be stored singly - - const taggedToken: TaggedToken = new TaggedToken( - token, - new OperatorToken() - ); - - context.taggedPredicates.push( - new PredicateOperator(new TokenMap([taggedToken])) - ); - context.currentPredicate += 1; - - context.currentPos += originalTokenLength; - - return context; - } - - /** - * Starts a new predicate in case we are working without parens - * - * @param {QueryContext} context - * @return {*} {QueryContext} - * @memberof StateProcessPredicateOperator - */ - incrementPredicateWithoutParens(context: QueryContext): QueryContext { - if ( - context.taggedPredicates[this.getCorrectPredicate(context)].tokenMap - .tokens.length === 3 - ) { - context.currentPredicate += 1; - context.taggedPredicates.push(new UnknownPredicate(new TokenMap([]))); - return context; - } - this.checkNumberOfTokens(context); - return context; - } - - /** - * Get's the correct predic ate number, depending on if we have parens or not - * - * @param {QueryContext} context - * @return {*} - * @memberof StateProcessPredicateOperator - */ - getCorrectPredicate(context: QueryContext) { - if (context.taggedPredicates[context.currentPredicate] === undefined) { - return context.currentPredicate - 1; // why is this 2? - } else { - return context.currentPredicate; - } - } - - /** - * Ensures that predicate is valid based on number of tokens - * - * @param {QueryContext} context - * @memberof StateProcessPredicateOperator - */ - checkNumberOfTokens(context: QueryContext) { - if ( - context.taggedPredicates[this.getCorrectPredicate(context)].tokenMap - .tokens.length !== 1 - ) { - throw new Error("Invalid number of tokens in predicate."); - } - } -} diff --git a/src/table/persistence/QueryTranscriber/StateProcessValue.ts b/src/table/persistence/QueryTranscriber/StateProcessValue.ts deleted file mode 100644 index 943ee4590..000000000 --- a/src/table/persistence/QueryTranscriber/StateProcessValue.ts +++ /dev/null @@ -1,200 +0,0 @@ -import IQPState from "./IQPState"; -import { TokenMap } from "./PredicateModel/TokenMap"; -import UnknownPredicate from "./PredicateModel/UnknownPredicate"; -import QPState from "./QPState"; -import QueryContext from "./QueryContext"; -import { QueryStateName } from "./QueryStateName"; -import TaggedToken from "./TokenModel/TaggedToken"; -import ValueToken from "./TokenModel/ValueToken"; - -/** - * contains the logic for processing values - * - * @export - * @class StateProcessValue - * @extends {QPState} - * @implements {IQPState} - */ -export default class StateProcessValue extends QPState implements IQPState { - name = QueryStateName.ProcessValue; - - /** - * processes the current token which is a value - * - * @param {QueryContext} context - * @memberof StateProcessValue - */ - onProcess = (context: QueryContext) => { - let token = ""; - [context, token] = this.getNextToken(context); - - context = this.storeTaggedTokens(context, token); - - [context, token] = this.getNextToken(context); - context = this.handleToken(context, token); - - return context; - }; - - /** - * Determines the next token. - * Overriden for the case of value processing - * due to strings containing whitespace - * @param context - * @returns - */ - protected override getNextToken( - context: QueryContext - ): [QueryContext, string] { - let tokenStart: number; - [context, tokenStart] = this.startofNextRelevantToken(context); - const tokenEnd = this.handleStringValue(context, tokenStart); - return this.validateToken(context, tokenStart, tokenEnd); - } - - /** - * extract a string value - * - * @private - * @param {QueryContext} context - * @param {number} tokenStart - * @return {*} - * @memberof StateProcessValue - */ - private handleStringValue(context: QueryContext, tokenStart: number) { - // need to account for apostrophe escaping - // http://docs.oasis-open.org/odata/odata/v4.0/errata03/os/complete/part2-url-conventions/odata-v4.0-errata03-os-part2-url-conventions-complete.html#ABNF - // OData the ABNF rules explicitly state whether the percent-encoded representation is treated identical to the plain literal representation. - // This is done to make the input strings in the ABNF test cases more readable. - // One of these rules is that single quotes within string literals are represented as two consecutive single quotes. - // Example 3: valid OData URLs: - // http://host/service/People('O''Neil') - // http://host/service/People(%27O%27%27Neil%27) - // http://host/service/People%28%27O%27%27Neil%27%29 - // http://host/service/Categories('Smartphone%2FTablet') - if (context.originalQuery[tokenStart] === "'") { - // if we have a string, we need to check for double appostrophe each time we find a valid end - let posApostrophe = context.originalQuery.indexOf("'", tokenStart + 1); - - // Why minus 2 : becuase there must be enough room for 3 apostrophe otherwise - // the syntax would be invalid. - while (posApostrophe < context.originalQuery.length - 2) { - const nextChar = context.originalQuery.charAt(posApostrophe + 1); - if (nextChar === "'") { - // double apostrophe used as litteral ' - posApostrophe += 1; - } else { - break; - } - posApostrophe = context.originalQuery.indexOf("'", posApostrophe + 1); - } - - return posApostrophe + 1; - } - return this.endOfToken(context, tokenStart); - } - - /** - * state transition logic - * - * @protected - * @param {QueryContext} context - * @param {string} token - * @return {*} {QueryContext} - * @memberof StateProcessValue - */ - protected handleToken(context: QueryContext, token: string): QueryContext { - // categorize the token - if (token === "") { - context.stateQueue.push(QueryStateName.PredicateFinished); - } else if (token === "(") { - context.stateQueue.push(QueryStateName.PredicateStarted); - } else if (token === ")") { - context.stateQueue.push(QueryStateName.PredicateFinished); - } else if (this.isPredicateOperator(token)) { - if (this.name === QueryStateName.PredicateFinished) { - context.stateQueue.push(QueryStateName.ProcessPredicateOperator); - } else { - context.stateQueue.push(QueryStateName.PredicateFinished); - } - // will need to end current predicate and create a new predicate - } else if (this.isOperand(token)) { - // match operand (specific set) - context.stateQueue.push(QueryStateName.ProcessOperator); - } else if (this.isValue(token)) { - // match number (long & doubles? needed) - // match string (starts with ', or " ?) - // match guid (is exactly guid'') - context.stateQueue.push(QueryStateName.ProcessValue); - } else if (this.isIdentifier(token)) { - // match identifier (can only start with letter) - context.stateQueue.push(QueryStateName.ProcessIdentifier); - } - - return context; - } - - /** - * optional post processing, here we can add logging - * or additional validation etc - * - * @param {QueryContext} context - * @memberof StateProcessValue - */ - onExit = (context: QueryContext) => { - return context; - }; - - /** - * stores the token as value - * - * @private - * @param {QueryContext} context - * @param {string} token - * @return {*} {QueryContext} - * @memberof StateProcessValue - */ - private storeTaggedTokens( - context: QueryContext, - token: string - ): QueryContext { - context = this.startNewPredicate(context); - - const taggedToken: TaggedToken = new TaggedToken(token, new ValueToken()); - - const taggedTokens = this.updateTaggedTokens(context, taggedToken); - context = this.updateTaggedPredicate(taggedTokens, context); - - context.currentPos += token.length; - - return context; - } - - /** - * determines if we need to start a new predicate - * - * @param {QueryContext} context - * @return {*} {QueryContext} - * @memberof StateProcessValue - */ - startNewPredicate(context: QueryContext): QueryContext { - if ( - context.taggedPredicates[context.currentPredicate] !== undefined && - context.taggedPredicates[context.currentPredicate].tokenMap.tokens - .length !== 0 && - (context.taggedPredicates[ - context.currentPredicate - ].tokenMap.tokens[0].type.isParensOpen() || - context.taggedPredicates[ - context.currentPredicate - ].tokenMap.tokens[0].type.isParensClose() || - context.taggedPredicates[ - context.currentPredicate - ].tokenMap.tokens[0].type.isOperator()) - ) { - context.taggedPredicates.push(new UnknownPredicate(new TokenMap([]))); - context.currentPredicate += 1; - } - return context; - } -} diff --git a/src/table/persistence/QueryTranscriber/StateQueryFinished.ts b/src/table/persistence/QueryTranscriber/StateQueryFinished.ts deleted file mode 100644 index 7f70acda8..000000000 --- a/src/table/persistence/QueryTranscriber/StateQueryFinished.ts +++ /dev/null @@ -1,54 +0,0 @@ -import IQPState from "./IQPState"; -import QueryContext from "./QueryContext"; -import { QueryStateName } from "./QueryStateName"; - -/** - * state to complete the transcribing of a query - * - * @export - * @class StateQueryFinished - * @implements {IQPState} - */ -export default class StateQueryFinished implements IQPState { - name = QueryStateName.QueryFinished; - - /** - * completes query transcribing - * - * @memberof StateQueryFinished - */ - onProcess = (context: QueryContext) => { - // first setup the query output function - context.transcribedQuery = "return ("; - // add tagged predicates to the query output, then close the query function - // this is where we add support for backwards compatability in the schema - // and do conversions for special types etc and their DB schema representation - for (const taggedPredicate of context.taggedPredicates) { - let predicate = ""; - if (taggedPredicate !== undefined) { - const convertedPredicate = taggedPredicate.convertPredicateForLokiJS(); - for (const taggedPredicateToken of convertedPredicate.tokenMap.tokens) { - predicate += " "; - predicate += taggedPredicateToken.token; - } - } - - context.transcribedQuery += predicate; - } - // Close off query function: - context.transcribedQuery += " )"; - return context; - }; - - /** - * optional post processing, here we can add logging - * or additional validation etc - * - * @param {QueryContext} context - * @memberof StateProcessValue - */ - onExit = (context: QueryContext) => { - // ToDo: Log converted query? - return context; - }; -} diff --git a/src/table/persistence/QueryTranscriber/StateQueryStarted.ts b/src/table/persistence/QueryTranscriber/StateQueryStarted.ts deleted file mode 100644 index 6b5b81199..000000000 --- a/src/table/persistence/QueryTranscriber/StateQueryStarted.ts +++ /dev/null @@ -1,74 +0,0 @@ -import IQPState from "./IQPState"; -import QPState from "./QPState"; -import QueryContext from "./QueryContext"; -import { QueryStateName } from "./QueryStateName"; - -/** - * This is the first state of the query processing - * - * @export - * @class StateQueryStarted - * @extends {QPState} - * @implements {IQPState} - */ -export default class StateQueryStarted extends QPState implements IQPState { - name = QueryStateName.QueryStarted; - /** - * start the processing and state machine - * - * @memberof StateQueryStarted - */ - onProcess = (context: QueryContext) => { - let token = ""; - [context, token] = this.getNextToken(context); - context = this.handleToken(context, token); - - return context; - }; - - /** - * State transition logic - * - * @protected - * @param {QueryContext} context - * @param {string} token - * @return {*} {QueryContext} - * @memberof StateQueryStarted - */ - protected handleToken(context: QueryContext, token: string): QueryContext { - // categorize the token - if (token === "") { - context.stateQueue.push(QueryStateName.QueryFinished); - } else if (token === "(") { - context.stateQueue.push(QueryStateName.PredicateStarted); - } else if (token === ")") { - throw new Error("Invalid Query, starting with parens close!"); - } else if (this.isPredicateOperator(token)) { - context.stateQueue.push(QueryStateName.PredicateStarted); - } else if (this.isOperand(token)) { - // match operand (specific set) - throw new Error("Invalid Query, starting with operand!"); - } else if (this.isValue(token)) { - // match number (long & doubles? needed) - // match string (starts with ', or " ?) - // match guid (is exactly guid'') - context.stateQueue.push(QueryStateName.PredicateStarted); - } else if (this.isIdentifier(token)) { - // match identifier (can only start with letter) - context.stateQueue.push(QueryStateName.PredicateStarted); - } - - return context; - } - - /** - * optional post processing, here we can add logging - * or additional validation etc - * - * @param {QueryContext} context - * @memberof StateProcessValue - */ - onExit = (context: QueryContext) => { - return context; - }; -} diff --git a/src/table/persistence/QueryTranscriber/TokenModel/ITokenType.ts b/src/table/persistence/QueryTranscriber/TokenModel/ITokenType.ts deleted file mode 100644 index 2a3580ea0..000000000 --- a/src/table/persistence/QueryTranscriber/TokenModel/ITokenType.ts +++ /dev/null @@ -1,15 +0,0 @@ -/** - * Token Type provides the capability to perform - * tokenization and conversion based on value in query - * - * @export - * @interface ITokenType - */ -export default interface ITokenType { - isUnknown(): boolean; - isIdentifier(): boolean; - isOperator(): boolean; - isValue(): boolean; - isParensOpen(): boolean; - isParensClose(): boolean; -} diff --git a/src/table/persistence/QueryTranscriber/TokenModel/IdentifierToken.ts b/src/table/persistence/QueryTranscriber/TokenModel/IdentifierToken.ts deleted file mode 100644 index 7dbb68d1d..000000000 --- a/src/table/persistence/QueryTranscriber/TokenModel/IdentifierToken.ts +++ /dev/null @@ -1,22 +0,0 @@ -import ITokenType from "./ITokenType"; - -export default class IdentifierToken implements ITokenType { - isUnknown(): boolean { - return false; - } - isIdentifier(): boolean { - return true; - } - isOperator(): boolean { - return false; - } - isValue(): boolean { - return false; - } - isParensOpen(): boolean { - return false; - } - isParensClose(): boolean { - return false; - } -} diff --git a/src/table/persistence/QueryTranscriber/TokenModel/OperatorToken.ts b/src/table/persistence/QueryTranscriber/TokenModel/OperatorToken.ts deleted file mode 100644 index 2c124bfb0..000000000 --- a/src/table/persistence/QueryTranscriber/TokenModel/OperatorToken.ts +++ /dev/null @@ -1,22 +0,0 @@ -import ITokenType from "./ITokenType"; - -export default class OperatorToken implements ITokenType { - isUnknown(): boolean { - return false; - } - isIdentifier(): boolean { - return false; - } - isOperator(): boolean { - return true; - } - isValue(): boolean { - return false; - } - isParensOpen(): boolean { - return false; - } - isParensClose(): boolean { - return false; - } -} diff --git a/src/table/persistence/QueryTranscriber/TokenModel/ParensCloseToken.ts b/src/table/persistence/QueryTranscriber/TokenModel/ParensCloseToken.ts deleted file mode 100644 index 051b1c1ff..000000000 --- a/src/table/persistence/QueryTranscriber/TokenModel/ParensCloseToken.ts +++ /dev/null @@ -1,22 +0,0 @@ -import ITokenType from "./ITokenType"; - -export default class ParensCloseToken implements ITokenType { - isUnknown(): boolean { - return false; - } - isIdentifier(): boolean { - return false; - } - isOperator(): boolean { - return false; - } - isValue(): boolean { - return false; - } - isParensOpen(): boolean { - return false; - } - isParensClose(): boolean { - return true; - } -} diff --git a/src/table/persistence/QueryTranscriber/TokenModel/ParensOpenToken.ts b/src/table/persistence/QueryTranscriber/TokenModel/ParensOpenToken.ts deleted file mode 100644 index f36dd1c1d..000000000 --- a/src/table/persistence/QueryTranscriber/TokenModel/ParensOpenToken.ts +++ /dev/null @@ -1,22 +0,0 @@ -import ITokenType from "./ITokenType"; - -export default class ParensOpenToken implements ITokenType { - isUnknown(): boolean { - return false; - } - isIdentifier(): boolean { - return false; - } - isOperator(): boolean { - return false; - } - isValue(): boolean { - return false; - } - isParensOpen(): boolean { - return true; - } - isParensClose(): boolean { - return false; - } -} diff --git a/src/table/persistence/QueryTranscriber/TokenModel/TaggedToken.ts b/src/table/persistence/QueryTranscriber/TokenModel/TaggedToken.ts deleted file mode 100644 index 1bf1eba1e..000000000 --- a/src/table/persistence/QueryTranscriber/TokenModel/TaggedToken.ts +++ /dev/null @@ -1,11 +0,0 @@ -import ITokenType from "./ITokenType"; - -export default class TaggedToken { - public token: string; - public type: ITokenType; - - constructor(token: string, type: ITokenType) { - this.token = token; - this.type = type; - } -} diff --git a/src/table/persistence/QueryTranscriber/TokenModel/UnknownToken.ts b/src/table/persistence/QueryTranscriber/TokenModel/UnknownToken.ts deleted file mode 100644 index 9bd184cbc..000000000 --- a/src/table/persistence/QueryTranscriber/TokenModel/UnknownToken.ts +++ /dev/null @@ -1,22 +0,0 @@ -import ITokenType from "./ITokenType"; - -export default class UnknownToken implements ITokenType { - isUnknown(): boolean { - return true; - } - isIdentifier(): boolean { - return false; - } - isOperator(): boolean { - return false; - } - isValue(): boolean { - return false; - } - isParensOpen(): boolean { - return false; - } - isParensClose(): boolean { - return false; - } -} diff --git a/src/table/persistence/QueryTranscriber/TokenModel/ValueToken.ts b/src/table/persistence/QueryTranscriber/TokenModel/ValueToken.ts deleted file mode 100644 index c85b10662..000000000 --- a/src/table/persistence/QueryTranscriber/TokenModel/ValueToken.ts +++ /dev/null @@ -1,22 +0,0 @@ -import ITokenType from "./ITokenType"; - -export default class ValueToken implements ITokenType { - isUnknown(): boolean { - return false; - } - isIdentifier(): boolean { - return false; - } - isOperator(): boolean { - return false; - } - isValue(): boolean { - return true; - } - isParensOpen(): boolean { - return false; - } - isParensClose(): boolean { - return false; - } -} diff --git a/tests/table/apis/table.entity.query.test.ts b/tests/table/apis/table.entity.query.test.ts index caf81c2c5..a1d80757f 100644 --- a/tests/table/apis/table.entity.query.test.ts +++ b/tests/table/apis/table.entity.query.test.ts @@ -663,16 +663,12 @@ describe("table Entity APIs test - using Azure/data-tables", () => { } // we should not hit this assert if the exception is generated. // it helps catch the cases which slip through filter validation - assert.strictEqual( - all.length, - -1, - `Failed on number of results with query ${queryTest.queryOptions.filter}.` - ); + assert.fail(`Query '${queryTest.queryOptions.filter}' did not generate the expected validation exception.`) } catch (filterException: any) { assert.strictEqual( [400, 501].includes(filterException.statusCode), true, - `Filter "${queryTest.queryOptions.filter}". Unexpected error. We got : ${filterException.message}` + `Filter "${queryTest.queryOptions.filter}" returned status code ${filterException.statusCode} instead of [400/501]. Unexpected error. We got : ${filterException.message}` ); } testsCompleted++; @@ -1078,41 +1074,45 @@ describe("table Entity APIs test - using Azure/data-tables", () => { ]; for (const queryTest of queriesAndExpectedResult) { - const entities = tableClient.listEntities({ - queryOptions: queryTest.queryOptions - }); - let all: TableTestEntity[] = []; - for await (const entity of entities.byPage({ - maxPageSize - })) { - all = [...all, ...entity]; - } - assert.strictEqual( - all.length, - queryTest.expectedResult, - `Failed with query ${queryTest.queryOptions.filter}` - ); - if (all[0] !== undefined) { - all.sort((a, b) => { - return ( - parseInt(a.guidField.value[1], 10) - - parseInt(b.guidField.value[1], 10) - ); + try { + const entities = tableClient.listEntities({ + queryOptions: queryTest.queryOptions }); + let all: TableTestEntity[] = []; + for await (const entity of entities.byPage({ + maxPageSize + })) { + all = [...all, ...entity]; + } assert.strictEqual( - all[0].guidField.value, - queryTest.expectedValue, - `Test ${queryTest.index}: Guid value ${all[0].guidField.value} was not equal to ${queryTest.expectedValue} with query ${queryTest.queryOptions.filter}` - ); - } else { - assert.strictEqual( - all[0], - queryTest.expectedValue, - `Value ${all[0]} was not equal to ${queryTest.expectedValue} with query ${queryTest.queryOptions.filter}` + all.length, + queryTest.expectedResult, + `Failed with query ${queryTest.queryOptions.filter}` ); - } + if (all[0] !== undefined) { + all.sort((a, b) => { + return ( + parseInt(a.guidField.value[1], 10) - + parseInt(b.guidField.value[1], 10) + ); + }); + assert.strictEqual( + all[0].guidField.value, + queryTest.expectedValue, + `Test ${queryTest.index}: Guid value ${all[0].guidField.value} was not equal to ${queryTest.expectedValue} with query ${queryTest.queryOptions.filter}` + ); + } else { + assert.strictEqual( + all[0], + queryTest.expectedValue, + `Value ${all[0]} was not equal to ${queryTest.expectedValue} with query ${queryTest.queryOptions.filter}` + ); + } - testsCompleted++; + testsCompleted++; + } catch (err) { + assert.fail(`Query '${queryTest.queryOptions.filter}' failed unexpectedly: ${err}`) + } } assert.strictEqual(testsCompleted, queriesAndExpectedResult.length); await tableClient.deleteTable(); @@ -1220,23 +1220,27 @@ describe("table Entity APIs test - using Azure/data-tables", () => { ]; for (const queryTest of queriesAndExpectedResult) { - const entities = tableClient.listEntities< - TableEntity<{ number: number }> - >({ - queryOptions: queryTest.queryOptions - }); - let all: TableEntity<{ number: number }>[] = []; - for await (const entity of entities.byPage({ - maxPageSize - })) { - all = [...all, ...entity]; + try { + const entities = tableClient.listEntities< + TableEntity<{ number: number }> + >({ + queryOptions: queryTest.queryOptions + }); + let all: TableEntity<{ number: number }>[] = []; + for await (const entity of entities.byPage({ + maxPageSize + })) { + all = [...all, ...entity]; + } + assert.strictEqual( + all.length, + queryTest.expectedResult, + `Failed with query ${queryTest.queryOptions.filter}` + ); + testsCompleted++; + } catch (err) { + assert.fail(`Query '${queryTest.queryOptions.filter}' failed unexpectedly: ${err}`) } - assert.strictEqual( - all.length, - queryTest.expectedResult, - `Failed with query ${queryTest.queryOptions.filter}` - ); - testsCompleted++; } assert.strictEqual(testsCompleted, queriesAndExpectedResult.length); await tableClient.deleteTable(); diff --git a/tests/table/unit/LokiJsQueryTranscriber.unit.test.2.ts b/tests/table/unit/LokiJsQueryTranscriber.unit.test.2.ts deleted file mode 100644 index beb734847..000000000 --- a/tests/table/unit/LokiJsQueryTranscriber.unit.test.2.ts +++ /dev/null @@ -1,248 +0,0 @@ -import * as assert from "assert"; -import LokiJsQueryTranscriberFactory from "../../../src/table/persistence/QueryTranscriber/LokiJsQueryTranscriberFactory"; - -const entityQueries = [ - { - input: "PartitionKey eq 'azurite' and RowKey eq 'tables'", - expected: - "return ( item.properties.PartitionKey === `azurite` && item.properties.RowKey === `tables` )" - }, - { - input: "PartitionKey eq 'azurite' or RowKey eq 'tables'", - expected: - "return ( item.properties.PartitionKey === `azurite` || item.properties.RowKey === `tables` )" - }, - { - input: "PartitionKey eq 'Foo '''' Bar'", - expected: "return ( item.properties.PartitionKey === `Foo '' Bar` )" - }, - { - input: "PartitionKey eq 'Foo '' Bar'", - expected: "return ( item.properties.PartitionKey === `Foo ' Bar` )" - }, - { - input: "not (PartitionKey lt 'Part2')", - expected: "return ( ! ( item.properties.PartitionKey < `Part2` ) )" - }, - { - input: "PartitionKey eq 'azurite'", - expected: "return ( item.properties.PartitionKey === `azurite` )" - }, - { - input: "RowKey eq 'azurite'", - expected: "return ( item.properties.RowKey === `azurite` )" - }, - { - input: "PartitionKey gt 'azurite'", - expected: "return ( item.properties.PartitionKey > `azurite` )" - }, - { - input: "PartitionKey ge 'azurite'", - expected: "return ( item.properties.PartitionKey >= `azurite` )" - }, - { - input: "PartitionKey lt 'azurite'", - expected: "return ( item.properties.PartitionKey < `azurite` )" - }, - { - input: "PartitionKey le 'azurite'", - expected: "return ( item.properties.PartitionKey <= `azurite` )" - }, - { - input: "PartitionKey ne 'azurite'", - expected: "return ( item.properties.PartitionKey !== `azurite` )" - }, - { - input: "not (PartitionKey eq 'azurite')", - expected: "return ( ! ( item.properties.PartitionKey === `azurite` ) )" - }, - { - input: "MyField gt datetime'2021-06-05T16:20:00'", - expected: - "return ( new Date(item.properties.MyField).getTime() > new Date('2021-06-05T16:20:00').getTime() )" - }, - { - input: "MyField gt 1337", - expected: "return ( item.properties.MyField > 1337 )" - }, - { - input: "MyField gt 1337L", - expected: "return ( item.properties.MyField > '1337' )" - }, - { - input: "MyField eq guid'00000000-0000-0000-0000-000000000000'", - expected: - "return ( ( item.properties.MyField === '00000000-0000-0000-0000-000000000000' ) || ( item.properties.MyField === 'MDAwMDAwMDAtMDAwMC0wMDAwLTAwMDAtMDAwMDAwMDAwMDAw' ) )" - }, - { - input: "PartitionKey eq 'Iam''good''atTypeScript'", - expected: - "return ( item.properties.PartitionKey === `Iam'good'atTypeScript` )" - }, - { - input: "PartitionKey eq 'Isn''tThisANastyPK'", - expected: "return ( item.properties.PartitionKey === `Isn'tThisANastyPK` )" - }, - { - input: "1 eq 1", - expected: "return ( 1 === 1 )" - }, - { - input: "PartitionKey eq 'a'", - expected: "return ( item.properties.PartitionKey === `a` )" - }, - { - input: "PartitionKey eq ' '", - expected: "return ( item.properties.PartitionKey === ` ` )" - }, - { - input: "PartitionKey eq 'Foo Bar'", - expected: "return ( item.properties.PartitionKey === `Foo Bar` )" - }, - { - input: "PartitionKey eq 'A''Foo Bar''Z'", - expected: "return ( item.properties.PartitionKey === `A'Foo Bar'Z` )" - }, - { - input: "PartitionKey eq '''Foo Bar'", - expected: "return ( item.properties.PartitionKey === `'Foo Bar` )" - }, - { - input: "PartitionKey eq 'Foo Bar'''", - expected: "return ( item.properties.PartitionKey === `Foo Bar'` )" - }, - { - input: "PartitionKey eq ' Foo Bar '", - expected: "return ( item.properties.PartitionKey === ` Foo Bar ` )" - }, - { - input: "PartitionKey eq ''", - expected: "return ( item.properties.PartitionKey === `` )" - }, - { - input: "PartitionKey eq '''Foo Bar'''", - expected: "return ( item.properties.PartitionKey === `'Foo Bar'` )" - }, - { - input: "PartitionKey eq ''''", - expected: "return ( item.properties.PartitionKey === `'` )" - }, - { - input: "PartitionKey eq ''''''", - expected: "return ( item.properties.PartitionKey === `''` )" - }, - { - input: "PartitionKey eq ''''''''", - expected: "return ( item.properties.PartitionKey === `'''` )" - }, - { - input: "PartitionKey eq ''''''''''", - expected: "return ( item.properties.PartitionKey === `''''` )" - }, - { - input: "PartitionKey eq 'I am ''good'' at TypeScript'", - expected: - "return ( item.properties.PartitionKey === `I am 'good' at TypeScript` )" - }, - { - input: "_foo eq 'bar'", - expected: "return ( item.properties._foo === `bar` )" - }, - { - input: - "please eq 'never query ''this'' eq this or suchandsuch eq ''worse'''", - expected: - "return ( item.properties.please === `never query 'this' eq this or suchandsuch eq 'worse'` )" - } -]; - -describe("Unit tests for converting an entity OData query to a JavaScript query for LokiJS", () => { - entityQueries.forEach(({ input, expected }) => { - it(`should transform '${input}' into '${expected}'`, (done) => { - try { - const queryTranscriber = - LokiJsQueryTranscriberFactory.createEntityQueryTranscriber( - input, - "lokiJsQueryTranscriber" - ); - - queryTranscriber.transcribe(); - const actual = queryTranscriber.getTranscribedQuery(); - assert.strictEqual(actual, expected); - } catch (err: any) { - if (input === "1 eq 1") { - assert.strictEqual( - err.message, - "Invalid number of terms in query!", - `Did not get expected error on invalid query ${input}` - ); - } else { - assert.ifError(err); - } - } - done(); - }); - }); -}); - -const tableQueries = [ - { - input: "TableName eq 'azurite'", - expected: "return ( item.table === `azurite` )" - }, - { - input: "TableName gt 'azurite'", - expected: "return ( item.table > `azurite` )" - }, - { - input: "TableName ge 'azurite'", - expected: "return ( item.table >= `azurite` )" - }, - { - input: "TableName lt 'azurite'", - expected: "return ( item.table < `azurite` )" - }, - { - input: "TableName le 'azurite'", - expected: "return ( item.table <= `azurite` )" - }, - { - input: "TableName ne 'azurite'", - expected: "return ( item.table !== `azurite` )" - }, - { - input: "not (TableName eq 'azurite')", - expected: "return ( ! ( item.table === `azurite` ) )" - }, - { - input: "1 eq 1", - expected: "return ( 1 === 1 )" - } -]; - -describe("Unit tests for converting an table OData query to a JavaScript query for LokiJS", () => { - tableQueries.forEach(({ input, expected }) => { - it(`should transform '${input}' into '${expected}'`, (done) => { - try { - const queryTranscriber = - LokiJsQueryTranscriberFactory.createTableQueryTranscriber( - input, - "lokiJsTableQueryTranscriber" - ); - - queryTranscriber.transcribe(); - - const actual = queryTranscriber.getTranscribedQuery(); - assert.strictEqual(actual, expected); - } catch (err: any) { - if (input === "1 eq 1") - assert.strictEqual( - err.message, - "Invalid number of terms in query!", - `Did not get expected error on invalid query ${input}` - ); - } - done(); - }); - }); -}); diff --git a/tests/table/unit/LokiJsQueryTranscriber.unit.test.ts b/tests/table/unit/LokiJsQueryTranscriber.unit.test.ts deleted file mode 100644 index f8c98f797..000000000 --- a/tests/table/unit/LokiJsQueryTranscriber.unit.test.ts +++ /dev/null @@ -1,450 +0,0 @@ -import * as assert from "assert"; -import LokiJsQueryTranscriberFactory from "../../../src/table/persistence/QueryTranscriber/LokiJsQueryTranscriberFactory"; - -describe("LokiJs Query Transcribing unit tests, also ensures backward compatability with earlier schemas:", () => { - it("correctly transcribes a simple query with irregular whitespace", async () => { - // use the expected response string to compare the reult to. - const testArray = [ - { - originalQuery: "( )", - expectedQuery: "return ( ( ) )" - }, - { - originalQuery: "(partitionKey eq 'test')", - expectedQuery: "return ( ( item.properties.partitionKey === 'test' ) )" - }, - { - originalQuery: "( partitionKey eq 'test' )", - expectedQuery: "return ( ( item.properties.partitionKey === 'test' ) )" - }, - { - originalQuery: "('test' eq partitionKey)", - expectedQuery: "return ( ( 'test' === item.properties.partitionKey ) )" - }, - { - originalQuery: "( 'test' eq partitionKey )", - expectedQuery: "return ( ( 'test' === item.properties.partitionKey ) )" - } - ]; - - for (const test of testArray) { - const queryTranscriber = - LokiJsQueryTranscriberFactory.createEntityQueryTranscriber( - test.originalQuery, - "stateMachineTest" - ); - - queryTranscriber.transcribe(); - assert.strictEqual( - queryTranscriber.getTranscribedQuery(), - test.expectedQuery, - `Transcribed query "${queryTranscriber.getTranscribedQuery()}" did not match expected ${ - test.expectedQuery - }` - ); - } - }); - - it("correctly transcribes a query for a value of type boolean", async () => { - // use the expected response string to compare the result to. - const testArray = [ - { - originalQuery: "(myBoolean eq false )", - expectedQuery: "return ( ( item.properties.myBoolean === false ) )" - }, - { - originalQuery: "( true eq myBoolean )", - expectedQuery: "return ( ( true === item.properties.myBoolean ) )" - } - ]; - - for (const test of testArray) { - const queryTranscriber = - LokiJsQueryTranscriberFactory.createEntityQueryTranscriber( - test.originalQuery, - "stateMachineTest" - ); - - queryTranscriber.transcribe(); - assert.strictEqual( - queryTranscriber.getTranscribedQuery(), - test.expectedQuery, - `Transcribed query "${queryTranscriber.getTranscribedQuery()}" did not match expected ${ - test.expectedQuery - }` - ); - } - }); - - it("correctly transcribes a query for a value of type double", async () => { - // use the expected response string to compare the result to. - const testArray = [ - { - originalQuery: "(myDouble lt 123.01 )", - expectedQuery: "return ( ( item.properties.myDouble < 123.01 ) )" - }, - { - originalQuery: "( 123.01 gt myDouble )", - expectedQuery: "return ( ( 123.01 > item.properties.myDouble ) )" - } - ]; - - for (const test of testArray) { - const queryTranscriber = - LokiJsQueryTranscriberFactory.createEntityQueryTranscriber( - test.originalQuery, - "stateMachineTest" - ); - - queryTranscriber.transcribe(); - assert.strictEqual( - queryTranscriber.getTranscribedQuery(), - test.expectedQuery, - `Transcribed query "${queryTranscriber.getTranscribedQuery()}" did not match expected ${ - test.expectedQuery - }` - ); - } - }); - - it("correctly transcribes a query for a value of type Guid", async () => { - // use the expected response string to compare the reult to. - // guid should have both simple string rep and base64 encoded - // version for legacy schema compatibility - const testArray = [ - { - originalQuery: - "(myGuid eq guid'12345678-1234-1234-1234-1234567890ab' )", - expectedQuery: - "return ( ( ( item.properties.myGuid === 'MTIzNDU2NzgtMTIzNC0xMjM0LTEyMzQtMTIzNDU2Nzg5MGFi' ) || ( item.properties.myGuid === '12345678-1234-1234-1234-1234567890ab' ) ) )" - } - ]; - - for (const test of testArray) { - const queryTranscriber = - LokiJsQueryTranscriberFactory.createEntityQueryTranscriber( - test.originalQuery, - "stateMachineTest" - ); - - queryTranscriber.transcribe(); - assert.strictEqual( - queryTranscriber.getTranscribedQuery(), - test.expectedQuery, - `Transcribed query "${queryTranscriber.getTranscribedQuery()}" did not match expected ${ - test.expectedQuery - }` - ); - } - }); - - it("correctly transcribes a query for a value of type string", async () => { - // use the expected response string to compare the result to. - const testArray = [ - { - originalQuery: "(myString eq '123.01' )", - expectedQuery: "return ( ( item.properties.myString === '123.01' ) )" - }, - { - originalQuery: "( '123.01L' eq myString )", - expectedQuery: "return ( ( '123.01L' === item.properties.myString ) )" - }, - { - originalQuery: "( 'I am a string' eq myString )", - expectedQuery: - "return ( ( 'I am a string' === item.properties.myString ) )" - }, - { - originalQuery: "( 'C:\\Windows\\System32' eq myString )", - expectedQuery: - "return ( ( 'C:\\\\Windows\\\\System32' === item.properties.myString ) )" - }, - { - originalQuery: "( 'I am a string with `backticks`' eq myString )", - expectedQuery: - "return ( ( 'I am a string with `backticks`' === item.properties.myString ) )" - }, - { - originalQuery: "( 'I am a string with ${an attempted interpolation escape}' eq myString )", - expectedQuery: - "return ( ( 'I am a string with ${an attempted interpolation escape}' === item.properties.myString ) )" - } - ]; - - for (const test of testArray) { - const queryTranscriber = - LokiJsQueryTranscriberFactory.createEntityQueryTranscriber( - test.originalQuery, - "stateMachineTest" - ); - - queryTranscriber.transcribe(); - assert.strictEqual( - queryTranscriber.getTranscribedQuery(), - test.expectedQuery, - `Transcribed query "${queryTranscriber.getTranscribedQuery()}" did not match expected ${ - test.expectedQuery - }` - ); - } - }); - - it("correctly transcribes a query for a value of type integer", async () => { - // use the expected response string to compare the result to. - const testArray = [ - { - originalQuery: "(myInt eq 123 )", - expectedQuery: "return ( ( item.properties.myInt === 123 ) )" - }, - { - originalQuery: "( -123 lt myInt )", - expectedQuery: "return ( ( -123 < item.properties.myInt ) )" - } - ]; - - for (const test of testArray) { - const queryTranscriber = - LokiJsQueryTranscriberFactory.createEntityQueryTranscriber( - test.originalQuery, - "stateMachineTest" - ); - - queryTranscriber.transcribe(); - assert.strictEqual( - queryTranscriber.getTranscribedQuery(), - test.expectedQuery, - `Transcribed query "${queryTranscriber.getTranscribedQuery()}" did not match expected ${ - test.expectedQuery - }` - ); - } - }); - - it("correctly transcribes a query for a value of type long", async () => { - // use the expected response string to compare the result to. - const testArray = [ - { - originalQuery: "(myLong eq 123.01L )", - expectedQuery: "return ( ( item.properties.myLong === '123.01' ) )" - }, - { - originalQuery: "( 123.01L eq myLong )", - expectedQuery: "return ( ( '123.01' === item.properties.myLong ) )" - }, - { - originalQuery: "PartitionKey eq 'partition1' and int64Field eq 12345L", - expectedQuery: - "return ( item.properties.PartitionKey === 'partition1' && item.properties.int64Field === '12345' )" - } - ]; - - for (const test of testArray) { - const queryTranscriber = - LokiJsQueryTranscriberFactory.createEntityQueryTranscriber( - test.originalQuery, - "stateMachineTest" - ); - - queryTranscriber.transcribe(); - assert.strictEqual( - queryTranscriber.getTranscribedQuery(), - test.expectedQuery, - `Transcribed query "${queryTranscriber.getTranscribedQuery()}" did not match expected ${ - test.expectedQuery - }` - ); - } - }); - - it("correctly transcribes a query for a value of type date", async () => { - // use the expected response string to compare the result to. - const timestamp = new Date(); - timestamp.setDate(timestamp.getDate() + 1); - const newTimeStamp = timestamp.toISOString(); - const testArray = [ - { - originalQuery: `(myDate eq datetime'${newTimeStamp}' )`, - expectedQuery: `return ( ( new Date(item.properties.myDate).getTime() === new Date('${newTimeStamp}').getTime() ) )` - }, - { - originalQuery: `( datetime'${newTimeStamp}' eq myDate )`, - expectedQuery: `return ( ( new Date('${newTimeStamp}').getTime() === new Date(item.properties.myDate).getTime() ) )` - }, - { - originalQuery: `PartitionKey eq 'partition1' and number gt 11 and Timestamp lt datetime'${newTimeStamp}'`, - expectedQuery: `return ( item.properties.PartitionKey === 'partition1' && item.properties.number > 11 && new Date(item.properties.Timestamp).getTime() < new Date('${newTimeStamp}').getTime() )` - }, - { - originalQuery: `PartitionKey eq 'partition1' and number lt 11 and Timestamp lt datetime'${newTimeStamp}'`, - expectedQuery: `return ( item.properties.PartitionKey === 'partition1' && item.properties.number < 11 && new Date(item.properties.Timestamp).getTime() < new Date('${newTimeStamp}').getTime() )` - }, - { - originalQuery: `(PartitionKey eq 'partition1') and (number lt 12) and (Timestamp lt datetime'${newTimeStamp}')`, - expectedQuery: `return ( ( item.properties.PartitionKey === 'partition1' ) && ( item.properties.number < 12 ) && ( new Date(item.properties.Timestamp).getTime() < new Date('${newTimeStamp}').getTime() ) )` - } - ]; - - for (const test of testArray) { - const queryTranscriber = - LokiJsQueryTranscriberFactory.createEntityQueryTranscriber( - test.originalQuery, - "stateMachineTest" - ); - - queryTranscriber.transcribe(); - assert.strictEqual( - queryTranscriber.getTranscribedQuery(), - test.expectedQuery, - `Transcribed query "${queryTranscriber.getTranscribedQuery()}" did not match expected ${ - test.expectedQuery - }` - ); - } - }); - - it("correctly transcribes a query with multiple predicates", async () => { - // use the expected response string to compare the result to. - const testArray = [ - { - originalQuery: "(myInt eq 123 ) and (myString eq 'hello')", - expectedQuery: - "return ( ( item.properties.myInt === 123 ) && ( item.properties.myString === 'hello' ) )" - } - ]; - - for (const test of testArray) { - const queryTranscriber = - LokiJsQueryTranscriberFactory.createEntityQueryTranscriber( - test.originalQuery, - "stateMachineTest" - ); - - queryTranscriber.transcribe(); - assert.strictEqual( - queryTranscriber.getTranscribedQuery(), - test.expectedQuery, - `Transcribed query "${queryTranscriber.getTranscribedQuery()}" did not match expected ${ - test.expectedQuery - }` - ); - } - }); - - it("correctly transcribes a query with multiple predicates and no brackets", async () => { - // use the expected response string to compare the result to. - const testArray = [ - { - originalQuery: "PartitionKey eq 'partitionKey' and int32Field eq 54321", - expectedQuery: - "return ( item.properties.PartitionKey === 'partitionKey' && item.properties.int32Field === 54321 )" - } - ]; - - for (const test of testArray) { - const queryTranscriber = - LokiJsQueryTranscriberFactory.createEntityQueryTranscriber( - test.originalQuery, - "stateMachineTest" - ); - - queryTranscriber.transcribe(); - assert.strictEqual( - queryTranscriber.getTranscribedQuery(), - test.expectedQuery, - `Transcribed query "${queryTranscriber.getTranscribedQuery()}" did not match expected ${ - test.expectedQuery - }` - ); - } - }); - - it("correctly transcribes a query for a value of type binary", async () => { - // use the expected response string to compare the result to. - const testArray = [ - { - originalQuery: `(PartitionKey eq 'part1') and (binaryField eq binary'62696e61727944617461')`, - expectedQuery: - "return ( ( item.properties.PartitionKey === 'part1' ) && ( item.properties.binaryField === 'YmluYXJ5RGF0YQ==' ) )" - }, - { - originalQuery: `(PartitionKey eq 'part1') and (binaryField eq X'62696e61727944617461')`, - expectedQuery: - "return ( ( item.properties.PartitionKey === 'part1' ) && ( item.properties.binaryField === 'YmluYXJ5RGF0YQ==' ) )" - } - ]; - - for (const test of testArray) { - const queryTranscriber = - LokiJsQueryTranscriberFactory.createEntityQueryTranscriber( - test.originalQuery, - "stateMachineTest" - ); - - queryTranscriber.transcribe(); - assert.strictEqual( - queryTranscriber.getTranscribedQuery(), - test.expectedQuery, - `Transcribed query "${queryTranscriber.getTranscribedQuery()}" did not match expected ${ - test.expectedQuery - }` - ); - } - }); - - it("correctly transcribes a query for tables", async () => { - // allow custom props = false! - // system props : "name", "table" - const testArray = [ - { - originalQuery: "TableName ge 'myTable' and TableName lt 'myTable{'", - expectedQuery: - "return ( item.table >= 'myTable' && item.table < 'myTable{' )" - } - ]; - - for (const test of testArray) { - const queryTranscriber = - LokiJsQueryTranscriberFactory.createTableQueryTranscriber( - test.originalQuery, - "stateMachineTest" - ); - - queryTranscriber.transcribe(); - assert.strictEqual( - queryTranscriber.getTranscribedQuery(), - test.expectedQuery, - `Transcribed query "${queryTranscriber.getTranscribedQuery()}" did not match expected ${ - test.expectedQuery - }` - ); - } - }); - - it("correctly transcribes a very long query i.e. from Orleans", async () => { - const testArray = [ - { - originalQuery: - "(PartitionKey eq '6e4ab0516fca4122bff05fb23a5f6adf') and (((RowKey eq 'user%2fsomeraondomuser_cf9e6f1fc7264c9c8148d6050e27ee3e') and (ActivationId eq '512b5a68bc1c46b480a1a052da681f45')) or ((RowKey eq 'user%2fsomeraondomuser_267f6d72c0874408a021043138c6e395') and (ActivationId eq 'e195014973754b11ae1b74cb4be9aab1')) or ((RowKey eq 'user%2fsomeraondomuser_34b4d10839ba48928a3ceee0ea6a1175') and (ActivationId eq '4573eccdaf8d42148907fd3b654b72c3')) or ((RowKey eq 'user%2fsomeraondomuser_931d172de3034561af4d210aa4007b8f') and (ActivationId eq 'd3e7ffeb439b4acf912006b2f01aa5a9')) or ((RowKey eq 'user%2fsomeraondomuser_6db90a01fab7429ca52698534629dd5d') and (ActivationId eq '492fe8afa0514a919fc0c491afc88e18')) or ((RowKey eq 'user%2fsomeraondomuser_b4710ac467ea46678d3b692d552b4573') and (ActivationId eq 'ed3a90e556474a4486196d7d20c7e0a8')) or ((RowKey eq 'user%2fsomeraondomuser_9a7d0ed9e934457790c4af955a5d0aa2') and (ActivationId eq 'e6098dd0457a438b8c8810381e72b103')) or ((RowKey eq 'user%2fsomeraondomuser_5f45717f56d14f6ebc1df2d3195609d8') and (ActivationId eq '1001b0b9b2224ab08c9b3e1413e733e3')) or ((RowKey eq 'user%2fsomeraondomuser_593e5eb5533f41998a6946d37748d1c4') and (ActivationId eq '100df8cda69a4101bd038f097073dcf0')) or ((RowKey eq 'user%2fsomeraondomuser_5c837b849f024914b694ebf978129210') and (ActivationId eq 'd4b38859695c4b31892053e2f8f16ce1')) or ((RowKey eq 'user%2fsomeraondomuser_0d59188361ed46b8967ff553fc31da22') and (ActivationId eq 'cc235fce46ca4dcf9c24a12eda86a23e')) or ((RowKey eq 'user%2fsomeraondomuser_46daebbc6d214de1b724a6d1bd909f2e') and (ActivationId eq 'f901237d1de5466bb350013841f7e1d9')) or ((RowKey eq 'user%2fsomeraondomuser_4bf3d38ef9664a17b8acbe6e6f4475e6') and (ActivationId eq '0d8b22f41df443f4956b4cef9ddccc7b')) or ((RowKey eq 'user%2fsomeraondomuser_7d157b7f3a3a4508a182b47394444a97') and (ActivationId eq '391cbd2712e94a10b1e8f7f5566ad1d1')) or ((RowKey eq 'user%2fsomeraondomuser_3173c9fea0124785a6dce8bb1ce22ff5') and (ActivationId eq '5926f7967953443089276d4011de4586')) or ((RowKey eq 'user%2fsomeraondomuser_855b9f1c9b1d4793b633dd312f97acee') and (ActivationId eq 'acbb6b581b604bd9bdb7d8109ad80c25')) or ((RowKey eq 'user%2fsomeraondomuser_0f11694546a049df89c234f5aca29594') and (ActivationId eq '83a8b6c565e74569a3d1f358ae1b4767')) or ((RowKey eq 'user%2fsomeraondomuser_5bd0f86dc2a74ba18848156fd4384fa0') and (ActivationId eq '430dcf95b539468cbfb99886949840b5')) or ((RowKey eq 'user%2fsomeraondomuser_85c207c588dd4c9697a921b29481152b') and (ActivationId eq 'e114211645144d8581b279cc8b780879')) or ((RowKey eq 'user%2fsomeraondomuser_d2d48e3e8e594b7ea755a6df291c55a4') and (ActivationId eq 'a9f50b02fa634628b56622602733d2df')) or ((RowKey eq 'user%2fsomeraondomuser_3f1c4bcf08c34efb8b64a40ee4e33698') and (ActivationId eq 'e7180ac71c6a4fb3b5e68c3a6d3c5ce6')) or ((RowKey eq 'user%2fsomeraondomuser_3871c563cd0e433fbb7d4ebbd6db4856') and (ActivationId eq 'c05eab92d0b44f4b8ea57b6cf9339cc2')) or ((RowKey eq 'user%2fsomeraondomuser_beb39451febe40aa9b51b051a5940b7c') and (ActivationId eq '51998e3e875c4c499f4ebb14bc9a91e6')) or ((RowKey eq 'user%2fsomeraondomuser_1258f93c3b054ee2b80a52f9f9bdc170') and (ActivationId eq 'cb3d1fd19e2d45eeb0ebd9a704e6d576')) or ((RowKey eq 'user%2fsomeraondomuser_b37d9915799047988a1b0598a47f7ba4') and (ActivationId eq '2560bf1bcde5461eb4899ef8ae009a7a')) or ((RowKey eq 'user%2fsomeraondomuser_37a27899265b4125ba98bc7fd2f9c000') and (ActivationId eq '166e0f18cd744666b3684c406493945e')) or ((RowKey eq 'user%2fsomeraondomuser_240b39fd90d94b54b0e923134b4cba55') and (ActivationId eq '329c6825c2754dd3b18411083b7b58e4')) or ((RowKey eq 'user%2fsomeraondomuser_e7c33f051c3c42a8883712e255635bbf') and (ActivationId eq 'f127763cb6374f49bf52b7876e594147')) or ((RowKey eq 'user%2fsomeraondomuser_3d5d8beeafac4b0aa6a146f7f2e5eadb') and (ActivationId eq '6f89c9bda1d74977997b1415db56a21e')) or ((RowKey eq 'user%2fsomeraondomuser_21d9c87ed89646e88be406cb57db4e1c') and (ActivationId eq '640d3e743baa4c969e4292aa80efbac2')) or ((RowKey eq 'user%2fsomeraondomuser_6d71d83c8083415a835943b18b9d6d99') and (ActivationId eq 'd4f8417dab4544ed972b288bae03efa3')) or ((RowKey eq 'user%2fsomeraondomuser_44253ea6cadc4165994fd4501998190b') and (ActivationId eq 'a099990633bb441a852ff00266c372ee')) or ((RowKey eq 'user%2fsomeraondomuser_169185ee08b446ee9a1dd329997f4b50') and (ActivationId eq '6928aeac8dfe4caeb44b275d3765bb9c')) or ((RowKey eq 'user%2fsomeraondomuser_5639229f610444df9ff2c3a598ba5ff3') and (ActivationId eq 'afd94604d549455983d4bb043b9bf4fc')) or ((RowKey eq 'user%2fsomeraondomuser_6e8177f40d924eecad86fe29cf042c5b') and (ActivationId eq 'ef6dff8131634580a05602b12b3c7030')) or ((RowKey eq 'user%2fsomeraondomuser_82c02c372d274b12b42eb613a94f0032') and (ActivationId eq 'c629d8827dec4946918fac970b0b01fc')) or ((RowKey eq 'user%2fsomeraondomuser_82d799f96a8341a888e823e7e6c680aa') and (ActivationId eq '6a430683a6864d518747c5613aae81f7')) or ((RowKey eq 'user%2fsomeraondomuser_eee54678565d4c62b3ee75ff595a639f') and (ActivationId eq '05b779023a86487291c54274f2351763')) or ((RowKey eq 'user%2fsomeraondomuser_d61b2e412be74d449cbe2e32c040b054') and (ActivationId eq 'abd89950074c455eabf0ce6507cff05b')) or ((RowKey eq 'user%2fsomeraondomuser_7d3b47e40a40403bac3c879f8ccc785a') and (ActivationId eq 'f37b30e2b99944ad8951924d890d6514')) or ((RowKey eq 'user%2fsomeraondomuser_fa9e78d2c68447928d3b5bcc7170f112') and (ActivationId eq 'bc9c4dde5ba443dea12137e5da919c41')) or ((RowKey eq 'user%2fsomeraondomuser_3bb66b8c2abb45c8b33e75ce4baa93ac') and (ActivationId eq '49c8905d49bc47bc9fea7d859c7812dd')) or ((RowKey eq 'user%2fsomeraondomuser_55b23534d04c4efe9d580c3740230486') and (ActivationId eq '1322e451d37145f4b1b41559f30b58e9')) or ((RowKey eq 'user%2fsomeraondomuser_8b8d04a70b8f43ab87d065e89d84aefb') and (ActivationId eq '3f7b8e9d039d4d788597d5fe7bb37666')) or ((RowKey eq 'user%2fsomeraondomuser_0d5ec8bb559d4e34a2d4c4b5d935386d') and (ActivationId eq '6eb87695c16f4289b48374a57fcc2bab')) or ((RowKey eq 'user%2fsomeraondomuser_a0ba488c7b0542d49cb2b406a7b3cca4') and (ActivationId eq 'fb20d88f4b6d4193aad4511c8951ef59')) or ((RowKey eq 'user%2fsomeraondomuser_25de238770ab41399d8cbe0343b9d0d3') and (ActivationId eq 'b587806d63324a4084cde9c92af04065')) or ((RowKey eq 'user%2fsomeraondomuser_7688796792e245d0913f050a3a7c6c02') and (ActivationId eq 'd95909aedd96417f945834151d397f51')) or ((RowKey eq 'user%2fsomeraondomuser_72967c3265ce4996b12001ea1814d62f') and (ActivationId eq 'd046ebb2304b4ff0be1c9d5a4c8a8831')) or ((RowKey eq 'user%2fsomeraondomuser_6238575aaee54a628caebb48b44584e5') and (ActivationId eq '6ac73966adb6496cb2a4553c7b9fe8ce')) or ((RowKey eq 'user%2fsomeraondomuser_fb89e80d21ed4b17a850f9021c4b1d2a') and (ActivationId eq '3833b18cabc344dab1dbdbb62c99accd')) or ((RowKey eq 'user%2fsomeraondomuser_f7aa848f4c7243b892fd979326884e3d') and (ActivationId eq '6911fe2a462e44aab8a143603e1af98f')) or ((RowKey eq 'user%2fsomeraondomuser_349234378ad34ec99c3ea00cb9149f80') and (ActivationId eq '62e351ea6ba44be8b45b2cb1a42efea3')) or ((RowKey eq 'user%2fsomeraondomuser_25707be4343f4f89955ea71bb2d75fe2') and (ActivationId eq '757fdf560e6e4fb0acc1d0578bc4bc83')) or ((RowKey eq 'user%2fsomeraondomuser_fdfe656c1e47438286a19ce4147201d1') and (ActivationId eq '5f417d1d6d9c498da973d30a26ac4c0f')) or ((RowKey eq 'user%2fsomeraondomuser_a4d0398c7b004774b638156dba8050b6') and (ActivationId eq '824bfc22f638402c99aa844984bc6814')) or ((RowKey eq 'user%2fsomeraondomuser_744afd919a134feb8167ea55d036a659') and (ActivationId eq 'b3cc18bb13254e95befa49486e7b7b9c')) or ((RowKey eq 'user%2fsomeraondomuser_6c8dbd201e6d4755a505586d669fb639') and (ActivationId eq 'e1aae7d578604f018c757fe76af995dd')) or ((RowKey eq 'user%2fsomeraondomuser_bcc2eecd8f6d4b53b22bc974e6ff5342') and (ActivationId eq '97916e010c614aa9873307d81cda8447')) or ((RowKey eq 'user%2fsomeraondomuser_be43c3586cf341318cee5941dab73f25') and (ActivationId eq 'a4cb2c286df54db89ddfa6a81ae7a4b8')) or ((RowKey eq 'user%2fsomeraondomuser_131c2342fa9f469ab2448122979901b2') and (ActivationId eq 'fb44869a714c49c6964ff7a14be19f77')) or ((RowKey eq 'user%2fsomeraondomuser_c01e6722572449bf9fd84be9911dd293') and (ActivationId eq 'cbfa2c14f69846ce9c3875b22652c5d9')) or ((RowKey eq 'user%2fsomeraondomuser_add4d77de01d455eaded6a1aa09185d2') and (ActivationId eq '6f9fa3a41f574fbebf7abcac08dd04b2')) or ((RowKey eq 'user%2fsomeraondomuser_ce38323206534df6a9764036fa08c6f9') and (ActivationId eq 'c0ec0e42e5fa4c03a5cb760d2c6323f5')) or ((RowKey eq 'user%2fsomeraondomuser_3f1d9bb315f84ef090977234ef50b78d') and (ActivationId eq '9314a7399ee24c039c05a1b242cd7dbd')) or ((RowKey eq 'user%2fsomeraondomuser_21cd31ddb97343d1b519799652af5a9a') and (ActivationId eq 'db93c80c878642f2974ca4589031c59c')) or ((RowKey eq 'user%2fsomeraondomuser_a53b1e377c774e539b9ee17e59d84028') and (ActivationId eq '12f4c570e1774c3f9cd5e9ba53ba24b0')) or ((RowKey eq 'user%2fsomeraondomuser_35629a332fb4418a8285c5a6e5ac1acb') and (ActivationId eq 'c6b4759436d9450aa5d6d06f0d493df3')) or ((RowKey eq 'user%2fsomeraondomuser_1fb4bd8083ed46c2a5a63acbba0f62f2') and (ActivationId eq '70b0af2656c04a7eb357556d5406bad1')) or ((RowKey eq 'user%2fsomeraondomuser_63968d03c6364bf281240cc5f66fa76d') and (ActivationId eq '2cc36dfd68a24892a3125ff93da1466c')) or ((RowKey eq 'user%2fsomeraondomuser_c1dac4848b6f42a2a49a5e74c8e23624') and (ActivationId eq 'bdd07a677e6841809f2580163d41f4cb')) or ((RowKey eq 'user%2fsomeraondomuser_e33ddf101a174c388a5f8b0b0aa589a5') and (ActivationId eq '71520233b5624b188e1f79b7acd64117')) or ((RowKey eq 'user%2fsomeraondomuser_1894548c3c164d88b28aa8ca81eec52e') and (ActivationId eq '4c5ffd05b895460695bb25e2f6445f80')) or ((RowKey eq 'user%2fsomeraondomuser_6072680f29f240cea960b4cb5d760a96') and (ActivationId eq 'a050286a236643bab071993b4816fe24')) or ((RowKey eq 'user%2fsomeraondomuser_530b499f40bc4d94830ac93e7cbf91c7') and (ActivationId eq '0b2848508785441aa8ac1b54ab74d37e')) or ((RowKey eq 'user%2fsomeraondomuser_fec06bded49c45629b38f019b2f2b1b5') and (ActivationId eq '963fb89616d6449fa26df30b0467fd3c')) or ((RowKey eq 'user%2fsomeraondomuser_f3163586cec543669edaa7a6b3dea09c') and (ActivationId eq '400088d1a343455ea5dbccd0e41aa143')) or ((RowKey eq 'user%2fsomeraondomuser_1d8cc8d9f1c149e4800b0982ca098cb4') and (ActivationId eq '1594d642ac864bebb1a24cec9e517fde')) or ((RowKey eq 'user%2fsomeraondomuser_cf63930ad32244e19795d6a36aab026b') and (ActivationId eq '7d79e95eea21479b84b294bb0163ed59')) or ((RowKey eq 'user%2fsomeraondomuser_f1a529712bc04e19b6a53b5900532059') and (ActivationId eq '53873144412d4846adff21d4efc3d83f')) or ((RowKey eq 'user%2fsomeraondomuser_ea51485ea2a145bd89a17c7584100c3a') and (ActivationId eq 'be0e6b64f793467691256ead12aa9232')) or ((RowKey eq 'user%2fsomeraondomuser_e007bb2d411f46dd90f0b1a426e66e93') and (ActivationId eq '1dd8fa52775748b385da70094b8b2094')) or ((RowKey eq 'user%2fsomeraondomuser_9ee4348df9c041ac9eace6ade2d76ecf') and (ActivationId eq '465722690f4f42df8cd602f7197d3be8')) or ((RowKey eq 'user%2fsomeraondomuser_b7307b3c66424fe3b1a7adb04e7477af') and (ActivationId eq '2956c4fbdda74079ba840a40f290cd7d')) or ((RowKey eq 'user%2fsomeraondomuser_92c5168aba054ba4bdf6d12fee1314f6') and (ActivationId eq 'ea1009a1d59d4550bbcb58978aef3cdd')) or ((RowKey eq 'user%2fsomeraondomuser_b454f3f44a0747f59a5b16bad9e468e1') and (ActivationId eq '6308e191701147e4a9a72bc3473fbdb2')) or ((RowKey eq 'user%2fsomeraondomuser_24af472a228f4c38b30b78c4ed9076f8') and (ActivationId eq '3e518a0f7a0f49149422f65c7043caa3')) or ((RowKey eq 'user%2fsomeraondomuser_574ddad0703a4b5d96d9231ab0e42fc7') and (ActivationId eq 'eb2baddcdc334ac3b5d4497b4adbd6a4')) or ((RowKey eq 'user%2fsomeraondomuser_3c772b3dfbab4de09523fd1805cc5ba2') and (ActivationId eq 'c64844c4eee14533b5d5319c25190908')) or ((RowKey eq 'user%2fsomeraondomuser_527e8e5da4d9469f9487af8e2566366d') and (ActivationId eq '461322a278544e90a0df05efdd840c46')) or ((RowKey eq 'user%2fsomeraondomuser_ef61d4ecc9544f5da29145c6f8bcfa9d') and (ActivationId eq '20f8029af34a4c3eaf24df390e89f427')) or ((RowKey eq 'user%2fsomeraondomuser_8678a87f705e41aba41c3925220f23fe') and (ActivationId eq '6cb3b765a2dd48958ef0537826804b4b')) or ((RowKey eq 'user%2fsomeraondomuser_d271d9a5cb354e0691dacaebdb9281f3') and (ActivationId eq '66ac01d677c34f9cae99dfb4cdaa00e5')) or ((RowKey eq 'user%2fsomeraondomuser_5d982fbac181413295310c6c8fc93c5f') and (ActivationId eq 'd94b900aec6249ee9e1856e3805b091b')) or ((RowKey eq 'user%2fsomeraondomuser_81b88cb28e69458d9b80067476f7c1af') and (ActivationId eq '2c53f55e7203418b91a360bdb28e5028')) or ((RowKey eq 'user%2fsomeraondomuser_a7ac9f7d851840579b8db4bf8ac61a7b') and (ActivationId eq '3c55ef4b112b4e4fbefd1df5ea871018')) or ((RowKey eq 'user%2fsomeraondomuser_3c100e76c2f14dcf97146a67a835c702') and (ActivationId eq '4e03bb4eb4364e6fa88f736b561eae82')) or ((RowKey eq 'user%2fsomeraondomuser_ff86a95db64f492d8c23296215ba1d54') and (ActivationId eq '4e29d0707ccb42e3b5b054eec8c040e4')) or ((RowKey eq 'user%2fsomeraondomuser_f443ac2a7bc9433bad7ec2b1c4228ef7') and (ActivationId eq 'b03811e7f6e94158a75912e71edffa06')) or ((RowKey eq 'user%2fsomeraondomuser_9baa6c0b81d34a6d8c9cef39d9a5f4e6') and (ActivationId eq '71cb5917ddf34a5baaf0f78810910a95')))", - expectedQuery: - "return ( ( item.properties.PartitionKey === '6e4ab0516fca4122bff05fb23a5f6adf' ) && ( ( ( item.properties.RowKey === 'user%2fsomeraondomuser_cf9e6f1fc7264c9c8148d6050e27ee3e' ) && ( item.properties.ActivationId === '512b5a68bc1c46b480a1a052da681f45' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_267f6d72c0874408a021043138c6e395' ) && ( item.properties.ActivationId === 'e195014973754b11ae1b74cb4be9aab1' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_34b4d10839ba48928a3ceee0ea6a1175' ) && ( item.properties.ActivationId === '4573eccdaf8d42148907fd3b654b72c3' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_931d172de3034561af4d210aa4007b8f' ) && ( item.properties.ActivationId === 'd3e7ffeb439b4acf912006b2f01aa5a9' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_6db90a01fab7429ca52698534629dd5d' ) && ( item.properties.ActivationId === '492fe8afa0514a919fc0c491afc88e18' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_b4710ac467ea46678d3b692d552b4573' ) && ( item.properties.ActivationId === 'ed3a90e556474a4486196d7d20c7e0a8' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_9a7d0ed9e934457790c4af955a5d0aa2' ) && ( item.properties.ActivationId === 'e6098dd0457a438b8c8810381e72b103' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_5f45717f56d14f6ebc1df2d3195609d8' ) && ( item.properties.ActivationId === '1001b0b9b2224ab08c9b3e1413e733e3' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_593e5eb5533f41998a6946d37748d1c4' ) && ( item.properties.ActivationId === '100df8cda69a4101bd038f097073dcf0' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_5c837b849f024914b694ebf978129210' ) && ( item.properties.ActivationId === 'd4b38859695c4b31892053e2f8f16ce1' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_0d59188361ed46b8967ff553fc31da22' ) && ( item.properties.ActivationId === 'cc235fce46ca4dcf9c24a12eda86a23e' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_46daebbc6d214de1b724a6d1bd909f2e' ) && ( item.properties.ActivationId === 'f901237d1de5466bb350013841f7e1d9' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_4bf3d38ef9664a17b8acbe6e6f4475e6' ) && ( item.properties.ActivationId === '0d8b22f41df443f4956b4cef9ddccc7b' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_7d157b7f3a3a4508a182b47394444a97' ) && ( item.properties.ActivationId === '391cbd2712e94a10b1e8f7f5566ad1d1' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_3173c9fea0124785a6dce8bb1ce22ff5' ) && ( item.properties.ActivationId === '5926f7967953443089276d4011de4586' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_855b9f1c9b1d4793b633dd312f97acee' ) && ( item.properties.ActivationId === 'acbb6b581b604bd9bdb7d8109ad80c25' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_0f11694546a049df89c234f5aca29594' ) && ( item.properties.ActivationId === '83a8b6c565e74569a3d1f358ae1b4767' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_5bd0f86dc2a74ba18848156fd4384fa0' ) && ( item.properties.ActivationId === '430dcf95b539468cbfb99886949840b5' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_85c207c588dd4c9697a921b29481152b' ) && ( item.properties.ActivationId === 'e114211645144d8581b279cc8b780879' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_d2d48e3e8e594b7ea755a6df291c55a4' ) && ( item.properties.ActivationId === 'a9f50b02fa634628b56622602733d2df' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_3f1c4bcf08c34efb8b64a40ee4e33698' ) && ( item.properties.ActivationId === 'e7180ac71c6a4fb3b5e68c3a6d3c5ce6' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_3871c563cd0e433fbb7d4ebbd6db4856' ) && ( item.properties.ActivationId === 'c05eab92d0b44f4b8ea57b6cf9339cc2' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_beb39451febe40aa9b51b051a5940b7c' ) && ( item.properties.ActivationId === '51998e3e875c4c499f4ebb14bc9a91e6' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_1258f93c3b054ee2b80a52f9f9bdc170' ) && ( item.properties.ActivationId === 'cb3d1fd19e2d45eeb0ebd9a704e6d576' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_b37d9915799047988a1b0598a47f7ba4' ) && ( item.properties.ActivationId === '2560bf1bcde5461eb4899ef8ae009a7a' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_37a27899265b4125ba98bc7fd2f9c000' ) && ( item.properties.ActivationId === '166e0f18cd744666b3684c406493945e' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_240b39fd90d94b54b0e923134b4cba55' ) && ( item.properties.ActivationId === '329c6825c2754dd3b18411083b7b58e4' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_e7c33f051c3c42a8883712e255635bbf' ) && ( item.properties.ActivationId === 'f127763cb6374f49bf52b7876e594147' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_3d5d8beeafac4b0aa6a146f7f2e5eadb' ) && ( item.properties.ActivationId === '6f89c9bda1d74977997b1415db56a21e' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_21d9c87ed89646e88be406cb57db4e1c' ) && ( item.properties.ActivationId === '640d3e743baa4c969e4292aa80efbac2' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_6d71d83c8083415a835943b18b9d6d99' ) && ( item.properties.ActivationId === 'd4f8417dab4544ed972b288bae03efa3' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_44253ea6cadc4165994fd4501998190b' ) && ( item.properties.ActivationId === 'a099990633bb441a852ff00266c372ee' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_169185ee08b446ee9a1dd329997f4b50' ) && ( item.properties.ActivationId === '6928aeac8dfe4caeb44b275d3765bb9c' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_5639229f610444df9ff2c3a598ba5ff3' ) && ( item.properties.ActivationId === 'afd94604d549455983d4bb043b9bf4fc' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_6e8177f40d924eecad86fe29cf042c5b' ) && ( item.properties.ActivationId === 'ef6dff8131634580a05602b12b3c7030' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_82c02c372d274b12b42eb613a94f0032' ) && ( item.properties.ActivationId === 'c629d8827dec4946918fac970b0b01fc' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_82d799f96a8341a888e823e7e6c680aa' ) && ( item.properties.ActivationId === '6a430683a6864d518747c5613aae81f7' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_eee54678565d4c62b3ee75ff595a639f' ) && ( item.properties.ActivationId === '05b779023a86487291c54274f2351763' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_d61b2e412be74d449cbe2e32c040b054' ) && ( item.properties.ActivationId === 'abd89950074c455eabf0ce6507cff05b' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_7d3b47e40a40403bac3c879f8ccc785a' ) && ( item.properties.ActivationId === 'f37b30e2b99944ad8951924d890d6514' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_fa9e78d2c68447928d3b5bcc7170f112' ) && ( item.properties.ActivationId === 'bc9c4dde5ba443dea12137e5da919c41' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_3bb66b8c2abb45c8b33e75ce4baa93ac' ) && ( item.properties.ActivationId === '49c8905d49bc47bc9fea7d859c7812dd' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_55b23534d04c4efe9d580c3740230486' ) && ( item.properties.ActivationId === '1322e451d37145f4b1b41559f30b58e9' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_8b8d04a70b8f43ab87d065e89d84aefb' ) && ( item.properties.ActivationId === '3f7b8e9d039d4d788597d5fe7bb37666' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_0d5ec8bb559d4e34a2d4c4b5d935386d' ) && ( item.properties.ActivationId === '6eb87695c16f4289b48374a57fcc2bab' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_a0ba488c7b0542d49cb2b406a7b3cca4' ) && ( item.properties.ActivationId === 'fb20d88f4b6d4193aad4511c8951ef59' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_25de238770ab41399d8cbe0343b9d0d3' ) && ( item.properties.ActivationId === 'b587806d63324a4084cde9c92af04065' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_7688796792e245d0913f050a3a7c6c02' ) && ( item.properties.ActivationId === 'd95909aedd96417f945834151d397f51' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_72967c3265ce4996b12001ea1814d62f' ) && ( item.properties.ActivationId === 'd046ebb2304b4ff0be1c9d5a4c8a8831' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_6238575aaee54a628caebb48b44584e5' ) && ( item.properties.ActivationId === '6ac73966adb6496cb2a4553c7b9fe8ce' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_fb89e80d21ed4b17a850f9021c4b1d2a' ) && ( item.properties.ActivationId === '3833b18cabc344dab1dbdbb62c99accd' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_f7aa848f4c7243b892fd979326884e3d' ) && ( item.properties.ActivationId === '6911fe2a462e44aab8a143603e1af98f' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_349234378ad34ec99c3ea00cb9149f80' ) && ( item.properties.ActivationId === '62e351ea6ba44be8b45b2cb1a42efea3' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_25707be4343f4f89955ea71bb2d75fe2' ) && ( item.properties.ActivationId === '757fdf560e6e4fb0acc1d0578bc4bc83' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_fdfe656c1e47438286a19ce4147201d1' ) && ( item.properties.ActivationId === '5f417d1d6d9c498da973d30a26ac4c0f' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_a4d0398c7b004774b638156dba8050b6' ) && ( item.properties.ActivationId === '824bfc22f638402c99aa844984bc6814' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_744afd919a134feb8167ea55d036a659' ) && ( item.properties.ActivationId === 'b3cc18bb13254e95befa49486e7b7b9c' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_6c8dbd201e6d4755a505586d669fb639' ) && ( item.properties.ActivationId === 'e1aae7d578604f018c757fe76af995dd' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_bcc2eecd8f6d4b53b22bc974e6ff5342' ) && ( item.properties.ActivationId === '97916e010c614aa9873307d81cda8447' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_be43c3586cf341318cee5941dab73f25' ) && ( item.properties.ActivationId === 'a4cb2c286df54db89ddfa6a81ae7a4b8' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_131c2342fa9f469ab2448122979901b2' ) && ( item.properties.ActivationId === 'fb44869a714c49c6964ff7a14be19f77' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_c01e6722572449bf9fd84be9911dd293' ) && ( item.properties.ActivationId === 'cbfa2c14f69846ce9c3875b22652c5d9' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_add4d77de01d455eaded6a1aa09185d2' ) && ( item.properties.ActivationId === '6f9fa3a41f574fbebf7abcac08dd04b2' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_ce38323206534df6a9764036fa08c6f9' ) && ( item.properties.ActivationId === 'c0ec0e42e5fa4c03a5cb760d2c6323f5' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_3f1d9bb315f84ef090977234ef50b78d' ) && ( item.properties.ActivationId === '9314a7399ee24c039c05a1b242cd7dbd' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_21cd31ddb97343d1b519799652af5a9a' ) && ( item.properties.ActivationId === 'db93c80c878642f2974ca4589031c59c' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_a53b1e377c774e539b9ee17e59d84028' ) && ( item.properties.ActivationId === '12f4c570e1774c3f9cd5e9ba53ba24b0' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_35629a332fb4418a8285c5a6e5ac1acb' ) && ( item.properties.ActivationId === 'c6b4759436d9450aa5d6d06f0d493df3' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_1fb4bd8083ed46c2a5a63acbba0f62f2' ) && ( item.properties.ActivationId === '70b0af2656c04a7eb357556d5406bad1' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_63968d03c6364bf281240cc5f66fa76d' ) && ( item.properties.ActivationId === '2cc36dfd68a24892a3125ff93da1466c' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_c1dac4848b6f42a2a49a5e74c8e23624' ) && ( item.properties.ActivationId === 'bdd07a677e6841809f2580163d41f4cb' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_e33ddf101a174c388a5f8b0b0aa589a5' ) && ( item.properties.ActivationId === '71520233b5624b188e1f79b7acd64117' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_1894548c3c164d88b28aa8ca81eec52e' ) && ( item.properties.ActivationId === '4c5ffd05b895460695bb25e2f6445f80' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_6072680f29f240cea960b4cb5d760a96' ) && ( item.properties.ActivationId === 'a050286a236643bab071993b4816fe24' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_530b499f40bc4d94830ac93e7cbf91c7' ) && ( item.properties.ActivationId === '0b2848508785441aa8ac1b54ab74d37e' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_fec06bded49c45629b38f019b2f2b1b5' ) && ( item.properties.ActivationId === '963fb89616d6449fa26df30b0467fd3c' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_f3163586cec543669edaa7a6b3dea09c' ) && ( item.properties.ActivationId === '400088d1a343455ea5dbccd0e41aa143' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_1d8cc8d9f1c149e4800b0982ca098cb4' ) && ( item.properties.ActivationId === '1594d642ac864bebb1a24cec9e517fde' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_cf63930ad32244e19795d6a36aab026b' ) && ( item.properties.ActivationId === '7d79e95eea21479b84b294bb0163ed59' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_f1a529712bc04e19b6a53b5900532059' ) && ( item.properties.ActivationId === '53873144412d4846adff21d4efc3d83f' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_ea51485ea2a145bd89a17c7584100c3a' ) && ( item.properties.ActivationId === 'be0e6b64f793467691256ead12aa9232' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_e007bb2d411f46dd90f0b1a426e66e93' ) && ( item.properties.ActivationId === '1dd8fa52775748b385da70094b8b2094' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_9ee4348df9c041ac9eace6ade2d76ecf' ) && ( item.properties.ActivationId === '465722690f4f42df8cd602f7197d3be8' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_b7307b3c66424fe3b1a7adb04e7477af' ) && ( item.properties.ActivationId === '2956c4fbdda74079ba840a40f290cd7d' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_92c5168aba054ba4bdf6d12fee1314f6' ) && ( item.properties.ActivationId === 'ea1009a1d59d4550bbcb58978aef3cdd' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_b454f3f44a0747f59a5b16bad9e468e1' ) && ( item.properties.ActivationId === '6308e191701147e4a9a72bc3473fbdb2' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_24af472a228f4c38b30b78c4ed9076f8' ) && ( item.properties.ActivationId === '3e518a0f7a0f49149422f65c7043caa3' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_574ddad0703a4b5d96d9231ab0e42fc7' ) && ( item.properties.ActivationId === 'eb2baddcdc334ac3b5d4497b4adbd6a4' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_3c772b3dfbab4de09523fd1805cc5ba2' ) && ( item.properties.ActivationId === 'c64844c4eee14533b5d5319c25190908' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_527e8e5da4d9469f9487af8e2566366d' ) && ( item.properties.ActivationId === '461322a278544e90a0df05efdd840c46' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_ef61d4ecc9544f5da29145c6f8bcfa9d' ) && ( item.properties.ActivationId === '20f8029af34a4c3eaf24df390e89f427' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_8678a87f705e41aba41c3925220f23fe' ) && ( item.properties.ActivationId === '6cb3b765a2dd48958ef0537826804b4b' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_d271d9a5cb354e0691dacaebdb9281f3' ) && ( item.properties.ActivationId === '66ac01d677c34f9cae99dfb4cdaa00e5' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_5d982fbac181413295310c6c8fc93c5f' ) && ( item.properties.ActivationId === 'd94b900aec6249ee9e1856e3805b091b' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_81b88cb28e69458d9b80067476f7c1af' ) && ( item.properties.ActivationId === '2c53f55e7203418b91a360bdb28e5028' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_a7ac9f7d851840579b8db4bf8ac61a7b' ) && ( item.properties.ActivationId === '3c55ef4b112b4e4fbefd1df5ea871018' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_3c100e76c2f14dcf97146a67a835c702' ) && ( item.properties.ActivationId === '4e03bb4eb4364e6fa88f736b561eae82' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_ff86a95db64f492d8c23296215ba1d54' ) && ( item.properties.ActivationId === '4e29d0707ccb42e3b5b054eec8c040e4' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_f443ac2a7bc9433bad7ec2b1c4228ef7' ) && ( item.properties.ActivationId === 'b03811e7f6e94158a75912e71edffa06' ) ) || ( ( item.properties.RowKey === 'user%2fsomeraondomuser_9baa6c0b81d34a6d8c9cef39d9a5f4e6' ) && ( item.properties.ActivationId === '71cb5917ddf34a5baaf0f78810910a95' ) ) ) )" - } - ]; - - for (const test of testArray) { - const queryTranscriber = - LokiJsQueryTranscriberFactory.createTableQueryTranscriber( - test.originalQuery, - "stateMachineTest" - ); - - queryTranscriber.transcribe(); - assert.strictEqual( - queryTranscriber.getTranscribedQuery(), - test.expectedQuery, - `Transcribed query "${queryTranscriber.getTranscribedQuery()}" did not match expected ${ - test.expectedQuery - }` - ); - } - }); -}); diff --git a/tests/table/unit/query.interpreter.unit.test.ts b/tests/table/unit/query.interpreter.unit.test.ts new file mode 100644 index 000000000..7a8af1375 --- /dev/null +++ b/tests/table/unit/query.interpreter.unit.test.ts @@ -0,0 +1,271 @@ +import * as assert from "assert"; +import parseQuery from "../../../src/table/persistence/QueryInterpreter/QueryParser"; +import { IQueryContext } from "../../../src/table/persistence/QueryInterpreter/IQueryContext"; +import executeQuery from "../../../src/table/persistence/QueryInterpreter/QueryInterpreter"; +import { Entity, Table } from "../../../src/table/persistence/ITableMetadataStore"; + +describe("Query Interpreter", () => { + function runTestCases(name: string, context: IQueryContext, testCases: { + name: string + originalQuery: string + expectedResult: any + }[]) { + describe(name, () => { + for (const test of testCases) { + it(test.name, () => { + const queryTree = parseQuery(test.originalQuery) + assert.strictEqual(executeQuery(context, queryTree), test.expectedResult, "it should execute the query tree correctly") + }) + } + }) + } + + const referenceEntity: Entity = { + PartitionKey: "testPartition", + RowKey: "testRow", + eTag: "testETag", + lastModifiedTime: "2023-05-29T15:30:00Z", + properties: { + test: "test", + int32: 123, + int64: "123.01", + double: -123.01, + bool: true, + date: "2020-01-01T00:00:00.000Z", + guid: Buffer.from("00000000-0000-0000-0000-000000000000").toString("base64"), + guidLegacy: "00000000-0000-0000-0000-000000000000", + binary: Buffer.from("binaryData").toString("base64"), + emptyString: "", + } + }; + + const referenceTable: Table = { + table: "testTable", + account: "testAccount", + }; + + describe("Built-in Identifiers", () => { + runTestCases("PartitionKey", referenceEntity, [ + { + name: "PartitionKey equality", + originalQuery: "PartitionKey eq 'testPartition'", + expectedResult: true + }, + { + name: "PartitionKey equality (doesn't match)", + originalQuery: "PartitionKey eq 'testPartition2'", + expectedResult: false + } + ]) + + runTestCases("RowKey", referenceEntity, [ + { + name: "RowKey equality", + originalQuery: "RowKey eq 'testRow'", + expectedResult: true + }, + { + name: "RowKey equality (doesn't match)", + originalQuery: "RowKey eq 'testRow2'", + expectedResult: false + }, + { + name: "PartitionKey equality and RowKey range", + originalQuery: "PartitionKey eq 'testPartition' and RowKey gt 'testRoom' and RowKey lt 'testRoxy'", + expectedResult: true + }, + { + name: "PartitionKey equality and RowKey range (doesn't match)", + originalQuery: "PartitionKey eq 'testPartition' and RowKey gt 'testAnt' and RowKey lt 'testMoose'", + expectedResult: false + } + ]) + + runTestCases("TableName", referenceTable, [ + { + name: "TableName equality", + originalQuery: "TableName eq 'testTable'", + expectedResult: true + }, + { + name: "TableName equality (doesn't match)", + originalQuery: "TableName eq 'testTable2'", + expectedResult: false + }, + ]) + }) + + describe("Logical Operators", () => { + runTestCases("and", referenceEntity, [ + { + name: "PartitionKey equality and RowKey range", + originalQuery: "PartitionKey eq 'testPartition' and RowKey gt 'testRoom' and RowKey lt 'testRoxy'", + expectedResult: true + }, + { + name: "PartitionKey equality and RowKey range (doesn't match)", + originalQuery: "PartitionKey eq 'testPartition' and RowKey gt 'testAnt' and RowKey lt 'testMoose'", + expectedResult: false + } + ]) + + runTestCases("or", referenceEntity, [ + { + name: "PartitionKey set", + originalQuery: "PartitionKey eq 'testPartition' or PartitionKey eq 'testPartition2'", + expectedResult: true + }, + { + name: "PartitionKey set (doesn't match)", + originalQuery: "PartitionKey eq 'testPartition2' or PartitionKey eq 'testPartition3'", + expectedResult: false + } + ]) + + runTestCases("not", referenceEntity, [ + { + name: "PartitionKey not equal", + originalQuery: "not PartitionKey eq 'testPartition'", + expectedResult: false + }, + { + name: "PartitionKey not equal (matches)", + originalQuery: "not PartitionKey eq 'testPartition2'", + expectedResult: true + } + ]) + }) + + describe("Comparison Operators", () => { + runTestCases("eq", referenceEntity, [ + { + name: "PartitionKey equality", + originalQuery: "PartitionKey eq 'testPartition'", + expectedResult: true + }, + { + name: "PartitionKey equality (doesn't match)", + originalQuery: "PartitionKey eq 'testPartition2'", + expectedResult: false + }, + { + name: "Property equality", + originalQuery: "test eq 'test'", + expectedResult: true + }, + { + name: "Property equality (doesn't match)", + originalQuery: "test eq 'test2'", + expectedResult: false + }, + { + name: "GUID equality (modern)", + originalQuery: "guid eq guid'00000000-0000-0000-0000-000000000000'", + expectedResult: true + }, + { + name: "GUID equality (modern) (doesn't match)", + originalQuery: "guid eq guid'00000000-0000-0000-0000-000000000001'", + expectedResult: false + }, + { + name: "GUID equality (legacy)", + originalQuery: "guidLegacy eq guid'00000000-0000-0000-0000-000000000000'", + expectedResult: true + }, + { + name: "GUID equality (legacy) (doesn't match)", + originalQuery: "guidLegacy eq guid'00000000-0000-0000-0000-000000000001'", + expectedResult: false + }, + { + name: "Binary equality", + originalQuery: "binary eq binary'62696e61727944617461'", + expectedResult: true + }, + { + name: "Binary equality (doesn't match)", + originalQuery: "binary eq binary'000000000000'", + expectedResult: false + } + ]) + }) + + describe("Values", () => { + runTestCases("Booleans", referenceEntity, [ + { + name: "true", + originalQuery: "bool eq true", + expectedResult: true + }, + { + name: "false", + originalQuery: "bool eq false", + expectedResult: false + }, + { + name: "Compound queries using booleans", + originalQuery: "(true and RowKey eq 'testRow') and (false or PartitionKey eq 'testPartition')", + expectedResult: true + } + ]) + + runTestCases("GUIDs", referenceEntity, [ + { + name: "GUID equality (modern)", + originalQuery: "guid eq guid'00000000-0000-0000-0000-000000000000'", + expectedResult: true + }, + { + name: "GUID equality (modern) (doesn't match)", + originalQuery: "guid eq guid'00000000-0000-0000-0000-000000000001'", + expectedResult: false + }, + { + name: "GUID equality (legacy)", + originalQuery: "guidLegacy eq guid'00000000-0000-0000-0000-000000000000'", + expectedResult: true + }, + { + name: "GUID equality (legacy) (doesn't match)", + originalQuery: "guidLegacy eq guid'00000000-0000-0000-0000-000000000001'", + expectedResult: false + }, + { + name: "GUID inequality (modern)", + originalQuery: "guid ne guid'22222222-2222-2222-2222-222222222222'", + expectedResult: true + }, + { + name: "GUID inequality (legacy)", + originalQuery: "guidLegacy ne guid'22222222-2222-2222-2222-222222222222'", + expectedResult: true + } + ]) + }) + + describe("Regression Tests", () => { + runTestCases("Issue #1929: Querying non-existent fields", referenceEntity, [ + { + name: "Empty string fields should be queryable", + originalQuery: "emptyString eq ''", + expectedResult: true + }, + { + name: "Empty string fields should be queryable (doesn't match)", + originalQuery: "emptyString ne ''", + expectedResult: false + }, + { + name: "Empty string queries using ne should not match fields with a value", + originalQuery: "test ne ''", + expectedResult: true + }, + { + name: "Non-existent fields should not be queryable", + originalQuery: "nonExistent ne ''", + expectedResult: false + } + ]) + }) +}) \ No newline at end of file diff --git a/tests/table/unit/query.lexer.unit.test.ts b/tests/table/unit/query.lexer.unit.test.ts new file mode 100644 index 000000000..c064dc53c --- /dev/null +++ b/tests/table/unit/query.lexer.unit.test.ts @@ -0,0 +1,157 @@ +import assert from "assert"; +import { QueryLexer } from "../../../src/table/persistence/QueryInterpreter/QueryLexer" + +describe("Query Lexer", () => { + function runTestCases(name: string, testCases: { + name: string; + query: string; + tokens: string[]; + }[]) { + describe(name, () => { + for (const test of testCases) { + it(test.name, () => { + const lexer = new QueryLexer(test.query); + + const tokens = []; + let token; + while (token = lexer.next()) { + tokens.push(token.kind); + if (token.kind === "end-of-query") { + break; + } + } + + assert.deepStrictEqual(tokens, test.tokens, "it should lex the query correctly"); + }) + } + }) + } + + runTestCases("Simple Queries", [ + { + name: "PartitionKey equality", + query: "PartitionKey eq 'testPartition'", + tokens: [ + "identifier", + "comparison-operator", + "string", + "end-of-query" + ] + }, + { + name: "Type Hints", + query: "PartitionKey ne guid'00000000-0000-0000-0000-000000000000'", + tokens: [ + "identifier", + "comparison-operator", + "type-hint", + "string", + "end-of-query" + ] + }, + { + name: "Parenthesis", + query: "(PartitionKey eq 'testPartition') and (RowKey eq 'testRow')", + tokens: [ + "open-paren", + "identifier", + "comparison-operator", + "string", + "close-paren", + "logic-operator", + "open-paren", + "identifier", + "comparison-operator", + "string", + "close-paren", + "end-of-query" + ] + }, + { + name: "Not", + query: "not (PartitionKey eq 'testPartition')", + tokens: [ + "unary-operator", + "open-paren", + "identifier", + "comparison-operator", + "string", + "close-paren", + "end-of-query" + ] + }, + { + name: "Not (no space)", + query: "not(PartitionKey eq 'testPartition')", + tokens: [ + "unary-operator", + "open-paren", + "identifier", + "comparison-operator", + "string", + "close-paren", + "end-of-query" + ] + }, + { + name: "Type Hint name as identifier", + query: "PartitionKey gt guid", + tokens: [ + "identifier", + "comparison-operator", + "identifier", + "end-of-query" + ] + }, + { + name: "Strings with escaped characters (single-quotes)", + query: "PartitionKey ge 'test''Partition'", + tokens: [ + "identifier", + "comparison-operator", + "string", + "end-of-query" + ] + }, + { + name: "Strings with escaped characters (double-quotes)", + query: "PartitionKey le \"test\"\"Partition\"", + tokens: [ + "identifier", + "comparison-operator", + "string", + "end-of-query" + ] + }, + { + name: "Strings with escaped characters at the start and end", + query: "PartitionKey lt '''''test'''''", + tokens: [ + "identifier", + "comparison-operator", + "string", + "end-of-query" + ] + }, + { + name: "Booleans (true)", + query: "PartitionKey eq true", + tokens: [ + "identifier", + "comparison-operator", + "bool", + "end-of-query" + ] + }, + { + name: "Booleans (false)", + query: "PartitionKey eq false", + tokens: [ + "identifier", + "comparison-operator", + "bool", + "end-of-query" + ] + } + ]); +}) \ No newline at end of file diff --git a/tests/table/unit/query.parser.unit.test.ts b/tests/table/unit/query.parser.unit.test.ts new file mode 100644 index 000000000..f7f8c900d --- /dev/null +++ b/tests/table/unit/query.parser.unit.test.ts @@ -0,0 +1,487 @@ +import * as assert from "assert"; +import parseQuery from "../../../src/table/persistence/QueryInterpreter/QueryParser"; + +describe("Query Parser", () => { + function runTestCases(name: string, testCases: { + name: string + originalQuery: string + expectedQuery: string + }[]) { + describe(name, () => { + for (const test of testCases) { + it(test.name, () => { + const queryTree = parseQuery(test.originalQuery) + assert.strictEqual(queryTree.toString(), test.expectedQuery, "it should parse the query tree correctly") + }) + } + }) + } + + runTestCases("Whitespace Handling", [ + { + name: "Normalizes irregular whitespace", + originalQuery: " PartitionKey eq 'test1' ", + expectedQuery: '(eq (id PartitionKey) "test1")' + } + ]) + + describe("Unary Operators", () => { + runTestCases("Groups", [ + { + name: "Parses basic expression groups", + originalQuery: "(PartitionKey eq 'test')", + expectedQuery: '(eq (id PartitionKey) "test")' + } + ]) + + runTestCases("not", [ + { + name: "Parses NOT expressions", + originalQuery: "not PartitionKey eq 'test'", + expectedQuery: '(not (eq (id PartitionKey) "test"))' + }, + { + name: "NOT takes precedence over EQ", + originalQuery: "not PartitionKey eq 'test'", + expectedQuery: "(not (eq (id PartitionKey) \"test\"))" + }, + { + name: "Wrapping another condition", + originalQuery: "not (PartitionKey eq 'test')", + expectedQuery: "(not (eq (id PartitionKey) \"test\"))" + }, + { + name: "Wrapping an expresssion group", + originalQuery: "not (PartitionKey lt 'Part2')", + expectedQuery: "(not (lt (id PartitionKey) \"Part2\"))" + } + ]) + }) + + describe("Binary Operators", () => { + runTestCases("AND", [ + // Operator Precedence: https://learn.microsoft.com/en-us/openspecs/windows_protocols/ms-odata/f3380585-3f87-41d9-a2dc-ff46cc38e7a6 + { + name: "AND takes precedence over NOT", + originalQuery: "not PartitionKey eq 'test' and PartitionKey eq 'test2'", + expectedQuery: "(and (not (eq (id PartitionKey) \"test\")) (eq (id PartitionKey) \"test2\"))" + }, + { + name: "Precedence works with complex queries", + originalQuery: "(true and RowKey eq '1') and ((false or PartitionKey eq 'partition1') or PartitionKey eq 'partition2') or PartitionKey eq 'partition3'", + expectedQuery: '(or (and (and true (eq (id RowKey) "1")) (or (or false (eq (id PartitionKey) "partition1")) (eq (id PartitionKey) "partition2"))) (eq (id PartitionKey) "partition3"))' + }, + { + name: "Basic AND", + originalQuery: "PartitionKey eq 'test' and RowKey eq 'test2'", + expectedQuery: "(and (eq (id PartitionKey) \"test\") (eq (id RowKey) \"test2\"))" + } + ]) + + runTestCases("OR", [ + // Operator Precedence: https://learn.microsoft.com/en-us/openspecs/windows_protocols/ms-odata/f3380585-3f87-41d9-a2dc-ff46cc38e7a6 + { + name: "OR takes precedence over AND", + originalQuery: "PartitionKey eq 'test' or PartitionKey eq 'test2' and RowKey eq 'test3'", + expectedQuery: "(or (eq (id PartitionKey) \"test\") (and (eq (id PartitionKey) \"test2\") (eq (id RowKey) \"test3\")))" + }, + { + name: "Basic OR", + originalQuery: "PartitionKey eq 'test' or RowKey eq 'test2'", + expectedQuery: "(or (eq (id PartitionKey) \"test\") (eq (id RowKey) \"test2\"))" + } + ]) + + runTestCases("Comparisons", [ + { + name: "Are order invariant for constants and fields", + originalQuery: "'test' eq PartitionKey", + expectedQuery: '(eq "test" (id PartitionKey))' + }, + { + name: "Supports PartitionKey equals", + originalQuery: "PartitionKey eq 'test'", + expectedQuery: '(eq (id PartitionKey) "test")' + }, + { + name: "Supports PartitionKey not equals", + originalQuery: "PartitionKey ne 'test'", + expectedQuery: '(ne (id PartitionKey) "test")' + }, + { + name: "Supports PartitionKey greater than", + originalQuery: "PartitionKey gt 'test'", + expectedQuery: '(gt (id PartitionKey) "test")' + }, + { + name: "Supports PartitionKey greater than or equal to", + originalQuery: "PartitionKey ge 'test'", + expectedQuery: '(ge (id PartitionKey) "test")' + }, + { + name: "Supports PartitionKey less than", + originalQuery: "PartitionKey lt 'test'", + expectedQuery: '(lt (id PartitionKey) "test")' + }, + { + name: "Supports PartitionKey less than or equal to", + originalQuery: "PartitionKey le 'test'", + expectedQuery: '(le (id PartitionKey) "test")' + }, + { + name: "Supports RowKey equals", + originalQuery: "RowKey eq 'test'", + expectedQuery: '(eq (id RowKey) "test")' + }, + { + name: "Supports RowKey not equals", + originalQuery: "RowKey ne 'test'", + expectedQuery: '(ne (id RowKey) "test")' + }, + { + name: "Supports RowKey greater than", + originalQuery: "RowKey gt 'test'", + expectedQuery: '(gt (id RowKey) "test")' + }, + { + name: "Supports RowKey greater than or equal to", + originalQuery: "RowKey ge 'test'", + expectedQuery: '(ge (id RowKey) "test")' + }, + { + name: "Supports RowKey less than", + originalQuery: "RowKey lt 'test'", + expectedQuery: '(lt (id RowKey) "test")' + }, + { + name: "Supports RowKey less than or equal to", + originalQuery: "RowKey le 'test'", + expectedQuery: '(le (id RowKey) "test")' + }, + { + name: "Supports TableName equals", + originalQuery: "TableName eq 'test'", + expectedQuery: '(eq (id TableName) "test")' + }, + { + name: "Supports TableName not equals", + originalQuery: "TableName ne 'test'", + expectedQuery: '(ne (id TableName) "test")' + }, + { + name: "Supports TableName greater than", + originalQuery: "TableName gt 'test'", + expectedQuery: '(gt (id TableName) "test")' + }, + { + name: "Supports TableName greater than or equal to", + originalQuery: "TableName ge 'test'", + expectedQuery: '(ge (id TableName) "test")' + }, + { + name: "Supports TableName less than", + originalQuery: "TableName lt 'test'", + expectedQuery: '(lt (id TableName) "test")' + }, + { + name: "Supports TableName less than or equal to", + originalQuery: "TableName le 'test'", + expectedQuery: '(le (id TableName) "test")' + } + ]) + }) + + describe("Identifiers", () => { + runTestCases("Properties", [ + { + name: "Handles identifiers with leading underscores", + originalQuery: "_myProperty eq 'test'", + expectedQuery: '(eq (id _myProperty) "test")' + } + ]) + }) + + describe("Value Types", () => { + runTestCases("Booleans", [ + { + name: "Correctly handles boolean (true) values", + originalQuery: "myBoolean eq true", + expectedQuery: "(eq (id myBoolean) true)" + }, + { + name: "Correctly handles boolean (false) values", + originalQuery: "myBoolean eq false", + expectedQuery: "(eq (id myBoolean) false)" + }, + { + name: "Correctly handles boolean (true) values with variable casing", + originalQuery: "myBoolean eq TRue", + expectedQuery: "(eq (id myBoolean) true)" + }, + { + name: "Correctly handles boolean (false) values with variable casing", + originalQuery: "myBoolean eq faLSE", + expectedQuery: "(eq (id myBoolean) false)" + } + ]) + + runTestCases("Doubles", [ + { + name: "Correctly handles doubles", + originalQuery: "myDouble lt 123.01", + expectedQuery: "(lt (id myDouble) 123.01)" + }, + { + name: "Correctly handles doubles with a negative sign", + originalQuery: "myDouble gt -123.01", + expectedQuery: "(gt (id myDouble) -123.01)" + } + ]) + + runTestCases("Integers", [ + { + name: "Correctly handles integers", + originalQuery: "myInt lt 123", + expectedQuery: "(lt (id myInt) 123)" + }, + { + name: "Correctly handles integers with a negative sign", + originalQuery: "myInt gt -123", + expectedQuery: "(gt (id myInt) -123)" + }, + { + name: "Correctly parses integer equality", + originalQuery: "1 eq 1", + expectedQuery: "(eq 1 1)" + } + ]) + + runTestCases("Longs", [ + { + name: "Correctly handles longs", + originalQuery: "myInt lt 123.01L", + expectedQuery: "(lt (id myInt) \"123.01\")" + }, + { + name: "Correctly handles longs with a negative sign", + originalQuery: "myInt gt -123.01L", + expectedQuery: "(gt (id myInt) \"-123.01\")" + } + ]) + + runTestCases("Strings", [ + { + name: "Correctly handles strings wrapped with apostrophes", + originalQuery: "myString eq 'test'", + expectedQuery: "(eq (id myString) \"test\")" + }, + { + name: "Correctly handles strings wrapped with double quotes", + originalQuery: "myString eq \"test\"", + expectedQuery: "(eq (id myString) \"test\")" + }, + { + name: "Correctly handles strings that look like boolean values", + originalQuery: "myString eq 'true'", + expectedQuery: "(eq (id myString) \"true\")" + }, + { + name: "Correctly handles strings that look like integer values", + originalQuery: "myString eq '123'", + expectedQuery: "(eq (id myString) \"123\")" + }, + { + name: "Correctly handles strings which are empty", + originalQuery: "myString eq ''", + expectedQuery: "(eq (id myString) \"\")" + }, + { + name: "Correctly handles strings which are empty with double quotes", + originalQuery: "myString eq \"\"", + expectedQuery: "(eq (id myString) \"\")" + }, + { + name: "Correctly handles strings which are single-characters long", + originalQuery: "myString eq 'a'", + expectedQuery: "(eq (id myString) \"a\")" + }, + { + name: "Correctly handles strings which are single-characters long with double quotes", + originalQuery: "myString eq \"a\"", + expectedQuery: "(eq (id myString) \"a\")" + }, + { + name: "Correctly handles whitespace only strings", + originalQuery: "myString eq ' '", + expectedQuery: "(eq (id myString) \" \")" + }, + { + name: "Correctly handles whitespace only strings with double quotes", + originalQuery: "myString eq \" \"", + expectedQuery: "(eq (id myString) \" \")" + }, + { + name: "Handle escaped single-quotes", + originalQuery: "myString eq 'Foo '' Bar'", + expectedQuery: "(eq (id myString) \"Foo ' Bar\")" + }, + { + name: "Handle multiple escaped single-quotes", + originalQuery: "myString eq 'Foo '''' Bar'", + expectedQuery: "(eq (id myString) \"Foo '' Bar\")" + }, + { + name: "Handles escaped single-quotes at the end of the string", + originalQuery: "myString eq 'Foo Bar'''", + expectedQuery: "(eq (id myString) \"Foo Bar'\")" + }, + { + name: "Handles escaped single-quotes at the start of the string", + originalQuery: "myString eq '''Foo Bar'", + expectedQuery: "(eq (id myString) \"'Foo Bar\")" + }, + { + name: "Handles escaped single-quotes when they are the entirety of the string (1)", + originalQuery: "myString eq ''''", + expectedQuery: "(eq (id myString) \"'\")" + }, + { + name: "Handles escaped single-quotes when they are the entirety of the string (2)", + originalQuery: "myString eq ''''''", + expectedQuery: "(eq (id myString) \"''\")" + }, + { + name: "Handles escaped single-quotes when they are the entirety of the string (3)", + originalQuery: "myString eq ''''''''", + expectedQuery: "(eq (id myString) \"'''\")" + }, + { + name: "Handles escaped single-quotes when they are the entirety of the string (4)", + originalQuery: "myString eq ''''''''''", + expectedQuery: "(eq (id myString) \"''''\")" + }, + { + name: "Handle escaped double-quotes", + originalQuery: "myString eq \"Foo \"\" Bar\"", + expectedQuery: "(eq (id myString) \"Foo \\\" Bar\")" + }, + { + name: "Handle multiple escaped double-quotes", + originalQuery: "myString eq \"Foo \"\"\"\" Bar\"", + expectedQuery: "(eq (id myString) \"Foo \\\"\\\" Bar\")" + }, + { + name: "Handle escaped single-quotes without spaces (1)", + originalQuery: "PartitionKey eq 'Iam''good''atTypeScript'", + expectedQuery: "(eq (id PartitionKey) \"Iam'good'atTypeScript\")" + }, + { + name: "Handle escaped single-quotes without spaces (2)", + originalQuery: "PartitionKey eq 'Isn''tThisANastyPK'", + expectedQuery: "(eq (id PartitionKey) \"Isn'tThisANastyPK\")" + }, + { + name: "Handle strings which contain backticks", + originalQuery: "myString eq 'Foo ` Bar'", + expectedQuery: "(eq (id myString) \"Foo ` Bar\")" + } + ]) + + runTestCases("GUIDs", [ + { + name: "Correctly handles GUIDs", + originalQuery: "myGuid eq guid'12345678-1234-1234-1234-123456789012'", + expectedQuery: "(eq (id myGuid) (guid 12345678-1234-1234-1234-123456789012))" + }, + { + name: "Correctly handles GUIDs with a variable casing", + originalQuery: "myGuid eq GUID'12345678-1234-1234-1234-123456789012'", + expectedQuery: "(eq (id myGuid) (guid 12345678-1234-1234-1234-123456789012))" + }, + { + name: "Correctly handles GUIDs in complex queries", + originalQuery: "(PartitionKey eq '1168485761365502459') and (guidField ge guid'22222222-2222-2222-2222-222222222222')", + expectedQuery: "(and (eq (id PartitionKey) \"1168485761365502459\") (ge (id guidField) (guid 22222222-2222-2222-2222-222222222222)))" + } + ]) + + runTestCases("DateTimes", [ + { + name: "Correctly handles DateTimes", + originalQuery: "myDateTime eq datetime'2020-01-01T00:00:00.000Z'", + expectedQuery: "(eq (id myDateTime) (datetime 2020-01-01T00:00:00.000Z))" + }, + { + name: "Correctly handles DateTimes with a variable casing", + originalQuery: "myDateTime eq DATETIME'2020-01-01T00:00:00.000Z'", + expectedQuery: "(eq (id myDateTime) (datetime 2020-01-01T00:00:00.000Z))" + }, + { + name: "Correctly handles DateTimes in a complex query", + originalQuery: "myDateTime lt datetime'2020-01-01T00:00:00.000Z' and number gt 11 and PartitionKey eq 'partition1'", + expectedQuery: "(and (lt (id myDateTime) (datetime 2020-01-01T00:00:00.000Z)) (and (gt (id number) 11) (eq (id PartitionKey) \"partition1\")))" + } + ]) + + runTestCases("Binary", [ + { + name: "Correctly handles binary data with the binary'...' marker", + originalQuery: "myBinary eq binary'62696e61727944617461'", + expectedQuery: "(eq (id myBinary) (binary 62696e61727944617461))" + }, + { + name: "Correctly handles binary data with the binary'...' marker with variable casing", + originalQuery: "myBinary eq BINARY'62696e61727944617461'", + expectedQuery: "(eq (id myBinary) (binary 62696e61727944617461))" + }, + { + name: "Correctly handles binary data with the X'...' marker", + originalQuery: "myBinary eq X'62696e61727944617461'", + expectedQuery: "(eq (id myBinary) (binary 62696e61727944617461))" + }, + ]) + }) + + runTestCases("Nasty Queries", [ + { + name: "Handles horrible attempts to encode queries into strings", + originalQuery: "please eq 'never query ''this'' eq this or suchandsuch eq ''worse'''", + expectedQuery: "(eq (id please) \"never query 'this' eq this or suchandsuch eq 'worse'\")" + } + ]) + + describe("Invalid Queries", () => { + const testCases = [ + { + name: "Invalid equality operator", + query: "(1 === 1)" + }, + { + name: "Unexpected value (2)", + query: "1 1" + }, + { + name: "Unexpected value (3)", + query: "(1 1 1)" + }, + { + name: "Chained operators", + query: "PartitionKey eq 'test' eq 'test2'" + }, + { + name: "Duplicate comparison operators", + query: "PartitionKey eq eq 'test'" + }, + { + name: "Duplicate conditional operators", + query: "PartitionKey eq 'test' and and number gt 11" + } + ] + + for (const testCase of testCases) { + it(testCase.name, () => { + assert.throws(() => parseQuery(testCase.query), Error, "it should throw an error an error while parsing") + }) + } + }) +}) \ No newline at end of file From 1f3a40c2066fd869865ad8da0a971ff3ceb83aef Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 13 Jun 2023 09:55:09 +0800 Subject: [PATCH 121/297] Bump @typescript-eslint/eslint-plugin from 5.59.9 to 5.59.11 (#2004) Bumps [@typescript-eslint/eslint-plugin](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/eslint-plugin) from 5.59.9 to 5.59.11. - [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases) - [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/eslint-plugin/CHANGELOG.md) - [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v5.59.11/packages/eslint-plugin) --- updated-dependencies: - dependency-name: "@typescript-eslint/eslint-plugin" dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 437 +++++++++++++++------------------------------- 1 file changed, 138 insertions(+), 299 deletions(-) diff --git a/package-lock.json b/package-lock.json index 4c08bc00f..1e6b8925a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1583,15 +1583,15 @@ } }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.59.9", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.59.9.tgz", - "integrity": "sha512-4uQIBq1ffXd2YvF7MAvehWKW3zVv/w+mSfRAu+8cKbfj3nwzyqJLNcZJpQ/WZ1HLbJDiowwmQ6NO+63nCA+fqA==", + "version": "5.59.11", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.59.11.tgz", + "integrity": "sha512-XxuOfTkCUiOSyBWIvHlUraLw/JT/6Io1365RO6ZuI88STKMavJZPNMU0lFcUTeQXEhHiv64CbxYxBNoDVSmghg==", "dev": true, "dependencies": { "@eslint-community/regexpp": "^4.4.0", - "@typescript-eslint/scope-manager": "5.59.9", - "@typescript-eslint/type-utils": "5.59.9", - "@typescript-eslint/utils": "5.59.9", + "@typescript-eslint/scope-manager": "5.59.11", + "@typescript-eslint/type-utils": "5.59.11", + "@typescript-eslint/utils": "5.59.11", "debug": "^4.3.4", "grapheme-splitter": "^1.0.4", "ignore": "^5.2.0", @@ -1616,53 +1616,6 @@ } } }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/scope-manager": { - "version": "5.59.9", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.59.9.tgz", - "integrity": "sha512-8RA+E+w78z1+2dzvK/tGZ2cpGigBZ58VMEHDZtpE1v+LLjzrYGc8mMaTONSxKyEkz3IuXFM0IqYiGHlCsmlZxQ==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.59.9", - "@typescript-eslint/visitor-keys": "5.59.9" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/types": { - "version": "5.59.9", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.9.tgz", - "integrity": "sha512-uW8H5NRgTVneSVTfiCVffBb8AbwWSKg7qcA4Ot3JI3MPCJGsB4Db4BhvAODIIYE5mNj7Q+VJkK7JxmRhk2Lyjw==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/visitor-keys": { - "version": "5.59.9", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.9.tgz", - "integrity": "sha512-bT7s0td97KMaLwpEBckbzj/YohnvXtqbe2XgqNvTl6RJVakY5mvENOTPvw5u66nljfZxthESpDozs86U+oLY8Q==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.59.9", - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -1810,14 +1763,31 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "5.59.11", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.59.11.tgz", + "integrity": "sha512-dHFOsxoLFtrIcSj5h0QoBT/89hxQONwmn3FOQ0GOQcLOOXm+MIrS8zEAhs4tWl5MraxCY3ZJpaXQQdFMc2Tu+Q==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.59.11", + "@typescript-eslint/visitor-keys": "5.59.11" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, "node_modules/@typescript-eslint/type-utils": { - "version": "5.59.9", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.59.9.tgz", - "integrity": "sha512-ksEsT0/mEHg9e3qZu98AlSrONAQtrSTljL3ow9CGej8eRo7pe+yaC/mvTjptp23Xo/xIf2mLZKC6KPv4Sji26Q==", + "version": "5.59.11", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.59.11.tgz", + "integrity": "sha512-LZqVY8hMiVRF2a7/swmkStMYSoXMFlzL6sXV6U/2gL5cwnLWQgLEG8tjWPpaE4rMIdZ6VKWwcffPlo1jPfk43g==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "5.59.9", - "@typescript-eslint/utils": "5.59.9", + "@typescript-eslint/typescript-estree": "5.59.11", + "@typescript-eslint/utils": "5.59.11", "debug": "^4.3.4", "tsutils": "^3.21.0" }, @@ -1837,10 +1807,33 @@ } } }, - "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/types": { - "version": "5.59.9", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.9.tgz", - "integrity": "sha512-uW8H5NRgTVneSVTfiCVffBb8AbwWSKg7qcA4Ot3JI3MPCJGsB4Db4BhvAODIIYE5mNj7Q+VJkK7JxmRhk2Lyjw==", + "node_modules/@typescript-eslint/type-utils/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/@typescript-eslint/types": { + "version": "5.59.11", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.11.tgz", + "integrity": "sha512-epoN6R6tkvBYSc+cllrz+c2sOFWkbisJZWkOE+y3xHtvYaOE6Wk6B8e114McRJwFRjGvYdJwLXQH5c9osME/AA==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -1850,14 +1843,14 @@ "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree": { - "version": "5.59.9", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.9.tgz", - "integrity": "sha512-pmM0/VQ7kUhd1QyIxgS+aRvMgw+ZljB3eDb+jYyp6d2bC0mQWLzUDF+DLwCTkQ3tlNyVsvZRXjFyV0LkU/aXjA==", + "node_modules/@typescript-eslint/typescript-estree": { + "version": "5.59.11", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.11.tgz", + "integrity": "sha512-YupOpot5hJO0maupJXixi6l5ETdrITxeo5eBOeuV7RSKgYdU3G5cxO49/9WRnJq9EMrB7AuTSLH/bqOsXi7wPA==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.59.9", - "@typescript-eslint/visitor-keys": "5.59.9", + "@typescript-eslint/types": "5.59.11", + "@typescript-eslint/visitor-keys": "5.59.11", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -1877,24 +1870,7 @@ } } }, - "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/visitor-keys": { - "version": "5.59.9", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.9.tgz", - "integrity": "sha512-bT7s0td97KMaLwpEBckbzj/YohnvXtqbe2XgqNvTl6RJVakY5mvENOTPvw5u66nljfZxthESpDozs86U+oLY8Q==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.59.9", - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/type-utils/node_modules/debug": { + "node_modules/@typescript-eslint/typescript-estree/node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", @@ -1911,24 +1887,24 @@ } } }, - "node_modules/@typescript-eslint/type-utils/node_modules/ms": { + "node_modules/@typescript-eslint/typescript-estree/node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, "node_modules/@typescript-eslint/utils": { - "version": "5.59.9", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.59.9.tgz", - "integrity": "sha512-1PuMYsju/38I5Ggblaeb98TOoUvjhRvLpLa1DoTOFaLWqaXl/1iQ1eGurTXgBY58NUdtfTXKP5xBq7q9NDaLKg==", + "version": "5.59.11", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.59.11.tgz", + "integrity": "sha512-didu2rHSOMUdJThLk4aZ1Or8IcO3HzCw/ZvEjTTIfjIrcdd5cvSIwwDy2AOlE7htSNp7QIZ10fLMyRCveesMLg==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@types/json-schema": "^7.0.9", "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.59.9", - "@typescript-eslint/types": "5.59.9", - "@typescript-eslint/typescript-estree": "5.59.9", + "@typescript-eslint/scope-manager": "5.59.11", + "@typescript-eslint/types": "5.59.11", + "@typescript-eslint/typescript-estree": "5.59.11", "eslint-scope": "^5.1.1", "semver": "^7.3.7" }, @@ -1943,70 +1919,13 @@ "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, - "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/scope-manager": { - "version": "5.59.9", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.59.9.tgz", - "integrity": "sha512-8RA+E+w78z1+2dzvK/tGZ2cpGigBZ58VMEHDZtpE1v+LLjzrYGc8mMaTONSxKyEkz3IuXFM0IqYiGHlCsmlZxQ==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.59.9", - "@typescript-eslint/visitor-keys": "5.59.9" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/types": { - "version": "5.59.9", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.9.tgz", - "integrity": "sha512-uW8H5NRgTVneSVTfiCVffBb8AbwWSKg7qcA4Ot3JI3MPCJGsB4Db4BhvAODIIYE5mNj7Q+VJkK7JxmRhk2Lyjw==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree": { - "version": "5.59.9", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.9.tgz", - "integrity": "sha512-pmM0/VQ7kUhd1QyIxgS+aRvMgw+ZljB3eDb+jYyp6d2bC0mQWLzUDF+DLwCTkQ3tlNyVsvZRXjFyV0LkU/aXjA==", + "node_modules/@typescript-eslint/visitor-keys": { + "version": "5.59.11", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.11.tgz", + "integrity": "sha512-KGYniTGG3AMTuKF9QBD7EIrvufkB6O6uX3knP73xbKLMpH+QRPcgnCxjWXSHjMRuOxFLovljqQgQpR0c7GvjoA==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.59.9", - "@typescript-eslint/visitor-keys": "5.59.9", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/visitor-keys": { - "version": "5.59.9", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.9.tgz", - "integrity": "sha512-bT7s0td97KMaLwpEBckbzj/YohnvXtqbe2XgqNvTl6RJVakY5mvENOTPvw5u66nljfZxthESpDozs86U+oLY8Q==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.59.9", + "@typescript-eslint/types": "5.59.11", "eslint-visitor-keys": "^3.3.0" }, "engines": { @@ -2017,29 +1936,6 @@ "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@typescript-eslint/utils/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/utils/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, "node_modules/accepts": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", @@ -11396,15 +11292,15 @@ } }, "@typescript-eslint/eslint-plugin": { - "version": "5.59.9", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.59.9.tgz", - "integrity": "sha512-4uQIBq1ffXd2YvF7MAvehWKW3zVv/w+mSfRAu+8cKbfj3nwzyqJLNcZJpQ/WZ1HLbJDiowwmQ6NO+63nCA+fqA==", + "version": "5.59.11", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.59.11.tgz", + "integrity": "sha512-XxuOfTkCUiOSyBWIvHlUraLw/JT/6Io1365RO6ZuI88STKMavJZPNMU0lFcUTeQXEhHiv64CbxYxBNoDVSmghg==", "dev": true, "requires": { "@eslint-community/regexpp": "^4.4.0", - "@typescript-eslint/scope-manager": "5.59.9", - "@typescript-eslint/type-utils": "5.59.9", - "@typescript-eslint/utils": "5.59.9", + "@typescript-eslint/scope-manager": "5.59.11", + "@typescript-eslint/type-utils": "5.59.11", + "@typescript-eslint/utils": "5.59.11", "debug": "^4.3.4", "grapheme-splitter": "^1.0.4", "ignore": "^5.2.0", @@ -11413,32 +11309,6 @@ "tsutils": "^3.21.0" }, "dependencies": { - "@typescript-eslint/scope-manager": { - "version": "5.59.9", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.59.9.tgz", - "integrity": "sha512-8RA+E+w78z1+2dzvK/tGZ2cpGigBZ58VMEHDZtpE1v+LLjzrYGc8mMaTONSxKyEkz3IuXFM0IqYiGHlCsmlZxQ==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.59.9", - "@typescript-eslint/visitor-keys": "5.59.9" - } - }, - "@typescript-eslint/types": { - "version": "5.59.9", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.9.tgz", - "integrity": "sha512-uW8H5NRgTVneSVTfiCVffBb8AbwWSKg7qcA4Ot3JI3MPCJGsB4Db4BhvAODIIYE5mNj7Q+VJkK7JxmRhk2Lyjw==", - "dev": true - }, - "@typescript-eslint/visitor-keys": { - "version": "5.59.9", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.9.tgz", - "integrity": "sha512-bT7s0td97KMaLwpEBckbzj/YohnvXtqbe2XgqNvTl6RJVakY5mvENOTPvw5u66nljfZxthESpDozs86U+oLY8Q==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.59.9", - "eslint-visitor-keys": "^3.3.0" - } - }, "debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -11526,49 +11396,28 @@ } } }, + "@typescript-eslint/scope-manager": { + "version": "5.59.11", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.59.11.tgz", + "integrity": "sha512-dHFOsxoLFtrIcSj5h0QoBT/89hxQONwmn3FOQ0GOQcLOOXm+MIrS8zEAhs4tWl5MraxCY3ZJpaXQQdFMc2Tu+Q==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.59.11", + "@typescript-eslint/visitor-keys": "5.59.11" + } + }, "@typescript-eslint/type-utils": { - "version": "5.59.9", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.59.9.tgz", - "integrity": "sha512-ksEsT0/mEHg9e3qZu98AlSrONAQtrSTljL3ow9CGej8eRo7pe+yaC/mvTjptp23Xo/xIf2mLZKC6KPv4Sji26Q==", + "version": "5.59.11", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.59.11.tgz", + "integrity": "sha512-LZqVY8hMiVRF2a7/swmkStMYSoXMFlzL6sXV6U/2gL5cwnLWQgLEG8tjWPpaE4rMIdZ6VKWwcffPlo1jPfk43g==", "dev": true, "requires": { - "@typescript-eslint/typescript-estree": "5.59.9", - "@typescript-eslint/utils": "5.59.9", + "@typescript-eslint/typescript-estree": "5.59.11", + "@typescript-eslint/utils": "5.59.11", "debug": "^4.3.4", "tsutils": "^3.21.0" }, "dependencies": { - "@typescript-eslint/types": { - "version": "5.59.9", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.9.tgz", - "integrity": "sha512-uW8H5NRgTVneSVTfiCVffBb8AbwWSKg7qcA4Ot3JI3MPCJGsB4Db4BhvAODIIYE5mNj7Q+VJkK7JxmRhk2Lyjw==", - "dev": true - }, - "@typescript-eslint/typescript-estree": { - "version": "5.59.9", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.9.tgz", - "integrity": "sha512-pmM0/VQ7kUhd1QyIxgS+aRvMgw+ZljB3eDb+jYyp6d2bC0mQWLzUDF+DLwCTkQ3tlNyVsvZRXjFyV0LkU/aXjA==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.59.9", - "@typescript-eslint/visitor-keys": "5.59.9", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - } - }, - "@typescript-eslint/visitor-keys": { - "version": "5.59.9", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.9.tgz", - "integrity": "sha512-bT7s0td97KMaLwpEBckbzj/YohnvXtqbe2XgqNvTl6RJVakY5mvENOTPvw5u66nljfZxthESpDozs86U+oLY8Q==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.59.9", - "eslint-visitor-keys": "^3.3.0" - } - }, "debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -11586,63 +11435,27 @@ } } }, - "@typescript-eslint/utils": { - "version": "5.59.9", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.59.9.tgz", - "integrity": "sha512-1PuMYsju/38I5Ggblaeb98TOoUvjhRvLpLa1DoTOFaLWqaXl/1iQ1eGurTXgBY58NUdtfTXKP5xBq7q9NDaLKg==", + "@typescript-eslint/types": { + "version": "5.59.11", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.11.tgz", + "integrity": "sha512-epoN6R6tkvBYSc+cllrz+c2sOFWkbisJZWkOE+y3xHtvYaOE6Wk6B8e114McRJwFRjGvYdJwLXQH5c9osME/AA==", + "dev": true + }, + "@typescript-eslint/typescript-estree": { + "version": "5.59.11", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.11.tgz", + "integrity": "sha512-YupOpot5hJO0maupJXixi6l5ETdrITxeo5eBOeuV7RSKgYdU3G5cxO49/9WRnJq9EMrB7AuTSLH/bqOsXi7wPA==", "dev": true, "requires": { - "@eslint-community/eslint-utils": "^4.2.0", - "@types/json-schema": "^7.0.9", - "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.59.9", - "@typescript-eslint/types": "5.59.9", - "@typescript-eslint/typescript-estree": "5.59.9", - "eslint-scope": "^5.1.1", - "semver": "^7.3.7" + "@typescript-eslint/types": "5.59.11", + "@typescript-eslint/visitor-keys": "5.59.11", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" }, "dependencies": { - "@typescript-eslint/scope-manager": { - "version": "5.59.9", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.59.9.tgz", - "integrity": "sha512-8RA+E+w78z1+2dzvK/tGZ2cpGigBZ58VMEHDZtpE1v+LLjzrYGc8mMaTONSxKyEkz3IuXFM0IqYiGHlCsmlZxQ==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.59.9", - "@typescript-eslint/visitor-keys": "5.59.9" - } - }, - "@typescript-eslint/types": { - "version": "5.59.9", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.9.tgz", - "integrity": "sha512-uW8H5NRgTVneSVTfiCVffBb8AbwWSKg7qcA4Ot3JI3MPCJGsB4Db4BhvAODIIYE5mNj7Q+VJkK7JxmRhk2Lyjw==", - "dev": true - }, - "@typescript-eslint/typescript-estree": { - "version": "5.59.9", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.9.tgz", - "integrity": "sha512-pmM0/VQ7kUhd1QyIxgS+aRvMgw+ZljB3eDb+jYyp6d2bC0mQWLzUDF+DLwCTkQ3tlNyVsvZRXjFyV0LkU/aXjA==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.59.9", - "@typescript-eslint/visitor-keys": "5.59.9", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - } - }, - "@typescript-eslint/visitor-keys": { - "version": "5.59.9", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.9.tgz", - "integrity": "sha512-bT7s0td97KMaLwpEBckbzj/YohnvXtqbe2XgqNvTl6RJVakY5mvENOTPvw5u66nljfZxthESpDozs86U+oLY8Q==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.59.9", - "eslint-visitor-keys": "^3.3.0" - } - }, "debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -11660,6 +11473,32 @@ } } }, + "@typescript-eslint/utils": { + "version": "5.59.11", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.59.11.tgz", + "integrity": "sha512-didu2rHSOMUdJThLk4aZ1Or8IcO3HzCw/ZvEjTTIfjIrcdd5cvSIwwDy2AOlE7htSNp7QIZ10fLMyRCveesMLg==", + "dev": true, + "requires": { + "@eslint-community/eslint-utils": "^4.2.0", + "@types/json-schema": "^7.0.9", + "@types/semver": "^7.3.12", + "@typescript-eslint/scope-manager": "5.59.11", + "@typescript-eslint/types": "5.59.11", + "@typescript-eslint/typescript-estree": "5.59.11", + "eslint-scope": "^5.1.1", + "semver": "^7.3.7" + } + }, + "@typescript-eslint/visitor-keys": { + "version": "5.59.11", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.11.tgz", + "integrity": "sha512-KGYniTGG3AMTuKF9QBD7EIrvufkB6O6uX3knP73xbKLMpH+QRPcgnCxjWXSHjMRuOxFLovljqQgQpR0c7GvjoA==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.59.11", + "eslint-visitor-keys": "^3.3.0" + } + }, "accepts": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", From def97d5a8e04b50d2360e154f92dce5f444a8213 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 13 Jun 2023 10:05:19 +0800 Subject: [PATCH 122/297] Bump mysql2 from 3.3.3 to 3.3.4 (#2002) Bumps [mysql2](https://github.com/sidorares/node-mysql2) from 3.3.3 to 3.3.4. - [Release notes](https://github.com/sidorares/node-mysql2/releases) - [Changelog](https://github.com/sidorares/node-mysql2/blob/master/Changelog.md) - [Commits](https://github.com/sidorares/node-mysql2/compare/v3.3.3...v3.3.4) --- updated-dependencies: - dependency-name: mysql2 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 1e6b8925a..91de34d72 100644 --- a/package-lock.json +++ b/package-lock.json @@ -7304,9 +7304,9 @@ "dev": true }, "node_modules/mysql2": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.3.3.tgz", - "integrity": "sha512-MxDQJztArk4JFX1PKVjDhIXRzAmVJfuqZrVU+my6NeYBAA/XZRaDw5q7vga8TNvgyy3Lv3rivBFBBuJFbsdjaw==", + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.3.4.tgz", + "integrity": "sha512-66K70s503WCweXmC8rKZ6oFpo+1qd96bx1QloaoYcSABwxvDzjGlqAHSxiDoXgBIv6YSTSZd6lvgWteYhBz7WA==", "dependencies": { "denque": "^2.1.0", "generate-function": "^2.3.1", @@ -15718,9 +15718,9 @@ "dev": true }, "mysql2": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.3.3.tgz", - "integrity": "sha512-MxDQJztArk4JFX1PKVjDhIXRzAmVJfuqZrVU+my6NeYBAA/XZRaDw5q7vga8TNvgyy3Lv3rivBFBBuJFbsdjaw==", + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.3.4.tgz", + "integrity": "sha512-66K70s503WCweXmC8rKZ6oFpo+1qd96bx1QloaoYcSABwxvDzjGlqAHSxiDoXgBIv6YSTSZd6lvgWteYhBz7WA==", "requires": { "denque": "^2.1.0", "generate-function": "^2.3.1", From 7ab45f7e5016b672eb8433443c395eba78213cbf Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 13 Jun 2023 10:27:54 +0800 Subject: [PATCH 123/297] Bump @typescript-eslint/parser from 5.59.9 to 5.59.11 (#2001) Bumps [@typescript-eslint/parser](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/parser) from 5.59.9 to 5.59.11. - [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases) - [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/parser/CHANGELOG.md) - [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v5.59.11/packages/parser) --- updated-dependencies: - dependency-name: "@typescript-eslint/parser" dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 139 ++++------------------------------------------ 1 file changed, 12 insertions(+), 127 deletions(-) diff --git a/package-lock.json b/package-lock.json index 91de34d72..98c53fc73 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1640,14 +1640,14 @@ "dev": true }, "node_modules/@typescript-eslint/parser": { - "version": "5.59.9", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.59.9.tgz", - "integrity": "sha512-FsPkRvBtcLQ/eVK1ivDiNYBjn3TGJdXy2fhXX+rc7czWl4ARwnpArwbihSOHI2Peg9WbtGHrbThfBUkZZGTtvQ==", + "version": "5.59.11", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.59.11.tgz", + "integrity": "sha512-s9ZF3M+Nym6CAZEkJJeO2TFHHDsKAM3ecNkLuH4i4s8/RCPnF5JRip2GyviYkeEAcwGMJxkqG9h2dAsnA1nZpA==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "5.59.9", - "@typescript-eslint/types": "5.59.9", - "@typescript-eslint/typescript-estree": "5.59.9", + "@typescript-eslint/scope-manager": "5.59.11", + "@typescript-eslint/types": "5.59.11", + "@typescript-eslint/typescript-estree": "5.59.11", "debug": "^4.3.4" }, "engines": { @@ -1666,80 +1666,6 @@ } } }, - "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/scope-manager": { - "version": "5.59.9", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.59.9.tgz", - "integrity": "sha512-8RA+E+w78z1+2dzvK/tGZ2cpGigBZ58VMEHDZtpE1v+LLjzrYGc8mMaTONSxKyEkz3IuXFM0IqYiGHlCsmlZxQ==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.59.9", - "@typescript-eslint/visitor-keys": "5.59.9" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/types": { - "version": "5.59.9", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.9.tgz", - "integrity": "sha512-uW8H5NRgTVneSVTfiCVffBb8AbwWSKg7qcA4Ot3JI3MPCJGsB4Db4BhvAODIIYE5mNj7Q+VJkK7JxmRhk2Lyjw==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/typescript-estree": { - "version": "5.59.9", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.9.tgz", - "integrity": "sha512-pmM0/VQ7kUhd1QyIxgS+aRvMgw+ZljB3eDb+jYyp6d2bC0mQWLzUDF+DLwCTkQ3tlNyVsvZRXjFyV0LkU/aXjA==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.59.9", - "@typescript-eslint/visitor-keys": "5.59.9", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/visitor-keys": { - "version": "5.59.9", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.9.tgz", - "integrity": "sha512-bT7s0td97KMaLwpEBckbzj/YohnvXtqbe2XgqNvTl6RJVakY5mvENOTPvw5u66nljfZxthESpDozs86U+oLY8Q==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.59.9", - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, "node_modules/@typescript-eslint/parser/node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -11327,58 +11253,17 @@ } }, "@typescript-eslint/parser": { - "version": "5.59.9", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.59.9.tgz", - "integrity": "sha512-FsPkRvBtcLQ/eVK1ivDiNYBjn3TGJdXy2fhXX+rc7czWl4ARwnpArwbihSOHI2Peg9WbtGHrbThfBUkZZGTtvQ==", + "version": "5.59.11", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.59.11.tgz", + "integrity": "sha512-s9ZF3M+Nym6CAZEkJJeO2TFHHDsKAM3ecNkLuH4i4s8/RCPnF5JRip2GyviYkeEAcwGMJxkqG9h2dAsnA1nZpA==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "5.59.9", - "@typescript-eslint/types": "5.59.9", - "@typescript-eslint/typescript-estree": "5.59.9", + "@typescript-eslint/scope-manager": "5.59.11", + "@typescript-eslint/types": "5.59.11", + "@typescript-eslint/typescript-estree": "5.59.11", "debug": "^4.3.4" }, "dependencies": { - "@typescript-eslint/scope-manager": { - "version": "5.59.9", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.59.9.tgz", - "integrity": "sha512-8RA+E+w78z1+2dzvK/tGZ2cpGigBZ58VMEHDZtpE1v+LLjzrYGc8mMaTONSxKyEkz3IuXFM0IqYiGHlCsmlZxQ==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.59.9", - "@typescript-eslint/visitor-keys": "5.59.9" - } - }, - "@typescript-eslint/types": { - "version": "5.59.9", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.9.tgz", - "integrity": "sha512-uW8H5NRgTVneSVTfiCVffBb8AbwWSKg7qcA4Ot3JI3MPCJGsB4Db4BhvAODIIYE5mNj7Q+VJkK7JxmRhk2Lyjw==", - "dev": true - }, - "@typescript-eslint/typescript-estree": { - "version": "5.59.9", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.9.tgz", - "integrity": "sha512-pmM0/VQ7kUhd1QyIxgS+aRvMgw+ZljB3eDb+jYyp6d2bC0mQWLzUDF+DLwCTkQ3tlNyVsvZRXjFyV0LkU/aXjA==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.59.9", - "@typescript-eslint/visitor-keys": "5.59.9", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - } - }, - "@typescript-eslint/visitor-keys": { - "version": "5.59.9", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.9.tgz", - "integrity": "sha512-bT7s0td97KMaLwpEBckbzj/YohnvXtqbe2XgqNvTl6RJVakY5mvENOTPvw5u66nljfZxthESpDozs86U+oLY8Q==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.59.9", - "eslint-visitor-keys": "^3.3.0" - } - }, "debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", From 8845e51c2bc7d4e99d907db54eb03607abae3491 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 14 Jun 2023 16:10:38 +0800 Subject: [PATCH 124/297] Bump mysql2 from 3.3.4 to 3.3.5 (#2006) Bumps [mysql2](https://github.com/sidorares/node-mysql2) from 3.3.4 to 3.3.5. - [Release notes](https://github.com/sidorares/node-mysql2/releases) - [Changelog](https://github.com/sidorares/node-mysql2/blob/master/Changelog.md) - [Commits](https://github.com/sidorares/node-mysql2/compare/v3.3.4...v3.3.5) --- updated-dependencies: - dependency-name: mysql2 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 98c53fc73..7abbc75ab 100644 --- a/package-lock.json +++ b/package-lock.json @@ -7230,9 +7230,9 @@ "dev": true }, "node_modules/mysql2": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.3.4.tgz", - "integrity": "sha512-66K70s503WCweXmC8rKZ6oFpo+1qd96bx1QloaoYcSABwxvDzjGlqAHSxiDoXgBIv6YSTSZd6lvgWteYhBz7WA==", + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.3.5.tgz", + "integrity": "sha512-ZTQGAzxGeaX1PyeSiZFCgQ34uiXguaEpn3aTFN9Enm9JDnbwWo+4/CJnDdQZ3n0NaMeysi8vwtW/jNUb9VqVDw==", "dependencies": { "denque": "^2.1.0", "generate-function": "^2.3.1", @@ -15603,9 +15603,9 @@ "dev": true }, "mysql2": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.3.4.tgz", - "integrity": "sha512-66K70s503WCweXmC8rKZ6oFpo+1qd96bx1QloaoYcSABwxvDzjGlqAHSxiDoXgBIv6YSTSZd6lvgWteYhBz7WA==", + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.3.5.tgz", + "integrity": "sha512-ZTQGAzxGeaX1PyeSiZFCgQ34uiXguaEpn3aTFN9Enm9JDnbwWo+4/CJnDdQZ3n0NaMeysi8vwtW/jNUb9VqVDw==", "requires": { "denque": "^2.1.0", "generate-function": "^2.3.1", From 82444f215fe76970204a77a9c37aa8d99c1b0696 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 20 Jun 2023 11:31:46 +0800 Subject: [PATCH 125/297] Bump @typescript-eslint/eslint-plugin from 5.59.11 to 5.60.0 (#2012) Bumps [@typescript-eslint/eslint-plugin](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/eslint-plugin) from 5.59.11 to 5.60.0. - [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases) - [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/eslint-plugin/CHANGELOG.md) - [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v5.60.0/packages/eslint-plugin) --- updated-dependencies: - dependency-name: "@typescript-eslint/eslint-plugin" dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 384 ++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 350 insertions(+), 34 deletions(-) diff --git a/package-lock.json b/package-lock.json index 7abbc75ab..444945c18 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1583,15 +1583,15 @@ } }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.59.11", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.59.11.tgz", - "integrity": "sha512-XxuOfTkCUiOSyBWIvHlUraLw/JT/6Io1365RO6ZuI88STKMavJZPNMU0lFcUTeQXEhHiv64CbxYxBNoDVSmghg==", + "version": "5.60.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.60.0.tgz", + "integrity": "sha512-78B+anHLF1TI8Jn/cD0Q00TBYdMgjdOn980JfAVa9yw5sop8nyTfVOQAv6LWywkOGLclDBtv5z3oxN4w7jxyNg==", "dev": true, "dependencies": { "@eslint-community/regexpp": "^4.4.0", - "@typescript-eslint/scope-manager": "5.59.11", - "@typescript-eslint/type-utils": "5.59.11", - "@typescript-eslint/utils": "5.59.11", + "@typescript-eslint/scope-manager": "5.60.0", + "@typescript-eslint/type-utils": "5.60.0", + "@typescript-eslint/utils": "5.60.0", "debug": "^4.3.4", "grapheme-splitter": "^1.0.4", "ignore": "^5.2.0", @@ -1616,6 +1616,53 @@ } } }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/scope-manager": { + "version": "5.60.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.60.0.tgz", + "integrity": "sha512-hakuzcxPwXi2ihf9WQu1BbRj1e/Pd8ZZwVTG9kfbxAMZstKz8/9OoexIwnmLzShtsdap5U/CoQGRCWlSuPbYxQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.60.0", + "@typescript-eslint/visitor-keys": "5.60.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/types": { + "version": "5.60.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.60.0.tgz", + "integrity": "sha512-ascOuoCpNZBccFVNJRSC6rPq4EmJ2NkuoKnd6LDNyAQmdDnziAtxbCGWCbefG1CNzmDvd05zO36AmB7H8RzKPA==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/visitor-keys": { + "version": "5.60.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.60.0.tgz", + "integrity": "sha512-wm9Uz71SbCyhUKgcaPRauBdTegUyY/ZWl8gLwD/i/ybJqscrrdVSFImpvUz16BLPChIeKBK5Fa9s6KDQjsjyWw==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.60.0", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -1707,13 +1754,13 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "5.59.11", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.59.11.tgz", - "integrity": "sha512-LZqVY8hMiVRF2a7/swmkStMYSoXMFlzL6sXV6U/2gL5cwnLWQgLEG8tjWPpaE4rMIdZ6VKWwcffPlo1jPfk43g==", + "version": "5.60.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.60.0.tgz", + "integrity": "sha512-X7NsRQddORMYRFH7FWo6sA9Y/zbJ8s1x1RIAtnlj6YprbToTiQnM6vxcMu7iYhdunmoC0rUWlca13D5DVHkK2g==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "5.59.11", - "@typescript-eslint/utils": "5.59.11", + "@typescript-eslint/typescript-estree": "5.60.0", + "@typescript-eslint/utils": "5.60.0", "debug": "^4.3.4", "tsutils": "^3.21.0" }, @@ -1733,6 +1780,63 @@ } } }, + "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/types": { + "version": "5.60.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.60.0.tgz", + "integrity": "sha512-ascOuoCpNZBccFVNJRSC6rPq4EmJ2NkuoKnd6LDNyAQmdDnziAtxbCGWCbefG1CNzmDvd05zO36AmB7H8RzKPA==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree": { + "version": "5.60.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.60.0.tgz", + "integrity": "sha512-R43thAuwarC99SnvrBmh26tc7F6sPa2B3evkXp/8q954kYL6Ro56AwASYWtEEi+4j09GbiNAHqYwNNZuNlARGQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.60.0", + "@typescript-eslint/visitor-keys": "5.60.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/visitor-keys": { + "version": "5.60.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.60.0.tgz", + "integrity": "sha512-wm9Uz71SbCyhUKgcaPRauBdTegUyY/ZWl8gLwD/i/ybJqscrrdVSFImpvUz16BLPChIeKBK5Fa9s6KDQjsjyWw==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.60.0", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, "node_modules/@typescript-eslint/type-utils/node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -1820,17 +1924,17 @@ "dev": true }, "node_modules/@typescript-eslint/utils": { - "version": "5.59.11", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.59.11.tgz", - "integrity": "sha512-didu2rHSOMUdJThLk4aZ1Or8IcO3HzCw/ZvEjTTIfjIrcdd5cvSIwwDy2AOlE7htSNp7QIZ10fLMyRCveesMLg==", + "version": "5.60.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.60.0.tgz", + "integrity": "sha512-ba51uMqDtfLQ5+xHtwlO84vkdjrqNzOnqrnwbMHMRY8Tqeme8C2Q8Fc7LajfGR+e3/4LoYiWXUM6BpIIbHJ4hQ==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@types/json-schema": "^7.0.9", "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.59.11", - "@typescript-eslint/types": "5.59.11", - "@typescript-eslint/typescript-estree": "5.59.11", + "@typescript-eslint/scope-manager": "5.60.0", + "@typescript-eslint/types": "5.60.0", + "@typescript-eslint/typescript-estree": "5.60.0", "eslint-scope": "^5.1.1", "semver": "^7.3.7" }, @@ -1845,6 +1949,103 @@ "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, + "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/scope-manager": { + "version": "5.60.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.60.0.tgz", + "integrity": "sha512-hakuzcxPwXi2ihf9WQu1BbRj1e/Pd8ZZwVTG9kfbxAMZstKz8/9OoexIwnmLzShtsdap5U/CoQGRCWlSuPbYxQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.60.0", + "@typescript-eslint/visitor-keys": "5.60.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/types": { + "version": "5.60.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.60.0.tgz", + "integrity": "sha512-ascOuoCpNZBccFVNJRSC6rPq4EmJ2NkuoKnd6LDNyAQmdDnziAtxbCGWCbefG1CNzmDvd05zO36AmB7H8RzKPA==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree": { + "version": "5.60.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.60.0.tgz", + "integrity": "sha512-R43thAuwarC99SnvrBmh26tc7F6sPa2B3evkXp/8q954kYL6Ro56AwASYWtEEi+4j09GbiNAHqYwNNZuNlARGQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.60.0", + "@typescript-eslint/visitor-keys": "5.60.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/visitor-keys": { + "version": "5.60.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.60.0.tgz", + "integrity": "sha512-wm9Uz71SbCyhUKgcaPRauBdTegUyY/ZWl8gLwD/i/ybJqscrrdVSFImpvUz16BLPChIeKBK5Fa9s6KDQjsjyWw==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.60.0", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/utils/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, "node_modules/@typescript-eslint/visitor-keys": { "version": "5.59.11", "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.11.tgz", @@ -11218,15 +11419,15 @@ } }, "@typescript-eslint/eslint-plugin": { - "version": "5.59.11", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.59.11.tgz", - "integrity": "sha512-XxuOfTkCUiOSyBWIvHlUraLw/JT/6Io1365RO6ZuI88STKMavJZPNMU0lFcUTeQXEhHiv64CbxYxBNoDVSmghg==", + "version": "5.60.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.60.0.tgz", + "integrity": "sha512-78B+anHLF1TI8Jn/cD0Q00TBYdMgjdOn980JfAVa9yw5sop8nyTfVOQAv6LWywkOGLclDBtv5z3oxN4w7jxyNg==", "dev": true, "requires": { "@eslint-community/regexpp": "^4.4.0", - "@typescript-eslint/scope-manager": "5.59.11", - "@typescript-eslint/type-utils": "5.59.11", - "@typescript-eslint/utils": "5.59.11", + "@typescript-eslint/scope-manager": "5.60.0", + "@typescript-eslint/type-utils": "5.60.0", + "@typescript-eslint/utils": "5.60.0", "debug": "^4.3.4", "grapheme-splitter": "^1.0.4", "ignore": "^5.2.0", @@ -11235,6 +11436,32 @@ "tsutils": "^3.21.0" }, "dependencies": { + "@typescript-eslint/scope-manager": { + "version": "5.60.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.60.0.tgz", + "integrity": "sha512-hakuzcxPwXi2ihf9WQu1BbRj1e/Pd8ZZwVTG9kfbxAMZstKz8/9OoexIwnmLzShtsdap5U/CoQGRCWlSuPbYxQ==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.60.0", + "@typescript-eslint/visitor-keys": "5.60.0" + } + }, + "@typescript-eslint/types": { + "version": "5.60.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.60.0.tgz", + "integrity": "sha512-ascOuoCpNZBccFVNJRSC6rPq4EmJ2NkuoKnd6LDNyAQmdDnziAtxbCGWCbefG1CNzmDvd05zO36AmB7H8RzKPA==", + "dev": true + }, + "@typescript-eslint/visitor-keys": { + "version": "5.60.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.60.0.tgz", + "integrity": "sha512-wm9Uz71SbCyhUKgcaPRauBdTegUyY/ZWl8gLwD/i/ybJqscrrdVSFImpvUz16BLPChIeKBK5Fa9s6KDQjsjyWw==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.60.0", + "eslint-visitor-keys": "^3.3.0" + } + }, "debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -11292,17 +11519,48 @@ } }, "@typescript-eslint/type-utils": { - "version": "5.59.11", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.59.11.tgz", - "integrity": "sha512-LZqVY8hMiVRF2a7/swmkStMYSoXMFlzL6sXV6U/2gL5cwnLWQgLEG8tjWPpaE4rMIdZ6VKWwcffPlo1jPfk43g==", + "version": "5.60.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.60.0.tgz", + "integrity": "sha512-X7NsRQddORMYRFH7FWo6sA9Y/zbJ8s1x1RIAtnlj6YprbToTiQnM6vxcMu7iYhdunmoC0rUWlca13D5DVHkK2g==", "dev": true, "requires": { - "@typescript-eslint/typescript-estree": "5.59.11", - "@typescript-eslint/utils": "5.59.11", + "@typescript-eslint/typescript-estree": "5.60.0", + "@typescript-eslint/utils": "5.60.0", "debug": "^4.3.4", "tsutils": "^3.21.0" }, "dependencies": { + "@typescript-eslint/types": { + "version": "5.60.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.60.0.tgz", + "integrity": "sha512-ascOuoCpNZBccFVNJRSC6rPq4EmJ2NkuoKnd6LDNyAQmdDnziAtxbCGWCbefG1CNzmDvd05zO36AmB7H8RzKPA==", + "dev": true + }, + "@typescript-eslint/typescript-estree": { + "version": "5.60.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.60.0.tgz", + "integrity": "sha512-R43thAuwarC99SnvrBmh26tc7F6sPa2B3evkXp/8q954kYL6Ro56AwASYWtEEi+4j09GbiNAHqYwNNZuNlARGQ==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.60.0", + "@typescript-eslint/visitor-keys": "5.60.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + } + }, + "@typescript-eslint/visitor-keys": { + "version": "5.60.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.60.0.tgz", + "integrity": "sha512-wm9Uz71SbCyhUKgcaPRauBdTegUyY/ZWl8gLwD/i/ybJqscrrdVSFImpvUz16BLPChIeKBK5Fa9s6KDQjsjyWw==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.60.0", + "eslint-visitor-keys": "^3.3.0" + } + }, "debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -11359,19 +11617,77 @@ } }, "@typescript-eslint/utils": { - "version": "5.59.11", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.59.11.tgz", - "integrity": "sha512-didu2rHSOMUdJThLk4aZ1Or8IcO3HzCw/ZvEjTTIfjIrcdd5cvSIwwDy2AOlE7htSNp7QIZ10fLMyRCveesMLg==", + "version": "5.60.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.60.0.tgz", + "integrity": "sha512-ba51uMqDtfLQ5+xHtwlO84vkdjrqNzOnqrnwbMHMRY8Tqeme8C2Q8Fc7LajfGR+e3/4LoYiWXUM6BpIIbHJ4hQ==", "dev": true, "requires": { "@eslint-community/eslint-utils": "^4.2.0", "@types/json-schema": "^7.0.9", "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.59.11", - "@typescript-eslint/types": "5.59.11", - "@typescript-eslint/typescript-estree": "5.59.11", + "@typescript-eslint/scope-manager": "5.60.0", + "@typescript-eslint/types": "5.60.0", + "@typescript-eslint/typescript-estree": "5.60.0", "eslint-scope": "^5.1.1", "semver": "^7.3.7" + }, + "dependencies": { + "@typescript-eslint/scope-manager": { + "version": "5.60.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.60.0.tgz", + "integrity": "sha512-hakuzcxPwXi2ihf9WQu1BbRj1e/Pd8ZZwVTG9kfbxAMZstKz8/9OoexIwnmLzShtsdap5U/CoQGRCWlSuPbYxQ==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.60.0", + "@typescript-eslint/visitor-keys": "5.60.0" + } + }, + "@typescript-eslint/types": { + "version": "5.60.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.60.0.tgz", + "integrity": "sha512-ascOuoCpNZBccFVNJRSC6rPq4EmJ2NkuoKnd6LDNyAQmdDnziAtxbCGWCbefG1CNzmDvd05zO36AmB7H8RzKPA==", + "dev": true + }, + "@typescript-eslint/typescript-estree": { + "version": "5.60.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.60.0.tgz", + "integrity": "sha512-R43thAuwarC99SnvrBmh26tc7F6sPa2B3evkXp/8q954kYL6Ro56AwASYWtEEi+4j09GbiNAHqYwNNZuNlARGQ==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.60.0", + "@typescript-eslint/visitor-keys": "5.60.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + } + }, + "@typescript-eslint/visitor-keys": { + "version": "5.60.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.60.0.tgz", + "integrity": "sha512-wm9Uz71SbCyhUKgcaPRauBdTegUyY/ZWl8gLwD/i/ybJqscrrdVSFImpvUz16BLPChIeKBK5Fa9s6KDQjsjyWw==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.60.0", + "eslint-visitor-keys": "^3.3.0" + } + }, + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } } }, "@typescript-eslint/visitor-keys": { From 373b9a582d5d7d21d01edcfeb46843d732a06c6c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 20 Jun 2023 13:53:49 +0800 Subject: [PATCH 126/297] Bump eslint from 8.42.0 to 8.43.0 (#2010) Bumps [eslint](https://github.com/eslint/eslint) from 8.42.0 to 8.43.0. - [Release notes](https://github.com/eslint/eslint/releases) - [Changelog](https://github.com/eslint/eslint/blob/main/CHANGELOG.md) - [Commits](https://github.com/eslint/eslint/compare/v8.42.0...v8.43.0) --- updated-dependencies: - dependency-name: eslint dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/package-lock.json b/package-lock.json index 444945c18..0d60e59b0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1028,9 +1028,9 @@ } }, "node_modules/@eslint/js": { - "version": "8.42.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.42.0.tgz", - "integrity": "sha512-6SWlXpWU5AvId8Ac7zjzmIOqMOba/JWY8XZ4A7q7Gn1Vlfg/SFFIlrtHXt9nPn4op9ZPAkl91Jao+QQv3r/ukw==", + "version": "8.43.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.43.0.tgz", + "integrity": "sha512-s2UHCoiXfxMvmfzqoN+vrQ84ahUSYde9qNO1MdxmoEhyHWsfmwOpFlwYV+ePJEVc7gFnATGUi376WowX1N7tFg==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -4383,15 +4383,15 @@ } }, "node_modules/eslint": { - "version": "8.42.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.42.0.tgz", - "integrity": "sha512-ulg9Ms6E1WPf67PHaEY4/6E2tEn5/f7FXGzr3t9cBMugOmf1INYvuUwwh1aXQN4MfJ6a5K2iNwP3w4AColvI9A==", + "version": "8.43.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.43.0.tgz", + "integrity": "sha512-aaCpf2JqqKesMFGgmRPessmVKjcGXqdlAYLLC3THM8t5nBRZRQ+st5WM/hoJXkdioEXLLbXgclUpM0TXo5HX5Q==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.4.0", "@eslint/eslintrc": "^2.0.3", - "@eslint/js": "8.42.0", + "@eslint/js": "8.43.0", "@humanwhocodes/config-array": "^0.11.10", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", @@ -10937,9 +10937,9 @@ } }, "@eslint/js": { - "version": "8.42.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.42.0.tgz", - "integrity": "sha512-6SWlXpWU5AvId8Ac7zjzmIOqMOba/JWY8XZ4A7q7Gn1Vlfg/SFFIlrtHXt9nPn4op9ZPAkl91Jao+QQv3r/ukw==", + "version": "8.43.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.43.0.tgz", + "integrity": "sha512-s2UHCoiXfxMvmfzqoN+vrQ84ahUSYde9qNO1MdxmoEhyHWsfmwOpFlwYV+ePJEVc7gFnATGUi376WowX1N7tFg==", "dev": true }, "@humanwhocodes/config-array": { @@ -13657,15 +13657,15 @@ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" }, "eslint": { - "version": "8.42.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.42.0.tgz", - "integrity": "sha512-ulg9Ms6E1WPf67PHaEY4/6E2tEn5/f7FXGzr3t9cBMugOmf1INYvuUwwh1aXQN4MfJ6a5K2iNwP3w4AColvI9A==", + "version": "8.43.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.43.0.tgz", + "integrity": "sha512-aaCpf2JqqKesMFGgmRPessmVKjcGXqdlAYLLC3THM8t5nBRZRQ+st5WM/hoJXkdioEXLLbXgclUpM0TXo5HX5Q==", "dev": true, "requires": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.4.0", "@eslint/eslintrc": "^2.0.3", - "@eslint/js": "8.42.0", + "@eslint/js": "8.43.0", "@humanwhocodes/config-array": "^0.11.10", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", From 800af6e9cd6639fa8a828c9b125c99f93707dc0e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 20 Jun 2023 13:54:33 +0800 Subject: [PATCH 127/297] Bump sequelize from 6.32.0 to 6.32.1 (#2011) Bumps [sequelize](https://github.com/sequelize/sequelize) from 6.32.0 to 6.32.1. - [Release notes](https://github.com/sequelize/sequelize/releases) - [Commits](https://github.com/sequelize/sequelize/compare/v6.32.0...v6.32.1) --- updated-dependencies: - dependency-name: sequelize dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 135 +++++++++++++++++++++++++--------------------- 1 file changed, 75 insertions(+), 60 deletions(-) diff --git a/package-lock.json b/package-lock.json index 0d60e59b0..c5f594857 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1351,9 +1351,9 @@ } }, "node_modules/@types/debug": { - "version": "4.1.7", - "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.7.tgz", - "integrity": "sha512-9AonUzyTjXXhEOa0DnqpzZi6VHlqKMswga9EXjpXnnqxwLtdvPPtlO8evrI5D9S6asFRCQ6v+wpiUKbw+vKqyg==", + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.8.tgz", + "integrity": "sha512-/vPO1EPOs306Cvhwv7KfVfYvOJqA/S/AXjaHQiJboCZzcNDb+TIJFN9/2C9DZ//ijSKWioNyUxD792QmDJ+HKQ==", "dependencies": { "@types/ms": "*" } @@ -4221,9 +4221,9 @@ } }, "node_modules/dottie": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/dottie/-/dottie-2.0.2.tgz", - "integrity": "sha512-fmrwR04lsniq/uSr8yikThDTrM7epXHBAAjH9TbeH3rEA8tdCO7mRzB9hdmdGyJCxF8KERo9CITcm3kGuoyMhg==" + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/dottie/-/dottie-2.0.6.tgz", + "integrity": "sha512-iGCHkfUc5kFekGiqhe8B/mdaurD+lakO9txNnTvKtA6PISrw86LgqHvRzWYPyoE2Ph5aMIrCw9/uko6XHTKCwA==" }, "node_modules/eastasianwidth": { "version": "0.2.0", @@ -7889,9 +7889,9 @@ "dev": true }, "node_modules/pg-connection-string": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.5.0.tgz", - "integrity": "sha512-r5o/V/ORTA6TmUnyWZR9nCj1klXCO2CEKNRlVuJptZe85QuhFayC7WeMic7ndayT5IRIR0S0xFxFi2ousartlQ==" + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.6.0.tgz", + "integrity": "sha512-x14ibktcwlHKoHxx9X3uTVW9zIGR41ZB6QNhHb21OPNdCCO3NaRnpJuwKIQSR4u+Yqjx4HCvy7Hh7VSy1U4dGg==" }, "node_modules/picomatch": { "version": "2.3.1", @@ -8785,9 +8785,9 @@ "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" }, "node_modules/semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "version": "7.5.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.2.tgz", + "integrity": "sha512-SoftuTROv/cRjCze/scjGyiDtcUyxw1rgYQSZY7XTmtR5hX+dm76iDbTH8TkLPHCQmlbQVSSbNZCPM2hb0knnQ==", "dependencies": { "lru-cache": "^6.0.0" }, @@ -8872,9 +8872,9 @@ "integrity": "sha1-1WgS4cAXpuTnw+Ojeh2m143TyT4=" }, "node_modules/sequelize": { - "version": "6.32.0", - "resolved": "https://registry.npmjs.org/sequelize/-/sequelize-6.32.0.tgz", - "integrity": "sha512-gMd1M6kPANyrCeU/vtgEP5gnse7sVsiKbJyz7p4huuW8zZcRopj47UlglvdrMuIoqksZmsUPfApmMo6ZlJpcvg==", + "version": "6.32.1", + "resolved": "https://registry.npmjs.org/sequelize/-/sequelize-6.32.1.tgz", + "integrity": "sha512-3Iv0jruv57Y0YvcxQW7BE56O7DC1BojcfIrqh6my+IQwde+9u/YnuYHzK+8kmZLhLvaziRT1eWu38nh9yVwn/g==", "funding": [ { "type": "opencollective", @@ -8882,21 +8882,21 @@ } ], "dependencies": { - "@types/debug": "^4.1.7", - "@types/validator": "^13.7.1", - "debug": "^4.3.3", - "dottie": "^2.0.2", - "inflection": "^1.13.2", + "@types/debug": "^4.1.8", + "@types/validator": "^13.7.17", + "debug": "^4.3.4", + "dottie": "^2.0.4", + "inflection": "^1.13.4", "lodash": "^4.17.21", - "moment": "^2.29.1", - "moment-timezone": "^0.5.35", - "pg-connection-string": "^2.5.0", - "retry-as-promised": "^7.0.3", - "semver": "^7.3.5", + "moment": "^2.29.4", + "moment-timezone": "^0.5.43", + "pg-connection-string": "^2.6.0", + "retry-as-promised": "^7.0.4", + "semver": "^7.5.1", "sequelize-pool": "^7.1.0", "toposort-class": "^1.0.1", "uuid": "^8.3.2", - "validator": "^13.7.0", + "validator": "^13.9.0", "wkx": "^0.5.0" }, "engines": { @@ -8941,9 +8941,9 @@ } }, "node_modules/sequelize/node_modules/debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dependencies": { "ms": "2.1.2" }, @@ -8969,6 +8969,14 @@ "uuid": "dist/bin/uuid" } }, + "node_modules/sequelize/node_modules/validator": { + "version": "13.9.0", + "resolved": "https://registry.npmjs.org/validator/-/validator-13.9.0.tgz", + "integrity": "sha512-B+dGG8U3fdtM0/aNK4/X8CXq/EcxU2WPrPEkJGslb47qyHsxmbggTWK0yEA4qnYVNF+nxNlN88o14hIcPmSIEA==", + "engines": { + "node": ">= 0.10" + } + }, "node_modules/serve-static": { "version": "1.15.0", "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", @@ -9803,6 +9811,7 @@ "version": "13.7.0", "resolved": "https://registry.npmjs.org/validator/-/validator-13.7.0.tgz", "integrity": "sha512-nYXQLCBkpJ8X6ltALua9dRrZDHVYxjJ1wgskNt1lH9fzGjs3tgojGSCBjmEPwkWS1y29+DrizMTW19Pr9uB2nw==", + "dev": true, "engines": { "node": ">= 0.10" } @@ -11187,9 +11196,9 @@ } }, "@types/debug": { - "version": "4.1.7", - "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.7.tgz", - "integrity": "sha512-9AonUzyTjXXhEOa0DnqpzZi6VHlqKMswga9EXjpXnnqxwLtdvPPtlO8evrI5D9S6asFRCQ6v+wpiUKbw+vKqyg==", + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.8.tgz", + "integrity": "sha512-/vPO1EPOs306Cvhwv7KfVfYvOJqA/S/AXjaHQiJboCZzcNDb+TIJFN9/2C9DZ//ijSKWioNyUxD792QmDJ+HKQ==", "requires": { "@types/ms": "*" } @@ -13525,9 +13534,9 @@ } }, "dottie": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/dottie/-/dottie-2.0.2.tgz", - "integrity": "sha512-fmrwR04lsniq/uSr8yikThDTrM7epXHBAAjH9TbeH3rEA8tdCO7mRzB9hdmdGyJCxF8KERo9CITcm3kGuoyMhg==" + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/dottie/-/dottie-2.0.6.tgz", + "integrity": "sha512-iGCHkfUc5kFekGiqhe8B/mdaurD+lakO9txNnTvKtA6PISrw86LgqHvRzWYPyoE2Ph5aMIrCw9/uko6XHTKCwA==" }, "eastasianwidth": { "version": "0.2.0", @@ -16258,9 +16267,9 @@ "dev": true }, "pg-connection-string": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.5.0.tgz", - "integrity": "sha512-r5o/V/ORTA6TmUnyWZR9nCj1klXCO2CEKNRlVuJptZe85QuhFayC7WeMic7ndayT5IRIR0S0xFxFi2ousartlQ==" + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.6.0.tgz", + "integrity": "sha512-x14ibktcwlHKoHxx9X3uTVW9zIGR41ZB6QNhHb21OPNdCCO3NaRnpJuwKIQSR4u+Yqjx4HCvy7Hh7VSy1U4dGg==" }, "picomatch": { "version": "2.3.1", @@ -16912,9 +16921,9 @@ "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" }, "semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "version": "7.5.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.2.tgz", + "integrity": "sha512-SoftuTROv/cRjCze/scjGyiDtcUyxw1rgYQSZY7XTmtR5hX+dm76iDbTH8TkLPHCQmlbQVSSbNZCPM2hb0knnQ==", "requires": { "lru-cache": "^6.0.0" }, @@ -16990,32 +16999,32 @@ "integrity": "sha1-1WgS4cAXpuTnw+Ojeh2m143TyT4=" }, "sequelize": { - "version": "6.32.0", - "resolved": "https://registry.npmjs.org/sequelize/-/sequelize-6.32.0.tgz", - "integrity": "sha512-gMd1M6kPANyrCeU/vtgEP5gnse7sVsiKbJyz7p4huuW8zZcRopj47UlglvdrMuIoqksZmsUPfApmMo6ZlJpcvg==", - "requires": { - "@types/debug": "^4.1.7", - "@types/validator": "^13.7.1", - "debug": "^4.3.3", - "dottie": "^2.0.2", - "inflection": "^1.13.2", + "version": "6.32.1", + "resolved": "https://registry.npmjs.org/sequelize/-/sequelize-6.32.1.tgz", + "integrity": "sha512-3Iv0jruv57Y0YvcxQW7BE56O7DC1BojcfIrqh6my+IQwde+9u/YnuYHzK+8kmZLhLvaziRT1eWu38nh9yVwn/g==", + "requires": { + "@types/debug": "^4.1.8", + "@types/validator": "^13.7.17", + "debug": "^4.3.4", + "dottie": "^2.0.4", + "inflection": "^1.13.4", "lodash": "^4.17.21", - "moment": "^2.29.1", - "moment-timezone": "^0.5.35", - "pg-connection-string": "^2.5.0", - "retry-as-promised": "^7.0.3", - "semver": "^7.3.5", + "moment": "^2.29.4", + "moment-timezone": "^0.5.43", + "pg-connection-string": "^2.6.0", + "retry-as-promised": "^7.0.4", + "semver": "^7.5.1", "sequelize-pool": "^7.1.0", "toposort-class": "^1.0.1", "uuid": "^8.3.2", - "validator": "^13.7.0", + "validator": "^13.9.0", "wkx": "^0.5.0" }, "dependencies": { "debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "requires": { "ms": "2.1.2" } @@ -17029,6 +17038,11 @@ "version": "8.3.2", "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" + }, + "validator": { + "version": "13.9.0", + "resolved": "https://registry.npmjs.org/validator/-/validator-13.9.0.tgz", + "integrity": "sha512-B+dGG8U3fdtM0/aNK4/X8CXq/EcxU2WPrPEkJGslb47qyHsxmbggTWK0yEA4qnYVNF+nxNlN88o14hIcPmSIEA==" } } }, @@ -17656,7 +17670,8 @@ "validator": { "version": "13.7.0", "resolved": "https://registry.npmjs.org/validator/-/validator-13.7.0.tgz", - "integrity": "sha512-nYXQLCBkpJ8X6ltALua9dRrZDHVYxjJ1wgskNt1lH9fzGjs3tgojGSCBjmEPwkWS1y29+DrizMTW19Pr9uB2nw==" + "integrity": "sha512-nYXQLCBkpJ8X6ltALua9dRrZDHVYxjJ1wgskNt1lH9fzGjs3tgojGSCBjmEPwkWS1y29+DrizMTW19Pr9uB2nw==", + "dev": true }, "vary": { "version": "1.1.2", From 11993eb4b523dee3e1bc65080d76d3245a25348c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 20 Jun 2023 17:43:11 +0800 Subject: [PATCH 128/297] Bump @types/vscode from 1.79.0 to 1.79.1 (#2007) Bumps [@types/vscode](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/vscode) from 1.79.0 to 1.79.1. - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/vscode) --- updated-dependencies: - dependency-name: "@types/vscode" dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index c5f594857..3cb057a2a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1568,9 +1568,9 @@ "integrity": "sha512-aqayTNmeWrZcvnG2MG9eGYI6b7S5fl+yKgPs6bAjOTwPS316R5SxBGKvtSExfyoJU7pIeHJfsHI0Ji41RVMkvQ==" }, "node_modules/@types/vscode": { - "version": "1.79.0", - "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.79.0.tgz", - "integrity": "sha512-Tfowu2rSW8hVGbqzQLSPlOEiIOYYryTkgJ+chMecpYiJcnw9n0essvSiclnK+Qh/TcSVJHgaK4EMrQDZjZJ/Sw==", + "version": "1.79.1", + "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.79.1.tgz", + "integrity": "sha512-Ikwc4YbHABzqthrWfeAvItaAIfX9mdjMWxqNgTpGjhgOu0TMRq9LzyZ2yBK0JhYqoSjEubEPawf6zJgnl6Egtw==", "dev": true }, "node_modules/@types/xml2js": { @@ -11413,9 +11413,9 @@ "integrity": "sha512-aqayTNmeWrZcvnG2MG9eGYI6b7S5fl+yKgPs6bAjOTwPS316R5SxBGKvtSExfyoJU7pIeHJfsHI0Ji41RVMkvQ==" }, "@types/vscode": { - "version": "1.79.0", - "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.79.0.tgz", - "integrity": "sha512-Tfowu2rSW8hVGbqzQLSPlOEiIOYYryTkgJ+chMecpYiJcnw9n0essvSiclnK+Qh/TcSVJHgaK4EMrQDZjZJ/Sw==", + "version": "1.79.1", + "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.79.1.tgz", + "integrity": "sha512-Ikwc4YbHABzqthrWfeAvItaAIfX9mdjMWxqNgTpGjhgOu0TMRq9LzyZ2yBK0JhYqoSjEubEPawf6zJgnl6Egtw==", "dev": true }, "@types/xml2js": { From 50fb7831ee30c756d4c37eed3373b1d81d039d83 Mon Sep 17 00:00:00 2001 From: Wei Wei Date: Tue, 20 Jun 2023 11:09:15 +0000 Subject: [PATCH 129/297] Fix query table fail with filter condition as string.Empty (#2000) --- ChangeLog.md | 4 +++ .../LokiTableStoreQueryGenerator.ts | 2 +- tests/table/apis/table.entity.query.test.ts | 34 +++++++++++++++++++ 3 files changed, 39 insertions(+), 1 deletion(-) diff --git a/ChangeLog.md b/ChangeLog.md index 8104ac0f0..037568d8b 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -4,6 +4,10 @@ ## Upcoming Release +Table: + +- Fixed issue with query table fail with filter condition as string.Empty. (issue #1880) + ## 2023.06 Version 3.24.0 General: diff --git a/src/table/persistence/LokiTableStoreQueryGenerator.ts b/src/table/persistence/LokiTableStoreQueryGenerator.ts index d06b50e4d..b189572cd 100644 --- a/src/table/persistence/LokiTableStoreQueryGenerator.ts +++ b/src/table/persistence/LokiTableStoreQueryGenerator.ts @@ -80,7 +80,7 @@ export default class LokiTableStoreQueryGenerator { private static generateQueryEntityWhereFunction( query: string | undefined ): (entity: Entity) => boolean { - if (query === undefined) { + if (query === undefined || query === "") { return () => true; } diff --git a/tests/table/apis/table.entity.query.test.ts b/tests/table/apis/table.entity.query.test.ts index a1d80757f..178f95269 100644 --- a/tests/table/apis/table.entity.query.test.ts +++ b/tests/table/apis/table.entity.query.test.ts @@ -1278,6 +1278,40 @@ describe("table Entity APIs test - using Azure/data-tables", () => { } assert.strictEqual(all.length, 1); + await tableClient.deleteTable(); + }); + + it("21. should work correctly when query filter is empty string, @loki", async () => { + const tableClient = createAzureDataTablesClient( + testLocalAzuriteInstance, + getUniqueName("querywithbool") + ); + const partitionKeyForQueryTest = createUniquePartitionKey(""); + const totalItems = 5; + await tableClient.createTable(); + + for (let i = 0; i < totalItems; i++) { + const result = await tableClient.createEntity({ + partitionKey: `${partitionKeyForQueryTest}${i}`, + rowKey: `${i}`, + foo: "testEntity" + }); + assert.notStrictEqual(result.etag, undefined); + } + + const maxPageSize = 20; + const entities = tableClient.listEntities>({ + queryOptions: { + filter: "" + } + }); + let all: TableEntity<{ foo: string }>[] = []; + for await (const entity of entities.byPage({ + maxPageSize + })) { + all = [...all, ...entity]; + } + assert.strictEqual(all.length, 5); await tableClient.deleteTable(); }); }); From ef7204fb65510a89f8d9bd4b301e07e799a31229 Mon Sep 17 00:00:00 2001 From: Garrett Baski <108769825+garrettbaski@users.noreply.github.com> Date: Tue, 20 Jun 2023 04:10:31 -0700 Subject: [PATCH 130/297] Fix table storage returning entities with empty fields on not equal and other checks : Issue 1929 (#1930) * Adding all of the code to correctly remove any entities with non populated fields when doing a query on said field. This includes the tests, as well as a reproduction for the current issue * Updating change log * Remvoing unused parameter and then naming the test to be more descriptive * Cleaning up the test here * Bad copy paste here, fixing that up * Addressing PR comments from Ben to simplify the code from multiple reiterations of the same code to a single code point * Lost a private somewhere, adding this back * Changing the changelog back as I didnt actually make any changes to fix this --------- Co-authored-by: Garrett Baski --- tests/table/apis/table.entity.query.test.ts | 47 +++++++++++ .../AzuriteTableTest/TestForIssue1929.cs | 81 +++++++++++++++++++ .../AzuriteTableTest/TestTableEntityString.cs | 28 +++++++ 3 files changed, 156 insertions(+) create mode 100644 tests/table/dotnet/AzuriteTableTest/TestForIssue1929.cs create mode 100644 tests/table/dotnet/AzuriteTableTest/TestTableEntityString.cs diff --git a/tests/table/apis/table.entity.query.test.ts b/tests/table/apis/table.entity.query.test.ts index 178f95269..7455f6685 100644 --- a/tests/table/apis/table.entity.query.test.ts +++ b/tests/table/apis/table.entity.query.test.ts @@ -1246,6 +1246,53 @@ describe("table Entity APIs test - using Azure/data-tables", () => { await tableClient.deleteTable(); }); + it("19. should work when empty field is queried, @loki", async () => { + const tableClient = createAzureDataTablesClient( + testLocalAzuriteInstance, + getUniqueName("emptystringfieldneq") + ); + + await tableClient.createTable(); + + const partitionKey = createUniquePartitionKey(""); + + // This should get picked up by the query + const result1 = await tableClient.createEntity({ + partitionKey: partitionKey, + rowKey: `1`, + foo: "TestFoo", + }); + assert.notStrictEqual(result1.etag, undefined); + + // These next two entities should not + const result2 = await tableClient.createEntity({ + partitionKey: partitionKey, + rowKey: `2`, + foo: "", + }); + assert.notStrictEqual(result2.etag, undefined); + + const result3 = await tableClient.createEntity({ + partitionKey: partitionKey, + rowKey: `3` + }); + assert.notStrictEqual(result3.etag, undefined); + + const maxPageSize = 5; + const entities = tableClient.listEntities>({ + queryOptions: { + filter: `PartitionKey eq '${partitionKey}' and foo ne ''` + } + }); + let all: TableEntity<{ foo: string }>[] = []; + for await (const entity of entities.byPage({ + maxPageSize + })) { + all = [...all, ...entity]; + } + assert.strictEqual(all.length, 1); + }); + it("20. should work when getting special characters, @loki", async () => { const tableClient = createAzureDataTablesClient( testLocalAzuriteInstance, diff --git a/tests/table/dotnet/AzuriteTableTest/TestForIssue1929.cs b/tests/table/dotnet/AzuriteTableTest/TestForIssue1929.cs new file mode 100644 index 000000000..e5ff99124 --- /dev/null +++ b/tests/table/dotnet/AzuriteTableTest/TestForIssue1929.cs @@ -0,0 +1,81 @@ +using Azure.Data.Tables; +using Microsoft.WindowsAzure.Storage; +using Microsoft.WindowsAzure.Storage.Table; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace AzuriteTableTest +{ + internal static class TestForIssue1929 + { + internal static async Task RunTest() + { + var account = CloudStorageAccount.Parse("UseDevelopmentStorage=true"); + var client = account.CreateCloudTableClient(); + var table = client.GetTableReference("testtable"); + + await table.CreateIfNotExistsAsync(); + + var pk = Guid.NewGuid().ToString(); + + // Only this value should be returned + var nonNullValue = new TestTableEntityString + { + PartitionKey = pk, + RowKey = "a", + Value = "TestValue" + }; + await table.ExecuteAsync(TableOperation.InsertOrReplace(nonNullValue)); + + var nullValue = new TestTableEntityString + { + PartitionKey = pk, + RowKey = "b" + }; + await table.ExecuteAsync(TableOperation.InsertOrReplace(nullValue)); + + var emptyString = new TestTableEntityString + { + PartitionKey = pk, + RowKey = "c" + }; + await table.ExecuteAsync(TableOperation.InsertOrReplace(emptyString)); + + try + { + var queryResult = await table.ExecuteQuerySegmentedAsync( + new TableQuery().Where($"PartitionKey eq '{pk}' and Value ne ''"), + null); + + if (queryResult.Results.Count > 0) + { + if (queryResult.Results.Count > 1) + { + foreach (var result in queryResult.Results) + { + Console.WriteLine($"Partition Key {result.PartitionKey}, Row Key {result.RowKey}, Value : {result.Value}"); + } + throw new Exception("Error, found too many results"); + } + var onlyResult = queryResult.Results.First(); + Console.WriteLine($"Found only 1 result: PK {onlyResult.PartitionKey}, RK {onlyResult.RowKey}, Val {onlyResult.Value}"); + } + else + { + throw new Exception("No results returned"); + } + } + catch(Exception e) + { + Console.WriteLine($"Exception {e}"); + } + finally + { + await table.DeleteIfExistsAsync(); + } + } + } +} diff --git a/tests/table/dotnet/AzuriteTableTest/TestTableEntityString.cs b/tests/table/dotnet/AzuriteTableTest/TestTableEntityString.cs new file mode 100644 index 000000000..90bb59fc5 --- /dev/null +++ b/tests/table/dotnet/AzuriteTableTest/TestTableEntityString.cs @@ -0,0 +1,28 @@ +using Microsoft.WindowsAzure.Storage.Table; + +namespace AzuriteTableTest +{ + public class TestTableEntityString : TableEntity + { + public string Value { get; set; } + + public TestTableEntityString() + { + + } + + public TestTableEntityString(string partitionKey, string rowKey) + { + PartitionKey = partitionKey; + RowKey = rowKey; + } + + public TestTableEntityString(string partitionKey, string rowKey, string value) + { + PartitionKey = partitionKey; + RowKey = rowKey; + Value = value; + } + } + +} From 082b27066e328a89f70ec7f84d6cda5d8afe1569 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 21 Jun 2023 10:54:21 +0800 Subject: [PATCH 131/297] Bump mysql2 from 3.3.5 to 3.4.0 (#2015) Bumps [mysql2](https://github.com/sidorares/node-mysql2) from 3.3.5 to 3.4.0. - [Release notes](https://github.com/sidorares/node-mysql2/releases) - [Changelog](https://github.com/sidorares/node-mysql2/blob/master/Changelog.md) - [Commits](https://github.com/sidorares/node-mysql2/compare/v3.3.5...v3.4.0) --- updated-dependencies: - dependency-name: mysql2 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 3cb057a2a..243eb1f29 100644 --- a/package-lock.json +++ b/package-lock.json @@ -7431,9 +7431,9 @@ "dev": true }, "node_modules/mysql2": { - "version": "3.3.5", - "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.3.5.tgz", - "integrity": "sha512-ZTQGAzxGeaX1PyeSiZFCgQ34uiXguaEpn3aTFN9Enm9JDnbwWo+4/CJnDdQZ3n0NaMeysi8vwtW/jNUb9VqVDw==", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.4.0.tgz", + "integrity": "sha512-l952dVcdWVfEIIxMQ1PNSPHYY2htylG7H9ahrQe9lIgDpEMg3hB0S88OhC/loNSZpV8OcywSjgOzjSjEUiuwiQ==", "dependencies": { "denque": "^2.1.0", "generate-function": "^2.3.1", @@ -15928,9 +15928,9 @@ "dev": true }, "mysql2": { - "version": "3.3.5", - "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.3.5.tgz", - "integrity": "sha512-ZTQGAzxGeaX1PyeSiZFCgQ34uiXguaEpn3aTFN9Enm9JDnbwWo+4/CJnDdQZ3n0NaMeysi8vwtW/jNUb9VqVDw==", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.4.0.tgz", + "integrity": "sha512-l952dVcdWVfEIIxMQ1PNSPHYY2htylG7H9ahrQe9lIgDpEMg3hB0S88OhC/loNSZpV8OcywSjgOzjSjEUiuwiQ==", "requires": { "denque": "^2.1.0", "generate-function": "^2.3.1", From 16c75cfc49b820b8ba9fee574e9bdcab3527a269 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 21 Jun 2023 11:48:17 +0800 Subject: [PATCH 132/297] Bump @typescript-eslint/parser from 5.59.11 to 5.60.0 (#2014) Bumps [@typescript-eslint/parser](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/parser) from 5.59.11 to 5.60.0. - [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases) - [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/parser/CHANGELOG.md) - [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v5.60.0/packages/parser) --- updated-dependencies: - dependency-name: "@typescript-eslint/parser" dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 402 +++++----------------------------------------- 1 file changed, 43 insertions(+), 359 deletions(-) diff --git a/package-lock.json b/package-lock.json index 243eb1f29..bb09d0968 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1616,53 +1616,6 @@ } } }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/scope-manager": { - "version": "5.60.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.60.0.tgz", - "integrity": "sha512-hakuzcxPwXi2ihf9WQu1BbRj1e/Pd8ZZwVTG9kfbxAMZstKz8/9OoexIwnmLzShtsdap5U/CoQGRCWlSuPbYxQ==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.60.0", - "@typescript-eslint/visitor-keys": "5.60.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/types": { - "version": "5.60.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.60.0.tgz", - "integrity": "sha512-ascOuoCpNZBccFVNJRSC6rPq4EmJ2NkuoKnd6LDNyAQmdDnziAtxbCGWCbefG1CNzmDvd05zO36AmB7H8RzKPA==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/visitor-keys": { - "version": "5.60.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.60.0.tgz", - "integrity": "sha512-wm9Uz71SbCyhUKgcaPRauBdTegUyY/ZWl8gLwD/i/ybJqscrrdVSFImpvUz16BLPChIeKBK5Fa9s6KDQjsjyWw==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.60.0", - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -1687,14 +1640,14 @@ "dev": true }, "node_modules/@typescript-eslint/parser": { - "version": "5.59.11", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.59.11.tgz", - "integrity": "sha512-s9ZF3M+Nym6CAZEkJJeO2TFHHDsKAM3ecNkLuH4i4s8/RCPnF5JRip2GyviYkeEAcwGMJxkqG9h2dAsnA1nZpA==", + "version": "5.60.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.60.0.tgz", + "integrity": "sha512-jBONcBsDJ9UoTWrARkRRCgDz6wUggmH5RpQVlt7BimSwaTkTjwypGzKORXbR4/2Hqjk9hgwlon2rVQAjWNpkyQ==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "5.59.11", - "@typescript-eslint/types": "5.59.11", - "@typescript-eslint/typescript-estree": "5.59.11", + "@typescript-eslint/scope-manager": "5.60.0", + "@typescript-eslint/types": "5.60.0", + "@typescript-eslint/typescript-estree": "5.60.0", "debug": "^4.3.4" }, "engines": { @@ -1737,13 +1690,13 @@ "dev": true }, "node_modules/@typescript-eslint/scope-manager": { - "version": "5.59.11", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.59.11.tgz", - "integrity": "sha512-dHFOsxoLFtrIcSj5h0QoBT/89hxQONwmn3FOQ0GOQcLOOXm+MIrS8zEAhs4tWl5MraxCY3ZJpaXQQdFMc2Tu+Q==", + "version": "5.60.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.60.0.tgz", + "integrity": "sha512-hakuzcxPwXi2ihf9WQu1BbRj1e/Pd8ZZwVTG9kfbxAMZstKz8/9OoexIwnmLzShtsdap5U/CoQGRCWlSuPbYxQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.59.11", - "@typescript-eslint/visitor-keys": "5.59.11" + "@typescript-eslint/types": "5.60.0", + "@typescript-eslint/visitor-keys": "5.60.0" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -1780,63 +1733,6 @@ } } }, - "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/types": { - "version": "5.60.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.60.0.tgz", - "integrity": "sha512-ascOuoCpNZBccFVNJRSC6rPq4EmJ2NkuoKnd6LDNyAQmdDnziAtxbCGWCbefG1CNzmDvd05zO36AmB7H8RzKPA==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree": { - "version": "5.60.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.60.0.tgz", - "integrity": "sha512-R43thAuwarC99SnvrBmh26tc7F6sPa2B3evkXp/8q954kYL6Ro56AwASYWtEEi+4j09GbiNAHqYwNNZuNlARGQ==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.60.0", - "@typescript-eslint/visitor-keys": "5.60.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/visitor-keys": { - "version": "5.60.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.60.0.tgz", - "integrity": "sha512-wm9Uz71SbCyhUKgcaPRauBdTegUyY/ZWl8gLwD/i/ybJqscrrdVSFImpvUz16BLPChIeKBK5Fa9s6KDQjsjyWw==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.60.0", - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, "node_modules/@typescript-eslint/type-utils/node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -1861,9 +1757,9 @@ "dev": true }, "node_modules/@typescript-eslint/types": { - "version": "5.59.11", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.11.tgz", - "integrity": "sha512-epoN6R6tkvBYSc+cllrz+c2sOFWkbisJZWkOE+y3xHtvYaOE6Wk6B8e114McRJwFRjGvYdJwLXQH5c9osME/AA==", + "version": "5.60.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.60.0.tgz", + "integrity": "sha512-ascOuoCpNZBccFVNJRSC6rPq4EmJ2NkuoKnd6LDNyAQmdDnziAtxbCGWCbefG1CNzmDvd05zO36AmB7H8RzKPA==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -1874,13 +1770,13 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.59.11", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.11.tgz", - "integrity": "sha512-YupOpot5hJO0maupJXixi6l5ETdrITxeo5eBOeuV7RSKgYdU3G5cxO49/9WRnJq9EMrB7AuTSLH/bqOsXi7wPA==", + "version": "5.60.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.60.0.tgz", + "integrity": "sha512-R43thAuwarC99SnvrBmh26tc7F6sPa2B3evkXp/8q954kYL6Ro56AwASYWtEEi+4j09GbiNAHqYwNNZuNlARGQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.59.11", - "@typescript-eslint/visitor-keys": "5.59.11", + "@typescript-eslint/types": "5.60.0", + "@typescript-eslint/visitor-keys": "5.60.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -1949,64 +1845,7 @@ "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, - "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/scope-manager": { - "version": "5.60.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.60.0.tgz", - "integrity": "sha512-hakuzcxPwXi2ihf9WQu1BbRj1e/Pd8ZZwVTG9kfbxAMZstKz8/9OoexIwnmLzShtsdap5U/CoQGRCWlSuPbYxQ==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.60.0", - "@typescript-eslint/visitor-keys": "5.60.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/types": { - "version": "5.60.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.60.0.tgz", - "integrity": "sha512-ascOuoCpNZBccFVNJRSC6rPq4EmJ2NkuoKnd6LDNyAQmdDnziAtxbCGWCbefG1CNzmDvd05zO36AmB7H8RzKPA==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree": { - "version": "5.60.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.60.0.tgz", - "integrity": "sha512-R43thAuwarC99SnvrBmh26tc7F6sPa2B3evkXp/8q954kYL6Ro56AwASYWtEEi+4j09GbiNAHqYwNNZuNlARGQ==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.60.0", - "@typescript-eslint/visitor-keys": "5.60.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/visitor-keys": { + "node_modules/@typescript-eslint/visitor-keys": { "version": "5.60.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.60.0.tgz", "integrity": "sha512-wm9Uz71SbCyhUKgcaPRauBdTegUyY/ZWl8gLwD/i/ybJqscrrdVSFImpvUz16BLPChIeKBK5Fa9s6KDQjsjyWw==", @@ -2023,46 +1862,6 @@ "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@typescript-eslint/utils/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/utils/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.59.11", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.11.tgz", - "integrity": "sha512-KGYniTGG3AMTuKF9QBD7EIrvufkB6O6uX3knP73xbKLMpH+QRPcgnCxjWXSHjMRuOxFLovljqQgQpR0c7GvjoA==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.59.11", - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, "node_modules/accepts": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", @@ -11445,32 +11244,6 @@ "tsutils": "^3.21.0" }, "dependencies": { - "@typescript-eslint/scope-manager": { - "version": "5.60.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.60.0.tgz", - "integrity": "sha512-hakuzcxPwXi2ihf9WQu1BbRj1e/Pd8ZZwVTG9kfbxAMZstKz8/9OoexIwnmLzShtsdap5U/CoQGRCWlSuPbYxQ==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.60.0", - "@typescript-eslint/visitor-keys": "5.60.0" - } - }, - "@typescript-eslint/types": { - "version": "5.60.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.60.0.tgz", - "integrity": "sha512-ascOuoCpNZBccFVNJRSC6rPq4EmJ2NkuoKnd6LDNyAQmdDnziAtxbCGWCbefG1CNzmDvd05zO36AmB7H8RzKPA==", - "dev": true - }, - "@typescript-eslint/visitor-keys": { - "version": "5.60.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.60.0.tgz", - "integrity": "sha512-wm9Uz71SbCyhUKgcaPRauBdTegUyY/ZWl8gLwD/i/ybJqscrrdVSFImpvUz16BLPChIeKBK5Fa9s6KDQjsjyWw==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.60.0", - "eslint-visitor-keys": "^3.3.0" - } - }, "debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -11489,14 +11262,14 @@ } }, "@typescript-eslint/parser": { - "version": "5.59.11", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.59.11.tgz", - "integrity": "sha512-s9ZF3M+Nym6CAZEkJJeO2TFHHDsKAM3ecNkLuH4i4s8/RCPnF5JRip2GyviYkeEAcwGMJxkqG9h2dAsnA1nZpA==", + "version": "5.60.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.60.0.tgz", + "integrity": "sha512-jBONcBsDJ9UoTWrARkRRCgDz6wUggmH5RpQVlt7BimSwaTkTjwypGzKORXbR4/2Hqjk9hgwlon2rVQAjWNpkyQ==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "5.59.11", - "@typescript-eslint/types": "5.59.11", - "@typescript-eslint/typescript-estree": "5.59.11", + "@typescript-eslint/scope-manager": "5.60.0", + "@typescript-eslint/types": "5.60.0", + "@typescript-eslint/typescript-estree": "5.60.0", "debug": "^4.3.4" }, "dependencies": { @@ -11518,13 +11291,13 @@ } }, "@typescript-eslint/scope-manager": { - "version": "5.59.11", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.59.11.tgz", - "integrity": "sha512-dHFOsxoLFtrIcSj5h0QoBT/89hxQONwmn3FOQ0GOQcLOOXm+MIrS8zEAhs4tWl5MraxCY3ZJpaXQQdFMc2Tu+Q==", + "version": "5.60.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.60.0.tgz", + "integrity": "sha512-hakuzcxPwXi2ihf9WQu1BbRj1e/Pd8ZZwVTG9kfbxAMZstKz8/9OoexIwnmLzShtsdap5U/CoQGRCWlSuPbYxQ==", "dev": true, "requires": { - "@typescript-eslint/types": "5.59.11", - "@typescript-eslint/visitor-keys": "5.59.11" + "@typescript-eslint/types": "5.60.0", + "@typescript-eslint/visitor-keys": "5.60.0" } }, "@typescript-eslint/type-utils": { @@ -11539,37 +11312,6 @@ "tsutils": "^3.21.0" }, "dependencies": { - "@typescript-eslint/types": { - "version": "5.60.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.60.0.tgz", - "integrity": "sha512-ascOuoCpNZBccFVNJRSC6rPq4EmJ2NkuoKnd6LDNyAQmdDnziAtxbCGWCbefG1CNzmDvd05zO36AmB7H8RzKPA==", - "dev": true - }, - "@typescript-eslint/typescript-estree": { - "version": "5.60.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.60.0.tgz", - "integrity": "sha512-R43thAuwarC99SnvrBmh26tc7F6sPa2B3evkXp/8q954kYL6Ro56AwASYWtEEi+4j09GbiNAHqYwNNZuNlARGQ==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.60.0", - "@typescript-eslint/visitor-keys": "5.60.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - } - }, - "@typescript-eslint/visitor-keys": { - "version": "5.60.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.60.0.tgz", - "integrity": "sha512-wm9Uz71SbCyhUKgcaPRauBdTegUyY/ZWl8gLwD/i/ybJqscrrdVSFImpvUz16BLPChIeKBK5Fa9s6KDQjsjyWw==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.60.0", - "eslint-visitor-keys": "^3.3.0" - } - }, "debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -11588,19 +11330,19 @@ } }, "@typescript-eslint/types": { - "version": "5.59.11", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.11.tgz", - "integrity": "sha512-epoN6R6tkvBYSc+cllrz+c2sOFWkbisJZWkOE+y3xHtvYaOE6Wk6B8e114McRJwFRjGvYdJwLXQH5c9osME/AA==", + "version": "5.60.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.60.0.tgz", + "integrity": "sha512-ascOuoCpNZBccFVNJRSC6rPq4EmJ2NkuoKnd6LDNyAQmdDnziAtxbCGWCbefG1CNzmDvd05zO36AmB7H8RzKPA==", "dev": true }, "@typescript-eslint/typescript-estree": { - "version": "5.59.11", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.11.tgz", - "integrity": "sha512-YupOpot5hJO0maupJXixi6l5ETdrITxeo5eBOeuV7RSKgYdU3G5cxO49/9WRnJq9EMrB7AuTSLH/bqOsXi7wPA==", + "version": "5.60.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.60.0.tgz", + "integrity": "sha512-R43thAuwarC99SnvrBmh26tc7F6sPa2B3evkXp/8q954kYL6Ro56AwASYWtEEi+4j09GbiNAHqYwNNZuNlARGQ==", "dev": true, "requires": { - "@typescript-eslint/types": "5.59.11", - "@typescript-eslint/visitor-keys": "5.59.11", + "@typescript-eslint/types": "5.60.0", + "@typescript-eslint/visitor-keys": "5.60.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -11639,73 +11381,15 @@ "@typescript-eslint/typescript-estree": "5.60.0", "eslint-scope": "^5.1.1", "semver": "^7.3.7" - }, - "dependencies": { - "@typescript-eslint/scope-manager": { - "version": "5.60.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.60.0.tgz", - "integrity": "sha512-hakuzcxPwXi2ihf9WQu1BbRj1e/Pd8ZZwVTG9kfbxAMZstKz8/9OoexIwnmLzShtsdap5U/CoQGRCWlSuPbYxQ==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.60.0", - "@typescript-eslint/visitor-keys": "5.60.0" - } - }, - "@typescript-eslint/types": { - "version": "5.60.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.60.0.tgz", - "integrity": "sha512-ascOuoCpNZBccFVNJRSC6rPq4EmJ2NkuoKnd6LDNyAQmdDnziAtxbCGWCbefG1CNzmDvd05zO36AmB7H8RzKPA==", - "dev": true - }, - "@typescript-eslint/typescript-estree": { - "version": "5.60.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.60.0.tgz", - "integrity": "sha512-R43thAuwarC99SnvrBmh26tc7F6sPa2B3evkXp/8q954kYL6Ro56AwASYWtEEi+4j09GbiNAHqYwNNZuNlARGQ==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.60.0", - "@typescript-eslint/visitor-keys": "5.60.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - } - }, - "@typescript-eslint/visitor-keys": { - "version": "5.60.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.60.0.tgz", - "integrity": "sha512-wm9Uz71SbCyhUKgcaPRauBdTegUyY/ZWl8gLwD/i/ybJqscrrdVSFImpvUz16BLPChIeKBK5Fa9s6KDQjsjyWw==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.60.0", - "eslint-visitor-keys": "^3.3.0" - } - }, - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } } }, "@typescript-eslint/visitor-keys": { - "version": "5.59.11", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.11.tgz", - "integrity": "sha512-KGYniTGG3AMTuKF9QBD7EIrvufkB6O6uX3knP73xbKLMpH+QRPcgnCxjWXSHjMRuOxFLovljqQgQpR0c7GvjoA==", + "version": "5.60.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.60.0.tgz", + "integrity": "sha512-wm9Uz71SbCyhUKgcaPRauBdTegUyY/ZWl8gLwD/i/ybJqscrrdVSFImpvUz16BLPChIeKBK5Fa9s6KDQjsjyWw==", "dev": true, "requires": { - "@typescript-eslint/types": "5.59.11", + "@typescript-eslint/types": "5.60.0", "eslint-visitor-keys": "^3.3.0" } }, From a27633d0e30f4abcd32e321c367f815ae0125d31 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 27 Jun 2023 11:04:52 +0800 Subject: [PATCH 133/297] Bump @typescript-eslint/parser from 5.60.0 to 5.60.1 (#2021) Bumps [@typescript-eslint/parser](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/parser) from 5.60.0 to 5.60.1. - [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases) - [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/parser/CHANGELOG.md) - [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v5.60.1/packages/parser) --- updated-dependencies: - dependency-name: "@typescript-eslint/parser" dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 139 ++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 127 insertions(+), 12 deletions(-) diff --git a/package-lock.json b/package-lock.json index bb09d0968..a376e37bf 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1640,14 +1640,14 @@ "dev": true }, "node_modules/@typescript-eslint/parser": { - "version": "5.60.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.60.0.tgz", - "integrity": "sha512-jBONcBsDJ9UoTWrARkRRCgDz6wUggmH5RpQVlt7BimSwaTkTjwypGzKORXbR4/2Hqjk9hgwlon2rVQAjWNpkyQ==", + "version": "5.60.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.60.1.tgz", + "integrity": "sha512-pHWlc3alg2oSMGwsU/Is8hbm3XFbcrb6P5wIxcQW9NsYBfnrubl/GhVVD/Jm/t8HXhA2WncoIRfBtnCgRGV96Q==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "5.60.0", - "@typescript-eslint/types": "5.60.0", - "@typescript-eslint/typescript-estree": "5.60.0", + "@typescript-eslint/scope-manager": "5.60.1", + "@typescript-eslint/types": "5.60.1", + "@typescript-eslint/typescript-estree": "5.60.1", "debug": "^4.3.4" }, "engines": { @@ -1666,6 +1666,80 @@ } } }, + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/scope-manager": { + "version": "5.60.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.60.1.tgz", + "integrity": "sha512-Dn/LnN7fEoRD+KspEOV0xDMynEmR3iSHdgNsarlXNLGGtcUok8L4N71dxUgt3YvlO8si7E+BJ5Fe3wb5yUw7DQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.60.1", + "@typescript-eslint/visitor-keys": "5.60.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/types": { + "version": "5.60.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.60.1.tgz", + "integrity": "sha512-zDcDx5fccU8BA0IDZc71bAtYIcG9PowaOwaD8rjYbqwK7dpe/UMQl3inJ4UtUK42nOCT41jTSCwg76E62JpMcg==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/typescript-estree": { + "version": "5.60.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.60.1.tgz", + "integrity": "sha512-hkX70J9+2M2ZT6fhti5Q2FoU9zb+GeZK2SLP1WZlvUDqdMbEKhexZODD1WodNRyO8eS+4nScvT0dts8IdaBzfw==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.60.1", + "@typescript-eslint/visitor-keys": "5.60.1", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/visitor-keys": { + "version": "5.60.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.60.1.tgz", + "integrity": "sha512-xEYIxKcultP6E/RMKqube11pGjXH1DCo60mQoWhVYyKfLkwbIVVjYxmOenNMxILx0TjCujPTjjnTIVzm09TXIw==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.60.1", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, "node_modules/@typescript-eslint/parser/node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -11262,17 +11336,58 @@ } }, "@typescript-eslint/parser": { - "version": "5.60.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.60.0.tgz", - "integrity": "sha512-jBONcBsDJ9UoTWrARkRRCgDz6wUggmH5RpQVlt7BimSwaTkTjwypGzKORXbR4/2Hqjk9hgwlon2rVQAjWNpkyQ==", + "version": "5.60.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.60.1.tgz", + "integrity": "sha512-pHWlc3alg2oSMGwsU/Is8hbm3XFbcrb6P5wIxcQW9NsYBfnrubl/GhVVD/Jm/t8HXhA2WncoIRfBtnCgRGV96Q==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "5.60.0", - "@typescript-eslint/types": "5.60.0", - "@typescript-eslint/typescript-estree": "5.60.0", + "@typescript-eslint/scope-manager": "5.60.1", + "@typescript-eslint/types": "5.60.1", + "@typescript-eslint/typescript-estree": "5.60.1", "debug": "^4.3.4" }, "dependencies": { + "@typescript-eslint/scope-manager": { + "version": "5.60.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.60.1.tgz", + "integrity": "sha512-Dn/LnN7fEoRD+KspEOV0xDMynEmR3iSHdgNsarlXNLGGtcUok8L4N71dxUgt3YvlO8si7E+BJ5Fe3wb5yUw7DQ==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.60.1", + "@typescript-eslint/visitor-keys": "5.60.1" + } + }, + "@typescript-eslint/types": { + "version": "5.60.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.60.1.tgz", + "integrity": "sha512-zDcDx5fccU8BA0IDZc71bAtYIcG9PowaOwaD8rjYbqwK7dpe/UMQl3inJ4UtUK42nOCT41jTSCwg76E62JpMcg==", + "dev": true + }, + "@typescript-eslint/typescript-estree": { + "version": "5.60.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.60.1.tgz", + "integrity": "sha512-hkX70J9+2M2ZT6fhti5Q2FoU9zb+GeZK2SLP1WZlvUDqdMbEKhexZODD1WodNRyO8eS+4nScvT0dts8IdaBzfw==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.60.1", + "@typescript-eslint/visitor-keys": "5.60.1", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + } + }, + "@typescript-eslint/visitor-keys": { + "version": "5.60.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.60.1.tgz", + "integrity": "sha512-xEYIxKcultP6E/RMKqube11pGjXH1DCo60mQoWhVYyKfLkwbIVVjYxmOenNMxILx0TjCujPTjjnTIVzm09TXIw==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.60.1", + "eslint-visitor-keys": "^3.3.0" + } + }, "debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", From d9a70c62bd0ef7d672db606e0221e94afd9e273e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 27 Jun 2023 11:07:39 +0800 Subject: [PATCH 134/297] Bump mysql2 from 3.4.0 to 3.4.2 (#2020) Bumps [mysql2](https://github.com/sidorares/node-mysql2) from 3.4.0 to 3.4.2. - [Release notes](https://github.com/sidorares/node-mysql2/releases) - [Changelog](https://github.com/sidorares/node-mysql2/blob/master/Changelog.md) - [Commits](https://github.com/sidorares/node-mysql2/compare/v3.4.0...v3.4.2) --- updated-dependencies: - dependency-name: mysql2 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index a376e37bf..233731c32 100644 --- a/package-lock.json +++ b/package-lock.json @@ -7304,9 +7304,9 @@ "dev": true }, "node_modules/mysql2": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.4.0.tgz", - "integrity": "sha512-l952dVcdWVfEIIxMQ1PNSPHYY2htylG7H9ahrQe9lIgDpEMg3hB0S88OhC/loNSZpV8OcywSjgOzjSjEUiuwiQ==", + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.4.2.tgz", + "integrity": "sha512-hdGwVNke2TJE37gzVvzWRwCFKhrT+5Gy00FDgJUDYArapx3HcaYCJAQUbBiVnB491zLC6HVHNfsmweIotkCRtQ==", "dependencies": { "denque": "^2.1.0", "generate-function": "^2.3.1", @@ -15727,9 +15727,9 @@ "dev": true }, "mysql2": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.4.0.tgz", - "integrity": "sha512-l952dVcdWVfEIIxMQ1PNSPHYY2htylG7H9ahrQe9lIgDpEMg3hB0S88OhC/loNSZpV8OcywSjgOzjSjEUiuwiQ==", + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.4.2.tgz", + "integrity": "sha512-hdGwVNke2TJE37gzVvzWRwCFKhrT+5Gy00FDgJUDYArapx3HcaYCJAQUbBiVnB491zLC6HVHNfsmweIotkCRtQ==", "requires": { "denque": "^2.1.0", "generate-function": "^2.3.1", From 6ba64408a6689e29e69b6355ef2defd432a33e7b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 27 Jun 2023 11:15:36 +0800 Subject: [PATCH 135/297] Bump @typescript-eslint/eslint-plugin from 5.60.0 to 5.60.1 (#2019) Bumps [@typescript-eslint/eslint-plugin](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/eslint-plugin) from 5.60.0 to 5.60.1. - [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases) - [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/eslint-plugin/CHANGELOG.md) - [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v5.60.1/packages/eslint-plugin) --- updated-dependencies: - dependency-name: "@typescript-eslint/eslint-plugin" dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 384 ++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 350 insertions(+), 34 deletions(-) diff --git a/package-lock.json b/package-lock.json index 233731c32..e6e474b70 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1583,15 +1583,15 @@ } }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.60.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.60.0.tgz", - "integrity": "sha512-78B+anHLF1TI8Jn/cD0Q00TBYdMgjdOn980JfAVa9yw5sop8nyTfVOQAv6LWywkOGLclDBtv5z3oxN4w7jxyNg==", + "version": "5.60.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.60.1.tgz", + "integrity": "sha512-KSWsVvsJsLJv3c4e73y/Bzt7OpqMCADUO846bHcuWYSYM19bldbAeDv7dYyV0jwkbMfJ2XdlzwjhXtuD7OY6bw==", "dev": true, "dependencies": { "@eslint-community/regexpp": "^4.4.0", - "@typescript-eslint/scope-manager": "5.60.0", - "@typescript-eslint/type-utils": "5.60.0", - "@typescript-eslint/utils": "5.60.0", + "@typescript-eslint/scope-manager": "5.60.1", + "@typescript-eslint/type-utils": "5.60.1", + "@typescript-eslint/utils": "5.60.1", "debug": "^4.3.4", "grapheme-splitter": "^1.0.4", "ignore": "^5.2.0", @@ -1616,6 +1616,53 @@ } } }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/scope-manager": { + "version": "5.60.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.60.1.tgz", + "integrity": "sha512-Dn/LnN7fEoRD+KspEOV0xDMynEmR3iSHdgNsarlXNLGGtcUok8L4N71dxUgt3YvlO8si7E+BJ5Fe3wb5yUw7DQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.60.1", + "@typescript-eslint/visitor-keys": "5.60.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/types": { + "version": "5.60.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.60.1.tgz", + "integrity": "sha512-zDcDx5fccU8BA0IDZc71bAtYIcG9PowaOwaD8rjYbqwK7dpe/UMQl3inJ4UtUK42nOCT41jTSCwg76E62JpMcg==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/visitor-keys": { + "version": "5.60.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.60.1.tgz", + "integrity": "sha512-xEYIxKcultP6E/RMKqube11pGjXH1DCo60mQoWhVYyKfLkwbIVVjYxmOenNMxILx0TjCujPTjjnTIVzm09TXIw==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.60.1", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -1781,13 +1828,13 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "5.60.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.60.0.tgz", - "integrity": "sha512-X7NsRQddORMYRFH7FWo6sA9Y/zbJ8s1x1RIAtnlj6YprbToTiQnM6vxcMu7iYhdunmoC0rUWlca13D5DVHkK2g==", + "version": "5.60.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.60.1.tgz", + "integrity": "sha512-vN6UztYqIu05nu7JqwQGzQKUJctzs3/Hg7E2Yx8rz9J+4LgtIDFWjjl1gm3pycH0P3mHAcEUBd23LVgfrsTR8A==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "5.60.0", - "@typescript-eslint/utils": "5.60.0", + "@typescript-eslint/typescript-estree": "5.60.1", + "@typescript-eslint/utils": "5.60.1", "debug": "^4.3.4", "tsutils": "^3.21.0" }, @@ -1807,6 +1854,63 @@ } } }, + "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/types": { + "version": "5.60.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.60.1.tgz", + "integrity": "sha512-zDcDx5fccU8BA0IDZc71bAtYIcG9PowaOwaD8rjYbqwK7dpe/UMQl3inJ4UtUK42nOCT41jTSCwg76E62JpMcg==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree": { + "version": "5.60.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.60.1.tgz", + "integrity": "sha512-hkX70J9+2M2ZT6fhti5Q2FoU9zb+GeZK2SLP1WZlvUDqdMbEKhexZODD1WodNRyO8eS+4nScvT0dts8IdaBzfw==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.60.1", + "@typescript-eslint/visitor-keys": "5.60.1", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/visitor-keys": { + "version": "5.60.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.60.1.tgz", + "integrity": "sha512-xEYIxKcultP6E/RMKqube11pGjXH1DCo60mQoWhVYyKfLkwbIVVjYxmOenNMxILx0TjCujPTjjnTIVzm09TXIw==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.60.1", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, "node_modules/@typescript-eslint/type-utils/node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -1894,17 +1998,17 @@ "dev": true }, "node_modules/@typescript-eslint/utils": { - "version": "5.60.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.60.0.tgz", - "integrity": "sha512-ba51uMqDtfLQ5+xHtwlO84vkdjrqNzOnqrnwbMHMRY8Tqeme8C2Q8Fc7LajfGR+e3/4LoYiWXUM6BpIIbHJ4hQ==", + "version": "5.60.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.60.1.tgz", + "integrity": "sha512-tiJ7FFdFQOWssFa3gqb94Ilexyw0JVxj6vBzaSpfN/8IhoKkDuSAenUKvsSHw2A/TMpJb26izIszTXaqygkvpQ==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@types/json-schema": "^7.0.9", "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.60.0", - "@typescript-eslint/types": "5.60.0", - "@typescript-eslint/typescript-estree": "5.60.0", + "@typescript-eslint/scope-manager": "5.60.1", + "@typescript-eslint/types": "5.60.1", + "@typescript-eslint/typescript-estree": "5.60.1", "eslint-scope": "^5.1.1", "semver": "^7.3.7" }, @@ -1919,6 +2023,103 @@ "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, + "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/scope-manager": { + "version": "5.60.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.60.1.tgz", + "integrity": "sha512-Dn/LnN7fEoRD+KspEOV0xDMynEmR3iSHdgNsarlXNLGGtcUok8L4N71dxUgt3YvlO8si7E+BJ5Fe3wb5yUw7DQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.60.1", + "@typescript-eslint/visitor-keys": "5.60.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/types": { + "version": "5.60.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.60.1.tgz", + "integrity": "sha512-zDcDx5fccU8BA0IDZc71bAtYIcG9PowaOwaD8rjYbqwK7dpe/UMQl3inJ4UtUK42nOCT41jTSCwg76E62JpMcg==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree": { + "version": "5.60.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.60.1.tgz", + "integrity": "sha512-hkX70J9+2M2ZT6fhti5Q2FoU9zb+GeZK2SLP1WZlvUDqdMbEKhexZODD1WodNRyO8eS+4nScvT0dts8IdaBzfw==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.60.1", + "@typescript-eslint/visitor-keys": "5.60.1", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/visitor-keys": { + "version": "5.60.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.60.1.tgz", + "integrity": "sha512-xEYIxKcultP6E/RMKqube11pGjXH1DCo60mQoWhVYyKfLkwbIVVjYxmOenNMxILx0TjCujPTjjnTIVzm09TXIw==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.60.1", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/utils/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, "node_modules/@typescript-eslint/visitor-keys": { "version": "5.60.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.60.0.tgz", @@ -11301,15 +11502,15 @@ } }, "@typescript-eslint/eslint-plugin": { - "version": "5.60.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.60.0.tgz", - "integrity": "sha512-78B+anHLF1TI8Jn/cD0Q00TBYdMgjdOn980JfAVa9yw5sop8nyTfVOQAv6LWywkOGLclDBtv5z3oxN4w7jxyNg==", + "version": "5.60.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.60.1.tgz", + "integrity": "sha512-KSWsVvsJsLJv3c4e73y/Bzt7OpqMCADUO846bHcuWYSYM19bldbAeDv7dYyV0jwkbMfJ2XdlzwjhXtuD7OY6bw==", "dev": true, "requires": { "@eslint-community/regexpp": "^4.4.0", - "@typescript-eslint/scope-manager": "5.60.0", - "@typescript-eslint/type-utils": "5.60.0", - "@typescript-eslint/utils": "5.60.0", + "@typescript-eslint/scope-manager": "5.60.1", + "@typescript-eslint/type-utils": "5.60.1", + "@typescript-eslint/utils": "5.60.1", "debug": "^4.3.4", "grapheme-splitter": "^1.0.4", "ignore": "^5.2.0", @@ -11318,6 +11519,32 @@ "tsutils": "^3.21.0" }, "dependencies": { + "@typescript-eslint/scope-manager": { + "version": "5.60.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.60.1.tgz", + "integrity": "sha512-Dn/LnN7fEoRD+KspEOV0xDMynEmR3iSHdgNsarlXNLGGtcUok8L4N71dxUgt3YvlO8si7E+BJ5Fe3wb5yUw7DQ==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.60.1", + "@typescript-eslint/visitor-keys": "5.60.1" + } + }, + "@typescript-eslint/types": { + "version": "5.60.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.60.1.tgz", + "integrity": "sha512-zDcDx5fccU8BA0IDZc71bAtYIcG9PowaOwaD8rjYbqwK7dpe/UMQl3inJ4UtUK42nOCT41jTSCwg76E62JpMcg==", + "dev": true + }, + "@typescript-eslint/visitor-keys": { + "version": "5.60.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.60.1.tgz", + "integrity": "sha512-xEYIxKcultP6E/RMKqube11pGjXH1DCo60mQoWhVYyKfLkwbIVVjYxmOenNMxILx0TjCujPTjjnTIVzm09TXIw==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.60.1", + "eslint-visitor-keys": "^3.3.0" + } + }, "debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -11416,17 +11643,48 @@ } }, "@typescript-eslint/type-utils": { - "version": "5.60.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.60.0.tgz", - "integrity": "sha512-X7NsRQddORMYRFH7FWo6sA9Y/zbJ8s1x1RIAtnlj6YprbToTiQnM6vxcMu7iYhdunmoC0rUWlca13D5DVHkK2g==", + "version": "5.60.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.60.1.tgz", + "integrity": "sha512-vN6UztYqIu05nu7JqwQGzQKUJctzs3/Hg7E2Yx8rz9J+4LgtIDFWjjl1gm3pycH0P3mHAcEUBd23LVgfrsTR8A==", "dev": true, "requires": { - "@typescript-eslint/typescript-estree": "5.60.0", - "@typescript-eslint/utils": "5.60.0", + "@typescript-eslint/typescript-estree": "5.60.1", + "@typescript-eslint/utils": "5.60.1", "debug": "^4.3.4", "tsutils": "^3.21.0" }, "dependencies": { + "@typescript-eslint/types": { + "version": "5.60.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.60.1.tgz", + "integrity": "sha512-zDcDx5fccU8BA0IDZc71bAtYIcG9PowaOwaD8rjYbqwK7dpe/UMQl3inJ4UtUK42nOCT41jTSCwg76E62JpMcg==", + "dev": true + }, + "@typescript-eslint/typescript-estree": { + "version": "5.60.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.60.1.tgz", + "integrity": "sha512-hkX70J9+2M2ZT6fhti5Q2FoU9zb+GeZK2SLP1WZlvUDqdMbEKhexZODD1WodNRyO8eS+4nScvT0dts8IdaBzfw==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.60.1", + "@typescript-eslint/visitor-keys": "5.60.1", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + } + }, + "@typescript-eslint/visitor-keys": { + "version": "5.60.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.60.1.tgz", + "integrity": "sha512-xEYIxKcultP6E/RMKqube11pGjXH1DCo60mQoWhVYyKfLkwbIVVjYxmOenNMxILx0TjCujPTjjnTIVzm09TXIw==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.60.1", + "eslint-visitor-keys": "^3.3.0" + } + }, "debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -11483,19 +11741,77 @@ } }, "@typescript-eslint/utils": { - "version": "5.60.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.60.0.tgz", - "integrity": "sha512-ba51uMqDtfLQ5+xHtwlO84vkdjrqNzOnqrnwbMHMRY8Tqeme8C2Q8Fc7LajfGR+e3/4LoYiWXUM6BpIIbHJ4hQ==", + "version": "5.60.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.60.1.tgz", + "integrity": "sha512-tiJ7FFdFQOWssFa3gqb94Ilexyw0JVxj6vBzaSpfN/8IhoKkDuSAenUKvsSHw2A/TMpJb26izIszTXaqygkvpQ==", "dev": true, "requires": { "@eslint-community/eslint-utils": "^4.2.0", "@types/json-schema": "^7.0.9", "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.60.0", - "@typescript-eslint/types": "5.60.0", - "@typescript-eslint/typescript-estree": "5.60.0", + "@typescript-eslint/scope-manager": "5.60.1", + "@typescript-eslint/types": "5.60.1", + "@typescript-eslint/typescript-estree": "5.60.1", "eslint-scope": "^5.1.1", "semver": "^7.3.7" + }, + "dependencies": { + "@typescript-eslint/scope-manager": { + "version": "5.60.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.60.1.tgz", + "integrity": "sha512-Dn/LnN7fEoRD+KspEOV0xDMynEmR3iSHdgNsarlXNLGGtcUok8L4N71dxUgt3YvlO8si7E+BJ5Fe3wb5yUw7DQ==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.60.1", + "@typescript-eslint/visitor-keys": "5.60.1" + } + }, + "@typescript-eslint/types": { + "version": "5.60.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.60.1.tgz", + "integrity": "sha512-zDcDx5fccU8BA0IDZc71bAtYIcG9PowaOwaD8rjYbqwK7dpe/UMQl3inJ4UtUK42nOCT41jTSCwg76E62JpMcg==", + "dev": true + }, + "@typescript-eslint/typescript-estree": { + "version": "5.60.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.60.1.tgz", + "integrity": "sha512-hkX70J9+2M2ZT6fhti5Q2FoU9zb+GeZK2SLP1WZlvUDqdMbEKhexZODD1WodNRyO8eS+4nScvT0dts8IdaBzfw==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.60.1", + "@typescript-eslint/visitor-keys": "5.60.1", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + } + }, + "@typescript-eslint/visitor-keys": { + "version": "5.60.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.60.1.tgz", + "integrity": "sha512-xEYIxKcultP6E/RMKqube11pGjXH1DCo60mQoWhVYyKfLkwbIVVjYxmOenNMxILx0TjCujPTjjnTIVzm09TXIw==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.60.1", + "eslint-visitor-keys": "^3.3.0" + } + }, + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } } }, "@typescript-eslint/visitor-keys": { From 263d6bfba335661611ca37bcc6bc51172134ea0d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 28 Jun 2023 09:21:17 +0800 Subject: [PATCH 136/297] Bump tslib from 2.5.3 to 2.6.0 (#2022) Bumps [tslib](https://github.com/Microsoft/tslib) from 2.5.3 to 2.6.0. - [Release notes](https://github.com/Microsoft/tslib/releases) - [Commits](https://github.com/Microsoft/tslib/compare/v2.5.3...2.6.0) --- updated-dependencies: - dependency-name: tslib dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 167 ++-------------------------------------------- 1 file changed, 6 insertions(+), 161 deletions(-) diff --git a/package-lock.json b/package-lock.json index e6e474b70..3d4b09fd7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1810,23 +1810,6 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "5.60.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.60.0.tgz", - "integrity": "sha512-hakuzcxPwXi2ihf9WQu1BbRj1e/Pd8ZZwVTG9kfbxAMZstKz8/9OoexIwnmLzShtsdap5U/CoQGRCWlSuPbYxQ==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.60.0", - "@typescript-eslint/visitor-keys": "5.60.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, "node_modules/@typescript-eslint/type-utils": { "version": "5.60.1", "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.60.1.tgz", @@ -1934,69 +1917,6 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, - "node_modules/@typescript-eslint/types": { - "version": "5.60.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.60.0.tgz", - "integrity": "sha512-ascOuoCpNZBccFVNJRSC6rPq4EmJ2NkuoKnd6LDNyAQmdDnziAtxbCGWCbefG1CNzmDvd05zO36AmB7H8RzKPA==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.60.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.60.0.tgz", - "integrity": "sha512-R43thAuwarC99SnvrBmh26tc7F6sPa2B3evkXp/8q954kYL6Ro56AwASYWtEEi+4j09GbiNAHqYwNNZuNlARGQ==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.60.0", - "@typescript-eslint/visitor-keys": "5.60.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, "node_modules/@typescript-eslint/utils": { "version": "5.60.1", "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.60.1.tgz", @@ -2120,23 +2040,6 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.60.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.60.0.tgz", - "integrity": "sha512-wm9Uz71SbCyhUKgcaPRauBdTegUyY/ZWl8gLwD/i/ybJqscrrdVSFImpvUz16BLPChIeKBK5Fa9s6KDQjsjyWw==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.60.0", - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, "node_modules/accepts": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", @@ -9680,9 +9583,9 @@ } }, "node_modules/tslib": { - "version": "2.5.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.3.tgz", - "integrity": "sha512-mSxlJJwl3BMEQCUNnxXBU9jP4JBktcEGhURcPR6VQVlnP0FdDEsIaz0C35dXNGLyRfrATNofF0F5p2KPxQgB+w==" + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.0.tgz", + "integrity": "sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA==" }, "node_modules/tsutils": { "version": "3.21.0", @@ -11632,16 +11535,6 @@ } } }, - "@typescript-eslint/scope-manager": { - "version": "5.60.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.60.0.tgz", - "integrity": "sha512-hakuzcxPwXi2ihf9WQu1BbRj1e/Pd8ZZwVTG9kfbxAMZstKz8/9OoexIwnmLzShtsdap5U/CoQGRCWlSuPbYxQ==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.60.0", - "@typescript-eslint/visitor-keys": "5.60.0" - } - }, "@typescript-eslint/type-utils": { "version": "5.60.1", "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.60.1.tgz", @@ -11702,44 +11595,6 @@ } } }, - "@typescript-eslint/types": { - "version": "5.60.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.60.0.tgz", - "integrity": "sha512-ascOuoCpNZBccFVNJRSC6rPq4EmJ2NkuoKnd6LDNyAQmdDnziAtxbCGWCbefG1CNzmDvd05zO36AmB7H8RzKPA==", - "dev": true - }, - "@typescript-eslint/typescript-estree": { - "version": "5.60.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.60.0.tgz", - "integrity": "sha512-R43thAuwarC99SnvrBmh26tc7F6sPa2B3evkXp/8q954kYL6Ro56AwASYWtEEi+4j09GbiNAHqYwNNZuNlARGQ==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.60.0", - "@typescript-eslint/visitor-keys": "5.60.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - }, - "dependencies": { - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } - } - }, "@typescript-eslint/utils": { "version": "5.60.1", "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.60.1.tgz", @@ -11814,16 +11669,6 @@ } } }, - "@typescript-eslint/visitor-keys": { - "version": "5.60.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.60.0.tgz", - "integrity": "sha512-wm9Uz71SbCyhUKgcaPRauBdTegUyY/ZWl8gLwD/i/ybJqscrrdVSFImpvUz16BLPChIeKBK5Fa9s6KDQjsjyWw==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.60.0", - "eslint-visitor-keys": "^3.3.0" - } - }, "accepts": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", @@ -17626,9 +17471,9 @@ } }, "tslib": { - "version": "2.5.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.3.tgz", - "integrity": "sha512-mSxlJJwl3BMEQCUNnxXBU9jP4JBktcEGhURcPR6VQVlnP0FdDEsIaz0C35dXNGLyRfrATNofF0F5p2KPxQgB+w==" + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.0.tgz", + "integrity": "sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA==" }, "tsutils": { "version": "3.21.0", From 651f2cc459d7318b446d752a02f5ee3aa56ac9a0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 29 Jun 2023 10:32:43 +0800 Subject: [PATCH 137/297] Bump lint-staged from 13.2.2 to 13.2.3 (#2026) Bumps [lint-staged](https://github.com/okonet/lint-staged) from 13.2.2 to 13.2.3. - [Release notes](https://github.com/okonet/lint-staged/releases) - [Commits](https://github.com/okonet/lint-staged/compare/v13.2.2...v13.2.3) --- updated-dependencies: - dependency-name: lint-staged dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 3d4b09fd7..e3e75b345 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6669,9 +6669,9 @@ } }, "node_modules/lint-staged": { - "version": "13.2.2", - "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-13.2.2.tgz", - "integrity": "sha512-71gSwXKy649VrSU09s10uAT0rWCcY3aewhMaHyl2N84oBk4Xs9HgxvUp3AYu+bNsK4NrOYYxvSgg7FyGJ+jGcA==", + "version": "13.2.3", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-13.2.3.tgz", + "integrity": "sha512-zVVEXLuQIhr1Y7R7YAWx4TZLdvuzk7DnmrsTNL0fax6Z3jrpFcas+vKbzxhhvp6TA55m1SQuWkpzI1qbfDZbAg==", "dev": true, "dependencies": { "chalk": "5.2.0", @@ -15312,9 +15312,9 @@ } }, "lint-staged": { - "version": "13.2.2", - "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-13.2.2.tgz", - "integrity": "sha512-71gSwXKy649VrSU09s10uAT0rWCcY3aewhMaHyl2N84oBk4Xs9HgxvUp3AYu+bNsK4NrOYYxvSgg7FyGJ+jGcA==", + "version": "13.2.3", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-13.2.3.tgz", + "integrity": "sha512-zVVEXLuQIhr1Y7R7YAWx4TZLdvuzk7DnmrsTNL0fax6Z3jrpFcas+vKbzxhhvp6TA55m1SQuWkpzI1qbfDZbAg==", "dev": true, "requires": { "chalk": "5.2.0", From f846265d71e417f0cfbf4ffc6f5c6627abba7d0c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 29 Jun 2023 13:31:01 +0800 Subject: [PATCH 138/297] Bump tedious from 16.0.0 to 16.1.0 (#1971) Bumps [tedious](https://github.com/tediousjs/tedious) from 16.0.0 to 16.1.0. - [Release notes](https://github.com/tediousjs/tedious/releases) - [Commits](https://github.com/tediousjs/tedious/compare/v16.0.0...v16.1.0) --- updated-dependencies: - dependency-name: tedious dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/package-lock.json b/package-lock.json index e3e75b345..803323481 100644 --- a/package-lock.json +++ b/package-lock.json @@ -7507,9 +7507,9 @@ } }, "node_modules/node-abort-controller": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/node-abort-controller/-/node-abort-controller-3.0.1.tgz", - "integrity": "sha512-/ujIVxthRs+7q6hsdjHMaj8hRG9NuWmwrz+JdRwZ14jdFoKSkm+vDsCbF9PLpnSqjaWQJuTmVtcWHNLr+vrOFw==" + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/node-abort-controller/-/node-abort-controller-3.1.1.tgz", + "integrity": "sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==" }, "node_modules/node-addon-api": { "version": "4.3.0", @@ -9394,9 +9394,9 @@ } }, "node_modules/tedious": { - "version": "16.0.0", - "resolved": "https://registry.npmjs.org/tedious/-/tedious-16.0.0.tgz", - "integrity": "sha512-8Obq4NoAgjr4iTihRU8tGFX6FbUQc5fbn5vsTbScQQhLsi7nrY7h2rPBE+JS8wjLLKYMmZBt9KfpTFqDdLf93w==", + "version": "16.1.0", + "resolved": "https://registry.npmjs.org/tedious/-/tedious-16.1.0.tgz", + "integrity": "sha512-5W+shTkUoAyrB/Bbx89k6Q8Cb400OHzS6XDXQdsTp/obe1cFyOhNc1KI4FI6TOzklDGJWyLnEEfUSBVMpugnjA==", "dependencies": { "@azure/identity": "^2.0.4", "@azure/keyvault-keys": "^4.4.0", @@ -9407,7 +9407,7 @@ "js-md4": "^0.3.2", "jsbi": "^4.3.0", "native-duplexpair": "^1.0.0", - "node-abort-controller": "^3.0.1", + "node-abort-controller": "^3.1.1", "punycode": "^2.1.0", "sprintf-js": "^1.1.2" }, @@ -15970,9 +15970,9 @@ } }, "node-abort-controller": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/node-abort-controller/-/node-abort-controller-3.0.1.tgz", - "integrity": "sha512-/ujIVxthRs+7q6hsdjHMaj8hRG9NuWmwrz+JdRwZ14jdFoKSkm+vDsCbF9PLpnSqjaWQJuTmVtcWHNLr+vrOFw==" + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/node-abort-controller/-/node-abort-controller-3.1.1.tgz", + "integrity": "sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==" }, "node-addon-api": { "version": "4.3.0", @@ -17327,9 +17327,9 @@ } }, "tedious": { - "version": "16.0.0", - "resolved": "https://registry.npmjs.org/tedious/-/tedious-16.0.0.tgz", - "integrity": "sha512-8Obq4NoAgjr4iTihRU8tGFX6FbUQc5fbn5vsTbScQQhLsi7nrY7h2rPBE+JS8wjLLKYMmZBt9KfpTFqDdLf93w==", + "version": "16.1.0", + "resolved": "https://registry.npmjs.org/tedious/-/tedious-16.1.0.tgz", + "integrity": "sha512-5W+shTkUoAyrB/Bbx89k6Q8Cb400OHzS6XDXQdsTp/obe1cFyOhNc1KI4FI6TOzklDGJWyLnEEfUSBVMpugnjA==", "requires": { "@azure/identity": "^2.0.4", "@azure/keyvault-keys": "^4.4.0", @@ -17340,7 +17340,7 @@ "js-md4": "^0.3.2", "jsbi": "^4.3.0", "native-duplexpair": "^1.0.0", - "node-abort-controller": "^3.0.1", + "node-abort-controller": "^3.1.1", "punycode": "^2.1.0", "sprintf-js": "^1.1.2" }, From 99e1947f5a1fccca5e1a88ad0d62d7b8a19bd07b Mon Sep 17 00:00:00 2001 From: Wei Wei Date: Fri, 30 Jun 2023 10:00:30 +0000 Subject: [PATCH 139/297] Fix merge entity fail with pk/rk contains single quota (#2009) (#2024) * Fix merge entity fail with pk/rk contains single quota (#2009) * temp: remove test case --- ChangeLog.md | 1 + .../tableStorageContext.middleware.ts | 17 ++---- tests/table/apis/table.entity.test.ts | 55 +++++++++++++++++++ 3 files changed, 61 insertions(+), 12 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index 037568d8b..7c4abadde 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -7,6 +7,7 @@ Table: - Fixed issue with query table fail with filter condition as string.Empty. (issue #1880) +- Fixed merge table entity fail with single quota in PK/RK. (issue #2009) ## 2023.06 Version 3.24.0 diff --git a/src/table/middleware/tableStorageContext.middleware.ts b/src/table/middleware/tableStorageContext.middleware.ts index 99b23bbab..8a9efb024 100644 --- a/src/table/middleware/tableStorageContext.middleware.ts +++ b/src/table/middleware/tableStorageContext.middleware.ts @@ -134,18 +134,11 @@ export function tableStorageContextMiddleware( 0, tableSection.indexOf("(") ); - const firstQuoteIndex = tableSection.indexOf("'"); - const secondQuoteIndex = tableSection.indexOf("'", firstQuoteIndex + 1); - const thridQuoteIndex = tableSection.indexOf("'", secondQuoteIndex + 1); - const fourthQuoteIndex = tableSection.indexOf("'", thridQuoteIndex + 1); - tableContext.partitionKey = tableSection.substring( - firstQuoteIndex + 1, - secondQuoteIndex - ); - tableContext.rowKey = tableSection.substring( - thridQuoteIndex + 1, - fourthQuoteIndex - ); + + const regex = /'([^']|'')*'/g; + const matches = tableSection?.match(regex); + tableContext.partitionKey = matches? matches[0].replace(/^'|'$/g, '').replace(/''/g, "'"): undefined; + tableContext.rowKey = matches? matches[1].replace(/^'|'$/g, '').replace(/''/g, "'"): undefined; tableSection = `${tableContext.tableName}(PartitionKey='PLACEHOLDER',RowKey='PLACEHOLDER')`; } else if ( diff --git a/tests/table/apis/table.entity.test.ts b/tests/table/apis/table.entity.test.ts index 539cfc5fa..3cc2e3f0f 100644 --- a/tests/table/apis/table.entity.test.ts +++ b/tests/table/apis/table.entity.test.ts @@ -1608,4 +1608,59 @@ describe("table Entity APIs test - using Azure-Storage", () => { }); }); }); + + it("36. Merge on an Entity with single quota in PartitionKey and RowKey, @loki", (done) => { + const partitionKey = "pk single'quota string"; + const rowKey= "rk single'quota string"; + + // Insert entity with the specific pk,rk + const entityInsert = new TestEntity(partitionKey, rowKey, "value1"); + tableService.insertEntity( + tableName, + entityInsert, + (insertError, insertResult, insertresponse) => { + if (insertError) { + assert.fail(insertError.message); + done(); + } + else + { + // merge entity with the specific pk,rk, to a different value + const entityMerge = new TestEntity(partitionKey, rowKey, "value2"); + tableService.mergeEntity( + tableName, + entityMerge, + (mergeError, updateResult, updateResponse) => { + if (!mergeError) { + assert.strictEqual(updateResponse.statusCode, 204); // Precondition succeeded + + // retrieve entity with the specific pk,rk, and validate value is updated + tableService.retrieveEntity( + tableName, + partitionKey, + rowKey, + (error, result) => { + if (error) { + assert.fail(error.message); + done(); + } + else + { + assert.strictEqual(result.PartitionKey._, partitionKey); + assert.strictEqual(result.RowKey._, rowKey); + assert.strictEqual(result.myValue._, "value2"); + done(); + } + } + ); + } else { + assert.fail(mergeError.message); + done(); + } + } + ); + } + } + ); + }); }); From 04b08ed122403d98f4e1cd7a616b7953fa08c964 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 3 Jul 2023 10:02:13 +0800 Subject: [PATCH 140/297] Bump mysql2 from 3.4.2 to 3.4.3 (#2027) Bumps [mysql2](https://github.com/sidorares/node-mysql2) from 3.4.2 to 3.4.3. - [Release notes](https://github.com/sidorares/node-mysql2/releases) - [Changelog](https://github.com/sidorares/node-mysql2/blob/master/Changelog.md) - [Commits](https://github.com/sidorares/node-mysql2/compare/v3.4.2...v3.4.3) --- updated-dependencies: - dependency-name: mysql2 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 803323481..c1a53866a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -7408,9 +7408,9 @@ "dev": true }, "node_modules/mysql2": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.4.2.tgz", - "integrity": "sha512-hdGwVNke2TJE37gzVvzWRwCFKhrT+5Gy00FDgJUDYArapx3HcaYCJAQUbBiVnB491zLC6HVHNfsmweIotkCRtQ==", + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.4.3.tgz", + "integrity": "sha512-pgXnfmZlJ2JnJk9A5z3tnJcG4w8ly/AbVsVsgcavhiOQ7VQpxMwmIyR2CTNxNLKQWQUdD5QOkKkY1DdoRDgSnA==", "dependencies": { "denque": "^2.1.0", "generate-function": "^2.3.1", @@ -15888,9 +15888,9 @@ "dev": true }, "mysql2": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.4.2.tgz", - "integrity": "sha512-hdGwVNke2TJE37gzVvzWRwCFKhrT+5Gy00FDgJUDYArapx3HcaYCJAQUbBiVnB491zLC6HVHNfsmweIotkCRtQ==", + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.4.3.tgz", + "integrity": "sha512-pgXnfmZlJ2JnJk9A5z3tnJcG4w8ly/AbVsVsgcavhiOQ7VQpxMwmIyR2CTNxNLKQWQUdD5QOkKkY1DdoRDgSnA==", "requires": { "denque": "^2.1.0", "generate-function": "^2.3.1", From 501f7380c17c85d1617a1c67172a5a8f86273362 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 3 Jul 2023 10:26:25 +0800 Subject: [PATCH 141/297] Bump typescript from 5.0.4 to 5.1.6 (#2028) * Bump typescript from 5.0.4 to 5.1.6 Bumps [typescript](https://github.com/Microsoft/TypeScript) from 5.0.4 to 5.1.6. - [Release notes](https://github.com/Microsoft/TypeScript/releases) - [Commits](https://github.com/Microsoft/TypeScript/commits) --- updated-dependencies: - dependency-name: typescript dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] * Update azure-pipelines.yml- change Node12 to Node 18, as node 12 is deprecated * Upgrade pipeline to include node 20 --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Wei Wei --- azure-pipelines.yml | 8 ++++---- package-lock.json | 14 +++++++------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index b159421dc..0b7fb01b0 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -17,8 +17,8 @@ jobs: vmImage: "ubuntu-20.04" strategy: matrix: - node_12_x: - node_version: 12.x + node_20_x: + node_version: 20.x node_14_x: node_version: 14.x steps: @@ -548,8 +548,8 @@ jobs: # our .exe build program is currently incompatible with node 10 # node_10_x: # node_version: 10.x - node_12_x: - node_version: 12.x + node_20_x: + node_version: 20.x steps: - task: NodeTool@0 inputs: diff --git a/package-lock.json b/package-lock.json index c1a53866a..d066c0409 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9682,16 +9682,16 @@ } }, "node_modules/typescript": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.4.tgz", - "integrity": "sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw==", + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz", + "integrity": "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==", "dev": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" }, "engines": { - "node": ">=12.20" + "node": ">=14.17" } }, "node_modules/uc.micro": { @@ -17548,9 +17548,9 @@ } }, "typescript": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.4.tgz", - "integrity": "sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw==", + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz", + "integrity": "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==", "dev": true }, "uc.micro": { From b64b64eafe3ebb2740ae4c783a29f0cf495c2022 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 4 Jul 2023 10:41:41 +0800 Subject: [PATCH 142/297] Bump eslint from 8.43.0 to 8.44.0 (#2032) Bumps [eslint](https://github.com/eslint/eslint) from 8.43.0 to 8.44.0. - [Release notes](https://github.com/eslint/eslint/releases) - [Changelog](https://github.com/eslint/eslint/blob/main/CHANGELOG.md) - [Commits](https://github.com/eslint/eslint/compare/v8.43.0...v8.44.0) --- updated-dependencies: - dependency-name: eslint dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 134 +++++++++++++++++++++++----------------------- 1 file changed, 67 insertions(+), 67 deletions(-) diff --git a/package-lock.json b/package-lock.json index d066c0409..384837221 100644 --- a/package-lock.json +++ b/package-lock.json @@ -88,6 +88,15 @@ "vscode": "^1.39.0" } }, + "node_modules/@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", + "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/@azure/abort-controller": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@azure/abort-controller/-/abort-controller-1.0.1.tgz", @@ -931,14 +940,14 @@ } }, "node_modules/@eslint/eslintrc": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.3.tgz", - "integrity": "sha512-+5gy6OQfk+xx3q0d6jGZZC3f3KzAkXc/IanVxd1is/VIIziRqqt3ongQz0FiTUXqTk0c7aDB3OaFuKnuSoJicQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.0.tgz", + "integrity": "sha512-Lj7DECXqIVCqnqjjHMPna4vn6GJcMgul/wuS0je9OZ9gsL0zzDpKPVtcG1HaDVc+9y+qgXneTeUMbCqXJNpH1A==", "dev": true, "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", - "espree": "^9.5.2", + "espree": "^9.6.0", "globals": "^13.19.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", @@ -1028,9 +1037,9 @@ } }, "node_modules/@eslint/js": { - "version": "8.43.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.43.0.tgz", - "integrity": "sha512-s2UHCoiXfxMvmfzqoN+vrQ84ahUSYde9qNO1MdxmoEhyHWsfmwOpFlwYV+ePJEVc7gFnATGUi376WowX1N7tFg==", + "version": "8.44.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.44.0.tgz", + "integrity": "sha512-Ag+9YM4ocKQx9AarydN0KY2j0ErMHNIocPDrVo8zAE44xLTjEtz81OdR68/cydGtk6m6jDb5Za3r2useMzYmSw==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -2072,9 +2081,9 @@ } }, "node_modules/acorn": { - "version": "8.8.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", - "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", + "version": "8.9.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.9.0.tgz", + "integrity": "sha512-jaVNAFBHNLXspO543WnNNPZFRtavh3skAkITqD0/2aeMkKZTN+254PyhwxFYrk3vQ1xfY+2wbesJMs/JC8/PwQ==", "dev": true, "bin": { "acorn": "bin/acorn" @@ -4360,15 +4369,15 @@ } }, "node_modules/eslint": { - "version": "8.43.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.43.0.tgz", - "integrity": "sha512-aaCpf2JqqKesMFGgmRPessmVKjcGXqdlAYLLC3THM8t5nBRZRQ+st5WM/hoJXkdioEXLLbXgclUpM0TXo5HX5Q==", + "version": "8.44.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.44.0.tgz", + "integrity": "sha512-0wpHoUbDUHgNCyvFB5aXLiQVfK9B0at6gUvzy83k4kAsQ/u769TQDX6iKC+aO4upIHO9WSaA3QoXYQDHbNwf1A==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.4.0", - "@eslint/eslintrc": "^2.0.3", - "@eslint/js": "8.43.0", + "@eslint/eslintrc": "^2.1.0", + "@eslint/js": "8.44.0", "@humanwhocodes/config-array": "^0.11.10", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", @@ -4380,7 +4389,7 @@ "escape-string-regexp": "^4.0.0", "eslint-scope": "^7.2.0", "eslint-visitor-keys": "^3.4.1", - "espree": "^9.5.2", + "espree": "^9.6.0", "esquery": "^1.4.2", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", @@ -4400,7 +4409,7 @@ "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", - "optionator": "^0.9.1", + "optionator": "^0.9.3", "strip-ansi": "^6.0.1", "strip-json-comments": "^3.1.0", "text-table": "^0.2.0" @@ -4714,12 +4723,12 @@ } }, "node_modules/espree": { - "version": "9.5.2", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.2.tgz", - "integrity": "sha512-7OASN1Wma5fum5SrNhFMAMJxOUAbhyfQ8dQ//PJaJbNw0URTPWqIghHWt1MmAANKhHZIYOHruW4Kw4ruUWOdGw==", + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.0.tgz", + "integrity": "sha512-1FH/IiruXZ84tpUlm0aCUEwMl2Ho5ilqVh0VvQXw+byAz/4SAciyHLlfmL5WYqsvD38oymdUwBss0LtK8m4s/A==", "dev": true, "dependencies": { - "acorn": "^8.8.0", + "acorn": "^8.9.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^3.4.1" }, @@ -7690,17 +7699,17 @@ } }, "node_modules/optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", "dev": true, "dependencies": { + "@aashutoshrathi/word-wrap": "^1.2.3", "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" + "type-check": "^0.4.0" }, "engines": { "node": ">= 0.8.0" @@ -10010,15 +10019,6 @@ "@types/node": "*" } }, - "node_modules/word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/wrap-ansi": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", @@ -10172,6 +10172,12 @@ } }, "dependencies": { + "@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", + "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", + "dev": true + }, "@azure/abort-controller": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@azure/abort-controller/-/abort-controller-1.0.1.tgz", @@ -10859,14 +10865,14 @@ "dev": true }, "@eslint/eslintrc": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.3.tgz", - "integrity": "sha512-+5gy6OQfk+xx3q0d6jGZZC3f3KzAkXc/IanVxd1is/VIIziRqqt3ongQz0FiTUXqTk0c7aDB3OaFuKnuSoJicQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.0.tgz", + "integrity": "sha512-Lj7DECXqIVCqnqjjHMPna4vn6GJcMgul/wuS0je9OZ9gsL0zzDpKPVtcG1HaDVc+9y+qgXneTeUMbCqXJNpH1A==", "dev": true, "requires": { "ajv": "^6.12.4", "debug": "^4.3.2", - "espree": "^9.5.2", + "espree": "^9.6.0", "globals": "^13.19.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", @@ -10923,9 +10929,9 @@ } }, "@eslint/js": { - "version": "8.43.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.43.0.tgz", - "integrity": "sha512-s2UHCoiXfxMvmfzqoN+vrQ84ahUSYde9qNO1MdxmoEhyHWsfmwOpFlwYV+ePJEVc7gFnATGUi376WowX1N7tFg==", + "version": "8.44.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.44.0.tgz", + "integrity": "sha512-Ag+9YM4ocKQx9AarydN0KY2j0ErMHNIocPDrVo8zAE44xLTjEtz81OdR68/cydGtk6m6jDb5Za3r2useMzYmSw==", "dev": true }, "@humanwhocodes/config-array": { @@ -11694,9 +11700,9 @@ } }, "acorn": { - "version": "8.8.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", - "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", + "version": "8.9.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.9.0.tgz", + "integrity": "sha512-jaVNAFBHNLXspO543WnNNPZFRtavh3skAkITqD0/2aeMkKZTN+254PyhwxFYrk3vQ1xfY+2wbesJMs/JC8/PwQ==", "dev": true }, "acorn-jsx": { @@ -13626,15 +13632,15 @@ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" }, "eslint": { - "version": "8.43.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.43.0.tgz", - "integrity": "sha512-aaCpf2JqqKesMFGgmRPessmVKjcGXqdlAYLLC3THM8t5nBRZRQ+st5WM/hoJXkdioEXLLbXgclUpM0TXo5HX5Q==", + "version": "8.44.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.44.0.tgz", + "integrity": "sha512-0wpHoUbDUHgNCyvFB5aXLiQVfK9B0at6gUvzy83k4kAsQ/u769TQDX6iKC+aO4upIHO9WSaA3QoXYQDHbNwf1A==", "dev": true, "requires": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.4.0", - "@eslint/eslintrc": "^2.0.3", - "@eslint/js": "8.43.0", + "@eslint/eslintrc": "^2.1.0", + "@eslint/js": "8.44.0", "@humanwhocodes/config-array": "^0.11.10", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", @@ -13646,7 +13652,7 @@ "escape-string-regexp": "^4.0.0", "eslint-scope": "^7.2.0", "eslint-visitor-keys": "^3.4.1", - "espree": "^9.5.2", + "espree": "^9.6.0", "esquery": "^1.4.2", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", @@ -13666,7 +13672,7 @@ "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", - "optionator": "^0.9.1", + "optionator": "^0.9.3", "strip-ansi": "^6.0.1", "strip-json-comments": "^3.1.0", "text-table": "^0.2.0" @@ -13872,12 +13878,12 @@ "dev": true }, "espree": { - "version": "9.5.2", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.2.tgz", - "integrity": "sha512-7OASN1Wma5fum5SrNhFMAMJxOUAbhyfQ8dQ//PJaJbNw0URTPWqIghHWt1MmAANKhHZIYOHruW4Kw4ruUWOdGw==", + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.0.tgz", + "integrity": "sha512-1FH/IiruXZ84tpUlm0aCUEwMl2Ho5ilqVh0VvQXw+byAz/4SAciyHLlfmL5WYqsvD38oymdUwBss0LtK8m4s/A==", "dev": true, "requires": { - "acorn": "^8.8.0", + "acorn": "^8.9.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^3.4.1" } @@ -16094,17 +16100,17 @@ } }, "optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", "dev": true, "requires": { + "@aashutoshrathi/word-wrap": "^1.2.3", "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" + "type-check": "^0.4.0" } }, "os-homedir": { @@ -17807,12 +17813,6 @@ "@types/node": "*" } }, - "word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "dev": true - }, "wrap-ansi": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", From 9c4c3999f8aa941ea4480343e37920f2e4bd55c2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 4 Jul 2023 11:00:33 +0800 Subject: [PATCH 143/297] Bump @typescript-eslint/parser from 5.60.1 to 5.61.0 (#2031) Bumps [@typescript-eslint/parser](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/parser) from 5.60.1 to 5.61.0. - [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases) - [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/parser/CHANGELOG.md) - [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v5.61.0/packages/parser) --- updated-dependencies: - dependency-name: "@typescript-eslint/parser" dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 278 ++++++++++++++++++++++++++-------------------- 1 file changed, 159 insertions(+), 119 deletions(-) diff --git a/package-lock.json b/package-lock.json index 384837221..34cbeb385 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1696,14 +1696,14 @@ "dev": true }, "node_modules/@typescript-eslint/parser": { - "version": "5.60.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.60.1.tgz", - "integrity": "sha512-pHWlc3alg2oSMGwsU/Is8hbm3XFbcrb6P5wIxcQW9NsYBfnrubl/GhVVD/Jm/t8HXhA2WncoIRfBtnCgRGV96Q==", + "version": "5.61.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.61.0.tgz", + "integrity": "sha512-yGr4Sgyh8uO6fSi9hw3jAFXNBHbCtKKFMdX2IkT3ZqpKmtAq3lHS4ixB/COFuAIJpwl9/AqF7j72ZDWYKmIfvg==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "5.60.1", - "@typescript-eslint/types": "5.60.1", - "@typescript-eslint/typescript-estree": "5.60.1", + "@typescript-eslint/scope-manager": "5.61.0", + "@typescript-eslint/types": "5.61.0", + "@typescript-eslint/typescript-estree": "5.61.0", "debug": "^4.3.4" }, "engines": { @@ -1722,14 +1722,56 @@ } } }, - "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/scope-manager": { + "node_modules/@typescript-eslint/parser/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/parser/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "5.61.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.61.0.tgz", + "integrity": "sha512-W8VoMjoSg7f7nqAROEmTt6LoBpn81AegP7uKhhW5KzYlehs8VV0ZW0fIDVbcZRcaP3aPSW+JZFua+ysQN+m/Nw==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.61.0", + "@typescript-eslint/visitor-keys": "5.61.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { "version": "5.60.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.60.1.tgz", - "integrity": "sha512-Dn/LnN7fEoRD+KspEOV0xDMynEmR3iSHdgNsarlXNLGGtcUok8L4N71dxUgt3YvlO8si7E+BJ5Fe3wb5yUw7DQ==", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.60.1.tgz", + "integrity": "sha512-vN6UztYqIu05nu7JqwQGzQKUJctzs3/Hg7E2Yx8rz9J+4LgtIDFWjjl1gm3pycH0P3mHAcEUBd23LVgfrsTR8A==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.60.1", - "@typescript-eslint/visitor-keys": "5.60.1" + "@typescript-eslint/typescript-estree": "5.60.1", + "@typescript-eslint/utils": "5.60.1", + "debug": "^4.3.4", + "tsutils": "^3.21.0" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -1737,9 +1779,17 @@ "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/types": { + "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/types": { "version": "5.60.1", "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.60.1.tgz", "integrity": "sha512-zDcDx5fccU8BA0IDZc71bAtYIcG9PowaOwaD8rjYbqwK7dpe/UMQl3inJ4UtUK42nOCT41jTSCwg76E62JpMcg==", @@ -1752,7 +1802,7 @@ "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/typescript-estree": { + "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree": { "version": "5.60.1", "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.60.1.tgz", "integrity": "sha512-hkX70J9+2M2ZT6fhti5Q2FoU9zb+GeZK2SLP1WZlvUDqdMbEKhexZODD1WodNRyO8eS+4nScvT0dts8IdaBzfw==", @@ -1779,7 +1829,7 @@ } } }, - "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/visitor-keys": { + "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/visitor-keys": { "version": "5.60.1", "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.60.1.tgz", "integrity": "sha512-xEYIxKcultP6E/RMKqube11pGjXH1DCo60mQoWhVYyKfLkwbIVVjYxmOenNMxILx0TjCujPTjjnTIVzm09TXIw==", @@ -1796,7 +1846,7 @@ "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@typescript-eslint/parser/node_modules/debug": { + "node_modules/@typescript-eslint/type-utils/node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", @@ -1813,43 +1863,16 @@ } } }, - "node_modules/@typescript-eslint/parser/node_modules/ms": { + "node_modules/@typescript-eslint/type-utils/node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, - "node_modules/@typescript-eslint/type-utils": { - "version": "5.60.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.60.1.tgz", - "integrity": "sha512-vN6UztYqIu05nu7JqwQGzQKUJctzs3/Hg7E2Yx8rz9J+4LgtIDFWjjl1gm3pycH0P3mHAcEUBd23LVgfrsTR8A==", - "dev": true, - "dependencies": { - "@typescript-eslint/typescript-estree": "5.60.1", - "@typescript-eslint/utils": "5.60.1", - "debug": "^4.3.4", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "*" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/types": { - "version": "5.60.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.60.1.tgz", - "integrity": "sha512-zDcDx5fccU8BA0IDZc71bAtYIcG9PowaOwaD8rjYbqwK7dpe/UMQl3inJ4UtUK42nOCT41jTSCwg76E62JpMcg==", + "node_modules/@typescript-eslint/types": { + "version": "5.61.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.61.0.tgz", + "integrity": "sha512-ldyueo58KjngXpzloHUog/h9REmHl59G1b3a5Sng1GfBo14BkS3ZbMEb3693gnP1k//97lh7bKsp6/V/0v1veQ==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -1859,14 +1882,14 @@ "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree": { - "version": "5.60.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.60.1.tgz", - "integrity": "sha512-hkX70J9+2M2ZT6fhti5Q2FoU9zb+GeZK2SLP1WZlvUDqdMbEKhexZODD1WodNRyO8eS+4nScvT0dts8IdaBzfw==", + "node_modules/@typescript-eslint/typescript-estree": { + "version": "5.61.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.61.0.tgz", + "integrity": "sha512-Fud90PxONnnLZ36oR5ClJBLTLfU4pIWBmnvGwTbEa2cXIqj70AEDEmOmpkFComjBZ/037ueKrOdHuYmSFVD7Rw==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.60.1", - "@typescript-eslint/visitor-keys": "5.60.1", + "@typescript-eslint/types": "5.61.0", + "@typescript-eslint/visitor-keys": "5.61.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -1886,24 +1909,7 @@ } } }, - "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/visitor-keys": { - "version": "5.60.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.60.1.tgz", - "integrity": "sha512-xEYIxKcultP6E/RMKqube11pGjXH1DCo60mQoWhVYyKfLkwbIVVjYxmOenNMxILx0TjCujPTjjnTIVzm09TXIw==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.60.1", - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/type-utils/node_modules/debug": { + "node_modules/@typescript-eslint/typescript-estree/node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", @@ -1920,7 +1926,7 @@ } } }, - "node_modules/@typescript-eslint/type-utils/node_modules/ms": { + "node_modules/@typescript-eslint/typescript-estree/node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", @@ -2049,6 +2055,23 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "5.61.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.61.0.tgz", + "integrity": "sha512-50XQ5VdbWrX06mQXhy93WywSFZZGsv3EOjq+lqp6WC2t+j3mb6A9xYVdrRxafvK88vg9k9u+CT4l6D8PEatjKg==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.61.0", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, "node_modules/accepts": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", @@ -11472,58 +11495,17 @@ } }, "@typescript-eslint/parser": { - "version": "5.60.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.60.1.tgz", - "integrity": "sha512-pHWlc3alg2oSMGwsU/Is8hbm3XFbcrb6P5wIxcQW9NsYBfnrubl/GhVVD/Jm/t8HXhA2WncoIRfBtnCgRGV96Q==", + "version": "5.61.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.61.0.tgz", + "integrity": "sha512-yGr4Sgyh8uO6fSi9hw3jAFXNBHbCtKKFMdX2IkT3ZqpKmtAq3lHS4ixB/COFuAIJpwl9/AqF7j72ZDWYKmIfvg==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "5.60.1", - "@typescript-eslint/types": "5.60.1", - "@typescript-eslint/typescript-estree": "5.60.1", + "@typescript-eslint/scope-manager": "5.61.0", + "@typescript-eslint/types": "5.61.0", + "@typescript-eslint/typescript-estree": "5.61.0", "debug": "^4.3.4" }, "dependencies": { - "@typescript-eslint/scope-manager": { - "version": "5.60.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.60.1.tgz", - "integrity": "sha512-Dn/LnN7fEoRD+KspEOV0xDMynEmR3iSHdgNsarlXNLGGtcUok8L4N71dxUgt3YvlO8si7E+BJ5Fe3wb5yUw7DQ==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.60.1", - "@typescript-eslint/visitor-keys": "5.60.1" - } - }, - "@typescript-eslint/types": { - "version": "5.60.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.60.1.tgz", - "integrity": "sha512-zDcDx5fccU8BA0IDZc71bAtYIcG9PowaOwaD8rjYbqwK7dpe/UMQl3inJ4UtUK42nOCT41jTSCwg76E62JpMcg==", - "dev": true - }, - "@typescript-eslint/typescript-estree": { - "version": "5.60.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.60.1.tgz", - "integrity": "sha512-hkX70J9+2M2ZT6fhti5Q2FoU9zb+GeZK2SLP1WZlvUDqdMbEKhexZODD1WodNRyO8eS+4nScvT0dts8IdaBzfw==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.60.1", - "@typescript-eslint/visitor-keys": "5.60.1", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - } - }, - "@typescript-eslint/visitor-keys": { - "version": "5.60.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.60.1.tgz", - "integrity": "sha512-xEYIxKcultP6E/RMKqube11pGjXH1DCo60mQoWhVYyKfLkwbIVVjYxmOenNMxILx0TjCujPTjjnTIVzm09TXIw==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.60.1", - "eslint-visitor-keys": "^3.3.0" - } - }, "debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -11541,6 +11523,16 @@ } } }, + "@typescript-eslint/scope-manager": { + "version": "5.61.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.61.0.tgz", + "integrity": "sha512-W8VoMjoSg7f7nqAROEmTt6LoBpn81AegP7uKhhW5KzYlehs8VV0ZW0fIDVbcZRcaP3aPSW+JZFua+ysQN+m/Nw==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.61.0", + "@typescript-eslint/visitor-keys": "5.61.0" + } + }, "@typescript-eslint/type-utils": { "version": "5.60.1", "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.60.1.tgz", @@ -11601,6 +11593,44 @@ } } }, + "@typescript-eslint/types": { + "version": "5.61.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.61.0.tgz", + "integrity": "sha512-ldyueo58KjngXpzloHUog/h9REmHl59G1b3a5Sng1GfBo14BkS3ZbMEb3693gnP1k//97lh7bKsp6/V/0v1veQ==", + "dev": true + }, + "@typescript-eslint/typescript-estree": { + "version": "5.61.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.61.0.tgz", + "integrity": "sha512-Fud90PxONnnLZ36oR5ClJBLTLfU4pIWBmnvGwTbEa2cXIqj70AEDEmOmpkFComjBZ/037ueKrOdHuYmSFVD7Rw==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.61.0", + "@typescript-eslint/visitor-keys": "5.61.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "dependencies": { + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, "@typescript-eslint/utils": { "version": "5.60.1", "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.60.1.tgz", @@ -11675,6 +11705,16 @@ } } }, + "@typescript-eslint/visitor-keys": { + "version": "5.61.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.61.0.tgz", + "integrity": "sha512-50XQ5VdbWrX06mQXhy93WywSFZZGsv3EOjq+lqp6WC2t+j3mb6A9xYVdrRxafvK88vg9k9u+CT4l6D8PEatjKg==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.61.0", + "eslint-visitor-keys": "^3.3.0" + } + }, "accepts": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", From 738db17cd0957fb39b2bd8b3cf139c9a698a920d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 4 Jul 2023 14:08:04 +0800 Subject: [PATCH 144/297] Bump @typescript-eslint/eslint-plugin from 5.60.1 to 5.61.0 (#2033) Bumps [@typescript-eslint/eslint-plugin](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/eslint-plugin) from 5.60.1 to 5.61.0. - [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases) - [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/eslint-plugin/CHANGELOG.md) - [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v5.61.0/packages/eslint-plugin) --- updated-dependencies: - dependency-name: "@typescript-eslint/eslint-plugin" dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 400 +++++----------------------------------------- 1 file changed, 36 insertions(+), 364 deletions(-) diff --git a/package-lock.json b/package-lock.json index 34cbeb385..1c3cc1c73 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1592,17 +1592,17 @@ } }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.60.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.60.1.tgz", - "integrity": "sha512-KSWsVvsJsLJv3c4e73y/Bzt7OpqMCADUO846bHcuWYSYM19bldbAeDv7dYyV0jwkbMfJ2XdlzwjhXtuD7OY6bw==", + "version": "5.61.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.61.0.tgz", + "integrity": "sha512-A5l/eUAug103qtkwccSCxn8ZRwT+7RXWkFECdA4Cvl1dOlDUgTpAOfSEElZn2uSUxhdDpnCdetrf0jvU4qrL+g==", "dev": true, "dependencies": { "@eslint-community/regexpp": "^4.4.0", - "@typescript-eslint/scope-manager": "5.60.1", - "@typescript-eslint/type-utils": "5.60.1", - "@typescript-eslint/utils": "5.60.1", + "@typescript-eslint/scope-manager": "5.61.0", + "@typescript-eslint/type-utils": "5.61.0", + "@typescript-eslint/utils": "5.61.0", "debug": "^4.3.4", - "grapheme-splitter": "^1.0.4", + "graphemer": "^1.4.0", "ignore": "^5.2.0", "natural-compare-lite": "^1.4.0", "semver": "^7.3.7", @@ -1625,53 +1625,6 @@ } } }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/scope-manager": { - "version": "5.60.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.60.1.tgz", - "integrity": "sha512-Dn/LnN7fEoRD+KspEOV0xDMynEmR3iSHdgNsarlXNLGGtcUok8L4N71dxUgt3YvlO8si7E+BJ5Fe3wb5yUw7DQ==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.60.1", - "@typescript-eslint/visitor-keys": "5.60.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/types": { - "version": "5.60.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.60.1.tgz", - "integrity": "sha512-zDcDx5fccU8BA0IDZc71bAtYIcG9PowaOwaD8rjYbqwK7dpe/UMQl3inJ4UtUK42nOCT41jTSCwg76E62JpMcg==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/visitor-keys": { - "version": "5.60.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.60.1.tgz", - "integrity": "sha512-xEYIxKcultP6E/RMKqube11pGjXH1DCo60mQoWhVYyKfLkwbIVVjYxmOenNMxILx0TjCujPTjjnTIVzm09TXIw==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.60.1", - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -1763,13 +1716,13 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "5.60.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.60.1.tgz", - "integrity": "sha512-vN6UztYqIu05nu7JqwQGzQKUJctzs3/Hg7E2Yx8rz9J+4LgtIDFWjjl1gm3pycH0P3mHAcEUBd23LVgfrsTR8A==", + "version": "5.61.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.61.0.tgz", + "integrity": "sha512-kk8u//r+oVK2Aj3ph/26XdH0pbAkC2RiSjUYhKD+PExemG4XSjpGFeyZ/QM8lBOa7O8aGOU+/yEbMJgQv/DnCg==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "5.60.1", - "@typescript-eslint/utils": "5.60.1", + "@typescript-eslint/typescript-estree": "5.61.0", + "@typescript-eslint/utils": "5.61.0", "debug": "^4.3.4", "tsutils": "^3.21.0" }, @@ -1789,63 +1742,6 @@ } } }, - "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/types": { - "version": "5.60.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.60.1.tgz", - "integrity": "sha512-zDcDx5fccU8BA0IDZc71bAtYIcG9PowaOwaD8rjYbqwK7dpe/UMQl3inJ4UtUK42nOCT41jTSCwg76E62JpMcg==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree": { - "version": "5.60.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.60.1.tgz", - "integrity": "sha512-hkX70J9+2M2ZT6fhti5Q2FoU9zb+GeZK2SLP1WZlvUDqdMbEKhexZODD1WodNRyO8eS+4nScvT0dts8IdaBzfw==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.60.1", - "@typescript-eslint/visitor-keys": "5.60.1", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/visitor-keys": { - "version": "5.60.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.60.1.tgz", - "integrity": "sha512-xEYIxKcultP6E/RMKqube11pGjXH1DCo60mQoWhVYyKfLkwbIVVjYxmOenNMxILx0TjCujPTjjnTIVzm09TXIw==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.60.1", - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, "node_modules/@typescript-eslint/type-utils/node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -1933,17 +1829,17 @@ "dev": true }, "node_modules/@typescript-eslint/utils": { - "version": "5.60.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.60.1.tgz", - "integrity": "sha512-tiJ7FFdFQOWssFa3gqb94Ilexyw0JVxj6vBzaSpfN/8IhoKkDuSAenUKvsSHw2A/TMpJb26izIszTXaqygkvpQ==", + "version": "5.61.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.61.0.tgz", + "integrity": "sha512-mV6O+6VgQmVE6+xzlA91xifndPW9ElFW8vbSF0xCT/czPXVhwDewKila1jOyRwa9AE19zKnrr7Cg5S3pJVrTWQ==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@types/json-schema": "^7.0.9", "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.60.1", - "@typescript-eslint/types": "5.60.1", - "@typescript-eslint/typescript-estree": "5.60.1", + "@typescript-eslint/scope-manager": "5.61.0", + "@typescript-eslint/types": "5.61.0", + "@typescript-eslint/typescript-estree": "5.61.0", "eslint-scope": "^5.1.1", "semver": "^7.3.7" }, @@ -1958,103 +1854,6 @@ "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, - "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/scope-manager": { - "version": "5.60.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.60.1.tgz", - "integrity": "sha512-Dn/LnN7fEoRD+KspEOV0xDMynEmR3iSHdgNsarlXNLGGtcUok8L4N71dxUgt3YvlO8si7E+BJ5Fe3wb5yUw7DQ==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.60.1", - "@typescript-eslint/visitor-keys": "5.60.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/types": { - "version": "5.60.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.60.1.tgz", - "integrity": "sha512-zDcDx5fccU8BA0IDZc71bAtYIcG9PowaOwaD8rjYbqwK7dpe/UMQl3inJ4UtUK42nOCT41jTSCwg76E62JpMcg==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree": { - "version": "5.60.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.60.1.tgz", - "integrity": "sha512-hkX70J9+2M2ZT6fhti5Q2FoU9zb+GeZK2SLP1WZlvUDqdMbEKhexZODD1WodNRyO8eS+4nScvT0dts8IdaBzfw==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.60.1", - "@typescript-eslint/visitor-keys": "5.60.1", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/visitor-keys": { - "version": "5.60.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.60.1.tgz", - "integrity": "sha512-xEYIxKcultP6E/RMKqube11pGjXH1DCo60mQoWhVYyKfLkwbIVVjYxmOenNMxILx0TjCujPTjjnTIVzm09TXIw==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.60.1", - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/utils/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/utils/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, "node_modules/@typescript-eslint/visitor-keys": { "version": "5.61.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.61.0.tgz", @@ -5689,12 +5488,6 @@ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==" }, - "node_modules/grapheme-splitter": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", - "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", - "dev": true - }, "node_modules/graphemer": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", @@ -11434,49 +11227,23 @@ } }, "@typescript-eslint/eslint-plugin": { - "version": "5.60.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.60.1.tgz", - "integrity": "sha512-KSWsVvsJsLJv3c4e73y/Bzt7OpqMCADUO846bHcuWYSYM19bldbAeDv7dYyV0jwkbMfJ2XdlzwjhXtuD7OY6bw==", + "version": "5.61.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.61.0.tgz", + "integrity": "sha512-A5l/eUAug103qtkwccSCxn8ZRwT+7RXWkFECdA4Cvl1dOlDUgTpAOfSEElZn2uSUxhdDpnCdetrf0jvU4qrL+g==", "dev": true, "requires": { "@eslint-community/regexpp": "^4.4.0", - "@typescript-eslint/scope-manager": "5.60.1", - "@typescript-eslint/type-utils": "5.60.1", - "@typescript-eslint/utils": "5.60.1", + "@typescript-eslint/scope-manager": "5.61.0", + "@typescript-eslint/type-utils": "5.61.0", + "@typescript-eslint/utils": "5.61.0", "debug": "^4.3.4", - "grapheme-splitter": "^1.0.4", + "graphemer": "^1.4.0", "ignore": "^5.2.0", "natural-compare-lite": "^1.4.0", "semver": "^7.3.7", "tsutils": "^3.21.0" }, "dependencies": { - "@typescript-eslint/scope-manager": { - "version": "5.60.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.60.1.tgz", - "integrity": "sha512-Dn/LnN7fEoRD+KspEOV0xDMynEmR3iSHdgNsarlXNLGGtcUok8L4N71dxUgt3YvlO8si7E+BJ5Fe3wb5yUw7DQ==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.60.1", - "@typescript-eslint/visitor-keys": "5.60.1" - } - }, - "@typescript-eslint/types": { - "version": "5.60.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.60.1.tgz", - "integrity": "sha512-zDcDx5fccU8BA0IDZc71bAtYIcG9PowaOwaD8rjYbqwK7dpe/UMQl3inJ4UtUK42nOCT41jTSCwg76E62JpMcg==", - "dev": true - }, - "@typescript-eslint/visitor-keys": { - "version": "5.60.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.60.1.tgz", - "integrity": "sha512-xEYIxKcultP6E/RMKqube11pGjXH1DCo60mQoWhVYyKfLkwbIVVjYxmOenNMxILx0TjCujPTjjnTIVzm09TXIw==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.60.1", - "eslint-visitor-keys": "^3.3.0" - } - }, "debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -11534,48 +11301,17 @@ } }, "@typescript-eslint/type-utils": { - "version": "5.60.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.60.1.tgz", - "integrity": "sha512-vN6UztYqIu05nu7JqwQGzQKUJctzs3/Hg7E2Yx8rz9J+4LgtIDFWjjl1gm3pycH0P3mHAcEUBd23LVgfrsTR8A==", + "version": "5.61.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.61.0.tgz", + "integrity": "sha512-kk8u//r+oVK2Aj3ph/26XdH0pbAkC2RiSjUYhKD+PExemG4XSjpGFeyZ/QM8lBOa7O8aGOU+/yEbMJgQv/DnCg==", "dev": true, "requires": { - "@typescript-eslint/typescript-estree": "5.60.1", - "@typescript-eslint/utils": "5.60.1", + "@typescript-eslint/typescript-estree": "5.61.0", + "@typescript-eslint/utils": "5.61.0", "debug": "^4.3.4", "tsutils": "^3.21.0" }, "dependencies": { - "@typescript-eslint/types": { - "version": "5.60.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.60.1.tgz", - "integrity": "sha512-zDcDx5fccU8BA0IDZc71bAtYIcG9PowaOwaD8rjYbqwK7dpe/UMQl3inJ4UtUK42nOCT41jTSCwg76E62JpMcg==", - "dev": true - }, - "@typescript-eslint/typescript-estree": { - "version": "5.60.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.60.1.tgz", - "integrity": "sha512-hkX70J9+2M2ZT6fhti5Q2FoU9zb+GeZK2SLP1WZlvUDqdMbEKhexZODD1WodNRyO8eS+4nScvT0dts8IdaBzfw==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.60.1", - "@typescript-eslint/visitor-keys": "5.60.1", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - } - }, - "@typescript-eslint/visitor-keys": { - "version": "5.60.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.60.1.tgz", - "integrity": "sha512-xEYIxKcultP6E/RMKqube11pGjXH1DCo60mQoWhVYyKfLkwbIVVjYxmOenNMxILx0TjCujPTjjnTIVzm09TXIw==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.60.1", - "eslint-visitor-keys": "^3.3.0" - } - }, "debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -11632,77 +11368,19 @@ } }, "@typescript-eslint/utils": { - "version": "5.60.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.60.1.tgz", - "integrity": "sha512-tiJ7FFdFQOWssFa3gqb94Ilexyw0JVxj6vBzaSpfN/8IhoKkDuSAenUKvsSHw2A/TMpJb26izIszTXaqygkvpQ==", + "version": "5.61.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.61.0.tgz", + "integrity": "sha512-mV6O+6VgQmVE6+xzlA91xifndPW9ElFW8vbSF0xCT/czPXVhwDewKila1jOyRwa9AE19zKnrr7Cg5S3pJVrTWQ==", "dev": true, "requires": { "@eslint-community/eslint-utils": "^4.2.0", "@types/json-schema": "^7.0.9", "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.60.1", - "@typescript-eslint/types": "5.60.1", - "@typescript-eslint/typescript-estree": "5.60.1", + "@typescript-eslint/scope-manager": "5.61.0", + "@typescript-eslint/types": "5.61.0", + "@typescript-eslint/typescript-estree": "5.61.0", "eslint-scope": "^5.1.1", "semver": "^7.3.7" - }, - "dependencies": { - "@typescript-eslint/scope-manager": { - "version": "5.60.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.60.1.tgz", - "integrity": "sha512-Dn/LnN7fEoRD+KspEOV0xDMynEmR3iSHdgNsarlXNLGGtcUok8L4N71dxUgt3YvlO8si7E+BJ5Fe3wb5yUw7DQ==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.60.1", - "@typescript-eslint/visitor-keys": "5.60.1" - } - }, - "@typescript-eslint/types": { - "version": "5.60.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.60.1.tgz", - "integrity": "sha512-zDcDx5fccU8BA0IDZc71bAtYIcG9PowaOwaD8rjYbqwK7dpe/UMQl3inJ4UtUK42nOCT41jTSCwg76E62JpMcg==", - "dev": true - }, - "@typescript-eslint/typescript-estree": { - "version": "5.60.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.60.1.tgz", - "integrity": "sha512-hkX70J9+2M2ZT6fhti5Q2FoU9zb+GeZK2SLP1WZlvUDqdMbEKhexZODD1WodNRyO8eS+4nScvT0dts8IdaBzfw==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.60.1", - "@typescript-eslint/visitor-keys": "5.60.1", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - } - }, - "@typescript-eslint/visitor-keys": { - "version": "5.60.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.60.1.tgz", - "integrity": "sha512-xEYIxKcultP6E/RMKqube11pGjXH1DCo60mQoWhVYyKfLkwbIVVjYxmOenNMxILx0TjCujPTjjnTIVzm09TXIw==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.60.1", - "eslint-visitor-keys": "^3.3.0" - } - }, - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } } }, "@typescript-eslint/visitor-keys": { @@ -14626,12 +14304,6 @@ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==" }, - "grapheme-splitter": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", - "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", - "dev": true - }, "graphemer": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", From 301bac4b7b7126a3ea76a27bf54fbdbf3442f531 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 5 Jul 2023 10:19:01 +0800 Subject: [PATCH 145/297] Bump mysql2 from 3.4.3 to 3.4.4 (#2035) Bumps [mysql2](https://github.com/sidorares/node-mysql2) from 3.4.3 to 3.4.4. - [Release notes](https://github.com/sidorares/node-mysql2/releases) - [Changelog](https://github.com/sidorares/node-mysql2/blob/master/Changelog.md) - [Commits](https://github.com/sidorares/node-mysql2/compare/v3.4.3...v3.4.4) --- updated-dependencies: - dependency-name: mysql2 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 1c3cc1c73..088bd58e3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -7233,9 +7233,9 @@ "dev": true }, "node_modules/mysql2": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.4.3.tgz", - "integrity": "sha512-pgXnfmZlJ2JnJk9A5z3tnJcG4w8ly/AbVsVsgcavhiOQ7VQpxMwmIyR2CTNxNLKQWQUdD5QOkKkY1DdoRDgSnA==", + "version": "3.4.4", + "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.4.4.tgz", + "integrity": "sha512-PLeHxUNQSJ91DJFwDOsSXseK7bkQhxji7dBkl6PNyyVN7P4yYw8uMrDbespM1w0Yj4agbdRuqKuoS5pUFbN5aQ==", "dependencies": { "denque": "^2.1.0", "generate-function": "^2.3.1", @@ -15606,9 +15606,9 @@ "dev": true }, "mysql2": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.4.3.tgz", - "integrity": "sha512-pgXnfmZlJ2JnJk9A5z3tnJcG4w8ly/AbVsVsgcavhiOQ7VQpxMwmIyR2CTNxNLKQWQUdD5QOkKkY1DdoRDgSnA==", + "version": "3.4.4", + "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.4.4.tgz", + "integrity": "sha512-PLeHxUNQSJ91DJFwDOsSXseK7bkQhxji7dBkl6PNyyVN7P4yYw8uMrDbespM1w0Yj4agbdRuqKuoS5pUFbN5aQ==", "requires": { "denque": "^2.1.0", "generate-function": "^2.3.1", From b71e291e1be15f722d38cddefb3a815dc964c225 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 6 Jul 2023 09:32:11 +0800 Subject: [PATCH 146/297] Bump prettier from 2.8.8 to 3.0.0 (#2036) Bumps [prettier](https://github.com/prettier/prettier) from 2.8.8 to 3.0.0. - [Release notes](https://github.com/prettier/prettier/releases) - [Changelog](https://github.com/prettier/prettier/blob/main/CHANGELOG.md) - [Commits](https://github.com/prettier/prettier/compare/2.8.8...3.0.0) --- updated-dependencies: - dependency-name: prettier dependency-type: direct:development update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 18 +++++++++--------- package.json | 2 +- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/package-lock.json b/package-lock.json index 088bd58e3..722c0499f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -76,7 +76,7 @@ "lint-staged": "^13.0.0", "mocha": "^5.2.0", "pkg": "^5.3.0", - "prettier": "^2.2.1", + "prettier": "^3.0.0", "rcedit": "^3.0.1", "ts-mockito": "^2.6.1", "ts-node": "^10.0.0", @@ -8127,15 +8127,15 @@ } }, "node_modules/prettier": { - "version": "2.8.8", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", - "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.0.0.tgz", + "integrity": "sha512-zBf5eHpwHOGPC47h0zrPyNn+eAEIdEzfywMoYn2XPi0P44Zp0tSq64rq0xAREh4auw2cJZHo9QUob+NqCQky4g==", "dev": true, "bin": { - "prettier": "bin-prettier.js" + "prettier": "bin/prettier.cjs" }, "engines": { - "node": ">=10.13.0" + "node": ">=14" }, "funding": { "url": "https://github.com/prettier/prettier?sponsor=1" @@ -16255,9 +16255,9 @@ "dev": true }, "prettier": { - "version": "2.8.8", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", - "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.0.0.tgz", + "integrity": "sha512-zBf5eHpwHOGPC47h0zrPyNn+eAEIdEzfywMoYn2XPi0P44Zp0tSq64rq0xAREh4auw2cJZHo9QUob+NqCQky4g==", "dev": true }, "private": { diff --git a/package.json b/package.json index 85ab38779..c7b2def3e 100644 --- a/package.json +++ b/package.json @@ -81,7 +81,7 @@ "lint-staged": "^13.0.0", "mocha": "^5.2.0", "pkg": "^5.3.0", - "prettier": "^2.2.1", + "prettier": "^3.0.0", "rcedit": "^3.0.1", "ts-mockito": "^2.6.1", "ts-node": "^10.0.0", From 1839eea452d78b4ad136a275db14f6e1d4a312c0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 6 Jul 2023 09:40:38 +0800 Subject: [PATCH 147/297] Bump mysql2 from 3.4.4 to 3.4.5 (#2037) Bumps [mysql2](https://github.com/sidorares/node-mysql2) from 3.4.4 to 3.4.5. - [Release notes](https://github.com/sidorares/node-mysql2/releases) - [Changelog](https://github.com/sidorares/node-mysql2/blob/master/Changelog.md) - [Commits](https://github.com/sidorares/node-mysql2/compare/v3.4.4...v3.4.5) --- updated-dependencies: - dependency-name: mysql2 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 722c0499f..0394cc74a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -7233,9 +7233,9 @@ "dev": true }, "node_modules/mysql2": { - "version": "3.4.4", - "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.4.4.tgz", - "integrity": "sha512-PLeHxUNQSJ91DJFwDOsSXseK7bkQhxji7dBkl6PNyyVN7P4yYw8uMrDbespM1w0Yj4agbdRuqKuoS5pUFbN5aQ==", + "version": "3.4.5", + "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.4.5.tgz", + "integrity": "sha512-J63X6MQYxhm0v+KK2zlZMKnSfM5r5fJ4zrKMwcX/ghAE04YK6EPjhW8MgwzaTJ2waQ8uYr/YNDf/Cx2p2kHlnA==", "dependencies": { "denque": "^2.1.0", "generate-function": "^2.3.1", @@ -15606,9 +15606,9 @@ "dev": true }, "mysql2": { - "version": "3.4.4", - "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.4.4.tgz", - "integrity": "sha512-PLeHxUNQSJ91DJFwDOsSXseK7bkQhxji7dBkl6PNyyVN7P4yYw8uMrDbespM1w0Yj4agbdRuqKuoS5pUFbN5aQ==", + "version": "3.4.5", + "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.4.5.tgz", + "integrity": "sha512-J63X6MQYxhm0v+KK2zlZMKnSfM5r5fJ4zrKMwcX/ghAE04YK6EPjhW8MgwzaTJ2waQ8uYr/YNDf/Cx2p2kHlnA==", "requires": { "denque": "^2.1.0", "generate-function": "^2.3.1", From f96cbc08b28a7d289b0977599eb14d7e23d20c89 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 7 Jul 2023 09:59:04 +0800 Subject: [PATCH 148/297] Bump mysql2 from 3.4.5 to 3.5.0 (#2040) Bumps [mysql2](https://github.com/sidorares/node-mysql2) from 3.4.5 to 3.5.0. - [Release notes](https://github.com/sidorares/node-mysql2/releases) - [Changelog](https://github.com/sidorares/node-mysql2/blob/master/Changelog.md) - [Commits](https://github.com/sidorares/node-mysql2/compare/v3.4.5...v3.5.0) --- updated-dependencies: - dependency-name: mysql2 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 0394cc74a..786586e18 100644 --- a/package-lock.json +++ b/package-lock.json @@ -7233,9 +7233,9 @@ "dev": true }, "node_modules/mysql2": { - "version": "3.4.5", - "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.4.5.tgz", - "integrity": "sha512-J63X6MQYxhm0v+KK2zlZMKnSfM5r5fJ4zrKMwcX/ghAE04YK6EPjhW8MgwzaTJ2waQ8uYr/YNDf/Cx2p2kHlnA==", + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.5.0.tgz", + "integrity": "sha512-WKlxITp5D8Xx8vsREf/cF0MB7QtqkAgedxtMA0iD9D0ugxmeBdph7J7xaLXdIZXWWmRyNGaCFTUiGo144XdL5g==", "dependencies": { "denque": "^2.1.0", "generate-function": "^2.3.1", @@ -15606,9 +15606,9 @@ "dev": true }, "mysql2": { - "version": "3.4.5", - "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.4.5.tgz", - "integrity": "sha512-J63X6MQYxhm0v+KK2zlZMKnSfM5r5fJ4zrKMwcX/ghAE04YK6EPjhW8MgwzaTJ2waQ8uYr/YNDf/Cx2p2kHlnA==", + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.5.0.tgz", + "integrity": "sha512-WKlxITp5D8Xx8vsREf/cF0MB7QtqkAgedxtMA0iD9D0ugxmeBdph7J7xaLXdIZXWWmRyNGaCFTUiGo144XdL5g==", "requires": { "denque": "^2.1.0", "generate-function": "^2.3.1", From d2edcd0b542377112f4045162602291e18fae580 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 10 Jul 2023 10:17:51 +0800 Subject: [PATCH 149/297] Bump @types/vscode from 1.79.1 to 1.80.0 (#2042) Bumps [@types/vscode](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/vscode) from 1.79.1 to 1.80.0. - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/vscode) --- updated-dependencies: - dependency-name: "@types/vscode" dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 786586e18..f06fd3dfc 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1577,9 +1577,9 @@ "integrity": "sha512-aqayTNmeWrZcvnG2MG9eGYI6b7S5fl+yKgPs6bAjOTwPS316R5SxBGKvtSExfyoJU7pIeHJfsHI0Ji41RVMkvQ==" }, "node_modules/@types/vscode": { - "version": "1.79.1", - "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.79.1.tgz", - "integrity": "sha512-Ikwc4YbHABzqthrWfeAvItaAIfX9mdjMWxqNgTpGjhgOu0TMRq9LzyZ2yBK0JhYqoSjEubEPawf6zJgnl6Egtw==", + "version": "1.80.0", + "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.80.0.tgz", + "integrity": "sha512-qK/CmOdS2o7ry3k6YqU4zD3R2AYlJfbwBoSbKpBoP+GpXNE+0NEgJOli4n0bm0diK5kfBnchgCEj4igQz/44Hg==", "dev": true }, "node_modules/@types/xml2js": { @@ -11212,9 +11212,9 @@ "integrity": "sha512-aqayTNmeWrZcvnG2MG9eGYI6b7S5fl+yKgPs6bAjOTwPS316R5SxBGKvtSExfyoJU7pIeHJfsHI0Ji41RVMkvQ==" }, "@types/vscode": { - "version": "1.79.1", - "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.79.1.tgz", - "integrity": "sha512-Ikwc4YbHABzqthrWfeAvItaAIfX9mdjMWxqNgTpGjhgOu0TMRq9LzyZ2yBK0JhYqoSjEubEPawf6zJgnl6Egtw==", + "version": "1.80.0", + "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.80.0.tgz", + "integrity": "sha512-qK/CmOdS2o7ry3k6YqU4zD3R2AYlJfbwBoSbKpBoP+GpXNE+0NEgJOli4n0bm0diK5kfBnchgCEj4igQz/44Hg==", "dev": true }, "@types/xml2js": { From 33b2e8048849c59216d74d0cdac44517f80d6710 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 11 Jul 2023 09:42:43 +0800 Subject: [PATCH 150/297] Bump tedious from 16.1.0 to 16.2.0 (#2047) Bumps [tedious](https://github.com/tediousjs/tedious) from 16.1.0 to 16.2.0. - [Release notes](https://github.com/tediousjs/tedious/releases) - [Commits](https://github.com/tediousjs/tedious/compare/v16.1.0...v16.2.0) --- updated-dependencies: - dependency-name: tedious dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index f06fd3dfc..710bb08a7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9219,9 +9219,9 @@ } }, "node_modules/tedious": { - "version": "16.1.0", - "resolved": "https://registry.npmjs.org/tedious/-/tedious-16.1.0.tgz", - "integrity": "sha512-5W+shTkUoAyrB/Bbx89k6Q8Cb400OHzS6XDXQdsTp/obe1cFyOhNc1KI4FI6TOzklDGJWyLnEEfUSBVMpugnjA==", + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/tedious/-/tedious-16.2.0.tgz", + "integrity": "sha512-mUQnrnGeuAMREYUvCesWVIhP6lbir0baEoZv4OcBmAHtpaIbR64QHaww+OjyJbO1N7PpHbCfrMhpItJXFUlgmQ==", "dependencies": { "@azure/identity": "^2.0.4", "@azure/keyvault-keys": "^4.4.0", @@ -17045,9 +17045,9 @@ } }, "tedious": { - "version": "16.1.0", - "resolved": "https://registry.npmjs.org/tedious/-/tedious-16.1.0.tgz", - "integrity": "sha512-5W+shTkUoAyrB/Bbx89k6Q8Cb400OHzS6XDXQdsTp/obe1cFyOhNc1KI4FI6TOzklDGJWyLnEEfUSBVMpugnjA==", + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/tedious/-/tedious-16.2.0.tgz", + "integrity": "sha512-mUQnrnGeuAMREYUvCesWVIhP6lbir0baEoZv4OcBmAHtpaIbR64QHaww+OjyJbO1N7PpHbCfrMhpItJXFUlgmQ==", "requires": { "@azure/identity": "^2.0.4", "@azure/keyvault-keys": "^4.4.0", From e173e52542458a17c8b04887daf5f0c1ac5394fd Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 11 Jul 2023 19:32:28 +0800 Subject: [PATCH 151/297] Bump @typescript-eslint/parser from 5.61.0 to 5.62.0 (#2046) Bumps [@typescript-eslint/parser](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/parser) from 5.61.0 to 5.62.0. - [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases) - [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/parser/CHANGELOG.md) - [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v5.62.0/packages/parser) --- updated-dependencies: - dependency-name: "@typescript-eslint/parser" dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 139 ++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 127 insertions(+), 12 deletions(-) diff --git a/package-lock.json b/package-lock.json index 710bb08a7..388e1d716 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1649,14 +1649,14 @@ "dev": true }, "node_modules/@typescript-eslint/parser": { - "version": "5.61.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.61.0.tgz", - "integrity": "sha512-yGr4Sgyh8uO6fSi9hw3jAFXNBHbCtKKFMdX2IkT3ZqpKmtAq3lHS4ixB/COFuAIJpwl9/AqF7j72ZDWYKmIfvg==", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.62.0.tgz", + "integrity": "sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "5.61.0", - "@typescript-eslint/types": "5.61.0", - "@typescript-eslint/typescript-estree": "5.61.0", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/typescript-estree": "5.62.0", "debug": "^4.3.4" }, "engines": { @@ -1675,6 +1675,80 @@ } } }, + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/scope-manager": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", + "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/types": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", + "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/typescript-estree": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", + "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/visitor-keys": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", + "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, "node_modules/@typescript-eslint/parser/node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -11262,17 +11336,58 @@ } }, "@typescript-eslint/parser": { - "version": "5.61.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.61.0.tgz", - "integrity": "sha512-yGr4Sgyh8uO6fSi9hw3jAFXNBHbCtKKFMdX2IkT3ZqpKmtAq3lHS4ixB/COFuAIJpwl9/AqF7j72ZDWYKmIfvg==", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.62.0.tgz", + "integrity": "sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "5.61.0", - "@typescript-eslint/types": "5.61.0", - "@typescript-eslint/typescript-estree": "5.61.0", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/typescript-estree": "5.62.0", "debug": "^4.3.4" }, "dependencies": { + "@typescript-eslint/scope-manager": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", + "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0" + } + }, + "@typescript-eslint/types": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", + "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", + "dev": true + }, + "@typescript-eslint/typescript-estree": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", + "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + } + }, + "@typescript-eslint/visitor-keys": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", + "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.62.0", + "eslint-visitor-keys": "^3.3.0" + } + }, "debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", From 3df3cefaa228b8b72120b9ffc18901358d84a67a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 12 Jul 2023 10:27:15 +0800 Subject: [PATCH 152/297] Bump winston from 3.9.0 to 3.10.0 (#2050) Bumps [winston](https://github.com/winstonjs/winston) from 3.9.0 to 3.10.0. - [Release notes](https://github.com/winstonjs/winston/releases) - [Changelog](https://github.com/winstonjs/winston/blob/master/CHANGELOG.md) - [Commits](https://github.com/winstonjs/winston/compare/v3.9.0...v3.10.0) --- updated-dependencies: - dependency-name: winston dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 388e1d716..3cb3edfb6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9831,9 +9831,9 @@ } }, "node_modules/winston": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/winston/-/winston-3.9.0.tgz", - "integrity": "sha512-jW51iW/X95BCW6MMtZWr2jKQBP4hV5bIDq9QrIjfDk6Q9QuxvTKEAlpUNAzP+HYHFFCeENhph16s0zEunu4uuQ==", + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/winston/-/winston-3.10.0.tgz", + "integrity": "sha512-nT6SIDaE9B7ZRO0u3UvdrimG0HkB7dSTAgInQnNR2SOPJ4bvq5q79+pXLftKmP52lJGW15+H5MCK0nM9D3KB/g==", "dependencies": { "@colors/colors": "1.5.0", "@dabh/diagnostics": "^2.0.2", @@ -17576,9 +17576,9 @@ } }, "winston": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/winston/-/winston-3.9.0.tgz", - "integrity": "sha512-jW51iW/X95BCW6MMtZWr2jKQBP4hV5bIDq9QrIjfDk6Q9QuxvTKEAlpUNAzP+HYHFFCeENhph16s0zEunu4uuQ==", + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/winston/-/winston-3.10.0.tgz", + "integrity": "sha512-nT6SIDaE9B7ZRO0u3UvdrimG0HkB7dSTAgInQnNR2SOPJ4bvq5q79+pXLftKmP52lJGW15+H5MCK0nM9D3KB/g==", "requires": { "@colors/colors": "1.5.0", "@dabh/diagnostics": "^2.0.2", From f9f7faf112eb31d228e705aa1b27bc2dbe929b1a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 17 Jul 2023 11:14:35 +0800 Subject: [PATCH 153/297] Bump eslint from 8.44.0 to 8.45.0 (#2055) Bumps [eslint](https://github.com/eslint/eslint) from 8.44.0 to 8.45.0. - [Release notes](https://github.com/eslint/eslint/releases) - [Changelog](https://github.com/eslint/eslint/blob/main/CHANGELOG.md) - [Commits](https://github.com/eslint/eslint/compare/v8.44.0...v8.45.0) --- updated-dependencies: - dependency-name: eslint dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 34 ++++++---------------------------- 1 file changed, 6 insertions(+), 28 deletions(-) diff --git a/package-lock.json b/package-lock.json index 3cb3edfb6..fed40dec5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4265,9 +4265,9 @@ } }, "node_modules/eslint": { - "version": "8.44.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.44.0.tgz", - "integrity": "sha512-0wpHoUbDUHgNCyvFB5aXLiQVfK9B0at6gUvzy83k4kAsQ/u769TQDX6iKC+aO4upIHO9WSaA3QoXYQDHbNwf1A==", + "version": "8.45.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.45.0.tgz", + "integrity": "sha512-pd8KSxiQpdYRfYa9Wufvdoct3ZPQQuVuU5O6scNgMuOMYuxvH0IGaYK0wUFjo4UYYQQCUndlXiMbnxopwvvTiw==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", @@ -4295,7 +4295,6 @@ "globals": "^13.19.0", "graphemer": "^1.4.0", "ignore": "^5.2.0", - "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "is-path-inside": "^3.0.3", @@ -4307,7 +4306,6 @@ "natural-compare": "^1.4.0", "optionator": "^0.9.3", "strip-ansi": "^6.0.1", - "strip-json-comments": "^3.1.0", "text-table": "^0.2.0" }, "bin": { @@ -4567,18 +4565,6 @@ "node": ">=8" } }, - "node_modules/eslint/node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/eslint/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -13465,9 +13451,9 @@ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" }, "eslint": { - "version": "8.44.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.44.0.tgz", - "integrity": "sha512-0wpHoUbDUHgNCyvFB5aXLiQVfK9B0at6gUvzy83k4kAsQ/u769TQDX6iKC+aO4upIHO9WSaA3QoXYQDHbNwf1A==", + "version": "8.45.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.45.0.tgz", + "integrity": "sha512-pd8KSxiQpdYRfYa9Wufvdoct3ZPQQuVuU5O6scNgMuOMYuxvH0IGaYK0wUFjo4UYYQQCUndlXiMbnxopwvvTiw==", "dev": true, "requires": { "@eslint-community/eslint-utils": "^4.2.0", @@ -13495,7 +13481,6 @@ "globals": "^13.19.0", "graphemer": "^1.4.0", "ignore": "^5.2.0", - "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "is-path-inside": "^3.0.3", @@ -13507,7 +13492,6 @@ "natural-compare": "^1.4.0", "optionator": "^0.9.3", "strip-ansi": "^6.0.1", - "strip-json-comments": "^3.1.0", "text-table": "^0.2.0" }, "dependencies": { @@ -13662,12 +13646,6 @@ "ansi-regex": "^5.0.1" } }, - "strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true - }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", From d849ea9619cd1be6273925c9845aaeebefdf4576 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 17 Jul 2023 11:15:01 +0800 Subject: [PATCH 154/297] Bump @azure/storage-blob from 12.14.0 to 12.15.0 (#2056) Bumps [@azure/storage-blob](https://github.com/Azure/azure-sdk-for-js) from 12.14.0 to 12.15.0. - [Release notes](https://github.com/Azure/azure-sdk-for-js/releases) - [Changelog](https://github.com/Azure/azure-sdk-for-js/blob/main/documentation/Changelog-for-next-generation.md) - [Commits](https://github.com/Azure/azure-sdk-for-js/compare/@azure/storage-blob_12.14.0...@azure/storage-blob_12.15.0) --- updated-dependencies: - dependency-name: "@azure/storage-blob" dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index fed40dec5..367bf2dd8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -649,9 +649,9 @@ } }, "node_modules/@azure/storage-blob": { - "version": "12.14.0", - "resolved": "https://registry.npmjs.org/@azure/storage-blob/-/storage-blob-12.14.0.tgz", - "integrity": "sha512-g8GNUDpMisGXzBeD+sKphhH5yLwesB4JkHr1U6be/X3F+cAMcyGLPD1P89g2M7wbEtUJWoikry1rlr83nNRBzg==", + "version": "12.15.0", + "resolved": "https://registry.npmjs.org/@azure/storage-blob/-/storage-blob-12.15.0.tgz", + "integrity": "sha512-e7JBKLOFi0QVJqqLzrjx1eL3je3/Ug2IQj24cTM9b85CsnnFjLGeGjJVIjbGGZaytewiCEG7r3lRwQX7fKj0/w==", "dev": true, "dependencies": { "@azure/abort-controller": "^1.0.0", @@ -10514,9 +10514,9 @@ } }, "@azure/storage-blob": { - "version": "12.14.0", - "resolved": "https://registry.npmjs.org/@azure/storage-blob/-/storage-blob-12.14.0.tgz", - "integrity": "sha512-g8GNUDpMisGXzBeD+sKphhH5yLwesB4JkHr1U6be/X3F+cAMcyGLPD1P89g2M7wbEtUJWoikry1rlr83nNRBzg==", + "version": "12.15.0", + "resolved": "https://registry.npmjs.org/@azure/storage-blob/-/storage-blob-12.15.0.tgz", + "integrity": "sha512-e7JBKLOFi0QVJqqLzrjx1eL3je3/Ug2IQj24cTM9b85CsnnFjLGeGjJVIjbGGZaytewiCEG7r3lRwQX7fKj0/w==", "dev": true, "requires": { "@azure/abort-controller": "^1.0.0", From 5fb09b61ec4827a2fdbbbb92d01bb4612254d0f9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 17 Jul 2023 14:38:27 +0800 Subject: [PATCH 155/297] Bump @azure/storage-queue from 12.13.0 to 12.14.0 (#2057) Bumps [@azure/storage-queue](https://github.com/Azure/azure-sdk-for-js) from 12.13.0 to 12.14.0. - [Release notes](https://github.com/Azure/azure-sdk-for-js/releases) - [Changelog](https://github.com/Azure/azure-sdk-for-js/blob/main/documentation/Changelog-for-next-generation.md) - [Commits](https://github.com/Azure/azure-sdk-for-js/compare/@azure/storage-queue_12.13.0...@azure/storage-queue_12.14.0) --- updated-dependencies: - dependency-name: "@azure/storage-queue" dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 367bf2dd8..d7b52413f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -729,9 +729,9 @@ } }, "node_modules/@azure/storage-queue": { - "version": "12.13.0", - "resolved": "https://registry.npmjs.org/@azure/storage-queue/-/storage-queue-12.13.0.tgz", - "integrity": "sha512-baU7QlFwKFat8zLUMzfLHTgcpdKpvUsGl05zKVRslKIb3iPB7TPudqDfkpaFf2YL5hv88joz/fyuuYJnzz7log==", + "version": "12.14.0", + "resolved": "https://registry.npmjs.org/@azure/storage-queue/-/storage-queue-12.14.0.tgz", + "integrity": "sha512-1j6uxhzCcbEDVPOTNWIJ5CsLzOAU5U/bXgGZeT25fy6IghFTC1JlPGALez2CWJ9fBVj6AmSnsiBXL/77iXhSpg==", "dev": true, "dependencies": { "@azure/abort-controller": "^1.0.0", @@ -10581,9 +10581,9 @@ } }, "@azure/storage-queue": { - "version": "12.13.0", - "resolved": "https://registry.npmjs.org/@azure/storage-queue/-/storage-queue-12.13.0.tgz", - "integrity": "sha512-baU7QlFwKFat8zLUMzfLHTgcpdKpvUsGl05zKVRslKIb3iPB7TPudqDfkpaFf2YL5hv88joz/fyuuYJnzz7log==", + "version": "12.14.0", + "resolved": "https://registry.npmjs.org/@azure/storage-queue/-/storage-queue-12.14.0.tgz", + "integrity": "sha512-1j6uxhzCcbEDVPOTNWIJ5CsLzOAU5U/bXgGZeT25fy6IghFTC1JlPGALez2CWJ9fBVj6AmSnsiBXL/77iXhSpg==", "dev": true, "requires": { "@azure/abort-controller": "^1.0.0", From 5c46c67d005f82c7e7169623749a96e07383f10b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 18 Jul 2023 09:49:52 +0800 Subject: [PATCH 156/297] Bump mysql2 from 3.5.0 to 3.5.2 (#2059) Bumps [mysql2](https://github.com/sidorares/node-mysql2) from 3.5.0 to 3.5.2. - [Release notes](https://github.com/sidorares/node-mysql2/releases) - [Changelog](https://github.com/sidorares/node-mysql2/blob/master/Changelog.md) - [Commits](https://github.com/sidorares/node-mysql2/compare/v3.5.0...v3.5.2) --- updated-dependencies: - dependency-name: mysql2 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index d7b52413f..02fed5a81 100644 --- a/package-lock.json +++ b/package-lock.json @@ -7293,9 +7293,9 @@ "dev": true }, "node_modules/mysql2": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.5.0.tgz", - "integrity": "sha512-WKlxITp5D8Xx8vsREf/cF0MB7QtqkAgedxtMA0iD9D0ugxmeBdph7J7xaLXdIZXWWmRyNGaCFTUiGo144XdL5g==", + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.5.2.tgz", + "integrity": "sha512-cptobmhYkYeTBIFp2c0piw2+gElpioga1rUw5UidHvo8yaHijMZoo8A3zyBVoo/K71f7ZFvrShA9iMIy9dCzCA==", "dependencies": { "denque": "^2.1.0", "generate-function": "^2.3.1", @@ -15699,9 +15699,9 @@ "dev": true }, "mysql2": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.5.0.tgz", - "integrity": "sha512-WKlxITp5D8Xx8vsREf/cF0MB7QtqkAgedxtMA0iD9D0ugxmeBdph7J7xaLXdIZXWWmRyNGaCFTUiGo144XdL5g==", + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.5.2.tgz", + "integrity": "sha512-cptobmhYkYeTBIFp2c0piw2+gElpioga1rUw5UidHvo8yaHijMZoo8A3zyBVoo/K71f7ZFvrShA9iMIy9dCzCA==", "requires": { "denque": "^2.1.0", "generate-function": "^2.3.1", From bb90e2595bf8cf5bd409ed8babdadb2794ea4910 Mon Sep 17 00:00:00 2001 From: Wei Wei Date: Mon, 24 Jul 2023 07:33:36 +0000 Subject: [PATCH 157/297] Update version to 3.25.0 (#2063) --- ChangeLog.md | 3 +++ README.md | 2 +- package-lock.json | 4 ++-- package.json | 2 +- src/blob/utils/constants.ts | 2 +- src/queue/utils/constants.ts | 2 +- src/table/utils/constants.ts | 2 +- 7 files changed, 10 insertions(+), 7 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index 7c4abadde..786b6ced3 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -4,8 +4,11 @@ ## Upcoming Release +## 2023.07 Version 3.25.0 + Table: +- Refactor table query code - Fixed issue with query table fail with filter condition as string.Empty. (issue #1880) - Fixed merge table entity fail with single quota in PK/RK. (issue #2009) diff --git a/README.md b/README.md index 4c6d688aa..3a5a96aef 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,7 @@ | Version | Azure Storage API Version | Service Support | Description | Reference Links | | ------------------------------------------------------------------ | ------------------------- | ------------------------------ | ------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| 3.24.0 | 2023-01-03 | Blob, Queue and Table(preview) | Azurite V3 based on TypeScript & New Architecture | [NPM](https://www.npmjs.com/package/azurite) - [Docker](https://hub.docker.com/_/microsoft-azure-storage-azurite) - [Visual Studio Code Extension](https://marketplace.visualstudio.com/items?itemName=Azurite.azurite) | +| 3.25.0 | 2023-01-03 | Blob, Queue and Table(preview) | Azurite V3 based on TypeScript & New Architecture | [NPM](https://www.npmjs.com/package/azurite) - [Docker](https://hub.docker.com/_/microsoft-azure-storage-azurite) - [Visual Studio Code Extension](https://marketplace.visualstudio.com/items?itemName=Azurite.azurite) | | [Legacy (v2)](https://github.com/Azure/Azurite/tree/legacy-master) | 2016-05-31 | Blob, Queue and Table | Legacy Azurite V2 | [NPM](https://www.npmjs.com/package/azurite) | - [Azurite V3](#azurite-v3) diff --git a/package-lock.json b/package-lock.json index 02fed5a81..a881d8460 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "azurite", - "version": "3.24.0", + "version": "3.25.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "azurite", - "version": "3.24.0", + "version": "3.25.0", "license": "MIT", "dependencies": { "@azure/ms-rest-js": "^1.5.0", diff --git a/package.json b/package.json index c7b2def3e..a00d4a779 100644 --- a/package.json +++ b/package.json @@ -3,7 +3,7 @@ "displayName": "Azurite", "description": "An open source Azure Storage API compatible server", "icon": "icon.png", - "version": "3.24.0", + "version": "3.25.0", "publisher": "Azurite", "categories": [ "Other" diff --git a/src/blob/utils/constants.ts b/src/blob/utils/constants.ts index ee48235ad..99b758252 100644 --- a/src/blob/utils/constants.ts +++ b/src/blob/utils/constants.ts @@ -1,7 +1,7 @@ import { StoreDestinationArray } from "../../common/persistence/IExtentStore"; import * as Models from "../generated/artifacts/models"; -export const VERSION = "3.24.0"; +export const VERSION = "3.25.0"; export const BLOB_API_VERSION = "2023-01-03"; export const DEFAULT_BLOB_SERVER_HOST_NAME = "127.0.0.1"; // Change to 0.0.0.0 when needs external access export const DEFAULT_LIST_BLOBS_MAX_RESULTS = 5000; diff --git a/src/queue/utils/constants.ts b/src/queue/utils/constants.ts index 618e398e3..c61ce00fc 100644 --- a/src/queue/utils/constants.ts +++ b/src/queue/utils/constants.ts @@ -1,6 +1,6 @@ import { StoreDestinationArray } from "../../common/persistence/IExtentStore"; -export const VERSION = "3.24.0"; +export const VERSION = "3.25.0"; export const QUEUE_API_VERSION = "2023-01-03"; export const DEFAULT_QUEUE_SERVER_HOST_NAME = "127.0.0.1"; // Change to 0.0.0.0 when needs external access export const DEFAULT_QUEUE_LISTENING_PORT = 10001; diff --git a/src/table/utils/constants.ts b/src/table/utils/constants.ts index a8a738363..582afb723 100644 --- a/src/table/utils/constants.ts +++ b/src/table/utils/constants.ts @@ -18,7 +18,7 @@ export enum TABLE_STATUSCODE { export const DEFAULT_TABLE_CONTEXT_PATH = "azurite_table_context"; export const TABLE_API_VERSION = "2023-01-03"; -export const VERSION = "3.24.0"; +export const VERSION = "3.25.0"; // Max Body size is 4 MB export const BODY_SIZE_MAX = 1024 * 1024 * 4; // Max Entity sizxe is 1 MB From bdc02b83d0a79db959ddbd26548081af68e6b422 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 4 Aug 2023 14:49:06 +0800 Subject: [PATCH 158/297] Bump tedious from 16.2.0 to 16.4.0 (#2080) Bumps [tedious](https://github.com/tediousjs/tedious) from 16.2.0 to 16.4.0. - [Release notes](https://github.com/tediousjs/tedious/releases) - [Commits](https://github.com/tediousjs/tedious/compare/v16.2.0...v16.4.0) --- updated-dependencies: - dependency-name: tedious dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 883 ++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 732 insertions(+), 151 deletions(-) diff --git a/package-lock.json b/package-lock.json index a881d8460..715185d15 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1162,9 +1162,9 @@ } }, "node_modules/@js-joda/core": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@js-joda/core/-/core-5.2.0.tgz", - "integrity": "sha512-0OriPYIaMLB3XiLQMe0BXKVIqeriTn3H7JMOzTsHEtt7Zqq+TetCu97KnAhU3ckiQZKBxfZshft+H1OC4D1lXw==" + "version": "5.5.3", + "resolved": "https://registry.npmjs.org/@js-joda/core/-/core-5.5.3.tgz", + "integrity": "sha512-7dqNYwG8gCt4hfg5PKgM7xLEcgSBcx/UgC92OMnhMmvAnq11QzDFPrxUkNR/u5kn17WWLZ8beZ4A3Qrz4pZcmQ==" }, "node_modules/@malept/cross-spawn-promise": { "version": "1.1.1", @@ -1945,6 +1945,17 @@ "url": "https://opencollective.com/typescript-eslint" } }, + "node_modules/abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "dependencies": { + "event-target-shim": "^5.0.0" + }, + "engines": { + "node": ">=6.5" + } + }, "node_modules/accepts": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", @@ -2128,11 +2139,42 @@ "node": ">= 6.0.0" } }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", + "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", + "dependencies": { + "call-bind": "^1.0.2", + "is-array-buffer": "^3.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/array-flatten": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.1.tgz", + "integrity": "sha512-09x0ZWFEjj4WD8PDbykUwo3t9arLn8NIzmmYEJFpYekOAQjpkGSyrQhNoRTcwwcFRu+ycWF78QZ63oWTqSjBcw==", + "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "get-intrinsic": "^1.2.1", + "is-array-buffer": "^3.0.2", + "is-shared-array-buffer": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/asn1": { "version": "0.2.6", "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", @@ -2192,6 +2234,17 @@ "node": ">=12.0.0" } }, + "node_modules/available-typed-arrays": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/aws-sign2": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", @@ -3241,13 +3294,13 @@ } }, "node_modules/bl": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-5.0.0.tgz", - "integrity": "sha512-8vxFNZ0pflFfi0WXA3WQXlj6CaMEwsmh63I1CNp0q+wWv8sD0ARx1KovSQd0l2GkwrMIOyedq0EF1FxI+RCZLQ==", + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/bl/-/bl-6.0.3.tgz", + "integrity": "sha512-ZmReEQkPP4zOjCHVzGpXYLvf95/HnvwsNZ1sh2dhoy6OxqX9Sl3JF7UmoKXlXE40AjldnWlsSxvqDiDrgSCJDA==", "dependencies": { "buffer": "^6.0.3", "inherits": "^2.0.4", - "readable-stream": "^3.4.0" + "readable-stream": "^4.2.0" } }, "node_modules/bl/node_modules/buffer": { @@ -3274,16 +3327,45 @@ } }, "node_modules/bl/node_modules/readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.4.2.tgz", + "integrity": "sha512-Lk/fICSyIhodxy1IDK2HazkeGjSmezAWX2egdtJnYhtzKEsBPJowlI6F6LPb5tqIQILrMbx22S5o3GuJavPusA==", "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" }, "engines": { - "node": ">= 6" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/bl/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/bl/node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dependencies": { + "safe-buffer": "~5.2.0" } }, "node_modules/body-parser": { @@ -3958,9 +4040,9 @@ } }, "node_modules/define-properties": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", - "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", + "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", "dependencies": { "has-property-descriptors": "^1.0.0", "object-keys": "^1.1.1" @@ -4174,30 +4256,49 @@ } }, "node_modules/es-abstract": { - "version": "1.19.5", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.5.tgz", - "integrity": "sha512-Aa2G2+Rd3b6kxEUKTF4TaW67czBLyAv3z7VOhYRU50YBx+bbsYZ9xQP4lMNazePuFlybXI0V4MruPos7qUo5fA==", + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.1.tgz", + "integrity": "sha512-ioRRcXMO6OFyRpyzV3kE1IIBd4WG5/kltnzdxSCqoP8CMGs/Li+M1uF5o7lOkZVFjDs+NLesthnF66Pg/0q0Lw==", "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "arraybuffer.prototype.slice": "^1.0.1", + "available-typed-arrays": "^1.0.5", "call-bind": "^1.0.2", + "es-set-tostringtag": "^2.0.1", "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "get-intrinsic": "^1.1.1", + "function.prototype.name": "^1.1.5", + "get-intrinsic": "^1.2.1", "get-symbol-description": "^1.0.0", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", "has": "^1.0.3", + "has-property-descriptors": "^1.0.0", + "has-proto": "^1.0.1", "has-symbols": "^1.0.3", - "internal-slot": "^1.0.3", - "is-callable": "^1.2.4", + "internal-slot": "^1.0.5", + "is-array-buffer": "^3.0.2", + "is-callable": "^1.2.7", "is-negative-zero": "^2.0.2", "is-regex": "^1.1.4", "is-shared-array-buffer": "^1.0.2", "is-string": "^1.0.7", + "is-typed-array": "^1.1.10", "is-weakref": "^1.0.2", - "object-inspect": "^1.12.0", + "object-inspect": "^1.12.3", "object-keys": "^1.1.1", - "object.assign": "^4.1.2", - "string.prototype.trimend": "^1.0.4", - "string.prototype.trimstart": "^1.0.4", - "unbox-primitive": "^1.0.1" + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.5.0", + "safe-array-concat": "^1.0.0", + "safe-regex-test": "^1.0.0", + "string.prototype.trim": "^1.2.7", + "string.prototype.trimend": "^1.0.6", + "string.prototype.trimstart": "^1.0.6", + "typed-array-buffer": "^1.0.0", + "typed-array-byte-length": "^1.0.0", + "typed-array-byte-offset": "^1.0.0", + "typed-array-length": "^1.0.4", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.10" }, "engines": { "node": ">= 0.4" @@ -4207,16 +4308,16 @@ } }, "node_modules/es-aggregate-error": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/es-aggregate-error/-/es-aggregate-error-1.0.8.tgz", - "integrity": "sha512-AKUb5MKLWMozPlFRHOKqWD7yta5uaEhH21qwtnf6FlKjNjTJOoqFi0/G14+FfSkIQhhu6X68Af4xgRC6y8qG4A==", + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/es-aggregate-error/-/es-aggregate-error-1.0.9.tgz", + "integrity": "sha512-fvnX40sb538wdU6r4s35cq4EY6Lr09Upj40BEVem4LEsuW8XgQep9yD5Q1U2KftokNp1rWODFJ2qwZSsAjFpbg==", "dependencies": { "define-properties": "^1.1.4", - "es-abstract": "^1.19.5", + "es-abstract": "^1.20.4", "function-bind": "^1.1.1", "functions-have-names": "^1.2.3", - "get-intrinsic": "^1.1.1", - "globalthis": "^1.0.2", + "get-intrinsic": "^1.1.3", + "globalthis": "^1.0.3", "has-property-descriptors": "^1.0.0" }, "engines": { @@ -4226,6 +4327,19 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/es-set-tostringtag": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", + "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", + "dependencies": { + "get-intrinsic": "^1.1.3", + "has": "^1.0.3", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/es-to-primitive": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", @@ -4689,10 +4803,18 @@ "node": ">= 0.6" } }, + "node_modules/event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "engines": { + "node": ">=6" + } + }, "node_modules/events": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.1.0.tgz", - "integrity": "sha512-Rv+u8MLHNOdMjTAFeT3nCjHn2aGlx435FP/sDHNaRhDEMwyI/aB22Kj2qIN8R0cw3z28psEQLYwxVKLsKrMgWg==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", "engines": { "node": ">=0.8.x" } @@ -5180,6 +5302,14 @@ } } }, + "node_modules/for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dependencies": { + "is-callable": "^1.1.3" + } + }, "node_modules/forever-agent": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", @@ -5265,6 +5395,23 @@ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" }, + "node_modules/function.prototype.name": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", + "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.0", + "functions-have-names": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/functions-have-names": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", @@ -5282,13 +5429,14 @@ } }, "node_modules/get-intrinsic": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", - "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", "dependencies": { "function-bind": "^1.1.1", "has": "^1.0.3", - "has-symbols": "^1.0.1" + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -5367,9 +5515,9 @@ } }, "node_modules/globalthis": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.2.tgz", - "integrity": "sha512-ZQnSFO1la8P7auIOQECnm0sSuoMeaSq0EEdXMBFF2QJO4uNcwbyhSgG3MruWNbFTqCLmxVwGOl7LZ9kASvHdeQ==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", + "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", "dependencies": { "define-properties": "^1.1.3" }, @@ -5543,6 +5691,17 @@ "node": ">=8.0" } }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/graceful-fs": { "version": "4.2.8", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", @@ -5636,6 +5795,17 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/has-symbols": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", @@ -6003,11 +6173,11 @@ "dev": true }, "node_modules/internal-slot": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", - "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", + "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", "dependencies": { - "get-intrinsic": "^1.1.0", + "get-intrinsic": "^1.2.0", "has": "^1.0.3", "side-channel": "^1.0.4" }, @@ -6057,6 +6227,19 @@ "node": ">= 0.10" } }, + "node_modules/is-array-buffer": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", + "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.0", + "is-typed-array": "^1.1.10" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-arrayish": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", @@ -6089,9 +6272,9 @@ } }, "node_modules/is-callable": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz", - "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==", + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", "engines": { "node": ">= 0.4" }, @@ -6286,6 +6469,20 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-typed-array": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz", + "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==", + "dependencies": { + "which-typed-array": "^1.1.11" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", @@ -7492,13 +7689,13 @@ } }, "node_modules/object.assign": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", - "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", + "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", "dependencies": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "has-symbols": "^1.0.1", + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "has-symbols": "^1.0.3", "object-keys": "^1.1.1" }, "engines": { @@ -8266,9 +8463,9 @@ } }, "node_modules/punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", "engines": { "node": ">=6" } @@ -8405,6 +8602,22 @@ "private": "^0.1.6" } }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz", + "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "functions-have-names": "^1.2.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/regexpu-core": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-2.0.0.tgz", @@ -8623,11 +8836,46 @@ "tslib": "^2.1.0" } }, + "node_modules/safe-array-concat": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.0.tgz", + "integrity": "sha512-9dVEFruWIsnie89yym+xWTAYASdpw3CJV7Li/6zBewGf9z2i1j31rP6jnY0pHEO4QZh6N0K11bFjWmdR8UGdPQ==", + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.0", + "has-symbols": "^1.0.3", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-array-concat/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" + }, "node_modules/safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, + "node_modules/safe-regex-test": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", + "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "is-regex": "^1.1.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/safe-stable-stringify": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.3.1.tgz", @@ -9137,27 +9385,43 @@ "node": ">=8" } }, + "node_modules/string.prototype.trim": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz", + "integrity": "sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/string.prototype.trimend": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz", - "integrity": "sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", + "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", - "es-abstract": "^1.19.5" + "es-abstract": "^1.20.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/string.prototype.trimstart": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.5.tgz", - "integrity": "sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", + "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", - "es-abstract": "^1.19.5" + "es-abstract": "^1.20.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -9279,21 +9543,21 @@ } }, "node_modules/tedious": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/tedious/-/tedious-16.2.0.tgz", - "integrity": "sha512-mUQnrnGeuAMREYUvCesWVIhP6lbir0baEoZv4OcBmAHtpaIbR64QHaww+OjyJbO1N7PpHbCfrMhpItJXFUlgmQ==", + "version": "16.4.0", + "resolved": "https://registry.npmjs.org/tedious/-/tedious-16.4.0.tgz", + "integrity": "sha512-WUWtO18n43GnKI367lVEtmbBxAaTIpTONuZ87sTEMMUcQ9gy5D9H6TCHBKNz/6yYIKnCfjE9wgAc2dR4qiDiaA==", "dependencies": { "@azure/identity": "^2.0.4", "@azure/keyvault-keys": "^4.4.0", - "@js-joda/core": "^5.2.0", - "bl": "^5.0.0", - "es-aggregate-error": "^1.0.8", + "@js-joda/core": "^5.5.3", + "bl": "^6.0.3", + "es-aggregate-error": "^1.0.9", "iconv-lite": "^0.6.3", "js-md4": "^0.3.2", "jsbi": "^4.3.0", "native-duplexpair": "^1.0.0", "node-abort-controller": "^3.1.1", - "punycode": "^2.1.0", + "punycode": "^2.3.0", "sprintf-js": "^1.1.2" }, "engines": { @@ -9555,6 +9819,67 @@ "node": ">= 0.6" } }, + "node_modules/typed-array-buffer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz", + "integrity": "sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==", + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz", + "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==", + "dependencies": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz", + "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==", + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", + "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", + "dependencies": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "is-typed-array": "^1.1.9" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/typed-rest-client": { "version": "1.8.6", "resolved": "https://registry.npmjs.org/typed-rest-client/-/typed-rest-client-1.8.6.tgz", @@ -9816,6 +10141,24 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/which-typed-array": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.11.tgz", + "integrity": "sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew==", + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/winston": { "version": "3.10.0", "resolved": "https://registry.npmjs.org/winston/-/winston-3.10.0.tgz", @@ -10899,9 +11242,9 @@ } }, "@js-joda/core": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@js-joda/core/-/core-5.2.0.tgz", - "integrity": "sha512-0OriPYIaMLB3XiLQMe0BXKVIqeriTn3H7JMOzTsHEtt7Zqq+TetCu97KnAhU3ckiQZKBxfZshft+H1OC4D1lXw==" + "version": "5.5.3", + "resolved": "https://registry.npmjs.org/@js-joda/core/-/core-5.5.3.tgz", + "integrity": "sha512-7dqNYwG8gCt4hfg5PKgM7xLEcgSBcx/UgC92OMnhMmvAnq11QzDFPrxUkNR/u5kn17WWLZ8beZ4A3Qrz4pZcmQ==" }, "@malept/cross-spawn-promise": { "version": "1.1.1", @@ -11494,6 +11837,14 @@ "eslint-visitor-keys": "^3.3.0" } }, + "abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "requires": { + "event-target-shim": "^5.0.0" + } + }, "accepts": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", @@ -11628,11 +11979,33 @@ "mri": "1.1.4" } }, + "array-buffer-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", + "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", + "requires": { + "call-bind": "^1.0.2", + "is-array-buffer": "^3.0.1" + } + }, "array-flatten": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" }, + "arraybuffer.prototype.slice": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.1.tgz", + "integrity": "sha512-09x0ZWFEjj4WD8PDbykUwo3t9arLn8NIzmmYEJFpYekOAQjpkGSyrQhNoRTcwwcFRu+ycWF78QZ63oWTqSjBcw==", + "requires": { + "array-buffer-byte-length": "^1.0.0", + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "get-intrinsic": "^1.2.1", + "is-array-buffer": "^3.0.2", + "is-shared-array-buffer": "^1.0.2" + } + }, "asn1": { "version": "0.2.6", "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", @@ -11676,6 +12049,11 @@ "integrity": "sha512-j/Axwk9bniifTNtBLYVxfQZGQIGPKljFaCQCBWOiybVar2j3tkHP1btiC4a/t9pAJXY6IaFgWctoPM3G/Puhyg==", "dev": true }, + "available-typed-arrays": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==" + }, "aws-sign2": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", @@ -12691,13 +13069,13 @@ } }, "bl": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-5.0.0.tgz", - "integrity": "sha512-8vxFNZ0pflFfi0WXA3WQXlj6CaMEwsmh63I1CNp0q+wWv8sD0ARx1KovSQd0l2GkwrMIOyedq0EF1FxI+RCZLQ==", + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/bl/-/bl-6.0.3.tgz", + "integrity": "sha512-ZmReEQkPP4zOjCHVzGpXYLvf95/HnvwsNZ1sh2dhoy6OxqX9Sl3JF7UmoKXlXE40AjldnWlsSxvqDiDrgSCJDA==", "requires": { "buffer": "^6.0.3", "inherits": "^2.0.4", - "readable-stream": "^3.4.0" + "readable-stream": "^4.2.0" }, "dependencies": { "buffer": { @@ -12710,13 +13088,28 @@ } }, "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.4.2.tgz", + "integrity": "sha512-Lk/fICSyIhodxy1IDK2HazkeGjSmezAWX2egdtJnYhtzKEsBPJowlI6F6LPb5tqIQILrMbx22S5o3GuJavPusA==", "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + }, + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "requires": { + "safe-buffer": "~5.2.0" } } } @@ -13223,9 +13616,9 @@ "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==" }, "define-properties": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", - "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", + "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", "requires": { "has-property-descriptors": "^1.0.0", "object-keys": "^1.1.1" @@ -13384,46 +13777,75 @@ "dev": true }, "es-abstract": { - "version": "1.19.5", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.5.tgz", - "integrity": "sha512-Aa2G2+Rd3b6kxEUKTF4TaW67czBLyAv3z7VOhYRU50YBx+bbsYZ9xQP4lMNazePuFlybXI0V4MruPos7qUo5fA==", + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.1.tgz", + "integrity": "sha512-ioRRcXMO6OFyRpyzV3kE1IIBd4WG5/kltnzdxSCqoP8CMGs/Li+M1uF5o7lOkZVFjDs+NLesthnF66Pg/0q0Lw==", "requires": { + "array-buffer-byte-length": "^1.0.0", + "arraybuffer.prototype.slice": "^1.0.1", + "available-typed-arrays": "^1.0.5", "call-bind": "^1.0.2", + "es-set-tostringtag": "^2.0.1", "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "get-intrinsic": "^1.1.1", + "function.prototype.name": "^1.1.5", + "get-intrinsic": "^1.2.1", "get-symbol-description": "^1.0.0", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", "has": "^1.0.3", + "has-property-descriptors": "^1.0.0", + "has-proto": "^1.0.1", "has-symbols": "^1.0.3", - "internal-slot": "^1.0.3", - "is-callable": "^1.2.4", + "internal-slot": "^1.0.5", + "is-array-buffer": "^3.0.2", + "is-callable": "^1.2.7", "is-negative-zero": "^2.0.2", "is-regex": "^1.1.4", "is-shared-array-buffer": "^1.0.2", "is-string": "^1.0.7", + "is-typed-array": "^1.1.10", "is-weakref": "^1.0.2", - "object-inspect": "^1.12.0", + "object-inspect": "^1.12.3", "object-keys": "^1.1.1", - "object.assign": "^4.1.2", - "string.prototype.trimend": "^1.0.4", - "string.prototype.trimstart": "^1.0.4", - "unbox-primitive": "^1.0.1" + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.5.0", + "safe-array-concat": "^1.0.0", + "safe-regex-test": "^1.0.0", + "string.prototype.trim": "^1.2.7", + "string.prototype.trimend": "^1.0.6", + "string.prototype.trimstart": "^1.0.6", + "typed-array-buffer": "^1.0.0", + "typed-array-byte-length": "^1.0.0", + "typed-array-byte-offset": "^1.0.0", + "typed-array-length": "^1.0.4", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.10" } }, "es-aggregate-error": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/es-aggregate-error/-/es-aggregate-error-1.0.8.tgz", - "integrity": "sha512-AKUb5MKLWMozPlFRHOKqWD7yta5uaEhH21qwtnf6FlKjNjTJOoqFi0/G14+FfSkIQhhu6X68Af4xgRC6y8qG4A==", + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/es-aggregate-error/-/es-aggregate-error-1.0.9.tgz", + "integrity": "sha512-fvnX40sb538wdU6r4s35cq4EY6Lr09Upj40BEVem4LEsuW8XgQep9yD5Q1U2KftokNp1rWODFJ2qwZSsAjFpbg==", "requires": { "define-properties": "^1.1.4", - "es-abstract": "^1.19.5", + "es-abstract": "^1.20.4", "function-bind": "^1.1.1", "functions-have-names": "^1.2.3", - "get-intrinsic": "^1.1.1", - "globalthis": "^1.0.2", + "get-intrinsic": "^1.1.3", + "globalthis": "^1.0.3", "has-property-descriptors": "^1.0.0" } }, + "es-set-tostringtag": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", + "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", + "requires": { + "get-intrinsic": "^1.1.3", + "has": "^1.0.3", + "has-tostringtag": "^1.0.0" + } + }, "es-to-primitive": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", @@ -13750,10 +14172,15 @@ "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" }, + "event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==" + }, "events": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.1.0.tgz", - "integrity": "sha512-Rv+u8MLHNOdMjTAFeT3nCjHn2aGlx435FP/sDHNaRhDEMwyI/aB22Kj2qIN8R0cw3z28psEQLYwxVKLsKrMgWg==" + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==" }, "execa": { "version": "7.1.1", @@ -14118,6 +14545,14 @@ "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.9.tgz", "integrity": "sha512-MQDfihBQYMcyy5dhRDJUHcw7lb2Pv/TuE6xP1vyraLukNDHKbDxDNaOE3NbCAdKQApno+GPRyo1YAp89yCjK4w==" }, + "for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "requires": { + "is-callable": "^1.1.3" + } + }, "forever-agent": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", @@ -14187,6 +14622,17 @@ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" }, + "function.prototype.name": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", + "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.0", + "functions-have-names": "^1.2.2" + } + }, "functions-have-names": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", @@ -14201,13 +14647,14 @@ } }, "get-intrinsic": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", - "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", "requires": { "function-bind": "^1.1.1", "has": "^1.0.3", - "has-symbols": "^1.0.1" + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3" } }, "get-stream": { @@ -14265,9 +14712,9 @@ "dev": true }, "globalthis": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.2.tgz", - "integrity": "sha512-ZQnSFO1la8P7auIOQECnm0sSuoMeaSq0EEdXMBFF2QJO4uNcwbyhSgG3MruWNbFTqCLmxVwGOl7LZ9kASvHdeQ==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", + "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", "requires": { "define-properties": "^1.1.3" } @@ -14392,6 +14839,14 @@ } } }, + "gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "requires": { + "get-intrinsic": "^1.1.3" + } + }, "graceful-fs": { "version": "4.2.8", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", @@ -14460,6 +14915,11 @@ "get-intrinsic": "^1.1.1" } }, + "has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==" + }, "has-symbols": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", @@ -14708,11 +15168,11 @@ "dev": true }, "internal-slot": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", - "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", + "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", "requires": { - "get-intrinsic": "^1.1.0", + "get-intrinsic": "^1.2.0", "has": "^1.0.3", "side-channel": "^1.0.4" } @@ -14749,6 +15209,16 @@ "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" }, + "is-array-buffer": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", + "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.0", + "is-typed-array": "^1.1.10" + } + }, "is-arrayish": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", @@ -14772,9 +15242,9 @@ } }, "is-callable": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz", - "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==" + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==" }, "is-core-module": { "version": "2.9.0", @@ -14891,6 +15361,14 @@ "has-symbols": "^1.0.2" } }, + "is-typed-array": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz", + "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==", + "requires": { + "which-typed-array": "^1.1.11" + } + }, "is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", @@ -15846,13 +16324,13 @@ "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" }, "object.assign": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", - "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", + "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", "requires": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "has-symbols": "^1.0.1", + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "has-symbols": "^1.0.3", "object-keys": "^1.1.1" } }, @@ -16406,9 +16884,9 @@ } }, "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==" }, "qs": { "version": "6.10.3", @@ -16507,6 +16985,16 @@ "private": "^0.1.6" } }, + "regexp.prototype.flags": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz", + "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "functions-have-names": "^1.2.3" + } + }, "regexpu-core": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-2.0.0.tgz", @@ -16671,11 +17159,39 @@ "tslib": "^2.1.0" } }, + "safe-array-concat": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.0.tgz", + "integrity": "sha512-9dVEFruWIsnie89yym+xWTAYASdpw3CJV7Li/6zBewGf9z2i1j31rP6jnY0pHEO4QZh6N0K11bFjWmdR8UGdPQ==", + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.0", + "has-symbols": "^1.0.3", + "isarray": "^2.0.5" + }, + "dependencies": { + "isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" + } + } + }, "safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, + "safe-regex-test": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", + "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "is-regex": "^1.1.4" + } + }, "safe-stable-stringify": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.3.1.tgz", @@ -17027,24 +17543,34 @@ } } }, + "string.prototype.trim": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz", + "integrity": "sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + } + }, "string.prototype.trimend": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz", - "integrity": "sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", + "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", - "es-abstract": "^1.19.5" + "es-abstract": "^1.20.4" } }, "string.prototype.trimstart": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.5.tgz", - "integrity": "sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", + "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", - "es-abstract": "^1.19.5" + "es-abstract": "^1.20.4" } }, "strip-ansi": { @@ -17138,21 +17664,21 @@ } }, "tedious": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/tedious/-/tedious-16.2.0.tgz", - "integrity": "sha512-mUQnrnGeuAMREYUvCesWVIhP6lbir0baEoZv4OcBmAHtpaIbR64QHaww+OjyJbO1N7PpHbCfrMhpItJXFUlgmQ==", + "version": "16.4.0", + "resolved": "https://registry.npmjs.org/tedious/-/tedious-16.4.0.tgz", + "integrity": "sha512-WUWtO18n43GnKI367lVEtmbBxAaTIpTONuZ87sTEMMUcQ9gy5D9H6TCHBKNz/6yYIKnCfjE9wgAc2dR4qiDiaA==", "requires": { "@azure/identity": "^2.0.4", "@azure/keyvault-keys": "^4.4.0", - "@js-joda/core": "^5.2.0", - "bl": "^5.0.0", - "es-aggregate-error": "^1.0.8", + "@js-joda/core": "^5.5.3", + "bl": "^6.0.3", + "es-aggregate-error": "^1.0.9", "iconv-lite": "^0.6.3", "js-md4": "^0.3.2", "jsbi": "^4.3.0", "native-duplexpair": "^1.0.0", "node-abort-controller": "^3.1.1", - "punycode": "^2.1.0", + "punycode": "^2.3.0", "sprintf-js": "^1.1.2" }, "dependencies": { @@ -17347,6 +17873,49 @@ "mime-types": "~2.1.24" } }, + "typed-array-buffer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz", + "integrity": "sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==", + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1", + "is-typed-array": "^1.1.10" + } + }, + "typed-array-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz", + "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==", + "requires": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + } + }, + "typed-array-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz", + "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==", + "requires": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + } + }, + "typed-array-length": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", + "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", + "requires": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "is-typed-array": "^1.1.9" + } + }, "typed-rest-client": { "version": "1.8.6", "resolved": "https://registry.npmjs.org/typed-rest-client/-/typed-rest-client-1.8.6.tgz", @@ -17553,6 +18122,18 @@ "is-symbol": "^1.0.3" } }, + "which-typed-array": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.11.tgz", + "integrity": "sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew==", + "requires": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0" + } + }, "winston": { "version": "3.10.0", "resolved": "https://registry.npmjs.org/winston/-/winston-3.10.0.tgz", From d5a7c7adafbd93e4595d249df47f0301dde2b7b1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 4 Aug 2023 15:02:28 +0800 Subject: [PATCH 159/297] Bump eslint from 8.45.0 to 8.46.0 (#2081) Bumps [eslint](https://github.com/eslint/eslint) from 8.45.0 to 8.46.0. - [Release notes](https://github.com/eslint/eslint/releases) - [Changelog](https://github.com/eslint/eslint/blob/main/CHANGELOG.md) - [Commits](https://github.com/eslint/eslint/compare/v8.45.0...v8.46.0) --- updated-dependencies: - dependency-name: eslint dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 112 +++++++++++++++++++++++----------------------- 1 file changed, 56 insertions(+), 56 deletions(-) diff --git a/package-lock.json b/package-lock.json index 715185d15..ac65c2296 100644 --- a/package-lock.json +++ b/package-lock.json @@ -931,18 +931,18 @@ } }, "node_modules/@eslint-community/regexpp": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.4.0.tgz", - "integrity": "sha512-A9983Q0LnDGdLPjxyXQ00sbV+K+O+ko2Dr+CZigbHWtX9pNfxlaBkMR8X1CztI73zuEyEBXTVjx7CE+/VSwDiQ==", + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.6.2.tgz", + "integrity": "sha512-pPTNuaAG3QMH+buKyBIGJs3g/S5y0caxw0ygM3YyE6yJFySwiGGSzA+mM3KJ8QQvzeLh3blwgSonkFjgQdxzMw==", "dev": true, "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, "node_modules/@eslint/eslintrc": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.0.tgz", - "integrity": "sha512-Lj7DECXqIVCqnqjjHMPna4vn6GJcMgul/wuS0je9OZ9gsL0zzDpKPVtcG1HaDVc+9y+qgXneTeUMbCqXJNpH1A==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.1.tgz", + "integrity": "sha512-9t7ZA7NGGK8ckelF0PQCfcxIUzs1Md5rrO6U/c+FIQNanea5UZC0wqKXH4vHBccmu4ZJgZ2idtPeW7+Q2npOEA==", "dev": true, "dependencies": { "ajv": "^6.12.4", @@ -1037,9 +1037,9 @@ } }, "node_modules/@eslint/js": { - "version": "8.44.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.44.0.tgz", - "integrity": "sha512-Ag+9YM4ocKQx9AarydN0KY2j0ErMHNIocPDrVo8zAE44xLTjEtz81OdR68/cydGtk6m6jDb5Za3r2useMzYmSw==", + "version": "8.46.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.46.0.tgz", + "integrity": "sha512-a8TLtmPi8xzPkCbp/OGFUo5yhRkHM2Ko9kOWP4znJr0WAhWyThaw3PnwX4vOTWOAMsV2uRt32PPDcEz63esSaA==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -4379,27 +4379,27 @@ } }, "node_modules/eslint": { - "version": "8.45.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.45.0.tgz", - "integrity": "sha512-pd8KSxiQpdYRfYa9Wufvdoct3ZPQQuVuU5O6scNgMuOMYuxvH0IGaYK0wUFjo4UYYQQCUndlXiMbnxopwvvTiw==", + "version": "8.46.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.46.0.tgz", + "integrity": "sha512-cIO74PvbW0qU8e0mIvk5IV3ToWdCq5FYG6gWPHHkx6gNdjlbAYvtfHmlCMXxjcoVaIdwy/IAt3+mDkZkfvb2Dg==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.4.0", - "@eslint/eslintrc": "^2.1.0", - "@eslint/js": "8.44.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.1", + "@eslint/js": "^8.46.0", "@humanwhocodes/config-array": "^0.11.10", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", - "ajv": "^6.10.0", + "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", "debug": "^4.3.2", "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.0", - "eslint-visitor-keys": "^3.4.1", - "espree": "^9.6.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.2", + "espree": "^9.6.1", "esquery": "^1.4.2", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", @@ -4446,9 +4446,9 @@ } }, "node_modules/eslint-visitor-keys": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz", - "integrity": "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==", + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.2.tgz", + "integrity": "sha512-8drBzUEyZ2llkpCA67iYrgEssKDUu68V8ChqqOfFupIaG/LCVPUT+CoGJpT77zJprs4T/W7p07LP7zAIMuweVw==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -4559,9 +4559,9 @@ } }, "node_modules/eslint/node_modules/eslint-scope": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.0.tgz", - "integrity": "sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw==", + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", "dev": true, "dependencies": { "esrecurse": "^4.3.0", @@ -4719,9 +4719,9 @@ } }, "node_modules/espree": { - "version": "9.6.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.0.tgz", - "integrity": "sha512-1FH/IiruXZ84tpUlm0aCUEwMl2Ho5ilqVh0VvQXw+byAz/4SAciyHLlfmL5WYqsvD38oymdUwBss0LtK8m4s/A==", + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", "dev": true, "dependencies": { "acorn": "^8.9.0", @@ -11078,15 +11078,15 @@ } }, "@eslint-community/regexpp": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.4.0.tgz", - "integrity": "sha512-A9983Q0LnDGdLPjxyXQ00sbV+K+O+ko2Dr+CZigbHWtX9pNfxlaBkMR8X1CztI73zuEyEBXTVjx7CE+/VSwDiQ==", + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.6.2.tgz", + "integrity": "sha512-pPTNuaAG3QMH+buKyBIGJs3g/S5y0caxw0ygM3YyE6yJFySwiGGSzA+mM3KJ8QQvzeLh3blwgSonkFjgQdxzMw==", "dev": true }, "@eslint/eslintrc": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.0.tgz", - "integrity": "sha512-Lj7DECXqIVCqnqjjHMPna4vn6GJcMgul/wuS0je9OZ9gsL0zzDpKPVtcG1HaDVc+9y+qgXneTeUMbCqXJNpH1A==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.1.tgz", + "integrity": "sha512-9t7ZA7NGGK8ckelF0PQCfcxIUzs1Md5rrO6U/c+FIQNanea5UZC0wqKXH4vHBccmu4ZJgZ2idtPeW7+Q2npOEA==", "dev": true, "requires": { "ajv": "^6.12.4", @@ -11148,9 +11148,9 @@ } }, "@eslint/js": { - "version": "8.44.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.44.0.tgz", - "integrity": "sha512-Ag+9YM4ocKQx9AarydN0KY2j0ErMHNIocPDrVo8zAE44xLTjEtz81OdR68/cydGtk6m6jDb5Za3r2useMzYmSw==", + "version": "8.46.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.46.0.tgz", + "integrity": "sha512-a8TLtmPi8xzPkCbp/OGFUo5yhRkHM2Ko9kOWP4znJr0WAhWyThaw3PnwX4vOTWOAMsV2uRt32PPDcEz63esSaA==", "dev": true }, "@humanwhocodes/config-array": { @@ -13873,27 +13873,27 @@ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" }, "eslint": { - "version": "8.45.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.45.0.tgz", - "integrity": "sha512-pd8KSxiQpdYRfYa9Wufvdoct3ZPQQuVuU5O6scNgMuOMYuxvH0IGaYK0wUFjo4UYYQQCUndlXiMbnxopwvvTiw==", + "version": "8.46.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.46.0.tgz", + "integrity": "sha512-cIO74PvbW0qU8e0mIvk5IV3ToWdCq5FYG6gWPHHkx6gNdjlbAYvtfHmlCMXxjcoVaIdwy/IAt3+mDkZkfvb2Dg==", "dev": true, "requires": { "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.4.0", - "@eslint/eslintrc": "^2.1.0", - "@eslint/js": "8.44.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.1", + "@eslint/js": "^8.46.0", "@humanwhocodes/config-array": "^0.11.10", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", - "ajv": "^6.10.0", + "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", "debug": "^4.3.2", "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.0", - "eslint-visitor-keys": "^3.4.1", - "espree": "^9.6.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.2", + "espree": "^9.6.1", "esquery": "^1.4.2", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", @@ -13984,9 +13984,9 @@ "dev": true }, "eslint-scope": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.0.tgz", - "integrity": "sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw==", + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", "dev": true, "requires": { "esrecurse": "^4.3.0", @@ -14105,15 +14105,15 @@ } }, "eslint-visitor-keys": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz", - "integrity": "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==", + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.2.tgz", + "integrity": "sha512-8drBzUEyZ2llkpCA67iYrgEssKDUu68V8ChqqOfFupIaG/LCVPUT+CoGJpT77zJprs4T/W7p07LP7zAIMuweVw==", "dev": true }, "espree": { - "version": "9.6.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.0.tgz", - "integrity": "sha512-1FH/IiruXZ84tpUlm0aCUEwMl2Ho5ilqVh0VvQXw+byAz/4SAciyHLlfmL5WYqsvD38oymdUwBss0LtK8m4s/A==", + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", "dev": true, "requires": { "acorn": "^8.9.0", From 852fe1222633848b38c97dd9f3fb36e7b3fd5816 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 4 Aug 2023 15:02:47 +0800 Subject: [PATCH 160/297] Bump xml2js from 0.6.0 to 0.6.2 (#2075) Bumps [xml2js](https://github.com/Leonidas-from-XIV/node-xml2js) from 0.6.0 to 0.6.2. - [Commits](https://github.com/Leonidas-from-XIV/node-xml2js/compare/0.6.0...0.6.2) --- updated-dependencies: - dependency-name: xml2js dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index ac65c2296..ec478bdb3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10315,9 +10315,9 @@ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, "node_modules/xml2js": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.6.0.tgz", - "integrity": "sha512-eLTh0kA8uHceqesPqSE+VvO1CDDJWMwlQfB6LuN6T8w6MaDJ8Txm8P7s5cHD0miF0V+GGTZrDQfxPZQVsur33w==", + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.6.2.tgz", + "integrity": "sha512-T4rieHaC1EXcES0Kxxj4JWgaUQHDk+qwHcYOCFHfiwKz7tOVPLq7Hjq9dM1WCMhylqMEfP7hMcOIChvotiZegA==", "dependencies": { "sax": ">=0.6.0", "xmlbuilder": "~11.0.0" @@ -18257,9 +18257,9 @@ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, "xml2js": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.6.0.tgz", - "integrity": "sha512-eLTh0kA8uHceqesPqSE+VvO1CDDJWMwlQfB6LuN6T8w6MaDJ8Txm8P7s5cHD0miF0V+GGTZrDQfxPZQVsur33w==", + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.6.2.tgz", + "integrity": "sha512-T4rieHaC1EXcES0Kxxj4JWgaUQHDk+qwHcYOCFHfiwKz7tOVPLq7Hjq9dM1WCMhylqMEfP7hMcOIChvotiZegA==", "requires": { "sax": ">=0.6.0", "xmlbuilder": "~11.0.0" From 8ec899c08e234e3b3fc35a037e86a213881fdbee Mon Sep 17 00:00:00 2001 From: James Tomlinson Date: Fri, 4 Aug 2023 08:20:10 +0100 Subject: [PATCH 161/297] Add requestId to appendBlock (#2074) Add missing requestId to the appendBlock operation of an append blob. Fixes #631. --- ChangeLog.md | 4 ++++ src/blob/handlers/AppendBlobHandler.ts | 1 + 2 files changed, 5 insertions(+) diff --git a/ChangeLog.md b/ChangeLog.md index 786b6ced3..f33c5beab 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -4,6 +4,10 @@ ## Upcoming Release +Blob: + +- Fixed issue of: Append block not returning requestId in response. + ## 2023.07 Version 3.25.0 Table: diff --git a/src/blob/handlers/AppendBlobHandler.ts b/src/blob/handlers/AppendBlobHandler.ts index a15930324..d52bd788f 100644 --- a/src/blob/handlers/AppendBlobHandler.ts +++ b/src/blob/handlers/AppendBlobHandler.ts @@ -201,6 +201,7 @@ export default class AppendBlobHandler extends BaseHandler const response: Models.AppendBlobAppendBlockResponse = { statusCode: 201, + requestId: context.contextId, eTag: properties.etag, lastModified: properties.lastModified, contentMD5: contentMD5Buffer, From 778d06c3354cd82ab0445347d57ea85db93ed1d9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 4 Aug 2023 15:23:05 +0800 Subject: [PATCH 162/297] Bump tslib from 2.6.0 to 2.6.1 (#2071) Bumps [tslib](https://github.com/Microsoft/tslib) from 2.6.0 to 2.6.1. - [Release notes](https://github.com/Microsoft/tslib/releases) - [Commits](https://github.com/Microsoft/tslib/compare/2.6.0...v2.6.1) --- updated-dependencies: - dependency-name: tslib dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index ec478bdb3..aa9e91bb4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9732,9 +9732,9 @@ } }, "node_modules/tslib": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.0.tgz", - "integrity": "sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA==" + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", + "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==" }, "node_modules/tsutils": { "version": "3.21.0", @@ -17808,9 +17808,9 @@ } }, "tslib": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.0.tgz", - "integrity": "sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA==" + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", + "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==" }, "tsutils": { "version": "3.21.0", From 592b5ac461b312db9299e4bc855a0983862be658 Mon Sep 17 00:00:00 2001 From: Benjamin Pannell <1760260+notheotherben@users.noreply.github.com> Date: Mon, 7 Aug 2023 03:23:39 +0100 Subject: [PATCH 163/297] fix: Resolve issues with datetime comparisons in scenarios where microsecond precision is provided in the underlying value. (#2077) * fix: Resolve issues with datetime comparisons in scenarios where microsecond precision is provided in the underlying value. Fixes Filtering by Dates with Table Service no longer working in 3.25.0 #2069 * doc: Update changelog * fix: Ensure that we only match exact GUIDs for the legacy comparison model --- ChangeLog.md | 4 + .../QueryNodes/DateTimeNode.ts | 28 ++-- .../QueryInterpreter/QueryNodes/EqualsNode.ts | 15 ++- .../QueryNodes/GreaterThanEqualNode.ts | 9 ++ .../QueryNodes/GreaterThanNode.ts | 9 ++ .../QueryInterpreter/QueryNodes/GuidNode.ts | 25 ++-- .../QueryNodes/LessThanEqualNode.ts | 9 ++ .../QueryNodes/LessThanNode.ts | 9 ++ .../QueryNodes/NotEqualsNode.ts | 21 ++- .../QueryInterpreter/QueryNodes/ValueNode.ts | 30 +++++ .../QueryInterpreter/QueryParser.ts | 2 +- .../table/unit/query.interpreter.unit.test.ts | 124 ++++++++++++++++++ 12 files changed, 250 insertions(+), 35 deletions(-) create mode 100644 src/table/persistence/QueryInterpreter/QueryNodes/ValueNode.ts diff --git a/ChangeLog.md b/ChangeLog.md index f33c5beab..8f38b8252 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -8,6 +8,10 @@ Blob: - Fixed issue of: Append block not returning requestId in response. +Table: + - Fixed an issue when querying datetimes with microsecond precision which resulted in match failures. (issue #2069) + + ## 2023.07 Version 3.25.0 Table: diff --git a/src/table/persistence/QueryInterpreter/QueryNodes/DateTimeNode.ts b/src/table/persistence/QueryInterpreter/QueryNodes/DateTimeNode.ts index 6969bc80d..caf56710a 100644 --- a/src/table/persistence/QueryInterpreter/QueryNodes/DateTimeNode.ts +++ b/src/table/persistence/QueryInterpreter/QueryNodes/DateTimeNode.ts @@ -1,5 +1,6 @@ import { IQueryContext } from "../IQueryContext"; import IQueryNode from "./IQueryNode"; +import ValueNode from "./ValueNode"; /** * Represents a constant value of type `datetime` which is stored in its underlying JavaScript representation. @@ -9,18 +10,29 @@ import IQueryNode from "./IQueryNode"; * the query `PartitionKey eq datetime'2019-01-01T00:00:00.000Z'` would contain a `DateTimeNode` with the value * `2019-01-01T00:00:00.000Z`. */ -export default class DateTimeNode implements IQueryNode { - constructor(private value: Date) { } - +export default class DateTimeNode extends ValueNode { get name(): string { return "datetime"; } - evaluate(_context: IQueryContext): any { - return this.value.toISOString(); - } + compare(context: IQueryContext, other: IQueryNode): number { + // NOTE(notheotherben): This approach leverages the fact that the `Date` constructor will parse ISO8601 strings + // however it runs into a limitation of the accuracy of JS dates (which are limited to millisecond + // resolution). As a result, we're effectively truncating the value to millisecond precision by doing + // this. This is fundamentally a trade-off between enforcing valid datetime values and providing perfect + // accuracy, and we've opted to enforce valid datetime values as those are more likely to cause problems + // when moving to production. + const thisValue = new Date(this.value); + const otherValue = new Date(other.evaluate(context)); - toString(): string { - return `(${this.name} ${this.value.toISOString()})`; + if (thisValue.valueOf() < otherValue.valueOf()) { + return -1; + } else if (thisValue.valueOf() > otherValue.valueOf()) { + return 1; + } else if (thisValue.valueOf() === otherValue.valueOf()) { + return 0; + } else { + return NaN; + } } } \ No newline at end of file diff --git a/src/table/persistence/QueryInterpreter/QueryNodes/EqualsNode.ts b/src/table/persistence/QueryInterpreter/QueryNodes/EqualsNode.ts index 66021ccff..8b437ffd7 100644 --- a/src/table/persistence/QueryInterpreter/QueryNodes/EqualsNode.ts +++ b/src/table/persistence/QueryInterpreter/QueryNodes/EqualsNode.ts @@ -1,6 +1,6 @@ import { IQueryContext } from "../IQueryContext"; import BinaryOperatorNode from "./BinaryOperatorNode"; -import GuidNode from "./GuidNode"; +import ValueNode from "./ValueNode"; /** * Represents a logical equality operation between two nodes (the `eq` query operator). @@ -21,13 +21,14 @@ export default class EqualsNode extends BinaryOperatorNode { } evaluate(context: IQueryContext): any { - return this.left.evaluate(context) === this.right.evaluate(context) || this.backwardsCompatibleGuidEvaluate(context); - } + if (this.left instanceof ValueNode) { + return this.left.compare(context, this.right) === 0; + } - private backwardsCompatibleGuidEvaluate(context: IQueryContext): boolean { - const left = this.left instanceof GuidNode ? this.left.legacyStorageFormat() : this.left.evaluate(context); - const right = this.right instanceof GuidNode ? this.right.legacyStorageFormat() : this.right.evaluate(context); + if (this.right instanceof ValueNode) { + return this.right.compare(context, this.left) === 0; + } - return left === right; + return this.left.evaluate(context) === this.right.evaluate(context); } } \ No newline at end of file diff --git a/src/table/persistence/QueryInterpreter/QueryNodes/GreaterThanEqualNode.ts b/src/table/persistence/QueryInterpreter/QueryNodes/GreaterThanEqualNode.ts index 137c18420..3cd3c6fc8 100644 --- a/src/table/persistence/QueryInterpreter/QueryNodes/GreaterThanEqualNode.ts +++ b/src/table/persistence/QueryInterpreter/QueryNodes/GreaterThanEqualNode.ts @@ -1,5 +1,6 @@ import { IQueryContext } from "../IQueryContext"; import BinaryOperatorNode from "./BinaryOperatorNode"; +import ValueNode from "./ValueNode"; /** * Represents a logical greater than or equal operation between two nodes (the `ge` query operator). @@ -17,6 +18,14 @@ export default class GreaterThanEqualNode extends BinaryOperatorNode { } evaluate(context: IQueryContext): any { + if (this.left instanceof ValueNode) { + return this.left.compare(context, this.right) >= 0; + } + + if (this.right instanceof ValueNode) { + return this.right.compare(context, this.left) <= 0; + } + return this.left.evaluate(context) >= this.right.evaluate(context); } } \ No newline at end of file diff --git a/src/table/persistence/QueryInterpreter/QueryNodes/GreaterThanNode.ts b/src/table/persistence/QueryInterpreter/QueryNodes/GreaterThanNode.ts index 935fc7628..99676fed5 100644 --- a/src/table/persistence/QueryInterpreter/QueryNodes/GreaterThanNode.ts +++ b/src/table/persistence/QueryInterpreter/QueryNodes/GreaterThanNode.ts @@ -1,5 +1,6 @@ import { IQueryContext } from "../IQueryContext"; import BinaryOperatorNode from "./BinaryOperatorNode"; +import ValueNode from "./ValueNode"; /** * Represents a logical greater than operation between two nodes (the `gt` query operator). @@ -17,6 +18,14 @@ export default class GreaterThanNode extends BinaryOperatorNode { } evaluate(context: IQueryContext): any { + if (this.left instanceof ValueNode) { + return this.left.compare(context, this.right) > 0; + } + + if (this.right instanceof ValueNode) { + return this.right.compare(context, this.left) < 0; + } + return this.left.evaluate(context) > this.right.evaluate(context); } } \ No newline at end of file diff --git a/src/table/persistence/QueryInterpreter/QueryNodes/GuidNode.ts b/src/table/persistence/QueryInterpreter/QueryNodes/GuidNode.ts index 3754e385e..b42eb68f7 100644 --- a/src/table/persistence/QueryInterpreter/QueryNodes/GuidNode.ts +++ b/src/table/persistence/QueryInterpreter/QueryNodes/GuidNode.ts @@ -1,5 +1,6 @@ import { IQueryContext } from "../IQueryContext"; import IQueryNode from "./IQueryNode"; +import ValueNode from "./ValueNode"; /** * Represents a constant value of type GUID which can be compared against the base64 representation of the GUID @@ -12,9 +13,7 @@ import IQueryNode from "./IQueryNode"; * NOTE: This node type also exposes a `legacyStorageFormat()` method which returns the GUID in its string representation * for backwards compatibility with the legacy table storage format. */ -export default class GuidNode implements IQueryNode { - constructor(private value: string) { } - +export default class GuidNode extends ValueNode { get name(): string { return "guid"; } @@ -23,11 +22,21 @@ export default class GuidNode implements IQueryNode { return Buffer.from(this.value).toString("base64"); } - legacyStorageFormat(): string { - return this.value; - } + compare(context: IQueryContext, other: IQueryNode): number { + const otherValue = other.evaluate(context); + let thisValue = this.value; + + // If the other value is not in its raw GUID format, then let's convert this value to its base64 representation + if (!/^[0-9a-f]{8}-([0-9a-f]{4}-){3}[0-9a-f]{12}$/i.test(otherValue)) { + thisValue = Buffer.from(this.value).toString("base64"); + } - toString(): string { - return `(${this.name} ${this.value})`; + if (thisValue < otherValue) { + return -1; + } else if (thisValue > otherValue) { + return 1; + } else { + return 0; + } } } \ No newline at end of file diff --git a/src/table/persistence/QueryInterpreter/QueryNodes/LessThanEqualNode.ts b/src/table/persistence/QueryInterpreter/QueryNodes/LessThanEqualNode.ts index 2da9a8879..2107e780a 100644 --- a/src/table/persistence/QueryInterpreter/QueryNodes/LessThanEqualNode.ts +++ b/src/table/persistence/QueryInterpreter/QueryNodes/LessThanEqualNode.ts @@ -1,5 +1,6 @@ import { IQueryContext } from "../IQueryContext"; import BinaryOperatorNode from "./BinaryOperatorNode"; +import ValueNode from "./ValueNode"; /** * Represents a logical less than or equal operation between two nodes (the `le` query operator). @@ -17,6 +18,14 @@ export default class LessThanEqualNode extends BinaryOperatorNode { } evaluate(context: IQueryContext): any { + if (this.left instanceof ValueNode) { + return this.left.compare(context, this.right) <= 0; + } + + if (this.right instanceof ValueNode) { + return this.right.compare(context, this.left) >= 0; + } + return this.left.evaluate(context) <= this.right.evaluate(context); } } \ No newline at end of file diff --git a/src/table/persistence/QueryInterpreter/QueryNodes/LessThanNode.ts b/src/table/persistence/QueryInterpreter/QueryNodes/LessThanNode.ts index 6a0a826b6..f4fdff538 100644 --- a/src/table/persistence/QueryInterpreter/QueryNodes/LessThanNode.ts +++ b/src/table/persistence/QueryInterpreter/QueryNodes/LessThanNode.ts @@ -1,5 +1,6 @@ import { IQueryContext } from "../IQueryContext"; import BinaryOperatorNode from "./BinaryOperatorNode"; +import ValueNode from "./ValueNode"; /** * Represents a logical less than operation between two nodes (the `lt` query operator). @@ -17,6 +18,14 @@ export default class LessThanNode extends BinaryOperatorNode { } evaluate(context: IQueryContext): any { + if (this.left instanceof ValueNode) { + return this.left.compare(context, this.right) < 0; + } + + if (this.right instanceof ValueNode) { + return this.right.compare(context, this.left) > 0; + } + return this.left.evaluate(context) < this.right.evaluate(context); } } \ No newline at end of file diff --git a/src/table/persistence/QueryInterpreter/QueryNodes/NotEqualsNode.ts b/src/table/persistence/QueryInterpreter/QueryNodes/NotEqualsNode.ts index 352543a0f..186a80baa 100644 --- a/src/table/persistence/QueryInterpreter/QueryNodes/NotEqualsNode.ts +++ b/src/table/persistence/QueryInterpreter/QueryNodes/NotEqualsNode.ts @@ -1,6 +1,6 @@ import { IQueryContext } from "../IQueryContext"; import BinaryOperatorNode from "./BinaryOperatorNode"; -import GuidNode from "./GuidNode"; +import ValueNode from "./ValueNode"; /** * Represents a logical not equal operation between two nodes (the `ne` query operator). @@ -21,18 +21,17 @@ export default class NotEqualsNode extends BinaryOperatorNode { } evaluate(context: IQueryContext): any { - const left = this.left.evaluate(context); - const right = this.right.evaluate(context); + if (this.left instanceof ValueNode) { + return this.left.compare(context, this.right) !== 0; + } - // If either side is undefined, we should not match - this only occurs in scenarios where - // the field itself doesn't exist on the entity. - return left !== right && left !== undefined && right !== undefined && this.backwardsCompatibleGuidEvaluate(context); - } + if (this.right instanceof ValueNode) { + return this.right.compare(context, this.left) !== 0; + } - private backwardsCompatibleGuidEvaluate(context: IQueryContext): boolean { - const left = this.left instanceof GuidNode ? this.left.legacyStorageFormat() : this.left.evaluate(context); - const right = this.right instanceof GuidNode ? this.right.legacyStorageFormat() : this.right.evaluate(context); + const left = this.left.evaluate(context); + const right = this.right.evaluate(context); - return left !== right; + return left !== right && left !== undefined && right !== undefined; } } \ No newline at end of file diff --git a/src/table/persistence/QueryInterpreter/QueryNodes/ValueNode.ts b/src/table/persistence/QueryInterpreter/QueryNodes/ValueNode.ts new file mode 100644 index 000000000..40f7919ec --- /dev/null +++ b/src/table/persistence/QueryInterpreter/QueryNodes/ValueNode.ts @@ -0,0 +1,30 @@ +import { IQueryContext } from "../IQueryContext"; +import IQueryNode from "./IQueryNode"; + +/** + * Represents a typed value which can implement its own comparison logic. + */ +export default abstract class ValueNode implements IQueryNode { + constructor(protected value: string) { } + + abstract get name(): string; + + evaluate(_context: IQueryContext): any { + return this.value; + } + + compare(context: IQueryContext, other: IQueryNode): number { + const otherValue = other.evaluate(context); + if (this.value < otherValue) { + return -1; + } else if (this.value > otherValue) { + return 1; + } else { + return 0; + } + } + + toString(): string { + return `(${this.name} ${this.value})`; + } +} \ No newline at end of file diff --git a/src/table/persistence/QueryInterpreter/QueryParser.ts b/src/table/persistence/QueryInterpreter/QueryParser.ts index f448b0f7e..d2e71e1ef 100644 --- a/src/table/persistence/QueryInterpreter/QueryParser.ts +++ b/src/table/persistence/QueryInterpreter/QueryParser.ts @@ -223,7 +223,7 @@ class QueryParser { switch (typeHint.value?.toLowerCase()) { case "datetime": - return new DateTimeNode(new Date(value.value!)); + return new DateTimeNode(value.value!); case "guid": return new GuidNode(value.value!); case "binary": diff --git a/tests/table/unit/query.interpreter.unit.test.ts b/tests/table/unit/query.interpreter.unit.test.ts index 7a8af1375..90321ab9c 100644 --- a/tests/table/unit/query.interpreter.unit.test.ts +++ b/tests/table/unit/query.interpreter.unit.test.ts @@ -32,6 +32,7 @@ describe("Query Interpreter", () => { double: -123.01, bool: true, date: "2020-01-01T00:00:00.000Z", + microsecondDate: "2023-01-01T00:00:00.000000Z", guid: Buffer.from("00000000-0000-0000-0000-000000000000").toString("base64"), guidLegacy: "00000000-0000-0000-0000-000000000000", binary: Buffer.from("binaryData").toString("base64"), @@ -242,6 +243,129 @@ describe("Query Interpreter", () => { expectedResult: true } ]) + + runTestCases("DateTimes", referenceEntity, [ + { + name: "DateTime equality", + originalQuery: "date eq datetime'2020-01-01T00:00:00.000Z'", + expectedResult: true + }, + { + name: "DateTime equality (doesn't match)", + originalQuery: "date eq datetime'2020-01-01T00:00:01.000Z'", + expectedResult: false + }, + { + name: "DateTime equality (microseconds)", + originalQuery: "microsecondDate eq datetime'2023-01-01T00:00:00.000000Z'", + expectedResult: true + }, + { + name: "DateTime equality (microseconds) (doesn't match)", + originalQuery: "microsecondDate eq datetime'2023-01-01T00:00:00.001000Z'", + expectedResult: false + }, + { + name: "DateTime inequality", + originalQuery: "date ne datetime'2020-01-01T00:00:01.000000Z'", + expectedResult: true + }, + { + name: "DateTime inequality (doesn't match)", + originalQuery: "date ne datetime'2020-01-01T00:00:00.000000Z'", + expectedResult: false + }, + { + name: "DateTime inequality (microseconds)", + originalQuery: "microsecondDate ne datetime'2023-01-01T00:00:01.000000Z'", + expectedResult: true + }, + { + name: "DateTime inequality (microseconds) (doesn't match)", + originalQuery: "microsecondDate ne datetime'2023-01-01T00:00:00.000000Z'", + expectedResult: false + }, + { + name: "DateTime greater than", + originalQuery: "date gt datetime'2019-12-31T23:59:59.999999Z'", + expectedResult: true + }, + { + name: "DateTime greater than (doesn't match)", + originalQuery: "date gt datetime'2020-01-01T00:00:00.000000Z'", + expectedResult: false + }, + { + name: "DateTime greater than (microseconds)", + originalQuery: "microsecondDate gt datetime'2022-12-31T23:59:59.999999Z'", + expectedResult: true + }, + { + name: "DateTime greater than (microseconds) (doesn't match)", + originalQuery: "microsecondDate gt datetime'2023-01-01T00:00:00.000000Z'", + expectedResult: false + }, + { + name: "DateTime greater than or equal", + originalQuery: "date ge datetime'2020-01-01T00:00:00.000000Z'", + expectedResult: true + }, + { + name: "DateTime greater than or equal (doesn't match)", + originalQuery: "date ge datetime'2020-01-01T00:00:00.001000Z'", + expectedResult: false + }, + { + name: "DateTime greater than or equal (microseconds)", + originalQuery: "microsecondDate ge datetime'2023-01-01T00:00:00.000000Z'", + expectedResult: true + }, + { + name: "DateTime greater than or equal (microseconds) (doesn't match)", + originalQuery: "microsecondDate ge datetime'2023-01-01T00:00:00.001000Z'", + expectedResult: false + }, + { + name: "DateTime less than", + originalQuery: "date lt datetime'2020-01-01T00:00:00.001Z'", + expectedResult: true + }, + { + name: "DateTime less than (doesn't match)", + originalQuery: "date lt datetime'2020-01-01T00:00:00.000Z'", + expectedResult: false + }, + { + name: "DateTime less than (microseconds)", + originalQuery: "microsecondDate lt datetime'2023-01-01T00:00:00.001000Z'", + expectedResult: true + }, + { + name: "DateTime less than (microseconds) (doesn't match)", + originalQuery: "microsecondDate lt datetime'2023-01-01T00:00:00.000000Z'", + expectedResult: false + }, + { + name: "DateTime less than or equal", + originalQuery: "date le datetime'2020-01-01T00:00:00.000000Z'", + expectedResult: true + }, + { + name: "DateTime less than or equal (doesn't match)", + originalQuery: "date le datetime'2019-12-31T23:59:59.999999Z'", + expectedResult: false + }, + { + name: "DateTime less than or equal (microseconds)", + originalQuery: "microsecondDate le datetime'2023-01-01T00:00:00.000000Z'", + expectedResult: true + }, + { + name: "DateTime less than or equal (microseconds) (doesn't match)", + originalQuery: "microsecondDate le datetime'2022-12-31T23:59:59.999999Z'", + expectedResult: false + } + ]) }) describe("Regression Tests", () => { From 9e221953fbaf809315dcc8bd1225a7e0a4dab760 Mon Sep 17 00:00:00 2001 From: Garrett Baski <108769825+garrettbaski@users.noreply.github.com> Date: Sun, 6 Aug 2023 19:24:12 -0700 Subject: [PATCH 164/297] fix : Resolve issues with empty partition key query not returning anything (#2079) * Adding all of the code to correctly remove any entities with non populated fields when doing a query on said field. This includes the tests, as well as a reproduction for the current issue * The current check for partition key was using !! which for an empty string in JS resolve to false, causing the query context to think this was a table instead of an entity. Instead check for the existence of the field * Adding to the changelog * Addressing PR comment and removing unecessary !! symbols --------- Co-authored-by: Garrett Baski Co-authored-by: Wei Wei --- ChangeLog.md | 4 +++ .../QueryInterpreter/IQueryContext.ts | 2 +- tests/table/apis/table.entity.query.test.ts | 34 +++++++++++++++++++ 3 files changed, 39 insertions(+), 1 deletion(-) diff --git a/ChangeLog.md b/ChangeLog.md index 8f38b8252..7c357f11f 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -4,6 +4,10 @@ ## Upcoming Release +Table: + +- Fixed issue with queries on empty string partition keys failing + Blob: - Fixed issue of: Append block not returning requestId in response. diff --git a/src/table/persistence/QueryInterpreter/IQueryContext.ts b/src/table/persistence/QueryInterpreter/IQueryContext.ts index 2093b4671..dd28ae44a 100644 --- a/src/table/persistence/QueryInterpreter/IQueryContext.ts +++ b/src/table/persistence/QueryInterpreter/IQueryContext.ts @@ -9,7 +9,7 @@ export type IQueryContext = Entity | Table; * @returns {boolean} */ export function isEntity(context: IQueryContext): context is Entity { - return !!(context).PartitionKey; + return (context).hasOwnProperty('PartitionKey'); } /** diff --git a/tests/table/apis/table.entity.query.test.ts b/tests/table/apis/table.entity.query.test.ts index 7455f6685..344e7fd51 100644 --- a/tests/table/apis/table.entity.query.test.ts +++ b/tests/table/apis/table.entity.query.test.ts @@ -1361,4 +1361,38 @@ describe("table Entity APIs test - using Azure/data-tables", () => { assert.strictEqual(all.length, 5); await tableClient.deleteTable(); }); + + it("22. should work correctly when partition key is empty, @loki", async () => { + const tableClient = createAzureDataTablesClient( + testLocalAzuriteInstance, + getUniqueName("emptypartitionkey") + ); + await tableClient.createTable(); + + const partitionKey = ""; + + // Foo has some special characters + const result1 = await tableClient.createEntity({ + partitionKey: partitionKey, + rowKey: `1`, + foo: "TestVal`", + }); + assert.notStrictEqual(result1.etag, undefined); + + const maxPageSize = 5; + const entities = tableClient.listEntities>({ + queryOptions: { + filter: `PartitionKey eq '' and foo eq 'TestVal\`'` + } + }); + let all: TableEntity<{ foo: string }>[] = []; + for await (const entity of entities.byPage({ + maxPageSize + })) { + all = [...all, ...entity]; + } + assert.strictEqual(all.length, 1); + + await tableClient.deleteTable(); + }); }); From 525f697c813da95c1327053cc6fac27032a436ce Mon Sep 17 00:00:00 2001 From: EmmaZhu-MSFT Date: Mon, 7 Aug 2023 13:56:16 +0800 Subject: [PATCH 165/297] Bump version for hot fix (#2085) --- ChangeLog.md | 7 +++---- README.md | 2 +- package-lock.json | 6 +++--- package.json | 2 +- src/blob/utils/constants.ts | 2 +- src/queue/utils/constants.ts | 2 +- src/table/utils/constants.ts | 2 +- 7 files changed, 11 insertions(+), 12 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index 7c357f11f..557108024 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -4,17 +4,16 @@ ## Upcoming Release -Table: - -- Fixed issue with queries on empty string partition keys failing +## 2023.08 Version 3.25.1 Blob: - Fixed issue of: Append block not returning requestId in response. Table: - - Fixed an issue when querying datetimes with microsecond precision which resulted in match failures. (issue #2069) +- Fixed issue with queries on empty string partition keys failing +- Fixed an issue when querying datetimes with microsecond precision which resulted in match failures. (issue #2069) ## 2023.07 Version 3.25.0 diff --git a/README.md b/README.md index 3a5a96aef..a6b47e38c 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,7 @@ | Version | Azure Storage API Version | Service Support | Description | Reference Links | | ------------------------------------------------------------------ | ------------------------- | ------------------------------ | ------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| 3.25.0 | 2023-01-03 | Blob, Queue and Table(preview) | Azurite V3 based on TypeScript & New Architecture | [NPM](https://www.npmjs.com/package/azurite) - [Docker](https://hub.docker.com/_/microsoft-azure-storage-azurite) - [Visual Studio Code Extension](https://marketplace.visualstudio.com/items?itemName=Azurite.azurite) | +| 3.25.1 | 2023-01-03 | Blob, Queue and Table(preview) | Azurite V3 based on TypeScript & New Architecture | [NPM](https://www.npmjs.com/package/azurite) - [Docker](https://hub.docker.com/_/microsoft-azure-storage-azurite) - [Visual Studio Code Extension](https://marketplace.visualstudio.com/items?itemName=Azurite.azurite) | | [Legacy (v2)](https://github.com/Azure/Azurite/tree/legacy-master) | 2016-05-31 | Blob, Queue and Table | Legacy Azurite V2 | [NPM](https://www.npmjs.com/package/azurite) | - [Azurite V3](#azurite-v3) diff --git a/package-lock.json b/package-lock.json index aa9e91bb4..0b839a345 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "azurite", - "version": "3.25.0", + "version": "3.25.1", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "azurite", - "version": "3.25.0", + "version": "3.25.1", "license": "MIT", "dependencies": { "@azure/ms-rest-js": "^1.5.0", @@ -18314,4 +18314,4 @@ "dev": true } } -} +} \ No newline at end of file diff --git a/package.json b/package.json index a00d4a779..74ab5979e 100644 --- a/package.json +++ b/package.json @@ -3,7 +3,7 @@ "displayName": "Azurite", "description": "An open source Azure Storage API compatible server", "icon": "icon.png", - "version": "3.25.0", + "version": "3.25.1", "publisher": "Azurite", "categories": [ "Other" diff --git a/src/blob/utils/constants.ts b/src/blob/utils/constants.ts index 99b758252..6c4f41ee9 100644 --- a/src/blob/utils/constants.ts +++ b/src/blob/utils/constants.ts @@ -1,7 +1,7 @@ import { StoreDestinationArray } from "../../common/persistence/IExtentStore"; import * as Models from "../generated/artifacts/models"; -export const VERSION = "3.25.0"; +export const VERSION = "3.25.1"; export const BLOB_API_VERSION = "2023-01-03"; export const DEFAULT_BLOB_SERVER_HOST_NAME = "127.0.0.1"; // Change to 0.0.0.0 when needs external access export const DEFAULT_LIST_BLOBS_MAX_RESULTS = 5000; diff --git a/src/queue/utils/constants.ts b/src/queue/utils/constants.ts index c61ce00fc..02cd3f377 100644 --- a/src/queue/utils/constants.ts +++ b/src/queue/utils/constants.ts @@ -1,6 +1,6 @@ import { StoreDestinationArray } from "../../common/persistence/IExtentStore"; -export const VERSION = "3.25.0"; +export const VERSION = "3.25.1"; export const QUEUE_API_VERSION = "2023-01-03"; export const DEFAULT_QUEUE_SERVER_HOST_NAME = "127.0.0.1"; // Change to 0.0.0.0 when needs external access export const DEFAULT_QUEUE_LISTENING_PORT = 10001; diff --git a/src/table/utils/constants.ts b/src/table/utils/constants.ts index 582afb723..8e9d16d64 100644 --- a/src/table/utils/constants.ts +++ b/src/table/utils/constants.ts @@ -18,7 +18,7 @@ export enum TABLE_STATUSCODE { export const DEFAULT_TABLE_CONTEXT_PATH = "azurite_table_context"; export const TABLE_API_VERSION = "2023-01-03"; -export const VERSION = "3.25.0"; +export const VERSION = "3.25.1"; // Max Body size is 4 MB export const BODY_SIZE_MAX = 1024 * 1024 * 4; // Max Entity sizxe is 1 MB From 402255aa2e0f86e8453e6721256de7b525a45f0b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 11 Aug 2023 10:18:56 +0800 Subject: [PATCH 166/297] Bump @azure/core-auth from 1.4.0 to 1.5.0 (#2092) Bumps [@azure/core-auth](https://github.com/Azure/azure-sdk-for-js) from 1.4.0 to 1.5.0. - [Release notes](https://github.com/Azure/azure-sdk-for-js/releases) - [Changelog](https://github.com/Azure/azure-sdk-for-js/blob/main/documentation/Changelog-for-next-generation.md) - [Commits](https://github.com/Azure/azure-sdk-for-js/compare/@azure/core-auth_1.4.0...@azure/core-auth_1.5.0) --- updated-dependencies: - dependency-name: "@azure/core-auth" dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index 0b839a345..c8911e847 100644 --- a/package-lock.json +++ b/package-lock.json @@ -116,15 +116,16 @@ "integrity": "sha512-kmv8CGrPfN9SwMwrkiBK9VTQYxdFQEGe0BmQk+M8io56P9KNzpAxcWE/1fxJj7uouwN4kXF0BHW8DNlgx+wtCg==" }, "node_modules/@azure/core-auth": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@azure/core-auth/-/core-auth-1.4.0.tgz", - "integrity": "sha512-HFrcTgmuSuukRf/EdPmqBrc5l6Q5Uu+2TbuhaKbgaCpP2TfAeiNaQPAadxO+CYBRHGUzIDteMAjFspFLDLnKVQ==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@azure/core-auth/-/core-auth-1.5.0.tgz", + "integrity": "sha512-udzoBuYG1VBoHVohDTrvKjyzel34zt77Bhp7dQntVGGD0ehVq48owENbBG8fIgkHRNUBQH5k1r0hpoMu5L8+kw==", "dependencies": { "@azure/abort-controller": "^1.0.0", + "@azure/core-util": "^1.1.0", "tslib": "^2.2.0" }, "engines": { - "node": ">=12.0.0" + "node": ">=14.0.0" } }, "node_modules/@azure/core-client": { @@ -10418,11 +10419,12 @@ "integrity": "sha512-kmv8CGrPfN9SwMwrkiBK9VTQYxdFQEGe0BmQk+M8io56P9KNzpAxcWE/1fxJj7uouwN4kXF0BHW8DNlgx+wtCg==" }, "@azure/core-auth": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@azure/core-auth/-/core-auth-1.4.0.tgz", - "integrity": "sha512-HFrcTgmuSuukRf/EdPmqBrc5l6Q5Uu+2TbuhaKbgaCpP2TfAeiNaQPAadxO+CYBRHGUzIDteMAjFspFLDLnKVQ==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@azure/core-auth/-/core-auth-1.5.0.tgz", + "integrity": "sha512-udzoBuYG1VBoHVohDTrvKjyzel34zt77Bhp7dQntVGGD0ehVq48owENbBG8fIgkHRNUBQH5k1r0hpoMu5L8+kw==", "requires": { "@azure/abort-controller": "^1.0.0", + "@azure/core-util": "^1.1.0", "tslib": "^2.2.0" } }, @@ -18314,4 +18316,4 @@ "dev": true } } -} \ No newline at end of file +} From 2f4a22b7bd700bef4eb5b3df511092fbeb1e7e82 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 11 Aug 2023 10:19:05 +0800 Subject: [PATCH 167/297] Bump @azure/core-rest-pipeline from 1.11.0 to 1.12.0 (#2093) Bumps [@azure/core-rest-pipeline](https://github.com/Azure/azure-sdk-for-js) from 1.11.0 to 1.12.0. - [Release notes](https://github.com/Azure/azure-sdk-for-js/releases) - [Changelog](https://github.com/Azure/azure-sdk-for-js/blob/main/documentation/Changelog-for-next-generation.md) - [Commits](https://github.com/Azure/azure-sdk-for-js/compare/@azure/core-rest-pipeline_1.11.0...@azure/core-rest-pipeline_1.12.0) --- updated-dependencies: - dependency-name: "@azure/core-rest-pipeline" dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index c8911e847..a1563884f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -239,9 +239,9 @@ } }, "node_modules/@azure/core-rest-pipeline": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/@azure/core-rest-pipeline/-/core-rest-pipeline-1.11.0.tgz", - "integrity": "sha512-nB4KXl6qAyJmBVLWA7SakT4tzpYZTCk4pvRBeI+Ye0WYSOrlTqlMhc4MSS/8atD3ufeYWdkN380LLoXlUUzThw==", + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/@azure/core-rest-pipeline/-/core-rest-pipeline-1.12.0.tgz", + "integrity": "sha512-+MnSB0vGZjszSzr5AW8z93/9fkDu2RLtWmAN8gskURq7EW2sSwqy8jZa0V26rjuBVkwhdA3Hw8z3VWoeBUOw+A==", "dependencies": { "@azure/abort-controller": "^1.0.0", "@azure/core-auth": "^1.4.0", @@ -10520,9 +10520,9 @@ } }, "@azure/core-rest-pipeline": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/@azure/core-rest-pipeline/-/core-rest-pipeline-1.11.0.tgz", - "integrity": "sha512-nB4KXl6qAyJmBVLWA7SakT4tzpYZTCk4pvRBeI+Ye0WYSOrlTqlMhc4MSS/8atD3ufeYWdkN380LLoXlUUzThw==", + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/@azure/core-rest-pipeline/-/core-rest-pipeline-1.12.0.tgz", + "integrity": "sha512-+MnSB0vGZjszSzr5AW8z93/9fkDu2RLtWmAN8gskURq7EW2sSwqy8jZa0V26rjuBVkwhdA3Hw8z3VWoeBUOw+A==", "requires": { "@azure/abort-controller": "^1.0.0", "@azure/core-auth": "^1.4.0", From 6a6212a7cb2fc2b2cc2e759bcd2f4a018e74cf4a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 11 Aug 2023 10:19:28 +0800 Subject: [PATCH 168/297] Bump cross-env from 6.0.3 to 7.0.3 (#2094) Bumps [cross-env](https://github.com/kentcdodds/cross-env) from 6.0.3 to 7.0.3. - [Release notes](https://github.com/kentcdodds/cross-env/releases) - [Changelog](https://github.com/kentcdodds/cross-env/blob/master/CHANGELOG.md) - [Commits](https://github.com/kentcdodds/cross-env/compare/v6.0.3...v7.0.3) --- updated-dependencies: - dependency-name: cross-env dependency-type: direct:development update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 22 ++++++++++++---------- package.json | 2 +- 2 files changed, 13 insertions(+), 11 deletions(-) diff --git a/package-lock.json b/package-lock.json index a1563884f..c7c40bbc1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -68,7 +68,7 @@ "@typescript-eslint/parser": "^5.54.1", "autorest": "^3.6.0", "azure-storage": "^2.10.3", - "cross-env": "^6.0.3", + "cross-env": "^7.0.3", "cross-var": "^1.1.0", "eslint": "^8.35.0", "find-process": "^1.4.4", @@ -3813,19 +3813,21 @@ "dev": true }, "node_modules/cross-env": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-6.0.3.tgz", - "integrity": "sha512-+KqxF6LCvfhWvADcDPqo64yVIB31gv/jQulX2NGzKS/g3GEVz6/pt4wjHFtFWsHMddebWD/sDthJemzM4MaAag==", + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz", + "integrity": "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==", "dev": true, "dependencies": { - "cross-spawn": "^7.0.0" + "cross-spawn": "^7.0.1" }, "bin": { "cross-env": "src/bin/cross-env.js", "cross-env-shell": "src/bin/cross-env-shell.js" }, "engines": { - "node": ">=8.0" + "node": ">=10.14", + "npm": ">=6", + "yarn": ">=1" } }, "node_modules/cross-env/node_modules/cross-spawn": { @@ -13457,12 +13459,12 @@ "dev": true }, "cross-env": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-6.0.3.tgz", - "integrity": "sha512-+KqxF6LCvfhWvADcDPqo64yVIB31gv/jQulX2NGzKS/g3GEVz6/pt4wjHFtFWsHMddebWD/sDthJemzM4MaAag==", + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz", + "integrity": "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==", "dev": true, "requires": { - "cross-spawn": "^7.0.0" + "cross-spawn": "^7.0.1" }, "dependencies": { "cross-spawn": { diff --git a/package.json b/package.json index 74ab5979e..1b5ee0392 100644 --- a/package.json +++ b/package.json @@ -73,7 +73,7 @@ "@typescript-eslint/parser": "^5.54.1", "autorest": "^3.6.0", "azure-storage": "^2.10.3", - "cross-env": "^6.0.3", + "cross-env": "^7.0.3", "cross-var": "^1.1.0", "eslint": "^8.35.0", "find-process": "^1.4.4", From b3900fd5b3e92b005dae97ca2d7375342557023a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 11 Aug 2023 10:29:09 +0800 Subject: [PATCH 169/297] Bump @types/validator from 13.7.17 to 13.11.1 (#2091) Bumps [@types/validator](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/validator) from 13.7.17 to 13.11.1. - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/validator) --- updated-dependencies: - dependency-name: "@types/validator" dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index c7c40bbc1..bfbc56c01 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1573,9 +1573,9 @@ } }, "node_modules/@types/validator": { - "version": "13.7.17", - "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.7.17.tgz", - "integrity": "sha512-aqayTNmeWrZcvnG2MG9eGYI6b7S5fl+yKgPs6bAjOTwPS316R5SxBGKvtSExfyoJU7pIeHJfsHI0Ji41RVMkvQ==" + "version": "13.11.1", + "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.11.1.tgz", + "integrity": "sha512-d/MUkJYdOeKycmm75Arql4M5+UuXmf4cHdHKsyw1GcvnNgL6s77UkgSgJ8TE/rI5PYsnwYq5jkcWBLuN/MpQ1A==" }, "node_modules/@types/vscode": { "version": "1.80.0", @@ -11614,9 +11614,9 @@ } }, "@types/validator": { - "version": "13.7.17", - "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.7.17.tgz", - "integrity": "sha512-aqayTNmeWrZcvnG2MG9eGYI6b7S5fl+yKgPs6bAjOTwPS316R5SxBGKvtSExfyoJU7pIeHJfsHI0Ji41RVMkvQ==" + "version": "13.11.1", + "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.11.1.tgz", + "integrity": "sha512-d/MUkJYdOeKycmm75Arql4M5+UuXmf4cHdHKsyw1GcvnNgL6s77UkgSgJ8TE/rI5PYsnwYq5jkcWBLuN/MpQ1A==" }, "@types/vscode": { "version": "1.80.0", From e3aae95a26797a5f939e4f578dfb713b4fc97fe3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 14 Aug 2023 10:12:45 +0800 Subject: [PATCH 170/297] Bump jsonwebtoken and @types/jsonwebtoken (#2098) Bumps [jsonwebtoken](https://github.com/auth0/node-jsonwebtoken) and [@types/jsonwebtoken](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/jsonwebtoken). These dependencies needed to be updated together. Updates `jsonwebtoken` from 9.0.0 to 9.0.1 - [Changelog](https://github.com/auth0/node-jsonwebtoken/blob/master/CHANGELOG.md) - [Commits](https://github.com/auth0/node-jsonwebtoken/compare/v9.0.0...v9.0.1) Updates `@types/jsonwebtoken` from 9.0.1 to 9.0.2 - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/jsonwebtoken) --- updated-dependencies: - dependency-name: jsonwebtoken dependency-type: direct:production update-type: version-update:semver-patch - dependency-name: "@types/jsonwebtoken" dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/package-lock.json b/package-lock.json index bfbc56c01..9235bafd9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1440,9 +1440,9 @@ } }, "node_modules/@types/jsonwebtoken": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-9.0.1.tgz", - "integrity": "sha512-c5ltxazpWabia/4UzhIoaDcIza4KViOQhdbjRlfcIGVnsE3c3brkz9Z+F/EeJIECOQP7W7US2hNE930cWWkPiw==", + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz", + "integrity": "sha512-drE6uz7QBKq1fYqqoFKTDRdFCPHd5TCub75BM+D+cMx7NU9hUz7SESLfC2fSCXVFMO5Yj8sOWHuGqPgjc+fz0Q==", "dev": true, "dependencies": { "@types/node": "*" @@ -6645,9 +6645,9 @@ ] }, "node_modules/jsonwebtoken": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.0.tgz", - "integrity": "sha512-tuGfYXxkQGDPnLJ7SibiQgVgeDgfbPq2k2ICcbgqW8WxWLBAxKQM/ZCu/IT8SOSwmaYl4dpTFCW5xZv7YbbWUw==", + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.1.tgz", + "integrity": "sha512-K8wx7eJ5TPvEjuiVSkv167EVboBDv9PZdDoF7BgeQnBLVvZWW9clr2PsQHVJDTKaEIH5JBIwHujGcHp7GgI2eg==", "dependencies": { "jws": "^3.2.2", "lodash": "^4.17.21", @@ -11481,9 +11481,9 @@ } }, "@types/jsonwebtoken": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-9.0.1.tgz", - "integrity": "sha512-c5ltxazpWabia/4UzhIoaDcIza4KViOQhdbjRlfcIGVnsE3c3brkz9Z+F/EeJIECOQP7W7US2hNE930cWWkPiw==", + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz", + "integrity": "sha512-drE6uz7QBKq1fYqqoFKTDRdFCPHd5TCub75BM+D+cMx7NU9hUz7SESLfC2fSCXVFMO5Yj8sOWHuGqPgjc+fz0Q==", "dev": true, "requires": { "@types/node": "*" @@ -15511,9 +15511,9 @@ "dev": true }, "jsonwebtoken": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.0.tgz", - "integrity": "sha512-tuGfYXxkQGDPnLJ7SibiQgVgeDgfbPq2k2ICcbgqW8WxWLBAxKQM/ZCu/IT8SOSwmaYl4dpTFCW5xZv7YbbWUw==", + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.1.tgz", + "integrity": "sha512-K8wx7eJ5TPvEjuiVSkv167EVboBDv9PZdDoF7BgeQnBLVvZWW9clr2PsQHVJDTKaEIH5JBIwHujGcHp7GgI2eg==", "requires": { "jws": "^3.2.2", "lodash": "^4.17.21", From f9b2cbb3474717a4f6d4db75e22c76d1f9477ada Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 14 Aug 2023 10:12:58 +0800 Subject: [PATCH 171/297] Bump prettier from 3.0.0 to 3.0.1 (#2097) Bumps [prettier](https://github.com/prettier/prettier) from 3.0.0 to 3.0.1. - [Release notes](https://github.com/prettier/prettier/releases) - [Changelog](https://github.com/prettier/prettier/blob/main/CHANGELOG.md) - [Commits](https://github.com/prettier/prettier/compare/3.0.0...3.0.1) --- updated-dependencies: - dependency-name: prettier dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 9235bafd9..d87188fb0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8387,9 +8387,9 @@ } }, "node_modules/prettier": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.0.0.tgz", - "integrity": "sha512-zBf5eHpwHOGPC47h0zrPyNn+eAEIdEzfywMoYn2XPi0P44Zp0tSq64rq0xAREh4auw2cJZHo9QUob+NqCQky4g==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.0.1.tgz", + "integrity": "sha512-fcOWSnnpCrovBsmFZIGIy9UqK2FaI7Hqax+DIO0A9UxeVoY4iweyaFjS5TavZN97Hfehph0nhsZnjlVKzEQSrQ==", "dev": true, "bin": { "prettier": "bin/prettier.cjs" @@ -16830,9 +16830,9 @@ "dev": true }, "prettier": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.0.0.tgz", - "integrity": "sha512-zBf5eHpwHOGPC47h0zrPyNn+eAEIdEzfywMoYn2XPi0P44Zp0tSq64rq0xAREh4auw2cJZHo9QUob+NqCQky4g==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.0.1.tgz", + "integrity": "sha512-fcOWSnnpCrovBsmFZIGIy9UqK2FaI7Hqax+DIO0A9UxeVoY4iweyaFjS5TavZN97Hfehph0nhsZnjlVKzEQSrQ==", "dev": true }, "private": { From 8a477a518b1110797e1e8081737ea01f606eab9a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 14 Aug 2023 10:16:31 +0800 Subject: [PATCH 172/297] Bump mysql2 from 3.5.2 to 3.6.0 (#2096) Bumps [mysql2](https://github.com/sidorares/node-mysql2) from 3.5.2 to 3.6.0. - [Release notes](https://github.com/sidorares/node-mysql2/releases) - [Changelog](https://github.com/sidorares/node-mysql2/blob/master/Changelog.md) - [Commits](https://github.com/sidorares/node-mysql2/compare/v3.5.2...v3.6.0) --- updated-dependencies: - dependency-name: mysql2 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index d87188fb0..e9a106dac 100644 --- a/package-lock.json +++ b/package-lock.json @@ -7493,9 +7493,9 @@ "dev": true }, "node_modules/mysql2": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.5.2.tgz", - "integrity": "sha512-cptobmhYkYeTBIFp2c0piw2+gElpioga1rUw5UidHvo8yaHijMZoo8A3zyBVoo/K71f7ZFvrShA9iMIy9dCzCA==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.6.0.tgz", + "integrity": "sha512-EWUGAhv6SphezurlfI2Fpt0uJEWLmirrtQR7SkbTHFC+4/mJBrPiSzHESHKAWKG7ALVD6xaG/NBjjd1DGJGQQQ==", "dependencies": { "denque": "^2.1.0", "generate-function": "^2.3.1", @@ -16181,9 +16181,9 @@ "dev": true }, "mysql2": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.5.2.tgz", - "integrity": "sha512-cptobmhYkYeTBIFp2c0piw2+gElpioga1rUw5UidHvo8yaHijMZoo8A3zyBVoo/K71f7ZFvrShA9iMIy9dCzCA==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.6.0.tgz", + "integrity": "sha512-EWUGAhv6SphezurlfI2Fpt0uJEWLmirrtQR7SkbTHFC+4/mJBrPiSzHESHKAWKG7ALVD6xaG/NBjjd1DGJGQQQ==", "requires": { "denque": "^2.1.0", "generate-function": "^2.3.1", From d92542cafbb8944993cd60163a0628ae26549ac4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 15 Aug 2023 09:34:56 +0800 Subject: [PATCH 173/297] Bump @types/bluebird from 3.5.37 to 3.5.38 (#2105) Bumps [@types/bluebird](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/bluebird) from 3.5.37 to 3.5.38. - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/bluebird) --- updated-dependencies: - dependency-name: "@types/bluebird" dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index e9a106dac..11c479b87 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1336,9 +1336,9 @@ "dev": true }, "node_modules/@types/bluebird": { - "version": "3.5.37", - "resolved": "https://registry.npmjs.org/@types/bluebird/-/bluebird-3.5.37.tgz", - "integrity": "sha512-g2qEd+zkfkTEudA2SrMAeAvY7CrFqtbsLILm2dT2VIeKTqMqVzcdfURlvu6FU3srRgbmXN1Srm94pg34EIehww==", + "version": "3.5.38", + "resolved": "https://registry.npmjs.org/@types/bluebird/-/bluebird-3.5.38.tgz", + "integrity": "sha512-yR/Kxc0dd4FfwtEoLZMoqJbM/VE/W7hXn/MIjb+axcwag0iFmSPK7OBUZq1YWLynJUoWQkfUrI7T0HDqGApNSg==", "dev": true }, "node_modules/@types/body-parser": { @@ -11377,9 +11377,9 @@ "dev": true }, "@types/bluebird": { - "version": "3.5.37", - "resolved": "https://registry.npmjs.org/@types/bluebird/-/bluebird-3.5.37.tgz", - "integrity": "sha512-g2qEd+zkfkTEudA2SrMAeAvY7CrFqtbsLILm2dT2VIeKTqMqVzcdfURlvu6FU3srRgbmXN1Srm94pg34EIehww==", + "version": "3.5.38", + "resolved": "https://registry.npmjs.org/@types/bluebird/-/bluebird-3.5.38.tgz", + "integrity": "sha512-yR/Kxc0dd4FfwtEoLZMoqJbM/VE/W7hXn/MIjb+axcwag0iFmSPK7OBUZq1YWLynJUoWQkfUrI7T0HDqGApNSg==", "dev": true }, "@types/body-parser": { From 7749895f007371193e6cf5f12e5c283fe3016353 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 15 Aug 2023 09:35:19 +0800 Subject: [PATCH 174/297] Bump @types/vscode from 1.80.0 to 1.81.0 (#2101) Bumps [@types/vscode](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/vscode) from 1.80.0 to 1.81.0. - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/vscode) --- updated-dependencies: - dependency-name: "@types/vscode" dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 11c479b87..8320d40c6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1578,9 +1578,9 @@ "integrity": "sha512-d/MUkJYdOeKycmm75Arql4M5+UuXmf4cHdHKsyw1GcvnNgL6s77UkgSgJ8TE/rI5PYsnwYq5jkcWBLuN/MpQ1A==" }, "node_modules/@types/vscode": { - "version": "1.80.0", - "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.80.0.tgz", - "integrity": "sha512-qK/CmOdS2o7ry3k6YqU4zD3R2AYlJfbwBoSbKpBoP+GpXNE+0NEgJOli4n0bm0diK5kfBnchgCEj4igQz/44Hg==", + "version": "1.81.0", + "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.81.0.tgz", + "integrity": "sha512-YIaCwpT+O2E7WOMq0eCgBEABE++SX3Yl/O02GoMIF2DO3qAtvw7m6BXFYsxnc6XyzwZgh6/s/UG78LSSombl2w==", "dev": true }, "node_modules/@types/xml2js": { @@ -11619,9 +11619,9 @@ "integrity": "sha512-d/MUkJYdOeKycmm75Arql4M5+UuXmf4cHdHKsyw1GcvnNgL6s77UkgSgJ8TE/rI5PYsnwYq5jkcWBLuN/MpQ1A==" }, "@types/vscode": { - "version": "1.80.0", - "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.80.0.tgz", - "integrity": "sha512-qK/CmOdS2o7ry3k6YqU4zD3R2AYlJfbwBoSbKpBoP+GpXNE+0NEgJOli4n0bm0diK5kfBnchgCEj4igQz/44Hg==", + "version": "1.81.0", + "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.81.0.tgz", + "integrity": "sha512-YIaCwpT+O2E7WOMq0eCgBEABE++SX3Yl/O02GoMIF2DO3qAtvw7m6BXFYsxnc6XyzwZgh6/s/UG78LSSombl2w==", "dev": true }, "@types/xml2js": { From 2822cf933b4fb6c57426ecd0a27c4ca698e1662b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 15 Aug 2023 09:47:14 +0800 Subject: [PATCH 175/297] Bump rcedit from 3.0.1 to 3.1.0 (#2103) Bumps [rcedit](https://github.com/electron/node-rcedit) from 3.0.1 to 3.1.0. - [Release notes](https://github.com/electron/node-rcedit/releases) - [Changelog](https://github.com/electron/node-rcedit/blob/master/.releaserc.json) - [Commits](https://github.com/electron/node-rcedit/compare/v3.0.1...v3.1.0) --- updated-dependencies: - dependency-name: rcedit dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 8320d40c6..58beda8ef 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8545,9 +8545,9 @@ } }, "node_modules/rcedit": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/rcedit/-/rcedit-3.0.1.tgz", - "integrity": "sha512-XM0Jv40/y4hVAqj/MO70o/IWs4uOsaSoo2mLyk3klFDW+SStLnCtzuQu+1OBTIMGlM8CvaK9ftlYCp6DJ+cMsw==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/rcedit/-/rcedit-3.1.0.tgz", + "integrity": "sha512-WRlRdY1qZbu1L11DklT07KuHfRk42l0NFFJdaExELEu4fEQ982bP5Z6OWGPj/wLLIuKRQDCxZJGAwoFsxhZhNA==", "dev": true, "dependencies": { "cross-spawn-windows-exe": "^1.1.0" @@ -16935,9 +16935,9 @@ } }, "rcedit": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/rcedit/-/rcedit-3.0.1.tgz", - "integrity": "sha512-XM0Jv40/y4hVAqj/MO70o/IWs4uOsaSoo2mLyk3klFDW+SStLnCtzuQu+1OBTIMGlM8CvaK9ftlYCp6DJ+cMsw==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/rcedit/-/rcedit-3.1.0.tgz", + "integrity": "sha512-WRlRdY1qZbu1L11DklT07KuHfRk42l0NFFJdaExELEu4fEQ982bP5Z6OWGPj/wLLIuKRQDCxZJGAwoFsxhZhNA==", "dev": true, "requires": { "cross-spawn-windows-exe": "^1.1.0" From 941705a51524b36abe6ecb592c9dd9eb73fedc79 Mon Sep 17 00:00:00 2001 From: Wei Wei Date: Tue, 15 Aug 2023 04:35:38 +0000 Subject: [PATCH 176/297] Fix issue #2061, #2064, #2083 (#2087) * Fix 2061 & 2083 * fix issue #2064 * Add test cases and change log --------- Co-authored-by: EmmaZhu --- ChangeLog.md | 9 ++ src/blob/generated/artifacts/mappers.ts | 6 + src/blob/generated/artifacts/models.ts | 5 + src/blob/handlers/BlobHandler.ts | 3 +- src/queue/errors/StorageErrorFactory.ts | 2 +- src/queue/generated/artifacts/parameters.ts | 8 -- swagger/blob-storage-2021-10-04.json | 5 + swagger/blob.md | 2 + swagger/queue-storage.json | 2 - swagger/queue.md | 3 + tests/blob/apis/blob.test.ts | 4 + tests/queue/apis/messages.test.ts | 120 ++++++++++++++++++++ tests/queue/queueSas.test.ts | 37 ++++++ 13 files changed, 194 insertions(+), 12 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index 557108024..0c8e1fff2 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -4,6 +4,15 @@ ## Upcoming Release +Blob: + +- Added "x-ms-delete-type-permanent" header in delete blob API responds (issue #2061) + +Queue: + +- Fixed error code when dequeue message with invalid visibilitytimeout (issue #2083) +- Fixed error code when sas request authentication failed (issue #2064) + ## 2023.08 Version 3.25.1 Blob: diff --git a/src/blob/generated/artifacts/mappers.ts b/src/blob/generated/artifacts/mappers.ts index accf7b9d6..6f41aeffe 100644 --- a/src/blob/generated/artifacts/mappers.ts +++ b/src/blob/generated/artifacts/mappers.ts @@ -4553,6 +4553,12 @@ export const BlobDeleteHeaders: msRest.CompositeMapper = { name: "DateTimeRfc1123" } }, + deleteTypePermanent: { + serializedName: "x-ms-delete-type-permanent", + type: { + name: "Boolean" + } + }, errorCode: { serializedName: "x-ms-error-code", type: { diff --git a/src/blob/generated/artifacts/models.ts b/src/blob/generated/artifacts/models.ts index e362ab505..d46d3a924 100644 --- a/src/blob/generated/artifacts/models.ts +++ b/src/blob/generated/artifacts/models.ts @@ -4866,6 +4866,11 @@ export interface BlobDeleteHeaders { * initiated */ date?: Date; + /** + * For version 2017-07-29 and later, Blob Storage returns true if the blob has been permanently + * deleted, and false if the blob has been soft-deleted. + */ + deleteTypePermanent?: boolean; errorCode?: string; } diff --git a/src/blob/handlers/BlobHandler.ts b/src/blob/handlers/BlobHandler.ts index 1087138e8..51cf1a65e 100644 --- a/src/blob/handlers/BlobHandler.ts +++ b/src/blob/handlers/BlobHandler.ts @@ -188,7 +188,8 @@ export default class BlobHandler extends BaseHandler implements IBlobHandler { requestId: context.contextId, date: context.startTime, version: BLOB_API_VERSION, - clientRequestId: options.requestId + clientRequestId: options.requestId, + deleteTypePermanent: true }; return response; diff --git a/src/queue/errors/StorageErrorFactory.ts b/src/queue/errors/StorageErrorFactory.ts index e2b26d7a3..f564d9da8 100644 --- a/src/queue/errors/StorageErrorFactory.ts +++ b/src/queue/errors/StorageErrorFactory.ts @@ -135,7 +135,7 @@ export default class StorageErrorFactory { ): StorageError { return new StorageError( 403, - "AuthorizationFailure", + "AuthenticationFailed", "Server failed to authenticate the request." + "Make sure the value of the Authorization header is formed correctly including the signature.", contextID diff --git a/src/queue/generated/artifacts/parameters.ts b/src/queue/generated/artifacts/parameters.ts index 8b22cae87..b2cc94ec2 100644 --- a/src/queue/generated/artifacts/parameters.ts +++ b/src/queue/generated/artifacts/parameters.ts @@ -270,10 +270,6 @@ export const visibilitytimeout0: msRest.OperationQueryParameter = { ], mapper: { serializedName: "visibilitytimeout", - constraints: { - InclusiveMaximum: 604800, - InclusiveMinimum: 0 - }, type: { name: "Number" } @@ -284,10 +280,6 @@ export const visibilitytimeout1: msRest.OperationQueryParameter = { mapper: { required: true, serializedName: "visibilitytimeout", - constraints: { - InclusiveMaximum: 604800, - InclusiveMinimum: 0 - }, type: { name: "Number" } diff --git a/swagger/blob-storage-2021-10-04.json b/swagger/blob-storage-2021-10-04.json index a0812ce2e..463253aa8 100644 --- a/swagger/blob-storage-2021-10-04.json +++ b/swagger/blob-storage-2021-10-04.json @@ -3916,6 +3916,11 @@ "type": "string", "format": "date-time-rfc1123", "description": "UTC date/time value generated by the service that indicates the time at which the response was initiated" + }, + "x-ms-delete-type-permanent": { + "x-ms-client-name": "DeleteTypePermanent", + "type": "boolean", + "description": "For version 2017-07-29 and later, Blob Storage returns true if the blob has been permanently deleted, and false if the blob has been soft-deleted." } } }, diff --git a/swagger/blob.md b/swagger/blob.md index 9d805c6f3..d01d460f7 100644 --- a/swagger/blob.md +++ b/swagger/blob.md @@ -60,3 +60,5 @@ enum-types: true 14. Change "AllowedHeaders" and "ExposedHeaders" to from required to optional. 15. Remove "Container_Rename" section. + +16. Add "x-ms-delete-type-permanent" to "Blob_Delete" API response. diff --git a/swagger/queue-storage.json b/swagger/queue-storage.json index addd13fcf..43f1efdf1 100644 --- a/swagger/queue-storage.json +++ b/swagger/queue-storage.json @@ -1962,8 +1962,6 @@ "in": "query", "required": false, "type": "integer", - "minimum": 0, - "maximum": 604800, "x-ms-parameter-location": "method", "description": "Optional. Specifies the new visibility timeout value, in seconds, relative to server time. The default value is 30 seconds. A specified value must be larger than or equal to 1 second, and cannot be larger than 7 days, or larger than 2 hours on REST protocol versions prior to version 2011-08-18. The visibility timeout of a message can be set to a value later than the expiry time." }, diff --git a/swagger/queue.md b/swagger/queue.md index 8338a8242..58a1c78b6 100644 --- a/swagger/queue.md +++ b/swagger/queue.md @@ -16,3 +16,6 @@ optional-response-headers: true enum-types: true ``` +## Changes Made to Client Swagger + +1. Remove minimum/maximum limitation for "VisibilityTimeout" and "VisibilityTimeoutRequired". diff --git a/tests/blob/apis/blob.test.ts b/tests/blob/apis/blob.test.ts index 7c0614330..55202a8ba 100644 --- a/tests/blob/apis/blob.test.ts +++ b/tests/blob/apis/blob.test.ts @@ -260,6 +260,10 @@ describe("BlobAPIs", () => { result._response.request.headers.get("x-ms-client-request-id"), result.clientRequestId ); + assert.equal( + 'true', + result._response.headers.get("x-ms-delete-type-permanent") + ); }); it("delete should work for * ifMatch @loki @sql", async () => { diff --git a/tests/queue/apis/messages.test.ts b/tests/queue/apis/messages.test.ts index a7d2458db..2056491b6 100644 --- a/tests/queue/apis/messages.test.ts +++ b/tests/queue/apis/messages.test.ts @@ -628,4 +628,124 @@ describe("Messages APIs test", () => { }); + + it("enqueue,dequeue,update message with invalid visibilitytimeout @loki", async () => { + //const ttl = 2; + let error; + const eResult = await queueClient.sendMessage(messageContent); + + try { + await queueClient.sendMessage( + messageContent, + { + visibilityTimeout: 691200, + } + ); + } catch (err) { + error = err; + } + assert.ok(error); + assert.deepEqual(error.statusCode, 400); + assert.deepEqual(error.code, 'OutOfRangeQueryParameterValue'); + assert.ok( + error.message.includes( + "One of the query parameters specified in the request URI is outside the permissible range." + ) + ); + + error = undefined; + try { + await queueClient.sendMessage( + messageContent, + { + visibilityTimeout: -1, + } + ); + } catch (err) { + error = err; + } + assert.ok(error); + assert.deepEqual(error.statusCode, 400); + assert.deepEqual(error.code, 'OutOfRangeQueryParameterValue'); + assert.ok( + error.message.includes( + "One of the query parameters specified in the request URI is outside the permissible range." + ) + ); + + error = undefined; + try { + await queueClient.receiveMessages({ + visibilityTimeout: 691200, + numberOfMessages: 1 + }); + } catch (err) { + error = err; + } + assert.ok(error); + assert.deepEqual(error.statusCode, 400); + assert.deepEqual(error.code, 'OutOfRangeQueryParameterValue'); + assert.ok( + error.message.includes( + "One of the query parameters specified in the request URI is outside the permissible range." + ) + ); + + error = undefined; + try { + await queueClient.receiveMessages({ + visibilityTimeout: 0, + numberOfMessages: 1 + }); + } catch (err) { + error = err; + } + assert.ok(error); + assert.deepEqual(error.statusCode, 400); + assert.deepEqual(error.code, 'OutOfRangeQueryParameterValue'); + assert.ok( + error.message.includes( + "One of the query parameters specified in the request URI is outside the permissible range." + ) + ); + + error = undefined; + try { + await queueClient.updateMessage( + eResult.messageId, + eResult.popReceipt, + "", + 691200); + } catch (err) { + error = err; + } + assert.ok(error); + assert.deepEqual(error.statusCode, 400); + assert.deepEqual(error.code, 'OutOfRangeQueryParameterValue'); + assert.ok( + error.message.includes( + "One of the query parameters specified in the request URI is outside the permissible range." + ) + ); + + error = undefined; + try { + await queueClient.updateMessage( + eResult.messageId, + eResult.popReceipt, + "", + -1); + } catch (err) { + error = err; + } + assert.ok(error); + assert.deepEqual(error.statusCode, 400); + assert.deepEqual(error.code, 'OutOfRangeQueryParameterValue'); + assert.ok( + error.message.includes( + "One of the query parameters specified in the request URI is outside the permissible range." + ) + ); + + }); }); diff --git a/tests/queue/queueSas.test.ts b/tests/queue/queueSas.test.ts index 582d19093..05f641f5a 100644 --- a/tests/queue/queueSas.test.ts +++ b/tests/queue/queueSas.test.ts @@ -223,6 +223,43 @@ describe("Queue SAS test", () => { assert.deepEqual(error.statusCode, 403); }); + it("generateAccountSASQueryParameters should not work with invalid signature @loki", async () => { + const tmr = new Date(); + tmr.setDate(tmr.getDate() + 1); + + // By default, credential is always the last element of pipeline factories + const factories = (serviceClient as any).pipeline.factories; + const storageSharedKeyCredential = factories[factories.length - 1]; + + let sas = generateAccountSASQueryParameters( + { + expiresOn: tmr, + permissions: AccountSASPermissions.parse("rwdlacup"), + resourceTypes: AccountSASResourceTypes.parse("sco").toString(), + services: AccountSASServices.parse("btqf").toString() + }, + storageSharedKeyCredential as StorageSharedKeyCredential + ).toString(); + sas = sas + "1"; + + const sasURL = `${serviceClient.url}?${sas}`; + const serviceClientWithSAS = new QueueServiceClient( + sasURL, + newPipeline(new AnonymousCredential()) + ); + + let error; + try { + await serviceClientWithSAS.getProperties(); + } catch (err) { + error = err; + } + + assert.ok(error); + assert.deepEqual(error.statusCode, 403); + assert.deepEqual(error.code, 'AuthenticationFailed'); + }); + it("Create queue should work with write (w) or create (c) permission in account SAS @loki", async () => { const tmr = new Date(); tmr.setDate(tmr.getDate() + 1); From e0fc9f86edeb260808fba4d4af8c577bc1083461 Mon Sep 17 00:00:00 2001 From: Wei Wei Date: Tue, 15 Aug 2023 04:59:54 +0000 Subject: [PATCH 177/297] Updated examples of setting Customized Storage Accounts & Keys in enviroment varialbe (#2029) --- ChangeLog.md | 4 ++++ README.md | 4 ++-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index 0c8e1fff2..dae879f5d 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -4,6 +4,10 @@ ## Upcoming Release +General: + +- Updated examples of setting Customized Storage Accounts & Keys in enviroment varialbe. + Blob: - Added "x-ms-delete-type-permanent" header in delete blob API responds (issue #2061) diff --git a/README.md b/README.md index a6b47e38c..379e1a35b 100644 --- a/README.md +++ b/README.md @@ -447,13 +447,13 @@ Azurite V3 allows customizing storage account names and keys by providing enviro For example, customize one storage account which has only one key: ```cmd -set AZURITE_ACCOUNTS="account1:key1" +set AZURITE_ACCOUNTS=account1:key1 ``` Or customize multi storage accounts and each has 2 keys: ```cmd -set AZURITE_ACCOUNTS="account1:key1:key2;account2:key1:key2" +set AZURITE_ACCOUNTS=account1:key1:key2;account2:key1:key2 ``` Azurite will refresh customized account name and key from environment variable every minute by default. With this feature, we can dynamically rotate account key, or add new storage accounts on the air without restarting Azurite instance. From 926287e2fd0c648e588df0a353efb2f043858c51 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 16 Aug 2023 10:01:35 +0800 Subject: [PATCH 178/297] Bump prettier from 3.0.1 to 3.0.2 (#2110) Bumps [prettier](https://github.com/prettier/prettier) from 3.0.1 to 3.0.2. - [Release notes](https://github.com/prettier/prettier/releases) - [Changelog](https://github.com/prettier/prettier/blob/main/CHANGELOG.md) - [Commits](https://github.com/prettier/prettier/compare/3.0.1...3.0.2) --- updated-dependencies: - dependency-name: prettier dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 58beda8ef..728d2b36c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8387,9 +8387,9 @@ } }, "node_modules/prettier": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.0.1.tgz", - "integrity": "sha512-fcOWSnnpCrovBsmFZIGIy9UqK2FaI7Hqax+DIO0A9UxeVoY4iweyaFjS5TavZN97Hfehph0nhsZnjlVKzEQSrQ==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.0.2.tgz", + "integrity": "sha512-o2YR9qtniXvwEZlOKbveKfDQVyqxbEIWn48Z8m3ZJjBjcCmUy3xZGIv+7AkaeuaTr6yPXJjwv07ZWlsWbEy1rQ==", "dev": true, "bin": { "prettier": "bin/prettier.cjs" @@ -16830,9 +16830,9 @@ "dev": true }, "prettier": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.0.1.tgz", - "integrity": "sha512-fcOWSnnpCrovBsmFZIGIy9UqK2FaI7Hqax+DIO0A9UxeVoY4iweyaFjS5TavZN97Hfehph0nhsZnjlVKzEQSrQ==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.0.2.tgz", + "integrity": "sha512-o2YR9qtniXvwEZlOKbveKfDQVyqxbEIWn48Z8m3ZJjBjcCmUy3xZGIv+7AkaeuaTr6yPXJjwv07ZWlsWbEy1rQ==", "dev": true }, "private": { From c231af363ab73dd04eeaea229bd3af88cd201a8b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 16 Aug 2023 10:02:01 +0800 Subject: [PATCH 179/297] Bump eslint from 8.46.0 to 8.47.0 (#2108) Bumps [eslint](https://github.com/eslint/eslint) from 8.46.0 to 8.47.0. - [Release notes](https://github.com/eslint/eslint/releases) - [Changelog](https://github.com/eslint/eslint/blob/main/CHANGELOG.md) - [Commits](https://github.com/eslint/eslint/compare/v8.46.0...v8.47.0) --- updated-dependencies: - dependency-name: eslint dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 72 +++++++++++++++++++++++------------------------ 1 file changed, 36 insertions(+), 36 deletions(-) diff --git a/package-lock.json b/package-lock.json index 728d2b36c..6422cd106 100644 --- a/package-lock.json +++ b/package-lock.json @@ -941,9 +941,9 @@ } }, "node_modules/@eslint/eslintrc": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.1.tgz", - "integrity": "sha512-9t7ZA7NGGK8ckelF0PQCfcxIUzs1Md5rrO6U/c+FIQNanea5UZC0wqKXH4vHBccmu4ZJgZ2idtPeW7+Q2npOEA==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.2.tgz", + "integrity": "sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==", "dev": true, "dependencies": { "ajv": "^6.12.4", @@ -981,9 +981,9 @@ } }, "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "13.20.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", - "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", + "version": "13.21.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.21.0.tgz", + "integrity": "sha512-ybyme3s4yy/t/3s35bewwXKOf7cvzfreG2lH0lZl0JB7I4GxRP2ghxOK/Nb9EkRXdbBXZLfq/p/0W2JUONB/Gg==", "dev": true, "dependencies": { "type-fest": "^0.20.2" @@ -1038,9 +1038,9 @@ } }, "node_modules/@eslint/js": { - "version": "8.46.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.46.0.tgz", - "integrity": "sha512-a8TLtmPi8xzPkCbp/OGFUo5yhRkHM2Ko9kOWP4znJr0WAhWyThaw3PnwX4vOTWOAMsV2uRt32PPDcEz63esSaA==", + "version": "8.47.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.47.0.tgz", + "integrity": "sha512-P6omY1zv5MItm93kLM8s2vr1HICJH8v0dvddDhysbIuZ+vcjOHg5Zbkf1mTkcmi2JA9oBG2anOkRnW8WJTS8Og==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -4382,15 +4382,15 @@ } }, "node_modules/eslint": { - "version": "8.46.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.46.0.tgz", - "integrity": "sha512-cIO74PvbW0qU8e0mIvk5IV3ToWdCq5FYG6gWPHHkx6gNdjlbAYvtfHmlCMXxjcoVaIdwy/IAt3+mDkZkfvb2Dg==", + "version": "8.47.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.47.0.tgz", + "integrity": "sha512-spUQWrdPt+pRVP1TTJLmfRNJJHHZryFmptzcafwSvHsceV81djHOdnEeDmkdotZyLNjDhrOasNK8nikkoG1O8Q==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.1", - "@eslint/js": "^8.46.0", + "@eslint/eslintrc": "^2.1.2", + "@eslint/js": "^8.47.0", "@humanwhocodes/config-array": "^0.11.10", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", @@ -4401,7 +4401,7 @@ "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", "eslint-scope": "^7.2.2", - "eslint-visitor-keys": "^3.4.2", + "eslint-visitor-keys": "^3.4.3", "espree": "^9.6.1", "esquery": "^1.4.2", "esutils": "^2.0.2", @@ -4449,9 +4449,9 @@ } }, "node_modules/eslint-visitor-keys": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.2.tgz", - "integrity": "sha512-8drBzUEyZ2llkpCA67iYrgEssKDUu68V8ChqqOfFupIaG/LCVPUT+CoGJpT77zJprs4T/W7p07LP7zAIMuweVw==", + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -11088,9 +11088,9 @@ "dev": true }, "@eslint/eslintrc": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.1.tgz", - "integrity": "sha512-9t7ZA7NGGK8ckelF0PQCfcxIUzs1Md5rrO6U/c+FIQNanea5UZC0wqKXH4vHBccmu4ZJgZ2idtPeW7+Q2npOEA==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.2.tgz", + "integrity": "sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==", "dev": true, "requires": { "ajv": "^6.12.4", @@ -11114,9 +11114,9 @@ } }, "globals": { - "version": "13.20.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", - "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", + "version": "13.21.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.21.0.tgz", + "integrity": "sha512-ybyme3s4yy/t/3s35bewwXKOf7cvzfreG2lH0lZl0JB7I4GxRP2ghxOK/Nb9EkRXdbBXZLfq/p/0W2JUONB/Gg==", "dev": true, "requires": { "type-fest": "^0.20.2" @@ -11152,9 +11152,9 @@ } }, "@eslint/js": { - "version": "8.46.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.46.0.tgz", - "integrity": "sha512-a8TLtmPi8xzPkCbp/OGFUo5yhRkHM2Ko9kOWP4znJr0WAhWyThaw3PnwX4vOTWOAMsV2uRt32PPDcEz63esSaA==", + "version": "8.47.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.47.0.tgz", + "integrity": "sha512-P6omY1zv5MItm93kLM8s2vr1HICJH8v0dvddDhysbIuZ+vcjOHg5Zbkf1mTkcmi2JA9oBG2anOkRnW8WJTS8Og==", "dev": true }, "@humanwhocodes/config-array": { @@ -13877,15 +13877,15 @@ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" }, "eslint": { - "version": "8.46.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.46.0.tgz", - "integrity": "sha512-cIO74PvbW0qU8e0mIvk5IV3ToWdCq5FYG6gWPHHkx6gNdjlbAYvtfHmlCMXxjcoVaIdwy/IAt3+mDkZkfvb2Dg==", + "version": "8.47.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.47.0.tgz", + "integrity": "sha512-spUQWrdPt+pRVP1TTJLmfRNJJHHZryFmptzcafwSvHsceV81djHOdnEeDmkdotZyLNjDhrOasNK8nikkoG1O8Q==", "dev": true, "requires": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.1", - "@eslint/js": "^8.46.0", + "@eslint/eslintrc": "^2.1.2", + "@eslint/js": "^8.47.0", "@humanwhocodes/config-array": "^0.11.10", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", @@ -13896,7 +13896,7 @@ "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", "eslint-scope": "^7.2.2", - "eslint-visitor-keys": "^3.4.2", + "eslint-visitor-keys": "^3.4.3", "espree": "^9.6.1", "esquery": "^1.4.2", "esutils": "^2.0.2", @@ -14109,9 +14109,9 @@ } }, "eslint-visitor-keys": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.2.tgz", - "integrity": "sha512-8drBzUEyZ2llkpCA67iYrgEssKDUu68V8ChqqOfFupIaG/LCVPUT+CoGJpT77zJprs4T/W7p07LP7zAIMuweVw==", + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true }, "espree": { From af52ee54932ac4a6068e52ba22261117d7562fdf Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 16 Aug 2023 10:02:19 +0800 Subject: [PATCH 180/297] Bump lint-staged from 13.2.3 to 14.0.0 (#2106) Bumps [lint-staged](https://github.com/okonet/lint-staged) from 13.2.3 to 14.0.0. - [Release notes](https://github.com/okonet/lint-staged/releases) - [Commits](https://github.com/okonet/lint-staged/compare/v13.2.3...v14.0.0) --- updated-dependencies: - dependency-name: lint-staged dependency-type: direct:development update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 751 +++++++++++++++++++--------------------------- package.json | 2 +- 2 files changed, 314 insertions(+), 439 deletions(-) diff --git a/package-lock.json b/package-lock.json index 6422cd106..d0e7b693c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -73,7 +73,7 @@ "eslint": "^8.35.0", "find-process": "^1.4.4", "husky": "^8.0.1", - "lint-staged": "^13.0.0", + "lint-staged": "^14.0.0", "mocha": "^5.2.0", "pkg": "^5.3.0", "prettier": "^3.0.0", @@ -2050,19 +2050,6 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, - "node_modules/aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "dev": true, - "dependencies": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", @@ -2080,15 +2067,15 @@ } }, "node_modules/ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-5.0.0.tgz", + "integrity": "sha512-5GFMVX8HqE/TB+FuBJGuO5XG0WrsA6ptUqoODaT/n9mmUaZFkqnBueB4leqGBCmrUHnCnC4PCZTCd0E7QQ83bA==", "dev": true, "dependencies": { - "type-fest": "^0.21.3" + "type-fest": "^1.0.2" }, "engines": { - "node": ">=8" + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -2194,15 +2181,6 @@ "node": ">=0.8" } }, - "node_modules/astral-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/async": { "version": "3.2.3", "resolved": "https://registry.npmjs.org/async/-/async-3.2.3.tgz", @@ -3575,25 +3553,19 @@ "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", "dev": true }, - "node_modules/clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "dev": true, - "engines": { - "node": ">=6" - } - }, "node_modules/cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-4.0.0.tgz", + "integrity": "sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==", "dev": true, "dependencies": { - "restore-cursor": "^3.1.0" + "restore-cursor": "^4.0.0" }, "engines": { - "node": ">=8" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/cli-truncate": { @@ -3648,9 +3620,9 @@ } }, "node_modules/cli-truncate/node_modules/strip-ansi": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", - "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", "dev": true, "dependencies": { "ansi-regex": "^6.0.1" @@ -3694,9 +3666,9 @@ } }, "node_modules/colorette": { - "version": "2.0.19", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz", - "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==", + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", "dev": true }, "node_modules/colorspace": { @@ -3720,12 +3692,12 @@ } }, "node_modules/commander": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.0.tgz", - "integrity": "sha512-zS5PnTI22FIRM6ylNW8G4Ap0IEOyk62fhLSD0+uHRT9McRCLGpkVNvao4bjimpK/GShynyQkFFxHhwMcETmduA==", + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-11.0.0.tgz", + "integrity": "sha512-9HMlXtt/BNoYr8ooyjjNRdIilOTkVJXB+GhxMTtOKwk0R4j4lS4NpjuqmRxroBfnfTSHQIHQB7wryHhXarNjmQ==", "dev": true, "engines": { - "node": ">=14" + "node": ">=16" } }, "node_modules/concat-map": { @@ -4814,6 +4786,12 @@ "node": ">=6" } }, + "node_modules/eventemitter3": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", + "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", + "dev": true + }, "node_modules/events": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", @@ -4823,9 +4801,9 @@ } }, "node_modules/execa": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-7.1.1.tgz", - "integrity": "sha512-wH0eMf/UXckdUYnO21+HDztteVv05rq2GXksxT4fCGeHkBhw1DROXh40wcjMcRqDOWE7iPJ4n3M7e2+YFP+76Q==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-7.2.0.tgz", + "integrity": "sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==", "dev": true, "dependencies": { "cross-spawn": "^7.0.3", @@ -6138,15 +6116,6 @@ "node": ">=0.8.19" } }, - "node_modules/indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/inflection": { "version": "1.13.4", "resolved": "https://registry.npmjs.org/inflection/-/inflection-1.13.4.tgz", @@ -6754,30 +6723,27 @@ } }, "node_modules/lint-staged": { - "version": "13.2.3", - "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-13.2.3.tgz", - "integrity": "sha512-zVVEXLuQIhr1Y7R7YAWx4TZLdvuzk7DnmrsTNL0fax6Z3jrpFcas+vKbzxhhvp6TA55m1SQuWkpzI1qbfDZbAg==", + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-14.0.0.tgz", + "integrity": "sha512-0tLf0pqZYkar/wu3nTctk4rVIG+d7PanDYv4/IQR4qwdqfQkTDziLRFnqMcLuLBTuUqmcLwsHPD2EjQ18d/oaA==", "dev": true, "dependencies": { - "chalk": "5.2.0", - "cli-truncate": "^3.1.0", - "commander": "^10.0.0", - "debug": "^4.3.4", - "execa": "^7.0.0", + "chalk": "5.3.0", + "commander": "11.0.0", + "debug": "4.3.4", + "execa": "7.2.0", "lilconfig": "2.1.0", - "listr2": "^5.0.7", - "micromatch": "^4.0.5", - "normalize-path": "^3.0.0", - "object-inspect": "^1.12.3", - "pidtree": "^0.6.0", - "string-argv": "^0.3.1", - "yaml": "^2.2.2" + "listr2": "6.6.1", + "micromatch": "4.0.5", + "pidtree": "0.6.0", + "string-argv": "0.3.2", + "yaml": "2.3.1" }, "bin": { "lint-staged": "bin/lint-staged.js" }, "engines": { - "node": "^14.13.1 || >=16.0.0" + "node": "^16.14.0 || >=18.0.0" }, "funding": { "url": "https://opencollective.com/lint-staged" @@ -6796,9 +6762,9 @@ } }, "node_modules/lint-staged/node_modules/chalk": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.2.0.tgz", - "integrity": "sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", "dev": true, "engines": { "node": "^12.17.0 || ^14.13 || >=16.0.0" @@ -6877,22 +6843,20 @@ } }, "node_modules/listr2": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/listr2/-/listr2-5.0.8.tgz", - "integrity": "sha512-mC73LitKHj9w6v30nLNGPetZIlfpUniNSsxxrbaPcWOjDb92SHPzJPi/t+v1YC/lxKz/AJ9egOjww0qUuFxBpA==", + "version": "6.6.1", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-6.6.1.tgz", + "integrity": "sha512-+rAXGHh0fkEWdXBmX+L6mmfmXmXvDGEKzkjxO+8mP3+nI/r/CWznVBvsibXdxda9Zz0OW2e2ikphN3OwCT/jSg==", "dev": true, "dependencies": { - "cli-truncate": "^2.1.0", - "colorette": "^2.0.19", - "log-update": "^4.0.0", - "p-map": "^4.0.0", + "cli-truncate": "^3.1.0", + "colorette": "^2.0.20", + "eventemitter3": "^5.0.1", + "log-update": "^5.0.1", "rfdc": "^1.3.0", - "rxjs": "^7.8.0", - "through": "^2.3.8", - "wrap-ansi": "^7.0.0" + "wrap-ansi": "^8.1.0" }, "engines": { - "node": "^14.13.1 || >=16.0.0" + "node": ">=16.0.0" }, "peerDependencies": { "enquirer": ">= 2.3.0 < 3" @@ -6903,67 +6867,83 @@ } } }, - "node_modules/listr2/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/listr2/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", "dev": true, - "dependencies": { - "color-convert": "^2.0.1" + "engines": { + "node": ">=12" }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/listr2/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, "engines": { - "node": ">=8" + "node": ">=12" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/listr2/node_modules/cli-truncate": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", - "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", + "node_modules/listr2/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true + }, + "node_modules/listr2/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", "dev": true, "dependencies": { - "slice-ansi": "^3.0.0", - "string-width": "^4.2.0" + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" }, "engines": { - "node": ">=8" + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/listr2/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "node_modules/listr2/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", "dev": true, "dependencies": { - "color-name": "~1.1.4" + "ansi-regex": "^6.0.1" }, "engines": { - "node": ">=7.0.0" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "node_modules/listr2/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/listr2/node_modules/slice-ansi": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", - "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", + "node_modules/listr2/node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", "dev": true, "dependencies": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" }, "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, "node_modules/locate-path": { @@ -7028,106 +7008,101 @@ "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==" }, "node_modules/log-update": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz", - "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-5.0.1.tgz", + "integrity": "sha512-5UtUDQ/6edw4ofyljDNcOVJQ4c7OjDro4h3y8e1GQL5iYElYclVHJ3zeWchylvMaKnDbDilC8irOVyexnA/Slw==", "dev": true, "dependencies": { - "ansi-escapes": "^4.3.0", - "cli-cursor": "^3.1.0", - "slice-ansi": "^4.0.0", - "wrap-ansi": "^6.2.0" + "ansi-escapes": "^5.0.0", + "cli-cursor": "^4.0.0", + "slice-ansi": "^5.0.0", + "strip-ansi": "^7.0.1", + "wrap-ansi": "^8.0.1" }, "engines": { - "node": ">=10" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/log-update/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", "dev": true, "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, "node_modules/log-update/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, "engines": { - "node": ">=8" + "node": ">=12" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/log-update/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/log-update/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "node_modules/log-update/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", "dev": true }, - "node_modules/log-update/node_modules/slice-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", - "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "node_modules/log-update/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", "dev": true, "dependencies": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" }, "engines": { - "node": ">=10" + "node": ">=12" }, "funding": { - "url": "https://github.com/chalk/slice-ansi?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/log-update/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", "dev": true, "dependencies": { - "ansi-regex": "^5.0.1" + "ansi-regex": "^6.0.1" }, "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, "node_modules/log-update/node_modules/wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", "dev": true, "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" }, "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, "node_modules/logform": { @@ -7621,15 +7596,6 @@ } } }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/npm-run-path": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz", @@ -7839,21 +7805,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/p-map": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", - "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", - "dev": true, - "dependencies": { - "aggregate-error": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -8736,16 +8687,19 @@ } }, "node_modules/restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-4.0.0.tgz", + "integrity": "sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==", "dev": true, "dependencies": { "onetime": "^5.1.0", "signal-exit": "^3.0.2" }, "engines": { - "node": ">=8" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/restore-cursor/node_modules/mimic-fn": { @@ -8830,15 +8784,6 @@ "queue-microtask": "^1.2.2" } }, - "node_modules/rxjs": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.0.tgz", - "integrity": "sha512-F2+gxDshqmIub1KdvZkaEfGDwLNpPvk9Fs6LD/MyQxNgMds/WH9OdDDXOmxUZpME+iSK3rQCctkL0DYyytUqMg==", - "dev": true, - "dependencies": { - "tslib": "^2.1.0" - } - }, "node_modules/safe-array-concat": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.0.tgz", @@ -9228,9 +9173,9 @@ } }, "node_modules/slice-ansi/node_modules/ansi-styles": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.1.0.tgz", - "integrity": "sha512-VbqNsoz55SYGczauuup0MFUyXNQviSpFTj1RQtFzmQLk18qbVSpTFFGMT293rmDaQuKCT6InmbuEyUne4mTuxQ==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", "dev": true, "engines": { "node": ">=12" @@ -9345,9 +9290,9 @@ } }, "node_modules/string-argv": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.1.tgz", - "integrity": "sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg==", + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz", + "integrity": "sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==", "dev": true, "engines": { "node": ">=0.6.19" @@ -9594,12 +9539,6 @@ "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", "dev": true }, - "node_modules/through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", - "dev": true - }, "node_modules/tmp": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", @@ -9799,9 +9738,9 @@ } }, "node_modules/type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", + "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", "dev": true, "engines": { "node": ">=10" @@ -10344,9 +10283,9 @@ "dev": true }, "node_modules/yaml": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.2.2.tgz", - "integrity": "sha512-CBKFWExMn46Foo4cldiChEzn7S7SRV+wqiluAb6xmueD/fGyRHIhX8m14vVGgeFWjN540nKCNVj6P21eQjgTuA==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.1.tgz", + "integrity": "sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ==", "dev": true, "engines": { "node": ">= 14" @@ -11915,16 +11854,6 @@ } } }, - "aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "dev": true, - "requires": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - } - }, "ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", @@ -11938,12 +11867,12 @@ } }, "ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-5.0.0.tgz", + "integrity": "sha512-5GFMVX8HqE/TB+FuBJGuO5XG0WrsA6ptUqoODaT/n9mmUaZFkqnBueB4leqGBCmrUHnCnC4PCZTCd0E7QQ83bA==", "dev": true, "requires": { - "type-fest": "^0.21.3" + "type-fest": "^1.0.2" } }, "ansi-regex": { @@ -12025,12 +11954,6 @@ "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", "dev": true }, - "astral-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", - "dev": true - }, "async": { "version": "3.2.3", "resolved": "https://registry.npmjs.org/async/-/async-3.2.3.tgz", @@ -13278,19 +13201,13 @@ "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", "dev": true }, - "clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "dev": true - }, "cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-4.0.0.tgz", + "integrity": "sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==", "dev": true, "requires": { - "restore-cursor": "^3.1.0" + "restore-cursor": "^4.0.0" } }, "cli-truncate": { @@ -13327,9 +13244,9 @@ } }, "strip-ansi": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", - "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", "dev": true, "requires": { "ansi-regex": "^6.0.1" @@ -13369,9 +13286,9 @@ } }, "colorette": { - "version": "2.0.19", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz", - "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==", + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", "dev": true }, "colorspace": { @@ -13392,9 +13309,9 @@ } }, "commander": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.0.tgz", - "integrity": "sha512-zS5PnTI22FIRM6ylNW8G4Ap0IEOyk62fhLSD0+uHRT9McRCLGpkVNvao4bjimpK/GShynyQkFFxHhwMcETmduA==", + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-11.0.0.tgz", + "integrity": "sha512-9HMlXtt/BNoYr8ooyjjNRdIilOTkVJXB+GhxMTtOKwk0R4j4lS4NpjuqmRxroBfnfTSHQIHQB7wryHhXarNjmQ==", "dev": true }, "concat-map": { @@ -14181,15 +14098,21 @@ "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==" }, + "eventemitter3": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", + "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", + "dev": true + }, "events": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==" }, "execa": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-7.1.1.tgz", - "integrity": "sha512-wH0eMf/UXckdUYnO21+HDztteVv05rq2GXksxT4fCGeHkBhw1DROXh40wcjMcRqDOWE7iPJ4n3M7e2+YFP+76Q==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-7.2.0.tgz", + "integrity": "sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==", "dev": true, "requires": { "cross-spawn": "^7.0.3", @@ -15140,12 +15063,6 @@ "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "dev": true }, - "indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "dev": true - }, "inflection": { "version": "1.13.4", "resolved": "https://registry.npmjs.org/inflection/-/inflection-1.13.4.tgz", @@ -15605,24 +15522,21 @@ } }, "lint-staged": { - "version": "13.2.3", - "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-13.2.3.tgz", - "integrity": "sha512-zVVEXLuQIhr1Y7R7YAWx4TZLdvuzk7DnmrsTNL0fax6Z3jrpFcas+vKbzxhhvp6TA55m1SQuWkpzI1qbfDZbAg==", + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-14.0.0.tgz", + "integrity": "sha512-0tLf0pqZYkar/wu3nTctk4rVIG+d7PanDYv4/IQR4qwdqfQkTDziLRFnqMcLuLBTuUqmcLwsHPD2EjQ18d/oaA==", "dev": true, "requires": { - "chalk": "5.2.0", - "cli-truncate": "^3.1.0", - "commander": "^10.0.0", - "debug": "^4.3.4", - "execa": "^7.0.0", + "chalk": "5.3.0", + "commander": "11.0.0", + "debug": "4.3.4", + "execa": "7.2.0", "lilconfig": "2.1.0", - "listr2": "^5.0.7", - "micromatch": "^4.0.5", - "normalize-path": "^3.0.0", - "object-inspect": "^1.12.3", - "pidtree": "^0.6.0", - "string-argv": "^0.3.1", - "yaml": "^2.2.2" + "listr2": "6.6.1", + "micromatch": "4.0.5", + "pidtree": "0.6.0", + "string-argv": "0.3.2", + "yaml": "2.3.1" }, "dependencies": { "braces": { @@ -15635,9 +15549,9 @@ } }, "chalk": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.2.0.tgz", - "integrity": "sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", "dev": true }, "debug": { @@ -15692,64 +15606,66 @@ } }, "listr2": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/listr2/-/listr2-5.0.8.tgz", - "integrity": "sha512-mC73LitKHj9w6v30nLNGPetZIlfpUniNSsxxrbaPcWOjDb92SHPzJPi/t+v1YC/lxKz/AJ9egOjww0qUuFxBpA==", + "version": "6.6.1", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-6.6.1.tgz", + "integrity": "sha512-+rAXGHh0fkEWdXBmX+L6mmfmXmXvDGEKzkjxO+8mP3+nI/r/CWznVBvsibXdxda9Zz0OW2e2ikphN3OwCT/jSg==", "dev": true, "requires": { - "cli-truncate": "^2.1.0", - "colorette": "^2.0.19", - "log-update": "^4.0.0", - "p-map": "^4.0.0", + "cli-truncate": "^3.1.0", + "colorette": "^2.0.20", + "eventemitter3": "^5.0.1", + "log-update": "^5.0.1", "rfdc": "^1.3.0", - "rxjs": "^7.8.0", - "through": "^2.3.8", - "wrap-ansi": "^7.0.0" + "wrap-ansi": "^8.1.0" }, "dependencies": { + "ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true + }, "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true }, - "cli-truncate": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", - "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", + "emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true + }, + "string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", "dev": true, "requires": { - "slice-ansi": "^3.0.0", - "string-width": "^4.2.0" + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" } }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", "dev": true, "requires": { - "color-name": "~1.1.4" + "ansi-regex": "^6.0.1" } }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "slice-ansi": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", - "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", + "wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", "dev": true, "requires": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" } } } @@ -15810,76 +15726,65 @@ "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==" }, "log-update": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz", - "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-5.0.1.tgz", + "integrity": "sha512-5UtUDQ/6edw4ofyljDNcOVJQ4c7OjDro4h3y8e1GQL5iYElYclVHJ3zeWchylvMaKnDbDilC8irOVyexnA/Slw==", "dev": true, "requires": { - "ansi-escapes": "^4.3.0", - "cli-cursor": "^3.1.0", - "slice-ansi": "^4.0.0", - "wrap-ansi": "^6.2.0" + "ansi-escapes": "^5.0.0", + "cli-cursor": "^4.0.0", + "slice-ansi": "^5.0.0", + "strip-ansi": "^7.0.1", + "wrap-ansi": "^8.0.1" }, "dependencies": { "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", "dev": true }, "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", "dev": true }, - "slice-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", - "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", "dev": true, "requires": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" } }, "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", "dev": true, "requires": { - "ansi-regex": "^5.0.1" + "ansi-regex": "^6.0.1" } }, "wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", "dev": true, "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" } } } @@ -16281,12 +16186,6 @@ "whatwg-url": "^5.0.0" } }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true - }, "npm-run-path": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz", @@ -16430,15 +16329,6 @@ "p-limit": "^3.0.2" } }, - "p-map": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", - "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", - "dev": true, - "requires": { - "aggregate-error": "^3.0.0" - } - }, "parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -17094,9 +16984,9 @@ "dev": true }, "restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-4.0.0.tgz", + "integrity": "sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==", "dev": true, "requires": { "onetime": "^5.1.0", @@ -17154,15 +17044,6 @@ "queue-microtask": "^1.2.2" } }, - "rxjs": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.0.tgz", - "integrity": "sha512-F2+gxDshqmIub1KdvZkaEfGDwLNpPvk9Fs6LD/MyQxNgMds/WH9OdDDXOmxUZpME+iSK3rQCctkL0DYyytUqMg==", - "dev": true, - "requires": { - "tslib": "^2.1.0" - } - }, "safe-array-concat": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.0.tgz", @@ -17431,9 +17312,9 @@ }, "dependencies": { "ansi-styles": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.1.0.tgz", - "integrity": "sha512-VbqNsoz55SYGczauuup0MFUyXNQviSpFTj1RQtFzmQLk18qbVSpTFFGMT293rmDaQuKCT6InmbuEyUne4mTuxQ==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", "dev": true }, "is-fullwidth-code-point": { @@ -17514,9 +17395,9 @@ } }, "string-argv": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.1.tgz", - "integrity": "sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg==", + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz", + "integrity": "sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==", "dev": true }, "string-width": { @@ -17712,12 +17593,6 @@ "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", "dev": true }, - "through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", - "dev": true - }, "tmp": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", @@ -17863,9 +17738,9 @@ } }, "type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", + "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", "dev": true }, "type-is": { @@ -18281,9 +18156,9 @@ "dev": true }, "yaml": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.2.2.tgz", - "integrity": "sha512-CBKFWExMn46Foo4cldiChEzn7S7SRV+wqiluAb6xmueD/fGyRHIhX8m14vVGgeFWjN540nKCNVj6P21eQjgTuA==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.1.tgz", + "integrity": "sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ==", "dev": true }, "yauzl": { diff --git a/package.json b/package.json index 1b5ee0392..79ff2591c 100644 --- a/package.json +++ b/package.json @@ -78,7 +78,7 @@ "eslint": "^8.35.0", "find-process": "^1.4.4", "husky": "^8.0.1", - "lint-staged": "^13.0.0", + "lint-staged": "^14.0.0", "mocha": "^5.2.0", "pkg": "^5.3.0", "prettier": "^3.0.0", From 92fb8a253230f09ca7aaf594da6798901c888676 Mon Sep 17 00:00:00 2001 From: EmmaZhu-MSFT Date: Wed, 16 Aug 2023 15:24:58 +0800 Subject: [PATCH 181/297] Bump service version to 2023-08-03 (#2111) --- ChangeLog.md | 3 +++ README.md | 14 +++++++------- package-lock.json | 6 +++--- package.json | 2 +- src/blob/utils/constants.ts | 5 +++-- src/queue/utils/constants.ts | 5 +++-- src/table/utils/constants.ts | 5 +++-- 7 files changed, 23 insertions(+), 17 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index dae879f5d..ff144413b 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -4,9 +4,12 @@ ## Upcoming Release +## 2023.08 Version 3.26.0 + General: - Updated examples of setting Customized Storage Accounts & Keys in enviroment varialbe. +- Bump up service API version to 2023-08-03 Blob: diff --git a/README.md b/README.md index 379e1a35b..40b3561cd 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,7 @@ | Version | Azure Storage API Version | Service Support | Description | Reference Links | | ------------------------------------------------------------------ | ------------------------- | ------------------------------ | ------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| 3.25.1 | 2023-01-03 | Blob, Queue and Table(preview) | Azurite V3 based on TypeScript & New Architecture | [NPM](https://www.npmjs.com/package/azurite) - [Docker](https://hub.docker.com/_/microsoft-azure-storage-azurite) - [Visual Studio Code Extension](https://marketplace.visualstudio.com/items?itemName=Azurite.azurite) | +| 3.26.0 | 2023-08-03 | Blob, Queue and Table(preview) | Azurite V3 based on TypeScript & New Architecture | [NPM](https://www.npmjs.com/package/azurite) - [Docker](https://hub.docker.com/_/microsoft-azure-storage-azurite) - [Visual Studio Code Extension](https://marketplace.visualstudio.com/items?itemName=Azurite.azurite) | | [Legacy (v2)](https://github.com/Azure/Azurite/tree/legacy-master) | 2016-05-31 | Blob, Queue and Table | Legacy Azurite V2 | [NPM](https://www.npmjs.com/package/azurite) | - [Azurite V3](#azurite-v3) @@ -76,19 +76,19 @@ Compared to V2, Azurite V3 implements a new architecture leveraging code generat ## Features & Key Changes in Azurite V3 -- Blob storage features align with Azure Storage API version 2023-01-03 (Refer to support matrix section below) +- Blob storage features align with Azure Storage API version 2023-08-03 (Refer to support matrix section below) - SharedKey/Account SAS/Service SAS/Public Access Authentications/OAuth - Get/Set Blob Service Properties - Create/List/Delete Containers - Create/Read/List/Update/Delete Block Blobs - Create/Read/List/Update/Delete Page Blobs -- Queue storage features align with Azure Storage API version 2023-01-03 (Refer to support matrix section below) +- Queue storage features align with Azure Storage API version 2023-08-03 (Refer to support matrix section below) - SharedKey/Account SAS/Service SAS/OAuth - Get/Set Queue Service Properties - Preflight Request - Create/List/Delete Queues - Put/Get/Peek/Updata/Deleta/Clear Messages -- Table storage features align with Azure Storage API version 2023-01-03 (Refer to support matrix section below) +- Table storage features align with Azure Storage API version 2023-08-03 (Refer to support matrix section below) - SharedKey/Account SAS/Service SAS/OAuth - Create/List/Delete Tables - Insert/Update/Query/Delete Table Entities @@ -920,7 +920,7 @@ All the generated code is kept in `generated` folder, including the generated mi ## Support Matrix -Latest release targets **2023-01-03** API version **blob** service. +Latest release targets **2023-08-03** API version **blob** service. Detailed support matrix: @@ -979,7 +979,7 @@ Detailed support matrix: - Get Page Ranges Continuation Token - Cold Tier -Latest version supports for **2023-01-03** API version **queue** service. +Latest version supports for **2023-08-03** API version **queue** service. Detailed support matrix: - Supported Vertical Features @@ -1008,7 +1008,7 @@ Detailed support matrix: - Following features or REST APIs are NOT supported or limited supported in this release (will support more features per customers feedback in future releases) - SharedKey Lite -Latest version supports for **2023-01-03** API version **table** service (preview). +Latest version supports for **2023-08-03** API version **table** service (preview). Detailed support matrix: - Supported Vertical Features diff --git a/package-lock.json b/package-lock.json index d0e7b693c..f0d937edf 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "azurite", - "version": "3.25.1", + "version": "3.26.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "azurite", - "version": "3.25.1", + "version": "3.26.0", "license": "MIT", "dependencies": { "@azure/ms-rest-js": "^1.5.0", @@ -18193,4 +18193,4 @@ "dev": true } } -} +} \ No newline at end of file diff --git a/package.json b/package.json index 79ff2591c..1f6a520d9 100644 --- a/package.json +++ b/package.json @@ -3,7 +3,7 @@ "displayName": "Azurite", "description": "An open source Azure Storage API compatible server", "icon": "icon.png", - "version": "3.25.1", + "version": "3.26.0", "publisher": "Azurite", "categories": [ "Other" diff --git a/src/blob/utils/constants.ts b/src/blob/utils/constants.ts index 6c4f41ee9..41d425733 100644 --- a/src/blob/utils/constants.ts +++ b/src/blob/utils/constants.ts @@ -1,8 +1,8 @@ import { StoreDestinationArray } from "../../common/persistence/IExtentStore"; import * as Models from "../generated/artifacts/models"; -export const VERSION = "3.25.1"; -export const BLOB_API_VERSION = "2023-01-03"; +export const VERSION = "3.26.0"; +export const BLOB_API_VERSION = "2023-08-03"; export const DEFAULT_BLOB_SERVER_HOST_NAME = "127.0.0.1"; // Change to 0.0.0.0 when needs external access export const DEFAULT_LIST_BLOBS_MAX_RESULTS = 5000; export const DEFAULT_LIST_CONTAINERS_MAX_RESULTS = 5000; @@ -96,6 +96,7 @@ export const DEFAULT_BLOB_PERSISTENCE_ARRAY: StoreDestinationArray = [ ]; export const ValidAPIVersions = [ + "2023-08-03", "2023-01-03", "2022-11-02", "2021-12-02", diff --git a/src/queue/utils/constants.ts b/src/queue/utils/constants.ts index 02cd3f377..20cbf507c 100644 --- a/src/queue/utils/constants.ts +++ b/src/queue/utils/constants.ts @@ -1,7 +1,7 @@ import { StoreDestinationArray } from "../../common/persistence/IExtentStore"; -export const VERSION = "3.25.1"; -export const QUEUE_API_VERSION = "2023-01-03"; +export const VERSION = "3.26.0"; +export const QUEUE_API_VERSION = "2023-08-03"; export const DEFAULT_QUEUE_SERVER_HOST_NAME = "127.0.0.1"; // Change to 0.0.0.0 when needs external access export const DEFAULT_QUEUE_LISTENING_PORT = 10001; export const IS_PRODUCTION = process.env.NODE_ENV === "production"; @@ -90,6 +90,7 @@ export const DEFAULT_QUEUE_PERSISTENCE_ARRAY: StoreDestinationArray = [ ]; export const ValidAPIVersions = [ + "2023-08-03", "2023-01-03", "2022-11-02", "2021-12-02", diff --git a/src/table/utils/constants.ts b/src/table/utils/constants.ts index 8e9d16d64..2472f51c9 100644 --- a/src/table/utils/constants.ts +++ b/src/table/utils/constants.ts @@ -17,8 +17,8 @@ export enum TABLE_STATUSCODE { } export const DEFAULT_TABLE_CONTEXT_PATH = "azurite_table_context"; -export const TABLE_API_VERSION = "2023-01-03"; -export const VERSION = "3.25.1"; +export const TABLE_API_VERSION = "2023-08-03"; +export const VERSION = "3.26.0"; // Max Body size is 4 MB export const BODY_SIZE_MAX = 1024 * 1024 * 4; // Max Entity sizxe is 1 MB @@ -73,6 +73,7 @@ export const DEFAULT_TABLE_PERSISTENCE_ARRAY: StoreDestinationArray = [ export const QUERY_RESULT_MAX_NUM = 1000; export const ValidAPIVersions = [ + "2023-08-03", "2023-01-03", "2022-11-02", "2021-12-02", From 1924903baa9e78ee7726cdcb1c8fdead3d14e1f6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 17 Aug 2023 10:02:19 +0800 Subject: [PATCH 182/297] Bump azure-storage from 2.10.6 to 2.10.7 (#2117) Bumps [azure-storage](https://github.com/Azure/azure-storage-node) from 2.10.6 to 2.10.7. - [Release notes](https://github.com/Azure/azure-storage-node/releases) - [Changelog](https://github.com/Azure/azure-storage-node/blob/master/ChangeLog.md) - [Commits](https://github.com/Azure/azure-storage-node/commits) --- updated-dependencies: - dependency-name: azure-storage dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 94 +++++++++++------------------------------------ 1 file changed, 21 insertions(+), 73 deletions(-) diff --git a/package-lock.json b/package-lock.json index f0d937edf..1a83f6f9f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2272,61 +2272,35 @@ } }, "node_modules/azure-storage": { - "version": "2.10.6", - "resolved": "https://registry.npmjs.org/azure-storage/-/azure-storage-2.10.6.tgz", - "integrity": "sha512-14e7wUMXlvQuvDeCqJda5TnPfQ//6+5HgxvZpMy8qfY8jQz0W/0EiN/qvm9wYKjLV+nrfOFrsJdtE4EPRC6u1A==", + "version": "2.10.7", + "resolved": "https://registry.npmjs.org/azure-storage/-/azure-storage-2.10.7.tgz", + "integrity": "sha512-4oeFGtn3Ziw/fGs/zkoIpKKtygnCVIcZwzJ7UQzKTxhkGQqVCByOFbYqMGYR3L+wOsunX9lNfD0jc51SQuKSSA==", "deprecated": "Please note: newer packages @azure/storage-blob, @azure/storage-queue and @azure/storage-file are available as of November 2019 and @azure/data-tables is available as of June 2021. While the legacy azure-storage package will continue to receive critical bug fixes, we strongly encourage you to upgrade. Migration guide can be found: https://github.com/Azure/azure-sdk-for-js/blob/main/sdk/storage/MigrationGuide.md", "dev": true, "dependencies": { - "browserify-mime": "~1.2.9", + "browserify-mime": "^1.2.9", "extend": "^3.0.2", - "json-edm-parser": "0.1.2", - "json-schema": "^0.4.0", - "md5.js": "1.3.4", - "readable-stream": "~2.0.0", + "json-edm-parser": "~0.1.2", + "json-schema": "~0.4.0", + "md5.js": "^1.3.4", + "readable-stream": "^2.0.0", "request": "^2.86.0", "underscore": "^1.12.1", "uuid": "^3.0.0", - "validator": "~13.7.0", - "xml2js": "0.2.8", + "validator": "^13.7.0", + "xml2js": "~0.2.8", "xmlbuilder": "^9.0.7" }, "engines": { "node": ">= 0.8.26" } }, - "node_modules/azure-storage/node_modules/process-nextick-args": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", - "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", - "dev": true - }, - "node_modules/azure-storage/node_modules/readable-stream": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.6.tgz", - "integrity": "sha1-j5A0HmilPMySh4jaz80Rs265t44=", - "dev": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "~1.0.0", - "process-nextick-args": "~1.0.6", - "string_decoder": "~0.10.x", - "util-deprecate": "~1.0.1" - } - }, "node_modules/azure-storage/node_modules/sax": { "version": "0.5.8", "resolved": "https://registry.npmjs.org/sax/-/sax-0.5.8.tgz", "integrity": "sha1-1HLbIo6zMcJQaw6MFVJK25OdEsE=", "dev": true }, - "node_modules/azure-storage/node_modules/string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true - }, "node_modules/azure-storage/node_modules/xml2js": { "version": "0.2.8", "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.2.8.tgz", @@ -12025,57 +11999,31 @@ } }, "azure-storage": { - "version": "2.10.6", - "resolved": "https://registry.npmjs.org/azure-storage/-/azure-storage-2.10.6.tgz", - "integrity": "sha512-14e7wUMXlvQuvDeCqJda5TnPfQ//6+5HgxvZpMy8qfY8jQz0W/0EiN/qvm9wYKjLV+nrfOFrsJdtE4EPRC6u1A==", + "version": "2.10.7", + "resolved": "https://registry.npmjs.org/azure-storage/-/azure-storage-2.10.7.tgz", + "integrity": "sha512-4oeFGtn3Ziw/fGs/zkoIpKKtygnCVIcZwzJ7UQzKTxhkGQqVCByOFbYqMGYR3L+wOsunX9lNfD0jc51SQuKSSA==", "dev": true, "requires": { - "browserify-mime": "~1.2.9", + "browserify-mime": "^1.2.9", "extend": "^3.0.2", - "json-edm-parser": "0.1.2", - "json-schema": "^0.4.0", - "md5.js": "1.3.4", - "readable-stream": "~2.0.0", + "json-edm-parser": "~0.1.2", + "json-schema": "~0.4.0", + "md5.js": "^1.3.4", + "readable-stream": "^2.0.0", "request": "^2.86.0", "underscore": "^1.12.1", "uuid": "^3.0.0", - "validator": "~13.7.0", - "xml2js": "0.2.8", + "validator": "^13.7.0", + "xml2js": "~0.2.8", "xmlbuilder": "^9.0.7" }, "dependencies": { - "process-nextick-args": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", - "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", - "dev": true - }, - "readable-stream": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.6.tgz", - "integrity": "sha1-j5A0HmilPMySh4jaz80Rs265t44=", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "~1.0.0", - "process-nextick-args": "~1.0.6", - "string_decoder": "~0.10.x", - "util-deprecate": "~1.0.1" - } - }, "sax": { "version": "0.5.8", "resolved": "https://registry.npmjs.org/sax/-/sax-0.5.8.tgz", "integrity": "sha1-1HLbIo6zMcJQaw6MFVJK25OdEsE=", "dev": true }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true - }, "xml2js": { "version": "0.2.8", "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.2.8.tgz", @@ -18193,4 +18141,4 @@ "dev": true } } -} \ No newline at end of file +} From 005a3d143ea5c7728a1e4da99809b9627b4303b9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 21 Aug 2023 10:09:20 +0800 Subject: [PATCH 183/297] Bump tslib from 2.6.1 to 2.6.2 (#2123) Bumps [tslib](https://github.com/Microsoft/tslib) from 2.6.1 to 2.6.2. - [Release notes](https://github.com/Microsoft/tslib/releases) - [Commits](https://github.com/Microsoft/tslib/compare/v2.6.1...v2.6.2) --- updated-dependencies: - dependency-name: tslib dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 1a83f6f9f..36462a2e3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9648,9 +9648,9 @@ } }, "node_modules/tslib": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", - "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==" + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" }, "node_modules/tsutils": { "version": "3.21.0", @@ -17635,9 +17635,9 @@ } }, "tslib": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", - "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==" + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" }, "tsutils": { "version": "3.21.0", From fb3e85a2c0daaf8a3837bf3f2218a36444232b10 Mon Sep 17 00:00:00 2001 From: PrasantJillella <127192946+PrasantJillella@users.noreply.github.com> Date: Sun, 20 Aug 2023 19:11:48 -0700 Subject: [PATCH 184/297] "Update UpdateEntity and DeleteEntity to throw InvalidInput error for Malformed Etag" (#2062) * "Update, Delete and Merge entities throw InvalidInput error for Malformed Etag" * Address comments * Address comments * Minor correction * Fix build failure * Moving new tests to bottom of file * "Update, Delete and Merge entities throw InvalidInput error for Malformed Etag" * Address comments * Address comments * Minor correction * Fix build failure * Moving new tests to bottom of file * "Update, Delete and Merge entities throw InvalidInput error for Malformed Etag" * Address comments * Address comments * Minor correction * Fix build failure * Moving new tests to bottom of file * Update changeLog with fix information * Update version to 3.25.0 (#2063) * Bump tedious from 16.2.0 to 16.4.0 (#2080) Bumps [tedious](https://github.com/tediousjs/tedious) from 16.2.0 to 16.4.0. - [Release notes](https://github.com/tediousjs/tedious/releases) - [Commits](https://github.com/tediousjs/tedious/compare/v16.2.0...v16.4.0) --- updated-dependencies: - dependency-name: tedious dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump eslint from 8.45.0 to 8.46.0 (#2081) Bumps [eslint](https://github.com/eslint/eslint) from 8.45.0 to 8.46.0. - [Release notes](https://github.com/eslint/eslint/releases) - [Changelog](https://github.com/eslint/eslint/blob/main/CHANGELOG.md) - [Commits](https://github.com/eslint/eslint/compare/v8.45.0...v8.46.0) --- updated-dependencies: - dependency-name: eslint dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump xml2js from 0.6.0 to 0.6.2 (#2075) Bumps [xml2js](https://github.com/Leonidas-from-XIV/node-xml2js) from 0.6.0 to 0.6.2. - [Commits](https://github.com/Leonidas-from-XIV/node-xml2js/compare/0.6.0...0.6.2) --- updated-dependencies: - dependency-name: xml2js dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Add requestId to appendBlock (#2074) Add missing requestId to the appendBlock operation of an append blob. Fixes #631. * Bump tslib from 2.6.0 to 2.6.1 (#2071) Bumps [tslib](https://github.com/Microsoft/tslib) from 2.6.0 to 2.6.1. - [Release notes](https://github.com/Microsoft/tslib/releases) - [Commits](https://github.com/Microsoft/tslib/compare/2.6.0...v2.6.1) --- updated-dependencies: - dependency-name: tslib dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * fix: Resolve issues with datetime comparisons in scenarios where microsecond precision is provided in the underlying value. (#2077) * fix: Resolve issues with datetime comparisons in scenarios where microsecond precision is provided in the underlying value. Fixes Filtering by Dates with Table Service no longer working in 3.25.0 #2069 * doc: Update changelog * fix: Ensure that we only match exact GUIDs for the legacy comparison model * fix : Resolve issues with empty partition key query not returning anything (#2079) * Adding all of the code to correctly remove any entities with non populated fields when doing a query on said field. This includes the tests, as well as a reproduction for the current issue * The current check for partition key was using !! which for an empty string in JS resolve to false, causing the query context to think this was a table instead of an entity. Instead check for the existence of the field * Adding to the changelog * Addressing PR comment and removing unecessary !! symbols --------- Co-authored-by: Garrett Baski Co-authored-by: Wei Wei * Bump version for hot fix (#2085) * Bump @azure/core-auth from 1.4.0 to 1.5.0 (#2092) Bumps [@azure/core-auth](https://github.com/Azure/azure-sdk-for-js) from 1.4.0 to 1.5.0. - [Release notes](https://github.com/Azure/azure-sdk-for-js/releases) - [Changelog](https://github.com/Azure/azure-sdk-for-js/blob/main/documentation/Changelog-for-next-generation.md) - [Commits](https://github.com/Azure/azure-sdk-for-js/compare/@azure/core-auth_1.4.0...@azure/core-auth_1.5.0) --- updated-dependencies: - dependency-name: "@azure/core-auth" dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump @azure/core-rest-pipeline from 1.11.0 to 1.12.0 (#2093) Bumps [@azure/core-rest-pipeline](https://github.com/Azure/azure-sdk-for-js) from 1.11.0 to 1.12.0. - [Release notes](https://github.com/Azure/azure-sdk-for-js/releases) - [Changelog](https://github.com/Azure/azure-sdk-for-js/blob/main/documentation/Changelog-for-next-generation.md) - [Commits](https://github.com/Azure/azure-sdk-for-js/compare/@azure/core-rest-pipeline_1.11.0...@azure/core-rest-pipeline_1.12.0) --- updated-dependencies: - dependency-name: "@azure/core-rest-pipeline" dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump cross-env from 6.0.3 to 7.0.3 (#2094) Bumps [cross-env](https://github.com/kentcdodds/cross-env) from 6.0.3 to 7.0.3. - [Release notes](https://github.com/kentcdodds/cross-env/releases) - [Changelog](https://github.com/kentcdodds/cross-env/blob/master/CHANGELOG.md) - [Commits](https://github.com/kentcdodds/cross-env/compare/v6.0.3...v7.0.3) --- updated-dependencies: - dependency-name: cross-env dependency-type: direct:development update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump @types/validator from 13.7.17 to 13.11.1 (#2091) Bumps [@types/validator](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/validator) from 13.7.17 to 13.11.1. - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/validator) --- updated-dependencies: - dependency-name: "@types/validator" dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump jsonwebtoken and @types/jsonwebtoken (#2098) Bumps [jsonwebtoken](https://github.com/auth0/node-jsonwebtoken) and [@types/jsonwebtoken](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/jsonwebtoken). These dependencies needed to be updated together. Updates `jsonwebtoken` from 9.0.0 to 9.0.1 - [Changelog](https://github.com/auth0/node-jsonwebtoken/blob/master/CHANGELOG.md) - [Commits](https://github.com/auth0/node-jsonwebtoken/compare/v9.0.0...v9.0.1) Updates `@types/jsonwebtoken` from 9.0.1 to 9.0.2 - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/jsonwebtoken) --- updated-dependencies: - dependency-name: jsonwebtoken dependency-type: direct:production update-type: version-update:semver-patch - dependency-name: "@types/jsonwebtoken" dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump prettier from 3.0.0 to 3.0.1 (#2097) Bumps [prettier](https://github.com/prettier/prettier) from 3.0.0 to 3.0.1. - [Release notes](https://github.com/prettier/prettier/releases) - [Changelog](https://github.com/prettier/prettier/blob/main/CHANGELOG.md) - [Commits](https://github.com/prettier/prettier/compare/3.0.0...3.0.1) --- updated-dependencies: - dependency-name: prettier dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump mysql2 from 3.5.2 to 3.6.0 (#2096) Bumps [mysql2](https://github.com/sidorares/node-mysql2) from 3.5.2 to 3.6.0. - [Release notes](https://github.com/sidorares/node-mysql2/releases) - [Changelog](https://github.com/sidorares/node-mysql2/blob/master/Changelog.md) - [Commits](https://github.com/sidorares/node-mysql2/compare/v3.5.2...v3.6.0) --- updated-dependencies: - dependency-name: mysql2 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump @types/bluebird from 3.5.37 to 3.5.38 (#2105) Bumps [@types/bluebird](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/bluebird) from 3.5.37 to 3.5.38. - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/bluebird) --- updated-dependencies: - dependency-name: "@types/bluebird" dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump @types/vscode from 1.80.0 to 1.81.0 (#2101) Bumps [@types/vscode](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/vscode) from 1.80.0 to 1.81.0. - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/vscode) --- updated-dependencies: - dependency-name: "@types/vscode" dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump rcedit from 3.0.1 to 3.1.0 (#2103) Bumps [rcedit](https://github.com/electron/node-rcedit) from 3.0.1 to 3.1.0. - [Release notes](https://github.com/electron/node-rcedit/releases) - [Changelog](https://github.com/electron/node-rcedit/blob/master/.releaserc.json) - [Commits](https://github.com/electron/node-rcedit/compare/v3.0.1...v3.1.0) --- updated-dependencies: - dependency-name: rcedit dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Fix issue #2061, #2064, #2083 (#2087) * Fix 2061 & 2083 * fix issue #2064 * Add test cases and change log --------- Co-authored-by: EmmaZhu * Updated examples of setting Customized Storage Accounts & Keys in enviroment varialbe (#2029) * Bump prettier from 3.0.1 to 3.0.2 (#2110) Bumps [prettier](https://github.com/prettier/prettier) from 3.0.1 to 3.0.2. - [Release notes](https://github.com/prettier/prettier/releases) - [Changelog](https://github.com/prettier/prettier/blob/main/CHANGELOG.md) - [Commits](https://github.com/prettier/prettier/compare/3.0.1...3.0.2) --- updated-dependencies: - dependency-name: prettier dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump eslint from 8.46.0 to 8.47.0 (#2108) Bumps [eslint](https://github.com/eslint/eslint) from 8.46.0 to 8.47.0. - [Release notes](https://github.com/eslint/eslint/releases) - [Changelog](https://github.com/eslint/eslint/blob/main/CHANGELOG.md) - [Commits](https://github.com/eslint/eslint/compare/v8.46.0...v8.47.0) --- updated-dependencies: - dependency-name: eslint dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump lint-staged from 13.2.3 to 14.0.0 (#2106) Bumps [lint-staged](https://github.com/okonet/lint-staged) from 13.2.3 to 14.0.0. - [Release notes](https://github.com/okonet/lint-staged/releases) - [Commits](https://github.com/okonet/lint-staged/compare/v13.2.3...v14.0.0) --- updated-dependencies: - dependency-name: lint-staged dependency-type: direct:development update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump service version to 2023-08-03 (#2111) * Bump azure-storage from 2.10.6 to 2.10.7 (#2117) Bumps [azure-storage](https://github.com/Azure/azure-storage-node) from 2.10.6 to 2.10.7. - [Release notes](https://github.com/Azure/azure-storage-node/releases) - [Changelog](https://github.com/Azure/azure-storage-node/blob/master/ChangeLog.md) - [Commits](https://github.com/Azure/azure-storage-node/commits) --- updated-dependencies: - dependency-name: azure-storage dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Fetch latest from main and updated changeLog file accordingly * "Move change to Upcoming release header" --------- Signed-off-by: dependabot[bot] Co-authored-by: Wei Wei Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: James Tomlinson Co-authored-by: Benjamin Pannell <1760260+notheotherben@users.noreply.github.com> Co-authored-by: Garrett Baski <108769825+garrettbaski@users.noreply.github.com> Co-authored-by: Garrett Baski Co-authored-by: EmmaZhu-MSFT --- ChangeLog.md | 3 ++ src/table/handlers/TableHandler.ts | 4 +- tests/table/apis/table.entity.issues.test.ts | 39 ++++++++++++++++++++ 3 files changed, 44 insertions(+), 2 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index ff144413b..206be9982 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -4,6 +4,9 @@ ## Upcoming Release +Table: +- Fixed the errorCode returned, when malformed Etag is provided for table Update/Delete calls. (issue #2013) + ## 2023.08 Version 3.26.0 General: diff --git a/src/table/handlers/TableHandler.ts b/src/table/handlers/TableHandler.ts index 7a7d80e82..32fce5b81 100644 --- a/src/table/handlers/TableHandler.ts +++ b/src/table/handlers/TableHandler.ts @@ -394,7 +394,7 @@ export default class TableHandler extends BaseHandler implements ITableHandler { } if (options?.ifMatch && options.ifMatch !== "*") { if (isEtagValid(options.ifMatch)) { - throw StorageErrorFactory.getInvalidOperation(context); + throw StorageErrorFactory.getInvalidInput(context); } } // check that key properties are valid @@ -544,7 +544,7 @@ export default class TableHandler extends BaseHandler implements ITableHandler { throw StorageErrorFactory.getPreconditionFailed(context); } if (ifMatch !== "*" && isEtagValid(ifMatch)) { - throw StorageErrorFactory.getInvalidOperation(context); + throw StorageErrorFactory.getInvalidInput(context); } // currently the props are not coming through as args, so we take them from the table context await this.metadataStore.deleteTableEntity( diff --git a/tests/table/apis/table.entity.issues.test.ts b/tests/table/apis/table.entity.issues.test.ts index 6e4b91a1e..3cc1b03f6 100644 --- a/tests/table/apis/table.entity.issues.test.ts +++ b/tests/table/apis/table.entity.issues.test.ts @@ -7,6 +7,7 @@ import { TableEntityResult } from "@azure/data-tables"; import { configLogger } from "../../../src/common/Logger"; +import StorageError from "../../../src/table/errors/StorageError"; import TableServer from "../../../src/table/TableServer"; import { getUniqueName } from "../../testutils"; import { @@ -416,4 +417,42 @@ describe("table Entity APIs test : Issues", () => { await tableClient.deleteTable(); }); + + //from issue #2013 + it("Malformed Etag when sent as input throws InvalidInput for table operations, ", async() => { + const partitionKey = createUniquePartitionKey("𤭢PK1"); + const malformedEtag = "MalformedEtag"; + const rowKey = "𐐷RK1" + const tableClient = createAzureDataTablesClient( + testLocalAzuriteInstance, + tableName + ); + + await tableClient.createTable(); + await tableClient.createEntity({ + partitionKey: partitionKey, + rowKey: "𐐷RK1" + }); + + tableClient.deleteEntity( + partitionKey, + rowKey, + { + etag: malformedEtag + } + ).catch((reason) => { + assert.strictEqual(reason.details.errorCode, "InvalidInput"); + assert.strictEqual(reason.statusCode, 400); + }); + + tableClient.updateEntity({ + partitionKey: partitionKey, + rowKey: rowKey, + ifMatch: malformedEtag + }).catch((reason) => { + const storageError = reason as StorageError; + assert.strictEqual(storageError.statusCode, "InvalidInput"); + assert.strictEqual(storageError.storageErrorCode, 400); + }); + }); }); From 3a30cb2f6b755cd3f1b1317b6fe43212d9776a7d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 22 Aug 2023 10:22:16 +0800 Subject: [PATCH 185/297] Bump @typescript-eslint/eslint-plugin from 5.61.0 to 6.4.1 (#2128) Bumps [@typescript-eslint/eslint-plugin](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/eslint-plugin) from 5.61.0 to 6.4.1. - [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases) - [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/eslint-plugin/CHANGELOG.md) - [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v6.4.1/packages/eslint-plugin) --- updated-dependencies: - dependency-name: "@typescript-eslint/eslint-plugin" dependency-type: direct:development update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 309 +++++++++++++++++++++------------------------- package.json | 2 +- 2 files changed, 140 insertions(+), 171 deletions(-) diff --git a/package-lock.json b/package-lock.json index 36462a2e3..31eefc166 100644 --- a/package-lock.json +++ b/package-lock.json @@ -64,7 +64,7 @@ "@types/validator": "^13.1.4", "@types/vscode": "^1.39.0", "@types/xml2js": "^0.4.3", - "@typescript-eslint/eslint-plugin": "^5.54.1", + "@typescript-eslint/eslint-plugin": "^6.4.1", "@typescript-eslint/parser": "^5.54.1", "autorest": "^3.6.0", "azure-storage": "^2.10.3", @@ -917,9 +917,9 @@ } }, "node_modules/@eslint-community/eslint-utils": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.3.0.tgz", - "integrity": "sha512-v3oplH6FYCULtFuCeqyuTd9D2WKO937Dxdq+GmHOLL72TTRriLxz2VLlNfkZRsvj6PKnOPAtuT6dwrs/pA5DvA==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", "dev": true, "dependencies": { "eslint-visitor-keys": "^3.3.0" @@ -1593,32 +1593,33 @@ } }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.61.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.61.0.tgz", - "integrity": "sha512-A5l/eUAug103qtkwccSCxn8ZRwT+7RXWkFECdA4Cvl1dOlDUgTpAOfSEElZn2uSUxhdDpnCdetrf0jvU4qrL+g==", + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.4.1.tgz", + "integrity": "sha512-3F5PtBzUW0dYlq77Lcqo13fv+58KDwUib3BddilE8ajPJT+faGgxmI9Sw+I8ZS22BYwoir9ZhNXcLi+S+I2bkw==", "dev": true, "dependencies": { - "@eslint-community/regexpp": "^4.4.0", - "@typescript-eslint/scope-manager": "5.61.0", - "@typescript-eslint/type-utils": "5.61.0", - "@typescript-eslint/utils": "5.61.0", + "@eslint-community/regexpp": "^4.5.1", + "@typescript-eslint/scope-manager": "6.4.1", + "@typescript-eslint/type-utils": "6.4.1", + "@typescript-eslint/utils": "6.4.1", + "@typescript-eslint/visitor-keys": "6.4.1", "debug": "^4.3.4", "graphemer": "^1.4.0", - "ignore": "^5.2.0", - "natural-compare-lite": "^1.4.0", - "semver": "^7.3.7", - "tsutils": "^3.21.0" + "ignore": "^5.2.4", + "natural-compare": "^1.4.0", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^5.0.0", - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + "@typescript-eslint/parser": "^6.0.0 || ^6.0.0-alpha", + "eslint": "^7.0.0 || ^8.0.0" }, "peerDependenciesMeta": { "typescript": { @@ -1774,16 +1775,16 @@ "dev": true }, "node_modules/@typescript-eslint/scope-manager": { - "version": "5.61.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.61.0.tgz", - "integrity": "sha512-W8VoMjoSg7f7nqAROEmTt6LoBpn81AegP7uKhhW5KzYlehs8VV0ZW0fIDVbcZRcaP3aPSW+JZFua+ysQN+m/Nw==", + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.4.1.tgz", + "integrity": "sha512-p/OavqOQfm4/Hdrr7kvacOSFjwQ2rrDVJRPxt/o0TOWdFnjJptnjnZ+sYDR7fi4OimvIuKp+2LCkc+rt9fIW+A==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.61.0", - "@typescript-eslint/visitor-keys": "5.61.0" + "@typescript-eslint/types": "6.4.1", + "@typescript-eslint/visitor-keys": "6.4.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", @@ -1791,25 +1792,25 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "5.61.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.61.0.tgz", - "integrity": "sha512-kk8u//r+oVK2Aj3ph/26XdH0pbAkC2RiSjUYhKD+PExemG4XSjpGFeyZ/QM8lBOa7O8aGOU+/yEbMJgQv/DnCg==", + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.4.1.tgz", + "integrity": "sha512-7ON8M8NXh73SGZ5XvIqWHjgX2f+vvaOarNliGhjrJnv1vdjG0LVIz+ToYfPirOoBi56jxAKLfsLm40+RvxVVXA==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "5.61.0", - "@typescript-eslint/utils": "5.61.0", + "@typescript-eslint/typescript-estree": "6.4.1", + "@typescript-eslint/utils": "6.4.1", "debug": "^4.3.4", - "tsutils": "^3.21.0" + "ts-api-utils": "^1.0.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "*" + "eslint": "^7.0.0 || ^8.0.0" }, "peerDependenciesMeta": { "typescript": { @@ -1841,12 +1842,12 @@ "dev": true }, "node_modules/@typescript-eslint/types": { - "version": "5.61.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.61.0.tgz", - "integrity": "sha512-ldyueo58KjngXpzloHUog/h9REmHl59G1b3a5Sng1GfBo14BkS3ZbMEb3693gnP1k//97lh7bKsp6/V/0v1veQ==", + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.4.1.tgz", + "integrity": "sha512-zAAopbNuYu++ijY1GV2ylCsQsi3B8QvfPHVqhGdDcbx/NK5lkqMnCGU53amAjccSpk+LfeONxwzUhDzArSfZJg==", "dev": true, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", @@ -1854,21 +1855,21 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.61.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.61.0.tgz", - "integrity": "sha512-Fud90PxONnnLZ36oR5ClJBLTLfU4pIWBmnvGwTbEa2cXIqj70AEDEmOmpkFComjBZ/037ueKrOdHuYmSFVD7Rw==", + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.4.1.tgz", + "integrity": "sha512-xF6Y7SatVE/OyV93h1xGgfOkHr2iXuo8ip0gbfzaKeGGuKiAnzS+HtVhSPx8Www243bwlW8IF7X0/B62SzFftg==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.61.0", - "@typescript-eslint/visitor-keys": "5.61.0", + "@typescript-eslint/types": "6.4.1", + "@typescript-eslint/visitor-keys": "6.4.1", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", @@ -1904,42 +1905,41 @@ "dev": true }, "node_modules/@typescript-eslint/utils": { - "version": "5.61.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.61.0.tgz", - "integrity": "sha512-mV6O+6VgQmVE6+xzlA91xifndPW9ElFW8vbSF0xCT/czPXVhwDewKila1jOyRwa9AE19zKnrr7Cg5S3pJVrTWQ==", + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.4.1.tgz", + "integrity": "sha512-F/6r2RieNeorU0zhqZNv89s9bDZSovv3bZQpUNOmmQK1L80/cV4KEu95YUJWi75u5PhboFoKUJBnZ4FQcoqhDw==", "dev": true, "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@types/json-schema": "^7.0.9", - "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.61.0", - "@typescript-eslint/types": "5.61.0", - "@typescript-eslint/typescript-estree": "5.61.0", - "eslint-scope": "^5.1.1", - "semver": "^7.3.7" + "@eslint-community/eslint-utils": "^4.4.0", + "@types/json-schema": "^7.0.12", + "@types/semver": "^7.5.0", + "@typescript-eslint/scope-manager": "6.4.1", + "@typescript-eslint/types": "6.4.1", + "@typescript-eslint/typescript-estree": "6.4.1", + "semver": "^7.5.4" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + "eslint": "^7.0.0 || ^8.0.0" } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.61.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.61.0.tgz", - "integrity": "sha512-50XQ5VdbWrX06mQXhy93WywSFZZGsv3EOjq+lqp6WC2t+j3mb6A9xYVdrRxafvK88vg9k9u+CT4l6D8PEatjKg==", + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.4.1.tgz", + "integrity": "sha512-y/TyRJsbZPkJIZQXrHfdnxVnxyKegnpEvnRGNam7s3TRR2ykGefEWOhaef00/UUN3IZxizS7BTO3svd3lCOJRQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.61.0", - "eslint-visitor-keys": "^3.3.0" + "@typescript-eslint/types": "6.4.1", + "eslint-visitor-keys": "^3.4.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", @@ -4381,19 +4381,6 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, "node_modules/eslint-visitor-keys": { "version": "3.4.3", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", @@ -4726,15 +4713,6 @@ "node": ">=4.0" } }, - "node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, "node_modules/esutils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", @@ -7514,12 +7492,6 @@ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "dev": true }, - "node_modules/natural-compare-lite": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", - "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", - "dev": true - }, "node_modules/negotiator": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", @@ -8817,9 +8789,9 @@ "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" }, "node_modules/semver": { - "version": "7.5.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.2.tgz", - "integrity": "sha512-SoftuTROv/cRjCze/scjGyiDtcUyxw1rgYQSZY7XTmtR5hX+dm76iDbTH8TkLPHCQmlbQVSSbNZCPM2hb0knnQ==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dependencies": { "lru-cache": "^6.0.0" }, @@ -9586,6 +9558,18 @@ "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.3.0.tgz", "integrity": "sha512-XrHUvV5HpdLmIj4uVMxHggLbFSZYIn7HEWsqePZcI50pco+MPqJ50wMGY794X7AOOhxOBAjbkqfAbEe/QMp2Lw==" }, + "node_modules/ts-api-utils": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.2.tgz", + "integrity": "sha512-Cbu4nIqnEdd+THNEsBdkolnOXhg0I8XteoHaEKgvsxpsbWda4IsUut2c187HxywQCvveojow0Dgw/amxtSKVkQ==", + "dev": true, + "engines": { + "node": ">=16.13.0" + }, + "peerDependencies": { + "typescript": ">=4.2.0" + } + }, "node_modules/ts-mockito": { "version": "2.6.1", "resolved": "https://registry.npmjs.org/ts-mockito/-/ts-mockito-2.6.1.tgz", @@ -10986,9 +10970,9 @@ } }, "@eslint-community/eslint-utils": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.3.0.tgz", - "integrity": "sha512-v3oplH6FYCULtFuCeqyuTd9D2WKO937Dxdq+GmHOLL72TTRriLxz2VLlNfkZRsvj6PKnOPAtuT6dwrs/pA5DvA==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", "dev": true, "requires": { "eslint-visitor-keys": "^3.3.0" @@ -11547,21 +11531,22 @@ } }, "@typescript-eslint/eslint-plugin": { - "version": "5.61.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.61.0.tgz", - "integrity": "sha512-A5l/eUAug103qtkwccSCxn8ZRwT+7RXWkFECdA4Cvl1dOlDUgTpAOfSEElZn2uSUxhdDpnCdetrf0jvU4qrL+g==", + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.4.1.tgz", + "integrity": "sha512-3F5PtBzUW0dYlq77Lcqo13fv+58KDwUib3BddilE8ajPJT+faGgxmI9Sw+I8ZS22BYwoir9ZhNXcLi+S+I2bkw==", "dev": true, "requires": { - "@eslint-community/regexpp": "^4.4.0", - "@typescript-eslint/scope-manager": "5.61.0", - "@typescript-eslint/type-utils": "5.61.0", - "@typescript-eslint/utils": "5.61.0", + "@eslint-community/regexpp": "^4.5.1", + "@typescript-eslint/scope-manager": "6.4.1", + "@typescript-eslint/type-utils": "6.4.1", + "@typescript-eslint/utils": "6.4.1", + "@typescript-eslint/visitor-keys": "6.4.1", "debug": "^4.3.4", "graphemer": "^1.4.0", - "ignore": "^5.2.0", - "natural-compare-lite": "^1.4.0", - "semver": "^7.3.7", - "tsutils": "^3.21.0" + "ignore": "^5.2.4", + "natural-compare": "^1.4.0", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" }, "dependencies": { "debug": { @@ -11652,25 +11637,25 @@ } }, "@typescript-eslint/scope-manager": { - "version": "5.61.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.61.0.tgz", - "integrity": "sha512-W8VoMjoSg7f7nqAROEmTt6LoBpn81AegP7uKhhW5KzYlehs8VV0ZW0fIDVbcZRcaP3aPSW+JZFua+ysQN+m/Nw==", + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.4.1.tgz", + "integrity": "sha512-p/OavqOQfm4/Hdrr7kvacOSFjwQ2rrDVJRPxt/o0TOWdFnjJptnjnZ+sYDR7fi4OimvIuKp+2LCkc+rt9fIW+A==", "dev": true, "requires": { - "@typescript-eslint/types": "5.61.0", - "@typescript-eslint/visitor-keys": "5.61.0" + "@typescript-eslint/types": "6.4.1", + "@typescript-eslint/visitor-keys": "6.4.1" } }, "@typescript-eslint/type-utils": { - "version": "5.61.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.61.0.tgz", - "integrity": "sha512-kk8u//r+oVK2Aj3ph/26XdH0pbAkC2RiSjUYhKD+PExemG4XSjpGFeyZ/QM8lBOa7O8aGOU+/yEbMJgQv/DnCg==", + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.4.1.tgz", + "integrity": "sha512-7ON8M8NXh73SGZ5XvIqWHjgX2f+vvaOarNliGhjrJnv1vdjG0LVIz+ToYfPirOoBi56jxAKLfsLm40+RvxVVXA==", "dev": true, "requires": { - "@typescript-eslint/typescript-estree": "5.61.0", - "@typescript-eslint/utils": "5.61.0", + "@typescript-eslint/typescript-estree": "6.4.1", + "@typescript-eslint/utils": "6.4.1", "debug": "^4.3.4", - "tsutils": "^3.21.0" + "ts-api-utils": "^1.0.1" }, "dependencies": { "debug": { @@ -11691,24 +11676,24 @@ } }, "@typescript-eslint/types": { - "version": "5.61.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.61.0.tgz", - "integrity": "sha512-ldyueo58KjngXpzloHUog/h9REmHl59G1b3a5Sng1GfBo14BkS3ZbMEb3693gnP1k//97lh7bKsp6/V/0v1veQ==", + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.4.1.tgz", + "integrity": "sha512-zAAopbNuYu++ijY1GV2ylCsQsi3B8QvfPHVqhGdDcbx/NK5lkqMnCGU53amAjccSpk+LfeONxwzUhDzArSfZJg==", "dev": true }, "@typescript-eslint/typescript-estree": { - "version": "5.61.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.61.0.tgz", - "integrity": "sha512-Fud90PxONnnLZ36oR5ClJBLTLfU4pIWBmnvGwTbEa2cXIqj70AEDEmOmpkFComjBZ/037ueKrOdHuYmSFVD7Rw==", + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.4.1.tgz", + "integrity": "sha512-xF6Y7SatVE/OyV93h1xGgfOkHr2iXuo8ip0gbfzaKeGGuKiAnzS+HtVhSPx8Www243bwlW8IF7X0/B62SzFftg==", "dev": true, "requires": { - "@typescript-eslint/types": "5.61.0", - "@typescript-eslint/visitor-keys": "5.61.0", + "@typescript-eslint/types": "6.4.1", + "@typescript-eslint/visitor-keys": "6.4.1", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" }, "dependencies": { "debug": { @@ -11729,29 +11714,28 @@ } }, "@typescript-eslint/utils": { - "version": "5.61.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.61.0.tgz", - "integrity": "sha512-mV6O+6VgQmVE6+xzlA91xifndPW9ElFW8vbSF0xCT/czPXVhwDewKila1jOyRwa9AE19zKnrr7Cg5S3pJVrTWQ==", + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.4.1.tgz", + "integrity": "sha512-F/6r2RieNeorU0zhqZNv89s9bDZSovv3bZQpUNOmmQK1L80/cV4KEu95YUJWi75u5PhboFoKUJBnZ4FQcoqhDw==", "dev": true, "requires": { - "@eslint-community/eslint-utils": "^4.2.0", - "@types/json-schema": "^7.0.9", - "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.61.0", - "@typescript-eslint/types": "5.61.0", - "@typescript-eslint/typescript-estree": "5.61.0", - "eslint-scope": "^5.1.1", - "semver": "^7.3.7" + "@eslint-community/eslint-utils": "^4.4.0", + "@types/json-schema": "^7.0.12", + "@types/semver": "^7.5.0", + "@typescript-eslint/scope-manager": "6.4.1", + "@typescript-eslint/types": "6.4.1", + "@typescript-eslint/typescript-estree": "6.4.1", + "semver": "^7.5.4" } }, "@typescript-eslint/visitor-keys": { - "version": "5.61.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.61.0.tgz", - "integrity": "sha512-50XQ5VdbWrX06mQXhy93WywSFZZGsv3EOjq+lqp6WC2t+j3mb6A9xYVdrRxafvK88vg9k9u+CT4l6D8PEatjKg==", + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.4.1.tgz", + "integrity": "sha512-y/TyRJsbZPkJIZQXrHfdnxVnxyKegnpEvnRGNam7s3TRR2ykGefEWOhaef00/UUN3IZxizS7BTO3svd3lCOJRQ==", "dev": true, "requires": { - "@typescript-eslint/types": "5.61.0", - "eslint-visitor-keys": "^3.3.0" + "@typescript-eslint/types": "6.4.1", + "eslint-visitor-keys": "^3.4.1" } }, "abort-controller": { @@ -13963,16 +13947,6 @@ } } }, - "eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - } - }, "eslint-visitor-keys": { "version": "3.4.3", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", @@ -14024,12 +13998,6 @@ } } }, - "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true - }, "esutils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", @@ -16095,12 +16063,6 @@ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "dev": true }, - "natural-compare-lite": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", - "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", - "dev": true - }, "negotiator": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", @@ -17041,9 +17003,9 @@ "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" }, "semver": { - "version": "7.5.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.2.tgz", - "integrity": "sha512-SoftuTROv/cRjCze/scjGyiDtcUyxw1rgYQSZY7XTmtR5hX+dm76iDbTH8TkLPHCQmlbQVSSbNZCPM2hb0knnQ==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "requires": { "lru-cache": "^6.0.0" }, @@ -17596,6 +17558,13 @@ "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.3.0.tgz", "integrity": "sha512-XrHUvV5HpdLmIj4uVMxHggLbFSZYIn7HEWsqePZcI50pco+MPqJ50wMGY794X7AOOhxOBAjbkqfAbEe/QMp2Lw==" }, + "ts-api-utils": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.2.tgz", + "integrity": "sha512-Cbu4nIqnEdd+THNEsBdkolnOXhg0I8XteoHaEKgvsxpsbWda4IsUut2c187HxywQCvveojow0Dgw/amxtSKVkQ==", + "dev": true, + "requires": {} + }, "ts-mockito": { "version": "2.6.1", "resolved": "https://registry.npmjs.org/ts-mockito/-/ts-mockito-2.6.1.tgz", diff --git a/package.json b/package.json index 1f6a520d9..a1fb0570b 100644 --- a/package.json +++ b/package.json @@ -69,7 +69,7 @@ "@types/validator": "^13.1.4", "@types/vscode": "^1.39.0", "@types/xml2js": "^0.4.3", - "@typescript-eslint/eslint-plugin": "^5.54.1", + "@typescript-eslint/eslint-plugin": "^6.4.1", "@typescript-eslint/parser": "^5.54.1", "autorest": "^3.6.0", "azure-storage": "^2.10.3", From cf184a6f9474753a6679c7896e83301164b49131 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 22 Aug 2023 10:22:21 +0800 Subject: [PATCH 186/297] Bump lint-staged from 14.0.0 to 14.0.1 (#2127) Bumps [lint-staged](https://github.com/okonet/lint-staged) from 14.0.0 to 14.0.1. - [Release notes](https://github.com/okonet/lint-staged/releases) - [Commits](https://github.com/okonet/lint-staged/compare/v14.0.0...v14.0.1) --- updated-dependencies: - dependency-name: lint-staged dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 31eefc166..3e29e8c23 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6675,9 +6675,9 @@ } }, "node_modules/lint-staged": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-14.0.0.tgz", - "integrity": "sha512-0tLf0pqZYkar/wu3nTctk4rVIG+d7PanDYv4/IQR4qwdqfQkTDziLRFnqMcLuLBTuUqmcLwsHPD2EjQ18d/oaA==", + "version": "14.0.1", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-14.0.1.tgz", + "integrity": "sha512-Mw0cL6HXnHN1ag0mN/Dg4g6sr8uf8sn98w2Oc1ECtFto9tvRF7nkXGJRbx8gPlHyoR0pLyBr2lQHbWwmUHe1Sw==", "dev": true, "dependencies": { "chalk": "5.3.0", @@ -15438,9 +15438,9 @@ } }, "lint-staged": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-14.0.0.tgz", - "integrity": "sha512-0tLf0pqZYkar/wu3nTctk4rVIG+d7PanDYv4/IQR4qwdqfQkTDziLRFnqMcLuLBTuUqmcLwsHPD2EjQ18d/oaA==", + "version": "14.0.1", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-14.0.1.tgz", + "integrity": "sha512-Mw0cL6HXnHN1ag0mN/Dg4g6sr8uf8sn98w2Oc1ECtFto9tvRF7nkXGJRbx8gPlHyoR0pLyBr2lQHbWwmUHe1Sw==", "dev": true, "requires": { "chalk": "5.3.0", From 0f6a734eed96acb05b7322b7e1ea6f9259471275 Mon Sep 17 00:00:00 2001 From: Wei Wei Date: Tue, 22 Aug 2023 03:13:32 +0000 Subject: [PATCH 187/297] Revert "Bump @typescript-eslint/eslint-plugin from 5.61.0 to 6.4.1 (#2128)" (#2129) This reverts commit 3a30cb2f6b755cd3f1b1317b6fe43212d9776a7d. --- package-lock.json | 309 +++++++++++++++++++++++++--------------------- package.json | 2 +- 2 files changed, 171 insertions(+), 140 deletions(-) diff --git a/package-lock.json b/package-lock.json index 3e29e8c23..446128c5f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -64,7 +64,7 @@ "@types/validator": "^13.1.4", "@types/vscode": "^1.39.0", "@types/xml2js": "^0.4.3", - "@typescript-eslint/eslint-plugin": "^6.4.1", + "@typescript-eslint/eslint-plugin": "^5.54.1", "@typescript-eslint/parser": "^5.54.1", "autorest": "^3.6.0", "azure-storage": "^2.10.3", @@ -917,9 +917,9 @@ } }, "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", - "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.3.0.tgz", + "integrity": "sha512-v3oplH6FYCULtFuCeqyuTd9D2WKO937Dxdq+GmHOLL72TTRriLxz2VLlNfkZRsvj6PKnOPAtuT6dwrs/pA5DvA==", "dev": true, "dependencies": { "eslint-visitor-keys": "^3.3.0" @@ -1593,33 +1593,32 @@ } }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.4.1.tgz", - "integrity": "sha512-3F5PtBzUW0dYlq77Lcqo13fv+58KDwUib3BddilE8ajPJT+faGgxmI9Sw+I8ZS22BYwoir9ZhNXcLi+S+I2bkw==", + "version": "5.61.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.61.0.tgz", + "integrity": "sha512-A5l/eUAug103qtkwccSCxn8ZRwT+7RXWkFECdA4Cvl1dOlDUgTpAOfSEElZn2uSUxhdDpnCdetrf0jvU4qrL+g==", "dev": true, "dependencies": { - "@eslint-community/regexpp": "^4.5.1", - "@typescript-eslint/scope-manager": "6.4.1", - "@typescript-eslint/type-utils": "6.4.1", - "@typescript-eslint/utils": "6.4.1", - "@typescript-eslint/visitor-keys": "6.4.1", + "@eslint-community/regexpp": "^4.4.0", + "@typescript-eslint/scope-manager": "5.61.0", + "@typescript-eslint/type-utils": "5.61.0", + "@typescript-eslint/utils": "5.61.0", "debug": "^4.3.4", "graphemer": "^1.4.0", - "ignore": "^5.2.4", - "natural-compare": "^1.4.0", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" + "ignore": "^5.2.0", + "natural-compare-lite": "^1.4.0", + "semver": "^7.3.7", + "tsutils": "^3.21.0" }, "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^6.0.0 || ^6.0.0-alpha", - "eslint": "^7.0.0 || ^8.0.0" + "@typescript-eslint/parser": "^5.0.0", + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" }, "peerDependenciesMeta": { "typescript": { @@ -1775,16 +1774,16 @@ "dev": true }, "node_modules/@typescript-eslint/scope-manager": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.4.1.tgz", - "integrity": "sha512-p/OavqOQfm4/Hdrr7kvacOSFjwQ2rrDVJRPxt/o0TOWdFnjJptnjnZ+sYDR7fi4OimvIuKp+2LCkc+rt9fIW+A==", + "version": "5.61.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.61.0.tgz", + "integrity": "sha512-W8VoMjoSg7f7nqAROEmTt6LoBpn81AegP7uKhhW5KzYlehs8VV0ZW0fIDVbcZRcaP3aPSW+JZFua+ysQN+m/Nw==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.4.1", - "@typescript-eslint/visitor-keys": "6.4.1" + "@typescript-eslint/types": "5.61.0", + "@typescript-eslint/visitor-keys": "5.61.0" }, "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "type": "opencollective", @@ -1792,25 +1791,25 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.4.1.tgz", - "integrity": "sha512-7ON8M8NXh73SGZ5XvIqWHjgX2f+vvaOarNliGhjrJnv1vdjG0LVIz+ToYfPirOoBi56jxAKLfsLm40+RvxVVXA==", + "version": "5.61.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.61.0.tgz", + "integrity": "sha512-kk8u//r+oVK2Aj3ph/26XdH0pbAkC2RiSjUYhKD+PExemG4XSjpGFeyZ/QM8lBOa7O8aGOU+/yEbMJgQv/DnCg==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "6.4.1", - "@typescript-eslint/utils": "6.4.1", + "@typescript-eslint/typescript-estree": "5.61.0", + "@typescript-eslint/utils": "5.61.0", "debug": "^4.3.4", - "ts-api-utils": "^1.0.1" + "tsutils": "^3.21.0" }, "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" + "eslint": "*" }, "peerDependenciesMeta": { "typescript": { @@ -1842,12 +1841,12 @@ "dev": true }, "node_modules/@typescript-eslint/types": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.4.1.tgz", - "integrity": "sha512-zAAopbNuYu++ijY1GV2ylCsQsi3B8QvfPHVqhGdDcbx/NK5lkqMnCGU53amAjccSpk+LfeONxwzUhDzArSfZJg==", + "version": "5.61.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.61.0.tgz", + "integrity": "sha512-ldyueo58KjngXpzloHUog/h9REmHl59G1b3a5Sng1GfBo14BkS3ZbMEb3693gnP1k//97lh7bKsp6/V/0v1veQ==", "dev": true, "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "type": "opencollective", @@ -1855,21 +1854,21 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.4.1.tgz", - "integrity": "sha512-xF6Y7SatVE/OyV93h1xGgfOkHr2iXuo8ip0gbfzaKeGGuKiAnzS+HtVhSPx8Www243bwlW8IF7X0/B62SzFftg==", + "version": "5.61.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.61.0.tgz", + "integrity": "sha512-Fud90PxONnnLZ36oR5ClJBLTLfU4pIWBmnvGwTbEa2cXIqj70AEDEmOmpkFComjBZ/037ueKrOdHuYmSFVD7Rw==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.4.1", - "@typescript-eslint/visitor-keys": "6.4.1", + "@typescript-eslint/types": "5.61.0", + "@typescript-eslint/visitor-keys": "5.61.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" + "semver": "^7.3.7", + "tsutils": "^3.21.0" }, "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "type": "opencollective", @@ -1905,41 +1904,42 @@ "dev": true }, "node_modules/@typescript-eslint/utils": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.4.1.tgz", - "integrity": "sha512-F/6r2RieNeorU0zhqZNv89s9bDZSovv3bZQpUNOmmQK1L80/cV4KEu95YUJWi75u5PhboFoKUJBnZ4FQcoqhDw==", + "version": "5.61.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.61.0.tgz", + "integrity": "sha512-mV6O+6VgQmVE6+xzlA91xifndPW9ElFW8vbSF0xCT/czPXVhwDewKila1jOyRwa9AE19zKnrr7Cg5S3pJVrTWQ==", "dev": true, "dependencies": { - "@eslint-community/eslint-utils": "^4.4.0", - "@types/json-schema": "^7.0.12", - "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "6.4.1", - "@typescript-eslint/types": "6.4.1", - "@typescript-eslint/typescript-estree": "6.4.1", - "semver": "^7.5.4" + "@eslint-community/eslint-utils": "^4.2.0", + "@types/json-schema": "^7.0.9", + "@types/semver": "^7.3.12", + "@typescript-eslint/scope-manager": "5.61.0", + "@typescript-eslint/types": "5.61.0", + "@typescript-eslint/typescript-estree": "5.61.0", + "eslint-scope": "^5.1.1", + "semver": "^7.3.7" }, "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.4.1.tgz", - "integrity": "sha512-y/TyRJsbZPkJIZQXrHfdnxVnxyKegnpEvnRGNam7s3TRR2ykGefEWOhaef00/UUN3IZxizS7BTO3svd3lCOJRQ==", + "version": "5.61.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.61.0.tgz", + "integrity": "sha512-50XQ5VdbWrX06mQXhy93WywSFZZGsv3EOjq+lqp6WC2t+j3mb6A9xYVdrRxafvK88vg9k9u+CT4l6D8PEatjKg==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.4.1", - "eslint-visitor-keys": "^3.4.1" + "@typescript-eslint/types": "5.61.0", + "eslint-visitor-keys": "^3.3.0" }, "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "type": "opencollective", @@ -4381,6 +4381,19 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, "node_modules/eslint-visitor-keys": { "version": "3.4.3", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", @@ -4713,6 +4726,15 @@ "node": ">=4.0" } }, + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, "node_modules/esutils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", @@ -7492,6 +7514,12 @@ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "dev": true }, + "node_modules/natural-compare-lite": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", + "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", + "dev": true + }, "node_modules/negotiator": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", @@ -8789,9 +8817,9 @@ "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" }, "node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "version": "7.5.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.2.tgz", + "integrity": "sha512-SoftuTROv/cRjCze/scjGyiDtcUyxw1rgYQSZY7XTmtR5hX+dm76iDbTH8TkLPHCQmlbQVSSbNZCPM2hb0knnQ==", "dependencies": { "lru-cache": "^6.0.0" }, @@ -9558,18 +9586,6 @@ "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.3.0.tgz", "integrity": "sha512-XrHUvV5HpdLmIj4uVMxHggLbFSZYIn7HEWsqePZcI50pco+MPqJ50wMGY794X7AOOhxOBAjbkqfAbEe/QMp2Lw==" }, - "node_modules/ts-api-utils": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.2.tgz", - "integrity": "sha512-Cbu4nIqnEdd+THNEsBdkolnOXhg0I8XteoHaEKgvsxpsbWda4IsUut2c187HxywQCvveojow0Dgw/amxtSKVkQ==", - "dev": true, - "engines": { - "node": ">=16.13.0" - }, - "peerDependencies": { - "typescript": ">=4.2.0" - } - }, "node_modules/ts-mockito": { "version": "2.6.1", "resolved": "https://registry.npmjs.org/ts-mockito/-/ts-mockito-2.6.1.tgz", @@ -10970,9 +10986,9 @@ } }, "@eslint-community/eslint-utils": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", - "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.3.0.tgz", + "integrity": "sha512-v3oplH6FYCULtFuCeqyuTd9D2WKO937Dxdq+GmHOLL72TTRriLxz2VLlNfkZRsvj6PKnOPAtuT6dwrs/pA5DvA==", "dev": true, "requires": { "eslint-visitor-keys": "^3.3.0" @@ -11531,22 +11547,21 @@ } }, "@typescript-eslint/eslint-plugin": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.4.1.tgz", - "integrity": "sha512-3F5PtBzUW0dYlq77Lcqo13fv+58KDwUib3BddilE8ajPJT+faGgxmI9Sw+I8ZS22BYwoir9ZhNXcLi+S+I2bkw==", + "version": "5.61.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.61.0.tgz", + "integrity": "sha512-A5l/eUAug103qtkwccSCxn8ZRwT+7RXWkFECdA4Cvl1dOlDUgTpAOfSEElZn2uSUxhdDpnCdetrf0jvU4qrL+g==", "dev": true, "requires": { - "@eslint-community/regexpp": "^4.5.1", - "@typescript-eslint/scope-manager": "6.4.1", - "@typescript-eslint/type-utils": "6.4.1", - "@typescript-eslint/utils": "6.4.1", - "@typescript-eslint/visitor-keys": "6.4.1", + "@eslint-community/regexpp": "^4.4.0", + "@typescript-eslint/scope-manager": "5.61.0", + "@typescript-eslint/type-utils": "5.61.0", + "@typescript-eslint/utils": "5.61.0", "debug": "^4.3.4", "graphemer": "^1.4.0", - "ignore": "^5.2.4", - "natural-compare": "^1.4.0", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" + "ignore": "^5.2.0", + "natural-compare-lite": "^1.4.0", + "semver": "^7.3.7", + "tsutils": "^3.21.0" }, "dependencies": { "debug": { @@ -11637,25 +11652,25 @@ } }, "@typescript-eslint/scope-manager": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.4.1.tgz", - "integrity": "sha512-p/OavqOQfm4/Hdrr7kvacOSFjwQ2rrDVJRPxt/o0TOWdFnjJptnjnZ+sYDR7fi4OimvIuKp+2LCkc+rt9fIW+A==", + "version": "5.61.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.61.0.tgz", + "integrity": "sha512-W8VoMjoSg7f7nqAROEmTt6LoBpn81AegP7uKhhW5KzYlehs8VV0ZW0fIDVbcZRcaP3aPSW+JZFua+ysQN+m/Nw==", "dev": true, "requires": { - "@typescript-eslint/types": "6.4.1", - "@typescript-eslint/visitor-keys": "6.4.1" + "@typescript-eslint/types": "5.61.0", + "@typescript-eslint/visitor-keys": "5.61.0" } }, "@typescript-eslint/type-utils": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.4.1.tgz", - "integrity": "sha512-7ON8M8NXh73SGZ5XvIqWHjgX2f+vvaOarNliGhjrJnv1vdjG0LVIz+ToYfPirOoBi56jxAKLfsLm40+RvxVVXA==", + "version": "5.61.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.61.0.tgz", + "integrity": "sha512-kk8u//r+oVK2Aj3ph/26XdH0pbAkC2RiSjUYhKD+PExemG4XSjpGFeyZ/QM8lBOa7O8aGOU+/yEbMJgQv/DnCg==", "dev": true, "requires": { - "@typescript-eslint/typescript-estree": "6.4.1", - "@typescript-eslint/utils": "6.4.1", + "@typescript-eslint/typescript-estree": "5.61.0", + "@typescript-eslint/utils": "5.61.0", "debug": "^4.3.4", - "ts-api-utils": "^1.0.1" + "tsutils": "^3.21.0" }, "dependencies": { "debug": { @@ -11676,24 +11691,24 @@ } }, "@typescript-eslint/types": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.4.1.tgz", - "integrity": "sha512-zAAopbNuYu++ijY1GV2ylCsQsi3B8QvfPHVqhGdDcbx/NK5lkqMnCGU53amAjccSpk+LfeONxwzUhDzArSfZJg==", + "version": "5.61.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.61.0.tgz", + "integrity": "sha512-ldyueo58KjngXpzloHUog/h9REmHl59G1b3a5Sng1GfBo14BkS3ZbMEb3693gnP1k//97lh7bKsp6/V/0v1veQ==", "dev": true }, "@typescript-eslint/typescript-estree": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.4.1.tgz", - "integrity": "sha512-xF6Y7SatVE/OyV93h1xGgfOkHr2iXuo8ip0gbfzaKeGGuKiAnzS+HtVhSPx8Www243bwlW8IF7X0/B62SzFftg==", + "version": "5.61.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.61.0.tgz", + "integrity": "sha512-Fud90PxONnnLZ36oR5ClJBLTLfU4pIWBmnvGwTbEa2cXIqj70AEDEmOmpkFComjBZ/037ueKrOdHuYmSFVD7Rw==", "dev": true, "requires": { - "@typescript-eslint/types": "6.4.1", - "@typescript-eslint/visitor-keys": "6.4.1", + "@typescript-eslint/types": "5.61.0", + "@typescript-eslint/visitor-keys": "5.61.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" + "semver": "^7.3.7", + "tsutils": "^3.21.0" }, "dependencies": { "debug": { @@ -11714,28 +11729,29 @@ } }, "@typescript-eslint/utils": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.4.1.tgz", - "integrity": "sha512-F/6r2RieNeorU0zhqZNv89s9bDZSovv3bZQpUNOmmQK1L80/cV4KEu95YUJWi75u5PhboFoKUJBnZ4FQcoqhDw==", + "version": "5.61.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.61.0.tgz", + "integrity": "sha512-mV6O+6VgQmVE6+xzlA91xifndPW9ElFW8vbSF0xCT/czPXVhwDewKila1jOyRwa9AE19zKnrr7Cg5S3pJVrTWQ==", "dev": true, "requires": { - "@eslint-community/eslint-utils": "^4.4.0", - "@types/json-schema": "^7.0.12", - "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "6.4.1", - "@typescript-eslint/types": "6.4.1", - "@typescript-eslint/typescript-estree": "6.4.1", - "semver": "^7.5.4" + "@eslint-community/eslint-utils": "^4.2.0", + "@types/json-schema": "^7.0.9", + "@types/semver": "^7.3.12", + "@typescript-eslint/scope-manager": "5.61.0", + "@typescript-eslint/types": "5.61.0", + "@typescript-eslint/typescript-estree": "5.61.0", + "eslint-scope": "^5.1.1", + "semver": "^7.3.7" } }, "@typescript-eslint/visitor-keys": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.4.1.tgz", - "integrity": "sha512-y/TyRJsbZPkJIZQXrHfdnxVnxyKegnpEvnRGNam7s3TRR2ykGefEWOhaef00/UUN3IZxizS7BTO3svd3lCOJRQ==", + "version": "5.61.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.61.0.tgz", + "integrity": "sha512-50XQ5VdbWrX06mQXhy93WywSFZZGsv3EOjq+lqp6WC2t+j3mb6A9xYVdrRxafvK88vg9k9u+CT4l6D8PEatjKg==", "dev": true, "requires": { - "@typescript-eslint/types": "6.4.1", - "eslint-visitor-keys": "^3.4.1" + "@typescript-eslint/types": "5.61.0", + "eslint-visitor-keys": "^3.3.0" } }, "abort-controller": { @@ -13947,6 +13963,16 @@ } } }, + "eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + } + }, "eslint-visitor-keys": { "version": "3.4.3", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", @@ -13998,6 +14024,12 @@ } } }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true + }, "esutils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", @@ -16063,6 +16095,12 @@ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "dev": true }, + "natural-compare-lite": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", + "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", + "dev": true + }, "negotiator": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", @@ -17003,9 +17041,9 @@ "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" }, "semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "version": "7.5.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.2.tgz", + "integrity": "sha512-SoftuTROv/cRjCze/scjGyiDtcUyxw1rgYQSZY7XTmtR5hX+dm76iDbTH8TkLPHCQmlbQVSSbNZCPM2hb0knnQ==", "requires": { "lru-cache": "^6.0.0" }, @@ -17558,13 +17596,6 @@ "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.3.0.tgz", "integrity": "sha512-XrHUvV5HpdLmIj4uVMxHggLbFSZYIn7HEWsqePZcI50pco+MPqJ50wMGY794X7AOOhxOBAjbkqfAbEe/QMp2Lw==" }, - "ts-api-utils": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.2.tgz", - "integrity": "sha512-Cbu4nIqnEdd+THNEsBdkolnOXhg0I8XteoHaEKgvsxpsbWda4IsUut2c187HxywQCvveojow0Dgw/amxtSKVkQ==", - "dev": true, - "requires": {} - }, "ts-mockito": { "version": "2.6.1", "resolved": "https://registry.npmjs.org/ts-mockito/-/ts-mockito-2.6.1.tgz", diff --git a/package.json b/package.json index a1fb0570b..1f6a520d9 100644 --- a/package.json +++ b/package.json @@ -69,7 +69,7 @@ "@types/validator": "^13.1.4", "@types/vscode": "^1.39.0", "@types/xml2js": "^0.4.3", - "@typescript-eslint/eslint-plugin": "^6.4.1", + "@typescript-eslint/eslint-plugin": "^5.54.1", "@typescript-eslint/parser": "^5.54.1", "autorest": "^3.6.0", "azure-storage": "^2.10.3", From b6132e0973d2426435b68f7227bd967b493c840e Mon Sep 17 00:00:00 2001 From: Wei Wei Date: Tue, 22 Aug 2023 06:09:15 +0000 Subject: [PATCH 188/297] Support blob tier Cold (#2112) --- ChangeLog.md | 5 +++ README.md | 4 +- src/blob/generated/artifacts/models.ts | 22 +++++---- src/blob/handlers/BlockBlobHandler.ts | 3 ++ src/blob/persistence/LokiBlobMetadataStore.ts | 8 +++- src/blob/persistence/SqlBlobMetadataStore.ts | 8 +++- swagger/blob-storage-2021-10-04.json | 12 +++-- swagger/blob.md | 20 +++++---- swagger/queue-storage.json | 2 - tests/blob/apis/blob.test.ts | 45 +++++++++++++++++++ 10 files changed, 99 insertions(+), 30 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index 206be9982..5aa7ddd96 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -4,7 +4,12 @@ ## Upcoming Release +Blob: + +- Support blob new access tier Cold + Table: + - Fixed the errorCode returned, when malformed Etag is provided for table Update/Delete calls. (issue #2013) ## 2023.08 Version 3.26.0 diff --git a/README.md b/README.md index 40b3561cd..8db16d5ba 100644 --- a/README.md +++ b/README.md @@ -467,7 +467,8 @@ Azurite will refresh customized account name and key from environment variable e > Note. Use `export` keyword to set environment variable in Linux like environment, `set` in Windows. > Note. When changing storage account name, keep these rules in mind as same as [Azure Storage Account](https://learn.microsoft.com/en-us/azure/storage/common/storage-account-overview#storage-account-name): -> - Storage account names must be between 3 and 24 characters in length and may contain numbers and lowercase letters only. +> +> - Storage account names must be between 3 and 24 characters in length and may contain numbers and lowercase letters only. ### Customized Metadata Storage by External Database (Preview) @@ -977,7 +978,6 @@ Detailed support matrix: - Sync copy blob by access source with oauth - Encryption Scope - Get Page Ranges Continuation Token - - Cold Tier Latest version supports for **2023-08-03** API version **queue** service. Detailed support matrix: diff --git a/src/blob/generated/artifacts/models.ts b/src/blob/generated/artifacts/models.ts index d46d3a924..e7f65d7a3 100644 --- a/src/blob/generated/artifacts/models.ts +++ b/src/blob/generated/artifacts/models.ts @@ -141,12 +141,13 @@ export interface BlobPropertiesInternal { remainingRetentionDays?: number; /** * Possible values include: 'P4', 'P6', 'P10', 'P15', 'P20', 'P30', 'P40', 'P50', 'P60', 'P70', - * 'P80', 'Hot', 'Cool', 'Archive', 'Premium' + * 'P80', 'Hot', 'Cool', 'Archive', 'Premium', 'Cold' */ accessTier?: AccessTier; accessTierInferred?: boolean; /** - * Possible values include: 'rehydrate-pending-to-hot', 'rehydrate-pending-to-cool' + * Possible values include: 'rehydrate-pending-to-hot', 'rehydrate-pending-to-cool', + * 'rehydrate-pending-to-cold' */ archiveStatus?: ArchiveStatus; customerProvidedKeySha256?: string; @@ -2049,7 +2050,7 @@ export interface BlobStartCopyFromURLOptionalParams { /** * Optional. Indicates the tier to be set on the blob. Possible values include: 'P4', 'P6', * 'P10', 'P15', 'P20', 'P30', 'P40', 'P50', 'P60', 'P70', 'P80', 'Hot', 'Cool', 'Archive', - * 'Premium' + * 'Premium', 'Cold' */ tier?: AccessTier; /** @@ -2120,7 +2121,7 @@ export interface BlobCopyFromURLOptionalParams { /** * Optional. Indicates the tier to be set on the blob. Possible values include: 'P4', 'P6', * 'P10', 'P15', 'P20', 'P30', 'P40', 'P50', 'P60', 'P70', 'P80', 'Hot', 'Cool', 'Archive', - * 'Premium' + * 'Premium', 'Cold' */ tier?: AccessTier; /** @@ -3011,7 +3012,7 @@ export interface BlockBlobUploadOptionalParams { /** * Optional. Indicates the tier to be set on the blob. Possible values include: 'P4', 'P6', * 'P10', 'P15', 'P20', 'P30', 'P40', 'P50', 'P60', 'P70', 'P80', 'Hot', 'Cool', 'Archive', - * 'Premium' + * 'Premium', 'Cold' */ tier?: AccessTier; /** @@ -3089,7 +3090,7 @@ export interface BlockBlobPutBlobFromUrlOptionalParams { /** * Optional. Indicates the tier to be set on the blob. Possible values include: 'P4', 'P6', * 'P10', 'P15', 'P20', 'P30', 'P40', 'P50', 'P60', 'P70', 'P80', 'Hot', 'Cool', 'Archive', - * 'Premium' + * 'Premium', 'Cold' */ tier?: AccessTier; /** @@ -3263,7 +3264,7 @@ export interface BlockBlobCommitBlockListOptionalParams { /** * Optional. Indicates the tier to be set on the blob. Possible values include: 'P4', 'P6', * 'P10', 'P15', 'P20', 'P30', 'P40', 'P50', 'P60', 'P70', 'P80', 'Hot', 'Cool', 'Archive', - * 'Premium' + * 'Premium', 'Cold' */ tier?: AccessTier; /** @@ -7020,7 +7021,7 @@ export enum LeaseStatusType { /** * Defines values for AccessTier. * Possible values include: 'P4', 'P6', 'P10', 'P15', 'P20', 'P30', 'P40', 'P50', 'P60', 'P70', - * 'P80', 'Hot', 'Cool', 'Archive', 'Premium' + * 'P80', 'Hot', 'Cool', 'Archive', 'Premium', 'Cold' * @readonly * @enum {string} */ @@ -7040,17 +7041,20 @@ export enum AccessTier { Cool = 'Cool', Archive = 'Archive', Premium = 'Premium', + Cold = 'Cold', } /** * Defines values for ArchiveStatus. - * Possible values include: 'rehydrate-pending-to-hot', 'rehydrate-pending-to-cool' + * Possible values include: 'rehydrate-pending-to-hot', 'rehydrate-pending-to-cool', + * 'rehydrate-pending-to-cold' * @readonly * @enum {string} */ export enum ArchiveStatus { RehydratePendingToHot = 'rehydrate-pending-to-hot', RehydratePendingToCool = 'rehydrate-pending-to-cool', + RehydratePendingToCold = 'rehydrate-pending-to-cold', } /** diff --git a/src/blob/handlers/BlockBlobHandler.ts b/src/blob/handlers/BlockBlobHandler.ts index b80951b62..cc1948ac6 100644 --- a/src/blob/handlers/BlockBlobHandler.ts +++ b/src/blob/handlers/BlockBlobHandler.ts @@ -466,6 +466,9 @@ export default class BlockBlobHandler if (tier === Models.AccessTier.Archive.toLowerCase()) { return Models.AccessTier.Archive; } + if (tier === Models.AccessTier.Cold.toLowerCase()) { + return Models.AccessTier.Cold; + } return undefined; } diff --git a/src/blob/persistence/LokiBlobMetadataStore.ts b/src/blob/persistence/LokiBlobMetadataStore.ts index a425badbc..ebf53cbfc 100644 --- a/src/blob/persistence/LokiBlobMetadataStore.ts +++ b/src/blob/persistence/LokiBlobMetadataStore.ts @@ -2184,7 +2184,8 @@ export default class LokiBlobMetadataStore if ( (tier === Models.AccessTier.Archive || tier === Models.AccessTier.Cool || - tier === Models.AccessTier.Hot) && + tier === Models.AccessTier.Hot || + tier === Models.AccessTier.Cold) && doc.properties.blobType === Models.BlobType.BlockBlob ) { // Block blob @@ -2194,7 +2195,7 @@ export default class LokiBlobMetadataStore // Archive -> Coo/Hot will return 202 if ( doc.properties.accessTier === Models.AccessTier.Archive && - (tier === Models.AccessTier.Cool || tier === Models.AccessTier.Hot) + (tier === Models.AccessTier.Cool || tier === Models.AccessTier.Hot || tier === Models.AccessTier.Cold) ) { responseCode = 202; } @@ -3418,6 +3419,9 @@ export default class LokiBlobMetadataStore if (tier === Models.AccessTier.Archive.toLowerCase()) { return Models.AccessTier.Archive; } + if (tier === Models.AccessTier.Cold.toLowerCase()) { + return Models.AccessTier.Cold; + } return undefined; } } diff --git a/src/blob/persistence/SqlBlobMetadataStore.ts b/src/blob/persistence/SqlBlobMetadataStore.ts index dfd596237..ad0d96264 100644 --- a/src/blob/persistence/SqlBlobMetadataStore.ts +++ b/src/blob/persistence/SqlBlobMetadataStore.ts @@ -2726,7 +2726,8 @@ export default class SqlBlobMetadataStore implements IBlobMetadataStore { if ( (tier === Models.AccessTier.Archive || tier === Models.AccessTier.Cool || - tier === Models.AccessTier.Hot) && + tier === Models.AccessTier.Hot || + tier === Models.AccessTier.Cold) && blobType === Models.BlobType.BlockBlob ) { // Block blob @@ -2736,7 +2737,7 @@ export default class SqlBlobMetadataStore implements IBlobMetadataStore { // Archive -> Coo/Hot will return 202 if ( accessTier === Models.AccessTier.Archive && - (tier === Models.AccessTier.Cool || tier === Models.AccessTier.Hot) + (tier === Models.AccessTier.Cool || tier === Models.AccessTier.Hot || tier === Models.AccessTier.Cold) ) { responseCode = 202; } @@ -3441,6 +3442,9 @@ export default class SqlBlobMetadataStore implements IBlobMetadataStore { if (tier === Models.AccessTier.Archive.toLowerCase()) { return Models.AccessTier.Archive; } + if (tier === Models.AccessTier.Cold.toLowerCase()) { + return Models.AccessTier.Cold; + } return undefined; } } diff --git a/swagger/blob-storage-2021-10-04.json b/swagger/blob-storage-2021-10-04.json index 463253aa8..ec52a2132 100644 --- a/swagger/blob-storage-2021-10-04.json +++ b/swagger/blob-storage-2021-10-04.json @@ -10004,7 +10004,8 @@ "Hot", "Cool", "Archive", - "Premium" + "Premium", + "Cold" ], "x-ms-enum": { "name": "AccessTier", @@ -10015,7 +10016,8 @@ "type": "string", "enum": [ "rehydrate-pending-to-hot", - "rehydrate-pending-to-cool" + "rehydrate-pending-to-cool", + "rehydrate-pending-to-cold" ], "x-ms-enum": { "name": "ArchiveStatus", @@ -11514,7 +11516,8 @@ "Hot", "Cool", "Archive", - "Premium" + "Premium", + "Cold" ], "x-ms-enum": { "name": "AccessTier", @@ -11544,7 +11547,8 @@ "Hot", "Cool", "Archive", - "Premium" + "Premium", + "Cold" ], "x-ms-enum": { "name": "AccessTier", diff --git a/swagger/blob.md b/swagger/blob.md index d01d460f7..118be0ec2 100644 --- a/swagger/blob.md +++ b/swagger/blob.md @@ -26,7 +26,7 @@ enum-types: true 4. Change "Name" definition in "BlobItemInternal" from: "Name": { - "$ref": "#/definitions/BlobName" + "$ref": "#/definitions/BlobName" } to "Name": { @@ -46,19 +46,21 @@ enum-types: true "type": "string" } -9. Make `ApiVersionParameter` parameter from required to optional. +8. Make `ApiVersionParameter` parameter from required to optional. -10. Add `x-ms-creation-time` to Blob_Download API response. +9. Add `x-ms-creation-time` to Blob_Download API response. -11. Add "Premium" to "AccessTierRequired" enum and "AccessTierOptional" enum. +10. Add "Premium" to "AccessTierRequired" enum and "AccessTierOptional" enum. Add "Mutable" to "ImmutabilityPolicyMode" at around line #11994 -12. Add spec for: Blob_GetAccountInfoWithHead, Container_GetAccountInfoWithHead and Service_GetAccountInfoWithHead. +11. Add spec for: Blob_GetAccountInfoWithHead, Container_GetAccountInfoWithHead and Service_GetAccountInfoWithHead. + +12. Change return code from '200' to '202' for service_submitbatch. -13. Change return code from '200' to '202' for service_submitbatch. +13. Change "AllowedHeaders" and "ExposedHeaders" to from required to optional. -14. Change "AllowedHeaders" and "ExposedHeaders" to from required to optional. +14. Remove "Container_Rename" section. -15. Remove "Container_Rename" section. +15. Add "x-ms-delete-type-permanent" to "Blob_Delete" API response. -16. Add "x-ms-delete-type-permanent" to "Blob_Delete" API response. +16. Add "Cold" to "AccessTier", "AccessTierRequired", "AccessTierOptional"; and add "rehydrate-pending-to-cold" to "ArchiveStatus". (can be removed when upgrade to new API version.) diff --git a/swagger/queue-storage.json b/swagger/queue-storage.json index 43f1efdf1..a12935b32 100644 --- a/swagger/queue-storage.json +++ b/swagger/queue-storage.json @@ -1970,8 +1970,6 @@ "in": "query", "required": true, "type": "integer", - "minimum": 0, - "maximum": 604800, "x-ms-parameter-location": "method", "description": "Optional. Specifies the new visibility timeout value, in seconds, relative to server time. The default value is 30 seconds. A specified value must be larger than or equal to 1 second, and cannot be larger than 7 days, or larger than 2 hours on REST protocol versions prior to version 2011-08-18. The visibility timeout of a message can be set to a value later than the expiry time." }, diff --git a/tests/blob/apis/blob.test.ts b/tests/blob/apis/blob.test.ts index 55202a8ba..9dc10a62e 100644 --- a/tests/blob/apis/blob.test.ts +++ b/tests/blob/apis/blob.test.ts @@ -744,6 +744,51 @@ describe("BlobAPIs", () => { ); }); + it("setTier set default to cold @loki @sql", async () => { + // Created Blob should have accessTierInferred as true in Get/list + let properties = await blockBlobClient.getProperties(); + assert.equal(properties.accessTier!.toLowerCase(), "hot"); + assert.equal(true, properties.accessTierInferred); + + let listResult = ( + await containerClient + .listBlobsFlat({ + prefix: blobName + }) + .byPage() + .next() + ).value; + assert.equal( + true, + (await listResult).segment.blobItems[0].properties.accessTierInferred + ); + + const result = await blockBlobClient.setAccessTier("Cold"); + assert.equal( + result._response.request.headers.get("x-ms-client-request-id"), + result.clientRequestId + ); + + // After setTier, Blob should have accessTierInferred as false in Get + properties = await blockBlobClient.getProperties(); + assert.equal(properties.accessTier!.toLowerCase(), "cold"); + assert.equal(false, properties.accessTierInferred); + + // After setTier, Blob should have accessTierInferred as undefined in list + listResult = ( + await containerClient + .listBlobsFlat({ + prefix: blobName + }) + .byPage() + .next() + ).value; + assert.equal( + undefined, + (await listResult).segment.blobItems[0].properties.accessTierInferred + ); + }); + it("setTier set archive to hot @loki @sql", async () => { await blockBlobClient.setAccessTier("Archive"); let properties = await blockBlobClient.getProperties(); From 69be5a55c9cdb56d52e1c917209b1beb297fa17e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20=C5=A0tekl?= Date: Tue, 22 Aug 2023 08:47:30 +0200 Subject: [PATCH 189/297] Fix validation of Blob SAS token when using the second key for an account in `AZURITE_ACCOUNTS` (#2113) * Add failing tests * Fix wrong validation of SAS token using the second key * Update changelog * Fix additional occurrences of the same issue * Rename variable --------- Co-authored-by: Wei Wei --- ChangeLog.md | 1 + .../authentication/AccountSASAuthenticator.ts | 2 +- .../authentication/BlobSASAuthenticator.ts | 2 +- .../authentication/QueueSASAuthenticator.ts | 2 +- .../authentication/AccountSASAuthenticator.ts | 2 +- .../authentication/TableSASAuthenticator.ts | 2 +- tests/blob/sas.test.ts | 122 +++++++++++++++++- 7 files changed, 127 insertions(+), 6 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index 5aa7ddd96..2d5635be9 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -6,6 +6,7 @@ Blob: +- Fix validation of Blob SAS token when using the second key for an account in `AZURITE_ACCOUNTS` - Support blob new access tier Cold Table: diff --git a/src/blob/authentication/AccountSASAuthenticator.ts b/src/blob/authentication/AccountSASAuthenticator.ts index 0cce278b1..48b850b07 100644 --- a/src/blob/authentication/AccountSASAuthenticator.ts +++ b/src/blob/authentication/AccountSASAuthenticator.ts @@ -134,7 +134,7 @@ export default class AccountSASAuthenticator implements IAuthenticator { context.contextId! ); - const sig2Pass = sig2 !== signature; + const sig2Pass = sig2 === signature; this.logger.info( `AccountSASAuthenticator:validate() Signature based on key2 validation ${ sig2Pass ? "passed" : "failed" diff --git a/src/blob/authentication/BlobSASAuthenticator.ts b/src/blob/authentication/BlobSASAuthenticator.ts index d61f43ce8..ac848b0f8 100644 --- a/src/blob/authentication/BlobSASAuthenticator.ts +++ b/src/blob/authentication/BlobSASAuthenticator.ts @@ -276,7 +276,7 @@ export default class BlobSASAuthenticator implements IAuthenticator { context.contextId! ); - const sig2Pass = sig2 !== signature; + const sig2Pass = sig2 === signature; this.logger.info( `BlobSASAuthenticator:validate() Signature based on key2 validation ${ sig2Pass ? "passed" : "failed" diff --git a/src/queue/authentication/QueueSASAuthenticator.ts b/src/queue/authentication/QueueSASAuthenticator.ts index 235e06f3d..463e20a67 100644 --- a/src/queue/authentication/QueueSASAuthenticator.ts +++ b/src/queue/authentication/QueueSASAuthenticator.ts @@ -154,7 +154,7 @@ export default class QueueSASAuthenticator implements IAuthenticator { context.contextID! ); - const sig2Pass = sig2 !== signature; + const sig2Pass = sig2 === signature; this.logger.info( `QueueSASAuthenticator:validate() Signature based on key2 validation ${ sig2Pass ? "passed" : "failed" diff --git a/src/table/authentication/AccountSASAuthenticator.ts b/src/table/authentication/AccountSASAuthenticator.ts index 26c3c75b3..e7ffd9e9a 100644 --- a/src/table/authentication/AccountSASAuthenticator.ts +++ b/src/table/authentication/AccountSASAuthenticator.ts @@ -125,7 +125,7 @@ export default class AccountSASAuthenticator implements IAuthenticator { context.contextID! ); - const sig2Pass = sig2 !== signature; + const sig2Pass = sig2 === signature; this.logger.info( `AccountSASAuthenticator:validate() Signature based on key2 validation ${ sig2Pass ? "passed" : "failed" diff --git a/src/table/authentication/TableSASAuthenticator.ts b/src/table/authentication/TableSASAuthenticator.ts index aed9a367a..a237bd626 100644 --- a/src/table/authentication/TableSASAuthenticator.ts +++ b/src/table/authentication/TableSASAuthenticator.ts @@ -155,7 +155,7 @@ export default class TableSASAuthenticator implements IAuthenticator { context.contextID! ); - const sig2Pass = sig2 !== signature; + const sig2Pass = sig2 === signature; this.logger.info( `TableSASAuthenticator:validate() Signature based on key2 validation ${ sig2Pass ? "passed" : "failed" diff --git a/tests/blob/sas.test.ts b/tests/blob/sas.test.ts index ef368492f..39bfa441f 100644 --- a/tests/blob/sas.test.ts +++ b/tests/blob/sas.test.ts @@ -30,6 +30,8 @@ const EMULATOR_ACCOUNT2_NAME = "devstoreaccount2"; const EMULATOR_ACCOUNT2_KEY_STR = "MTAwCjE2NQoyMjUKMTAzCjIxOAoyNDEKNDAKNzgKMTkxCjE3OAoyMTQKMTY5CjIxMwo2MQoyNTIKMTQxCg=="; +const EMULATOR_ACCOUNT_KEY2_STR = "testing_key"; + // Set true to enable debug log configLogger(false); @@ -37,7 +39,7 @@ describe("Shared Access Signature (SAS) authentication", () => { // Setup two accounts for validating cross-account copy operations process.env[ "AZURITE_ACCOUNTS" - ] = `${EMULATOR_ACCOUNT_NAME}:${EMULATOR_ACCOUNT_KEY_STR};${EMULATOR_ACCOUNT2_NAME}:${EMULATOR_ACCOUNT2_KEY_STR}`; + ] = `${EMULATOR_ACCOUNT_NAME}:${EMULATOR_ACCOUNT_KEY_STR}:${EMULATOR_ACCOUNT_KEY2_STR};${EMULATOR_ACCOUNT2_NAME}:${EMULATOR_ACCOUNT2_KEY_STR}`; const factory = new BlobTestServerFactory(); const server = factory.createServer(); @@ -58,6 +60,36 @@ describe("Shared Access Signature (SAS) authentication", () => { ) ); + const serviceClientSecondKey = new BlobServiceClient( + baseURL, + newPipeline( + new StorageSharedKeyCredential( + EMULATOR_ACCOUNT_NAME, + EMULATOR_ACCOUNT_KEY2_STR + ), + { + retryOptions: { maxTries: 1 }, + // Make sure socket is closed once the operation is done. + keepAliveOptions: { enable: false } + } + ) + ); + + const serviceClientInvalid = new BlobServiceClient( + baseURL, + newPipeline( + new StorageSharedKeyCredential( + EMULATOR_ACCOUNT_NAME, + "invalidKey" + ), + { + retryOptions: { maxTries: 1 }, + // Make sure socket is closed once the operation is done. + keepAliveOptions: { enable: false } + } + ) + ); + const baseURL2 = `http://${server.config.host}:${server.config.port}/devstoreaccount2`; const serviceClient2 = new BlobServiceClient( baseURL2, @@ -676,6 +708,94 @@ describe("Shared Access Signature (SAS) authentication", () => { await containerClient.delete(); }); + it("generateBlobSASQueryParameters should NOT work for blob using unknown key when the account has second key provided in AZURITE_ACCOUNTS @loki @sql", async () => { + const now = new Date(); + now.setMinutes(now.getMinutes() - 5); // Skip clock skew with server + + const tmr = new Date(); + tmr.setDate(tmr.getDate() + 1); + + // By default, credential is always the last element of pipeline factories + const factories = (serviceClientInvalid as any).pipeline.factories; + const storageSharedKeyCredential = factories[factories.length - 1]; + + const containerName = getUniqueName("container"); + const containerClient = serviceClient.getContainerClient(containerName); + await containerClient.create(); + + const containerSAS = generateBlobSASQueryParameters( + { + containerName, + expiresOn: tmr, + ipRange: { start: "0.0.0.0", end: "255.255.255.255" }, + permissions: ContainerSASPermissions.parse("racwdl"), + protocol: SASProtocol.HttpsAndHttp, + startsOn: now, + version: "2016-05-31" + }, + storageSharedKeyCredential as StorageSharedKeyCredential + ); + + const sasURL = `${containerClient.url}?${containerSAS}`; + const containerClientWithSAS = new ContainerClient( + sasURL, + newPipeline(new AnonymousCredential()) + ); + + let error; + try { + await containerClientWithSAS.getBlobClient('blob').deleteIfExists(); + } catch (err) { + error = err; + } finally { + try { + await containerClient.delete(); + } catch (error2) { + /* Noop */ + } + } + + assert.ok(error); + }); + + it("generateBlobSASQueryParameters should work for blob using the second key provided in AZURITE_ACCOUNTS @loki @sql", async () => { + const now = new Date(); + now.setMinutes(now.getMinutes() - 5); // Skip clock skew with server + + const tmr = new Date(); + tmr.setDate(tmr.getDate() + 1); + + // By default, credential is always the last element of pipeline factories + const factories = (serviceClientSecondKey as any).pipeline.factories; + const storageSharedKeyCredential = factories[factories.length - 1]; + + const containerName = getUniqueName("container"); + const containerClient = serviceClient.getContainerClient(containerName); + await containerClient.create(); + + const containerSAS = generateBlobSASQueryParameters( + { + containerName, + expiresOn: tmr, + ipRange: { start: "0.0.0.0", end: "255.255.255.255" }, + permissions: ContainerSASPermissions.parse("racwdl"), + protocol: SASProtocol.HttpsAndHttp, + startsOn: now, + version: "2016-05-31" + }, + storageSharedKeyCredential as StorageSharedKeyCredential + ); + + const sasURL = `${containerClient.url}?${containerSAS}`; + const containerClientWithSAS = new ContainerClient( + sasURL, + newPipeline(new AnonymousCredential()) + ); + + await containerClientWithSAS.getBlobClient('blob').deleteIfExists(); + await containerClient.delete(); + }); + it("generateBlobSASQueryParameters should work for page blob with original headers @loki @sql", async () => { const now = new Date(); now.setMinutes(now.getMinutes() - 5); // Skip clock skew with server From 84dff6f69552021c52ae929d4743c1bf454177ee Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 23 Aug 2023 09:53:00 +0800 Subject: [PATCH 190/297] Bump @types/morgan from 1.9.4 to 1.9.5 (#2132) Bumps [@types/morgan](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/morgan) from 1.9.4 to 1.9.5. - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/morgan) --- updated-dependencies: - dependency-name: "@types/morgan" dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 446128c5f..ead81ed6d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1473,9 +1473,9 @@ "dev": true }, "node_modules/@types/morgan": { - "version": "1.9.4", - "resolved": "https://registry.npmjs.org/@types/morgan/-/morgan-1.9.4.tgz", - "integrity": "sha512-cXoc4k+6+YAllH3ZHmx4hf7La1dzUk6keTR4bF4b4Sc0mZxU/zK4wO7l+ZzezXm/jkYj/qC+uYGZrarZdIVvyQ==", + "version": "1.9.5", + "resolved": "https://registry.npmjs.org/@types/morgan/-/morgan-1.9.5.tgz", + "integrity": "sha512-5TgfIWm0lcTGnbCZExwc19dCOMOMmAiiBZQj8Ko3NRxsVDgRxf+AEGRQTqNVA5Yh2xfdWp4clbAEMbYP+jkOqg==", "dev": true, "dependencies": { "@types/node": "*" @@ -11427,9 +11427,9 @@ "dev": true }, "@types/morgan": { - "version": "1.9.4", - "resolved": "https://registry.npmjs.org/@types/morgan/-/morgan-1.9.4.tgz", - "integrity": "sha512-cXoc4k+6+YAllH3ZHmx4hf7La1dzUk6keTR4bF4b4Sc0mZxU/zK4wO7l+ZzezXm/jkYj/qC+uYGZrarZdIVvyQ==", + "version": "1.9.5", + "resolved": "https://registry.npmjs.org/@types/morgan/-/morgan-1.9.5.tgz", + "integrity": "sha512-5TgfIWm0lcTGnbCZExwc19dCOMOMmAiiBZQj8Ko3NRxsVDgRxf+AEGRQTqNVA5Yh2xfdWp4clbAEMbYP+jkOqg==", "dev": true, "requires": { "@types/node": "*" From 48a6068cea28db65987eee8e257641868becdf01 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 25 Aug 2023 09:48:15 +0800 Subject: [PATCH 191/297] Bump typescript from 5.1.6 to 5.2.2 (#2136) Bumps [typescript](https://github.com/Microsoft/TypeScript) from 5.1.6 to 5.2.2. - [Release notes](https://github.com/Microsoft/TypeScript/releases) - [Commits](https://github.com/Microsoft/TypeScript/commits) --- updated-dependencies: - dependency-name: typescript dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index ead81ed6d..3f0e19f9c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9808,9 +9808,9 @@ } }, "node_modules/typescript": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz", - "integrity": "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==", + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz", + "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==", "dev": true, "bin": { "tsc": "bin/tsc", @@ -17755,9 +17755,9 @@ } }, "typescript": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz", - "integrity": "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==", + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz", + "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==", "dev": true }, "uc.micro": { From 24c088da7cdc073e644299f38a44d53cb79f5408 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 28 Aug 2023 16:32:38 +0800 Subject: [PATCH 192/297] Bump @types/lokijs from 1.5.8 to 1.5.9 (#2137) Bumps [@types/lokijs](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/lokijs) from 1.5.8 to 1.5.9. - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/lokijs) --- updated-dependencies: - dependency-name: "@types/lokijs" dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 3f0e19f9c..b4081c26f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1449,9 +1449,9 @@ } }, "node_modules/@types/lokijs": { - "version": "1.5.8", - "resolved": "https://registry.npmjs.org/@types/lokijs/-/lokijs-1.5.8.tgz", - "integrity": "sha512-HN4vmoYHqF0mx91Cci6xaH1uN1JAMbakqNFXggpbd2L/RTUMrvx//dJTJehEtEF+a/qXfLbVSeO6p3Oegx/hDg==", + "version": "1.5.9", + "resolved": "https://registry.npmjs.org/@types/lokijs/-/lokijs-1.5.9.tgz", + "integrity": "sha512-oucHtUUilYB922RtwBqk9vpXlxim7tqHOdJEHKPX9gM3p1K2LEoqeMGsgi19Rg2Vs11TA/RvkAJBLhoJ7T6HUg==", "dev": true }, "node_modules/@types/mime": { @@ -11403,9 +11403,9 @@ } }, "@types/lokijs": { - "version": "1.5.8", - "resolved": "https://registry.npmjs.org/@types/lokijs/-/lokijs-1.5.8.tgz", - "integrity": "sha512-HN4vmoYHqF0mx91Cci6xaH1uN1JAMbakqNFXggpbd2L/RTUMrvx//dJTJehEtEF+a/qXfLbVSeO6p3Oegx/hDg==", + "version": "1.5.9", + "resolved": "https://registry.npmjs.org/@types/lokijs/-/lokijs-1.5.9.tgz", + "integrity": "sha512-oucHtUUilYB922RtwBqk9vpXlxim7tqHOdJEHKPX9gM3p1K2LEoqeMGsgi19Rg2Vs11TA/RvkAJBLhoJ7T6HUg==", "dev": true }, "@types/mime": { From 3be18ea5ab6f8a5f42c0df8dad6c1208561373ae Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 29 Aug 2023 09:50:25 +0800 Subject: [PATCH 193/297] Bump rcedit from 3.1.0 to 4.0.0 (#2143) Bumps [rcedit](https://github.com/electron/node-rcedit) from 3.1.0 to 4.0.0. - [Release notes](https://github.com/electron/node-rcedit/releases) - [Changelog](https://github.com/electron/node-rcedit/blob/main/.releaserc.json) - [Commits](https://github.com/electron/node-rcedit/compare/v3.1.0...v4.0.0) --- updated-dependencies: - dependency-name: rcedit dependency-type: direct:development update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 16 ++++++++-------- package.json | 2 +- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/package-lock.json b/package-lock.json index b4081c26f..96b15d074 100644 --- a/package-lock.json +++ b/package-lock.json @@ -77,7 +77,7 @@ "mocha": "^5.2.0", "pkg": "^5.3.0", "prettier": "^3.0.0", - "rcedit": "^3.0.1", + "rcedit": "^4.0.0", "ts-mockito": "^2.6.1", "ts-node": "^10.0.0", "typescript": "^5.0.3", @@ -8470,15 +8470,15 @@ } }, "node_modules/rcedit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/rcedit/-/rcedit-3.1.0.tgz", - "integrity": "sha512-WRlRdY1qZbu1L11DklT07KuHfRk42l0NFFJdaExELEu4fEQ982bP5Z6OWGPj/wLLIuKRQDCxZJGAwoFsxhZhNA==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/rcedit/-/rcedit-4.0.0.tgz", + "integrity": "sha512-OIPwu2e0b2WF4urFMcdiYUZGjmwh5pa52Mt847MK7ovxHkjpiPaI4Ov2atjeKTNFo4Tas0G31Qm7K21t87hp+g==", "dev": true, "dependencies": { "cross-spawn-windows-exe": "^1.1.0" }, "engines": { - "node": ">= 10.0.0" + "node": ">= 14.0.0" } }, "node_modules/read": { @@ -16773,9 +16773,9 @@ } }, "rcedit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/rcedit/-/rcedit-3.1.0.tgz", - "integrity": "sha512-WRlRdY1qZbu1L11DklT07KuHfRk42l0NFFJdaExELEu4fEQ982bP5Z6OWGPj/wLLIuKRQDCxZJGAwoFsxhZhNA==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/rcedit/-/rcedit-4.0.0.tgz", + "integrity": "sha512-OIPwu2e0b2WF4urFMcdiYUZGjmwh5pa52Mt847MK7ovxHkjpiPaI4Ov2atjeKTNFo4Tas0G31Qm7K21t87hp+g==", "dev": true, "requires": { "cross-spawn-windows-exe": "^1.1.0" diff --git a/package.json b/package.json index 1f6a520d9..952136c2f 100644 --- a/package.json +++ b/package.json @@ -82,7 +82,7 @@ "mocha": "^5.2.0", "pkg": "^5.3.0", "prettier": "^3.0.0", - "rcedit": "^3.0.1", + "rcedit": "^4.0.0", "ts-mockito": "^2.6.1", "ts-node": "^10.0.0", "typescript": "^5.0.3", From c28816a5c4498283a301c11f90a70707eed8409b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 29 Aug 2023 10:28:31 +0800 Subject: [PATCH 194/297] Bump eslint from 8.47.0 to 8.48.0 (#2141) Bumps [eslint](https://github.com/eslint/eslint) from 8.47.0 to 8.48.0. - [Release notes](https://github.com/eslint/eslint/releases) - [Changelog](https://github.com/eslint/eslint/blob/main/CHANGELOG.md) - [Commits](https://github.com/eslint/eslint/compare/v8.47.0...v8.48.0) --- updated-dependencies: - dependency-name: eslint dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/package-lock.json b/package-lock.json index 96b15d074..b4dac3b79 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1038,9 +1038,9 @@ } }, "node_modules/@eslint/js": { - "version": "8.47.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.47.0.tgz", - "integrity": "sha512-P6omY1zv5MItm93kLM8s2vr1HICJH8v0dvddDhysbIuZ+vcjOHg5Zbkf1mTkcmi2JA9oBG2anOkRnW8WJTS8Og==", + "version": "8.48.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.48.0.tgz", + "integrity": "sha512-ZSjtmelB7IJfWD2Fvb7+Z+ChTIKWq6kjda95fLcQKNS5aheVHn4IkfgRQE3sIIzTcSLwLcLZUD9UBt+V7+h+Pw==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -4328,15 +4328,15 @@ } }, "node_modules/eslint": { - "version": "8.47.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.47.0.tgz", - "integrity": "sha512-spUQWrdPt+pRVP1TTJLmfRNJJHHZryFmptzcafwSvHsceV81djHOdnEeDmkdotZyLNjDhrOasNK8nikkoG1O8Q==", + "version": "8.48.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.48.0.tgz", + "integrity": "sha512-sb6DLeIuRXxeM1YljSe1KEx9/YYeZFQWcV8Rq9HfigmdDEugjLEVEa1ozDjL6YDjBpQHPJxJzze+alxi4T3OLg==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", "@eslint/eslintrc": "^2.1.2", - "@eslint/js": "^8.47.0", + "@eslint/js": "8.48.0", "@humanwhocodes/config-array": "^0.11.10", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", @@ -11065,9 +11065,9 @@ } }, "@eslint/js": { - "version": "8.47.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.47.0.tgz", - "integrity": "sha512-P6omY1zv5MItm93kLM8s2vr1HICJH8v0dvddDhysbIuZ+vcjOHg5Zbkf1mTkcmi2JA9oBG2anOkRnW8WJTS8Og==", + "version": "8.48.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.48.0.tgz", + "integrity": "sha512-ZSjtmelB7IJfWD2Fvb7+Z+ChTIKWq6kjda95fLcQKNS5aheVHn4IkfgRQE3sIIzTcSLwLcLZUD9UBt+V7+h+Pw==", "dev": true }, "@humanwhocodes/config-array": { @@ -13742,15 +13742,15 @@ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" }, "eslint": { - "version": "8.47.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.47.0.tgz", - "integrity": "sha512-spUQWrdPt+pRVP1TTJLmfRNJJHHZryFmptzcafwSvHsceV81djHOdnEeDmkdotZyLNjDhrOasNK8nikkoG1O8Q==", + "version": "8.48.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.48.0.tgz", + "integrity": "sha512-sb6DLeIuRXxeM1YljSe1KEx9/YYeZFQWcV8Rq9HfigmdDEugjLEVEa1ozDjL6YDjBpQHPJxJzze+alxi4T3OLg==", "dev": true, "requires": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", "@eslint/eslintrc": "^2.1.2", - "@eslint/js": "^8.47.0", + "@eslint/js": "8.48.0", "@humanwhocodes/config-array": "^0.11.10", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", From 4785d402c472497aea06072e1f215de33ebc309f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 1 Sep 2023 10:10:13 +0800 Subject: [PATCH 195/297] Bump @types/uri-templates from 0.1.31 to 0.1.32 (#2148) Bumps [@types/uri-templates](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/uri-templates) from 0.1.31 to 0.1.32. - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/uri-templates) --- updated-dependencies: - dependency-name: "@types/uri-templates" dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index b4dac3b79..50f9f5082 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1558,9 +1558,9 @@ } }, "node_modules/@types/uri-templates": { - "version": "0.1.31", - "resolved": "https://registry.npmjs.org/@types/uri-templates/-/uri-templates-0.1.31.tgz", - "integrity": "sha512-sCokykpau15/CwBZvZg+HfcDcwre4/J3Zj7XyQgUrLS9OOdExIyK1tQ1tfQtM0P9qGU/U5y50FQOxqDX5rhcrQ==", + "version": "0.1.32", + "resolved": "https://registry.npmjs.org/@types/uri-templates/-/uri-templates-0.1.32.tgz", + "integrity": "sha512-PNRZF4z8uj81BBq8PumesGQVVZw0vjb1HFW9wll+UcHOPxWcop/8TwlvGzeIivmTdpxmpV2kXfRYCNWTHkIy+g==", "dev": true }, "node_modules/@types/uuid": { @@ -11512,9 +11512,9 @@ } }, "@types/uri-templates": { - "version": "0.1.31", - "resolved": "https://registry.npmjs.org/@types/uri-templates/-/uri-templates-0.1.31.tgz", - "integrity": "sha512-sCokykpau15/CwBZvZg+HfcDcwre4/J3Zj7XyQgUrLS9OOdExIyK1tQ1tfQtM0P9qGU/U5y50FQOxqDX5rhcrQ==", + "version": "0.1.32", + "resolved": "https://registry.npmjs.org/@types/uri-templates/-/uri-templates-0.1.32.tgz", + "integrity": "sha512-PNRZF4z8uj81BBq8PumesGQVVZw0vjb1HFW9wll+UcHOPxWcop/8TwlvGzeIivmTdpxmpV2kXfRYCNWTHkIy+g==", "dev": true }, "@types/uuid": { From d926a273e010bba3b1f1cd6c3b05a0c1d2c0fccc Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 1 Sep 2023 10:10:57 +0800 Subject: [PATCH 196/297] Bump @types/lokijs from 1.5.9 to 1.5.10 (#2146) Bumps [@types/lokijs](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/lokijs) from 1.5.9 to 1.5.10. - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/lokijs) --- updated-dependencies: - dependency-name: "@types/lokijs" dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 50f9f5082..fe75039c9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1449,9 +1449,9 @@ } }, "node_modules/@types/lokijs": { - "version": "1.5.9", - "resolved": "https://registry.npmjs.org/@types/lokijs/-/lokijs-1.5.9.tgz", - "integrity": "sha512-oucHtUUilYB922RtwBqk9vpXlxim7tqHOdJEHKPX9gM3p1K2LEoqeMGsgi19Rg2Vs11TA/RvkAJBLhoJ7T6HUg==", + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/@types/lokijs/-/lokijs-1.5.10.tgz", + "integrity": "sha512-Q/F6OUCZPHWY4hzEowhCswi9Tafc/E7DCUyyWIOH3+hM3K96Mkj2U3byfzs7Yd542I8gT/8oUALnoddqdA20xg==", "dev": true }, "node_modules/@types/mime": { @@ -11403,9 +11403,9 @@ } }, "@types/lokijs": { - "version": "1.5.9", - "resolved": "https://registry.npmjs.org/@types/lokijs/-/lokijs-1.5.9.tgz", - "integrity": "sha512-oucHtUUilYB922RtwBqk9vpXlxim7tqHOdJEHKPX9gM3p1K2LEoqeMGsgi19Rg2Vs11TA/RvkAJBLhoJ7T6HUg==", + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/@types/lokijs/-/lokijs-1.5.10.tgz", + "integrity": "sha512-Q/F6OUCZPHWY4hzEowhCswi9Tafc/E7DCUyyWIOH3+hM3K96Mkj2U3byfzs7Yd542I8gT/8oUALnoddqdA20xg==", "dev": true }, "@types/mime": { From 678aefad762d3d8ae42e385d12126954a330a095 Mon Sep 17 00:00:00 2001 From: Edwin Huber Date: Wed, 6 Sep 2023 11:19:34 +0200 Subject: [PATCH 197/297] Table Batch Updates (#2126) * refactored TableBatchOrchestrator * refactored TableBatchOrchestrator and constants * Corrected test for query batch * refactoring batch, added test and corrected #1754 * added test to validate #1726 * Added query interpreter unit test to cover #1599 * Added tests and fix addressing double tick in batch URL * added function to replace doubleticks in urls instead of replaceAll() * extended test case to cover delete in batch with starting % * removed check in table Merge entity for missing props, as some SDKs do not include * added additional test file covering apostrophe test cases * updated comment on rest query test * added Azure storage SDK tests for double apostrophe --- src/table/batch/BatchErrorConstants.ts | 11 + src/{common => table}/batch/BatchOperation.ts | 12 +- src/{common => table}/batch/BatchRequest.ts | 55 +- .../batch/BatchRequestHeaders.ts | 0 .../batch/BatchSerialization.ts | 0 src/table/batch/BatchStringConstants.ts | 36 ++ src/table/batch/ITableBatchRepository.ts | 16 + src/table/batch/TableBatchOperation.ts | 6 +- src/table/batch/TableBatchOrchestrator.ts | 344 +++++++++---- src/table/batch/TableBatchRepository.ts | 48 ++ src/table/batch/TableBatchSerialization.ts | 13 +- src/table/errors/StorageErrorFactory.ts | 13 + src/table/handlers/TableHandler.ts | 89 +++- .../apis/table.batch.errorhandling.test.ts | 39 ++ ...le.entity.apostrophe.azure-storage.test.ts | 483 ++++++++++++++++++ ...able.entity.apostrophe.data-tables.test.ts | 300 +++++++++++ .../table.entity.azure.data-tables.test.ts | 245 ++++++++- tests/table/apis/table.entity.rest.test.ts | 15 +- tests/table/apis/table.entity.test.ts | 18 +- tests/table/apis/table.test.ts | 86 ++++ .../table/dotnet/AzuriteTableTest/Program.cs | 6 +- .../AzuriteTableTest/TestForIssue1958.cs | 35 ++ tests/table/unit/deserialization.unit.test.ts | 28 +- ...ck.serialization.batchoperation.factory.ts | 7 +- ...mock.serialization.batchrequest.factory.ts | 2 +- .../table/unit/query.interpreter.unit.test.ts | 106 ++-- 26 files changed, 1741 insertions(+), 272 deletions(-) create mode 100644 src/table/batch/BatchErrorConstants.ts rename src/{common => table}/batch/BatchOperation.ts (70%) rename src/{common => table}/batch/BatchRequest.ts (76%) rename src/{common => table}/batch/BatchRequestHeaders.ts (100%) rename src/{common => table}/batch/BatchSerialization.ts (100%) create mode 100644 src/table/batch/BatchStringConstants.ts create mode 100644 src/table/batch/ITableBatchRepository.ts create mode 100644 src/table/batch/TableBatchRepository.ts create mode 100644 tests/table/apis/table.entity.apostrophe.azure-storage.test.ts create mode 100644 tests/table/apis/table.entity.apostrophe.data-tables.test.ts create mode 100644 tests/table/dotnet/AzuriteTableTest/TestForIssue1958.cs diff --git a/src/table/batch/BatchErrorConstants.ts b/src/table/batch/BatchErrorConstants.ts new file mode 100644 index 000000000..25be2b935 --- /dev/null +++ b/src/table/batch/BatchErrorConstants.ts @@ -0,0 +1,11 @@ +export default class BatchErrorConstants { + public static readonly BODY_NULL = "Body null when calling getBody on BatchRequest."; + public static readonly NO_PARTITION_KEY = "Partition key not found in request."; + public static readonly METHOD_INVALID = "HttpMethod invalid on batch operation."; + public static readonly METHOD_NOT_IMPLEMENTED = "Method not implemented."; + public static readonly PATH_NULL = "Path null when calling getPath on BatchRequest."; + public static readonly PROTOCOL_NULL = "Protocol null when calling getProtocol on BatchRequest"; + public static readonly TOO_MANY_OPERATIONS = "0:The batch request operation exceeds the maximum 100 changes per change set."; + public static readonly UNKNOWN_QUERYOPTION = "Unknown query options type."; + public static readonly URI_NULL = "Uri or path null when calling getUrl on BatchRequest."; +} \ No newline at end of file diff --git a/src/common/batch/BatchOperation.ts b/src/table/batch/BatchOperation.ts similarity index 70% rename from src/common/batch/BatchOperation.ts rename to src/table/batch/BatchOperation.ts index 95e6db299..1cf59b3d6 100644 --- a/src/common/batch/BatchOperation.ts +++ b/src/table/batch/BatchOperation.ts @@ -1,9 +1,4 @@ -import { HttpMethod } from "../../blob/generated/IRequest"; - -export enum BatchType { - blob = "blob", - table = "table" -} +import { HttpMethod } from "../../table/generated/IRequest"; /** * A container for batch operations @@ -13,15 +8,14 @@ export enum BatchType { */ export default class BatchOperation { public rawHeaders: string[]; + public headers: { [header: string]: string | string[] | undefined } = {}; public protocol?: string; - public batchType: BatchType; public httpMethod?: HttpMethod; public parameters?: string; public uri?: string; public path?: string; public jsonRequestBody?: string; // maybe we want the entity operation to be stored in a parsed format? - public constructor(_batchType: BatchType, headers: string) { - this.batchType = _batchType; + public constructor(headers: string) { const dirtyHeaderArray = headers.split("\n").map(line => line.trim()); // filter out the blanks this.rawHeaders = dirtyHeaderArray.filter( diff --git a/src/common/batch/BatchRequest.ts b/src/table/batch/BatchRequest.ts similarity index 76% rename from src/common/batch/BatchRequest.ts rename to src/table/batch/BatchRequest.ts index d8aee3cf7..719149d62 100644 --- a/src/common/batch/BatchRequest.ts +++ b/src/table/batch/BatchRequest.ts @@ -1,11 +1,13 @@ import { Stream } from "stream"; -import IRequest, { HttpMethod } from "../../table/generated/IRequest"; +import IRequest, { HttpMethod } from "../generated/IRequest"; import BatchOperation from "./BatchOperation"; import BatchRequestHeaders from "./BatchRequestHeaders"; -import * as Models from "../../table/generated/artifacts/models"; -import BatchTableUpdateEntityOptionalParams from "../../table/batch/BatchTableUpdateEntityOptionalParams"; -import BatchTableDeleteEntityOptionalParams from "../../table/batch/BatchTableDeleteEntityOptionalParams"; -import IOptionalParams from "../../table/batch/IOptionalParams"; +import * as Models from "../generated/artifacts/models"; +import BatchTableUpdateEntityOptionalParams from "./BatchTableUpdateEntityOptionalParams"; +import BatchTableDeleteEntityOptionalParams from "./BatchTableDeleteEntityOptionalParams"; +import IOptionalParams from "./IOptionalParams"; +import BatchStringConstants from "./BatchStringConstants"; +import BatchErrorConstants from "./BatchErrorConstants"; /* * Represents a request in the context of batch operations. @@ -43,15 +45,15 @@ export default class BatchRequest implements IRequest { public ingestOptionalParams(params: IOptionalParams) { this.params = params; // need to compare headers to option params and set accordingly - if (this.getHeader("x-ms-client-request-id") !== undefined) { - this.params.requestId = this.getHeader("x-ms-client-request-id"); + if (this.getHeader(BatchStringConstants.MS_CLIENT_REQ_ID) !== undefined) { + this.params.requestId = this.getHeader(BatchStringConstants.MS_CLIENT_REQ_ID); } // Theoretically, this Enum is redundant, and used across all table // optional param models, thinking that we only need to use the 1, // the code generator is however differentiating across all of them // as distinct - if (this.getHeader("maxdataserviceversion")?.includes("3.0")) { + if (this.getHeader(BatchStringConstants.DATASERVICEVERSION)?.includes("3.0")) { this.params.dataServiceVersion = Models.DataServiceVersion4.ThreeFullStopZero; } @@ -77,10 +79,10 @@ export default class BatchRequest implements IRequest { const options: Models.QueryOptions = new Object() as Models.QueryOptions; // format // set payload options - if (this.getHeader("accept")?.includes("minimalmeta")) { + if (this.getHeader(BatchStringConstants.ACCEPT)?.includes(BatchStringConstants.MINIMAL_META)) { options.format = Models.OdataMetadataFormat.Applicationjsonodataminimalmetadata; - } else if (this.getHeader("accept")?.includes("fullmeta")) { + } else if (this.getHeader(BatchStringConstants.ACCEPT)?.includes(BatchStringConstants.FULL_META)) { options.format = Models.OdataMetadataFormat.Applicationjsonodatafullmetadata; } else { @@ -97,7 +99,7 @@ export default class BatchRequest implements IRequest { if (this.batchOperation.httpMethod != null) { return this.batchOperation.httpMethod; } else { - throw new Error("httpMethod invalid on batch operation"); + throw new Error(BatchErrorConstants.METHOD_INVALID); } } @@ -109,25 +111,20 @@ export default class BatchRequest implements IRequest { // in delete, it seems that we actuall expect the full uri if (this.batchOperation.uri != null && this.batchOperation.path != null) { return this.batchOperation.uri; - // this substring is not needed. - // .substring( - // 0, - // this.batchOperation.uri.length - this.batchOperation.path.length - // ); } else { - throw new Error("uri or path null when calling getUrl on BatchRequest"); + throw new Error(BatchErrorConstants.URI_NULL); } } public getEndpoint(): string { - throw new Error("Method not implemented."); + throw new Error(BatchErrorConstants.METHOD_NOT_IMPLEMENTED); } public getPath(): string { if (this.batchOperation.path != null) { return this.batchOperation.path; } else { - throw new Error("path null when calling getPath on BatchRequest"); + throw new Error(BatchErrorConstants.PATH_NULL); } } @@ -135,19 +132,19 @@ export default class BatchRequest implements IRequest { if (this.batchOperation.jsonRequestBody != null) { return Stream.Readable.from(this.batchOperation.jsonRequestBody); } else { - throw new Error("body null when calling getBodyStream on BatchRequest"); + throw new Error(BatchErrorConstants.BODY_NULL); } } public setBody(body: string | undefined): IRequest { - throw new Error("Method not implemented."); + throw new Error(BatchErrorConstants.METHOD_NOT_IMPLEMENTED); } public getBody(): string | undefined { if (this.batchOperation.jsonRequestBody != null) { return this.batchOperation.jsonRequestBody; } else { - throw new Error("body null when calling getBody on BatchRequest"); + throw new Error(BatchErrorConstants.BODY_NULL); } } @@ -156,7 +153,7 @@ export default class BatchRequest implements IRequest { } public getHeaders(): { [header: string]: string | string[] | undefined } { - throw new Error("Method not implemented."); + throw new Error(BatchErrorConstants.METHOD_NOT_IMPLEMENTED); } public getRawHeaders(): string[] { @@ -165,18 +162,18 @@ export default class BatchRequest implements IRequest { public getQuery(key: string): string | undefined { switch (key) { - case "$format": + case BatchStringConstants.FORMAT: return this.params.queryOptions?.format; - case "$top": + case BatchStringConstants.TOP: return this.params.queryOptions?.top?.toLocaleString(); - case "$select": + case BatchStringConstants.SELECT: return this.params.queryOptions?.select; - case "$filter": + case BatchStringConstants.FILTER: return this.params.queryOptions?.filter; default: break; } - throw new Error("unknown query options type."); + throw new Error(BatchErrorConstants.UNKNOWN_QUERYOPTION); } public getProtocol(): string { @@ -192,7 +189,7 @@ export default class BatchRequest implements IRequest { this.batchOperation.protocol = protocolMatch[0]; return this.batchOperation.protocol; } - throw new Error("protocol null when calling getProtocol on BatchRequest"); + throw new Error(BatchErrorConstants.PROTOCOL_NULL); } } } diff --git a/src/common/batch/BatchRequestHeaders.ts b/src/table/batch/BatchRequestHeaders.ts similarity index 100% rename from src/common/batch/BatchRequestHeaders.ts rename to src/table/batch/BatchRequestHeaders.ts diff --git a/src/common/batch/BatchSerialization.ts b/src/table/batch/BatchSerialization.ts similarity index 100% rename from src/common/batch/BatchSerialization.ts rename to src/table/batch/BatchSerialization.ts diff --git a/src/table/batch/BatchStringConstants.ts b/src/table/batch/BatchStringConstants.ts new file mode 100644 index 000000000..b5caf6d65 --- /dev/null +++ b/src/table/batch/BatchStringConstants.ts @@ -0,0 +1,36 @@ +export default class BatchStringConstants { + public static readonly ACCEPT = "accept"; + public static readonly ASTERISK = "*"; + public static readonly BATCH_REQ_BOUNDARY = "batch"; + public static readonly BATCH_RES_BOUNDARY = "batchresponse"; + public static readonly BOUNDARY_PREFIX = "--"; + public static readonly BOUNDARY_CLOSE_SUFFIX = "--\r\n"; + public static readonly CHANGESET_REQ_BOUNDARY = "changeset"; + public static readonly CHANGESET_RES_BOUNDARY = "changesetresponse"; + public static readonly CONTENT_TYPE_MULTIPART_AND_BOUNDARY = "Content-Type: multipart/mixed; boundary="; + public static readonly CONTENT_TYPE_HTTP = "Content-Type: application/http\r\n"; + public static readonly CRLF = "\r\n"; + public static readonly DATASERVICEVERSION = "maxdataserviceversion"; + public static readonly DoubleCRLF = "\r\n\r\n"; + public static readonly FILTER = "$filter"; + public static readonly FORMAT = "$format"; + public static readonly FULL_META = "fullmeta"; + public static readonly IF_MATCH_HEADER_STRING = "if-match"; + + public static readonly MINIMAL_META = "minimalmeta"; + public static readonly MS_CLIENT_REQ_ID = "x-ms-client-request-id"; + + public static readonly TOP = "$top"; + public static readonly TRANSFER_ENCODING_BINARY = "Content-Transfer-Encoding: binary\r\n"; + public static readonly SELECT = "$select"; + public static readonly VERB_CONNECT = "CONNECT"; + public static readonly VERB_DELETE = "DELETE"; + public static readonly VERB_GET = "GET"; + public static readonly VERB_HEAD = "HEAD"; + public static readonly VERB_MERGE = "MERGE"; + public static readonly VERB_OPTIONS = "OPTIONS"; + public static readonly VERB_PATCH = "PATCH"; + public static readonly VERB_POST = "POST"; + public static readonly VERB_PUT = "PUT"; + public static readonly VERB_TRACE = "TRACE"; +} \ No newline at end of file diff --git a/src/table/batch/ITableBatchRepository.ts b/src/table/batch/ITableBatchRepository.ts new file mode 100644 index 000000000..6f1451f3a --- /dev/null +++ b/src/table/batch/ITableBatchRepository.ts @@ -0,0 +1,16 @@ +import BatchRequest from "./BatchRequest"; +import TableStorageContext from "../context/TableStorageContext"; +import ITableMetadataStore from "../persistence/ITableMetadataStore"; + +export interface ITableBatchRepository { + addBatchRequest(request: BatchRequest): void; + addBatchRequests(requests: BatchRequest[]): void + getBatchRequests(): BatchRequest[]; + beginBatchTransaction(batchId: string, metadataStore: ITableMetadataStore): Promise; + endBatchTransaction( + accountName : string, + tableName : string, + batchId : string, + context : TableStorageContext, + batchSuccess : boolean) : Promise; +} \ No newline at end of file diff --git a/src/table/batch/TableBatchOperation.ts b/src/table/batch/TableBatchOperation.ts index fafcfb102..571b7c22c 100644 --- a/src/table/batch/TableBatchOperation.ts +++ b/src/table/batch/TableBatchOperation.ts @@ -1,7 +1,7 @@ -import BatchOperation, { BatchType } from "../../common/batch/BatchOperation"; +import BatchOperation from "./BatchOperation"; export default class TableBatchOperation extends BatchOperation { - public constructor(_batchType: BatchType, headers: string) { - super(_batchType, headers); + public constructor(headers: string) { + super(headers); } } diff --git a/src/table/batch/TableBatchOrchestrator.ts b/src/table/batch/TableBatchOrchestrator.ts index bf25539b0..c1ceca892 100644 --- a/src/table/batch/TableBatchOrchestrator.ts +++ b/src/table/batch/TableBatchOrchestrator.ts @@ -1,10 +1,9 @@ -import BatchRequest from "../../common/batch/BatchRequest"; +import BatchRequest from "./BatchRequest"; import BatchTableInsertEntityOptionalParams from "./BatchTableInsertEntityOptionalParams"; import TableStorageContext from "../context/TableStorageContext"; import Context from "../generated/Context"; import TableHandler from "../handlers/TableHandler"; import { TableBatchSerialization } from "./TableBatchSerialization"; -import TableBatchOperation from "./TableBatchOperation"; import BatchTableDeleteEntityOptionalParams from "./BatchTableDeleteEntityOptionalParams"; import BatchTableUpdateEntityOptionalParams from "./BatchTableUpdateEntityOptionalParams"; import BatchTableMergeEntityOptionalParams from "./BatchTableMergeEntityOptionalParams"; @@ -13,31 +12,41 @@ import { TableQueryEntitiesWithPartitionAndRowKeyOptionalParams } from "../gener import ITableMetadataStore from "../persistence/ITableMetadataStore"; import { v4 as uuidv4 } from "uuid"; import StorageErrorFactory from "../errors/StorageErrorFactory"; +import TableBatchRepository from "./TableBatchRepository"; +import BatchStringConstants from "./BatchStringConstants"; +import BatchErrorConstants from "./BatchErrorConstants"; /** * Currently there is a single distinct and concrete implementation of batch / * entity group operations for the table api. * The orchestrator manages the deserialization, submission and serialization of * entity group transactions. - * ToDo: it might be possible to share code between this and the blob batch api, but this - * has not yet been validated. - * Will need refactoring when we address batch transactions for blob. + * ToDo: it might be possible to share code between this and the blob batch api, but there + * is relatively little commonality, due to the different ACL models and the fact that + * Azure Tables is owned by a different group to the Azure Blob Storage team. * * @export * @class TableBatchOrchestrator */ export default class TableBatchOrchestrator { - private batchOperations: TableBatchOperation[] = []; - private requests: BatchRequest[] = []; private serialization = new TableBatchSerialization(); private context: TableStorageContext; private parentHandler: TableHandler; private wasError: boolean = false; private errorResponse: string = ""; - - public constructor(context: TableStorageContext, handler: TableHandler) { + private readonly repository: TableBatchRepository; + // add a private member which will is a map of row keys to partition keys + // this will be used to check for duplicate row keys in a batch request + private partitionKeyMap: Map = new Map(); + + public constructor( + context: TableStorageContext, + handler: TableHandler, + metadataStore: ITableMetadataStore + ) { this.context = context; this.parentHandler = handler; + this.repository = new TableBatchRepository(metadataStore); } /** @@ -49,19 +58,22 @@ export default class TableBatchOrchestrator { * @memberof TableBatchManager */ public async processBatchRequestAndSerializeResponse( - batchRequestBody: string, - metadataStore: ITableMetadataStore + batchRequestBody: string ): Promise { - this.batchOperations = + const batchOperations = this.serialization.deserializeBatchRequest(batchRequestBody); - if (this.batchOperations.length > 100) { + if (batchOperations.length > 100) { this.wasError = true; this.errorResponse = this.serialization.serializeGeneralRequestError( - "0:The batch request operation exceeds the maximum 100 changes per change set.", + BatchErrorConstants.TOO_MANY_OPERATIONS, this.context.xMsRequestID ); } else { - await this.submitRequestsToHandlers(metadataStore); + batchOperations.forEach((operation) => { + const request: BatchRequest = new BatchRequest(operation); + this.repository.addBatchRequest(request); + }); + await this.submitRequestsToHandlers(); } return this.serializeResponses(); } @@ -74,38 +86,20 @@ export default class TableBatchOrchestrator { * @return {*} {Promise} * @memberof TableBatchManager */ - private async submitRequestsToHandlers( - metadataStore: ITableMetadataStore - ): Promise { - this.batchOperations.forEach((operation) => { - const request: BatchRequest = new BatchRequest(operation); - this.requests.push(request); - }); - + private async submitRequestsToHandlers(): Promise { let contentID = 1; - if (this.requests.length > 0) { + if (this.repository.getBatchRequests().length > 0) { const accountName = (this.context.account ??= ""); - const tableName = this.requests[0].getPath(); + const tableName = this.repository.getBatchRequests()[0].getPath(); const batchId = uuidv4(); - // get partition key from the request body or uri to copy that specific partition of database - const requestPartitionKey = this.extractRequestPartitionKey( - this.requests[0] - ); + this.checkForPartitionKey(); - if (requestPartitionKey === undefined) { - this.wasError = true; - this.errorResponse = this.serialization.serializeGeneralRequestError( - "Partition key not found in request", - this.context.xMsRequestID - ); - } else { - // initialize transaction rollback capability - await metadataStore.beginBatchTransaction(batchId); - } + // initialize transaction rollback capability + await this.initTransaction(batchId); let batchSuccess = true; - for (const singleReq of this.requests) { + for (const singleReq of this.repository.getBatchRequests()) { try { singleReq.response = await this.routeAndDispatchBatchRequest( singleReq, @@ -126,7 +120,7 @@ export default class TableBatchOrchestrator { contentID++; } - await metadataStore.endBatchTransaction( + await this.repository.endBatchTransaction( accountName, tableName, batchId, @@ -136,6 +130,38 @@ export default class TableBatchOrchestrator { } } + /** + * Ensures that we have a partition key for the batch request + * + * @private + * @memberof TableBatchOrchestrator + */ + private checkForPartitionKey() { + const requestPartitionKey = this.extractRequestPartitionKey( + this.repository.getBatchRequests()[0] + ); + + if (requestPartitionKey === undefined) { + this.wasError = true; + this.errorResponse = this.serialization.serializeGeneralRequestError( + BatchErrorConstants.NO_PARTITION_KEY, + this.context.xMsRequestID + ); + } + } + + /** + * Initializes the transaction for the batch request in the metadata store + * + * @param {string} batchId + * @memberof TableBatchOrchestrator + */ + async initTransaction(batchId: string) { + if (this.wasError == false) { + await this.repository.beginBatchTransaction(batchId); + } + } + /** * Serializes responses from the table handler * see Link below for details of response format @@ -151,41 +177,57 @@ export default class TableBatchOrchestrator { // based on research, a stringbuilder is only worth doing with 1000s of string ops // this can be optimized later if we get reports of slow batch operations const batchBoundary = this.serialization.batchBoundary.replace( - "batch", - "batchresponse" + BatchStringConstants.BATCH_REQ_BOUNDARY, + BatchStringConstants.BATCH_RES_BOUNDARY ); let changesetBoundary = this.serialization.changesetBoundary.replace( - "changeset", - "changesetresponse" + BatchStringConstants.CHANGESET_REQ_BOUNDARY, + BatchStringConstants.CHANGESET_RES_BOUNDARY ); - responseString += batchBoundary + "\r\n"; + responseString += batchBoundary + BatchStringConstants.CRLF; // (currently static header) ToDo: Validate if we need to correct headers via tests - responseString += - "Content-Type: multipart/mixed; boundary=" + + responseString = this.serializeContentTypeAndBoundary( + responseString, + changesetBoundary + ); + const changesetBoundaryClose: string = + BatchStringConstants.BOUNDARY_PREFIX + changesetBoundary + - "\r\n\r\n"; - const changesetBoundaryClose: string = "--" + changesetBoundary + "--\r\n"; - changesetBoundary = "--" + changesetBoundary; + BatchStringConstants.BOUNDARY_CLOSE_SUFFIX; + changesetBoundary = + BatchStringConstants.BOUNDARY_PREFIX + changesetBoundary; if (this.wasError === false) { - this.requests.forEach((request) => { + this.repository.getBatchRequests().forEach((request) => { responseString += changesetBoundary; responseString += request.response; - responseString += "\r\n\r\n"; + responseString += BatchStringConstants.DoubleCRLF; }); } else { // serialize the error - responseString += changesetBoundary + "\r\n"; + responseString += changesetBoundary + BatchStringConstants.CRLF; // then headers - responseString += "Content-Type: application/http\r\n"; - responseString += "Content-Transfer-Encoding: binary\r\n"; - responseString += "\r\n"; + responseString += BatchStringConstants.CONTENT_TYPE_HTTP; + responseString += BatchStringConstants.TRANSFER_ENCODING_BINARY; + responseString += BatchStringConstants.CRLF; // then HTTP/1.1 404 etc responseString += this.errorResponse; } responseString += changesetBoundaryClose; - responseString += batchBoundary + "--\r\n"; + responseString += + batchBoundary + BatchStringConstants.BOUNDARY_CLOSE_SUFFIX; + return responseString; + } + + private serializeContentTypeAndBoundary( + responseString: string, + changesetBoundary: string + ) { + responseString += + BatchStringConstants.CONTENT_TYPE_MULTIPART_AND_BOUNDARY + + changesetBoundary + + BatchStringConstants.DoubleCRLF; return responseString; } @@ -206,17 +248,18 @@ export default class TableBatchOrchestrator { contentID: number, batchId: string ): Promise { - // the context that we have will not work with the calls and needs updating for - // batch operations, need a suitable deep clone, as each request needs to be treated seaprately - const batchContextClone = Object.create(context); - batchContextClone.tableName = request.getPath(); - batchContextClone.path = request.getPath(); + const batchContextClone = this.createBatchContextClone( + context, + request, + batchId + ); + let response: any; let __return: any; // we only use 5 HTTP Verbs to determine the table operation type try { switch (request.getMethod()) { - case "POST": + case BatchStringConstants.VERB_POST: // INSERT: we are inserting an entity // POST https://myaccount.table.core.windows.net/mytable ({ __return, response } = await this.handleBatchInsert( @@ -227,7 +270,7 @@ export default class TableBatchOrchestrator { batchId )); break; - case "PUT": + case BatchStringConstants.VERB_PUT: // UPDATE: we are updating an entity // PUT http://127.0.0.1:10002/devstoreaccount1/mytable(PartitionKey='myPartitionKey', RowKey='myRowKey') // INSERT OR REPLACE: @@ -240,7 +283,7 @@ export default class TableBatchOrchestrator { batchId )); break; - case "DELETE": + case BatchStringConstants.VERB_DELETE: // DELETE: we are deleting an entity // DELETE https://myaccount.table.core.windows.net/mytable(PartitionKey='myPartitionKey', RowKey='myRowKey') ({ __return, response } = await this.handleBatchDelete( @@ -251,7 +294,7 @@ export default class TableBatchOrchestrator { batchId )); break; - case "GET": + case BatchStringConstants.VERB_GET: // QUERY : we are querying / retrieving an entity // GET https://myaccount.table.core.windows.net/mytable(PartitionKey='',RowKey='')?$select= ({ __return, response } = await this.handleBatchQuery( @@ -262,19 +305,19 @@ export default class TableBatchOrchestrator { batchId )); break; - case "CONNECT": + case BatchStringConstants.VERB_CONNECT: throw new Error("Connect Method unsupported in batch."); break; - case "HEAD": + case BatchStringConstants.VERB_HEAD: throw new Error("Head Method unsupported in batch."); break; - case "OPTIONS": + case BatchStringConstants.VERB_OPTIONS: throw new Error("Options Method unsupported in batch."); break; - case "TRACE": + case BatchStringConstants.VERB_TRACE: throw new Error("Trace Method unsupported in batch."); break; - case "PATCH": + case BatchStringConstants.VERB_PATCH: // this is using the PATCH verb to merge ({ __return, response } = await this.handleBatchMerge( request, @@ -304,6 +347,32 @@ export default class TableBatchOrchestrator { return __return; } + /** + * Creates a clone of the context for the batch operation. + * Becuase the context that we have will not work with the calls and needs + * updating for batch operations. + * We use a deep clone, as each request needs to be treated seaprately. + * + * @private + * @param {Context} context + * @param {BatchRequest} request + * @return {*} + * @memberof TableBatchOrchestrator + */ + private createBatchContextClone( + context: Context, + request: BatchRequest, + batchId: string + ) { + const batchContextClone = Object.create(context); + batchContextClone.tableName = request.getPath(); + batchContextClone.path = request.getPath(); + const updatedContext = new TableStorageContext(batchContextClone); + updatedContext.request = request; + updatedContext.batchId = batchId; + return updatedContext; + } + /** * Handles an insert operation inside a batch * @@ -329,13 +398,12 @@ export default class TableBatchOrchestrator { response: any; }> { request.ingestOptionalParams(new BatchTableInsertEntityOptionalParams()); - const updatedContext = new TableStorageContext(batchContextClone); - updatedContext.request = request; - updatedContext.batchId = batchId; + const { partitionKey, rowKey } = this.extractKeys(request); + this.validateBatchRequest(partitionKey, rowKey, batchContextClone); response = await this.parentHandler.insertEntity( request.getPath(), request.params as BatchTableInsertEntityOptionalParams, - updatedContext + batchContextClone ); return { __return: this.serialization.serializeTableInsertEntityBatchResponse( @@ -371,20 +439,19 @@ export default class TableBatchOrchestrator { response: any; }> { request.ingestOptionalParams(new BatchTableDeleteEntityOptionalParams()); - const updatedContext = batchContextClone as TableStorageContext; - updatedContext.request = request; - updatedContext.batchId = batchId; - const ifmatch: string = request.getHeader("if-match") || "*"; + const ifmatch: string = + request.getHeader(BatchStringConstants.IF_MATCH_HEADER_STRING) || + BatchStringConstants.ASTERISK; - const partitionKey = this.extractRequestPartitionKey(request); - const rowKey = this.extractRequestRowKey(request); + const { partitionKey, rowKey } = this.extractKeys(request); + this.validateBatchRequest(partitionKey, rowKey, batchContextClone); response = await this.parentHandler.deleteEntity( request.getPath(), partitionKey, rowKey, ifmatch, request.params as BatchTableDeleteEntityOptionalParams, - updatedContext + batchContextClone ); return { @@ -396,6 +463,12 @@ export default class TableBatchOrchestrator { }; } + private extractKeys(request: BatchRequest) { + const partitionKey = this.extractRequestPartitionKey(request); + const rowKey = this.extractRequestRowKey(request); + return { partitionKey, rowKey }; + } + /** * Handles an update Operation inside a batch request * @@ -421,12 +494,11 @@ export default class TableBatchOrchestrator { response: any; }> { request.ingestOptionalParams(new BatchTableUpdateEntityOptionalParams()); - const updatedContext = batchContextClone as TableStorageContext; - updatedContext.request = request; - updatedContext.batchId = batchId; - const partitionKey = this.extractRequestPartitionKey(request); - const rowKey = this.extractRequestRowKey(request); - const ifMatch = request.getHeader("if-match"); + const { partitionKey, rowKey } = this.extractKeys(request); + this.validateBatchRequest(partitionKey, rowKey, batchContextClone); + const ifMatch = request.getHeader( + BatchStringConstants.IF_MATCH_HEADER_STRING + ); response = await this.parentHandler.updateEntity( request.getPath(), @@ -436,7 +508,7 @@ export default class TableBatchOrchestrator { ifMatch, ...request.params } as BatchTableUpdateEntityOptionalParams, - updatedContext + batchContextClone ); return { @@ -474,11 +546,7 @@ export default class TableBatchOrchestrator { response: any; }> { // need to validate that query is the only request in the batch! - const partitionKey = this.extractRequestPartitionKey(request); - const rowKey = this.extractRequestRowKey(request); - - const updatedContext = batchContextClone as TableStorageContext; - updatedContext.batchId = batchId; + const { partitionKey, rowKey } = this.extractKeys(request); if ( null !== partitionKey && @@ -496,13 +564,12 @@ export default class TableBatchOrchestrator { new BatchTableQueryEntitiesWithPartitionAndRowKeyOptionalParams() ); - updatedContext.request = request; response = await this.parentHandler.queryEntitiesWithPartitionAndRowKey( request.getPath(), partitionKey, rowKey, request.params as TableQueryEntitiesWithPartitionAndRowKeyOptionalParams, - updatedContext + batchContextClone ); return { __return: @@ -542,23 +609,17 @@ export default class TableBatchOrchestrator { response: any; }> { request.ingestOptionalParams(new BatchTableMergeEntityOptionalParams()); - const updatedContext = batchContextClone as TableStorageContext; - updatedContext.request = request; - updatedContext.batchId = batchId; - - const partitionKey = this.extractRequestPartitionKey(request); - const rowKey = this.extractRequestRowKey(request); - const ifMatch = request.getHeader("if-match"); - + const { partitionKey, rowKey } = this.extractKeys(request); + this.validateBatchRequest(partitionKey, rowKey, batchContextClone); response = await this.parentHandler.mergeEntity( request.getPath(), partitionKey, rowKey, { - ifMatch, + ifMatch: request.getHeader(BatchStringConstants.IF_MATCH_HEADER_STRING), ...request.params } as BatchTableMergeEntityOptionalParams, - updatedContext + batchContextClone ); return { @@ -597,6 +658,8 @@ export default class TableBatchOrchestrator { // keys can have more complex values which are URI encoded if they come from the URL // we decode above. partitionKey = partKeyMatch[0]; + // Url should use double ticks and we need to remove them + partitionKey = this.replaceDoubleTicks(partitionKey); } return partitionKey; } @@ -610,14 +673,16 @@ export default class TableBatchOrchestrator { * @memberof TableBatchManager */ private extractRequestRowKey(request: BatchRequest): string { - let rowKey: string; + let rowKey: any; // problem: sometimes the ticks are encoded, sometimes not! // this is a difference between Azure Data-Tables and the deprecated - // Azure Storage SDK + // Azure Storage SDK decode URI component will not remove double ticks const url = decodeURIComponent(request.getUrl()); + const rowKeyMatch = url.match(/(?<=RowKey=')(.+)(?='\))/gi); rowKey = rowKeyMatch ? rowKeyMatch[0] : ""; - + // Url should use double ticks and we need to remove them + rowKey = this.replaceDoubleTicks(rowKey); if (rowKeyMatch === null) { // row key not in URL, must be in body const body = request.getBody(); @@ -626,6 +691,65 @@ export default class TableBatchOrchestrator { rowKey = jsonBody.RowKey; } } + return rowKey; } + + /** + * Replace Double ticks for single ticks without replaceAll string prototype + * function, becuase node 14 does not support it. + * @param key + * @returns + */ + private replaceDoubleTicks(key: string): string { + const result = key.replace(/''/g, "'"); + return result; + } + + /** + * Helper function to validate batch requests. + * Additional validation functions should be added here. + * + * @private + * @param {string} partitionKey + * @param {string} rowKey + * @param {*} batchContextClone + * @memberof TableBatchOrchestrator + */ + private validateBatchRequest( + partitionKey: string | undefined, + rowKey: string, + batchContextClone: any + ) { + if (partitionKey === undefined) { + throw StorageErrorFactory.getInvalidInput(batchContextClone); + } + this.checkForDuplicateRowKey(partitionKey, rowKey, batchContextClone); + } + + /** + * + * + * + * @private + * @param {string} partitionKey + * @param {string} rowKey + * @param {*} batchContextClone + * @memberof TableBatchOrchestrator + */ + private checkForDuplicateRowKey( + partitionKey: string, + rowKey: string, + batchContextClone: any + ) { + const key = partitionKey + rowKey; + if (this.partitionKeyMap.has(key)) { + throw StorageErrorFactory.getBatchDuplicateRowKey( + batchContextClone, + rowKey + ); + } else { + this.partitionKeyMap.set(key, partitionKey); + } + } } diff --git a/src/table/batch/TableBatchRepository.ts b/src/table/batch/TableBatchRepository.ts new file mode 100644 index 000000000..fd6bb6052 --- /dev/null +++ b/src/table/batch/TableBatchRepository.ts @@ -0,0 +1,48 @@ +import BatchRequest from "./BatchRequest"; +import TableStorageContext from "../context/TableStorageContext"; +import ITableMetadataStore from "../persistence/ITableMetadataStore"; +import { ITableBatchRepository } from "./ITableBatchRepository" + +/** + * Provides and separates data access logic from batch orchestration. + * + * @export + * @class TableBatchRepository + * @implements {ITableBatchRepository} + */ +export default class TableBatchRepository implements ITableBatchRepository { + private requests: BatchRequest[] = []; + private metadataStore: ITableMetadataStore; + + constructor(metadataStore: ITableMetadataStore) { + this.metadataStore = metadataStore; + } + + addBatchRequest(request: BatchRequest): void { + this.requests.push(request); + } + + addBatchRequests(requests: BatchRequest[]): void { + this.requests.push(...requests); + } + + getBatchRequests(): BatchRequest[] { + return this.requests; + } + + beginBatchTransaction(batchId: string): Promise { + // initialize transaction rollback capability + return this.metadataStore.beginBatchTransaction(batchId); + } + + endBatchTransaction( + accountName : string, + tableName : string, + batchId : string, + context : TableStorageContext, + batchSuccess : boolean + ): Promise { + // commit or rollback transaction + return this.metadataStore.endBatchTransaction(accountName, tableName, batchId, context, batchSuccess); + } +} \ No newline at end of file diff --git a/src/table/batch/TableBatchSerialization.ts b/src/table/batch/TableBatchSerialization.ts index a1d872dfb..b00017fcc 100644 --- a/src/table/batch/TableBatchSerialization.ts +++ b/src/table/batch/TableBatchSerialization.ts @@ -1,11 +1,11 @@ // import BatchOperation from "../../common/BatchOperation"; // import { BatchOperationType } from "../../common/BatchOperation"; -import { BatchType } from "../../common/batch/BatchOperation"; -import BatchRequest from "../../common/batch/BatchRequest"; +import "./BatchOperation"; +import BatchRequest from "./BatchRequest"; // import BatchSubResponse from "../../common/BatchSubResponse"; import { HttpMethod } from "../../table/generated/IRequest"; -import { BatchSerialization } from "../../common/batch/BatchSerialization"; +import { BatchSerialization } from "./BatchSerialization"; import TableBatchOperation from "../batch/TableBatchOperation"; import * as Models from "../generated/artifacts/models"; import TableBatchUtils from "./TableBatchUtils"; @@ -84,10 +84,13 @@ export class TableBatchSerialization extends BatchSerialization { const jsonOperationBody = subRequest.match(/{+.+}+/); + // Delete does not use a JSON body, but the COSMOS Table client also + // submits requests without a JSON body for merge if ( subRequests.length > 1 && null !== requestType && requestType[0] !== "DELETE" && + requestType[0] !== "MERGE" && (jsonOperationBody === null || jsonOperationBody.length < 1) ) { throw new Error( @@ -110,13 +113,13 @@ export class TableBatchSerialization extends BatchSerialization { jsonBody = jsonOperationBody[0]; } else { // trim "\r\n\r\n" or "\n\n" from subRequest - subStringEnd = subRequest.length - (HTTP_LINE_ENDING.length * 2); + subStringEnd = subRequest.length - HTTP_LINE_ENDING.length * 2; jsonBody = ""; } headers = subRequest.substring(subStringStart, subStringEnd); - const operation = new TableBatchOperation(BatchType.table, headers); + const operation = new TableBatchOperation(headers); if (null !== requestType) { operation.httpMethod = requestType[0] as HttpMethod; } diff --git a/src/table/errors/StorageErrorFactory.ts b/src/table/errors/StorageErrorFactory.ts index 25c410d66..d84a1a834 100644 --- a/src/table/errors/StorageErrorFactory.ts +++ b/src/table/errors/StorageErrorFactory.ts @@ -9,7 +9,20 @@ import StorageError from "./StorageError"; const defaultID: string = "DefaultID"; +// see: https://learn.microsoft.com/en-us/rest/api/storageservices/table-service-error-codes export default class StorageErrorFactory { + + static getBatchDuplicateRowKey(context: Context, rowKey: string) : StorageError{ + return new StorageError( + 400, + "InvalidDuplicateRow", + `A command with RowKey '${rowKey}' is already present in the batch. An entity can appear only once in a batch. `, + context.contextID || defaultID, + undefined, + context + ); + } + public static getInvalidHeaderValue( context: Context, additionalMessages?: { [key: string]: string } diff --git a/src/table/handlers/TableHandler.ts b/src/table/handlers/TableHandler.ts index 32fce5b81..5466196d4 100644 --- a/src/table/handlers/TableHandler.ts +++ b/src/table/handlers/TableHandler.ts @@ -461,28 +461,8 @@ export default class TableHandler extends BaseHandler implements ITableHandler { context ); - if (!options.tableEntityProperties) { - throw StorageErrorFactory.getPropertiesNeedValue(context); - } - if (options?.ifMatch && options.ifMatch !== "*" && options.ifMatch !== "") { - if (isEtagValid(options.ifMatch)) { - throw StorageErrorFactory.getInvalidOperation(context); - } - } + this.checkMergeRequest(options, context, partitionKey, rowKey); - if ( - options.tableEntityProperties.PartitionKey !== partitionKey || - options.tableEntityProperties.RowKey !== rowKey - ) { - this.logger.warn( - `TableHandler:mergeEntity() Incoming PartitionKey:${partitionKey} RowKey:${rowKey} in URL parameters don't align with entity body PartitionKey:${options.tableEntityProperties.PartitionKey} RowKey:${options.tableEntityProperties.RowKey}.` - ); - } - // check that key properties are valid - this.validateKey(context, partitionKey); - this.validateKey(context, rowKey); - - this.checkProperties(context, options.tableEntityProperties); const entity: Entity = this.createPersistedEntity( context, options, @@ -522,6 +502,64 @@ export default class TableHandler extends BaseHandler implements ITableHandler { return response; } + /** + * Check that the properties are valid on merge request + * + * @private + * @param {Models.TableMergeEntityOptionalParams} options + * @param {Context} context + * @param {string} partitionKey + * @param {string} rowKey + * @memberof TableHandler + */ + private checkMergeRequest( + options: Models.TableMergeEntityOptionalParams, + context: Context, + partitionKey: string, + rowKey: string + ) { + // some SDKs, like Azure Cosmos Table do not always send properties + // and we might merge just row and partition keys like upsert + // this caused issues and has been removed for now. + // if (!options.tableEntityProperties) { + // throw StorageErrorFactory.getPropertiesNeedValue(context); + // } + if (options.tableEntityProperties !== undefined) { + if ( + options.tableEntityProperties.PartitionKey !== partitionKey || + options.tableEntityProperties.RowKey !== rowKey + ) { + this.logger.warn( + `TableHandler:mergeEntity() Incoming PartitionKey:${partitionKey} RowKey:${rowKey} in URL parameters don't align with entity body PartitionKey:${options.tableEntityProperties.PartitionKey} RowKey:${options.tableEntityProperties.RowKey}.` + ); + } + this.checkProperties(context, options.tableEntityProperties); + } + this.checkMergeIfMatch(options, context); + // check that key properties are valid + this.validateKey(context, partitionKey); + this.validateKey(context, rowKey); + } + + /** + * Check that the ifMatch header is valid on merge request + * + * @private + * @param {Models.TableMergeEntityOptionalParams} options + * @param {Context} context + * @memberof TableHandler + */ + private checkMergeIfMatch( + options: Models.TableMergeEntityOptionalParams, + context: Context + ) { + if (options?.ifMatch && options.ifMatch !== "*" && options.ifMatch !== "") { + if (isEtagValid(options.ifMatch)) { + throw StorageErrorFactory.getInvalidOperation(context); + } + } + } + public async deleteEntity( _table: string, partitionKey: string | undefined, @@ -903,7 +941,11 @@ export default class TableHandler extends BaseHandler implements ITableHandler { const contentTypeResponse = tableCtx.request ?.getHeader("content-type") ?.replace("batch", "batchresponse"); - const tableBatchManager = new TableBatchOrchestrator(tableCtx, this); + const tableBatchManager = new TableBatchOrchestrator( + tableCtx, + this, + this.metadataStore + ); const requestBody = await TableBatchUtils.StreamToString(body); this.logger.debug( @@ -915,8 +957,7 @@ export default class TableHandler extends BaseHandler implements ITableHandler { const response = await tableBatchManager.processBatchRequestAndSerializeResponse( - requestBody, - this.metadataStore + requestBody ); this.logger.debug( diff --git a/tests/table/apis/table.batch.errorhandling.test.ts b/tests/table/apis/table.batch.errorhandling.test.ts index 545eeb015..0a497155e 100644 --- a/tests/table/apis/table.batch.errorhandling.test.ts +++ b/tests/table/apis/table.batch.errorhandling.test.ts @@ -565,4 +565,43 @@ describe("table Entity APIs test", () => { } await tableClientrollback.deleteTable(); }); + + it("09. Batch API should fail to insert duplicate Entity with correct 400 Status and InvalidDuplicateRow error, @loki", async () => { + const partitionKey = createUniquePartitionKey(""); + const tableNameBatchError: string = getUniqueName("datatables"); + const myDupTestEntity = entityFactory.createBasicEntityForTest(partitionKey); + const testEntities: TableTestEntity[] = [ + entityFactory.createBasicEntityForTest(partitionKey), + myDupTestEntity, + myDupTestEntity + ]; + + const tableClientrollback = createAzureDataTablesClient( + testLocalAzuriteInstance, + tableNameBatchError + ); + + await tableClientrollback.createTable(); + + const transaction = new TableTransaction(); + for (const testEntity of testEntities) { + transaction.createEntity(testEntity); + } + + try { + const result = await tableClientrollback.submitTransaction( + transaction.actions + ); + assert.ok(result.subResponses[0].rowKey); + } catch (err: any) { + const restErr = err as RestError; + assert.strictEqual( + restErr.statusCode, + 400, + "Did not get expected 409 (InvalidDuplicateRow) error." + ); + } + + await tableClientrollback.deleteTable(); + }); }); diff --git a/tests/table/apis/table.entity.apostrophe.azure-storage.test.ts b/tests/table/apis/table.entity.apostrophe.azure-storage.test.ts new file mode 100644 index 000000000..af951e17b --- /dev/null +++ b/tests/table/apis/table.entity.apostrophe.azure-storage.test.ts @@ -0,0 +1,483 @@ +// Tests in this file are using @azure/data-tables + +import * as assert from "assert"; +import * as Azure from "azure-storage"; +import { configLogger } from "../../../src/common/Logger"; +import TableServer from "../../../src/table/TableServer"; +import { + getUniqueName, + overrideRequest, + restoreBuildRequestOptions +} from "../../testutils"; + +import { TestEntity } from "../models/TestEntity"; +import { AzureStorageSDKEntityFactory } from "../utils/AzureStorageSDKEntityFactory"; +import { + createConnectionStringForTest, + createTableServerForTest +} from "../utils/table.entity.test.utils"; + +// Set true to enable debug log +configLogger(false); +// For convenience, we have a switch to control the use +// of a local Azurite instance, otherwise we need an +// ENV VAR called AZURE_TABLE_STORAGE added to mocha +// script or launch.json containing +// Azure Storage Connection String (using SAS or Key). +const testLocalAzuriteInstance = true; + +const entityFactory = new AzureStorageSDKEntityFactory(); + +describe("table Entity APIs test - Apostrophe Tests using Azure-Storage", () => { + let server: TableServer; + const tableService = Azure.createTableService( + createConnectionStringForTest(testLocalAzuriteInstance) + ); + + tableService.enableGlobalHttpAgent = true; + + let tableName: string = getUniqueName("table"); + + const requestOverride = { headers: {} }; + + before(async () => { + overrideRequest(requestOverride, tableService); + server = createTableServerForTest(); + tableName = getUniqueName("table"); + await server.start(); + requestOverride.headers = { + Prefer: "return-content", + accept: "application/json;odata=fullmetadata" + }; + + const created = new Promise((resolve, reject) => { + tableService.createTable(tableName, (error, result, response) => { + if (error) { + reject(); + } else { + resolve(response); + } + }); + }); + + // we need to await here as we now also test against the service + // which is not as fast as our in memory DBs + await created.then().catch((createError) => { + throw new Error("failed to create table"); + }); + }); + + after(async () => { + restoreBuildRequestOptions(tableService); + tableService.removeAllListeners(); + await server.close(); + }); + + // https://github.com/Azure/Azurite/issues/1481 + it("01. Operates on batch items with double apostrophe in the middle, @loki", (done) => { + requestOverride.headers = { + Prefer: "return-content", + accept: "application/json;odata=fullmetadata" + }; + const singleApostrophePartition = "apos'strophe"; + const singleApostropheRowKey = "row'key"; + const doubleApostrophePartition = "apos''strophe"; + const doubleApostropheRowKey = "row''key"; + + const testEntities1: TestEntity[] = []; + // singleApostrophePartition tests + // pk ' rk ' + const insertEntity1 = entityFactory.createBasicEntityForTest(); + insertEntity1.PartitionKey._ = singleApostrophePartition; + insertEntity1.RowKey._ = singleApostropheRowKey + "1"; + testEntities1.push(insertEntity1); + // pk ' rk '' + const insertEntity2 = entityFactory.createBasicEntityForTest(); + insertEntity2.PartitionKey._ = singleApostrophePartition; + insertEntity2.RowKey._ = doubleApostropheRowKey + "1"; + testEntities1.push(insertEntity2); + // pk ' rk ' + const insertEntity3 = entityFactory.createBasicEntityForTest(); + insertEntity3.PartitionKey._ = singleApostrophePartition; + insertEntity3.RowKey._ = singleApostropheRowKey + "2"; + testEntities1.push(insertEntity3); + // pk ' rk '' + const insertEntity4 = entityFactory.createBasicEntityForTest(); + insertEntity4.PartitionKey._ = singleApostrophePartition; + insertEntity4.RowKey._ = doubleApostropheRowKey + "2"; + testEntities1.push(insertEntity4); + + // doubleApostrophePartition tests + const testEntities2: TestEntity[] = []; + // pk ' rk ' + const doubleEntity1 = entityFactory.createBasicEntityForTest(); + doubleEntity1.PartitionKey._ = doubleApostrophePartition; + doubleEntity1.RowKey._ = singleApostropheRowKey + "1"; + testEntities2.push(doubleEntity1); + // pk ' rk '' + const doubleEntity2 = entityFactory.createBasicEntityForTest(); + doubleEntity2.PartitionKey._ = doubleApostrophePartition; + doubleEntity2.RowKey._ = doubleApostropheRowKey + "1"; + testEntities2.push(doubleEntity2); + // pk ' rk ' + const doubleEntity3 = entityFactory.createBasicEntityForTest(); + doubleEntity3.PartitionKey._ = doubleApostrophePartition; + doubleEntity3.RowKey._ = singleApostropheRowKey + "2"; + testEntities2.push(doubleEntity3); + // pk ' rk '' + const doubleEntity4 = entityFactory.createBasicEntityForTest(); + doubleEntity4.PartitionKey._ = doubleApostrophePartition; + doubleEntity4.RowKey._ = doubleApostropheRowKey + "2"; + testEntities2.push(doubleEntity4); + + let testCount = 0; + // create Batch Transactions then delete batch transactions + testInsertBatch(testEntities1, tableService, tableName).then(() => { + testCount++; + return testInsertBatch(testEntities2, tableService, tableName) + .then(() => { + testCount++; + return testMergeBatch(testEntities1, tableService, tableName) + .catch((error) => { + assert.fail(error.message); + }) + .then(() => { + testCount++; + return testMergeBatch(testEntities2, tableService, tableName) + .catch((error) => { + assert.fail(error.message); + }) + .then(() => { + testCount++; + return testDeleteBatch(testEntities1, tableService, tableName) + .catch((error) => { + assert.fail(error.message); + }) + .then(() => { + testCount++; + return testDeleteBatch( + testEntities2, + tableService, + tableName + ) + .catch((error) => { + assert.fail(error.message); + }) + .then(() => { + done(); + }); + }); + }) + .catch((error) => { + assert.fail(error.message); + }); + }); + }) + .catch((error) => { + assert.fail(error.message); + }) + .finally(() => { + // Sanity check to make sure all tests ran + // and that we have not missed any callbacks + assert.strictEqual(testCount, 5); + }); + }); + }); + + it("02. Merge on an Entity with double quote in PartitionKey and RowKey, @loki", (done) => { + const partitionKey = "pk double''quote string"; + const rowKey = "rk double''quote string"; + + // Insert entity with the specific pk,rk + const entityInsert = new TestEntity(partitionKey, rowKey, "value1"); + tableService.insertEntity( + tableName, + entityInsert, + (insertError, insertResult, insertresponse) => { + if (insertError) { + assert.fail(insertError.message); + } else { + // merge entity with the specific pk,rk, to a different value + const entityMerge = new TestEntity(partitionKey, rowKey, "value2"); + tableService.mergeEntity( + tableName, + entityMerge, + (mergeError, updateResult, updateResponse) => { + if (!mergeError) { + assert.strictEqual(updateResponse.statusCode, 204); // Precondition succeeded + + // retrieve entity with the specific pk,rk, and validate value is updated + tableService.retrieveEntity( + tableName, + partitionKey, + rowKey, + (error, result) => { + if (error) { + assert.fail(error.message); + } else { + assert.strictEqual(result.PartitionKey._, partitionKey); + assert.strictEqual(result.RowKey._, rowKey); + assert.strictEqual(result.myValue._, "value2"); + done(); + } + } + ); + } else { + assert.fail(mergeError.message); + } + } + ); + } + } + ); + }); +}); + +function testInsertBatch( + testEntities: TestEntity[], + tableService: Azure.TableService, + tableName: string +): Promise { + return new Promise((resolve, reject) => { + const insertEntityBatch: Azure.TableBatch = new Azure.TableBatch(); + for (const entity of testEntities) { + insertEntityBatch.insertEntity(entity, { echoContent: true }); + } + tableService.executeBatch( + tableName, + insertEntityBatch, + (batchError, batchResult, batchResponse) => { + if (batchError) { + reject(batchError); + } else { + assert.strictEqual(batchResponse.statusCode, 202); + tableService.retrieveEntity( + tableName, + testEntities[2].PartitionKey._, + testEntities[2].RowKey._, + (error: any, result, response) => { + assert.strictEqual( + response.statusCode, + 200, + "We did not find the 3rd entity!" + ); + tableService.retrieveEntity( + tableName, + testEntities[3].PartitionKey._, + testEntities[3].RowKey._, + (error2: any, result2, response2) => { + assert.strictEqual( + response2.statusCode, + 200, + "We did not find the 4th entity!" + ); + tableService.retrieveEntity( + tableName, + testEntities[0].PartitionKey._, + testEntities[0].RowKey._, + (error3: any, result3, response3) => { + assert.strictEqual( + response3.statusCode, + 200, + "We did not find the 1st entity!" + ); + tableService.retrieveEntity( + tableName, + testEntities[1].PartitionKey._, + testEntities[1].RowKey._, + (error4: any, result4, response4) => { + assert.strictEqual( + response4.statusCode, + 200, + "We did not find the 2nd entity!" + ); + resolve(); + } + ); + } + ); + } + ); + } + ); + } + } + ); + }); +} + +function testDeleteBatch( + testEntities: TestEntity[], + tableService: Azure.TableService, + tableName: string +): Promise { + return new Promise((resolve, reject) => { + const insertEntityBatch: Azure.TableBatch = new Azure.TableBatch(); + for (const entity of testEntities) { + insertEntityBatch.deleteEntity(entity); + } + tableService.executeBatch( + tableName, + insertEntityBatch, + (batchError, batchResult, batchResponse) => { + if (batchError) { + reject(batchError); + } else { + assert.strictEqual(batchResponse.statusCode, 202); + for (const subResponse of batchResult) { + assert.strictEqual( + subResponse.response.statusCode, + 204, + "We did not delete the entity!" + ); + } + tableService.retrieveEntity( + tableName, + testEntities[2].PartitionKey._, + testEntities[2].RowKey._, + (error: any, result, response) => { + assert.strictEqual( + response.statusCode, + 404, + "We did not find the 3rd entity!" + ); + tableService.retrieveEntity( + tableName, + testEntities[3].PartitionKey._, + testEntities[3].RowKey._, + (error2: any, result2, response2) => { + assert.strictEqual( + response2.statusCode, + 404, + "We did not find the 4th entity!" + ); + tableService.retrieveEntity( + tableName, + testEntities[0].PartitionKey._, + testEntities[0].RowKey._, + (error3: any, result3, response3) => { + assert.strictEqual( + response3.statusCode, + 404, + "We did not find the 1st entity!" + ); + tableService.retrieveEntity( + tableName, + testEntities[1].PartitionKey._, + testEntities[1].RowKey._, + (error4: any, result4, response4) => { + assert.strictEqual( + response4.statusCode, + 404, + "We did not find the 2nd entity!" + ); + resolve(); + } + ); + } + ); + } + ); + } + ); + } + } + ); + }); +} + +function testMergeBatch( + testEntities: TestEntity[], + tableService: Azure.TableService, + tableName: string +): Promise { + return new Promise((resolve, reject) => { + const insertEntityBatch: Azure.TableBatch = new Azure.TableBatch(); + for (const entity of testEntities) { + entity.myValue._ = "new value"; + insertEntityBatch.mergeEntity(entity); + } + tableService.executeBatch( + tableName, + insertEntityBatch, + (batchError, batchResult, batchResponse) => { + if (batchError) { + reject(batchError); + } else { + assert.strictEqual(batchResponse.statusCode, 202); + // the checks below deliverately do not follow the ordering + // of the entity array + tableService.retrieveEntity( + tableName, + testEntities[2].PartitionKey._, + testEntities[2].RowKey._, + (error: any, result, response) => { + assert.strictEqual( + response.statusCode, + 200, + "We did not find the 3rd entity!" + ); + assert.strictEqual( + result.myValue._, + "new value", + "We did not find the matching value on the 3rd entity!" + ); + tableService.retrieveEntity( + tableName, + testEntities[3].PartitionKey._, + testEntities[3].RowKey._, + (error2: any, result2, response2) => { + assert.strictEqual( + response2.statusCode, + 200, + "We did not find the 4th entity!" + ); + assert.strictEqual( + result2.myValue._, + "new value", + "We did not find the matching value on the 4th entity!" + ); + tableService.retrieveEntity( + tableName, + testEntities[0].PartitionKey._, + testEntities[0].RowKey._, + (error3: any, result3, response3) => { + assert.strictEqual( + response3.statusCode, + 200, + "We did not find the 1st entity!" + ); + assert.strictEqual( + result3.myValue._, + "new value", + "We did not find the matching value on the 1st entity!" + ); + tableService.retrieveEntity( + tableName, + testEntities[1].PartitionKey._, + testEntities[1].RowKey._, + (error4: any, result4, response4) => { + assert.strictEqual( + response4.statusCode, + 200, + "We did not find the 2nd entity!" + ); + assert.strictEqual( + result4.myValue._, + "new value", + "We did not find the matching value on the 2nd entity!" + ); + resolve(); + } + ); + } + ); + } + ); + } + ); + } + } + ); + }); +} diff --git a/tests/table/apis/table.entity.apostrophe.data-tables.test.ts b/tests/table/apis/table.entity.apostrophe.data-tables.test.ts new file mode 100644 index 000000000..a8509ccb6 --- /dev/null +++ b/tests/table/apis/table.entity.apostrophe.data-tables.test.ts @@ -0,0 +1,300 @@ +// Tests in this file are using @azure/data-tables + +import * as assert from "assert"; +import { TableClient, TableTransaction } from "@azure/data-tables"; +import { configLogger } from "../../../src/common/Logger"; +import TableServer from "../../../src/table/TableServer"; +import { getUniqueName } from "../../testutils"; +import { + AzureDataTablesTestEntityFactory, + TableTestEntity +} from "../models/AzureDataTablesTestEntityFactory"; +import { + createAzureDataTablesClient, + createTableServerForTestHttps +} from "../utils/table.entity.test.utils"; + +// Set true to enable debug log +configLogger(false); +// For convenience, we have a switch to control the use +// of a local Azurite instance, otherwise we need an +// ENV VAR called AZURE_TABLE_STORAGE added to mocha +// script or launch.json containing +// Azure Storage Connection String (using SAS or Key). +const testLocalAzuriteInstance = true; + +const entityFactory = new AzureDataTablesTestEntityFactory(); + +describe("table Entity APIs test - Apostrophe Tests using Azure/data-tables", () => { + let server: TableServer; + + before(async () => { + server = createTableServerForTestHttps(); + await server.start(); + }); + + after(async () => { + await server.close(); + }); + + // https://github.com/Azure/Azurite/issues/1481 + it("01. Should create, get and delete entities using PartitionKey and RowKey containing double apostrophe, @loki", async () => { + const tableClient = await createTestTable("simpleApostrophe"); + const oneApostrophePartition = "apos'strophe"; + const oneApostropheEntity1 = await simpleCreateKeyTest( + oneApostrophePartition, + "O'1", + tableClient + ); + const oneApostropheEntity2 = await simpleCreateKeyTest( + oneApostrophePartition, + "O'2", + tableClient + ); + + const twoApostrophePartition = "apos''strophe"; + const twoApostropheEntity1 = await simpleCreateKeyTest( + twoApostrophePartition, + "O''1", + tableClient + ); + const twoApostropheEntity2 = await simpleCreateKeyTest( + twoApostrophePartition, + "O''2", + tableClient + ); + + // now delete the entities and ensure that delete path is valid + await simpleDeleteKeyTest( + twoApostropheEntity2.partitionKey, + twoApostropheEntity2.rowKey, + tableClient + ); + await simpleDeleteKeyTest( + oneApostropheEntity1.partitionKey, + oneApostropheEntity1.rowKey, + tableClient + ); + await simpleDeleteKeyTest( + oneApostropheEntity2.partitionKey, + oneApostropheEntity2.rowKey, + tableClient + ); + await simpleDeleteKeyTest( + twoApostropheEntity1.partitionKey, + twoApostropheEntity1.rowKey, + tableClient + ); + + await tableClient.deleteTable(); + }); + + it("02. Should create, get and delete entities using PartitionKey and RowKey containing double apostrophe in Batch, @loki", async () => { + const tableClient = await createTestTable("batchApostrophe"); + const singleApostrophe = "apos'strophe"; + const doubleApostrophe = "apos''strophe"; + const testEntities1: { partitionKey: string; rowKey: string }[] = [ + { + partitionKey: singleApostrophe, + rowKey: singleApostrophe + "1" + }, + { + partitionKey: singleApostrophe, + rowKey: singleApostrophe + "2" + }, + { + partitionKey: singleApostrophe, + rowKey: doubleApostrophe + "1" + }, + { + partitionKey: singleApostrophe, + rowKey: doubleApostrophe + "2" + } + ]; + const testEntities2: { partitionKey: string; rowKey: string }[] = [ + { + partitionKey: doubleApostrophe, + rowKey: doubleApostrophe + "1" + }, + { + partitionKey: doubleApostrophe, + rowKey: doubleApostrophe + "2" + }, + { + partitionKey: doubleApostrophe, + rowKey: singleApostrophe + "1" + }, + { + partitionKey: doubleApostrophe, + rowKey: singleApostrophe + "2" + } + ]; + + // First pass and ordering + await upsertTransactionTest(testEntities1, tableClient); + await upsertTransactionTest(testEntities2, tableClient); + await deleteTransactionTest(testEntities1, tableClient); + await deleteTransactionTest(testEntities2, tableClient); + + // second pass and ordering + await upsertTransactionTest(testEntities2, tableClient); + await upsertTransactionTest(testEntities1, tableClient); + await deleteTransactionTest(testEntities1, tableClient); + await deleteTransactionTest(testEntities2, tableClient); + + // third pass and ordering + await upsertTransactionTest(testEntities2, tableClient); + await upsertTransactionTest(testEntities1, tableClient); + await deleteTransactionTest(testEntities2, tableClient); + await deleteTransactionTest(testEntities1, tableClient); + + // fourth pass and ordering + await upsertTransactionTest(testEntities1, tableClient); + await upsertTransactionTest(testEntities2, tableClient); + await deleteTransactionTest(testEntities2, tableClient); + await deleteTransactionTest(testEntities1, tableClient); + + await tableClient.deleteTable(); + }); +}); + +async function deleteTransactionTest( + testEntities: { partitionKey: string; rowKey: string }[], + tableClient: TableClient +) { + const transaction2 = new TableTransaction(); + for (const testEntity of testEntities) { + transaction2.deleteEntity(testEntity.partitionKey, testEntity.rowKey); + } + + try { + const result = await tableClient.submitTransaction(transaction2.actions); + assert.notStrictEqual(result, undefined); + assert.strictEqual( + result.status, + 202, + "We did not get a 202 on batch delete" + ); + } catch (err: any) { + assert.strictEqual(err, undefined, `We failed to delete with ${err}`); + } +} + +async function upsertTransactionTest( + testEntities: { partitionKey: string; rowKey: string }[], + tableClient: TableClient +) { + const transaction = new TableTransaction(); + for (const testEntity of testEntities) { + // Upsert will use Batch Merge like the issue reported + // however the root cause in this case was that the .Net SDK + // does not add the properties to the request body + transaction.upsertEntity(testEntity); + } + try { + const result = await tableClient.submitTransaction(transaction.actions); + assert.strictEqual(result.status, 202); + assert.strictEqual(result.subResponses.length, testEntities.length); + assert.strictEqual(result.subResponses[0].status, 204); + assert.strictEqual(result.subResponses[1].status, 204); + } catch (err: any) { + assert.strictEqual(err, undefined, `We failed to create with ${err}`); + } + + // validate that we successfully created each entity, + // and that the format of the row key was not changed by serialization + try { + for (const entity of testEntities) { + const entity0 = await tableClient.getEntity( + entity.partitionKey, + entity.rowKey + ); + assert.strictEqual(entity0.rowKey, entity.rowKey); + } + } catch (err: any) { + assert.strictEqual(err, undefined, `We failed to retrieve with ${err}`); + } +} + +async function createTestTable(tableName: string): Promise { + const tableClient = createAzureDataTablesClient( + testLocalAzuriteInstance, + getUniqueName(tableName) + ); + + // first create 2 partitions and 2 keys with 1 apostrophe + await tableClient.createTable(); + return tableClient; +} + +async function simpleDeleteKeyTest( + apostrophePartition: string, + apostropheRowKey: string, + tableClient: TableClient +) { + // now delete the entity and ensure that delete path is valid + try { + const result = await tableClient.deleteEntity( + apostrophePartition, + apostropheRowKey + ); + assert.notStrictEqual(result, undefined); + } catch (err: any) { + assert.strictEqual(err, undefined, `We failed to delete with ${err}`); + } + + // check that deleted entity is gone + try { + const entity1 = await tableClient.getEntity( + apostrophePartition, + apostropheRowKey + ); + assert.strictEqual(entity1, undefined); + } catch (err: any) { + assert.strictEqual( + err.statusCode, + 404, + `We should failed to retrieve with ResourceNotFound, but got ${err}` + ); + } +} + +async function simpleCreateKeyTest( + apostrophePartition: string, + apostropheRowKey: string, + tableClient: TableClient +): Promise<{ partitionKey: string; rowKey: string }> { + const testEntityApostrophe: TableTestEntity = + entityFactory.createBasicEntityForTest(apostrophePartition); + + testEntityApostrophe.rowKey = apostropheRowKey; + + try { + const result = await tableClient.createEntity(testEntityApostrophe); + assert.ok(result.etag); + } catch (err: any) { + assert.strictEqual(err, undefined, `We failed to create with ${err}`); + } + + // validate that we successfully created each entity, + // and that the format of the row key was not changed by serialization + try { + const entity0 = await tableClient.getEntity( + testEntityApostrophe.partitionKey, + testEntityApostrophe.rowKey + ); + + assert.strictEqual(entity0.rowKey, testEntityApostrophe.rowKey); + return { + partitionKey: testEntityApostrophe.partitionKey, + rowKey: testEntityApostrophe.rowKey + }; + } catch (err: any) { + assert.strictEqual(err, undefined, `We failed to retrieve with ${err}`); + } + + return { + partitionKey: testEntityApostrophe.partitionKey, + rowKey: testEntityApostrophe.rowKey + }; +} diff --git a/tests/table/apis/table.entity.azure.data-tables.test.ts b/tests/table/apis/table.entity.azure.data-tables.test.ts index 7b545ab6d..8a7fc1ad1 100644 --- a/tests/table/apis/table.entity.azure.data-tables.test.ts +++ b/tests/table/apis/table.entity.azure.data-tables.test.ts @@ -864,7 +864,7 @@ describe("table Entity APIs test - using Azure/data-tables", () => { }); // https://github.com/Azure/Azurite/issues/754 - it("21. Should create entities using batch and RowKey starting with %, @loki", async () => { + it("21. Should create and delete entities using batch and RowKey starting with %, @loki", async () => { const tableClient = createAzureDataTablesClient( testLocalAzuriteInstance, getUniqueName("percentBatch") @@ -891,6 +891,21 @@ describe("table Entity APIs test - using Azure/data-tables", () => { assert.strictEqual(err, undefined, `We failed with ${err}`); } + const transaction2 = new TableTransaction(); + for (const testEntity of testEntities) { + transaction2.deleteEntity(testEntity.partitionKey, testEntity.rowKey); + } + try { + const result2 = await tableClient.submitTransaction(transaction2.actions); + assert.strictEqual( + result2.subResponses[0].status, + 204, + "We did not get status 204 on delete" + ); + } catch (err: any) { + assert.strictEqual(err, undefined, `We failed to delete with ${err}`); + } + await tableClient.deleteTable(); }); @@ -1280,4 +1295,232 @@ describe("table Entity APIs test - using Azure/data-tables", () => { await tableClient.deleteTable(); }); + + // https://github.com/Azure/Azurite/issues/1481 + it("29. Should create, get and delete entities using RowKey containing apostrophe, @loki", async () => { + const tableClient = createAzureDataTablesClient( + testLocalAzuriteInstance, + getUniqueName("apostrophe") + ); + await tableClient.createTable(); + const percentPartition = "percentRowBatch"; + const testEntity: TableTestEntity = + entityFactory.createBasicEntityForTest(percentPartition); + + testEntity.rowKey = testEntity.rowKey.replace("row", "O'"); + + try { + const result = await tableClient.createEntity(testEntity); + assert.ok(result.etag); + } catch (err: any) { + assert.strictEqual(err, undefined, `We failed to create with ${err}`); + } + + // validate that we successfully created each entity, + // and that the format of the row key was not changed by serialization + try { + const entity0 = await tableClient.getEntity( + testEntity.partitionKey, + testEntity.rowKey + ); + + assert.strictEqual(entity0.rowKey, testEntity.rowKey); + } catch (err: any) { + assert.strictEqual(err, undefined, `We failed to retrieve with ${err}`); + } + + // now delete the entity and ensure that delete path is valid + try { + const result = await tableClient.deleteEntity( + testEntity.partitionKey, + testEntity.rowKey + ); + assert.notStrictEqual(result, undefined); + } catch (err: any) { + assert.strictEqual(err, undefined, `We failed to delete with ${err}`); + } + + // check that deleted entity is gone + try { + const entity1 = await tableClient.getEntity( + testEntity.partitionKey, + testEntity.rowKey + ); + assert.strictEqual(entity1, undefined); + } catch (err: any) { + assert.strictEqual( + err.statusCode, + 404, + `We should failed to retrieve with ResourceNotFound, but got ${err}` + ); + } + + await tableClient.deleteTable(); + }); + + it("30. Should create, get and delete entities using batch and RowKey containing apostrophe, @loki", async () => { + const tableClient = createAzureDataTablesClient( + testLocalAzuriteInstance, + getUniqueName("percentBatch") + ); + await tableClient.createTable(); + const percentPartition = "percentRowBatch"; + const testEntities: TableTestEntity[] = [ + entityFactory.createBasicEntityForTest(percentPartition), + entityFactory.createBasicEntityForTest(percentPartition), + entityFactory.createBasicEntityForTest(percentPartition) + ]; + testEntities[0].rowKey = testEntities[0].rowKey.replace("row", "O'"); + testEntities[1].rowKey = testEntities[1].rowKey.replace("row", "O'"); + testEntities[2].rowKey = testEntities[2].rowKey.replace("row", "O'"); + const transaction = new TableTransaction(); + for (const testEntity of testEntities) { + transaction.createEntity(testEntity); + } + + try { + const result = await tableClient.submitTransaction(transaction.actions); + assert.ok(result.subResponses[0].rowKey); + } catch (err: any) { + assert.strictEqual(err, undefined, `We failed to create with ${err}`); + } + + // validate that we successfully created each entity, + // and that the format of the row key was not changed by serialization + try { + const entity0 = await tableClient.getEntity( + testEntities[0].partitionKey, + testEntities[0].rowKey + ); + const entity1 = await tableClient.getEntity( + testEntities[1].partitionKey, + testEntities[1].rowKey + ); + const entity2 = await tableClient.getEntity( + testEntities[2].partitionKey, + testEntities[2].rowKey + ); + assert.strictEqual(entity0.rowKey, testEntities[0].rowKey); + assert.strictEqual(entity1.rowKey, testEntities[1].rowKey); + assert.strictEqual(entity2.rowKey, testEntities[2].rowKey); + } catch (err: any) { + assert.strictEqual(err, undefined, `We failed to retrieve with ${err}`); + } + + // now delete the entities and ensure that delete path is valid + const transaction2 = new TableTransaction(); + transaction2.deleteEntity( + testEntities[0].partitionKey, + testEntities[0].rowKey + ); + transaction2.deleteEntity( + testEntities[1].partitionKey, + testEntities[1].rowKey + ); + transaction2.deleteEntity( + testEntities[2].partitionKey, + testEntities[2].rowKey + ); + + try { + const result = await tableClient.submitTransaction(transaction2.actions); + assert.notStrictEqual(result, undefined); + assert.strictEqual( + result.status, + 202, + "We did not get a 202 on batch delete" + ); + } catch (err: any) { + assert.strictEqual(err, undefined, `We failed to delete with ${err}`); + } + + await tableClient.deleteTable(); + }); + + // https://github.com/Azure/Azurite/issues/1958 + it("31. Should create, get and delete entities using Azure Data Tables SDK batch merge operation, @loki", async () => { + const tableClient = createAzureDataTablesClient( + testLocalAzuriteInstance, + getUniqueName("issue1958") + ); + try { + await tableClient.createTable(); + } catch (createErr) { + assert.strictEqual( + createErr, + undefined, + `We failed to create with ${createErr}` + ); + } + const issue1958 = "issue1958"; + const testEntities: { partitionKey: string; rowKey: string }[] = [ + { + partitionKey: issue1958, + rowKey: "c8b06c47-c755-4b53-b3da-73949ebbb24f" + }, + { + partitionKey: issue1958, + rowKey: "c8b06c47-c755-4b53-b3da-73949ebbb24e" + } + ]; + const transaction = new TableTransaction(); + for (const testEntity of testEntities) { + // Upsert will use Batch Merge like the issue reported + // however the root cause in this case was that the .Net SDK + // does not add the properties to the request body + transaction.upsertEntity(testEntity); + } + + try { + const result = await tableClient.submitTransaction(transaction.actions); + assert.strictEqual(result.status, 202); + assert.strictEqual(result.subResponses.length, 2); + assert.strictEqual(result.subResponses[0].status, 204); + assert.strictEqual(result.subResponses[1].status, 204); + } catch (err: any) { + assert.strictEqual(err, undefined, `We failed to create with ${err}`); + } + + // validate that we successfully created each entity, + // and that the format of the row key was not changed by serialization + try { + const entity0 = await tableClient.getEntity( + testEntities[0].partitionKey, + testEntities[0].rowKey + ); + const entity1 = await tableClient.getEntity( + testEntities[1].partitionKey, + testEntities[1].rowKey + ); + assert.strictEqual(entity0.rowKey, testEntities[0].rowKey); + assert.strictEqual(entity1.rowKey, testEntities[1].rowKey); + } catch (err: any) { + assert.strictEqual(err, undefined, `We failed to retrieve with ${err}`); + } + + // now delete the entities and ensure that delete path is valid + const transaction2 = new TableTransaction(); + transaction2.deleteEntity( + testEntities[0].partitionKey, + testEntities[0].rowKey + ); + transaction2.deleteEntity( + testEntities[1].partitionKey, + testEntities[1].rowKey + ); + + try { + const result = await tableClient.submitTransaction(transaction2.actions); + assert.notStrictEqual(result, undefined); + assert.strictEqual( + result.status, + 202, + "We did not get a 202 on batch delete" + ); + } catch (err: any) { + assert.strictEqual(err, undefined, `We failed to delete with ${err}`); + } + + await tableClient.deleteTable(); + }); }); diff --git a/tests/table/apis/table.entity.rest.test.ts b/tests/table/apis/table.entity.rest.test.ts index fa6df95b6..b96f3a5a7 100644 --- a/tests/table/apis/table.entity.rest.test.ts +++ b/tests/table/apis/table.entity.rest.test.ts @@ -313,7 +313,8 @@ describe("table Entity APIs REST tests", () => { assert.strictEqual(weMerged, 1); }); - it("Should not be able to use query enties in a batch request, @loki", async () => { + // the logic tests that we pass from batch to the query handler which was added as functionality later + it("Should be able to use query enties in a batch request, @loki", async () => { const body = JSON.stringify({ TableName: reproFlowsTableName }); @@ -328,7 +329,7 @@ describe("table Entity APIs REST tests", () => { ); assert.strictEqual(createTableResult.status, 201); - const batchWithQueryRequestString = `--batch_f351702c-c8c8-48c6-af2c-91b809c651ce\r\nContent-Type: application/http\r\nContent-Transfer-Encoding: binary\r\n\r\nGET http://127.0.0.1:10002/devstoreaccount1/${reproFlowsTableName}()? HTTP/1.1\r\nAccept: application/json;odata=minimalmetadata\r\n--batch_f351702c-c8c8-48c6-af2c-91b809c651ce--\r\n`; + const batchWithQueryRequestString = `--batch_f351702c-c8c8-48c6-af2c-91b809c651ce\r\nContent-Type: application/http\r\nContent-Transfer-Encoding: binary\r\n\r\nGET http://127.0.0.1:10002/devstoreaccount1/${reproFlowsTableName}(PartitionKey='Channel_19',RowKey='2')? HTTP/1.1\r\nAccept: application/json;odata=minimalmetadata\r\n--batch_f351702c-c8c8-48c6-af2c-91b809c651ce--\r\n`; const queryRequestResult = await postToAzurite( `$batch`, @@ -345,14 +346,14 @@ describe("table Entity APIs REST tests", () => { ); assert.strictEqual(queryRequestResult.status, 202); - // we expect this to fail, as we are using query entities inside the batch - const notImplemented = queryRequestResult.data.match( - "The requested operation is not implemented" + // we expect this to fail, as we do not create the entities first + const notExist = queryRequestResult.data.match( + "0:The specified resource does not exist." ).length; assert.strictEqual( - notImplemented, + notExist, 1, - "We did not get the expected NotImplemented error." + "We did not get the expected non-existent error." ); }); diff --git a/tests/table/apis/table.entity.test.ts b/tests/table/apis/table.entity.test.ts index 3cc2e3f0f..2b74afc5f 100644 --- a/tests/table/apis/table.entity.test.ts +++ b/tests/table/apis/table.entity.test.ts @@ -1609,9 +1609,9 @@ describe("table Entity APIs test - using Azure-Storage", () => { }); }); - it("36. Merge on an Entity with single quota in PartitionKey and RowKey, @loki", (done) => { + it("36. Merge on an Entity with single quote in PartitionKey and RowKey, @loki", (done) => { const partitionKey = "pk single'quota string"; - const rowKey= "rk single'quota string"; + const rowKey = "rk single'quota string"; // Insert entity with the specific pk,rk const entityInsert = new TestEntity(partitionKey, rowKey, "value1"); @@ -1622,9 +1622,7 @@ describe("table Entity APIs test - using Azure-Storage", () => { if (insertError) { assert.fail(insertError.message); done(); - } - else - { + } else { // merge entity with the specific pk,rk, to a different value const entityMerge = new TestEntity(partitionKey, rowKey, "value2"); tableService.mergeEntity( @@ -1643,24 +1641,22 @@ describe("table Entity APIs test - using Azure-Storage", () => { if (error) { assert.fail(error.message); done(); - } - else - { + } else { assert.strictEqual(result.PartitionKey._, partitionKey); assert.strictEqual(result.RowKey._, rowKey); assert.strictEqual(result.myValue._, "value2"); done(); } } - ); + ); } else { assert.fail(mergeError.message); done(); } } - ); + ); } } - ); + ); }); }); diff --git a/tests/table/apis/table.test.ts b/tests/table/apis/table.test.ts index f190319a4..6051bb996 100644 --- a/tests/table/apis/table.test.ts +++ b/tests/table/apis/table.test.ts @@ -436,4 +436,90 @@ describe("table APIs test", () => { ); }); }); + + // https://github.com/Azure/Azurite/issues/1726 + it("should not accidentally delete the wrong similarly named table, @loki", (done) => { + const testTablePrefix = "deleteTest"; + const tableName = getUniqueName(testTablePrefix); + tableService.createTable(tableName, (createError) => { + if (createError) { + assert.ifError(createError); + } + tableService.listTablesSegmentedWithPrefix( + testTablePrefix, + null as any, + { maxResults: 250 }, + (error: any, result: any, response: any) => { + assert.strictEqual(error, null); + let validResult: boolean = false; + // look for tableName in the result.entries[] + for (const entry of result.entries) { + if (entry === tableName) { + validResult = true; + } + } + + assert.strictEqual( + validResult, + true, + "We did not find the expected table!" + ); + assert.notStrictEqual(response, null); + + // now create a second table with a similar name + const tableName2 = getUniqueName(testTablePrefix); + tableService.createTable(tableName2, (createError) => { + if (createError) { + assert.ifError(createError); + } + tableService.listTablesSegmentedWithPrefix( + testTablePrefix, + null as any, + { maxResults: 250 }, + (error: any, result: any, response: any) => { + assert.strictEqual(error, null); + validResult = false; + for (const entry of result.entries) { + if (entry === tableName2) { + validResult = true; + } + } + assert.strictEqual( + validResult, + true, + "We did not find the expected table!" + ); + assert.notStrictEqual(response, null); + // now delete the first table and check that the correct table was deleted + tableService.deleteTable(tableName, (deleteError) => { + assert.ifError(deleteError); + tableService.listTablesSegmentedWithPrefix( + testTablePrefix, + null as any, + { maxResults: 250 }, + (error: any, result: any, response: any) => { + assert.strictEqual(error, null); + validResult = false; + for (const entry of result.entries) { + if (entry === tableName) { + validResult = true; + } + } + assert.strictEqual( + validResult, + false, + "We found the table that should have been deleted!" + ); + assert.notStrictEqual(response, null); + done(); + } + ); + }); + } + ); + }); + } + ); + }); + }); }); diff --git a/tests/table/dotnet/AzuriteTableTest/Program.cs b/tests/table/dotnet/AzuriteTableTest/Program.cs index 8ac395286..1b0996cc3 100644 --- a/tests/table/dotnet/AzuriteTableTest/Program.cs +++ b/tests/table/dotnet/AzuriteTableTest/Program.cs @@ -14,10 +14,10 @@ class Program static async Task Main(string[] args) { // delete batch with cosmos - await TestForIssue1439.RunTest(); + await TestForIssue1958.RunTest(); - // delete batch with data Tables - await TestForDataTablesDeleteBatch.RunTest(); + // // delete batch with data Tables + // await TestForDataTablesDeleteBatch.RunTest(); } } } diff --git a/tests/table/dotnet/AzuriteTableTest/TestForIssue1958.cs b/tests/table/dotnet/AzuriteTableTest/TestForIssue1958.cs new file mode 100644 index 000000000..362b85960 --- /dev/null +++ b/tests/table/dotnet/AzuriteTableTest/TestForIssue1958.cs @@ -0,0 +1,35 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Threading.Tasks; +using Microsoft.Azure.Cosmos.Table; + +namespace AzuriteTableTest +{ + internal static class TestForIssue1958 + { + internal static async Task RunTest() + { + var storageAccount = CloudStorageAccount.Parse("UseDevelopmentStorage=true"); + var tableClient = storageAccount.CreateCloudTableClient(); + + var client = tableClient.GetTableReference("foo"); + client.CreateIfNotExists(); + + var batch = new TableBatchOperation + { + TableOperation.InsertOrMerge(new DynamicTableEntity("foo", "c8b06c47-c755-4b53-b3da-73949ebbb24f")), + TableOperation.InsertOrMerge(new DynamicTableEntity("foo", "08667dfd-d2e0-4e20-a51e-7bc13d01c89c")) + }; + + // This errors with a 500 response + var result = await client.ExecuteBatchAsync(batch); + if(result[0].HttpStatusCode != 204 || result[1].HttpStatusCode != 204) + { + throw new Exception("Expected 204 response"); + } + // clean up + client.DeleteIfExists(); + } + } +} diff --git a/tests/table/unit/deserialization.unit.test.ts b/tests/table/unit/deserialization.unit.test.ts index 4b71355f1..b185611ba 100644 --- a/tests/table/unit/deserialization.unit.test.ts +++ b/tests/table/unit/deserialization.unit.test.ts @@ -1,8 +1,7 @@ // Unit Tests for serialization import * as assert from "assert"; -import { BatchType } from "../../../src/common/batch/BatchOperation"; -import BatchRequestHeaders from "../../../src/common/batch/BatchRequestHeaders"; -import { BatchSerialization } from "../../../src/common/batch/BatchSerialization"; +import BatchRequestHeaders from "../../../src/table/batch/BatchRequestHeaders"; +import { BatchSerialization } from "../../../src/table/batch/BatchSerialization"; import { TableBatchSerialization } from "../../../src/table/batch/TableBatchSerialization"; import SerializationRequestMockStrings from "./mock.request.serialization.strings"; @@ -19,7 +18,6 @@ describe("batch deserialization unit tests, these are not the API integration te 3, "failed to deserialize correct number of operations" ); - assert.strictEqual(batchOperationArray[0].batchType, BatchType.table); assert.strictEqual( batchOperationArray[0].httpMethod, "POST", @@ -41,7 +39,6 @@ describe("batch deserialization unit tests, these are not the API integration te "wrong jsonBody parsed" ); // Second Batch Operation - assert.strictEqual(batchOperationArray[1].batchType, BatchType.table); assert.strictEqual( batchOperationArray[1].httpMethod, "POST", @@ -63,7 +60,6 @@ describe("batch deserialization unit tests, these are not the API integration te "wrong jsonBody parsed" ); // Third Batch Operation - assert.strictEqual(batchOperationArray[2].batchType, BatchType.table); assert.strictEqual( batchOperationArray[2].httpMethod, "POST", @@ -95,7 +91,6 @@ describe("batch deserialization unit tests, these are not the API integration te // this first test is currently a stupid test, as I control the type within the code // we want to test that we have deserialized the operation. - assert.strictEqual(batchOperationArray[0].batchType, BatchType.table); assert.strictEqual( batchOperationArray[0].httpMethod, "GET", @@ -127,7 +122,6 @@ describe("batch deserialization unit tests, these are not the API integration te serializer.deserializeBatchRequest(requestString); // First Batch Operation is an insert. - assert.strictEqual(batchOperationArray[0].batchType, BatchType.table); assert.strictEqual( batchOperationArray[0].httpMethod, "POST", @@ -149,7 +143,6 @@ describe("batch deserialization unit tests, these are not the API integration te "wrong jsonBody parsed" ); // Second Batch Operation is a merge - assert.strictEqual(batchOperationArray[1].batchType, BatchType.table); assert.strictEqual( batchOperationArray[1].httpMethod, "MERGE", @@ -181,7 +174,6 @@ describe("batch deserialization unit tests, these are not the API integration te serializer.deserializeBatchRequest(requestString); // First Batch Operation is an insert. - assert.strictEqual(batchOperationArray[0].batchType, BatchType.table); assert.strictEqual( batchOperationArray[0].httpMethod, "DELETE", @@ -203,7 +195,6 @@ describe("batch deserialization unit tests, these are not the API integration te "wrong jsonBody parsed" ); // Second Batch Operation is a Delete - assert.strictEqual(batchOperationArray[1].batchType, BatchType.table); assert.strictEqual( batchOperationArray[1].httpMethod, "DELETE", @@ -236,9 +227,6 @@ describe("batch deserialization unit tests, these are not the API integration te // There are 5 operations in the batch assert.strictEqual(batchOperationArray.length, 5); - // First Batch Operation is an insert. - assert.strictEqual(batchOperationArray[0].batchType, BatchType.table); - done(); }); @@ -394,8 +382,6 @@ describe("batch deserialization unit tests, these are not the API integration te "We did not deserialize all operations!" ); // First Batch Operation is an insert. - // {\"PartitionKey\":\"uuid\",\"RowKey\":\"rkey1\",\"price\":5,\"product\":\"product1\"} - assert.strictEqual(batchOperationArray[0].batchType, BatchType.table); assert.strictEqual( batchOperationArray[0].httpMethod, "POST", @@ -418,8 +404,6 @@ describe("batch deserialization unit tests, these are not the API integration te "wrong jsonBody parsed" ); // Second Batch Operation is an insert - // {\"PartitionKey\":\"uuid\",\"RowKey\":\"rkey2\",\"price\":10,\"product\":\"product2\" - assert.strictEqual(batchOperationArray[1].batchType, BatchType.table); assert.strictEqual( batchOperationArray[1].httpMethod, "POST", @@ -457,8 +441,6 @@ describe("batch deserialization unit tests, these are not the API integration te "We did not deserialize all operations!" ); // First Batch Operation is an insert. - // {\"PartitionKey\":\"uuid\",\"RowKey\":\"rkey1\",\"price\":5,\"product\":\"product1\"} - assert.strictEqual(batchOperationArray[0].batchType, BatchType.table); assert.strictEqual( batchOperationArray[0].httpMethod, "POST", @@ -481,8 +463,6 @@ describe("batch deserialization unit tests, these are not the API integration te "wrong jsonBody parsed" ); // Second Batch Operation is an insert - // {\"PartitionKey\":\"uuid\",\"RowKey\":\"rkey2\",\"price\":10,\"product\":\"product2\" - assert.strictEqual(batchOperationArray[1].batchType, BatchType.table); assert.strictEqual( batchOperationArray[1].httpMethod, "POST", @@ -515,7 +495,6 @@ describe("batch deserialization unit tests, these are not the API integration te serializer.deserializeBatchRequest(requestString); // First Batch Operation is a Delete. - assert.strictEqual(batchOperationArray[0].batchType, BatchType.table); assert.strictEqual( batchOperationArray[0].httpMethod, "DELETE", @@ -542,7 +521,6 @@ describe("batch deserialization unit tests, these are not the API integration te "wrong Etag parsed" ); // Third Batch Operation is a Delete - assert.strictEqual(batchOperationArray[2].batchType, BatchType.table); assert.strictEqual( batchOperationArray[2].httpMethod, "DELETE", @@ -579,7 +557,6 @@ describe("batch deserialization unit tests, these are not the API integration te serializer.deserializeBatchRequest(requestString); // First Batch Operation is a Delete. - assert.strictEqual(batchOperationArray[0].batchType, BatchType.table); assert.strictEqual( batchOperationArray[0].httpMethod, "DELETE", @@ -606,7 +583,6 @@ describe("batch deserialization unit tests, these are not the API integration te "wrong Etag parsed" ); // Second Batch Operation is a Delete - assert.strictEqual(batchOperationArray[1].batchType, BatchType.table); assert.strictEqual( batchOperationArray[1].httpMethod, "DELETE", diff --git a/tests/table/unit/mock.serialization.batchoperation.factory.ts b/tests/table/unit/mock.serialization.batchoperation.factory.ts index 7fa3719dc..9f5447747 100644 --- a/tests/table/unit/mock.serialization.batchoperation.factory.ts +++ b/tests/table/unit/mock.serialization.batchoperation.factory.ts @@ -1,4 +1,3 @@ -import { BatchType } from "../../../src/common/batch/BatchOperation"; import TableBatchOperation from "../../../src/table/batch/TableBatchOperation"; export default class SerializationBatchOperationFactory { @@ -6,7 +5,7 @@ export default class SerializationBatchOperationFactory { public static GetBatchOperationMockForQueryEntityWithPartitionKeyAndRowKey( headers: string ): TableBatchOperation { - const operation = new TableBatchOperation(BatchType.table, headers); + const operation = new TableBatchOperation(headers); operation.httpMethod = "GET"; operation.jsonRequestBody = ""; operation.parameters = ""; @@ -27,7 +26,7 @@ export default class SerializationBatchOperationFactory { public static GetBatchOperationMockForInsertSingleEntity( headers: string ): TableBatchOperation { - const operation = new TableBatchOperation(BatchType.table, headers); + const operation = new TableBatchOperation(headers); operation.httpMethod = "PUT"; operation.jsonRequestBody = ""; operation.parameters = ""; @@ -52,7 +51,7 @@ export default class SerializationBatchOperationFactory { public static GetBatchOperationMockForDeleteSingleEntity( headers: string ): TableBatchOperation { - const operation = new TableBatchOperation(BatchType.table, headers); + const operation = new TableBatchOperation(headers); operation.httpMethod = "DELETE"; operation.jsonRequestBody = ""; operation.parameters = ""; diff --git a/tests/table/unit/mock.serialization.batchrequest.factory.ts b/tests/table/unit/mock.serialization.batchrequest.factory.ts index 031ac8cb7..2d27a7a2c 100644 --- a/tests/table/unit/mock.serialization.batchrequest.factory.ts +++ b/tests/table/unit/mock.serialization.batchrequest.factory.ts @@ -1,4 +1,4 @@ -import BatchRequest from "../../../src/common/batch/BatchRequest"; +import BatchRequest from "../../../src/table/batch/BatchRequest"; import SerializationResponseMockStrings from "./mock.response.serialization.strings"; import SerializationBatchOperationFactory from "./mock.serialization.batchoperation.factory"; import * as Models from "../../../src/table/generated/artifacts/models"; diff --git a/tests/table/unit/query.interpreter.unit.test.ts b/tests/table/unit/query.interpreter.unit.test.ts index 90321ab9c..89cd69d53 100644 --- a/tests/table/unit/query.interpreter.unit.test.ts +++ b/tests/table/unit/query.interpreter.unit.test.ts @@ -2,22 +2,33 @@ import * as assert from "assert"; import parseQuery from "../../../src/table/persistence/QueryInterpreter/QueryParser"; import { IQueryContext } from "../../../src/table/persistence/QueryInterpreter/IQueryContext"; import executeQuery from "../../../src/table/persistence/QueryInterpreter/QueryInterpreter"; -import { Entity, Table } from "../../../src/table/persistence/ITableMetadataStore"; +import { + Entity, + Table +} from "../../../src/table/persistence/ITableMetadataStore"; describe("Query Interpreter", () => { - function runTestCases(name: string, context: IQueryContext, testCases: { - name: string - originalQuery: string - expectedResult: any - }[]) { + function runTestCases( + name: string, + context: IQueryContext, + testCases: { + name: string; + originalQuery: string; + expectedResult: any; + }[] + ) { describe(name, () => { for (const test of testCases) { it(test.name, () => { - const queryTree = parseQuery(test.originalQuery) - assert.strictEqual(executeQuery(context, queryTree), test.expectedResult, "it should execute the query tree correctly") - }) + const queryTree = parseQuery(test.originalQuery); + assert.strictEqual( + executeQuery(context, queryTree), + test.expectedResult, + "it should execute the query tree correctly" + ); + }); } - }) + }); } const referenceEntity: Entity = { @@ -36,13 +47,13 @@ describe("Query Interpreter", () => { guid: Buffer.from("00000000-0000-0000-0000-000000000000").toString("base64"), guidLegacy: "00000000-0000-0000-0000-000000000000", binary: Buffer.from("binaryData").toString("base64"), - emptyString: "", + emptyString: "" } }; const referenceTable: Table = { table: "testTable", - account: "testAccount", + account: "testAccount" }; describe("Built-in Identifiers", () => { @@ -52,12 +63,17 @@ describe("Query Interpreter", () => { originalQuery: "PartitionKey eq 'testPartition'", expectedResult: true }, + { + name: "PartitionKey equality reversed order", + originalQuery: "'testPartition' eq PartitionKey", + expectedResult: true + }, { name: "PartitionKey equality (doesn't match)", originalQuery: "PartitionKey eq 'testPartition2'", expectedResult: false } - ]) + ]); runTestCases("RowKey", referenceEntity, [ { @@ -72,15 +88,17 @@ describe("Query Interpreter", () => { }, { name: "PartitionKey equality and RowKey range", - originalQuery: "PartitionKey eq 'testPartition' and RowKey gt 'testRoom' and RowKey lt 'testRoxy'", + originalQuery: + "PartitionKey eq 'testPartition' and RowKey gt 'testRoom' and RowKey lt 'testRoxy'", expectedResult: true }, { name: "PartitionKey equality and RowKey range (doesn't match)", - originalQuery: "PartitionKey eq 'testPartition' and RowKey gt 'testAnt' and RowKey lt 'testMoose'", + originalQuery: + "PartitionKey eq 'testPartition' and RowKey gt 'testAnt' and RowKey lt 'testMoose'", expectedResult: false } - ]) + ]); runTestCases("TableName", referenceTable, [ { @@ -92,36 +110,40 @@ describe("Query Interpreter", () => { name: "TableName equality (doesn't match)", originalQuery: "TableName eq 'testTable2'", expectedResult: false - }, - ]) - }) + } + ]); + }); describe("Logical Operators", () => { runTestCases("and", referenceEntity, [ { name: "PartitionKey equality and RowKey range", - originalQuery: "PartitionKey eq 'testPartition' and RowKey gt 'testRoom' and RowKey lt 'testRoxy'", + originalQuery: + "PartitionKey eq 'testPartition' and RowKey gt 'testRoom' and RowKey lt 'testRoxy'", expectedResult: true }, { name: "PartitionKey equality and RowKey range (doesn't match)", - originalQuery: "PartitionKey eq 'testPartition' and RowKey gt 'testAnt' and RowKey lt 'testMoose'", + originalQuery: + "PartitionKey eq 'testPartition' and RowKey gt 'testAnt' and RowKey lt 'testMoose'", expectedResult: false } - ]) + ]); runTestCases("or", referenceEntity, [ { name: "PartitionKey set", - originalQuery: "PartitionKey eq 'testPartition' or PartitionKey eq 'testPartition2'", + originalQuery: + "PartitionKey eq 'testPartition' or PartitionKey eq 'testPartition2'", expectedResult: true }, { name: "PartitionKey set (doesn't match)", - originalQuery: "PartitionKey eq 'testPartition2' or PartitionKey eq 'testPartition3'", + originalQuery: + "PartitionKey eq 'testPartition2' or PartitionKey eq 'testPartition3'", expectedResult: false } - ]) + ]); runTestCases("not", referenceEntity, [ { @@ -134,8 +156,8 @@ describe("Query Interpreter", () => { originalQuery: "not PartitionKey eq 'testPartition2'", expectedResult: true } - ]) - }) + ]); + }); describe("Comparison Operators", () => { runTestCases("eq", referenceEntity, [ @@ -171,12 +193,14 @@ describe("Query Interpreter", () => { }, { name: "GUID equality (legacy)", - originalQuery: "guidLegacy eq guid'00000000-0000-0000-0000-000000000000'", + originalQuery: + "guidLegacy eq guid'00000000-0000-0000-0000-000000000000'", expectedResult: true }, { name: "GUID equality (legacy) (doesn't match)", - originalQuery: "guidLegacy eq guid'00000000-0000-0000-0000-000000000001'", + originalQuery: + "guidLegacy eq guid'00000000-0000-0000-0000-000000000001'", expectedResult: false }, { @@ -189,8 +213,8 @@ describe("Query Interpreter", () => { originalQuery: "binary eq binary'000000000000'", expectedResult: false } - ]) - }) + ]); + }); describe("Values", () => { runTestCases("Booleans", referenceEntity, [ @@ -206,10 +230,11 @@ describe("Query Interpreter", () => { }, { name: "Compound queries using booleans", - originalQuery: "(true and RowKey eq 'testRow') and (false or PartitionKey eq 'testPartition')", + originalQuery: + "(true and RowKey eq 'testRow') and (false or PartitionKey eq 'testPartition')", expectedResult: true } - ]) + ]); runTestCases("GUIDs", referenceEntity, [ { @@ -224,12 +249,14 @@ describe("Query Interpreter", () => { }, { name: "GUID equality (legacy)", - originalQuery: "guidLegacy eq guid'00000000-0000-0000-0000-000000000000'", + originalQuery: + "guidLegacy eq guid'00000000-0000-0000-0000-000000000000'", expectedResult: true }, { name: "GUID equality (legacy) (doesn't match)", - originalQuery: "guidLegacy eq guid'00000000-0000-0000-0000-000000000001'", + originalQuery: + "guidLegacy eq guid'00000000-0000-0000-0000-000000000001'", expectedResult: false }, { @@ -239,7 +266,8 @@ describe("Query Interpreter", () => { }, { name: "GUID inequality (legacy)", - originalQuery: "guidLegacy ne guid'22222222-2222-2222-2222-222222222222'", + originalQuery: + "guidLegacy ne guid'22222222-2222-2222-2222-222222222222'", expectedResult: true } ]) @@ -390,6 +418,6 @@ describe("Query Interpreter", () => { originalQuery: "nonExistent ne ''", expectedResult: false } - ]) - }) -}) \ No newline at end of file + ]); + }); +}); From 59465d36585304d3b6e090674192dff4eaddea05 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 8 Sep 2023 14:12:23 +0800 Subject: [PATCH 198/297] Bump @azure/core-rest-pipeline from 1.12.0 to 1.12.1 (#2154) Bumps [@azure/core-rest-pipeline](https://github.com/Azure/azure-sdk-for-js) from 1.12.0 to 1.12.1. - [Release notes](https://github.com/Azure/azure-sdk-for-js/releases) - [Changelog](https://github.com/Azure/azure-sdk-for-js/blob/main/documentation/Changelog-for-next-generation.md) - [Commits](https://github.com/Azure/azure-sdk-for-js/compare/@azure/core-rest-pipeline_1.12.0...@azure/core-rest-pipeline_1.12.1) --- updated-dependencies: - dependency-name: "@azure/core-rest-pipeline" dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index fe75039c9..31eeeadda 100644 --- a/package-lock.json +++ b/package-lock.json @@ -239,9 +239,9 @@ } }, "node_modules/@azure/core-rest-pipeline": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/@azure/core-rest-pipeline/-/core-rest-pipeline-1.12.0.tgz", - "integrity": "sha512-+MnSB0vGZjszSzr5AW8z93/9fkDu2RLtWmAN8gskURq7EW2sSwqy8jZa0V26rjuBVkwhdA3Hw8z3VWoeBUOw+A==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@azure/core-rest-pipeline/-/core-rest-pipeline-1.12.1.tgz", + "integrity": "sha512-SsyWQ+T5MFQRX+M8H/66AlaI6HyCbQStGfFngx2fuiW+vKI2DkhtOvbYodPyf9fOe/ARLWWc3ohX54lQ5Kmaog==", "dependencies": { "@azure/abort-controller": "^1.0.0", "@azure/core-auth": "^1.4.0", @@ -10435,9 +10435,9 @@ } }, "@azure/core-rest-pipeline": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/@azure/core-rest-pipeline/-/core-rest-pipeline-1.12.0.tgz", - "integrity": "sha512-+MnSB0vGZjszSzr5AW8z93/9fkDu2RLtWmAN8gskURq7EW2sSwqy8jZa0V26rjuBVkwhdA3Hw8z3VWoeBUOw+A==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@azure/core-rest-pipeline/-/core-rest-pipeline-1.12.1.tgz", + "integrity": "sha512-SsyWQ+T5MFQRX+M8H/66AlaI6HyCbQStGfFngx2fuiW+vKI2DkhtOvbYodPyf9fOe/ARLWWc3ohX54lQ5Kmaog==", "requires": { "@azure/abort-controller": "^1.0.0", "@azure/core-auth": "^1.4.0", From 285bd1bf3e6274661f3dedf78775209b82a4c1d0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 11 Sep 2023 10:14:26 +0800 Subject: [PATCH 199/297] Bump @types/vscode from 1.81.0 to 1.82.0 (#2156) Bumps [@types/vscode](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/vscode) from 1.81.0 to 1.82.0. - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/vscode) --- updated-dependencies: - dependency-name: "@types/vscode" dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 31eeeadda..f4b2896f2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1578,9 +1578,9 @@ "integrity": "sha512-d/MUkJYdOeKycmm75Arql4M5+UuXmf4cHdHKsyw1GcvnNgL6s77UkgSgJ8TE/rI5PYsnwYq5jkcWBLuN/MpQ1A==" }, "node_modules/@types/vscode": { - "version": "1.81.0", - "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.81.0.tgz", - "integrity": "sha512-YIaCwpT+O2E7WOMq0eCgBEABE++SX3Yl/O02GoMIF2DO3qAtvw7m6BXFYsxnc6XyzwZgh6/s/UG78LSSombl2w==", + "version": "1.82.0", + "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.82.0.tgz", + "integrity": "sha512-VSHV+VnpF8DEm8LNrn8OJ8VuUNcBzN3tMvKrNpbhhfuVjFm82+6v44AbDhLvVFgCzn6vs94EJNTp7w8S6+Q1Rw==", "dev": true }, "node_modules/@types/xml2js": { @@ -11532,9 +11532,9 @@ "integrity": "sha512-d/MUkJYdOeKycmm75Arql4M5+UuXmf4cHdHKsyw1GcvnNgL6s77UkgSgJ8TE/rI5PYsnwYq5jkcWBLuN/MpQ1A==" }, "@types/vscode": { - "version": "1.81.0", - "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.81.0.tgz", - "integrity": "sha512-YIaCwpT+O2E7WOMq0eCgBEABE++SX3Yl/O02GoMIF2DO3qAtvw7m6BXFYsxnc6XyzwZgh6/s/UG78LSSombl2w==", + "version": "1.82.0", + "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.82.0.tgz", + "integrity": "sha512-VSHV+VnpF8DEm8LNrn8OJ8VuUNcBzN3tMvKrNpbhhfuVjFm82+6v44AbDhLvVFgCzn6vs94EJNTp7w8S6+Q1Rw==", "dev": true }, "@types/xml2js": { From 6e5e5eadc09ed862b46898d30991c364d85ec953 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 11 Sep 2023 10:14:57 +0800 Subject: [PATCH 200/297] Bump sequelize from 6.32.1 to 6.33.0 (#2155) Bumps [sequelize](https://github.com/sequelize/sequelize) from 6.32.1 to 6.33.0. - [Release notes](https://github.com/sequelize/sequelize/releases) - [Commits](https://github.com/sequelize/sequelize/compare/v6.32.1...v6.33.0) --- updated-dependencies: - dependency-name: sequelize dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 48 +++++++++++++++++++++++------------------------ 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/package-lock.json b/package-lock.json index f4b2896f2..751ab087e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -7876,9 +7876,9 @@ "dev": true }, "node_modules/pg-connection-string": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.6.0.tgz", - "integrity": "sha512-x14ibktcwlHKoHxx9X3uTVW9zIGR41ZB6QNhHb21OPNdCCO3NaRnpJuwKIQSR4u+Yqjx4HCvy7Hh7VSy1U4dGg==" + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.6.2.tgz", + "integrity": "sha512-ch6OwaeaPYcova4kKZ15sbJ2hKb/VP48ZD2gE7i1J+L4MspCtBMAx8nMgz7bksc7IojCIIWuEhHibSMFH8m8oA==" }, "node_modules/picomatch": { "version": "2.3.1", @@ -8817,9 +8817,9 @@ "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" }, "node_modules/semver": { - "version": "7.5.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.2.tgz", - "integrity": "sha512-SoftuTROv/cRjCze/scjGyiDtcUyxw1rgYQSZY7XTmtR5hX+dm76iDbTH8TkLPHCQmlbQVSSbNZCPM2hb0knnQ==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dependencies": { "lru-cache": "^6.0.0" }, @@ -8904,9 +8904,9 @@ "integrity": "sha1-1WgS4cAXpuTnw+Ojeh2m143TyT4=" }, "node_modules/sequelize": { - "version": "6.32.1", - "resolved": "https://registry.npmjs.org/sequelize/-/sequelize-6.32.1.tgz", - "integrity": "sha512-3Iv0jruv57Y0YvcxQW7BE56O7DC1BojcfIrqh6my+IQwde+9u/YnuYHzK+8kmZLhLvaziRT1eWu38nh9yVwn/g==", + "version": "6.33.0", + "resolved": "https://registry.npmjs.org/sequelize/-/sequelize-6.33.0.tgz", + "integrity": "sha512-GkeCbqgaIcpyZ1EyXrDNIwktbfMldHAGOVXHGM4x8bxGSRAOql5htDWofPvwpfL/FoZ59CaFmfO3Mosv1lDbQw==", "funding": [ { "type": "opencollective", @@ -8917,14 +8917,14 @@ "@types/debug": "^4.1.8", "@types/validator": "^13.7.17", "debug": "^4.3.4", - "dottie": "^2.0.4", + "dottie": "^2.0.6", "inflection": "^1.13.4", "lodash": "^4.17.21", "moment": "^2.29.4", "moment-timezone": "^0.5.43", - "pg-connection-string": "^2.6.0", + "pg-connection-string": "^2.6.1", "retry-as-promised": "^7.0.4", - "semver": "^7.5.1", + "semver": "^7.5.4", "sequelize-pool": "^7.1.0", "toposort-class": "^1.0.1", "uuid": "^8.3.2", @@ -16358,9 +16358,9 @@ "dev": true }, "pg-connection-string": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.6.0.tgz", - "integrity": "sha512-x14ibktcwlHKoHxx9X3uTVW9zIGR41ZB6QNhHb21OPNdCCO3NaRnpJuwKIQSR4u+Yqjx4HCvy7Hh7VSy1U4dGg==" + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.6.2.tgz", + "integrity": "sha512-ch6OwaeaPYcova4kKZ15sbJ2hKb/VP48ZD2gE7i1J+L4MspCtBMAx8nMgz7bksc7IojCIIWuEhHibSMFH8m8oA==" }, "picomatch": { "version": "2.3.1", @@ -17041,9 +17041,9 @@ "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" }, "semver": { - "version": "7.5.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.2.tgz", - "integrity": "sha512-SoftuTROv/cRjCze/scjGyiDtcUyxw1rgYQSZY7XTmtR5hX+dm76iDbTH8TkLPHCQmlbQVSSbNZCPM2hb0knnQ==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "requires": { "lru-cache": "^6.0.0" }, @@ -17119,21 +17119,21 @@ "integrity": "sha1-1WgS4cAXpuTnw+Ojeh2m143TyT4=" }, "sequelize": { - "version": "6.32.1", - "resolved": "https://registry.npmjs.org/sequelize/-/sequelize-6.32.1.tgz", - "integrity": "sha512-3Iv0jruv57Y0YvcxQW7BE56O7DC1BojcfIrqh6my+IQwde+9u/YnuYHzK+8kmZLhLvaziRT1eWu38nh9yVwn/g==", + "version": "6.33.0", + "resolved": "https://registry.npmjs.org/sequelize/-/sequelize-6.33.0.tgz", + "integrity": "sha512-GkeCbqgaIcpyZ1EyXrDNIwktbfMldHAGOVXHGM4x8bxGSRAOql5htDWofPvwpfL/FoZ59CaFmfO3Mosv1lDbQw==", "requires": { "@types/debug": "^4.1.8", "@types/validator": "^13.7.17", "debug": "^4.3.4", - "dottie": "^2.0.4", + "dottie": "^2.0.6", "inflection": "^1.13.4", "lodash": "^4.17.21", "moment": "^2.29.4", "moment-timezone": "^0.5.43", - "pg-connection-string": "^2.6.0", + "pg-connection-string": "^2.6.1", "retry-as-promised": "^7.0.4", - "semver": "^7.5.1", + "semver": "^7.5.4", "sequelize-pool": "^7.1.0", "toposort-class": "^1.0.1", "uuid": "^8.3.2", From 9fc5bff7aa4ea9eae2a3997e0ddd03e43d2042cf Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 12 Sep 2023 09:55:19 +0800 Subject: [PATCH 201/297] Bump mysql2 from 3.6.0 to 3.6.1 (#2160) Bumps [mysql2](https://github.com/sidorares/node-mysql2) from 3.6.0 to 3.6.1. - [Release notes](https://github.com/sidorares/node-mysql2/releases) - [Changelog](https://github.com/sidorares/node-mysql2/blob/master/Changelog.md) - [Commits](https://github.com/sidorares/node-mysql2/compare/v3.6.0...v3.6.1) --- updated-dependencies: - dependency-name: mysql2 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 751ab087e..005ae7668 100644 --- a/package-lock.json +++ b/package-lock.json @@ -7442,9 +7442,9 @@ "dev": true }, "node_modules/mysql2": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.6.0.tgz", - "integrity": "sha512-EWUGAhv6SphezurlfI2Fpt0uJEWLmirrtQR7SkbTHFC+4/mJBrPiSzHESHKAWKG7ALVD6xaG/NBjjd1DGJGQQQ==", + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.6.1.tgz", + "integrity": "sha512-O7FXjLtNkjcMBpLURwkXIhyVbX9i4lq4nNRCykPNOXfceq94kJ0miagmTEGCZieuO8JtwtXaZ41U6KT4eF9y3g==", "dependencies": { "denque": "^2.1.0", "generate-function": "^2.3.1", @@ -16034,9 +16034,9 @@ "dev": true }, "mysql2": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.6.0.tgz", - "integrity": "sha512-EWUGAhv6SphezurlfI2Fpt0uJEWLmirrtQR7SkbTHFC+4/mJBrPiSzHESHKAWKG7ALVD6xaG/NBjjd1DGJGQQQ==", + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.6.1.tgz", + "integrity": "sha512-O7FXjLtNkjcMBpLURwkXIhyVbX9i4lq4nNRCykPNOXfceq94kJ0miagmTEGCZieuO8JtwtXaZ41U6KT4eF9y3g==", "requires": { "denque": "^2.1.0", "generate-function": "^2.3.1", From fa46ea0d516ac7280a7e48be22e61a83b186a724 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 13 Sep 2023 09:32:34 +0800 Subject: [PATCH 202/297] Bump eslint from 8.48.0 to 8.49.0 (#2163) Bumps [eslint](https://github.com/eslint/eslint) from 8.48.0 to 8.49.0. - [Release notes](https://github.com/eslint/eslint/releases) - [Changelog](https://github.com/eslint/eslint/blob/main/CHANGELOG.md) - [Commits](https://github.com/eslint/eslint/compare/v8.48.0...v8.49.0) --- updated-dependencies: - dependency-name: eslint dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 44 ++++++++++++++++++++++---------------------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/package-lock.json b/package-lock.json index 005ae7668..78ee17702 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1038,18 +1038,18 @@ } }, "node_modules/@eslint/js": { - "version": "8.48.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.48.0.tgz", - "integrity": "sha512-ZSjtmelB7IJfWD2Fvb7+Z+ChTIKWq6kjda95fLcQKNS5aheVHn4IkfgRQE3sIIzTcSLwLcLZUD9UBt+V7+h+Pw==", + "version": "8.49.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.49.0.tgz", + "integrity": "sha512-1S8uAY/MTJqVx0SC4epBq+N2yhuwtNwLbJYNZyhL2pO1ZVKn5HFXav5T41Ryzy9K9V7ZId2JB2oy/W4aCd9/2w==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, "node_modules/@humanwhocodes/config-array": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.10.tgz", - "integrity": "sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==", + "version": "0.11.11", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.11.tgz", + "integrity": "sha512-N2brEuAadi0CcdeMXUkhbZB84eskAc8MEX1By6qEchoVywSgXPIjou4rYsl0V3Hj0ZnuGycGCjdNgockbzeWNA==", "dev": true, "dependencies": { "@humanwhocodes/object-schema": "^1.2.1", @@ -4328,16 +4328,16 @@ } }, "node_modules/eslint": { - "version": "8.48.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.48.0.tgz", - "integrity": "sha512-sb6DLeIuRXxeM1YljSe1KEx9/YYeZFQWcV8Rq9HfigmdDEugjLEVEa1ozDjL6YDjBpQHPJxJzze+alxi4T3OLg==", + "version": "8.49.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.49.0.tgz", + "integrity": "sha512-jw03ENfm6VJI0jA9U+8H5zfl5b+FvuU3YYvZRdZHOlU2ggJkxrlkJH4HcDrZpj6YwD8kuYqvQM8LyesoazrSOQ==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", "@eslint/eslintrc": "^2.1.2", - "@eslint/js": "8.48.0", - "@humanwhocodes/config-array": "^0.11.10", + "@eslint/js": "8.49.0", + "@humanwhocodes/config-array": "^0.11.11", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", "ajv": "^6.12.4", @@ -11065,15 +11065,15 @@ } }, "@eslint/js": { - "version": "8.48.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.48.0.tgz", - "integrity": "sha512-ZSjtmelB7IJfWD2Fvb7+Z+ChTIKWq6kjda95fLcQKNS5aheVHn4IkfgRQE3sIIzTcSLwLcLZUD9UBt+V7+h+Pw==", + "version": "8.49.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.49.0.tgz", + "integrity": "sha512-1S8uAY/MTJqVx0SC4epBq+N2yhuwtNwLbJYNZyhL2pO1ZVKn5HFXav5T41Ryzy9K9V7ZId2JB2oy/W4aCd9/2w==", "dev": true }, "@humanwhocodes/config-array": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.10.tgz", - "integrity": "sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==", + "version": "0.11.11", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.11.tgz", + "integrity": "sha512-N2brEuAadi0CcdeMXUkhbZB84eskAc8MEX1By6qEchoVywSgXPIjou4rYsl0V3Hj0ZnuGycGCjdNgockbzeWNA==", "dev": true, "requires": { "@humanwhocodes/object-schema": "^1.2.1", @@ -13742,16 +13742,16 @@ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" }, "eslint": { - "version": "8.48.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.48.0.tgz", - "integrity": "sha512-sb6DLeIuRXxeM1YljSe1KEx9/YYeZFQWcV8Rq9HfigmdDEugjLEVEa1ozDjL6YDjBpQHPJxJzze+alxi4T3OLg==", + "version": "8.49.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.49.0.tgz", + "integrity": "sha512-jw03ENfm6VJI0jA9U+8H5zfl5b+FvuU3YYvZRdZHOlU2ggJkxrlkJH4HcDrZpj6YwD8kuYqvQM8LyesoazrSOQ==", "dev": true, "requires": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", "@eslint/eslintrc": "^2.1.2", - "@eslint/js": "8.48.0", - "@humanwhocodes/config-array": "^0.11.10", + "@eslint/js": "8.49.0", + "@humanwhocodes/config-array": "^0.11.11", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", "ajv": "^6.12.4", From 6675326d845a90adfed1a5ea52d33194d9a73249 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 13 Sep 2023 11:00:16 +0800 Subject: [PATCH 203/297] Bump jsonwebtoken from 9.0.1 to 9.0.2 (#2145) Bumps [jsonwebtoken](https://github.com/auth0/node-jsonwebtoken) from 9.0.1 to 9.0.2. - [Changelog](https://github.com/auth0/node-jsonwebtoken/blob/master/CHANGELOG.md) - [Commits](https://github.com/auth0/node-jsonwebtoken/compare/v9.0.1...v9.0.2) --- updated-dependencies: - dependency-name: jsonwebtoken dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 32 ++++++++++++++++++++++---------- 1 file changed, 22 insertions(+), 10 deletions(-) diff --git a/package-lock.json b/package-lock.json index 78ee17702..1a18d9d0c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6588,14 +6588,20 @@ ] }, "node_modules/jsonwebtoken": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.1.tgz", - "integrity": "sha512-K8wx7eJ5TPvEjuiVSkv167EVboBDv9PZdDoF7BgeQnBLVvZWW9clr2PsQHVJDTKaEIH5JBIwHujGcHp7GgI2eg==", + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz", + "integrity": "sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==", "dependencies": { "jws": "^3.2.2", - "lodash": "^4.17.21", + "lodash.includes": "^4.3.0", + "lodash.isboolean": "^3.0.3", + "lodash.isinteger": "^4.0.4", + "lodash.isnumber": "^3.0.3", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.once": "^4.0.0", "ms": "^2.1.1", - "semver": "^7.3.8" + "semver": "^7.5.4" }, "engines": { "node": ">=12", @@ -15376,14 +15382,20 @@ "dev": true }, "jsonwebtoken": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.1.tgz", - "integrity": "sha512-K8wx7eJ5TPvEjuiVSkv167EVboBDv9PZdDoF7BgeQnBLVvZWW9clr2PsQHVJDTKaEIH5JBIwHujGcHp7GgI2eg==", + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz", + "integrity": "sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==", "requires": { "jws": "^3.2.2", - "lodash": "^4.17.21", + "lodash.includes": "^4.3.0", + "lodash.isboolean": "^3.0.3", + "lodash.isinteger": "^4.0.4", + "lodash.isnumber": "^3.0.3", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.once": "^4.0.0", "ms": "^2.1.1", - "semver": "^7.3.8" + "semver": "^7.5.4" }, "dependencies": { "ms": { From 46c1709d87630dd54a21b5a770785e650730ea4d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 13 Sep 2023 11:00:20 +0800 Subject: [PATCH 204/297] Bump prettier from 3.0.2 to 3.0.3 (#2144) Bumps [prettier](https://github.com/prettier/prettier) from 3.0.2 to 3.0.3. - [Release notes](https://github.com/prettier/prettier/releases) - [Changelog](https://github.com/prettier/prettier/blob/main/CHANGELOG.md) - [Commits](https://github.com/prettier/prettier/compare/3.0.2...3.0.3) --- updated-dependencies: - dependency-name: prettier dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 1a18d9d0c..af691873a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8318,9 +8318,9 @@ } }, "node_modules/prettier": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.0.2.tgz", - "integrity": "sha512-o2YR9qtniXvwEZlOKbveKfDQVyqxbEIWn48Z8m3ZJjBjcCmUy3xZGIv+7AkaeuaTr6yPXJjwv07ZWlsWbEy1rQ==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.0.3.tgz", + "integrity": "sha512-L/4pUDMxcNa8R/EthV08Zt42WBO4h1rarVtK0K+QJG0X187OLo7l699jWw0GKuwzkPQ//jMFA/8Xm6Fh3J/DAg==", "dev": true, "bin": { "prettier": "bin/prettier.cjs" @@ -16680,9 +16680,9 @@ "dev": true }, "prettier": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.0.2.tgz", - "integrity": "sha512-o2YR9qtniXvwEZlOKbveKfDQVyqxbEIWn48Z8m3ZJjBjcCmUy3xZGIv+7AkaeuaTr6yPXJjwv07ZWlsWbEy1rQ==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.0.3.tgz", + "integrity": "sha512-L/4pUDMxcNa8R/EthV08Zt42WBO4h1rarVtK0K+QJG0X187OLo7l699jWw0GKuwzkPQ//jMFA/8Xm6Fh3J/DAg==", "dev": true }, "private": { From f17e27ecd6fbf70b0d3aba8c8d35f894fa5c4973 Mon Sep 17 00:00:00 2001 From: Wei Wei Date: Thu, 14 Sep 2023 07:53:01 +0000 Subject: [PATCH 205/297] Set accessTierInferred to false after upload blob with accessTier (issue #2038) (#2162) --- ChangeLog.md | 1 + src/blob/handlers/BlockBlobHandler.ts | 1 + tests/blob/apis/blob.test.ts | 13 +++++++++++++ 3 files changed, 15 insertions(+) diff --git a/ChangeLog.md b/ChangeLog.md index 2d5635be9..f04f680e7 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -7,6 +7,7 @@ Blob: - Fix validation of Blob SAS token when using the second key for an account in `AZURITE_ACCOUNTS` +- Set accessTierInferred to false after upload blob with accessTier (issue #2038) - Support blob new access tier Cold Table: diff --git a/src/blob/handlers/BlockBlobHandler.ts b/src/blob/handlers/BlockBlobHandler.ts index cc1948ac6..c38aa3ffd 100644 --- a/src/blob/handlers/BlockBlobHandler.ts +++ b/src/blob/handlers/BlockBlobHandler.ts @@ -134,6 +134,7 @@ export default class BlockBlobHandler HeaderValue: `${options.tier}` }); } + blob.properties.accessTierInferred = false; } // TODO: Need a lock for multi keys including containerName and blobName // TODO: Provide a specified function. diff --git a/tests/blob/apis/blob.test.ts b/tests/blob/apis/blob.test.ts index 9dc10a62e..61a44251b 100644 --- a/tests/blob/apis/blob.test.ts +++ b/tests/blob/apis/blob.test.ts @@ -839,6 +839,19 @@ describe("BlobAPIs", () => { ); } }); + + it("Upload blob with accesstier should get accessTierInferred as false @loki", async () => { + const blobName = getUniqueName("blob"); + + const blobClient = containerClient.getBlockBlobClient(blobName); + + await blobClient.upload("hello", 5, { tier: "Hot" }); + + const properties = await blobClient.getProperties(); + assert.equal(false, properties.accessTierInferred); + + blobClient.delete(); + }); it("setHTTPHeaders with default parameters @loki @sql", async () => { await blobClient.setHTTPHeaders({}); From e1fd05069d6e9578b53bee134f98a9e14bedc6af Mon Sep 17 00:00:00 2001 From: Wei Wei Date: Thu, 14 Sep 2023 07:53:24 +0000 Subject: [PATCH 206/297] Fixed set Queue ACL failure when Start is missing (issue #2065) (#2161) --- ChangeLog.md | 4 ++++ src/queue/generated/artifacts/mappers.ts | 3 --- src/queue/generated/artifacts/models.ts | 6 +++--- src/queue/handlers/QueueHandler.ts | 9 ++++++--- swagger/queue-storage.json | 5 ----- swagger/queue.md | 2 ++ tests/queue/apis/queue.test.ts | 14 ++++++++++++++ 7 files changed, 29 insertions(+), 14 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index f04f680e7..c842d33b4 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -10,6 +10,10 @@ Blob: - Set accessTierInferred to false after upload blob with accessTier (issue #2038) - Support blob new access tier Cold +Queue: + +- Fixed set Queue ACL failure when Start is missing (issue #2065) + Table: - Fixed the errorCode returned, when malformed Etag is provided for table Update/Delete calls. (issue #2013) diff --git a/src/queue/generated/artifacts/mappers.ts b/src/queue/generated/artifacts/mappers.ts index bbafd2ea9..c4fea3f36 100644 --- a/src/queue/generated/artifacts/mappers.ts +++ b/src/queue/generated/artifacts/mappers.ts @@ -17,7 +17,6 @@ export const AccessPolicy: msRest.CompositeMapper = { modelProperties: { start: { xmlName: "Start", - required: true, serializedName: "Start", type: { name: "String" @@ -25,7 +24,6 @@ export const AccessPolicy: msRest.CompositeMapper = { }, expiry: { xmlName: "Expiry", - required: true, serializedName: "Expiry", type: { name: "String" @@ -33,7 +31,6 @@ export const AccessPolicy: msRest.CompositeMapper = { }, permission: { xmlName: "Permission", - required: true, serializedName: "Permission", type: { name: "String" diff --git a/src/queue/generated/artifacts/models.ts b/src/queue/generated/artifacts/models.ts index d1933ed44..61085e214 100644 --- a/src/queue/generated/artifacts/models.ts +++ b/src/queue/generated/artifacts/models.ts @@ -19,17 +19,17 @@ export interface AccessPolicy { * **NOTE: This entity will be treated as a string instead of a Date because the API can * potentially deal with a higher precision value than what is supported by JavaScript.** */ - start: string; + start?: string; /** * the date-time the policy expires * **NOTE: This entity will be treated as a string instead of a Date because the API can * potentially deal with a higher precision value than what is supported by JavaScript.** */ - expiry: string; + expiry?: string; /** * the permissions for the acl policy */ - permission: string; + permission?: string; } /** diff --git a/src/queue/handlers/QueueHandler.ts b/src/queue/handlers/QueueHandler.ts index 86e0991f5..22133d6eb 100644 --- a/src/queue/handlers/QueueHandler.ts +++ b/src/queue/handlers/QueueHandler.ts @@ -259,9 +259,12 @@ export default class QueueHandler extends BaseHandler implements IQueueHandler { for (const acl of options.queueAcl) { const permission = acl.accessPolicy.permission; - for (const item of permission) { - if (!QUEUE_SERVICE_PERMISSION.includes(item)) { - throw StorageErrorFactory.getInvalidXmlDocument(context.contextID); + if (permission !== undefined) + { + for (const item of permission) { + if (!QUEUE_SERVICE_PERMISSION.includes(item)) { + throw StorageErrorFactory.getInvalidXmlDocument(context.contextID); + } } } } diff --git a/swagger/queue-storage.json b/swagger/queue-storage.json index a12935b32..f2b22e8a4 100644 --- a/swagger/queue-storage.json +++ b/swagger/queue-storage.json @@ -1246,11 +1246,6 @@ "definitions": { "AccessPolicy": { "type": "object", - "required": [ - "Start", - "Expiry", - "Permission" - ], "description": "An Access policy", "properties": { "Start": { diff --git a/swagger/queue.md b/swagger/queue.md index 58a1c78b6..44bfbbee0 100644 --- a/swagger/queue.md +++ b/swagger/queue.md @@ -19,3 +19,5 @@ enum-types: true ## Changes Made to Client Swagger 1. Remove minimum/maximum limitation for "VisibilityTimeout" and "VisibilityTimeoutRequired". + +2. Remove "required" section from defination "AccessPolicy" to align with server behavior. diff --git a/tests/queue/apis/queue.test.ts b/tests/queue/apis/queue.test.ts index 8e63a3cd3..d5a1bf733 100644 --- a/tests/queue/apis/queue.test.ts +++ b/tests/queue/apis/queue.test.ts @@ -183,6 +183,20 @@ describe("Queue APIs test", () => { startsOn: new Date("2017-12-31T11:22:33.4567890Z") }, id: "policy2" + }, + { + accessPolicy: { + permissions: "ra", + startsOn: new Date("2017-12-31T11:22:33.4567890Z") + }, + id: "policy3" + }, + { + accessPolicy: { + expiresOn: new Date("2030-11-31T11:22:33.4567890Z"), + permissions: "up" + }, + id: "policy4" } ]; From da306faedfed68335062cd045a72f2e891f00404 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 15 Sep 2023 09:52:57 +0800 Subject: [PATCH 207/297] Bump @azure/storage-blob from 12.15.0 to 12.16.0 (#2166) Bumps [@azure/storage-blob](https://github.com/Azure/azure-sdk-for-js) from 12.15.0 to 12.16.0. - [Release notes](https://github.com/Azure/azure-sdk-for-js/releases) - [Changelog](https://github.com/Azure/azure-sdk-for-js/blob/main/documentation/Changelog-for-next-generation.md) - [Commits](https://github.com/Azure/azure-sdk-for-js/compare/@azure/storage-blob_12.15.0...@azure/storage-blob_12.16.0) --- updated-dependencies: - dependency-name: "@azure/storage-blob" dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index af691873a..adde3e5d5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -650,9 +650,9 @@ } }, "node_modules/@azure/storage-blob": { - "version": "12.15.0", - "resolved": "https://registry.npmjs.org/@azure/storage-blob/-/storage-blob-12.15.0.tgz", - "integrity": "sha512-e7JBKLOFi0QVJqqLzrjx1eL3je3/Ug2IQj24cTM9b85CsnnFjLGeGjJVIjbGGZaytewiCEG7r3lRwQX7fKj0/w==", + "version": "12.16.0", + "resolved": "https://registry.npmjs.org/@azure/storage-blob/-/storage-blob-12.16.0.tgz", + "integrity": "sha512-jz33rUSUGUB65FgYrTRgRDjG6hdPHwfvHe+g/UrwVG8MsyLqSxg9TaW7Yuhjxu1v1OZ5xam2NU6+IpCN0xJO8Q==", "dev": true, "dependencies": { "@azure/abort-controller": "^1.0.0", @@ -10780,9 +10780,9 @@ } }, "@azure/storage-blob": { - "version": "12.15.0", - "resolved": "https://registry.npmjs.org/@azure/storage-blob/-/storage-blob-12.15.0.tgz", - "integrity": "sha512-e7JBKLOFi0QVJqqLzrjx1eL3je3/Ug2IQj24cTM9b85CsnnFjLGeGjJVIjbGGZaytewiCEG7r3lRwQX7fKj0/w==", + "version": "12.16.0", + "resolved": "https://registry.npmjs.org/@azure/storage-blob/-/storage-blob-12.16.0.tgz", + "integrity": "sha512-jz33rUSUGUB65FgYrTRgRDjG6hdPHwfvHe+g/UrwVG8MsyLqSxg9TaW7Yuhjxu1v1OZ5xam2NU6+IpCN0xJO8Q==", "dev": true, "requires": { "@azure/abort-controller": "^1.0.0", From 63ef49a3b282792bd4b1b8a1b8c6f757fafb398e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 15 Sep 2023 10:10:05 +0800 Subject: [PATCH 208/297] Bump @types/fs-extra from 11.0.1 to 11.0.2 (#2167) Bumps [@types/fs-extra](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/fs-extra) from 11.0.1 to 11.0.2. - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/fs-extra) --- updated-dependencies: - dependency-name: "@types/fs-extra" dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index adde3e5d5..9930da7de 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1399,9 +1399,9 @@ } }, "node_modules/@types/fs-extra": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-11.0.1.tgz", - "integrity": "sha512-MxObHvNl4A69ofaTRU8DFqvgzzv8s9yRtaPPm5gud9HDNvpB3GPQFvNuTWAI59B9huVGV5jXYJwbCsmBsOGYWA==", + "version": "11.0.2", + "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-11.0.2.tgz", + "integrity": "sha512-c0hrgAOVYr21EX8J0jBMXGLMgJqVf/v6yxi0dLaJboW9aQPh16Id+z6w2Tx1hm+piJOLv8xPfVKZCLfjPw/IMQ==", "dev": true, "dependencies": { "@types/jsonfile": "*", @@ -11359,9 +11359,9 @@ } }, "@types/fs-extra": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-11.0.1.tgz", - "integrity": "sha512-MxObHvNl4A69ofaTRU8DFqvgzzv8s9yRtaPPm5gud9HDNvpB3GPQFvNuTWAI59B9huVGV5jXYJwbCsmBsOGYWA==", + "version": "11.0.2", + "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-11.0.2.tgz", + "integrity": "sha512-c0hrgAOVYr21EX8J0jBMXGLMgJqVf/v6yxi0dLaJboW9aQPh16Id+z6w2Tx1hm+piJOLv8xPfVKZCLfjPw/IMQ==", "dev": true, "requires": { "@types/jsonfile": "*", From fa485cd10f6c4f407be915cc16810d6e52c015bb Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 18 Sep 2023 10:06:37 +0800 Subject: [PATCH 209/297] Bump @azure/storage-queue from 12.14.0 to 12.15.0 (#2170) Bumps [@azure/storage-queue](https://github.com/Azure/azure-sdk-for-js) from 12.14.0 to 12.15.0. - [Release notes](https://github.com/Azure/azure-sdk-for-js/releases) - [Changelog](https://github.com/Azure/azure-sdk-for-js/blob/main/documentation/Changelog-for-next-generation.md) - [Commits](https://github.com/Azure/azure-sdk-for-js/compare/@azure/storage-queue_12.14.0...@azure/storage-queue_12.15.0) --- updated-dependencies: - dependency-name: "@azure/storage-queue" dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 9930da7de..b51d4dfde 100644 --- a/package-lock.json +++ b/package-lock.json @@ -730,9 +730,9 @@ } }, "node_modules/@azure/storage-queue": { - "version": "12.14.0", - "resolved": "https://registry.npmjs.org/@azure/storage-queue/-/storage-queue-12.14.0.tgz", - "integrity": "sha512-1j6uxhzCcbEDVPOTNWIJ5CsLzOAU5U/bXgGZeT25fy6IghFTC1JlPGALez2CWJ9fBVj6AmSnsiBXL/77iXhSpg==", + "version": "12.15.0", + "resolved": "https://registry.npmjs.org/@azure/storage-queue/-/storage-queue-12.15.0.tgz", + "integrity": "sha512-qotyfMcmocaT1r9bfX7RyQQnkRJcTXGSG/m6LIchtEsNmqLu3ulVqkOlNM+O0XP9wwJ6Da1XQbWz5jQtrDe3DQ==", "dev": true, "dependencies": { "@azure/abort-controller": "^1.0.0", @@ -10847,9 +10847,9 @@ } }, "@azure/storage-queue": { - "version": "12.14.0", - "resolved": "https://registry.npmjs.org/@azure/storage-queue/-/storage-queue-12.14.0.tgz", - "integrity": "sha512-1j6uxhzCcbEDVPOTNWIJ5CsLzOAU5U/bXgGZeT25fy6IghFTC1JlPGALez2CWJ9fBVj6AmSnsiBXL/77iXhSpg==", + "version": "12.15.0", + "resolved": "https://registry.npmjs.org/@azure/storage-queue/-/storage-queue-12.15.0.tgz", + "integrity": "sha512-qotyfMcmocaT1r9bfX7RyQQnkRJcTXGSG/m6LIchtEsNmqLu3ulVqkOlNM+O0XP9wwJ6Da1XQbWz5jQtrDe3DQ==", "dev": true, "requires": { "@azure/abort-controller": "^1.0.0", From 3aca42a899fff8c4574b9a06a1a12bfa7373f01a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 19 Sep 2023 10:15:06 +0800 Subject: [PATCH 210/297] Bump @types/bluebird from 3.5.38 to 3.5.39 (#2176) Bumps [@types/bluebird](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/bluebird) from 3.5.38 to 3.5.39. - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/bluebird) --- updated-dependencies: - dependency-name: "@types/bluebird" dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index b51d4dfde..b7dfdf45a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1336,9 +1336,9 @@ "dev": true }, "node_modules/@types/bluebird": { - "version": "3.5.38", - "resolved": "https://registry.npmjs.org/@types/bluebird/-/bluebird-3.5.38.tgz", - "integrity": "sha512-yR/Kxc0dd4FfwtEoLZMoqJbM/VE/W7hXn/MIjb+axcwag0iFmSPK7OBUZq1YWLynJUoWQkfUrI7T0HDqGApNSg==", + "version": "3.5.39", + "resolved": "https://registry.npmjs.org/@types/bluebird/-/bluebird-3.5.39.tgz", + "integrity": "sha512-0h2lKudcFwHih8NHAgt/uyAIUQDO0AdfJYlWBXD8r+gFDulUi2CMZoQSh2Q5ol1FMaHV9k7/4HtcbA8ABtexmA==", "dev": true }, "node_modules/@types/body-parser": { @@ -11296,9 +11296,9 @@ "dev": true }, "@types/bluebird": { - "version": "3.5.38", - "resolved": "https://registry.npmjs.org/@types/bluebird/-/bluebird-3.5.38.tgz", - "integrity": "sha512-yR/Kxc0dd4FfwtEoLZMoqJbM/VE/W7hXn/MIjb+axcwag0iFmSPK7OBUZq1YWLynJUoWQkfUrI7T0HDqGApNSg==", + "version": "3.5.39", + "resolved": "https://registry.npmjs.org/@types/bluebird/-/bluebird-3.5.39.tgz", + "integrity": "sha512-0h2lKudcFwHih8NHAgt/uyAIUQDO0AdfJYlWBXD8r+gFDulUi2CMZoQSh2Q5ol1FMaHV9k7/4HtcbA8ABtexmA==", "dev": true }, "@types/body-parser": { From 7f3725fb7efb5dc6349f2a0d082cd14b0fd1a8b9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 19 Sep 2023 10:15:14 +0800 Subject: [PATCH 211/297] Bump @types/jsonwebtoken from 9.0.2 to 9.0.3 (#2174) Bumps [@types/jsonwebtoken](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/jsonwebtoken) from 9.0.2 to 9.0.3. - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/jsonwebtoken) --- updated-dependencies: - dependency-name: "@types/jsonwebtoken" dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index b7dfdf45a..c79ef7660 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1440,9 +1440,9 @@ } }, "node_modules/@types/jsonwebtoken": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz", - "integrity": "sha512-drE6uz7QBKq1fYqqoFKTDRdFCPHd5TCub75BM+D+cMx7NU9hUz7SESLfC2fSCXVFMO5Yj8sOWHuGqPgjc+fz0Q==", + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-9.0.3.tgz", + "integrity": "sha512-b0jGiOgHtZ2jqdPgPnP6WLCXZk1T8p06A/vPGzUvxpFGgKMbjXJDjC5m52ErqBnIuWZFgGoIJyRdeG5AyreJjA==", "dev": true, "dependencies": { "@types/node": "*" @@ -11400,9 +11400,9 @@ } }, "@types/jsonwebtoken": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz", - "integrity": "sha512-drE6uz7QBKq1fYqqoFKTDRdFCPHd5TCub75BM+D+cMx7NU9hUz7SESLfC2fSCXVFMO5Yj8sOWHuGqPgjc+fz0Q==", + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-9.0.3.tgz", + "integrity": "sha512-b0jGiOgHtZ2jqdPgPnP6WLCXZk1T8p06A/vPGzUvxpFGgKMbjXJDjC5m52ErqBnIuWZFgGoIJyRdeG5AyreJjA==", "dev": true, "requires": { "@types/node": "*" From ee2d5443e6fc67404c75bcc20b565638e740ddea Mon Sep 17 00:00:00 2001 From: Wei Wei Date: Tue, 19 Sep 2023 08:16:50 +0000 Subject: [PATCH 212/297] fix issue 1810 GetAccountInformation doesn't return x-ms-is-hns-enabled (#2172) --- ChangeLog.md | 1 + src/blob/handlers/ServiceHandler.ts | 4 +++- src/blob/utils/constants.ts | 1 + tests/blob/apis/service.test.ts | 2 ++ 4 files changed, 7 insertions(+), 1 deletion(-) diff --git a/ChangeLog.md b/ChangeLog.md index c842d33b4..ac79832f2 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -9,6 +9,7 @@ Blob: - Fix validation of Blob SAS token when using the second key for an account in `AZURITE_ACCOUNTS` - Set accessTierInferred to false after upload blob with accessTier (issue #2038) - Support blob new access tier Cold +- Added "x-ms-is-hns-enabled" header in x-ms-is-hns-enabled API responds (issue #1810) Queue: diff --git a/src/blob/handlers/ServiceHandler.ts b/src/blob/handlers/ServiceHandler.ts index 92e3bc38f..9239e4fa4 100644 --- a/src/blob/handlers/ServiceHandler.ts +++ b/src/blob/handlers/ServiceHandler.ts @@ -7,6 +7,7 @@ import { parseXML } from "../generated/utils/xml"; import { BLOB_API_VERSION, DEFAULT_LIST_CONTAINERS_MAX_RESULTS, + EMULATOR_ACCOUNT_ISHIERARCHICALNAMESPACEENABLED, EMULATOR_ACCOUNT_KIND, EMULATOR_ACCOUNT_SKUNAME, HeaderConstants, @@ -335,13 +336,14 @@ export default class ServiceHandler extends BaseHandler public async getAccountInfo( context: Context ): Promise { - const response: Models.ContainerGetAccountInfoResponse = { + const response: Models.ServiceGetAccountInfoResponse = { statusCode: 200, requestId: context.contextId, clientRequestId: context.request!.getHeader("x-ms-client-request-id"), skuName: EMULATOR_ACCOUNT_SKUNAME, accountKind: EMULATOR_ACCOUNT_KIND, date: context.startTime!, + isHierarchicalNamespaceEnabled: EMULATOR_ACCOUNT_ISHIERARCHICALNAMESPACEENABLED, version: BLOB_API_VERSION }; return response; diff --git a/src/blob/utils/constants.ts b/src/blob/utils/constants.ts index 41d425733..2ff60262a 100644 --- a/src/blob/utils/constants.ts +++ b/src/blob/utils/constants.ts @@ -30,6 +30,7 @@ export const EMULATOR_ACCOUNT_KEY = Buffer.from( export const EMULATOR_ACCOUNT_SKUNAME = Models.SkuName.StandardRAGRS; export const EMULATOR_ACCOUNT_KIND = Models.AccountKind.StorageV2; +export const EMULATOR_ACCOUNT_ISHIERARCHICALNAMESPACEENABLED = false; export const HeaderConstants = { AUTHORIZATION: "authorization", diff --git a/tests/blob/apis/service.test.ts b/tests/blob/apis/service.test.ts index 999062aef..faf7c6e1c 100644 --- a/tests/blob/apis/service.test.ts +++ b/tests/blob/apis/service.test.ts @@ -11,6 +11,7 @@ import { import * as assert from "assert"; import { + EMULATOR_ACCOUNT_ISHIERARCHICALNAMESPACEENABLED, EMULATOR_ACCOUNT_KIND, EMULATOR_ACCOUNT_SKUNAME } from "../../../src/blob/utils/constants"; @@ -415,6 +416,7 @@ describe("ServiceAPIs", () => { const result = await serviceClient.getAccountInfo(); assert.equal(result.accountKind, EMULATOR_ACCOUNT_KIND); assert.equal(result.skuName, EMULATOR_ACCOUNT_SKUNAME); + assert.equal(result.isHierarchicalNamespaceEnabled, EMULATOR_ACCOUNT_ISHIERARCHICALNAMESPACEENABLED); assert.equal( result._response.request.headers.get("x-ms-client-request-id"), result.clientRequestId From 808c6550eef6d74da903df1fbbdd4cb61c08f3b1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 21 Sep 2023 11:52:47 +0800 Subject: [PATCH 213/297] Bump @types/glob-to-regexp from 0.4.1 to 0.4.2 (#2183) Bumps [@types/glob-to-regexp](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/glob-to-regexp) from 0.4.1 to 0.4.2. - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/glob-to-regexp) --- updated-dependencies: - dependency-name: "@types/glob-to-regexp" dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index c79ef7660..db9ae9bcd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1419,9 +1419,9 @@ } }, "node_modules/@types/glob-to-regexp": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@types/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-S0mIukll6fbF0tvrKic/jj+jI8SHoSvGU+Cs95b/jzZEnBYCbj+7aJtQ9yeABuK3xP1okwA3jEH9qIRayijnvQ==", + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@types/glob-to-regexp/-/glob-to-regexp-0.4.2.tgz", + "integrity": "sha512-R1bD5iI4pBxB/83fjguzV4ab/eIGtMpD7T21tvcPosiAr6fAlHG4DAeOqzNxnVHiuJOf/lqeUN2jNTaVf3IdHQ==", "dev": true }, "node_modules/@types/json-schema": { @@ -11379,9 +11379,9 @@ } }, "@types/glob-to-regexp": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@types/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-S0mIukll6fbF0tvrKic/jj+jI8SHoSvGU+Cs95b/jzZEnBYCbj+7aJtQ9yeABuK3xP1okwA3jEH9qIRayijnvQ==", + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@types/glob-to-regexp/-/glob-to-regexp-0.4.2.tgz", + "integrity": "sha512-R1bD5iI4pBxB/83fjguzV4ab/eIGtMpD7T21tvcPosiAr6fAlHG4DAeOqzNxnVHiuJOf/lqeUN2jNTaVf3IdHQ==", "dev": true }, "@types/json-schema": { From 47b0e907fbba879937131bf0846ca345dda11876 Mon Sep 17 00:00:00 2001 From: Wei Wei Date: Fri, 22 Sep 2023 05:06:27 +0000 Subject: [PATCH 214/297] Fix issue 1954 & issue 1955 (#2178) --- ChangeLog.md | 2 ++ src/blob/errors/StorageErrorFactory.ts | 11 +++++++++++ src/blob/handlers/BlobHandler.ts | 21 ++++++++++++++++++--- src/blob/handlers/BlockBlobHandler.ts | 9 ++++++++- tests/blob/apis/blob.test.ts | 17 +++++++++++++++++ 5 files changed, 56 insertions(+), 4 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index ac79832f2..3dde89457 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -9,6 +9,8 @@ Blob: - Fix validation of Blob SAS token when using the second key for an account in `AZURITE_ACCOUNTS` - Set accessTierInferred to false after upload blob with accessTier (issue #2038) - Support blob new access tier Cold +- Fixed startCopyFromURL, copyFromURL API to return 400 (InvalidHeaderValue) when copy source has invalid format. (issue #1954) +- Fixed CommitBlockList API to return 400 (InvalidXmlDocument) when the request is sent with JSON body. (issue #1955) - Added "x-ms-is-hns-enabled" header in x-ms-is-hns-enabled API responds (issue #1810) Queue: diff --git a/src/blob/errors/StorageErrorFactory.ts b/src/blob/errors/StorageErrorFactory.ts index 022e7067a..aac7462a8 100644 --- a/src/blob/errors/StorageErrorFactory.ts +++ b/src/blob/errors/StorageErrorFactory.ts @@ -807,5 +807,16 @@ export default class StorageErrorFactory { "The tags specified are invalid. It contains characters that are not permitted.", contextID ); + } + + public static getInvaidXmlDocument( + contextID: string = "" + ): StorageError { + return new StorageError( + 400, + "InvaidXmlDocument", + `XML specified is not syntactically valid.`, + contextID + ); } } diff --git a/src/blob/handlers/BlobHandler.ts b/src/blob/handlers/BlobHandler.ts index 51cf1a65e..b9da01ae2 100644 --- a/src/blob/handlers/BlobHandler.ts +++ b/src/blob/handlers/BlobHandler.ts @@ -648,7 +648,7 @@ export default class BlobHandler extends BaseHandler implements IBlobHandler { const blob = blobCtx.blob!; // TODO: Check dest Lease status, and set to available if it's expired, see sample in BlobHandler.setMetadata() - const url = new URL(copySource); + const url = this.NewUriFromCopySource(copySource, context); const [ sourceAccount, sourceContainer, @@ -709,7 +709,7 @@ export default class BlobHandler extends BaseHandler implements IBlobHandler { const blobCtx = new BlobStorageContext(context); const currentServer = blobCtx.request!.getHeader("Host") || ""; - const url = new URL(copySource) + const url = this.NewUriFromCopySource(copySource, context); if (currentServer !== url.host) { this.logger.error( `BlobHandler:startCopyFromURL() Source account ${url} is not on the same Azurite instance as target account ${blobCtx.account}`, @@ -846,7 +846,7 @@ export default class BlobHandler extends BaseHandler implements IBlobHandler { const blob = blobCtx.blob!; // TODO: Check dest Lease status, and set to available if it's expired, see sample in BlobHandler.setMetadata() - const url = new URL(copySource); + const url = this.NewUriFromCopySource(copySource, context); const [ sourceAccount, sourceContainer, @@ -1314,4 +1314,19 @@ export default class BlobHandler extends BaseHandler implements IBlobHandler { return response; } + + private NewUriFromCopySource(copySource: string, context: Context): URL{ + try{ + return new URL(copySource) + } + catch + { + throw StorageErrorFactory.getInvalidHeaderValue( + context.contextId, + { + HeaderName: "x-ms-copy-source", + HeaderValue: copySource + }) + } + } } diff --git a/src/blob/handlers/BlockBlobHandler.ts b/src/blob/handlers/BlockBlobHandler.ts index c38aa3ffd..97ad30838 100644 --- a/src/blob/handlers/BlockBlobHandler.ts +++ b/src/blob/handlers/BlockBlobHandler.ts @@ -298,7 +298,14 @@ export default class BlockBlobHandler if (rawBody === undefined) { throw badRequestError; } - const parsed = await parseXML(rawBody, true); + + let parsed; + try { + parsed = await parseXML(rawBody, true); + } catch (err) { + // return the 400(InvalidXmlDocument) error for issue 1955 + throw StorageErrorFactory.getInvaidXmlDocument(context.contextId); + } // Validate selected block list const commitBlockList = []; diff --git a/tests/blob/apis/blob.test.ts b/tests/blob/apis/blob.test.ts index 61a44251b..c21212ed9 100644 --- a/tests/blob/apis/blob.test.ts +++ b/tests/blob/apis/blob.test.ts @@ -1146,6 +1146,23 @@ describe("BlobAPIs", () => { assert.deepStrictEqual(err.statusCode, 400); }); + it("Copy blob should fail with 400 when copy source is invalid @loki", async () => { + const destBlob = getUniqueName("blob"); + + const destBlobClient = containerClient.getBlockBlobClient(destBlob); + + try { + await destBlobClient.beginCopyFromURL('/devstoreaccount1/container78/blob125') + } + catch (error) + { + assert.deepStrictEqual(error.statusCode, 400); + assert.deepStrictEqual(error.code, 'InvalidHeaderValue'); + return; + } + assert.fail(); + }); + it("Copy blob should not work with ifNoneMatch * when dest exist @loki", async () => { const sourceBlob = getUniqueName("blob"); const destBlob = getUniqueName("blob"); From 9f99a551e9f6cd66d07503879a56b4d869810f27 Mon Sep 17 00:00:00 2001 From: Edwin Huber Date: Fri, 22 Sep 2023 07:08:48 +0200 Subject: [PATCH 215/297] Adds NUnit Tests for Table Storage (#2165) * first NUnit tests * Collective File for DataTableTests * update to cosmos test * update to issue 793 test * update to issue 793 test and rename * update to issue 1286 test and rename * update to all tests and clean up --------- Co-authored-by: Edwin Huber Co-authored-by: maybevs --- .../AzuriteTableTest/AzureStorageTests.cs | 109 ++++++++++++++ .../AzuriteTableTest/AzuriteTableTest.csproj | 4 + ...estForIssue1439.cs => CosmosTableTests.cs} | 52 ++++++- .../dotnet/AzuriteTableTest/DataTableTests.cs | 138 ++++++++++++++++++ .../AzuriteTableTest/DataTablesBatchTests.cs | 58 ++++++++ .../dotnet/AzuriteTableTest/GenericTests.cs | 50 ------- .../table/dotnet/AzuriteTableTest/Program.cs | 23 --- .../TestForDataTablesDeleteBatch.cs | 44 ------ .../AzuriteTableTest/TestForIssue1286.cs | 36 ----- .../AzuriteTableTest/TestForIssue1493.cs | 34 ----- .../AzuriteTableTest/TestForIssue1929.cs | 81 ---------- .../AzuriteTableTest/TestForIssue1958.cs | 35 ----- .../AzuriteTableTest/TestForIssue791.cs | 35 ----- .../AzuriteTableTest/TestForIssue793.cs | 36 ----- 14 files changed, 353 insertions(+), 382 deletions(-) create mode 100644 tests/table/dotnet/AzuriteTableTest/AzureStorageTests.cs rename tests/table/dotnet/AzuriteTableTest/{TestForIssue1439.cs => CosmosTableTests.cs} (52%) create mode 100644 tests/table/dotnet/AzuriteTableTest/DataTableTests.cs create mode 100644 tests/table/dotnet/AzuriteTableTest/DataTablesBatchTests.cs delete mode 100644 tests/table/dotnet/AzuriteTableTest/GenericTests.cs delete mode 100644 tests/table/dotnet/AzuriteTableTest/Program.cs delete mode 100644 tests/table/dotnet/AzuriteTableTest/TestForDataTablesDeleteBatch.cs delete mode 100644 tests/table/dotnet/AzuriteTableTest/TestForIssue1286.cs delete mode 100644 tests/table/dotnet/AzuriteTableTest/TestForIssue1493.cs delete mode 100644 tests/table/dotnet/AzuriteTableTest/TestForIssue1929.cs delete mode 100644 tests/table/dotnet/AzuriteTableTest/TestForIssue1958.cs delete mode 100644 tests/table/dotnet/AzuriteTableTest/TestForIssue791.cs delete mode 100644 tests/table/dotnet/AzuriteTableTest/TestForIssue793.cs diff --git a/tests/table/dotnet/AzuriteTableTest/AzureStorageTests.cs b/tests/table/dotnet/AzuriteTableTest/AzureStorageTests.cs new file mode 100644 index 000000000..c12339ff2 --- /dev/null +++ b/tests/table/dotnet/AzuriteTableTest/AzureStorageTests.cs @@ -0,0 +1,109 @@ +using System; +using System.Collections.Generic; +using System.Text; +using NUnit.Framework; +using System.Threading.Tasks; +using Microsoft.WindowsAzure.Storage; +using Microsoft.WindowsAzure.Storage.Table; +using System.Collections; +using System.Linq; + +namespace AzuriteTableTest +{ + [TestFixture] + public class AzureStorageTests + { + private CloudStorageAccount account; + + [SetUp] + public void SetUp() + { + account = CloudStorageAccount.Parse("UseDevelopmentStorage=true"); + } + + // Generic test for Azure Storage SDK + [Test] + public async Task BasicAzureStorageSDKTest() + { + + var client = account.CreateCloudTableClient(); + var table = client.GetTableReference("testtable"); + var pk = Guid.NewGuid().ToString(); + + var data = new TestTableEntity(1); + data.PartitionKey = pk; + data.RowKey = "row"; + + await table.CreateIfNotExistsAsync(); + var insertResult = await table.ExecuteAsync(TableOperation.InsertOrReplace(data)); + var queryResult = await table.ExecuteQuerySegmentedAsync( + new TableQuery().Where("Value eq 1"), //.Take(1), + null + ); + + var insertedData = insertResult.Result as TestTableEntity; + + Assert.Greater(queryResult.Results.Count, 0); + var retrievedData = queryResult.Results.Single(); + Console.WriteLine($"Insert: {insertResult.HttpStatusCode}, {insertedData.PartitionKey}, {insertedData.RowKey}, {insertedData.Value}"); + Console.WriteLine($"Query: {retrievedData.PartitionKey}, {retrievedData.RowKey}, {retrievedData.Value}"); + + Assert.AreEqual(insertedData.Value, retrievedData.Value); + + } + + // Issue 1929 + [Test] + public async Task EmptyFieldsShouldNotBeReturned() + { + + var client = account.CreateCloudTableClient(); + var table = client.GetTableReference("testtable"); + + await table.CreateIfNotExistsAsync(); + + var pk = Guid.NewGuid().ToString(); + + // Only this value should be returned + var nonNullValue = new TestTableEntityString + { + PartitionKey = pk, + RowKey = "a", + Value = "TestValue" + }; + await table.ExecuteAsync(TableOperation.InsertOrReplace(nonNullValue)); + + var nullValue = new TestTableEntityString + { + PartitionKey = pk, + RowKey = "b" + }; + await table.ExecuteAsync(TableOperation.InsertOrReplace(nullValue)); + + var emptyString = new TestTableEntityString + { + PartitionKey = pk, + RowKey = "c" + }; + await table.ExecuteAsync(TableOperation.InsertOrReplace(emptyString)); + + try + { + var queryResult = await table.ExecuteQuerySegmentedAsync( + new TableQuery().Where($"PartitionKey eq '{pk}' and Value ne ''"), + null); + + Assert.AreEqual(queryResult.Results.Count, 1); + var onlyResult = queryResult.Results.First(); + Assert.AreEqual(onlyResult.PartitionKey, pk); + Assert.AreEqual(onlyResult.RowKey, "a"); + Assert.AreEqual(onlyResult.Value, "TestValue"); + + } + catch (Exception e) + { + Assert.Fail(e.Message); + } + } + } +} diff --git a/tests/table/dotnet/AzuriteTableTest/AzuriteTableTest.csproj b/tests/table/dotnet/AzuriteTableTest/AzuriteTableTest.csproj index aebae671c..c2d9f27a8 100644 --- a/tests/table/dotnet/AzuriteTableTest/AzuriteTableTest.csproj +++ b/tests/table/dotnet/AzuriteTableTest/AzuriteTableTest.csproj @@ -9,6 +9,10 @@ + + + + diff --git a/tests/table/dotnet/AzuriteTableTest/TestForIssue1439.cs b/tests/table/dotnet/AzuriteTableTest/CosmosTableTests.cs similarity index 52% rename from tests/table/dotnet/AzuriteTableTest/TestForIssue1439.cs rename to tests/table/dotnet/AzuriteTableTest/CosmosTableTests.cs index 59bb67bf4..5930a1f10 100644 --- a/tests/table/dotnet/AzuriteTableTest/TestForIssue1439.cs +++ b/tests/table/dotnet/AzuriteTableTest/CosmosTableTests.cs @@ -1,21 +1,31 @@ using System; using System.Collections.Generic; using System.Text; +using NUnit.Framework; using System.Threading.Tasks; using Microsoft.Azure.Cosmos.Table; +using System.Collections; namespace AzuriteTableTest { - internal static class TestForIssue1439 + [TestFixture] + public class CosmosTableTests { - internal static async Task RunTest() + private CloudTableClient cloudTableClient; + + [SetUp] + public void Setup() + { + var account = CloudStorageAccount.DevelopmentStorageAccount; + this.cloudTableClient = new CloudTableClient(account.TableStorageUri, account.Credentials); + } + + // Issue 1439 + [Test] + public async Task ShouldDeleteMultipleRowsInCosmosBatch() { try { - - var account = CloudStorageAccount.DevelopmentStorageAccount; - - var cloudTableClient = new Microsoft.Azure.Cosmos.Table.CloudTableClient(account.TableStorageUri, account.Credentials); var cloudTable = cloudTableClient.GetTableReference("test5"); cloudTable.CreateIfNotExists(); @@ -49,7 +59,7 @@ internal static async Task RunTest() var batchResult = await cloudTable.ExecuteBatchAsync(batch); // <- error thrown here if (batchResult.Count == 0) { - throw new Exception("Batch failed"); + Assert.Fail("Batch failed"); } } @@ -57,8 +67,34 @@ internal static async Task RunTest() } catch (Exception ex) { - Console.WriteLine(ex.ToString()); + Assert.Fail(ex.ToString()); + } + } + + // Issue 1958 + [Test] + public async Task ValidateCosmosInsertOrMergeInBatch() + { + var storageAccount = CloudStorageAccount.Parse("UseDevelopmentStorage=true"); + var tableClient = storageAccount.CreateCloudTableClient(); + + var client = tableClient.GetTableReference("foo"); + client.CreateIfNotExists(); + + var batch = new TableBatchOperation + { + TableOperation.InsertOrMerge(new DynamicTableEntity("foo", "c8b06c47-c755-4b53-b3da-73949ebbb24f")), + TableOperation.InsertOrMerge(new DynamicTableEntity("foo", "08667dfd-d2e0-4e20-a51e-7bc13d01c89c")) + }; + + // This used to error with a 500 response + var result = await client.ExecuteBatchAsync(batch); + if (result[0].HttpStatusCode != 204 || result[1].HttpStatusCode != 204) + { + Assert.Fail("Expected 204 response"); } + // clean up + client.DeleteIfExists(); } } } diff --git a/tests/table/dotnet/AzuriteTableTest/DataTableTests.cs b/tests/table/dotnet/AzuriteTableTest/DataTableTests.cs new file mode 100644 index 000000000..65506c4ba --- /dev/null +++ b/tests/table/dotnet/AzuriteTableTest/DataTableTests.cs @@ -0,0 +1,138 @@ +using System; +using System.Collections.Generic; +using System.Text; +using NUnit.Framework; +using System.Threading.Tasks; +using Azure.Data.Tables; +using System.Collections; +using Azure; + +namespace AzuriteTableTest +{ + [TestFixture] + public class DataTablesTests + { + TableServiceClient client; + + [SetUp] + public void Setup() + { + this.client = new TableServiceClient("UseDevelopmentStorage=true"); + } + + // from issue 793 + [Test] + public async Task CheckForPreconditionFailedError() + { + var table = client.GetTableClient("PreconditionFailed"); + await table.CreateIfNotExistsAsync(); + + var pk = Guid.NewGuid().ToString(); + var rA = await table.AddEntityAsync(new TableEntity(pk, "a")); + await table.UpsertEntityAsync(new TableEntity(pk, "a")); + + var actions = new[] + { + new TableTransactionAction(TableTransactionActionType.UpdateReplace, new TableEntity(pk, "a"), rA.Headers.ETag.Value), + }; + + try + { + await table.SubmitTransactionAsync(actions); + } + catch (TableTransactionFailedException ex) + { + // When replacing an entity with an etag condition, the Azurite table emulator should not + // accept the entity replace if the etag is wrong. + // (i.e.does not match the current entity state). + // Azure and the legacy emulator return HTTP 412 Precondition failed. + Assert.AreEqual(ex.Status, 412); + // we got the expected error so should pass the test + Assert.Pass(); + } + // we did not land in the try catch so should fail + // We use this pattern for the rest of the tests. + Assert.Fail(); + } + + // Issue 791 + [Test] + public async Task ExpectStatus409WhenAddingExistingEntityInBatch() + { + var table = client.GetTableClient("AddInBatch"); + await table.CreateIfNotExistsAsync(); + var pk = Guid.NewGuid().ToString(); + await table.AddEntityAsync(new TableEntity(pk, "a")); + var actions = new[] + { + new TableTransactionAction(TableTransactionActionType.Add, new TableEntity(pk, "a")), + }; + try + { + await table.SubmitTransactionAsync(actions); + } + catch (TableTransactionFailedException ex) + { + Assert.AreEqual(ex.Status, 409); + Assert.Pass(); + } + Assert.Fail(); + } + + // Issue 1286 + [Test] + public async Task EtagGranularityTests() + { + var table = client.GetTableClient("etagGranularity"); + await table.CreateIfNotExistsAsync(); + + var pk = Guid.NewGuid().ToString(); + var e1 = await table.UpsertEntityAsync(new TableEntity(pk, "e1")); + var e2 = await table.UpsertEntityAsync(new TableEntity(pk, "e1")); + var e3 = await table.UpsertEntityAsync(new TableEntity(pk, "e1")); + + Assert.AreNotEqual(e1.Headers.ETag, e2.Headers.ETag); + Assert.AreNotEqual(e2.Headers.ETag, e3.Headers.ETag); + + var actions = new[] + { + new TableTransactionAction(TableTransactionActionType.UpdateReplace, new TableEntity(pk, "e1"), e2.Headers.ETag.Value), + }; + + try + { + await table.SubmitTransactionAsync(actions); + } + catch (TableTransactionFailedException ex) + { + Assert.AreEqual(ex.Status, 412); + Assert.Pass(); + } + + Assert.Fail("We should have had a precondition failed, 412 status."); + } + + // Issue 1493 + [Test] + public async Task UpsertNonExistantEntityShouldFailWith404() + { + var table = client.GetTableClient("upsertTests"); + await table.CreateIfNotExistsAsync(); + + var pk = Guid.NewGuid().ToString(); + + try + { + var rA = await table.UpdateEntityAsync(new TableEntity(pk, "a"), new Azure.ETag("*"), TableUpdateMode.Merge); + Console.WriteLine("Status : " + rA.Status); + } + catch (RequestFailedException ex) + { + Assert.AreEqual(ex.Status, 404); + Assert.Pass(); + } + + Assert.Fail(); + } + } +} diff --git a/tests/table/dotnet/AzuriteTableTest/DataTablesBatchTests.cs b/tests/table/dotnet/AzuriteTableTest/DataTablesBatchTests.cs new file mode 100644 index 000000000..f115ac4e9 --- /dev/null +++ b/tests/table/dotnet/AzuriteTableTest/DataTablesBatchTests.cs @@ -0,0 +1,58 @@ +using NUnit.Framework; +using System.Threading.Tasks; +using Azure.Data.Tables; +using System; + +namespace AzuriteTableTest +{ + + [TestFixture] + public class DataTablesBatchTests + { + private TableServiceClient tableServiceClient; + private TableClient tableClient; + + [SetUp] + public void Setup() + { + // We need to start Azurite externally, use "npm run table" in the Azurite root dir + + // Currently undecided if we should create the client per test, or use the setup... + this.tableServiceClient = new TableServiceClient("UseDevelopmentStorage=true"); + + } + + [Test] + public async Task TestForDataTablesDeleteBatch() + { + this.tableClient = tableServiceClient.GetTableClient("testDataTablesBatch"); + await tableClient.CreateIfNotExistsAsync(); + var pk = Guid.NewGuid().ToString(); + var entity = new TableEntity(pk, "a"); + + for (int i = 0; i < 13; i++) + { + entity.RowKey = i.ToString(); + await this.tableClient.AddEntityAsync(entity); + + } + + TableTransactionAction[] actions = new TableTransactionAction[13]; + + for (int i = 0; i < 13; i++) + { + actions[i] = new TableTransactionAction(TableTransactionActionType.Delete, new TableEntity(pk, i.ToString())); + } + + try + { + await this.tableClient.SubmitTransactionAsync(actions); + } + catch (TableTransactionFailedException ex) + { + Assert.Fail(ex.ToString()); + } + } + + } +} \ No newline at end of file diff --git a/tests/table/dotnet/AzuriteTableTest/GenericTests.cs b/tests/table/dotnet/AzuriteTableTest/GenericTests.cs deleted file mode 100644 index 104b51b73..000000000 --- a/tests/table/dotnet/AzuriteTableTest/GenericTests.cs +++ /dev/null @@ -1,50 +0,0 @@ -using Microsoft.WindowsAzure.Storage; -using Microsoft.WindowsAzure.Storage.Table; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace AzuriteTableTest -{ - internal static class GenericTests - { - internal async static Task RunTest1() - { - - var account = CloudStorageAccount.Parse("UseDevelopmentStorage=true"); - var client = account.CreateCloudTableClient(); - var table = client.GetTableReference("testtable"); - - var data = new TestTableEntity(1); - data.PartitionKey = "PARTITION"; - data.RowKey = "ROW"; - - await table.CreateIfNotExistsAsync(); - var insertResult = await table.ExecuteAsync(TableOperation.InsertOrReplace(data)); - var queryResult = await table.ExecuteQuerySegmentedAsync( - new TableQuery().Where("Value eq 1"), //.Take(1), - null - ); - - var insertedData = insertResult.Result as TestTableEntity; - if (queryResult.Results.Count > 0) - { - var retrievedData = queryResult.Results.Single(); - Console.WriteLine($"Insert: {insertResult.HttpStatusCode}, {insertedData.PartitionKey}, {insertedData.RowKey}, {insertedData.Value}"); - Console.WriteLine($"Query: {retrievedData.PartitionKey}, {retrievedData.RowKey}, {retrievedData.Value}"); - - if (insertedData.Value != retrievedData.Value) - { - throw new Exception("Values differ"); - } - } - else - { - Console.WriteLine("results empty!"); - } - } - - } -} diff --git a/tests/table/dotnet/AzuriteTableTest/Program.cs b/tests/table/dotnet/AzuriteTableTest/Program.cs deleted file mode 100644 index 1b0996cc3..000000000 --- a/tests/table/dotnet/AzuriteTableTest/Program.cs +++ /dev/null @@ -1,23 +0,0 @@ -using Microsoft.WindowsAzure.Storage; -using Microsoft.WindowsAzure.Storage.Table; -using System; -using System.Linq; -using System.Threading.Tasks; - -namespace AzuriteTableTest -{ - - - - class Program - { - static async Task Main(string[] args) - { - // delete batch with cosmos - await TestForIssue1958.RunTest(); - - // // delete batch with data Tables - // await TestForDataTablesDeleteBatch.RunTest(); - } - } -} diff --git a/tests/table/dotnet/AzuriteTableTest/TestForDataTablesDeleteBatch.cs b/tests/table/dotnet/AzuriteTableTest/TestForDataTablesDeleteBatch.cs deleted file mode 100644 index e1d421e18..000000000 --- a/tests/table/dotnet/AzuriteTableTest/TestForDataTablesDeleteBatch.cs +++ /dev/null @@ -1,44 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; -using System.Threading.Tasks; -using Azure.Data.Tables; - -namespace AzuriteTableTest -{ - internal static class TestForDataTablesDeleteBatch - { - internal static async Task RunTest() - { - var client = new TableServiceClient("UseDevelopmentStorage=true"); - var table = client.GetTableClient("testDataTables"); - await table.CreateIfNotExistsAsync(); - - var pk = Guid.NewGuid().ToString(); - var entity = new TableEntity(pk, "a"); - - for(int i= 0; i < 13; i++) - { - entity.RowKey = i.ToString(); - await table.AddEntityAsync(entity); - - } - - TableTransactionAction[] actions = new TableTransactionAction[13]; - - for (int i= 0; i < 13; i++) - { - actions[i] = new TableTransactionAction(TableTransactionActionType.Delete, new TableEntity(pk, i.ToString())); - } - - try - { - await table.SubmitTransactionAsync(actions); - } - catch (TableTransactionFailedException ex) - { - Console.WriteLine(ex.ToString()); - } - } - } -} diff --git a/tests/table/dotnet/AzuriteTableTest/TestForIssue1286.cs b/tests/table/dotnet/AzuriteTableTest/TestForIssue1286.cs deleted file mode 100644 index 8918570b2..000000000 --- a/tests/table/dotnet/AzuriteTableTest/TestForIssue1286.cs +++ /dev/null @@ -1,36 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; -using System.Threading.Tasks; -using Azure.Data.Tables; - -namespace AzuriteTableTest -{ - internal static class TestForIssue1286 - { - internal static async Task RunTest() - { - var client = new TableServiceClient("UseDevelopmentStorage=true"); - var table = client.GetTableClient("test"); - await table.CreateIfNotExistsAsync(); - - var pk = Guid.NewGuid().ToString(); - var rA = await table.AddEntityAsync(new TableEntity(pk, "a")); - await table.UpsertEntityAsync(new TableEntity(pk, "a")); - - var actions = new[] - { - new TableTransactionAction(TableTransactionActionType.UpdateReplace, new TableEntity(pk, "a"), rA.Headers.ETag.Value), - }; - - try - { - await table.SubmitTransactionAsync(actions); - } - catch (TableTransactionFailedException ex) - { - Console.WriteLine(ex.ToString()); - } - } - } -} diff --git a/tests/table/dotnet/AzuriteTableTest/TestForIssue1493.cs b/tests/table/dotnet/AzuriteTableTest/TestForIssue1493.cs deleted file mode 100644 index 76c166d71..000000000 --- a/tests/table/dotnet/AzuriteTableTest/TestForIssue1493.cs +++ /dev/null @@ -1,34 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; -using System.Threading.Tasks; -using Azure.Data.Tables; - -namespace AzuriteTableTest -{ - internal static class TestForIssue1493 - { - internal static async Task RunTest() - { - var client = new TableServiceClient("UseDevelopmentStorage=true"); - - var table = client.GetTableClient("test1"); - await table.CreateIfNotExistsAsync(); - - var pk = Guid.NewGuid().ToString(); - - - - - try - { - var rA = await table.UpdateEntityAsync(new TableEntity(pk, "a"), new Azure.ETag("*"), TableUpdateMode.Merge); - Console.WriteLine("Status : " + rA.Status); - } - catch (Exception ex) - { - Console.WriteLine(ex.ToString()); - } - } - } -} diff --git a/tests/table/dotnet/AzuriteTableTest/TestForIssue1929.cs b/tests/table/dotnet/AzuriteTableTest/TestForIssue1929.cs deleted file mode 100644 index e5ff99124..000000000 --- a/tests/table/dotnet/AzuriteTableTest/TestForIssue1929.cs +++ /dev/null @@ -1,81 +0,0 @@ -using Azure.Data.Tables; -using Microsoft.WindowsAzure.Storage; -using Microsoft.WindowsAzure.Storage.Table; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace AzuriteTableTest -{ - internal static class TestForIssue1929 - { - internal static async Task RunTest() - { - var account = CloudStorageAccount.Parse("UseDevelopmentStorage=true"); - var client = account.CreateCloudTableClient(); - var table = client.GetTableReference("testtable"); - - await table.CreateIfNotExistsAsync(); - - var pk = Guid.NewGuid().ToString(); - - // Only this value should be returned - var nonNullValue = new TestTableEntityString - { - PartitionKey = pk, - RowKey = "a", - Value = "TestValue" - }; - await table.ExecuteAsync(TableOperation.InsertOrReplace(nonNullValue)); - - var nullValue = new TestTableEntityString - { - PartitionKey = pk, - RowKey = "b" - }; - await table.ExecuteAsync(TableOperation.InsertOrReplace(nullValue)); - - var emptyString = new TestTableEntityString - { - PartitionKey = pk, - RowKey = "c" - }; - await table.ExecuteAsync(TableOperation.InsertOrReplace(emptyString)); - - try - { - var queryResult = await table.ExecuteQuerySegmentedAsync( - new TableQuery().Where($"PartitionKey eq '{pk}' and Value ne ''"), - null); - - if (queryResult.Results.Count > 0) - { - if (queryResult.Results.Count > 1) - { - foreach (var result in queryResult.Results) - { - Console.WriteLine($"Partition Key {result.PartitionKey}, Row Key {result.RowKey}, Value : {result.Value}"); - } - throw new Exception("Error, found too many results"); - } - var onlyResult = queryResult.Results.First(); - Console.WriteLine($"Found only 1 result: PK {onlyResult.PartitionKey}, RK {onlyResult.RowKey}, Val {onlyResult.Value}"); - } - else - { - throw new Exception("No results returned"); - } - } - catch(Exception e) - { - Console.WriteLine($"Exception {e}"); - } - finally - { - await table.DeleteIfExistsAsync(); - } - } - } -} diff --git a/tests/table/dotnet/AzuriteTableTest/TestForIssue1958.cs b/tests/table/dotnet/AzuriteTableTest/TestForIssue1958.cs deleted file mode 100644 index 362b85960..000000000 --- a/tests/table/dotnet/AzuriteTableTest/TestForIssue1958.cs +++ /dev/null @@ -1,35 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; -using System.Threading.Tasks; -using Microsoft.Azure.Cosmos.Table; - -namespace AzuriteTableTest -{ - internal static class TestForIssue1958 - { - internal static async Task RunTest() - { - var storageAccount = CloudStorageAccount.Parse("UseDevelopmentStorage=true"); - var tableClient = storageAccount.CreateCloudTableClient(); - - var client = tableClient.GetTableReference("foo"); - client.CreateIfNotExists(); - - var batch = new TableBatchOperation - { - TableOperation.InsertOrMerge(new DynamicTableEntity("foo", "c8b06c47-c755-4b53-b3da-73949ebbb24f")), - TableOperation.InsertOrMerge(new DynamicTableEntity("foo", "08667dfd-d2e0-4e20-a51e-7bc13d01c89c")) - }; - - // This errors with a 500 response - var result = await client.ExecuteBatchAsync(batch); - if(result[0].HttpStatusCode != 204 || result[1].HttpStatusCode != 204) - { - throw new Exception("Expected 204 response"); - } - // clean up - client.DeleteIfExists(); - } - } -} diff --git a/tests/table/dotnet/AzuriteTableTest/TestForIssue791.cs b/tests/table/dotnet/AzuriteTableTest/TestForIssue791.cs deleted file mode 100644 index 942090d1d..000000000 --- a/tests/table/dotnet/AzuriteTableTest/TestForIssue791.cs +++ /dev/null @@ -1,35 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; -using System.Threading.Tasks; -using Azure.Data.Tables; - -namespace AzuriteTableTest -{ - internal static class TestForIssue791 - { - internal static async Task RunTest() - { - var client = new TableServiceClient("UseDevelopmentStorage=true"); - var table = client.GetTableClient("test"); - await table.CreateIfNotExistsAsync(); - - var pk = Guid.NewGuid().ToString(); - await table.AddEntityAsync(new TableEntity(pk, "a")); - - var actions = new[] - { - new TableTransactionAction(TableTransactionActionType.Add, new TableEntity(pk, "a")), - }; - - try - { - await table.SubmitTransactionAsync(actions); - } - catch (TableTransactionFailedException ex) - { - Console.WriteLine(ex.ToString()); - } - } - } -} diff --git a/tests/table/dotnet/AzuriteTableTest/TestForIssue793.cs b/tests/table/dotnet/AzuriteTableTest/TestForIssue793.cs deleted file mode 100644 index 2489a9d94..000000000 --- a/tests/table/dotnet/AzuriteTableTest/TestForIssue793.cs +++ /dev/null @@ -1,36 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; -using System.Threading.Tasks; -using Azure.Data.Tables; - -namespace AzuriteTableTest -{ - internal static class TestForIssue793 - { - internal static async Task RunTest() - { - var client = new TableServiceClient("UseDevelopmentStorage=true"); - var table = client.GetTableClient("test"); - await table.CreateIfNotExistsAsync(); - - var pk = Guid.NewGuid().ToString(); - var rA = await table.AddEntityAsync(new TableEntity(pk, "a")); - await table.UpsertEntityAsync(new TableEntity(pk, "a")); - - var actions = new[] - { - new TableTransactionAction(TableTransactionActionType.UpdateReplace, new TableEntity(pk, "a"), rA.Headers.ETag.Value), - }; - - try - { - await table.SubmitTransactionAsync(actions); - } - catch (TableTransactionFailedException ex) - { - Console.WriteLine(ex.ToString()); - } - } - } -} From c962ffc6cef3fe66ce92223f649bebe9cf379138 Mon Sep 17 00:00:00 2001 From: Benjamin Pannell <1760260+notheotherben@users.noreply.github.com> Date: Mon, 25 Sep 2023 03:13:28 +0100 Subject: [PATCH 216/297] fix(table): Ensure that we correctly handle value comparisons against null/empty/undefined values for GUIDs and DateTimes (#2173) * fix(table): Ensure that we correctly handle value comparisons against null/empty/undefined values for GUIDs and DateTimes (fixes #2169) * doc: Update changelog * test: Expand test suite to include additional coverage for different operators --- ChangeLog.md | 1 + .../QueryNodes/BinaryDataNode.ts | 10 +--- .../QueryNodes/DateTimeNode.ts | 21 ++++++-- .../QueryInterpreter/QueryNodes/GuidNode.ts | 4 +- .../QueryNodes/NotEqualsNode.ts | 6 ++- .../QueryInterpreter/QueryNodes/ValueNode.ts | 8 ++- tests/table/apis/table.entity.query.test.ts | 4 +- .../table/unit/query.interpreter.unit.test.ts | 51 ++++++++++++++++++- 8 files changed, 84 insertions(+), 21 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index 3dde89457..a96f0f198 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -20,6 +20,7 @@ Queue: Table: - Fixed the errorCode returned, when malformed Etag is provided for table Update/Delete calls. (issue #2013) +- Fixed an issue when comparing `'' eq guid'00000000-0000-0000-0000-000000000000'` which would erroneously report these as equal. (issue #2169) ## 2023.08 Version 3.26.0 diff --git a/src/table/persistence/QueryInterpreter/QueryNodes/BinaryDataNode.ts b/src/table/persistence/QueryInterpreter/QueryNodes/BinaryDataNode.ts index b2de93d05..81a89037a 100644 --- a/src/table/persistence/QueryInterpreter/QueryNodes/BinaryDataNode.ts +++ b/src/table/persistence/QueryInterpreter/QueryNodes/BinaryDataNode.ts @@ -1,5 +1,5 @@ import { IQueryContext } from "../IQueryContext"; -import IQueryNode from "./IQueryNode"; +import ValueNode from "./ValueNode"; /** * Represents a constant value which should be decoded from its `hex` representation @@ -9,9 +9,7 @@ import IQueryNode from "./IQueryNode"; * and is used to ensure that these values are evaluated against their normalized base64 format. For * example, the query `PartitionKey eq binary'0011'` would contain a `BinaryNode` with the value `0x0011`. */ -export default class BinaryNode implements IQueryNode { - constructor(private value: string) { } - +export default class BinaryNode extends ValueNode { get name(): string { return "binary"; } @@ -19,8 +17,4 @@ export default class BinaryNode implements IQueryNode { evaluate(_context: IQueryContext): any { return Buffer.from(this.value, "hex").toString("base64"); } - - toString(): string { - return `(${this.name} ${this.value})`; - } } \ No newline at end of file diff --git a/src/table/persistence/QueryInterpreter/QueryNodes/DateTimeNode.ts b/src/table/persistence/QueryInterpreter/QueryNodes/DateTimeNode.ts index caf56710a..ac7934414 100644 --- a/src/table/persistence/QueryInterpreter/QueryNodes/DateTimeNode.ts +++ b/src/table/persistence/QueryInterpreter/QueryNodes/DateTimeNode.ts @@ -16,20 +16,31 @@ export default class DateTimeNode extends ValueNode { } compare(context: IQueryContext, other: IQueryNode): number { + const otherValue = other.evaluate(context); + + // NOTE(notheotherben): This is a special case for the `null` value, which is not a valid datetime value in Azure Storage + // but is considered a valid input for "epoch" in the JS Date constructor. We're explicitly handling + // returning NaN here to ensure that null doesn't match dates in the table. + if (this.value === null || otherValue === null) { + return NaN; + } + // NOTE(notheotherben): This approach leverages the fact that the `Date` constructor will parse ISO8601 strings // however it runs into a limitation of the accuracy of JS dates (which are limited to millisecond // resolution). As a result, we're effectively truncating the value to millisecond precision by doing // this. This is fundamentally a trade-off between enforcing valid datetime values and providing perfect // accuracy, and we've opted to enforce valid datetime values as those are more likely to cause problems // when moving to production. - const thisValue = new Date(this.value); - const otherValue = new Date(other.evaluate(context)); + const thisDate = new Date(this.value); + const otherDate = new Date(otherValue); - if (thisValue.valueOf() < otherValue.valueOf()) { + if (isNaN(thisDate.valueOf()) || isNaN(otherDate.valueOf())) { + return NaN; + } else if (thisDate.valueOf() < otherDate.valueOf()) { return -1; - } else if (thisValue.valueOf() > otherValue.valueOf()) { + } else if (thisDate.valueOf() > otherDate.valueOf()) { return 1; - } else if (thisValue.valueOf() === otherValue.valueOf()) { + } else if (thisDate.valueOf() === otherDate.valueOf()) { return 0; } else { return NaN; diff --git a/src/table/persistence/QueryInterpreter/QueryNodes/GuidNode.ts b/src/table/persistence/QueryInterpreter/QueryNodes/GuidNode.ts index b42eb68f7..70c787a1a 100644 --- a/src/table/persistence/QueryInterpreter/QueryNodes/GuidNode.ts +++ b/src/table/persistence/QueryInterpreter/QueryNodes/GuidNode.ts @@ -31,7 +31,9 @@ export default class GuidNode extends ValueNode { thisValue = Buffer.from(this.value).toString("base64"); } - if (thisValue < otherValue) { + if (!thisValue || !otherValue) { + return NaN; + } else if (thisValue < otherValue) { return -1; } else if (thisValue > otherValue) { return 1; diff --git a/src/table/persistence/QueryInterpreter/QueryNodes/NotEqualsNode.ts b/src/table/persistence/QueryInterpreter/QueryNodes/NotEqualsNode.ts index 186a80baa..f7012c570 100644 --- a/src/table/persistence/QueryInterpreter/QueryNodes/NotEqualsNode.ts +++ b/src/table/persistence/QueryInterpreter/QueryNodes/NotEqualsNode.ts @@ -22,11 +22,13 @@ export default class NotEqualsNode extends BinaryOperatorNode { evaluate(context: IQueryContext): any { if (this.left instanceof ValueNode) { - return this.left.compare(context, this.right) !== 0; + const compareResult = this.left.compare(context, this.right); + return compareResult !== 0 && !isNaN(compareResult); } if (this.right instanceof ValueNode) { - return this.right.compare(context, this.left) !== 0; + const compareResult = this.right.compare(context, this.left); + return compareResult !== 0 && !isNaN(compareResult); } const left = this.left.evaluate(context); diff --git a/src/table/persistence/QueryInterpreter/QueryNodes/ValueNode.ts b/src/table/persistence/QueryInterpreter/QueryNodes/ValueNode.ts index 40f7919ec..7136d68d9 100644 --- a/src/table/persistence/QueryInterpreter/QueryNodes/ValueNode.ts +++ b/src/table/persistence/QueryInterpreter/QueryNodes/ValueNode.ts @@ -14,10 +14,14 @@ export default abstract class ValueNode implements IQueryNode { } compare(context: IQueryContext, other: IQueryNode): number { + const thisValue = this.evaluate(context); const otherValue = other.evaluate(context); - if (this.value < otherValue) { + + if (thisValue === undefined || otherValue === undefined || otherValue === null) { + return NaN; + } else if (thisValue < otherValue) { return -1; - } else if (this.value > otherValue) { + } else if (thisValue > otherValue) { return 1; } else { return 0; diff --git a/tests/table/apis/table.entity.query.test.ts b/tests/table/apis/table.entity.query.test.ts index 344e7fd51..746c6163d 100644 --- a/tests/table/apis/table.entity.query.test.ts +++ b/tests/table/apis/table.entity.query.test.ts @@ -1087,7 +1087,7 @@ describe("table Entity APIs test - using Azure/data-tables", () => { assert.strictEqual( all.length, queryTest.expectedResult, - `Failed with query ${queryTest.queryOptions.filter}` + `Failed with query ${queryTest.queryOptions.filter} (got ${all.length} entries, expected ${queryTest.expectedResult})` ); if (all[0] !== undefined) { all.sort((a, b) => { @@ -1326,7 +1326,7 @@ describe("table Entity APIs test - using Azure/data-tables", () => { assert.strictEqual(all.length, 1); await tableClient.deleteTable(); - }); + }); it("21. should work correctly when query filter is empty string, @loki", async () => { const tableClient = createAzureDataTablesClient( diff --git a/tests/table/unit/query.interpreter.unit.test.ts b/tests/table/unit/query.interpreter.unit.test.ts index 89cd69d53..9f52361ce 100644 --- a/tests/table/unit/query.interpreter.unit.test.ts +++ b/tests/table/unit/query.interpreter.unit.test.ts @@ -47,7 +47,8 @@ describe("Query Interpreter", () => { guid: Buffer.from("00000000-0000-0000-0000-000000000000").toString("base64"), guidLegacy: "00000000-0000-0000-0000-000000000000", binary: Buffer.from("binaryData").toString("base64"), - emptyString: "" + emptyString: "", + nullValue: null } }; @@ -269,6 +270,21 @@ describe("Query Interpreter", () => { originalQuery: "guidLegacy ne guid'22222222-2222-2222-2222-222222222222'", expectedResult: true + }, + { + name: "GUID compare against missing property", + originalQuery: "missingProperty eq guid'00000000-0000-0000-0000-000000000000'", + expectedResult: false + }, + { + name: " GUID compare against null property", + originalQuery: "nullValue eq guid'00000000-0000-0000-0000-000000000000'", + expectedResult: false + }, + { + name: "GUID compare against empty string", + originalQuery: "emptyString eq guid'00000000-0000-0000-0000-000000000000'", + expectedResult: false } ]) @@ -392,6 +408,21 @@ describe("Query Interpreter", () => { name: "DateTime less than or equal (microseconds) (doesn't match)", originalQuery: "microsecondDate le datetime'2022-12-31T23:59:59.999999Z'", expectedResult: false + }, + { + name: "DateTime compare against null value", + originalQuery: "nullValue eq datetime'2020-01-01T00:00:00.000000Z'", + expectedResult: false + }, + { + name: "DateTime compare against empty string", + originalQuery: "emptyString eq datetime'2020-01-01T00:00:00.000000Z'", + expectedResult: false + }, + { + name: "DateTime compare against missing property", + originalQuery: "missingProperty eq datetime'2020-01-01T00:00:00.000000Z'", + expectedResult: false } ]) }) @@ -419,5 +450,23 @@ describe("Query Interpreter", () => { expectedResult: false } ]); + + describe("Issue #2169: Querying null/missing properties with type annotations", () => { + // NOTE(notheotherben): This generates a dynamic set of test to validate that all of our query operators return `false` for + // comparisons between values of the given type and the list of appropriate properties (null/missing/empty values). + const testCases: { [key: string]: string[] } = { + "datetime'2023-01-01T00:00:00.000000Z'": ["nullValue", "missingProperty", "emptyString"], + "binary'000000000000'": ["nullValue", "missingProperty"], + "guid'00000000-0000-0000-0000-000000000000'": ["nullValue", "missingProperty", "emptyString"], + }; + + for (const referenceValue of Object.keys(testCases)) { + runTestCases(referenceValue, referenceEntity, Array.prototype.concat.apply([], ["eq", "ne", "lt", "le", "gt", "ge"].map((operator) => testCases[referenceValue].map(property => ({ + name: `Should not match ${property} with ${operator}`, + originalQuery: `${property} ${operator} ${referenceValue}`, + expectedResult: false + }))))); + } + }); }); }); From 26a9b497a78edc1bb3a8fbbbbe02cc6a26c1652b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 26 Sep 2023 10:13:21 +0800 Subject: [PATCH 217/297] Bump @types/async from 3.2.20 to 3.2.21 (#2187) Bumps [@types/async](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/async) from 3.2.20 to 3.2.21. - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/async) --- updated-dependencies: - dependency-name: "@types/async" dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index db9ae9bcd..41fdef825 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1330,9 +1330,9 @@ "dev": true }, "node_modules/@types/async": { - "version": "3.2.20", - "resolved": "https://registry.npmjs.org/@types/async/-/async-3.2.20.tgz", - "integrity": "sha512-6jSBQQugzyX1aWto0CbvOnmxrU9tMoXfA9gc4IrLEtvr3dTwSg5GLGoWiZnGLI6UG/kqpB3JOQKQrqnhUWGKQA==", + "version": "3.2.21", + "resolved": "https://registry.npmjs.org/@types/async/-/async-3.2.21.tgz", + "integrity": "sha512-msYM0OYxzkwpiDJZZDo7XsYuFIpiAOh+o3hygudSpSzeW+R0DAEKZvdQriHYT95m9CvscLDg5s0Mxlrlhoy2qw==", "dev": true }, "node_modules/@types/bluebird": { @@ -11290,9 +11290,9 @@ "dev": true }, "@types/async": { - "version": "3.2.20", - "resolved": "https://registry.npmjs.org/@types/async/-/async-3.2.20.tgz", - "integrity": "sha512-6jSBQQugzyX1aWto0CbvOnmxrU9tMoXfA9gc4IrLEtvr3dTwSg5GLGoWiZnGLI6UG/kqpB3JOQKQrqnhUWGKQA==", + "version": "3.2.21", + "resolved": "https://registry.npmjs.org/@types/async/-/async-3.2.21.tgz", + "integrity": "sha512-msYM0OYxzkwpiDJZZDo7XsYuFIpiAOh+o3hygudSpSzeW+R0DAEKZvdQriHYT95m9CvscLDg5s0Mxlrlhoy2qw==", "dev": true }, "@types/bluebird": { From 9d86b1000a990a51cf4583883066a70484e25e2d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 26 Sep 2023 10:18:06 +0800 Subject: [PATCH 218/297] Bump tedious from 16.4.0 to 16.4.1 (#2189) Bumps [tedious](https://github.com/tediousjs/tedious) from 16.4.0 to 16.4.1. - [Release notes](https://github.com/tediousjs/tedious/releases) - [Commits](https://github.com/tediousjs/tedious/compare/v16.4.0...v16.4.1) --- updated-dependencies: - dependency-name: tedious dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 41fdef825..d5ae99cbc 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9471,9 +9471,9 @@ } }, "node_modules/tedious": { - "version": "16.4.0", - "resolved": "https://registry.npmjs.org/tedious/-/tedious-16.4.0.tgz", - "integrity": "sha512-WUWtO18n43GnKI367lVEtmbBxAaTIpTONuZ87sTEMMUcQ9gy5D9H6TCHBKNz/6yYIKnCfjE9wgAc2dR4qiDiaA==", + "version": "16.4.1", + "resolved": "https://registry.npmjs.org/tedious/-/tedious-16.4.1.tgz", + "integrity": "sha512-WwRkGs7N5jFiHhD7uyLHnZ9rCmOfYytEHZhE/vyU56mxzFB3+xHd4WV+DssLwuc1piJqDI54vHDi6SRACOGu8g==", "dependencies": { "@azure/identity": "^2.0.4", "@azure/keyvault-keys": "^4.4.0", @@ -17509,9 +17509,9 @@ } }, "tedious": { - "version": "16.4.0", - "resolved": "https://registry.npmjs.org/tedious/-/tedious-16.4.0.tgz", - "integrity": "sha512-WUWtO18n43GnKI367lVEtmbBxAaTIpTONuZ87sTEMMUcQ9gy5D9H6TCHBKNz/6yYIKnCfjE9wgAc2dR4qiDiaA==", + "version": "16.4.1", + "resolved": "https://registry.npmjs.org/tedious/-/tedious-16.4.1.tgz", + "integrity": "sha512-WwRkGs7N5jFiHhD7uyLHnZ9rCmOfYytEHZhE/vyU56mxzFB3+xHd4WV+DssLwuc1piJqDI54vHDi6SRACOGu8g==", "requires": { "@azure/identity": "^2.0.4", "@azure/keyvault-keys": "^4.4.0", From 55ad7bc6920694d1e554879658729d3fc9ab14e7 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 26 Sep 2023 10:24:01 +0800 Subject: [PATCH 219/297] Bump @types/args from 5.0.0 to 5.0.1 (#2188) Bumps [@types/args](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/args) from 5.0.0 to 5.0.1. - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/args) --- updated-dependencies: - dependency-name: "@types/args" dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index d5ae99cbc..b97389655 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1324,9 +1324,9 @@ "dev": true }, "node_modules/@types/args": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@types/args/-/args-5.0.0.tgz", - "integrity": "sha512-3fNb8ja/wQWFrHf5SQC5S3n0iBXdnT3PTPEJni2tBQRuv0BnAsz5u12U5gPRBSR7xdY6fI6QjWoTK/8ysuTt0w==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@types/args/-/args-5.0.1.tgz", + "integrity": "sha512-Eiz42PjJ9rP1U00jKox3TZxmB2AXfw2Fz/sF75x9zAAa2GCId+K8jv92wdsx5KCa3tMhuY+nwav4tQAwy71kHQ==", "dev": true }, "node_modules/@types/async": { @@ -11284,9 +11284,9 @@ "dev": true }, "@types/args": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@types/args/-/args-5.0.0.tgz", - "integrity": "sha512-3fNb8ja/wQWFrHf5SQC5S3n0iBXdnT3PTPEJni2tBQRuv0BnAsz5u12U5gPRBSR7xdY6fI6QjWoTK/8ysuTt0w==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@types/args/-/args-5.0.1.tgz", + "integrity": "sha512-Eiz42PjJ9rP1U00jKox3TZxmB2AXfw2Fz/sF75x9zAAa2GCId+K8jv92wdsx5KCa3tMhuY+nwav4tQAwy71kHQ==", "dev": true }, "@types/async": { From 1e6d356488277148dabf6d740a8ea2458f4968d3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 27 Sep 2023 10:09:21 +0800 Subject: [PATCH 220/297] Bump eslint from 8.49.0 to 8.50.0 (#2192) Bumps [eslint](https://github.com/eslint/eslint) from 8.49.0 to 8.50.0. - [Release notes](https://github.com/eslint/eslint/releases) - [Changelog](https://github.com/eslint/eslint/blob/main/CHANGELOG.md) - [Commits](https://github.com/eslint/eslint/compare/v8.49.0...v8.50.0) --- updated-dependencies: - dependency-name: eslint dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/package-lock.json b/package-lock.json index b97389655..389138faf 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1038,9 +1038,9 @@ } }, "node_modules/@eslint/js": { - "version": "8.49.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.49.0.tgz", - "integrity": "sha512-1S8uAY/MTJqVx0SC4epBq+N2yhuwtNwLbJYNZyhL2pO1ZVKn5HFXav5T41Ryzy9K9V7ZId2JB2oy/W4aCd9/2w==", + "version": "8.50.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.50.0.tgz", + "integrity": "sha512-NCC3zz2+nvYd+Ckfh87rA47zfu2QsQpvc6k1yzTk+b9KzRj0wkGa8LSoGOXN6Zv4lRf/EIoZ80biDh9HOI+RNQ==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -4328,15 +4328,15 @@ } }, "node_modules/eslint": { - "version": "8.49.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.49.0.tgz", - "integrity": "sha512-jw03ENfm6VJI0jA9U+8H5zfl5b+FvuU3YYvZRdZHOlU2ggJkxrlkJH4HcDrZpj6YwD8kuYqvQM8LyesoazrSOQ==", + "version": "8.50.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.50.0.tgz", + "integrity": "sha512-FOnOGSuFuFLv/Sa+FDVRZl4GGVAAFFi8LecRsI5a1tMO5HIE8nCm4ivAlzt4dT3ol/PaaGC0rJEEXQmHJBGoOg==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", "@eslint/eslintrc": "^2.1.2", - "@eslint/js": "8.49.0", + "@eslint/js": "8.50.0", "@humanwhocodes/config-array": "^0.11.11", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", @@ -11071,9 +11071,9 @@ } }, "@eslint/js": { - "version": "8.49.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.49.0.tgz", - "integrity": "sha512-1S8uAY/MTJqVx0SC4epBq+N2yhuwtNwLbJYNZyhL2pO1ZVKn5HFXav5T41Ryzy9K9V7ZId2JB2oy/W4aCd9/2w==", + "version": "8.50.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.50.0.tgz", + "integrity": "sha512-NCC3zz2+nvYd+Ckfh87rA47zfu2QsQpvc6k1yzTk+b9KzRj0wkGa8LSoGOXN6Zv4lRf/EIoZ80biDh9HOI+RNQ==", "dev": true }, "@humanwhocodes/config-array": { @@ -13748,15 +13748,15 @@ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" }, "eslint": { - "version": "8.49.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.49.0.tgz", - "integrity": "sha512-jw03ENfm6VJI0jA9U+8H5zfl5b+FvuU3YYvZRdZHOlU2ggJkxrlkJH4HcDrZpj6YwD8kuYqvQM8LyesoazrSOQ==", + "version": "8.50.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.50.0.tgz", + "integrity": "sha512-FOnOGSuFuFLv/Sa+FDVRZl4GGVAAFFi8LecRsI5a1tMO5HIE8nCm4ivAlzt4dT3ol/PaaGC0rJEEXQmHJBGoOg==", "dev": true, "requires": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", "@eslint/eslintrc": "^2.1.2", - "@eslint/js": "8.49.0", + "@eslint/js": "8.50.0", "@humanwhocodes/config-array": "^0.11.11", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", From 9c12eb0662ebc7c10b0c7b77568837726acc5b3a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 27 Sep 2023 10:24:30 +0800 Subject: [PATCH 221/297] Bump @types/validator from 13.11.1 to 13.11.2 (#2193) Bumps [@types/validator](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/validator) from 13.11.1 to 13.11.2. - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/validator) --- updated-dependencies: - dependency-name: "@types/validator" dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 389138faf..f39ff63fe 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1573,9 +1573,9 @@ } }, "node_modules/@types/validator": { - "version": "13.11.1", - "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.11.1.tgz", - "integrity": "sha512-d/MUkJYdOeKycmm75Arql4M5+UuXmf4cHdHKsyw1GcvnNgL6s77UkgSgJ8TE/rI5PYsnwYq5jkcWBLuN/MpQ1A==" + "version": "13.11.2", + "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.11.2.tgz", + "integrity": "sha512-nIKVVQKT6kGKysnNt+xLobr+pFJNssJRi2s034wgWeFBUx01fI8BeHTW2TcRp7VcFu9QCYG8IlChTuovcm0oKQ==" }, "node_modules/@types/vscode": { "version": "1.82.0", @@ -11533,9 +11533,9 @@ } }, "@types/validator": { - "version": "13.11.1", - "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.11.1.tgz", - "integrity": "sha512-d/MUkJYdOeKycmm75Arql4M5+UuXmf4cHdHKsyw1GcvnNgL6s77UkgSgJ8TE/rI5PYsnwYq5jkcWBLuN/MpQ1A==" + "version": "13.11.2", + "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.11.2.tgz", + "integrity": "sha512-nIKVVQKT6kGKysnNt+xLobr+pFJNssJRi2s034wgWeFBUx01fI8BeHTW2TcRp7VcFu9QCYG8IlChTuovcm0oKQ==" }, "@types/vscode": { "version": "1.82.0", From 73912424b75b6b1d855224c5c3e1c28dd27d4f6d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 28 Sep 2023 10:34:56 +0800 Subject: [PATCH 222/297] Bump @types/morgan from 1.9.5 to 1.9.6 (#2197) Bumps [@types/morgan](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/morgan) from 1.9.5 to 1.9.6. - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/morgan) --- updated-dependencies: - dependency-name: "@types/morgan" dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index f39ff63fe..bd3abe2e4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1473,9 +1473,9 @@ "dev": true }, "node_modules/@types/morgan": { - "version": "1.9.5", - "resolved": "https://registry.npmjs.org/@types/morgan/-/morgan-1.9.5.tgz", - "integrity": "sha512-5TgfIWm0lcTGnbCZExwc19dCOMOMmAiiBZQj8Ko3NRxsVDgRxf+AEGRQTqNVA5Yh2xfdWp4clbAEMbYP+jkOqg==", + "version": "1.9.6", + "resolved": "https://registry.npmjs.org/@types/morgan/-/morgan-1.9.6.tgz", + "integrity": "sha512-xfKogz5WcKww2DAiVT9zxMgrqQt+Shq8tDVeLT+otoj6dJnkRkyJxMF51mHtUc3JCPKGk5x1EBU0buuGpfftlQ==", "dev": true, "dependencies": { "@types/node": "*" @@ -11433,9 +11433,9 @@ "dev": true }, "@types/morgan": { - "version": "1.9.5", - "resolved": "https://registry.npmjs.org/@types/morgan/-/morgan-1.9.5.tgz", - "integrity": "sha512-5TgfIWm0lcTGnbCZExwc19dCOMOMmAiiBZQj8Ko3NRxsVDgRxf+AEGRQTqNVA5Yh2xfdWp4clbAEMbYP+jkOqg==", + "version": "1.9.6", + "resolved": "https://registry.npmjs.org/@types/morgan/-/morgan-1.9.6.tgz", + "integrity": "sha512-xfKogz5WcKww2DAiVT9zxMgrqQt+Shq8tDVeLT+otoj6dJnkRkyJxMF51mHtUc3JCPKGk5x1EBU0buuGpfftlQ==", "dev": true, "requires": { "@types/node": "*" From 0e42f080c08927afd6ad2c1a4fa597ad223fba4a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 9 Oct 2023 10:54:57 +0800 Subject: [PATCH 223/297] Bump @types/vscode from 1.82.0 to 1.83.0 (#2207) Bumps [@types/vscode](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/vscode) from 1.82.0 to 1.83.0. - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/vscode) --- updated-dependencies: - dependency-name: "@types/vscode" dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index bd3abe2e4..8e007830c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1578,9 +1578,9 @@ "integrity": "sha512-nIKVVQKT6kGKysnNt+xLobr+pFJNssJRi2s034wgWeFBUx01fI8BeHTW2TcRp7VcFu9QCYG8IlChTuovcm0oKQ==" }, "node_modules/@types/vscode": { - "version": "1.82.0", - "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.82.0.tgz", - "integrity": "sha512-VSHV+VnpF8DEm8LNrn8OJ8VuUNcBzN3tMvKrNpbhhfuVjFm82+6v44AbDhLvVFgCzn6vs94EJNTp7w8S6+Q1Rw==", + "version": "1.83.0", + "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.83.0.tgz", + "integrity": "sha512-3mUtHqLAVz9hegut9au4xehuBrzRE3UJiQMpoEHkNl6XHliihO7eATx2BMHs0odsmmrwjJrlixx/Pte6M3ygDQ==", "dev": true }, "node_modules/@types/xml2js": { @@ -11538,9 +11538,9 @@ "integrity": "sha512-nIKVVQKT6kGKysnNt+xLobr+pFJNssJRi2s034wgWeFBUx01fI8BeHTW2TcRp7VcFu9QCYG8IlChTuovcm0oKQ==" }, "@types/vscode": { - "version": "1.82.0", - "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.82.0.tgz", - "integrity": "sha512-VSHV+VnpF8DEm8LNrn8OJ8VuUNcBzN3tMvKrNpbhhfuVjFm82+6v44AbDhLvVFgCzn6vs94EJNTp7w8S6+Q1Rw==", + "version": "1.83.0", + "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.83.0.tgz", + "integrity": "sha512-3mUtHqLAVz9hegut9au4xehuBrzRE3UJiQMpoEHkNl6XHliihO7eATx2BMHs0odsmmrwjJrlixx/Pte6M3ygDQ==", "dev": true }, "@types/xml2js": { From 8ae16a176f13033ad9ad04918b0f5b4b859e46a2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 10 Oct 2023 09:25:32 +0800 Subject: [PATCH 224/297] Bump winston from 3.10.0 to 3.11.0 (#2212) Bumps [winston](https://github.com/winstonjs/winston) from 3.10.0 to 3.11.0. - [Release notes](https://github.com/winstonjs/winston/releases) - [Changelog](https://github.com/winstonjs/winston/blob/master/CHANGELOG.md) - [Commits](https://github.com/winstonjs/winston/compare/v3.10.0...v3.11.0) --- updated-dependencies: - dependency-name: winston dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 29 +++++++++++++++++++++-------- 1 file changed, 21 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index 8e007830c..b1dd0e383 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10082,11 +10082,11 @@ } }, "node_modules/winston": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/winston/-/winston-3.10.0.tgz", - "integrity": "sha512-nT6SIDaE9B7ZRO0u3UvdrimG0HkB7dSTAgInQnNR2SOPJ4bvq5q79+pXLftKmP52lJGW15+H5MCK0nM9D3KB/g==", + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/winston/-/winston-3.11.0.tgz", + "integrity": "sha512-L3yR6/MzZAOl0DsysUXHVjOwv8mKZ71TrA/41EIduGpOOV5LQVodqN+QdQ6BS6PJ/RdIshZhq84P/fStEZkk7g==", "dependencies": { - "@colors/colors": "1.5.0", + "@colors/colors": "^1.6.0", "@dabh/diagnostics": "^2.0.2", "async": "^3.2.3", "is-stream": "^2.0.0", @@ -10128,6 +10128,14 @@ "node": ">= 6" } }, + "node_modules/winston/node_modules/@colors/colors": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.6.0.tgz", + "integrity": "sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==", + "engines": { + "node": ">=0.1.90" + } + }, "node_modules/winston/node_modules/is-stream": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", @@ -17974,11 +17982,11 @@ } }, "winston": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/winston/-/winston-3.10.0.tgz", - "integrity": "sha512-nT6SIDaE9B7ZRO0u3UvdrimG0HkB7dSTAgInQnNR2SOPJ4bvq5q79+pXLftKmP52lJGW15+H5MCK0nM9D3KB/g==", + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/winston/-/winston-3.11.0.tgz", + "integrity": "sha512-L3yR6/MzZAOl0DsysUXHVjOwv8mKZ71TrA/41EIduGpOOV5LQVodqN+QdQ6BS6PJ/RdIshZhq84P/fStEZkk7g==", "requires": { - "@colors/colors": "1.5.0", + "@colors/colors": "^1.6.0", "@dabh/diagnostics": "^2.0.2", "async": "^3.2.3", "is-stream": "^2.0.0", @@ -17991,6 +17999,11 @@ "winston-transport": "^4.5.0" }, "dependencies": { + "@colors/colors": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.6.0.tgz", + "integrity": "sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==" + }, "is-stream": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", From 2fc3a7b8533a84551c7a5acc2ec95581785b5043 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 10 Oct 2023 09:27:20 +0800 Subject: [PATCH 225/297] Bump eslint from 8.50.0 to 8.51.0 (#2209) Bumps [eslint](https://github.com/eslint/eslint) from 8.50.0 to 8.51.0. - [Release notes](https://github.com/eslint/eslint/releases) - [Changelog](https://github.com/eslint/eslint/blob/main/CHANGELOG.md) - [Commits](https://github.com/eslint/eslint/compare/v8.50.0...v8.51.0) --- updated-dependencies: - dependency-name: eslint dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/package-lock.json b/package-lock.json index b1dd0e383..ccbdff1c8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1038,9 +1038,9 @@ } }, "node_modules/@eslint/js": { - "version": "8.50.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.50.0.tgz", - "integrity": "sha512-NCC3zz2+nvYd+Ckfh87rA47zfu2QsQpvc6k1yzTk+b9KzRj0wkGa8LSoGOXN6Zv4lRf/EIoZ80biDh9HOI+RNQ==", + "version": "8.51.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.51.0.tgz", + "integrity": "sha512-HxjQ8Qn+4SI3/AFv6sOrDB+g6PpUTDwSJiQqOrnneEk8L71161srI9gjzzZvYVbzHiVg/BvcH95+cK/zfIt4pg==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -4328,15 +4328,15 @@ } }, "node_modules/eslint": { - "version": "8.50.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.50.0.tgz", - "integrity": "sha512-FOnOGSuFuFLv/Sa+FDVRZl4GGVAAFFi8LecRsI5a1tMO5HIE8nCm4ivAlzt4dT3ol/PaaGC0rJEEXQmHJBGoOg==", + "version": "8.51.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.51.0.tgz", + "integrity": "sha512-2WuxRZBrlwnXi+/vFSJyjMqrNjtJqiasMzehF0shoLaW7DzS3/9Yvrmq5JiT66+pNjiX4UBnLDiKHcWAr/OInA==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", "@eslint/eslintrc": "^2.1.2", - "@eslint/js": "8.50.0", + "@eslint/js": "8.51.0", "@humanwhocodes/config-array": "^0.11.11", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", @@ -11079,9 +11079,9 @@ } }, "@eslint/js": { - "version": "8.50.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.50.0.tgz", - "integrity": "sha512-NCC3zz2+nvYd+Ckfh87rA47zfu2QsQpvc6k1yzTk+b9KzRj0wkGa8LSoGOXN6Zv4lRf/EIoZ80biDh9HOI+RNQ==", + "version": "8.51.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.51.0.tgz", + "integrity": "sha512-HxjQ8Qn+4SI3/AFv6sOrDB+g6PpUTDwSJiQqOrnneEk8L71161srI9gjzzZvYVbzHiVg/BvcH95+cK/zfIt4pg==", "dev": true }, "@humanwhocodes/config-array": { @@ -13756,15 +13756,15 @@ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" }, "eslint": { - "version": "8.50.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.50.0.tgz", - "integrity": "sha512-FOnOGSuFuFLv/Sa+FDVRZl4GGVAAFFi8LecRsI5a1tMO5HIE8nCm4ivAlzt4dT3ol/PaaGC0rJEEXQmHJBGoOg==", + "version": "8.51.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.51.0.tgz", + "integrity": "sha512-2WuxRZBrlwnXi+/vFSJyjMqrNjtJqiasMzehF0shoLaW7DzS3/9Yvrmq5JiT66+pNjiX4UBnLDiKHcWAr/OInA==", "dev": true, "requires": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", "@eslint/eslintrc": "^2.1.2", - "@eslint/js": "8.50.0", + "@eslint/js": "8.51.0", "@humanwhocodes/config-array": "^0.11.11", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", From 1e8f6f180d62543fe473186641869c8ba665b148 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 11 Oct 2023 09:57:50 +0800 Subject: [PATCH 226/297] Bump @types/bluebird from 3.5.39 to 3.5.40 (#2219) Bumps [@types/bluebird](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/bluebird) from 3.5.39 to 3.5.40. - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/bluebird) --- updated-dependencies: - dependency-name: "@types/bluebird" dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index ccbdff1c8..edcbe3e15 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1336,9 +1336,9 @@ "dev": true }, "node_modules/@types/bluebird": { - "version": "3.5.39", - "resolved": "https://registry.npmjs.org/@types/bluebird/-/bluebird-3.5.39.tgz", - "integrity": "sha512-0h2lKudcFwHih8NHAgt/uyAIUQDO0AdfJYlWBXD8r+gFDulUi2CMZoQSh2Q5ol1FMaHV9k7/4HtcbA8ABtexmA==", + "version": "3.5.40", + "resolved": "https://registry.npmjs.org/@types/bluebird/-/bluebird-3.5.40.tgz", + "integrity": "sha512-4dEtF/qcby/FdT6iChii+jFXzVVX0+5HYiDqHKBtHQ3ZV58x5uVJJYRG0N4QllIaj5a2+UDdf/nupae+/M6mdw==", "dev": true }, "node_modules/@types/body-parser": { @@ -11304,9 +11304,9 @@ "dev": true }, "@types/bluebird": { - "version": "3.5.39", - "resolved": "https://registry.npmjs.org/@types/bluebird/-/bluebird-3.5.39.tgz", - "integrity": "sha512-0h2lKudcFwHih8NHAgt/uyAIUQDO0AdfJYlWBXD8r+gFDulUi2CMZoQSh2Q5ol1FMaHV9k7/4HtcbA8ABtexmA==", + "version": "3.5.40", + "resolved": "https://registry.npmjs.org/@types/bluebird/-/bluebird-3.5.40.tgz", + "integrity": "sha512-4dEtF/qcby/FdT6iChii+jFXzVVX0+5HYiDqHKBtHQ3ZV58x5uVJJYRG0N4QllIaj5a2+UDdf/nupae+/M6mdw==", "dev": true }, "@types/body-parser": { From c9404c876fe08d3510ae06dbdae7dcf7161e8257 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 16 Oct 2023 11:01:47 +0800 Subject: [PATCH 227/297] Bump @types/validator from 13.11.2 to 13.11.3 (#2222) Bumps [@types/validator](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/validator) from 13.11.2 to 13.11.3. - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/validator) --- updated-dependencies: - dependency-name: "@types/validator" dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index edcbe3e15..85db5494b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1573,9 +1573,9 @@ } }, "node_modules/@types/validator": { - "version": "13.11.2", - "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.11.2.tgz", - "integrity": "sha512-nIKVVQKT6kGKysnNt+xLobr+pFJNssJRi2s034wgWeFBUx01fI8BeHTW2TcRp7VcFu9QCYG8IlChTuovcm0oKQ==" + "version": "13.11.3", + "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.11.3.tgz", + "integrity": "sha512-jxjhh33aTYDHnrV1vZ3AvWQHfrGx2f5UxKjaP13l5q04fG+/hCKKm0MfodIoCqxevhbcfBb6ZjynyHuQ/jueGQ==" }, "node_modules/@types/vscode": { "version": "1.83.0", @@ -11541,9 +11541,9 @@ } }, "@types/validator": { - "version": "13.11.2", - "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.11.2.tgz", - "integrity": "sha512-nIKVVQKT6kGKysnNt+xLobr+pFJNssJRi2s034wgWeFBUx01fI8BeHTW2TcRp7VcFu9QCYG8IlChTuovcm0oKQ==" + "version": "13.11.3", + "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.11.3.tgz", + "integrity": "sha512-jxjhh33aTYDHnrV1vZ3AvWQHfrGx2f5UxKjaP13l5q04fG+/hCKKm0MfodIoCqxevhbcfBb6ZjynyHuQ/jueGQ==" }, "@types/vscode": { "version": "1.83.0", From 58393d3622e5e6cc0c9e3580def5f752b7dc8076 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 17 Oct 2023 09:33:05 +0800 Subject: [PATCH 228/297] Bump mysql2 from 3.6.1 to 3.6.2 (#2231) Bumps [mysql2](https://github.com/sidorares/node-mysql2) from 3.6.1 to 3.6.2. - [Release notes](https://github.com/sidorares/node-mysql2/releases) - [Changelog](https://github.com/sidorares/node-mysql2/blob/master/Changelog.md) - [Commits](https://github.com/sidorares/node-mysql2/compare/v3.6.1...v3.6.2) --- updated-dependencies: - dependency-name: mysql2 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 85db5494b..ebb9024d2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -7448,9 +7448,9 @@ "dev": true }, "node_modules/mysql2": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.6.1.tgz", - "integrity": "sha512-O7FXjLtNkjcMBpLURwkXIhyVbX9i4lq4nNRCykPNOXfceq94kJ0miagmTEGCZieuO8JtwtXaZ41U6KT4eF9y3g==", + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.6.2.tgz", + "integrity": "sha512-m5erE6bMoWfPXW1D5UrVwlT8PowAoSX69KcZzPuARQ3wY1RJ52NW9PdvdPo076XiSIkQ5IBTis7hxdlrQTlyug==", "dependencies": { "denque": "^2.1.0", "generate-function": "^2.3.1", @@ -16054,9 +16054,9 @@ "dev": true }, "mysql2": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.6.1.tgz", - "integrity": "sha512-O7FXjLtNkjcMBpLURwkXIhyVbX9i4lq4nNRCykPNOXfceq94kJ0miagmTEGCZieuO8JtwtXaZ41U6KT4eF9y3g==", + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.6.2.tgz", + "integrity": "sha512-m5erE6bMoWfPXW1D5UrVwlT8PowAoSX69KcZzPuARQ3wY1RJ52NW9PdvdPo076XiSIkQ5IBTis7hxdlrQTlyug==", "requires": { "denque": "^2.1.0", "generate-function": "^2.3.1", From 62ba685b54ff68aff147597a45e6e947267de097 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 17 Oct 2023 09:47:57 +0800 Subject: [PATCH 229/297] Bump lint-staged from 14.0.1 to 15.0.1 (#2229) Bumps [lint-staged](https://github.com/okonet/lint-staged) from 14.0.1 to 15.0.1. - [Release notes](https://github.com/okonet/lint-staged/releases) - [Changelog](https://github.com/lint-staged/lint-staged/blob/master/CHANGELOG.md) - [Commits](https://github.com/okonet/lint-staged/compare/v14.0.1...v15.0.1) --- updated-dependencies: - dependency-name: lint-staged dependency-type: direct:development update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 162 ++++++++++++++++++++++++---------------------- package.json | 2 +- 2 files changed, 87 insertions(+), 77 deletions(-) diff --git a/package-lock.json b/package-lock.json index ebb9024d2..fead86773 100644 --- a/package-lock.json +++ b/package-lock.json @@ -73,7 +73,7 @@ "eslint": "^8.35.0", "find-process": "^1.4.4", "husky": "^8.0.1", - "lint-staged": "^14.0.0", + "lint-staged": "^15.0.1", "mocha": "^5.2.0", "pkg": "^5.3.0", "prettier": "^3.0.0", @@ -3666,9 +3666,9 @@ } }, "node_modules/commander": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-11.0.0.tgz", - "integrity": "sha512-9HMlXtt/BNoYr8ooyjjNRdIilOTkVJXB+GhxMTtOKwk0R4j4lS4NpjuqmRxroBfnfTSHQIHQB7wryHhXarNjmQ==", + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz", + "integrity": "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==", "dev": true, "engines": { "node": ">=16" @@ -4775,23 +4775,23 @@ } }, "node_modules/execa": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-7.2.0.tgz", - "integrity": "sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", + "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", "dev": true, "dependencies": { "cross-spawn": "^7.0.3", - "get-stream": "^6.0.1", - "human-signals": "^4.3.0", + "get-stream": "^8.0.1", + "human-signals": "^5.0.0", "is-stream": "^3.0.0", "merge-stream": "^2.0.0", "npm-run-path": "^5.1.0", "onetime": "^6.0.0", - "signal-exit": "^3.0.7", + "signal-exit": "^4.1.0", "strip-final-newline": "^3.0.0" }, "engines": { - "node": "^14.18.0 || ^16.14.0 || >=18.0.0" + "node": ">=16.17" }, "funding": { "url": "https://github.com/sindresorhus/execa?sponsor=1" @@ -5398,12 +5398,12 @@ } }, "node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", + "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", "dev": true, "engines": { - "node": ">=10" + "node": ">=16" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -6003,12 +6003,12 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "node_modules/human-signals": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz", - "integrity": "sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", + "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", "dev": true, "engines": { - "node": ">=14.18.0" + "node": ">=16.17.0" } }, "node_modules/husky": { @@ -6703,27 +6703,27 @@ } }, "node_modules/lint-staged": { - "version": "14.0.1", - "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-14.0.1.tgz", - "integrity": "sha512-Mw0cL6HXnHN1ag0mN/Dg4g6sr8uf8sn98w2Oc1ECtFto9tvRF7nkXGJRbx8gPlHyoR0pLyBr2lQHbWwmUHe1Sw==", + "version": "15.0.1", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-15.0.1.tgz", + "integrity": "sha512-2IU5OWmCaxch0X0+IBF4/v7sutpB+F3qoXbro43pYjQTOo5wumckjxoxn47pQBqqBsCWrD5HnI2uG/zJA7isew==", "dev": true, "dependencies": { "chalk": "5.3.0", - "commander": "11.0.0", + "commander": "11.1.0", "debug": "4.3.4", - "execa": "7.2.0", + "execa": "8.0.1", "lilconfig": "2.1.0", - "listr2": "6.6.1", + "listr2": "7.0.1", "micromatch": "4.0.5", "pidtree": "0.6.0", "string-argv": "0.3.2", - "yaml": "2.3.1" + "yaml": "2.3.2" }, "bin": { "lint-staged": "bin/lint-staged.js" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": ">=18.12.0" }, "funding": { "url": "https://opencollective.com/lint-staged" @@ -6823,9 +6823,9 @@ } }, "node_modules/listr2": { - "version": "6.6.1", - "resolved": "https://registry.npmjs.org/listr2/-/listr2-6.6.1.tgz", - "integrity": "sha512-+rAXGHh0fkEWdXBmX+L6mmfmXmXvDGEKzkjxO+8mP3+nI/r/CWznVBvsibXdxda9Zz0OW2e2ikphN3OwCT/jSg==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-7.0.1.tgz", + "integrity": "sha512-nz+7hwgbDp8eWNoDgzdl4hA/xDSLrNRzPu1TLgOYs6l5Y+Ma6zVWWy9Oyt9TQFONwKoSPoka3H50D3vD5EuNwg==", "dev": true, "dependencies": { "cli-truncate": "^3.1.0", @@ -6837,14 +6837,6 @@ }, "engines": { "node": ">=16.0.0" - }, - "peerDependencies": { - "enquirer": ">= 2.3.0 < 3" - }, - "peerDependenciesMeta": { - "enquirer": { - "optional": true - } } }, "node_modules/listr2/node_modules/ansi-regex": { @@ -8706,6 +8698,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/restore-cursor/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, "node_modules/retry-as-promised": { "version": "7.0.4", "resolved": "https://registry.npmjs.org/retry-as-promised/-/retry-as-promised-7.0.4.tgz", @@ -9069,10 +9067,16 @@ } }, "node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } }, "node_modules/simple-concat": { "version": "1.0.1", @@ -10271,9 +10275,9 @@ "dev": true }, "node_modules/yaml": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.1.tgz", - "integrity": "sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.2.tgz", + "integrity": "sha512-N/lyzTPaJasoDmfV7YTrYCI0G/3ivm/9wdG0aHuheKowWQwGTsK0Eoiw6utmzAnI6pkJa0DUVygvp3spqqEKXg==", "dev": true, "engines": { "node": ">= 14" @@ -13271,9 +13275,9 @@ } }, "commander": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-11.0.0.tgz", - "integrity": "sha512-9HMlXtt/BNoYr8ooyjjNRdIilOTkVJXB+GhxMTtOKwk0R4j4lS4NpjuqmRxroBfnfTSHQIHQB7wryHhXarNjmQ==", + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz", + "integrity": "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==", "dev": true }, "concat-map": { @@ -14072,19 +14076,19 @@ "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==" }, "execa": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-7.2.0.tgz", - "integrity": "sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", + "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", "dev": true, "requires": { "cross-spawn": "^7.0.3", - "get-stream": "^6.0.1", - "human-signals": "^4.3.0", + "get-stream": "^8.0.1", + "human-signals": "^5.0.0", "is-stream": "^3.0.0", "merge-stream": "^2.0.0", "npm-run-path": "^5.1.0", "onetime": "^6.0.0", - "signal-exit": "^3.0.7", + "signal-exit": "^4.1.0", "strip-final-newline": "^3.0.0" }, "dependencies": { @@ -14547,9 +14551,9 @@ } }, "get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", + "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", "dev": true }, "get-symbol-description": { @@ -14979,9 +14983,9 @@ } }, "human-signals": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz", - "integrity": "sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", + "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", "dev": true }, "husky": { @@ -15490,21 +15494,21 @@ } }, "lint-staged": { - "version": "14.0.1", - "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-14.0.1.tgz", - "integrity": "sha512-Mw0cL6HXnHN1ag0mN/Dg4g6sr8uf8sn98w2Oc1ECtFto9tvRF7nkXGJRbx8gPlHyoR0pLyBr2lQHbWwmUHe1Sw==", + "version": "15.0.1", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-15.0.1.tgz", + "integrity": "sha512-2IU5OWmCaxch0X0+IBF4/v7sutpB+F3qoXbro43pYjQTOo5wumckjxoxn47pQBqqBsCWrD5HnI2uG/zJA7isew==", "dev": true, "requires": { "chalk": "5.3.0", - "commander": "11.0.0", + "commander": "11.1.0", "debug": "4.3.4", - "execa": "7.2.0", + "execa": "8.0.1", "lilconfig": "2.1.0", - "listr2": "6.6.1", + "listr2": "7.0.1", "micromatch": "4.0.5", "pidtree": "0.6.0", "string-argv": "0.3.2", - "yaml": "2.3.1" + "yaml": "2.3.2" }, "dependencies": { "braces": { @@ -15574,9 +15578,9 @@ } }, "listr2": { - "version": "6.6.1", - "resolved": "https://registry.npmjs.org/listr2/-/listr2-6.6.1.tgz", - "integrity": "sha512-+rAXGHh0fkEWdXBmX+L6mmfmXmXvDGEKzkjxO+8mP3+nI/r/CWznVBvsibXdxda9Zz0OW2e2ikphN3OwCT/jSg==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-7.0.1.tgz", + "integrity": "sha512-nz+7hwgbDp8eWNoDgzdl4hA/xDSLrNRzPu1TLgOYs6l5Y+Ma6zVWWy9Oyt9TQFONwKoSPoka3H50D3vD5EuNwg==", "dev": true, "requires": { "cli-truncate": "^3.1.0", @@ -16975,6 +16979,12 @@ "requires": { "mimic-fn": "^2.1.0" } + }, + "signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true } } }, @@ -17233,9 +17243,9 @@ } }, "signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", "dev": true }, "simple-concat": { @@ -18129,9 +18139,9 @@ "dev": true }, "yaml": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.1.tgz", - "integrity": "sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.2.tgz", + "integrity": "sha512-N/lyzTPaJasoDmfV7YTrYCI0G/3ivm/9wdG0aHuheKowWQwGTsK0Eoiw6utmzAnI6pkJa0DUVygvp3spqqEKXg==", "dev": true }, "yauzl": { diff --git a/package.json b/package.json index 952136c2f..df7ae2738 100644 --- a/package.json +++ b/package.json @@ -78,7 +78,7 @@ "eslint": "^8.35.0", "find-process": "^1.4.4", "husky": "^8.0.1", - "lint-staged": "^14.0.0", + "lint-staged": "^15.0.1", "mocha": "^5.2.0", "pkg": "^5.3.0", "prettier": "^3.0.0", From 99d4c1e67129c147b003db9ec22adc98a62ab172 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 19 Oct 2023 10:38:43 +0800 Subject: [PATCH 230/297] Bump @types/stoppable from 1.1.1 to 1.1.2 (#2237) Bumps [@types/stoppable](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/stoppable) from 1.1.1 to 1.1.2. - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/stoppable) --- updated-dependencies: - dependency-name: "@types/stoppable" dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index fead86773..0f6f428bd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1541,9 +1541,9 @@ } }, "node_modules/@types/stoppable": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@types/stoppable/-/stoppable-1.1.1.tgz", - "integrity": "sha512-b8N+fCADRIYYrGZOcmOR8ZNBOqhktWTB/bMUl5LvGtT201QKJZOOH5UsFyI3qtteM6ZAJbJqZoBcLqqxKIwjhw==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@types/stoppable/-/stoppable-1.1.2.tgz", + "integrity": "sha512-zRBGFTIdkCAdM4VDeFvka5NbD6JVfz7yEYzggKrXQ03ZplrZp5vqQPWHTw0wk81wer61dwi44Tp6FDDXoPBW5A==", "dev": true, "dependencies": { "@types/node": "*" @@ -11513,9 +11513,9 @@ } }, "@types/stoppable": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@types/stoppable/-/stoppable-1.1.1.tgz", - "integrity": "sha512-b8N+fCADRIYYrGZOcmOR8ZNBOqhktWTB/bMUl5LvGtT201QKJZOOH5UsFyI3qtteM6ZAJbJqZoBcLqqxKIwjhw==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@types/stoppable/-/stoppable-1.1.2.tgz", + "integrity": "sha512-zRBGFTIdkCAdM4VDeFvka5NbD6JVfz7yEYzggKrXQ03ZplrZp5vqQPWHTw0wk81wer61dwi44Tp6FDDXoPBW5A==", "dev": true, "requires": { "@types/node": "*" From 46caa656ef144c15d1264a21c85ae8a0e6012b10 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 19 Oct 2023 11:40:44 +0800 Subject: [PATCH 231/297] Bump @types/args from 5.0.1 to 5.0.2 (#2238) Bumps [@types/args](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/args) from 5.0.1 to 5.0.2. - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/args) --- updated-dependencies: - dependency-name: "@types/args" dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 0f6f428bd..37a807d5d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1324,9 +1324,9 @@ "dev": true }, "node_modules/@types/args": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@types/args/-/args-5.0.1.tgz", - "integrity": "sha512-Eiz42PjJ9rP1U00jKox3TZxmB2AXfw2Fz/sF75x9zAAa2GCId+K8jv92wdsx5KCa3tMhuY+nwav4tQAwy71kHQ==", + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@types/args/-/args-5.0.2.tgz", + "integrity": "sha512-bQdYASesybq3LRKrvDHTB8Tc5Y4XaVfbfcb0vl/bt2AQ/+VS+1ySvB72AlWLCO3xBAyrS6X3Gk83ni9PfKXSbA==", "dev": true }, "node_modules/@types/async": { @@ -11296,9 +11296,9 @@ "dev": true }, "@types/args": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@types/args/-/args-5.0.1.tgz", - "integrity": "sha512-Eiz42PjJ9rP1U00jKox3TZxmB2AXfw2Fz/sF75x9zAAa2GCId+K8jv92wdsx5KCa3tMhuY+nwav4tQAwy71kHQ==", + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@types/args/-/args-5.0.2.tgz", + "integrity": "sha512-bQdYASesybq3LRKrvDHTB8Tc5Y4XaVfbfcb0vl/bt2AQ/+VS+1ySvB72AlWLCO3xBAyrS6X3Gk83ni9PfKXSbA==", "dev": true }, "@types/async": { From 3e65074e0d01c27f0b4d737be0835daea52ebc65 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 19 Oct 2023 13:17:01 +0800 Subject: [PATCH 232/297] Bump @types/etag from 1.8.1 to 1.8.2 (#2235) Bumps [@types/etag](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/etag) from 1.8.1 to 1.8.2. - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/etag) --- updated-dependencies: - dependency-name: "@types/etag" dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 37a807d5d..b36468706 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1369,9 +1369,9 @@ } }, "node_modules/@types/etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/@types/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-bsKkeSqN7HYyYntFRAmzcwx/dKW4Wa+KVMTInANlI72PWLQmOpZu96j0OqHZGArW4VQwCmJPteQlXaUDeOB0WQ==", + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/@types/etag/-/etag-1.8.2.tgz", + "integrity": "sha512-z8Pbo2e+EZWMpuRPYSjhSivp2OEkqrMZBUfEAWlJC31WUCKveZ8ioWXHAC5BXRZfwxCBfYRhPij1YJHK1W6oDA==", "dev": true, "dependencies": { "@types/node": "*" @@ -11341,9 +11341,9 @@ } }, "@types/etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/@types/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-bsKkeSqN7HYyYntFRAmzcwx/dKW4Wa+KVMTInANlI72PWLQmOpZu96j0OqHZGArW4VQwCmJPteQlXaUDeOB0WQ==", + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/@types/etag/-/etag-1.8.2.tgz", + "integrity": "sha512-z8Pbo2e+EZWMpuRPYSjhSivp2OEkqrMZBUfEAWlJC31WUCKveZ8ioWXHAC5BXRZfwxCBfYRhPij1YJHK1W6oDA==", "dev": true, "requires": { "@types/node": "*" From 68a3b056ac2f4e82188ead640fb70b5353af23ab Mon Sep 17 00:00:00 2001 From: vigneashs <93404886+vigneashs@users.noreply.github.com> Date: Wed, 18 Oct 2023 22:18:40 -0700 Subject: [PATCH 233/297] Fixes issue #2208 (#2215) * Fixes issue #2208 * Code review comments * Code review comments * Code review comments * Code review comments * Code review comments * Code cleanup * Tests fail on local dev - so using Azure devops to test if these are passing there * Testing changes in Azure Devops * Canonicalized Resource string bug fixed * Fixed bug in createStringToSignForSharedKeyLite routine * Fixes bug in createStringToSignForSharedKeyLite * Clean up and documentation --- ChangeLog.md | 3 + .../blobStorageContext.middleware.ts | 10 +- .../queueStorageContext.middleware.ts | 5 +- .../tableStorageContext.middleware.ts | 5 +- tests/blob/specialnaming.test.ts | 68 ++++++++++- tests/queue/queueSpecialnaming.test.ts | 110 ++++++++++++++++++ .../table/apis/table.validation.rest.test.ts | 81 ++++++++++++- .../table.entity.tests.rest.submitter.ts | 50 ++++++++ .../table.entity.tests.utils.for.rest.ts | 18 ++- 9 files changed, 333 insertions(+), 17 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index a96f0f198..bbb63fe16 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -12,15 +12,18 @@ Blob: - Fixed startCopyFromURL, copyFromURL API to return 400 (InvalidHeaderValue) when copy source has invalid format. (issue #1954) - Fixed CommitBlockList API to return 400 (InvalidXmlDocument) when the request is sent with JSON body. (issue #1955) - Added "x-ms-is-hns-enabled" header in x-ms-is-hns-enabled API responds (issue #1810) +- Fixed authentication error in production style URL for secondary location (issue #2208) Queue: - Fixed set Queue ACL failure when Start is missing (issue #2065) +- Fixed authentication error in production style URL for secondary location (issue #2208) Table: - Fixed the errorCode returned, when malformed Etag is provided for table Update/Delete calls. (issue #2013) - Fixed an issue when comparing `'' eq guid'00000000-0000-0000-0000-000000000000'` which would erroneously report these as equal. (issue #2169) +- Fixed authentication error in production style URL for secondary location (issue #2208) ## 2023.08 Version 3.26.0 diff --git a/src/blob/middlewares/blobStorageContext.middleware.ts b/src/blob/middlewares/blobStorageContext.middleware.ts index d31b65e7e..e325f5d5b 100644 --- a/src/blob/middlewares/blobStorageContext.middleware.ts +++ b/src/blob/middlewares/blobStorageContext.middleware.ts @@ -100,9 +100,12 @@ export function internnalBlobStorageContextMiddleware( blobContext.authenticationPath = reqPath; if (isSecondary) { const pos = blobContext.authenticationPath!.search(SECONDARY_SUFFIX); - blobContext.authenticationPath = + if (pos !== -1) + { + blobContext.authenticationPath = blobContext.authenticationPath!.substr(0, pos) + blobContext.authenticationPath!.substr(pos + SECONDARY_SUFFIX.length); + } } if (!account) { @@ -200,9 +203,12 @@ export function blobStorageContextMiddleware( blobContext.authenticationPath = req.path; if (isSecondary) { const pos = blobContext.authenticationPath.search(SECONDARY_SUFFIX); - blobContext.authenticationPath = + if (pos !== -1) + { + blobContext.authenticationPath = blobContext.authenticationPath.substr(0, pos) + blobContext.authenticationPath.substr(pos + SECONDARY_SUFFIX.length); + } } if (!account) { diff --git a/src/queue/middlewares/queueStorageContext.middleware.ts b/src/queue/middlewares/queueStorageContext.middleware.ts index 55c437413..7cbffa00c 100644 --- a/src/queue/middlewares/queueStorageContext.middleware.ts +++ b/src/queue/middlewares/queueStorageContext.middleware.ts @@ -108,9 +108,12 @@ export function queueStorageContextMiddleware( queueContext.authenticationPath = req.path; if (isSecondary) { const pos = queueContext.authenticationPath.search(SECONDARY_SUFFIX); - queueContext.authenticationPath = + if (pos !== -1) + { + queueContext.authenticationPath = queueContext.authenticationPath.substr(0, pos) + queueContext.authenticationPath.substr(pos + SECONDARY_SUFFIX.length); + } } if (account === undefined) { diff --git a/src/table/middleware/tableStorageContext.middleware.ts b/src/table/middleware/tableStorageContext.middleware.ts index 8a9efb024..8c08fcb6d 100644 --- a/src/table/middleware/tableStorageContext.middleware.ts +++ b/src/table/middleware/tableStorageContext.middleware.ts @@ -166,9 +166,12 @@ export function tableStorageContextMiddleware( if (isSecondary) { const pos = tableContext.authenticationPath.search(SECONDARY_SUFFIX); - tableContext.authenticationPath = + if (pos !== -1) + { + tableContext.authenticationPath = tableContext.authenticationPath.substr(0, pos) + tableContext.authenticationPath.substr(pos + SECONDARY_SUFFIX.length); + } } // Emulator's URL pattern is like http://hostname[:port]/account/table diff --git a/tests/blob/specialnaming.test.ts b/tests/blob/specialnaming.test.ts index 24a6be889..95b96f64b 100644 --- a/tests/blob/specialnaming.test.ts +++ b/tests/blob/specialnaming.test.ts @@ -25,7 +25,9 @@ describe("SpecialNaming", () => { const server = factory.createServer(); const baseURL = `http://${server.config.host}:${server.config.port}/devstoreaccount1`; - const productionStyleHostName = "devstoreaccount1.localhost"; // Use hosts file to make this resolve + const baseSecondaryURL = `http://${server.config.host}:${server.config.port}/devstoreaccount1-secondary`; + const productionStyleHostName = "devstoreaccount1.blob.localhost"; // Use hosts file to make this resolve + const productionStyleHostNameForSecondary = "devstoreaccount1-secondary.blob.localhost"; const noAccountHostName = "host.docker.internal"; const noAccountHostNameConnectionString = `DefaultEndpointsProtocol=http;AccountName=${EMULATOR_ACCOUNT_NAME};AccountKey=${EMULATOR_ACCOUNT_KEY};BlobEndpoint=http://${noAccountHostName}:${server.config.port}/${EMULATOR_ACCOUNT_NAME};`; @@ -540,4 +542,68 @@ describe("SpecialNaming", () => { } ); }); + + it(`Should work with production style URL when ${productionStyleHostNameForSecondary} is resolvable`, async () => { + await dns.promises.lookup(productionStyleHostNameForSecondary).then( + async (lookupAddress) => { + const baseURLProductionStyle = `http://${productionStyleHostNameForSecondary}:${server.config.port}`; + const serviceClientProductionStyle = new BlobServiceClient( + baseURLProductionStyle, + newPipeline( + new StorageSharedKeyCredential( + EMULATOR_ACCOUNT_NAME, + EMULATOR_ACCOUNT_KEY + ), + { + retryOptions: { maxTries: 1 }, + // Make sure socket is closed once the operation is done. + keepAliveOptions: { enable: false } + } + ) + ); + const containerClientProductionStyle = serviceClientProductionStyle.getContainerClient( + containerName + ); + + const response = + await containerClientProductionStyle.getProperties(); + + assert.deepStrictEqual(response._response.status, 200); + }, + () => { + // Cannot perform this test. We need devstoreaccount1-secondary.blob.localhost to resolve to 127.0.0.1. + // On Linux, this should just work, + // On Windows, we can't spoof DNS record for specific process. + // So we have options of running our own DNS server (overkill), + // or editing hosts files (machine global operation; and requires running as admin). + // So skip the test case. + assert.ok( + `Skipping test case - it needs ${productionStyleHostNameForSecondary} to be resolvable` + ); + } + ); + }); + + it(`Should work with non-production secondary url when ${baseSecondaryURL} is resolvable`, async () => { + const secondaryServiceClient = new BlobServiceClient( + baseSecondaryURL, + newPipeline( + new StorageSharedKeyCredential( + EMULATOR_ACCOUNT_NAME, + EMULATOR_ACCOUNT_KEY + ), + { + retryOptions: { maxTries: 1 }, + // Make sure socket is closed once the operation is done. + keepAliveOptions: { enable: false } + } + ) + ); + const containerClientSecondary = secondaryServiceClient.getContainerClient( + getUniqueName("container") + ); + + const response = await containerClientSecondary.createIfNotExists(); + assert.deepStrictEqual(response._response.status, 201); + }); }); diff --git a/tests/queue/queueSpecialnaming.test.ts b/tests/queue/queueSpecialnaming.test.ts index e870059d5..5d245974e 100644 --- a/tests/queue/queueSpecialnaming.test.ts +++ b/tests/queue/queueSpecialnaming.test.ts @@ -1,4 +1,5 @@ import * as assert from "assert"; +import dns = require("dns"); import { newPipeline, @@ -13,6 +14,7 @@ import Server from "../../src/queue/QueueServer"; import { EMULATOR_ACCOUNT_KEY, EMULATOR_ACCOUNT_NAME, + getUniqueName, rmRecursive } from "../testutils"; @@ -45,6 +47,10 @@ describe("Queue SpecialNaming", () => { ); const baseURL = `http://${host}:${port}/devstoreaccount1`; + const baseSecondaryURL = `http://${host}:${port}/devstoreaccount1-secondary`; + const productionStyleHostName = "devstoreaccount1.queue.localhost"; // Use hosts file to make this resolve + const productionStyleHostNameForSecondary = "devstoreaccount1-secondary.queue.localhost"; + const serviceClient = new QueueServiceClient( baseURL, newPipeline( @@ -187,4 +193,108 @@ describe("Queue SpecialNaming", () => { ) ); }); + + it(`Should work with production style URL when ${productionStyleHostName} is resolvable`, async () => { + let queueName = getUniqueName("queue"); + await dns.promises.lookup(productionStyleHostName).then( + async (lookupAddress) => { + const baseURLProductionStyle = `http://${productionStyleHostName}:${port}`; + const serviceClientProductionStyle = new QueueServiceClient( + baseURLProductionStyle, + newPipeline( + new StorageSharedKeyCredential( + EMULATOR_ACCOUNT_NAME, + EMULATOR_ACCOUNT_KEY + ), + { + retryOptions: { maxTries: 1 }, + // Make sure socket is closed once the operation is done. + keepAliveOptions: { enable: false } + } + ) + ); + const queueProductionStyle = serviceClientProductionStyle.getQueueClient( + queueName + ); + + const response = await queueProductionStyle.create(); + assert.deepStrictEqual(response._response.status, 201); + await queueProductionStyle.delete(); + }, + () => { + // Cannot perform this test. We need devstoreaccount1-secondary.blob.localhost to resolve to 127.0.0.1. + // On Linux, this should just work, + // On Windows, we can't spoof DNS record for specific process. + // So we have options of running our own DNS server (overkill), + // or editing hosts files (machine global operation; and requires running as admin). + // So skip the test case. + assert.ok( + `Skipping test case - it needs ${productionStyleHostNameForSecondary} to be resolvable` + ); + } + ); + }); + + it(`Should work with production style URL when ${productionStyleHostNameForSecondary} is resolvable`, async () => { + let queueName = getUniqueName("queue"); + await dns.promises.lookup(productionStyleHostNameForSecondary).then( + async (lookupAddress) => { + const baseURLProductionStyle = `http://${productionStyleHostNameForSecondary}:${port}`; + const serviceClientProductionStyle = new QueueServiceClient( + baseURLProductionStyle, + newPipeline( + new StorageSharedKeyCredential( + EMULATOR_ACCOUNT_NAME, + EMULATOR_ACCOUNT_KEY + ), + { + retryOptions: { maxTries: 1 }, + // Make sure socket is closed once the operation is done. + keepAliveOptions: { enable: false } + } + ) + ); + const queueProductionStyle = serviceClientProductionStyle.getQueueClient( + queueName + ); + + const response = await queueProductionStyle.create(); + assert.deepStrictEqual(response._response.status, 201); + await queueProductionStyle.delete(); + }, + () => { + // Cannot perform this test. We need devstoreaccount1-secondary.blob.localhost to resolve to 127.0.0.1. + // On Linux, this should just work, + // On Windows, we can't spoof DNS record for specific process. + // So we have options of running our own DNS server (overkill), + // or editing hosts files (machine global operation; and requires running as admin). + // So skip the test case. + assert.ok( + `Skipping test case - it needs ${productionStyleHostNameForSecondary} to be resolvable` + ); + } + ); + }); + + it(`Should work with non-production secondary url when ${baseSecondaryURL} is resolvable`, async () => { + const secondaryServiceClient = new QueueServiceClient( + baseSecondaryURL, + newPipeline( + new StorageSharedKeyCredential( + EMULATOR_ACCOUNT_NAME, + EMULATOR_ACCOUNT_KEY + ), + { + retryOptions: { maxTries: 1 }, + // Make sure socket is closed once the operation is done. + keepAliveOptions: { enable: false } + } + ) + ); + let queueName = getUniqueName("queue"); + const queueClientSecondary = secondaryServiceClient.getQueueClient(queueName); + const response = await queueClientSecondary.create(); + assert.deepStrictEqual(response._response.status, 201); + await queueClientSecondary.delete(); + }); }); diff --git a/tests/table/apis/table.validation.rest.test.ts b/tests/table/apis/table.validation.rest.test.ts index 83117beb8..a48bd2d1a 100644 --- a/tests/table/apis/table.validation.rest.test.ts +++ b/tests/table/apis/table.validation.rest.test.ts @@ -3,17 +3,19 @@ // using the SDKs, can be used as a test rig for repros which provide a debug log. // later we can automate the parsing of repro logs to automatically play these into the tester // special care is needed to replace etags and folders when used - import * as assert from "assert"; import { configLogger } from "../../../src/common/Logger"; import TableConfiguration from "../../../src/table/TableConfiguration"; import TableServer from "../../../src/table/TableServer"; -import { getUniqueName } from "../../testutils"; +import { getUniqueName } from "../../testutils"; import { deleteToAzurite, getToAzurite, - postToAzurite + postToAzurite, + postToAzuriteProductionUrl, + getToAzuriteProductionUrl } from "../utils/table.entity.tests.rest.submitter"; +import dns = require("dns"); // Set true to enable debug log configLogger(false); @@ -31,10 +33,10 @@ describe("table name validation tests", () => { enableDebugLog, false, undefined, - debugLogPath, - false, - true + debugLogPath ); + const productionStyleHostName = "devstoreaccount1.table.localhost"; // Use hosts file to make this resolve + const productionStyleHostNameForSecondary = "devstoreaccount1-secondary.table.localhost"; let server: TableServer; @@ -398,4 +400,71 @@ describe("table name validation tests", () => { ); } }); + + + it(`Should work with production style URL when ${productionStyleHostName} is resolvable`, async () => { + await dns.promises.lookup(productionStyleHostName).then( + async (lookupAddress) => { + let tableName = getUniqueName("table"); + const body = JSON.stringify({ + TableName: tableName + }); + const createTableHeaders = { + "Content-Type": "application/json", + Accept: "application/json;odata=nometadata" + }; + try { + let response = await postToAzuriteProductionUrl(productionStyleHostName,"Tables", body, createTableHeaders); + assert.strictEqual(response.status, 201); + } catch (err: any) { + assert.fail(); + } + }, + () => { + // Cannot perform this test. We need devstoreaccount1-secondary.blob.localhost to resolve to 127.0.0.1. + // On Linux, this should just work, + // On Windows, we can't spoof DNS record for specific process. + // So we have options of running our own DNS server (overkill), + // or editing hosts files (machine global operation; and requires running as admin). + // So skip the test case. + assert.ok( + `Skipping test case - it needs ${productionStyleHostName} to be resolvable` + ); + } + ); + }); + + it(`Should work with production style URL when ${productionStyleHostNameForSecondary} is resolvable`, async () => { + await dns.promises.lookup(productionStyleHostNameForSecondary).then( + async (lookupAddress) => { + let tableName = getUniqueName("table"); + const body = JSON.stringify({ + TableName: tableName + }); + const createTableHeaders = { + "Content-Type": "application/json", + Accept: "application/json;odata=nometadata" + }; + try { + let response = await postToAzuriteProductionUrl(productionStyleHostName,"Tables", body, createTableHeaders); + assert.strictEqual(response.status, 201); + let tablesList = await getToAzuriteProductionUrl(productionStyleHostNameForSecondary,"Tables", createTableHeaders); + assert.strictEqual(tablesList.status, 200); + } catch (err: any) { + assert.fail(); + } + }, + () => { + // Cannot perform this test. We need devstoreaccount1-secondary.blob.localhost to resolve to 127.0.0.1. + // On Linux, this should just work, + // On Windows, we can't spoof DNS record for specific process. + // So we have options of running our own DNS server (overkill), + // or editing hosts files (machine global operation; and requires running as admin). + // So skip the test case. + assert.ok( + `Skipping test case - it needs ${productionStyleHostNameForSecondary} to be resolvable` + ); + } + ); + }); }); diff --git a/tests/table/utils/table.entity.tests.rest.submitter.ts b/tests/table/utils/table.entity.tests.rest.submitter.ts index 63e4d6bce..fadbb63fc 100644 --- a/tests/table/utils/table.entity.tests.rest.submitter.ts +++ b/tests/table/utils/table.entity.tests.rest.submitter.ts @@ -36,6 +36,32 @@ export async function postToAzurite( return result; } +/** + * Submits POST request to Azurite table service on the path given + * This could be modified to accept the entire URL, rather than just path + * ToDo: Need to consider cases with query strings etc. + * + * @export + * @param {string} hostName + * @param {string} path + * @param {string} body + * @param {*} headers + * @return {Promise} + */ +export async function postToAzuriteProductionUrl( + hostName: string, + path: string, + body: string, + headers: any +): Promise> { + const url = `${TableEntityTestConfig.protocol}://${ + hostName + }:${TableEntityTestConfig.port}/${path}/?${generateSas()}`; + const requestConfig = axiosRequestConfig(url, path, headers, true); + const result = await axios.post(url, body, requestConfig); + return result; +} + /** * Submits GET request to Azurite table service on the path given * @@ -58,6 +84,30 @@ export async function getToAzurite( return result; } +/** + * Submits GET request to Azurite table service on the path given + * + * @export + * @param {string} hostName + * @param {string} path + * @param {*} headers + * @return {Promise} + */ +export async function getToAzuriteProductionUrl( + hostName: string, + path: string, + headers: any, + queryString?: string +): Promise> { + if (undefined === queryString) { + queryString = ""; + } + const url = `${TableEntityTestConfig.protocol}://${hostName}:${TableEntityTestConfig.port}/${path}${queryString}`; + const requestConfig = axiosRequestConfig(url, path, headers, true); + const result = await axios.get(url, requestConfig); + return result; +} + /** * Generates the account SAS signature to allow raw REST to connect to storage * without using an SDK connection. diff --git a/tests/table/utils/table.entity.tests.utils.for.rest.ts b/tests/table/utils/table.entity.tests.utils.for.rest.ts index 57c37144e..21fd03aea 100644 --- a/tests/table/utils/table.entity.tests.utils.for.rest.ts +++ b/tests/table/utils/table.entity.tests.utils.for.rest.ts @@ -15,14 +15,16 @@ const key1 = Buffer.from(TableEntityTestConfig.sharedKey, "base64"); * @param {string} url * @param {string} path * @param {*} headers + * @param {boolean} productionStyle * @return {*} axios request options */ export function axiosRequestConfig( url: string, path: string, - headersIn: any + headersIn: any, + productionStyle: boolean = false ): any { - const stringToSign = createStringToSignForSharedKeyLite(url, path, headersIn); + const stringToSign = createStringToSignForSharedKeyLite(url, path, headersIn, productionStyle); const signature1 = computeHMACSHA256(stringToSign, key1); const authValue = `SharedKeyLite ${TableEntityTestConfig.accountName}:${signature1}`; const headers = Object.assign(headersIn, { Authorization: authValue }); @@ -39,12 +41,14 @@ export function axiosRequestConfig( * @param {string} url * @param {string} path * @param {any} headers + * @param {boolean} productionStyle * @returns {string} */ export function createStringToSignForSharedKeyLite( url: string, path: string, - headers: any + headers: any, + productionStyle: boolean ): string { const stringToSign: string = [ @@ -55,7 +59,7 @@ export function createStringToSignForSharedKeyLite( getCanonicalizedResourceString( url, TableEntityTestConfig.accountName, - `/${TableEntityTestConfig.accountName}/${path.replace(/'/g, "%27")}` + productionStyle ? `/${path.replace(/'/g, "%27")}`: `/${TableEntityTestConfig.accountName}/${path.replace(/'/g, "%27")}` ); return stringToSign; @@ -103,12 +107,11 @@ export function getCanonicalizedResourceString( // For secondary account, we use account name (without "-secondary") for the path if (authenticationPath !== undefined) { - path = authenticationPath; + path = getPath(authenticationPath); } let canonicalizedResourceString: string = ""; canonicalizedResourceString += `/${account}${path}`; - const queries = getURLQueries(url); const lowercaseQueries: { [key: string]: string } = {}; if (queries) { @@ -143,5 +146,8 @@ export function getCanonicalizedResourceString( * @returns {string} */ function getPath(url: string): string { + if (url.indexOf("-secondary") !== -1){ + return url.replace('-secondary', ''); + } return url; } From 347acb204fcd1eaab08e66d1b1e7e12d372da0a0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 20 Oct 2023 10:00:04 +0800 Subject: [PATCH 234/297] Bump @types/bluebird from 3.5.40 to 3.5.41 (#2244) Bumps [@types/bluebird](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/bluebird) from 3.5.40 to 3.5.41. - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/bluebird) --- updated-dependencies: - dependency-name: "@types/bluebird" dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index b36468706..09b328fb7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1336,9 +1336,9 @@ "dev": true }, "node_modules/@types/bluebird": { - "version": "3.5.40", - "resolved": "https://registry.npmjs.org/@types/bluebird/-/bluebird-3.5.40.tgz", - "integrity": "sha512-4dEtF/qcby/FdT6iChii+jFXzVVX0+5HYiDqHKBtHQ3ZV58x5uVJJYRG0N4QllIaj5a2+UDdf/nupae+/M6mdw==", + "version": "3.5.41", + "resolved": "https://registry.npmjs.org/@types/bluebird/-/bluebird-3.5.41.tgz", + "integrity": "sha512-/OT2UoYPu2fqGNS85UYUx0Ke8Zd/vM0/Au0JqLInTprkRO0NexYe7qAUkDsjhsO3BKHI14wX/UhN5SUaoFVDUQ==", "dev": true }, "node_modules/@types/body-parser": { @@ -11308,9 +11308,9 @@ "dev": true }, "@types/bluebird": { - "version": "3.5.40", - "resolved": "https://registry.npmjs.org/@types/bluebird/-/bluebird-3.5.40.tgz", - "integrity": "sha512-4dEtF/qcby/FdT6iChii+jFXzVVX0+5HYiDqHKBtHQ3ZV58x5uVJJYRG0N4QllIaj5a2+UDdf/nupae+/M6mdw==", + "version": "3.5.41", + "resolved": "https://registry.npmjs.org/@types/bluebird/-/bluebird-3.5.41.tgz", + "integrity": "sha512-/OT2UoYPu2fqGNS85UYUx0Ke8Zd/vM0/Au0JqLInTprkRO0NexYe7qAUkDsjhsO3BKHI14wX/UhN5SUaoFVDUQ==", "dev": true }, "@types/body-parser": { From e9eeac5375d7064687c7a79bfda5141586ae3f1b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 20 Oct 2023 10:00:31 +0800 Subject: [PATCH 235/297] Bump @types/glob-to-regexp from 0.4.2 to 0.4.3 (#2240) Bumps [@types/glob-to-regexp](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/glob-to-regexp) from 0.4.2 to 0.4.3. - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/glob-to-regexp) --- updated-dependencies: - dependency-name: "@types/glob-to-regexp" dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 09b328fb7..f74049c0f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1419,9 +1419,9 @@ } }, "node_modules/@types/glob-to-regexp": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/@types/glob-to-regexp/-/glob-to-regexp-0.4.2.tgz", - "integrity": "sha512-R1bD5iI4pBxB/83fjguzV4ab/eIGtMpD7T21tvcPosiAr6fAlHG4DAeOqzNxnVHiuJOf/lqeUN2jNTaVf3IdHQ==", + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@types/glob-to-regexp/-/glob-to-regexp-0.4.3.tgz", + "integrity": "sha512-/n3n1XCjkBcFA4gWflBOtMYBnDefmd8qCcUu9vBQWUmg1tKPU4jjn3cEHPAl0zVCQ8vVbuVUvcEF5uvU2+Iddw==", "dev": true }, "node_modules/@types/json-schema": { @@ -11391,9 +11391,9 @@ } }, "@types/glob-to-regexp": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/@types/glob-to-regexp/-/glob-to-regexp-0.4.2.tgz", - "integrity": "sha512-R1bD5iI4pBxB/83fjguzV4ab/eIGtMpD7T21tvcPosiAr6fAlHG4DAeOqzNxnVHiuJOf/lqeUN2jNTaVf3IdHQ==", + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@types/glob-to-regexp/-/glob-to-regexp-0.4.3.tgz", + "integrity": "sha512-/n3n1XCjkBcFA4gWflBOtMYBnDefmd8qCcUu9vBQWUmg1tKPU4jjn3cEHPAl0zVCQ8vVbuVUvcEF5uvU2+Iddw==", "dev": true }, "@types/json-schema": { From 8df914b6db0c1059d2c128a7c21503e8154b414c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 20 Oct 2023 10:06:07 +0800 Subject: [PATCH 236/297] Bump @types/vscode from 1.83.0 to 1.83.1 (#2243) Bumps [@types/vscode](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/vscode) from 1.83.0 to 1.83.1. - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/vscode) --- updated-dependencies: - dependency-name: "@types/vscode" dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index f74049c0f..bb907e679 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1578,9 +1578,9 @@ "integrity": "sha512-jxjhh33aTYDHnrV1vZ3AvWQHfrGx2f5UxKjaP13l5q04fG+/hCKKm0MfodIoCqxevhbcfBb6ZjynyHuQ/jueGQ==" }, "node_modules/@types/vscode": { - "version": "1.83.0", - "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.83.0.tgz", - "integrity": "sha512-3mUtHqLAVz9hegut9au4xehuBrzRE3UJiQMpoEHkNl6XHliihO7eATx2BMHs0odsmmrwjJrlixx/Pte6M3ygDQ==", + "version": "1.83.1", + "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.83.1.tgz", + "integrity": "sha512-BHu51NaNKOtDf3BOonY3sKFFmZKEpRkzqkZVpSYxowLbs5JqjOQemYFob7Gs5rpxE5tiGhfpnMpcdF/oKrLg4w==", "dev": true }, "node_modules/@types/xml2js": { @@ -11550,9 +11550,9 @@ "integrity": "sha512-jxjhh33aTYDHnrV1vZ3AvWQHfrGx2f5UxKjaP13l5q04fG+/hCKKm0MfodIoCqxevhbcfBb6ZjynyHuQ/jueGQ==" }, "@types/vscode": { - "version": "1.83.0", - "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.83.0.tgz", - "integrity": "sha512-3mUtHqLAVz9hegut9au4xehuBrzRE3UJiQMpoEHkNl6XHliihO7eATx2BMHs0odsmmrwjJrlixx/Pte6M3ygDQ==", + "version": "1.83.1", + "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.83.1.tgz", + "integrity": "sha512-BHu51NaNKOtDf3BOonY3sKFFmZKEpRkzqkZVpSYxowLbs5JqjOQemYFob7Gs5rpxE5tiGhfpnMpcdF/oKrLg4w==", "dev": true }, "@types/xml2js": { From 9fda3884bb06a54c768607bc7acb9b2fa5cd5f25 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 20 Oct 2023 10:06:16 +0800 Subject: [PATCH 237/297] Bump @types/uri-templates from 0.1.32 to 0.1.33 (#2241) Bumps [@types/uri-templates](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/uri-templates) from 0.1.32 to 0.1.33. - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/uri-templates) --- updated-dependencies: - dependency-name: "@types/uri-templates" dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index bb907e679..2e2703720 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1558,9 +1558,9 @@ } }, "node_modules/@types/uri-templates": { - "version": "0.1.32", - "resolved": "https://registry.npmjs.org/@types/uri-templates/-/uri-templates-0.1.32.tgz", - "integrity": "sha512-PNRZF4z8uj81BBq8PumesGQVVZw0vjb1HFW9wll+UcHOPxWcop/8TwlvGzeIivmTdpxmpV2kXfRYCNWTHkIy+g==", + "version": "0.1.33", + "resolved": "https://registry.npmjs.org/@types/uri-templates/-/uri-templates-0.1.33.tgz", + "integrity": "sha512-dW2hVS0wZQ+ATyoRawggFPyFcfi+Wd14sFOdz3vp6VuV/ZYXT/VU3pB3OswTkZmIVi1yxbh3CNOwfrvVSP5q0w==", "dev": true }, "node_modules/@types/uuid": { @@ -11530,9 +11530,9 @@ } }, "@types/uri-templates": { - "version": "0.1.32", - "resolved": "https://registry.npmjs.org/@types/uri-templates/-/uri-templates-0.1.32.tgz", - "integrity": "sha512-PNRZF4z8uj81BBq8PumesGQVVZw0vjb1HFW9wll+UcHOPxWcop/8TwlvGzeIivmTdpxmpV2kXfRYCNWTHkIy+g==", + "version": "0.1.33", + "resolved": "https://registry.npmjs.org/@types/uri-templates/-/uri-templates-0.1.33.tgz", + "integrity": "sha512-dW2hVS0wZQ+ATyoRawggFPyFcfi+Wd14sFOdz3vp6VuV/ZYXT/VU3pB3OswTkZmIVi1yxbh3CNOwfrvVSP5q0w==", "dev": true }, "@types/uuid": { From 76f249a52f68e72380f452d7d9532a774a7d1cac Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 23 Oct 2023 10:09:39 +0800 Subject: [PATCH 238/297] Bump lint-staged from 15.0.1 to 15.0.2 (#2248) Bumps [lint-staged](https://github.com/okonet/lint-staged) from 15.0.1 to 15.0.2. - [Release notes](https://github.com/okonet/lint-staged/releases) - [Changelog](https://github.com/lint-staged/lint-staged/blob/master/CHANGELOG.md) - [Commits](https://github.com/okonet/lint-staged/compare/v15.0.1...v15.0.2) --- updated-dependencies: - dependency-name: lint-staged dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 44 ++++++++++++++++++++++---------------------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/package-lock.json b/package-lock.json index 2e2703720..20759b36c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6703,9 +6703,9 @@ } }, "node_modules/lint-staged": { - "version": "15.0.1", - "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-15.0.1.tgz", - "integrity": "sha512-2IU5OWmCaxch0X0+IBF4/v7sutpB+F3qoXbro43pYjQTOo5wumckjxoxn47pQBqqBsCWrD5HnI2uG/zJA7isew==", + "version": "15.0.2", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-15.0.2.tgz", + "integrity": "sha512-vnEy7pFTHyVuDmCAIFKR5QDO8XLVlPFQQyujQ/STOxe40ICWqJ6knS2wSJ/ffX/Lw0rz83luRDh+ET7toN+rOw==", "dev": true, "dependencies": { "chalk": "5.3.0", @@ -6713,11 +6713,11 @@ "debug": "4.3.4", "execa": "8.0.1", "lilconfig": "2.1.0", - "listr2": "7.0.1", + "listr2": "7.0.2", "micromatch": "4.0.5", "pidtree": "0.6.0", "string-argv": "0.3.2", - "yaml": "2.3.2" + "yaml": "2.3.3" }, "bin": { "lint-staged": "bin/lint-staged.js" @@ -6823,9 +6823,9 @@ } }, "node_modules/listr2": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/listr2/-/listr2-7.0.1.tgz", - "integrity": "sha512-nz+7hwgbDp8eWNoDgzdl4hA/xDSLrNRzPu1TLgOYs6l5Y+Ma6zVWWy9Oyt9TQFONwKoSPoka3H50D3vD5EuNwg==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-7.0.2.tgz", + "integrity": "sha512-rJysbR9GKIalhTbVL2tYbF2hVyDnrf7pFUZBwjPaMIdadYHmeT+EVi/Bu3qd7ETQPahTotg2WRCatXwRBW554g==", "dev": true, "dependencies": { "cli-truncate": "^3.1.0", @@ -10275,9 +10275,9 @@ "dev": true }, "node_modules/yaml": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.2.tgz", - "integrity": "sha512-N/lyzTPaJasoDmfV7YTrYCI0G/3ivm/9wdG0aHuheKowWQwGTsK0Eoiw6utmzAnI6pkJa0DUVygvp3spqqEKXg==", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.3.tgz", + "integrity": "sha512-zw0VAJxgeZ6+++/su5AFoqBbZbrEakwu+X0M5HmcwUiBL7AzcuPKjj5we4xfQLp78LkEMpD0cOnUhmgOVy3KdQ==", "dev": true, "engines": { "node": ">= 14" @@ -15494,9 +15494,9 @@ } }, "lint-staged": { - "version": "15.0.1", - "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-15.0.1.tgz", - "integrity": "sha512-2IU5OWmCaxch0X0+IBF4/v7sutpB+F3qoXbro43pYjQTOo5wumckjxoxn47pQBqqBsCWrD5HnI2uG/zJA7isew==", + "version": "15.0.2", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-15.0.2.tgz", + "integrity": "sha512-vnEy7pFTHyVuDmCAIFKR5QDO8XLVlPFQQyujQ/STOxe40ICWqJ6knS2wSJ/ffX/Lw0rz83luRDh+ET7toN+rOw==", "dev": true, "requires": { "chalk": "5.3.0", @@ -15504,11 +15504,11 @@ "debug": "4.3.4", "execa": "8.0.1", "lilconfig": "2.1.0", - "listr2": "7.0.1", + "listr2": "7.0.2", "micromatch": "4.0.5", "pidtree": "0.6.0", "string-argv": "0.3.2", - "yaml": "2.3.2" + "yaml": "2.3.3" }, "dependencies": { "braces": { @@ -15578,9 +15578,9 @@ } }, "listr2": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/listr2/-/listr2-7.0.1.tgz", - "integrity": "sha512-nz+7hwgbDp8eWNoDgzdl4hA/xDSLrNRzPu1TLgOYs6l5Y+Ma6zVWWy9Oyt9TQFONwKoSPoka3H50D3vD5EuNwg==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-7.0.2.tgz", + "integrity": "sha512-rJysbR9GKIalhTbVL2tYbF2hVyDnrf7pFUZBwjPaMIdadYHmeT+EVi/Bu3qd7ETQPahTotg2WRCatXwRBW554g==", "dev": true, "requires": { "cli-truncate": "^3.1.0", @@ -18139,9 +18139,9 @@ "dev": true }, "yaml": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.2.tgz", - "integrity": "sha512-N/lyzTPaJasoDmfV7YTrYCI0G/3ivm/9wdG0aHuheKowWQwGTsK0Eoiw6utmzAnI6pkJa0DUVygvp3spqqEKXg==", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.3.tgz", + "integrity": "sha512-zw0VAJxgeZ6+++/su5AFoqBbZbrEakwu+X0M5HmcwUiBL7AzcuPKjj5we4xfQLp78LkEMpD0cOnUhmgOVy3KdQ==", "dev": true }, "yauzl": { From 511f645ad60dedd9604cd0686bd578182dabf8ce Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 23 Oct 2023 10:13:10 +0800 Subject: [PATCH 239/297] Bump @types/validator from 13.11.3 to 13.11.5 (#2246) Bumps [@types/validator](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/validator) from 13.11.3 to 13.11.5. - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/validator) --- updated-dependencies: - dependency-name: "@types/validator" dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 20759b36c..07ad10b07 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1573,9 +1573,9 @@ } }, "node_modules/@types/validator": { - "version": "13.11.3", - "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.11.3.tgz", - "integrity": "sha512-jxjhh33aTYDHnrV1vZ3AvWQHfrGx2f5UxKjaP13l5q04fG+/hCKKm0MfodIoCqxevhbcfBb6ZjynyHuQ/jueGQ==" + "version": "13.11.5", + "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.11.5.tgz", + "integrity": "sha512-xW4qsT4UIYILu+7ZrBnfQdBYniZrMLYYK3wN9M/NdeIHgBN5pZI2/8Q7UfdWIcr5RLJv/OGENsx91JIpUUoC7Q==" }, "node_modules/@types/vscode": { "version": "1.83.1", @@ -11545,9 +11545,9 @@ } }, "@types/validator": { - "version": "13.11.3", - "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.11.3.tgz", - "integrity": "sha512-jxjhh33aTYDHnrV1vZ3AvWQHfrGx2f5UxKjaP13l5q04fG+/hCKKm0MfodIoCqxevhbcfBb6ZjynyHuQ/jueGQ==" + "version": "13.11.5", + "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.11.5.tgz", + "integrity": "sha512-xW4qsT4UIYILu+7ZrBnfQdBYniZrMLYYK3wN9M/NdeIHgBN5pZI2/8Q7UfdWIcr5RLJv/OGENsx91JIpUUoC7Q==" }, "@types/vscode": { "version": "1.83.1", From 8a24fd898bd7e8ed878b31a376849b28c12f4119 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 23 Oct 2023 10:28:31 +0800 Subject: [PATCH 240/297] Bump @types/lokijs from 1.5.10 to 1.5.11 (#2247) Bumps [@types/lokijs](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/lokijs) from 1.5.10 to 1.5.11. - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/lokijs) --- updated-dependencies: - dependency-name: "@types/lokijs" dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 07ad10b07..3ac95625c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1449,9 +1449,9 @@ } }, "node_modules/@types/lokijs": { - "version": "1.5.10", - "resolved": "https://registry.npmjs.org/@types/lokijs/-/lokijs-1.5.10.tgz", - "integrity": "sha512-Q/F6OUCZPHWY4hzEowhCswi9Tafc/E7DCUyyWIOH3+hM3K96Mkj2U3byfzs7Yd542I8gT/8oUALnoddqdA20xg==", + "version": "1.5.11", + "resolved": "https://registry.npmjs.org/@types/lokijs/-/lokijs-1.5.11.tgz", + "integrity": "sha512-CRBWx6GTJVYPwkP/VSybiYIu/p67nAMgc2eIV3ZHxmYpFK3PYU6rhk37AaTgRAvNgpZlGWi4ecvTr8+0n2iZgg==", "dev": true }, "node_modules/@types/mime": { @@ -11421,9 +11421,9 @@ } }, "@types/lokijs": { - "version": "1.5.10", - "resolved": "https://registry.npmjs.org/@types/lokijs/-/lokijs-1.5.10.tgz", - "integrity": "sha512-Q/F6OUCZPHWY4hzEowhCswi9Tafc/E7DCUyyWIOH3+hM3K96Mkj2U3byfzs7Yd542I8gT/8oUALnoddqdA20xg==", + "version": "1.5.11", + "resolved": "https://registry.npmjs.org/@types/lokijs/-/lokijs-1.5.11.tgz", + "integrity": "sha512-CRBWx6GTJVYPwkP/VSybiYIu/p67nAMgc2eIV3ZHxmYpFK3PYU6rhk37AaTgRAvNgpZlGWi4ecvTr8+0n2iZgg==", "dev": true }, "@types/mime": { From 59c5cf83fc5f50a93c06fb55a7b0960edfa41fe7 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 24 Oct 2023 15:41:06 +0800 Subject: [PATCH 241/297] Bump @types/fs-extra from 11.0.2 to 11.0.3 (#2257) Bumps [@types/fs-extra](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/fs-extra) from 11.0.2 to 11.0.3. - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/fs-extra) --- updated-dependencies: - dependency-name: "@types/fs-extra" dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 3ac95625c..fffb7404c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1399,9 +1399,9 @@ } }, "node_modules/@types/fs-extra": { - "version": "11.0.2", - "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-11.0.2.tgz", - "integrity": "sha512-c0hrgAOVYr21EX8J0jBMXGLMgJqVf/v6yxi0dLaJboW9aQPh16Id+z6w2Tx1hm+piJOLv8xPfVKZCLfjPw/IMQ==", + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-11.0.3.tgz", + "integrity": "sha512-sF59BlXtUdzEAL1u0MSvuzWd7PdZvZEtnaVkzX5mjpdWTJ8brG0jUqve3jPCzSzvAKKMHTG8F8o/WMQLtleZdQ==", "dev": true, "dependencies": { "@types/jsonfile": "*", @@ -11371,9 +11371,9 @@ } }, "@types/fs-extra": { - "version": "11.0.2", - "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-11.0.2.tgz", - "integrity": "sha512-c0hrgAOVYr21EX8J0jBMXGLMgJqVf/v6yxi0dLaJboW9aQPh16Id+z6w2Tx1hm+piJOLv8xPfVKZCLfjPw/IMQ==", + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-11.0.3.tgz", + "integrity": "sha512-sF59BlXtUdzEAL1u0MSvuzWd7PdZvZEtnaVkzX5mjpdWTJ8brG0jUqve3jPCzSzvAKKMHTG8F8o/WMQLtleZdQ==", "dev": true, "requires": { "@types/jsonfile": "*", From f0dd047864c9962d01810a1d4e1c28c6d56f0885 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 24 Oct 2023 15:41:21 +0800 Subject: [PATCH 242/297] Bump @types/async from 3.2.21 to 3.2.22 (#2255) Bumps [@types/async](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/async) from 3.2.21 to 3.2.22. - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/async) --- updated-dependencies: - dependency-name: "@types/async" dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index fffb7404c..5b43cbb3b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1330,9 +1330,9 @@ "dev": true }, "node_modules/@types/async": { - "version": "3.2.21", - "resolved": "https://registry.npmjs.org/@types/async/-/async-3.2.21.tgz", - "integrity": "sha512-msYM0OYxzkwpiDJZZDo7XsYuFIpiAOh+o3hygudSpSzeW+R0DAEKZvdQriHYT95m9CvscLDg5s0Mxlrlhoy2qw==", + "version": "3.2.22", + "resolved": "https://registry.npmjs.org/@types/async/-/async-3.2.22.tgz", + "integrity": "sha512-aYsrMkRWXwJfchKtwubTIgvWcgRU8zFT+lL48l9jSu7RJKa3A+E3qwmAJVYap4Do9QzTCLm6p63JmOuII3j7dg==", "dev": true }, "node_modules/@types/bluebird": { @@ -11302,9 +11302,9 @@ "dev": true }, "@types/async": { - "version": "3.2.21", - "resolved": "https://registry.npmjs.org/@types/async/-/async-3.2.21.tgz", - "integrity": "sha512-msYM0OYxzkwpiDJZZDo7XsYuFIpiAOh+o3hygudSpSzeW+R0DAEKZvdQriHYT95m9CvscLDg5s0Mxlrlhoy2qw==", + "version": "3.2.22", + "resolved": "https://registry.npmjs.org/@types/async/-/async-3.2.22.tgz", + "integrity": "sha512-aYsrMkRWXwJfchKtwubTIgvWcgRU8zFT+lL48l9jSu7RJKa3A+E3qwmAJVYap4Do9QzTCLm6p63JmOuII3j7dg==", "dev": true }, "@types/bluebird": { From ef4ea8eb5f7130ceb3ea46aa1966e54a19194daa Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 24 Oct 2023 15:41:33 +0800 Subject: [PATCH 243/297] Bump @types/jsonwebtoken from 9.0.3 to 9.0.4 (#2253) Bumps [@types/jsonwebtoken](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/jsonwebtoken) from 9.0.3 to 9.0.4. - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/jsonwebtoken) --- updated-dependencies: - dependency-name: "@types/jsonwebtoken" dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 5b43cbb3b..f55604c87 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1440,9 +1440,9 @@ } }, "node_modules/@types/jsonwebtoken": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-9.0.3.tgz", - "integrity": "sha512-b0jGiOgHtZ2jqdPgPnP6WLCXZk1T8p06A/vPGzUvxpFGgKMbjXJDjC5m52ErqBnIuWZFgGoIJyRdeG5AyreJjA==", + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-9.0.4.tgz", + "integrity": "sha512-8UYapdmR0QlxgvJmyE8lP7guxD0UGVMfknsdtCFZh4ovShdBl3iOI4zdvqBHrB/IS+xUj3PSx73Qkey1fhWz+g==", "dev": true, "dependencies": { "@types/node": "*" @@ -11412,9 +11412,9 @@ } }, "@types/jsonwebtoken": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-9.0.3.tgz", - "integrity": "sha512-b0jGiOgHtZ2jqdPgPnP6WLCXZk1T8p06A/vPGzUvxpFGgKMbjXJDjC5m52ErqBnIuWZFgGoIJyRdeG5AyreJjA==", + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-9.0.4.tgz", + "integrity": "sha512-8UYapdmR0QlxgvJmyE8lP7guxD0UGVMfknsdtCFZh4ovShdBl3iOI4zdvqBHrB/IS+xUj3PSx73Qkey1fhWz+g==", "dev": true, "requires": { "@types/node": "*" From 39ff07bb1fc9d219d250c4cee7e6f3618dca332a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 24 Oct 2023 16:49:10 +0800 Subject: [PATCH 244/297] Bump tedious from 16.4.1 to 16.5.0 (#2256) Bumps [tedious](https://github.com/tediousjs/tedious) from 16.4.1 to 16.5.0. - [Release notes](https://github.com/tediousjs/tedious/releases) - [Commits](https://github.com/tediousjs/tedious/compare/v16.4.1...v16.5.0) --- updated-dependencies: - dependency-name: tedious dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index f55604c87..1b5ad74d8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9475,9 +9475,9 @@ } }, "node_modules/tedious": { - "version": "16.4.1", - "resolved": "https://registry.npmjs.org/tedious/-/tedious-16.4.1.tgz", - "integrity": "sha512-WwRkGs7N5jFiHhD7uyLHnZ9rCmOfYytEHZhE/vyU56mxzFB3+xHd4WV+DssLwuc1piJqDI54vHDi6SRACOGu8g==", + "version": "16.5.0", + "resolved": "https://registry.npmjs.org/tedious/-/tedious-16.5.0.tgz", + "integrity": "sha512-UQdtX+4A1K0+UtFZictpSUMzw90ua0vSBfDQ54yKpwZ9Fr/6ik0Vs5q7E0AuwHtZtg3g2PqPDEKguSdysho8vw==", "dependencies": { "@azure/identity": "^2.0.4", "@azure/keyvault-keys": "^4.4.0", @@ -17527,9 +17527,9 @@ } }, "tedious": { - "version": "16.4.1", - "resolved": "https://registry.npmjs.org/tedious/-/tedious-16.4.1.tgz", - "integrity": "sha512-WwRkGs7N5jFiHhD7uyLHnZ9rCmOfYytEHZhE/vyU56mxzFB3+xHd4WV+DssLwuc1piJqDI54vHDi6SRACOGu8g==", + "version": "16.5.0", + "resolved": "https://registry.npmjs.org/tedious/-/tedious-16.5.0.tgz", + "integrity": "sha512-UQdtX+4A1K0+UtFZictpSUMzw90ua0vSBfDQ54yKpwZ9Fr/6ik0Vs5q7E0AuwHtZtg3g2PqPDEKguSdysho8vw==", "requires": { "@azure/identity": "^2.0.4", "@azure/keyvault-keys": "^4.4.0", From 6dc686e3c4be4a3f80ff810fe5c2b55e3115b418 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 25 Oct 2023 10:13:19 +0800 Subject: [PATCH 245/297] Bump @azure/core-rest-pipeline from 1.12.1 to 1.12.2 (#2261) Bumps [@azure/core-rest-pipeline](https://github.com/Azure/azure-sdk-for-js) from 1.12.1 to 1.12.2. - [Release notes](https://github.com/Azure/azure-sdk-for-js/releases) - [Changelog](https://github.com/Azure/azure-sdk-for-js/blob/main/documentation/Changelog-for-next-generation.md) - [Commits](https://github.com/Azure/azure-sdk-for-js/compare/@azure/core-rest-pipeline_1.12.1...@azure/core-rest-pipeline_1.12.2) --- updated-dependencies: - dependency-name: "@azure/core-rest-pipeline" dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/package-lock.json b/package-lock.json index 1b5ad74d8..bd54724ed 100644 --- a/package-lock.json +++ b/package-lock.json @@ -239,9 +239,9 @@ } }, "node_modules/@azure/core-rest-pipeline": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@azure/core-rest-pipeline/-/core-rest-pipeline-1.12.1.tgz", - "integrity": "sha512-SsyWQ+T5MFQRX+M8H/66AlaI6HyCbQStGfFngx2fuiW+vKI2DkhtOvbYodPyf9fOe/ARLWWc3ohX54lQ5Kmaog==", + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@azure/core-rest-pipeline/-/core-rest-pipeline-1.12.2.tgz", + "integrity": "sha512-wLLJQdL4v1yoqYtEtjKNjf8pJ/G/BqVomAWxcKOR1KbZJyCEnCv04yks7Y1NhJ3JzxbDs307W67uX0JzklFdCg==", "dependencies": { "@azure/abort-controller": "^1.0.0", "@azure/core-auth": "^1.4.0", @@ -254,7 +254,7 @@ "tslib": "^2.2.0" }, "engines": { - "node": ">=14.0.0" + "node": ">=16.0.0" } }, "node_modules/@azure/core-rest-pipeline/node_modules/@azure/core-tracing": { @@ -10453,9 +10453,9 @@ } }, "@azure/core-rest-pipeline": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@azure/core-rest-pipeline/-/core-rest-pipeline-1.12.1.tgz", - "integrity": "sha512-SsyWQ+T5MFQRX+M8H/66AlaI6HyCbQStGfFngx2fuiW+vKI2DkhtOvbYodPyf9fOe/ARLWWc3ohX54lQ5Kmaog==", + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@azure/core-rest-pipeline/-/core-rest-pipeline-1.12.2.tgz", + "integrity": "sha512-wLLJQdL4v1yoqYtEtjKNjf8pJ/G/BqVomAWxcKOR1KbZJyCEnCv04yks7Y1NhJ3JzxbDs307W67uX0JzklFdCg==", "requires": { "@azure/abort-controller": "^1.0.0", "@azure/core-auth": "^1.4.0", From cbe6d6dcb6996b3e04986b57aa0dd6d3ef2cf017 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 25 Oct 2023 10:14:01 +0800 Subject: [PATCH 246/297] Bump @types/morgan from 1.9.6 to 1.9.7 (#2259) Bumps [@types/morgan](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/morgan) from 1.9.6 to 1.9.7. - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/morgan) --- updated-dependencies: - dependency-name: "@types/morgan" dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index bd54724ed..518fe5ffe 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1473,9 +1473,9 @@ "dev": true }, "node_modules/@types/morgan": { - "version": "1.9.6", - "resolved": "https://registry.npmjs.org/@types/morgan/-/morgan-1.9.6.tgz", - "integrity": "sha512-xfKogz5WcKww2DAiVT9zxMgrqQt+Shq8tDVeLT+otoj6dJnkRkyJxMF51mHtUc3JCPKGk5x1EBU0buuGpfftlQ==", + "version": "1.9.7", + "resolved": "https://registry.npmjs.org/@types/morgan/-/morgan-1.9.7.tgz", + "integrity": "sha512-4sJFBUBrIZkP5EvMm1L6VCXp3SQe8dnXqlVpe1jsmTjS1JQVmSjnpMNs8DosQd6omBi/K7BSKJ6z/Mc3ki0K9g==", "dev": true, "dependencies": { "@types/node": "*" @@ -11445,9 +11445,9 @@ "dev": true }, "@types/morgan": { - "version": "1.9.6", - "resolved": "https://registry.npmjs.org/@types/morgan/-/morgan-1.9.6.tgz", - "integrity": "sha512-xfKogz5WcKww2DAiVT9zxMgrqQt+Shq8tDVeLT+otoj6dJnkRkyJxMF51mHtUc3JCPKGk5x1EBU0buuGpfftlQ==", + "version": "1.9.7", + "resolved": "https://registry.npmjs.org/@types/morgan/-/morgan-1.9.7.tgz", + "integrity": "sha512-4sJFBUBrIZkP5EvMm1L6VCXp3SQe8dnXqlVpe1jsmTjS1JQVmSjnpMNs8DosQd6omBi/K7BSKJ6z/Mc3ki0K9g==", "dev": true, "requires": { "@types/node": "*" From 30b9d04073302c1e0e7289e16293633811332f87 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 25 Oct 2023 10:23:32 +0800 Subject: [PATCH 247/297] Bump eslint from 8.51.0 to 8.52.0 (#2260) Bumps [eslint](https://github.com/eslint/eslint) from 8.51.0 to 8.52.0. - [Release notes](https://github.com/eslint/eslint/releases) - [Changelog](https://github.com/eslint/eslint/blob/main/CHANGELOG.md) - [Commits](https://github.com/eslint/eslint/compare/v8.51.0...v8.52.0) --- updated-dependencies: - dependency-name: eslint dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 74 ++++++++++++++++++++++++++++------------------- 1 file changed, 44 insertions(+), 30 deletions(-) diff --git a/package-lock.json b/package-lock.json index 518fe5ffe..235d6b988 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1038,21 +1038,21 @@ } }, "node_modules/@eslint/js": { - "version": "8.51.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.51.0.tgz", - "integrity": "sha512-HxjQ8Qn+4SI3/AFv6sOrDB+g6PpUTDwSJiQqOrnneEk8L71161srI9gjzzZvYVbzHiVg/BvcH95+cK/zfIt4pg==", + "version": "8.52.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.52.0.tgz", + "integrity": "sha512-mjZVbpaeMZludF2fsWLD0Z9gCref1Tk4i9+wddjRvpUNqqcndPkBD09N/Mapey0b3jaXbLm2kICwFv2E64QinA==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, "node_modules/@humanwhocodes/config-array": { - "version": "0.11.11", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.11.tgz", - "integrity": "sha512-N2brEuAadi0CcdeMXUkhbZB84eskAc8MEX1By6qEchoVywSgXPIjou4rYsl0V3Hj0ZnuGycGCjdNgockbzeWNA==", + "version": "0.11.13", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.13.tgz", + "integrity": "sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==", "dev": true, "dependencies": { - "@humanwhocodes/object-schema": "^1.2.1", + "@humanwhocodes/object-schema": "^2.0.1", "debug": "^4.1.1", "minimatch": "^3.0.5" }, @@ -1109,9 +1109,9 @@ } }, "node_modules/@humanwhocodes/object-schema": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz", + "integrity": "sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==", "dev": true }, "node_modules/@jridgewell/gen-mapping": { @@ -1946,6 +1946,12 @@ "url": "https://opencollective.com/typescript-eslint" } }, + "node_modules/@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", + "dev": true + }, "node_modules/abort-controller": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", @@ -4328,18 +4334,19 @@ } }, "node_modules/eslint": { - "version": "8.51.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.51.0.tgz", - "integrity": "sha512-2WuxRZBrlwnXi+/vFSJyjMqrNjtJqiasMzehF0shoLaW7DzS3/9Yvrmq5JiT66+pNjiX4UBnLDiKHcWAr/OInA==", + "version": "8.52.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.52.0.tgz", + "integrity": "sha512-zh/JHnaixqHZsolRB/w9/02akBk9EPrOs9JwcTP2ek7yL5bVvXuRariiaAjjoJ5DvuwQ1WAE/HsMz+w17YgBCg==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", "@eslint/eslintrc": "^2.1.2", - "@eslint/js": "8.51.0", - "@humanwhocodes/config-array": "^0.11.11", + "@eslint/js": "8.52.0", + "@humanwhocodes/config-array": "^0.11.13", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", @@ -11083,18 +11090,18 @@ } }, "@eslint/js": { - "version": "8.51.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.51.0.tgz", - "integrity": "sha512-HxjQ8Qn+4SI3/AFv6sOrDB+g6PpUTDwSJiQqOrnneEk8L71161srI9gjzzZvYVbzHiVg/BvcH95+cK/zfIt4pg==", + "version": "8.52.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.52.0.tgz", + "integrity": "sha512-mjZVbpaeMZludF2fsWLD0Z9gCref1Tk4i9+wddjRvpUNqqcndPkBD09N/Mapey0b3jaXbLm2kICwFv2E64QinA==", "dev": true }, "@humanwhocodes/config-array": { - "version": "0.11.11", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.11.tgz", - "integrity": "sha512-N2brEuAadi0CcdeMXUkhbZB84eskAc8MEX1By6qEchoVywSgXPIjou4rYsl0V3Hj0ZnuGycGCjdNgockbzeWNA==", + "version": "0.11.13", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.13.tgz", + "integrity": "sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==", "dev": true, "requires": { - "@humanwhocodes/object-schema": "^1.2.1", + "@humanwhocodes/object-schema": "^2.0.1", "debug": "^4.1.1", "minimatch": "^3.0.5" }, @@ -11132,9 +11139,9 @@ "dev": true }, "@humanwhocodes/object-schema": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz", + "integrity": "sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==", "dev": true }, "@jridgewell/gen-mapping": { @@ -11772,6 +11779,12 @@ "eslint-visitor-keys": "^3.3.0" } }, + "@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", + "dev": true + }, "abort-controller": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", @@ -13760,18 +13773,19 @@ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" }, "eslint": { - "version": "8.51.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.51.0.tgz", - "integrity": "sha512-2WuxRZBrlwnXi+/vFSJyjMqrNjtJqiasMzehF0shoLaW7DzS3/9Yvrmq5JiT66+pNjiX4UBnLDiKHcWAr/OInA==", + "version": "8.52.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.52.0.tgz", + "integrity": "sha512-zh/JHnaixqHZsolRB/w9/02akBk9EPrOs9JwcTP2ek7yL5bVvXuRariiaAjjoJ5DvuwQ1WAE/HsMz+w17YgBCg==", "dev": true, "requires": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", "@eslint/eslintrc": "^2.1.2", - "@eslint/js": "8.51.0", - "@humanwhocodes/config-array": "^0.11.11", + "@eslint/js": "8.52.0", + "@humanwhocodes/config-array": "^0.11.13", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", From 1541854fc1437d0909d9368ea7604b527e9ef548 Mon Sep 17 00:00:00 2001 From: EmmaZhu-MSFT Date: Wed, 25 Oct 2023 10:29:55 +0800 Subject: [PATCH 248/297] Fix issue of blob batch operations failed on domain style endpoint (#2214) --- ChangeLog.md | 1 + src/blob/BlobRequestListenerFactory.ts | 8 +- src/blob/handlers/BlobBatchHandler.ts | 376 ++++++++++++------------- src/blob/handlers/ContainerHandler.ts | 13 +- src/blob/handlers/ServiceHandler.ts | 29 +- tests/blob/apis/blobbatch.test.ts | 40 +-- 6 files changed, 232 insertions(+), 235 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index bbb63fe16..ec049c173 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -13,6 +13,7 @@ Blob: - Fixed CommitBlockList API to return 400 (InvalidXmlDocument) when the request is sent with JSON body. (issue #1955) - Added "x-ms-is-hns-enabled" header in x-ms-is-hns-enabled API responds (issue #1810) - Fixed authentication error in production style URL for secondary location (issue #2208) +- Fixed issue of failures for blob batch requests in product style. Queue: diff --git a/src/blob/BlobRequestListenerFactory.ts b/src/blob/BlobRequestListenerFactory.ts index 97bd2036e..c3bd075a8 100644 --- a/src/blob/BlobRequestListenerFactory.ts +++ b/src/blob/BlobRequestListenerFactory.ts @@ -56,7 +56,7 @@ export default class BlobRequestListenerFactory private readonly skipApiVersionCheck?: boolean, private readonly oauth?: OAuthLevel, private readonly disableProductStyleUrl?: boolean - ) {} + ) { } public createRequestListener(): RequestListener { const app = express().disable("x-powered-by"); @@ -97,7 +97,8 @@ export default class BlobRequestListenerFactory this.metadataStore, this.extentStore, logger, - loose + loose, + this.disableProductStyleUrl ), pageBlobHandler: new PageBlobHandler( this.metadataStore, @@ -112,7 +113,8 @@ export default class BlobRequestListenerFactory this.metadataStore, this.extentStore, logger, - loose + loose, + this.disableProductStyleUrl ) }; diff --git a/src/blob/handlers/BlobBatchHandler.ts b/src/blob/handlers/BlobBatchHandler.ts index 2c14aa8ff..8fd3f9a8b 100644 --- a/src/blob/handlers/BlobBatchHandler.ts +++ b/src/blob/handlers/BlobBatchHandler.ts @@ -56,20 +56,22 @@ export class BlobBatchHandler { private readonly metadataStore: IBlobMetadataStore, private readonly extentStore: IExtentStore, private readonly logger: ILogger, - private readonly loose: boolean - ){ + private readonly loose: boolean, + private readonly disableProductStyle?: boolean + ) { const subRequestContextMiddleware = (req: IRequest, res: IResponse, locals: any, next: SubRequestNextFunction) => { const urlbuilder = URLBuilder.parse(req.getUrl()); internnalBlobStorageContextMiddleware( - new BlobStorageContext(locals, DEFAULT_CONTEXT_PATH), - req, - res, - urlbuilder.getHost()!, - urlbuilder.getPath()!, - next, - true, true, - this.loose - ); + new BlobStorageContext(locals, DEFAULT_CONTEXT_PATH), + req, + res, + urlbuilder.getHost()!, + urlbuilder.getPath()!, + next, + true, + this.disableProductStyle, + this.loose + ); }; const subRequestDispatchMiddleware = (req: IRequest, res: IResponse, locals: any, next: SubRequestNextFunction) => { @@ -124,8 +126,8 @@ export class BlobBatchHandler { ); } }) - .catch(errorInfo => - next(errorInfo)); + .catch(errorInfo => + next(errorInfo)); }; const subRequestDeserializeMiddleware = (req: IRequest, res: IResponse, locals: any, next: SubRequestNextFunction) => { @@ -189,9 +191,9 @@ export class BlobBatchHandler { const subRequestHandlerMiddleware = (req: IRequest, res: IResponse, locals: any, next: SubRequestNextFunction) => { handlerMiddlewareFactory.createHandlerMiddleware()( - new Context(locals, DEFAULT_CONTEXT_PATH, req, res), - next - ); + new Context(locals, DEFAULT_CONTEXT_PATH, req, res), + next + ); }; const subRequestSerializeMiddleWare = (req: IRequest, res: IResponse, locals: any, next: SubRequestNextFunction) => { @@ -276,8 +278,7 @@ export class BlobBatchHandler { }); } - private async requestBodyToString(body: NodeJS.ReadableStream): Promise - { + private async requestBodyToString(body: NodeJS.ReadableStream): Promise { let buffer = Buffer.alloc(4 * 1024 * 1024); const responseLength = await this.streamToBuffer2( @@ -291,179 +292,170 @@ export class BlobBatchHandler { return buffer.toString(); } -private async getSubRequestOperation(request: IRequest) : Promise -{ + private async getSubRequestOperation(request: IRequest): Promise { const subRequestHandlePipeline = this.operationFinder; const fakeResponse = new BlobBatchSubResponse(0, "HTTP/1.1"); return new Promise((resolve, reject) => { const locals: any = {}; let i = 0; - const next = (error: any) => - { - if (error) { - reject(error); + const next = (error: any) => { + if (error) { + reject(error); + } + else { + ++i; + if (i < subRequestHandlePipeline.length) { + subRequestHandlePipeline[i](request, fakeResponse, locals, next); } else { - ++i; - if (i < subRequestHandlePipeline.length) { - subRequestHandlePipeline[i](request, fakeResponse, locals, next); - } - else { - resolve((new Context(locals, DEFAULT_CONTEXT_PATH, request, fakeResponse)).operation!); - } + resolve((new Context(locals, DEFAULT_CONTEXT_PATH, request, fakeResponse)).operation!); } - }; + } + }; subRequestHandlePipeline[i]( - request, - fakeResponse, - locals, - next - ); + request, + fakeResponse, + locals, + next + ); }); -} - -private async parseSubRequests( - commonRequestId: string, - perRequestPrefix: string, - batchRequestEnding: string, - subRequestPathPrefix: string, - request: IRequest, - body: string) : Promise -{ - const requestAll = body.split(batchRequestEnding); - const response1 = requestAll[0]; // string after ending is useless - const response2 = response1.split(perRequestPrefix); - const subRequests = response2.slice(1); - - const blobBatchSubRequests: BlobBatchSubRequest[] =[]; - - let previousOperation : Operation | undefined; - - for (const subRequest of subRequests) - { - const requestLines = subRequest.split(`${HTTP_LINE_ENDING}`); - - // Content-Encoding - // Content-Type - // Content-ID - // empty line - // Operation infos - if (requestLines.length < 5) throw new Error("Bad request"); - - // Get Content_ID - let lineIndex = 0; - let content_id: number | undefined; - - while (lineIndex < requestLines.length) - { - if (requestLines[lineIndex] === '') break; - const header = requestLines[lineIndex].split(HTTP_HEADER_DELIMITER); - - if (header.length !== 2) throw new Error("Bad Request"); - - if (header[0].toLocaleLowerCase() === "content-id") { - content_id = parseInt(header[1], 10); + } + + private async parseSubRequests( + commonRequestId: string, + perRequestPrefix: string, + batchRequestEnding: string, + subRequestPathPrefix: string, + request: IRequest, + body: string): Promise { + const requestAll = body.split(batchRequestEnding); + const response1 = requestAll[0]; // string after ending is useless + const response2 = response1.split(perRequestPrefix); + const subRequests = response2.slice(1); + + const blobBatchSubRequests: BlobBatchSubRequest[] = []; + + let previousOperation: Operation | undefined; + + for (const subRequest of subRequests) { + const requestLines = subRequest.split(`${HTTP_LINE_ENDING}`); + + // Content-Encoding + // Content-Type + // Content-ID + // empty line + // Operation infos + if (requestLines.length < 5) throw new Error("Bad request"); + + // Get Content_ID + let lineIndex = 0; + let content_id: number | undefined; + + while (lineIndex < requestLines.length) { + if (requestLines[lineIndex] === '') break; + const header = requestLines[lineIndex].split(HTTP_HEADER_DELIMITER); + + if (header.length !== 2) throw new Error("Bad Request"); + + if (header[0].toLocaleLowerCase() === "content-id") { + content_id = parseInt(header[1], 10); + } + ++lineIndex; } + + if (content_id === undefined) throw new Error("Bad request"); + + // "DELETE /container166063791875402779/blob0 HTTP/1.1" ++lineIndex; - } + const operationInfos = requestLines[lineIndex].split(" "); + if (operationInfos.length < 3) throw new Error("Bad request"); - if (content_id === undefined) throw new Error("Bad request"); + const requestPath = operationInfos[1].startsWith("/") ? operationInfos[1] : "/" + operationInfos[1]; - // "DELETE /container166063791875402779/blob0 HTTP/1.1" - ++lineIndex; - const operationInfos = requestLines[lineIndex].split(" "); - if (operationInfos.length < 3) throw new Error("Bad request"); + if (!requestPath.startsWith(subRequestPathPrefix)) { + throw new Error("Request from a different container"); + } - const requestPath = operationInfos[1].startsWith("/") ? operationInfos[1] : "/" + operationInfos[1]; + const url = `${request.getEndpoint()}${requestPath}`; + const method = operationInfos[0] as HttpMethod; + const blobBatchSubRequest = new BlobBatchSubRequest(content_id!, url, method, operationInfos[2], {}); - if (!requestPath.startsWith(subRequestPathPrefix)) { - throw new Error("Request from a different container"); - } + ++lineIndex; + while (lineIndex < requestLines.length) { + if (requestLines[lineIndex] === '') break; // Last line + const header = requestLines[lineIndex].split(HTTP_HEADER_DELIMITER); - const url = `${request.getEndpoint()}${requestPath}`; - const method = operationInfos[0] as HttpMethod; - const blobBatchSubRequest = new BlobBatchSubRequest(content_id!, url, method, operationInfos[2], {}); + if (header.length !== 2) throw new Error("Bad Request"); + blobBatchSubRequest.setHeader(header[0], header[1]); + ++lineIndex; + } + const operation = await this.getSubRequestOperation(blobBatchSubRequest); + if (operation !== Operation.Blob_Delete && operation !== Operation.Blob_SetTier) { + throw new Error("Not supported operation"); + } - ++lineIndex; - while (lineIndex < requestLines.length) - { - if (requestLines[lineIndex] === '') break; // Last line - const header = requestLines[lineIndex].split(HTTP_HEADER_DELIMITER); + if (previousOperation === undefined) { + previousOperation = operation; + } + else if (operation !== previousOperation!) { + throw new StorageError( + 400, + "AllBatchSubRequestsShouldBeSameApi", + "All batch subrequests should be the same api.", + commonRequestId + ); + } - if (header.length !== 2) throw new Error("Bad Request"); - blobBatchSubRequest.setHeader(header[0], header[1]); - ++lineIndex; - } - const operation = await this.getSubRequestOperation(blobBatchSubRequest); - if (operation !== Operation.Blob_Delete && operation !== Operation.Blob_SetTier) { - throw new Error("Not supported operation"); + blobBatchSubRequests.push(blobBatchSubRequest); } - if (previousOperation === undefined) { - previousOperation = operation; - } - else if (operation !== previousOperation!) { - throw new StorageError( - 400, - "AllBatchSubRequestsShouldBeSameApi", - "All batch subrequests should be the same api.", - commonRequestId - ); + if (blobBatchSubRequests.length === 0) { + throw new Error("Bad Request"); } - blobBatchSubRequests.push(blobBatchSubRequest); + return blobBatchSubRequests; } - if (blobBatchSubRequests.length === 0) - { - throw new Error("Bad Request"); - } + private serializeSubResponse( + subResponsePrefix: string, + responseEnding: string, + subResponses: BlobBatchSubResponse[]): string { + let responseBody = ""; + subResponses.forEach(subResponse => { + responseBody += subResponsePrefix, + responseBody += "Content-Type: application/http" + HTTP_LINE_ENDING; + if (subResponse.content_id !== undefined) { + responseBody += "Content-ID" + HTTP_HEADER_DELIMITER + subResponse.content_id.toString() + HTTP_LINE_ENDING; + } + responseBody += HTTP_LINE_ENDING; - return blobBatchSubRequests; -} - -private serializeSubResponse( - subResponsePrefix: string, - responseEnding: string, - subResponses: BlobBatchSubResponse[]) : string -{ - let responseBody = ""; - subResponses.forEach(subResponse => { - responseBody += subResponsePrefix, - responseBody += "Content-Type: application/http" + HTTP_LINE_ENDING; - if (subResponse.content_id !== undefined) { - responseBody += "Content-ID" + HTTP_HEADER_DELIMITER + subResponse.content_id.toString() + HTTP_LINE_ENDING; - } - responseBody += HTTP_LINE_ENDING; + responseBody += subResponse.protocolWithVersion + " " + subResponse.getStatusCode().toString() + " " + + subResponse.getStatusMessage() + HTTP_LINE_ENDING; - responseBody += subResponse.protocolWithVersion + " " + subResponse.getStatusCode().toString() + " " - + subResponse.getStatusMessage() + HTTP_LINE_ENDING; + const headers = subResponse.getHeaders(); + for (const key of Object.keys(headers)) { + responseBody += key + HTTP_HEADER_DELIMITER + headers[key] + HTTP_LINE_ENDING; + } - const headers = subResponse.getHeaders(); - for (const key of Object.keys(headers)) { - responseBody += key + HTTP_HEADER_DELIMITER + headers[key] + HTTP_LINE_ENDING; - } + const bodyContent = subResponse.getBodyContent(); + if (bodyContent !== "") { + responseBody += HTTP_LINE_ENDING + bodyContent + HTTP_LINE_ENDING; + } + responseBody += HTTP_LINE_ENDING; + }); - const bodyContent = subResponse.getBodyContent(); - if (bodyContent !== "") { - responseBody += HTTP_LINE_ENDING + bodyContent + HTTP_LINE_ENDING; - } - responseBody += HTTP_LINE_ENDING; - }); - - responseBody += responseEnding; - return responseBody; -} - -public async submitBatch( - body: NodeJS.ReadableStream, - requestBatchBoundary: string, - subRequestPathPrefix: string, - batchRequest: IRequest, - context: Context - ): Promise - { + responseBody += responseEnding; + return responseBody; + } + + public async submitBatch( + body: NodeJS.ReadableStream, + requestBatchBoundary: string, + subRequestPathPrefix: string, + batchRequest: IRequest, + context: Context + ): Promise { const perRequestPrefix = `--${requestBatchBoundary}${HTTP_LINE_ENDING}`; const batchRequestEnding = `--${requestBatchBoundary}--` @@ -480,9 +472,9 @@ public async submitBatch( requestBody); } catch (err) { if ((err instanceof MiddlewareError) - && err.hasOwnProperty("storageErrorCode") - && err.hasOwnProperty("storageErrorMessage") - && err.hasOwnProperty("storageRequestID")) { + && err.hasOwnProperty("storageErrorCode") + && err.hasOwnProperty("storageErrorMessage") + && err.hasOwnProperty("storageRequestID")) { error = err; } else { @@ -496,8 +488,7 @@ public async submitBatch( } const subResponses: BlobBatchSubResponse[] = []; - if (subRequests && subRequests.length > 256) - { + if (subRequests && subRequests.length > 256) { error = new StorageError( 400, "ExceedsMaxBatchRequestCount", @@ -536,42 +527,40 @@ public async submitBatch( } private HandleOneSubRequest(request: IRequest, - response: IResponse) : Promise - { + response: IResponse): Promise { const subRequestHandlePipeline = this.handlePipeline; const subRequestErrorHandler = this.errorHandler; let completed: boolean = false; return new Promise((resolve, reject) => { const locals: any = {}; let i = 0; - const next = (error: any) => - { - if (completed) { - resolve(); - return; - } + const next = (error: any) => { + if (completed) { + resolve(); + return; + } - if (error) { - subRequestErrorHandler(error, request, response, locals, next); - completed = true; + if (error) { + subRequestErrorHandler(error, request, response, locals, next); + completed = true; + } + else { + ++i; + if (i < subRequestHandlePipeline.length) { + subRequestHandlePipeline[i](request, response, locals, next); } else { - ++i; - if (i < subRequestHandlePipeline.length) { - subRequestHandlePipeline[i](request, response, locals, next); - } - else { - resolve(); - } + resolve(); } - }; + } + }; - subRequestHandlePipeline[i]( - request, - response, - locals, - next - ); + subRequestHandlePipeline[i]( + request, + response, + locals, + next + ); }); } @@ -579,11 +568,10 @@ public async submitBatch( err: any, request: IRequest, response: IResponse - ): Promise - { + ): Promise { const subRequestErrorHandler = this.errorHandler; return new Promise((resolve, reject) => { - subRequestErrorHandler(err, request, response, {}, resolve); + subRequestErrorHandler(err, request, response, {}, resolve); }); } } \ No newline at end of file diff --git a/src/blob/handlers/ContainerHandler.ts b/src/blob/handlers/ContainerHandler.ts index 108af5f05..9fde0d7b4 100644 --- a/src/blob/handlers/ContainerHandler.ts +++ b/src/blob/handlers/ContainerHandler.ts @@ -29,6 +29,7 @@ import { BlobBatchHandler } from "./BlobBatchHandler"; */ export default class ContainerHandler extends BaseHandler implements IContainerHandler { + protected disableProductStyle?: boolean; constructor( private readonly accountDataStore: IAccountDataStore, @@ -36,9 +37,11 @@ export default class ContainerHandler extends BaseHandler metadataStore: IBlobMetadataStore, extentStore: IExtentStore, logger: ILogger, - loose: boolean + loose: boolean, + disableProductStyle?: boolean ) { super(metadataStore, extentStore, logger, loose); + this.disableProductStyle = disableProductStyle; } /** @@ -338,7 +341,7 @@ export default class ContainerHandler extends BaseHandler const requestBatchBoundary = blobServiceCtx.request!.getHeader("content-type")!.split("=")[1]; const blobBatchHandler = new BlobBatchHandler(this.accountDataStore, this.oauth, - this.metadataStore, this.extentStore, this.logger, this.loose); + this.metadataStore, this.extentStore, this.logger, this.loose, this.disableProductStyle); const responseBodyString = await blobBatchHandler.submitBatch(body, requestBatchBoundary, @@ -653,7 +656,7 @@ export default class ContainerHandler extends BaseHandler ...item, deleted: item.deleted !== true ? undefined : true, snapshot: item.snapshot || undefined, - blobTags: includeTags? item.blobTags: undefined, + blobTags: includeTags ? item.blobTags : undefined, properties: { ...item.properties, etag: removeQuotationFromListBlobEtag(item.properties.etag), @@ -755,8 +758,8 @@ export default class ContainerHandler extends BaseHandler item.deleted = item.deleted !== true ? undefined : true; return { ...item, - snapshot: item.snapshot || undefined, - blobTags: includeTags? item.blobTags: undefined, + snapshot: item.snapshot || undefined, + blobTags: includeTags ? item.blobTags : undefined, properties: { ...item.properties, etag: removeQuotationFromListBlobEtag(item.properties.etag), diff --git a/src/blob/handlers/ServiceHandler.ts b/src/blob/handlers/ServiceHandler.ts index 9239e4fa4..7fedb096d 100644 --- a/src/blob/handlers/ServiceHandler.ts +++ b/src/blob/handlers/ServiceHandler.ts @@ -34,17 +34,20 @@ import NotImplementedError from "../errors/NotImplementedError"; */ export default class ServiceHandler extends BaseHandler implements IServiceHandler { + protected disableProductStyle?: boolean; constructor( - private readonly accountDataStore: IAccountDataStore, - private readonly oauth: OAuthLevel | undefined, - metadataStore: IBlobMetadataStore, - extentStore: IExtentStore, - logger: ILogger, - loose: boolean - ) { - super(metadataStore, extentStore, logger, loose); - } + private readonly accountDataStore: IAccountDataStore, + private readonly oauth: OAuthLevel | undefined, + metadataStore: IBlobMetadataStore, + extentStore: IExtentStore, + logger: ILogger, + loose: boolean, + disableProductStyle?: boolean + ) { + super(metadataStore, extentStore, logger, loose); + this.disableProductStyle = disableProductStyle; + } /** * Default service properties. * @@ -126,7 +129,7 @@ export default class ServiceHandler extends BaseHandler const requestBatchBoundary = blobServiceCtx.request!.getHeader("content-type")!.split("=")[1]; const blobBatchHandler = new BlobBatchHandler(this.accountDataStore, this.oauth, - this.metadataStore, this.extentStore, this.logger, this.loose); + this.metadataStore, this.extentStore, this.logger, this.loose, this.disableProductStyle); const responseBodyString = await blobBatchHandler.submitBatch(body, requestBatchBoundary, @@ -173,7 +176,7 @@ export default class ServiceHandler extends BaseHandler const body = blobCtx.request!.getBody(); const parsedBody = await parseXML(body || ""); if ( - !Object.hasOwnProperty.bind(parsedBody)('cors')&& + !Object.hasOwnProperty.bind(parsedBody)('cors') && !Object.hasOwnProperty.bind(parsedBody)('Cors') ) { storageServiceProperties.cors = undefined; @@ -358,7 +361,7 @@ export default class ServiceHandler extends BaseHandler public filterBlobs( options: Models.ServiceFilterBlobsOptionalParams, context: Context - ): Promise { - throw new NotImplementedError(context.contextId); + ): Promise { + throw new NotImplementedError(context.contextId); } } diff --git a/tests/blob/apis/blobbatch.test.ts b/tests/blob/apis/blobbatch.test.ts index ecacf4572..594dcb5a6 100644 --- a/tests/blob/apis/blobbatch.test.ts +++ b/tests/blob/apis/blobbatch.test.ts @@ -70,9 +70,9 @@ describe("Blob batch API", () => { await containerClient.delete(); }); - it("SubmitBatch batch deleting @loki @sql", async () => { + it("SubmitBatch batch deleting @loki @sql", async () => { const blobBatchClient = serviceClient.getBlobBatchClient(); - + // By default, credential is always the last element of pipeline factories const factories = (serviceClient as any).pipeline.factories; const sharedKeyCredential = factories[factories.length - 1]; @@ -104,9 +104,9 @@ describe("Blob batch API", () => { assert.equal(resp2.segment.blobItems.length, 0); }); - it("SubmitBatch within container scope - batch set tier @loki @sql", async () => { + it("SubmitBatch within container scope - batch set tier @loki @sql", async () => { const blobBatchClient = containerClient.getBlobBatchClient(); - + // By default, credential is always the last element of pipeline factories const factories = (serviceClient as any).pipeline.factories; const sharedKeyCredential = factories[factories.length - 1]; @@ -133,9 +133,9 @@ describe("Blob batch API", () => { } }); - it("SubmitBatch batch set tier @loki @sql", async () => { + it("SubmitBatch batch set tier @loki @sql", async () => { const blobBatchClient = serviceClient.getBlobBatchClient(); - + // By default, credential is always the last element of pipeline factories const factories = (serviceClient as any).pipeline.factories; const sharedKeyCredential = factories[factories.length - 1]; @@ -162,7 +162,7 @@ describe("Blob batch API", () => { } }); - it("SubmitBatch within container scope - batch deleting blob in different container @loki @sql", async () => { + it("SubmitBatch within container scope - batch deleting blob in different container @loki @sql", async () => { const blobBatchClient = containerClient.getBlobBatchClient(); const containerClientNew = serviceClient.getContainerClient(getUniqueName("containernew")); @@ -172,7 +172,7 @@ describe("Blob batch API", () => { blockBlobClientNew.upload(content, content.length); const blobclientsNew: BlobClient[] = []; blobclientsNew.push(blockBlobClientNew); - + // By default, credential is always the last element of pipeline factories const factories = (serviceClient as any).pipeline.factories; const sharedKeyCredential = factories[factories.length - 1]; @@ -184,7 +184,7 @@ describe("Blob batch API", () => { assert.equal(resp.subResponsesSucceededCount, 0); assert.equal(resp.subResponsesFailedCount, 1); }); - + it("SubmitBatch with SAS token - batch deleting @loki @sql", async () => { const tmr = new Date(); tmr.setDate(tmr.getDate() + 1); @@ -201,11 +201,11 @@ describe("Blob batch API", () => { // Make sure socket is closed once the operation is done. keepAliveOptions: { enable: false } } - )); + )); const blobBatchClient = sasServiceClient.getBlobBatchClient(); const sasBlobClients: BlobClient[] = []; - for (const blobClient of blobClients){ + for (const blobClient of blobClients) { const sasBlobClient = sasServiceClient.getContainerClient(containerName).getBlobClient(blobClient.name); sasBlobClients.push(sasBlobClient); } @@ -237,7 +237,7 @@ describe("Blob batch API", () => { assert.equal(resp2.segment.blobItems.length, 0); }); - it("SubmitBatch batch with SAS token set tier @loki @sql", async () => { + it("SubmitBatch batch with SAS token set tier @loki @sql", async () => { const tmr = new Date(); tmr.setDate(tmr.getDate() + 1); @@ -253,14 +253,14 @@ describe("Blob batch API", () => { // Make sure socket is closed once the operation is done. keepAliveOptions: { enable: false } } - )); + )); const blobBatchClient = sasServiceClient.getBlobBatchClient(); const sasBlobClients: BlobClient[] = []; - for (const blobClient of blobClients){ + for (const blobClient of blobClients) { const sasBlobClient = sasServiceClient.getContainerClient(containerName).getBlobClient(blobClient.name); sasBlobClients.push(sasBlobClient); - } + } // Submit batch request and verify response. const urls = sasBlobClients.map((b) => b.url); @@ -283,7 +283,7 @@ describe("Blob batch API", () => { assert.equal(resp2.accessTier, "Archive"); } }); - + it("SubmitBatch within containerScope - with SAS token - batch deleting @loki @sql", async () => { const tmr = new Date(); tmr.setDate(tmr.getDate() + 1); @@ -297,7 +297,7 @@ describe("Blob batch API", () => { const blobBatchClient = sasContainerClient.getBlobBatchClient(); const sasBlobClients: BlobClient[] = []; - for (const blobClient of blobClients){ + for (const blobClient of blobClients) { const sasBlobClient = sasContainerClient.getBlobClient(blobClient.name); sasBlobClients.push(sasBlobClient); } @@ -327,11 +327,11 @@ describe("Blob batch API", () => { .next() ).value; assert.equal(resp2.segment.blobItems.length, 0); - }); + }); - it("SubmitBatch batch with different operations @loki @sql", async () => { + it("SubmitBatch batch with different operations @loki @sql", async () => { const blobBatchClient = serviceClient.getBlobBatchClient(); - + // By default, credential is always the last element of pipeline factories const factories = (serviceClient as any).pipeline.factories; const sharedKeyCredential = factories[factories.length - 1]; From ad06a0201421fb30666180b508119258e640c760 Mon Sep 17 00:00:00 2001 From: EmmaZhu-MSFT Date: Wed, 25 Oct 2023 15:39:46 +0800 Subject: [PATCH 249/297] Bump REST API version to 2023-11-03, package version to 3.27.0 (#2263) --- ChangeLog.md | 8 +++++++- README.md | 14 +++++++------- package-lock.json | 6 +++--- package.json | 2 +- src/blob/utils/constants.ts | 5 +++-- src/queue/utils/constants.ts | 5 +++-- src/table/utils/constants.ts | 5 +++-- 7 files changed, 27 insertions(+), 18 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index ec049c173..1d873e9ae 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -4,6 +4,12 @@ ## Upcoming Release +## 2023.10 Version 3.27.0 + +General: + +- Bump up service API version to 2023-11-03 + Blob: - Fix validation of Blob SAS token when using the second key for an account in `AZURITE_ACCOUNTS` @@ -11,7 +17,7 @@ Blob: - Support blob new access tier Cold - Fixed startCopyFromURL, copyFromURL API to return 400 (InvalidHeaderValue) when copy source has invalid format. (issue #1954) - Fixed CommitBlockList API to return 400 (InvalidXmlDocument) when the request is sent with JSON body. (issue #1955) -- Added "x-ms-is-hns-enabled" header in x-ms-is-hns-enabled API responds (issue #1810) +- Added "x-ms-is-hns-enabled" header in GetAccountInfo API responds (issue #1810) - Fixed authentication error in production style URL for secondary location (issue #2208) - Fixed issue of failures for blob batch requests in product style. diff --git a/README.md b/README.md index 8db16d5ba..559d16c3e 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,7 @@ | Version | Azure Storage API Version | Service Support | Description | Reference Links | | ------------------------------------------------------------------ | ------------------------- | ------------------------------ | ------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| 3.26.0 | 2023-08-03 | Blob, Queue and Table(preview) | Azurite V3 based on TypeScript & New Architecture | [NPM](https://www.npmjs.com/package/azurite) - [Docker](https://hub.docker.com/_/microsoft-azure-storage-azurite) - [Visual Studio Code Extension](https://marketplace.visualstudio.com/items?itemName=Azurite.azurite) | +| 3.27.0 | 2023-11-03 | Blob, Queue and Table(preview) | Azurite V3 based on TypeScript & New Architecture | [NPM](https://www.npmjs.com/package/azurite) - [Docker](https://hub.docker.com/_/microsoft-azure-storage-azurite) - [Visual Studio Code Extension](https://marketplace.visualstudio.com/items?itemName=Azurite.azurite) | | [Legacy (v2)](https://github.com/Azure/Azurite/tree/legacy-master) | 2016-05-31 | Blob, Queue and Table | Legacy Azurite V2 | [NPM](https://www.npmjs.com/package/azurite) | - [Azurite V3](#azurite-v3) @@ -76,19 +76,19 @@ Compared to V2, Azurite V3 implements a new architecture leveraging code generat ## Features & Key Changes in Azurite V3 -- Blob storage features align with Azure Storage API version 2023-08-03 (Refer to support matrix section below) +- Blob storage features align with Azure Storage API version 2023-11-03 (Refer to support matrix section below) - SharedKey/Account SAS/Service SAS/Public Access Authentications/OAuth - Get/Set Blob Service Properties - Create/List/Delete Containers - Create/Read/List/Update/Delete Block Blobs - Create/Read/List/Update/Delete Page Blobs -- Queue storage features align with Azure Storage API version 2023-08-03 (Refer to support matrix section below) +- Queue storage features align with Azure Storage API version 2023-11-03 (Refer to support matrix section below) - SharedKey/Account SAS/Service SAS/OAuth - Get/Set Queue Service Properties - Preflight Request - Create/List/Delete Queues - Put/Get/Peek/Updata/Deleta/Clear Messages -- Table storage features align with Azure Storage API version 2023-08-03 (Refer to support matrix section below) +- Table storage features align with Azure Storage API version 2023-11-03 (Refer to support matrix section below) - SharedKey/Account SAS/Service SAS/OAuth - Create/List/Delete Tables - Insert/Update/Query/Delete Table Entities @@ -921,7 +921,7 @@ All the generated code is kept in `generated` folder, including the generated mi ## Support Matrix -Latest release targets **2023-08-03** API version **blob** service. +Latest release targets **2023-11-03** API version **blob** service. Detailed support matrix: @@ -979,7 +979,7 @@ Detailed support matrix: - Encryption Scope - Get Page Ranges Continuation Token -Latest version supports for **2023-08-03** API version **queue** service. +Latest version supports for **2023-11-03** API version **queue** service. Detailed support matrix: - Supported Vertical Features @@ -1008,7 +1008,7 @@ Detailed support matrix: - Following features or REST APIs are NOT supported or limited supported in this release (will support more features per customers feedback in future releases) - SharedKey Lite -Latest version supports for **2023-08-03** API version **table** service (preview). +Latest version supports for **2023-11-03** API version **table** service (preview). Detailed support matrix: - Supported Vertical Features diff --git a/package-lock.json b/package-lock.json index 235d6b988..851b0acb9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "azurite", - "version": "3.26.0", + "version": "3.27.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "azurite", - "version": "3.26.0", + "version": "3.27.0", "license": "MIT", "dependencies": { "@azure/ms-rest-js": "^1.5.0", @@ -18190,4 +18190,4 @@ "dev": true } } -} +} \ No newline at end of file diff --git a/package.json b/package.json index df7ae2738..4704c8347 100644 --- a/package.json +++ b/package.json @@ -3,7 +3,7 @@ "displayName": "Azurite", "description": "An open source Azure Storage API compatible server", "icon": "icon.png", - "version": "3.26.0", + "version": "3.27.0", "publisher": "Azurite", "categories": [ "Other" diff --git a/src/blob/utils/constants.ts b/src/blob/utils/constants.ts index 2ff60262a..971f35750 100644 --- a/src/blob/utils/constants.ts +++ b/src/blob/utils/constants.ts @@ -1,8 +1,8 @@ import { StoreDestinationArray } from "../../common/persistence/IExtentStore"; import * as Models from "../generated/artifacts/models"; -export const VERSION = "3.26.0"; -export const BLOB_API_VERSION = "2023-08-03"; +export const VERSION = "3.27.0"; +export const BLOB_API_VERSION = "2023-11-03"; export const DEFAULT_BLOB_SERVER_HOST_NAME = "127.0.0.1"; // Change to 0.0.0.0 when needs external access export const DEFAULT_LIST_BLOBS_MAX_RESULTS = 5000; export const DEFAULT_LIST_CONTAINERS_MAX_RESULTS = 5000; @@ -97,6 +97,7 @@ export const DEFAULT_BLOB_PERSISTENCE_ARRAY: StoreDestinationArray = [ ]; export const ValidAPIVersions = [ + "2023-11-03", "2023-08-03", "2023-01-03", "2022-11-02", diff --git a/src/queue/utils/constants.ts b/src/queue/utils/constants.ts index 20cbf507c..77ca49225 100644 --- a/src/queue/utils/constants.ts +++ b/src/queue/utils/constants.ts @@ -1,7 +1,7 @@ import { StoreDestinationArray } from "../../common/persistence/IExtentStore"; -export const VERSION = "3.26.0"; -export const QUEUE_API_VERSION = "2023-08-03"; +export const VERSION = "3.27.0"; +export const QUEUE_API_VERSION = "2023-11-03"; export const DEFAULT_QUEUE_SERVER_HOST_NAME = "127.0.0.1"; // Change to 0.0.0.0 when needs external access export const DEFAULT_QUEUE_LISTENING_PORT = 10001; export const IS_PRODUCTION = process.env.NODE_ENV === "production"; @@ -90,6 +90,7 @@ export const DEFAULT_QUEUE_PERSISTENCE_ARRAY: StoreDestinationArray = [ ]; export const ValidAPIVersions = [ + "2023-11-03", "2023-08-03", "2023-01-03", "2022-11-02", diff --git a/src/table/utils/constants.ts b/src/table/utils/constants.ts index 2472f51c9..73238da2b 100644 --- a/src/table/utils/constants.ts +++ b/src/table/utils/constants.ts @@ -17,8 +17,8 @@ export enum TABLE_STATUSCODE { } export const DEFAULT_TABLE_CONTEXT_PATH = "azurite_table_context"; -export const TABLE_API_VERSION = "2023-08-03"; -export const VERSION = "3.26.0"; +export const TABLE_API_VERSION = "2023-11-03"; +export const VERSION = "3.27.0"; // Max Body size is 4 MB export const BODY_SIZE_MAX = 1024 * 1024 * 4; // Max Entity sizxe is 1 MB @@ -73,6 +73,7 @@ export const DEFAULT_TABLE_PERSISTENCE_ARRAY: StoreDestinationArray = [ export const QUERY_RESULT_MAX_NUM = 1000; export const ValidAPIVersions = [ + "2023-11-03", "2023-08-03", "2023-01-03", "2022-11-02", From 3c79f08bcd140a432a38408555c0b4f046b7b263 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 31 Oct 2023 09:22:49 +0800 Subject: [PATCH 250/297] Bump tedious from 16.5.0 to 16.6.0 (#2269) Bumps [tedious](https://github.com/tediousjs/tedious) from 16.5.0 to 16.6.0. - [Release notes](https://github.com/tediousjs/tedious/releases) - [Commits](https://github.com/tediousjs/tedious/compare/v16.5.0...v16.6.0) --- updated-dependencies: - dependency-name: tedious dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/package-lock.json b/package-lock.json index 851b0acb9..cb0dc4beb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9482,9 +9482,9 @@ } }, "node_modules/tedious": { - "version": "16.5.0", - "resolved": "https://registry.npmjs.org/tedious/-/tedious-16.5.0.tgz", - "integrity": "sha512-UQdtX+4A1K0+UtFZictpSUMzw90ua0vSBfDQ54yKpwZ9Fr/6ik0Vs5q7E0AuwHtZtg3g2PqPDEKguSdysho8vw==", + "version": "16.6.0", + "resolved": "https://registry.npmjs.org/tedious/-/tedious-16.6.0.tgz", + "integrity": "sha512-Gsi/XzWtJ+oyYsoDHSxjV5k/LzZb/3pJseC1NJoCkQ1VJF66rxj7pRLDF6jOFL4F52uSqOhtYTucs3K1sKYB7g==", "dependencies": { "@azure/identity": "^2.0.4", "@azure/keyvault-keys": "^4.4.0", @@ -17541,9 +17541,9 @@ } }, "tedious": { - "version": "16.5.0", - "resolved": "https://registry.npmjs.org/tedious/-/tedious-16.5.0.tgz", - "integrity": "sha512-UQdtX+4A1K0+UtFZictpSUMzw90ua0vSBfDQ54yKpwZ9Fr/6ik0Vs5q7E0AuwHtZtg3g2PqPDEKguSdysho8vw==", + "version": "16.6.0", + "resolved": "https://registry.npmjs.org/tedious/-/tedious-16.6.0.tgz", + "integrity": "sha512-Gsi/XzWtJ+oyYsoDHSxjV5k/LzZb/3pJseC1NJoCkQ1VJF66rxj7pRLDF6jOFL4F52uSqOhtYTucs3K1sKYB7g==", "requires": { "@azure/identity": "^2.0.4", "@azure/keyvault-keys": "^4.4.0", @@ -18190,4 +18190,4 @@ "dev": true } } -} \ No newline at end of file +} From 076feba9d9250896faf71a21fd5d4eaeb0f72c8f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 6 Nov 2023 09:21:17 +0800 Subject: [PATCH 251/297] Bump mysql2 from 3.6.2 to 3.6.3 (#2273) Bumps [mysql2](https://github.com/sidorares/node-mysql2) from 3.6.2 to 3.6.3. - [Release notes](https://github.com/sidorares/node-mysql2/releases) - [Changelog](https://github.com/sidorares/node-mysql2/blob/master/Changelog.md) - [Commits](https://github.com/sidorares/node-mysql2/compare/v3.6.2...v3.6.3) --- updated-dependencies: - dependency-name: mysql2 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index cb0dc4beb..7033f1e06 100644 --- a/package-lock.json +++ b/package-lock.json @@ -7447,9 +7447,9 @@ "dev": true }, "node_modules/mysql2": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.6.2.tgz", - "integrity": "sha512-m5erE6bMoWfPXW1D5UrVwlT8PowAoSX69KcZzPuARQ3wY1RJ52NW9PdvdPo076XiSIkQ5IBTis7hxdlrQTlyug==", + "version": "3.6.3", + "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.6.3.tgz", + "integrity": "sha512-qYd/1CDuW1KYZjD4tzg2O8YS3X/UWuGH8ZMHyMeggMTXL3yOdMisbwZ5SNkHzDGlZXKYLAvV8tMrEH+NUMz3fw==", "dependencies": { "denque": "^2.1.0", "generate-function": "^2.3.1", @@ -16072,9 +16072,9 @@ "dev": true }, "mysql2": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.6.2.tgz", - "integrity": "sha512-m5erE6bMoWfPXW1D5UrVwlT8PowAoSX69KcZzPuARQ3wY1RJ52NW9PdvdPo076XiSIkQ5IBTis7hxdlrQTlyug==", + "version": "3.6.3", + "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.6.3.tgz", + "integrity": "sha512-qYd/1CDuW1KYZjD4tzg2O8YS3X/UWuGH8ZMHyMeggMTXL3yOdMisbwZ5SNkHzDGlZXKYLAvV8tMrEH+NUMz3fw==", "requires": { "denque": "^2.1.0", "generate-function": "^2.3.1", From e9013d95550d2ff94e61afd342a39fcba3706d5e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 6 Nov 2023 09:33:30 +0800 Subject: [PATCH 252/297] Bump sequelize from 6.33.0 to 6.34.0 (#2275) Bumps [sequelize](https://github.com/sequelize/sequelize) from 6.33.0 to 6.34.0. - [Release notes](https://github.com/sequelize/sequelize/releases) - [Commits](https://github.com/sequelize/sequelize/compare/v6.33.0...v6.34.0) --- updated-dependencies: - dependency-name: sequelize dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 7033f1e06..6bb6cddd0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8915,9 +8915,9 @@ "integrity": "sha1-1WgS4cAXpuTnw+Ojeh2m143TyT4=" }, "node_modules/sequelize": { - "version": "6.33.0", - "resolved": "https://registry.npmjs.org/sequelize/-/sequelize-6.33.0.tgz", - "integrity": "sha512-GkeCbqgaIcpyZ1EyXrDNIwktbfMldHAGOVXHGM4x8bxGSRAOql5htDWofPvwpfL/FoZ59CaFmfO3Mosv1lDbQw==", + "version": "6.34.0", + "resolved": "https://registry.npmjs.org/sequelize/-/sequelize-6.34.0.tgz", + "integrity": "sha512-B3eYLG4nUnsIcPO8k6UH6bqSf5Hi3HHCEtcwfiKsp2J0iG3tv9v8lpHFz6Qd8g5QnWxAl9R5rCCXG8fRWo902Q==", "funding": [ { "type": "opencollective", @@ -17163,9 +17163,9 @@ "integrity": "sha1-1WgS4cAXpuTnw+Ojeh2m143TyT4=" }, "sequelize": { - "version": "6.33.0", - "resolved": "https://registry.npmjs.org/sequelize/-/sequelize-6.33.0.tgz", - "integrity": "sha512-GkeCbqgaIcpyZ1EyXrDNIwktbfMldHAGOVXHGM4x8bxGSRAOql5htDWofPvwpfL/FoZ59CaFmfO3Mosv1lDbQw==", + "version": "6.34.0", + "resolved": "https://registry.npmjs.org/sequelize/-/sequelize-6.34.0.tgz", + "integrity": "sha512-B3eYLG4nUnsIcPO8k6UH6bqSf5Hi3HHCEtcwfiKsp2J0iG3tv9v8lpHFz6Qd8g5QnWxAl9R5rCCXG8fRWo902Q==", "requires": { "@types/debug": "^4.1.8", "@types/validator": "^13.7.17", From d2dcc4d347e6bcbcc96e6cfa6c96b1f585114fdd Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 6 Nov 2023 10:14:02 +0800 Subject: [PATCH 253/297] Bump @types/vscode from 1.83.1 to 1.84.0 (#2274) Bumps [@types/vscode](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/vscode) from 1.83.1 to 1.84.0. - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/vscode) --- updated-dependencies: - dependency-name: "@types/vscode" dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 6bb6cddd0..74d55463e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1578,9 +1578,9 @@ "integrity": "sha512-xW4qsT4UIYILu+7ZrBnfQdBYniZrMLYYK3wN9M/NdeIHgBN5pZI2/8Q7UfdWIcr5RLJv/OGENsx91JIpUUoC7Q==" }, "node_modules/@types/vscode": { - "version": "1.83.1", - "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.83.1.tgz", - "integrity": "sha512-BHu51NaNKOtDf3BOonY3sKFFmZKEpRkzqkZVpSYxowLbs5JqjOQemYFob7Gs5rpxE5tiGhfpnMpcdF/oKrLg4w==", + "version": "1.84.0", + "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.84.0.tgz", + "integrity": "sha512-lCGOSrhT3cL+foUEqc8G1PVZxoDbiMmxgnUZZTEnHF4mC47eKAUtBGAuMLY6o6Ua8PAuNCoKXbqPmJd1JYnQfg==", "dev": true }, "node_modules/@types/xml2js": { @@ -11557,9 +11557,9 @@ "integrity": "sha512-xW4qsT4UIYILu+7ZrBnfQdBYniZrMLYYK3wN9M/NdeIHgBN5pZI2/8Q7UfdWIcr5RLJv/OGENsx91JIpUUoC7Q==" }, "@types/vscode": { - "version": "1.83.1", - "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.83.1.tgz", - "integrity": "sha512-BHu51NaNKOtDf3BOonY3sKFFmZKEpRkzqkZVpSYxowLbs5JqjOQemYFob7Gs5rpxE5tiGhfpnMpcdF/oKrLg4w==", + "version": "1.84.0", + "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.84.0.tgz", + "integrity": "sha512-lCGOSrhT3cL+foUEqc8G1PVZxoDbiMmxgnUZZTEnHF4mC47eKAUtBGAuMLY6o6Ua8PAuNCoKXbqPmJd1JYnQfg==", "dev": true }, "@types/xml2js": { From 5aaf5c304fb4a5b4cfd49108e7a0764006c8d961 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 7 Nov 2023 10:26:29 +0800 Subject: [PATCH 254/297] Bump eslint from 8.52.0 to 8.53.0 (#2278) Bumps [eslint](https://github.com/eslint/eslint) from 8.52.0 to 8.53.0. - [Release notes](https://github.com/eslint/eslint/releases) - [Changelog](https://github.com/eslint/eslint/blob/main/CHANGELOG.md) - [Commits](https://github.com/eslint/eslint/compare/v8.52.0...v8.53.0) --- updated-dependencies: - dependency-name: eslint dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 56 +++++++++++++++++++++++------------------------ 1 file changed, 28 insertions(+), 28 deletions(-) diff --git a/package-lock.json b/package-lock.json index 74d55463e..436849994 100644 --- a/package-lock.json +++ b/package-lock.json @@ -941,9 +941,9 @@ } }, "node_modules/@eslint/eslintrc": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.2.tgz", - "integrity": "sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.3.tgz", + "integrity": "sha512-yZzuIG+jnVu6hNSzFEN07e8BxF3uAzYtQb6uDkaYZLo6oYZDCq454c5kB8zxnzfCYyP4MIuyBn10L0DqwujTmA==", "dev": true, "dependencies": { "ajv": "^6.12.4", @@ -981,9 +981,9 @@ } }, "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "13.21.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.21.0.tgz", - "integrity": "sha512-ybyme3s4yy/t/3s35bewwXKOf7cvzfreG2lH0lZl0JB7I4GxRP2ghxOK/Nb9EkRXdbBXZLfq/p/0W2JUONB/Gg==", + "version": "13.23.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.23.0.tgz", + "integrity": "sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==", "dev": true, "dependencies": { "type-fest": "^0.20.2" @@ -1038,9 +1038,9 @@ } }, "node_modules/@eslint/js": { - "version": "8.52.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.52.0.tgz", - "integrity": "sha512-mjZVbpaeMZludF2fsWLD0Z9gCref1Tk4i9+wddjRvpUNqqcndPkBD09N/Mapey0b3jaXbLm2kICwFv2E64QinA==", + "version": "8.53.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.53.0.tgz", + "integrity": "sha512-Kn7K8dx/5U6+cT1yEhpX1w4PCSg0M+XyRILPgvwcEBjerFWCwQj5sbr3/VmxqV0JGHCBCzyd6LxypEuehypY1w==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -4334,15 +4334,15 @@ } }, "node_modules/eslint": { - "version": "8.52.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.52.0.tgz", - "integrity": "sha512-zh/JHnaixqHZsolRB/w9/02akBk9EPrOs9JwcTP2ek7yL5bVvXuRariiaAjjoJ5DvuwQ1WAE/HsMz+w17YgBCg==", + "version": "8.53.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.53.0.tgz", + "integrity": "sha512-N4VuiPjXDUa4xVeV/GC/RV3hQW9Nw+Y463lkWaKKXKYMvmRiRDAtfpuPFLN+E1/6ZhyR8J2ig+eVREnYgUsiag==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.2", - "@eslint/js": "8.52.0", + "@eslint/eslintrc": "^2.1.3", + "@eslint/js": "8.53.0", "@humanwhocodes/config-array": "^0.11.13", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", @@ -11026,9 +11026,9 @@ "dev": true }, "@eslint/eslintrc": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.2.tgz", - "integrity": "sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.3.tgz", + "integrity": "sha512-yZzuIG+jnVu6hNSzFEN07e8BxF3uAzYtQb6uDkaYZLo6oYZDCq454c5kB8zxnzfCYyP4MIuyBn10L0DqwujTmA==", "dev": true, "requires": { "ajv": "^6.12.4", @@ -11052,9 +11052,9 @@ } }, "globals": { - "version": "13.21.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.21.0.tgz", - "integrity": "sha512-ybyme3s4yy/t/3s35bewwXKOf7cvzfreG2lH0lZl0JB7I4GxRP2ghxOK/Nb9EkRXdbBXZLfq/p/0W2JUONB/Gg==", + "version": "13.23.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.23.0.tgz", + "integrity": "sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==", "dev": true, "requires": { "type-fest": "^0.20.2" @@ -11090,9 +11090,9 @@ } }, "@eslint/js": { - "version": "8.52.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.52.0.tgz", - "integrity": "sha512-mjZVbpaeMZludF2fsWLD0Z9gCref1Tk4i9+wddjRvpUNqqcndPkBD09N/Mapey0b3jaXbLm2kICwFv2E64QinA==", + "version": "8.53.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.53.0.tgz", + "integrity": "sha512-Kn7K8dx/5U6+cT1yEhpX1w4PCSg0M+XyRILPgvwcEBjerFWCwQj5sbr3/VmxqV0JGHCBCzyd6LxypEuehypY1w==", "dev": true }, "@humanwhocodes/config-array": { @@ -13773,15 +13773,15 @@ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" }, "eslint": { - "version": "8.52.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.52.0.tgz", - "integrity": "sha512-zh/JHnaixqHZsolRB/w9/02akBk9EPrOs9JwcTP2ek7yL5bVvXuRariiaAjjoJ5DvuwQ1WAE/HsMz+w17YgBCg==", + "version": "8.53.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.53.0.tgz", + "integrity": "sha512-N4VuiPjXDUa4xVeV/GC/RV3hQW9Nw+Y463lkWaKKXKYMvmRiRDAtfpuPFLN+E1/6ZhyR8J2ig+eVREnYgUsiag==", "dev": true, "requires": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.2", - "@eslint/js": "8.52.0", + "@eslint/eslintrc": "^2.1.3", + "@eslint/js": "8.53.0", "@humanwhocodes/config-array": "^0.11.13", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", From f3067f619e8f644afa007b713946997ec9c6def2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 8 Nov 2023 09:56:08 +0800 Subject: [PATCH 255/297] Bump @types/etag from 1.8.2 to 1.8.3 (#2282) Bumps [@types/etag](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/etag) from 1.8.2 to 1.8.3. - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/etag) --- updated-dependencies: - dependency-name: "@types/etag" dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 436849994..6c2bcdd07 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1369,9 +1369,9 @@ } }, "node_modules/@types/etag": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/@types/etag/-/etag-1.8.2.tgz", - "integrity": "sha512-z8Pbo2e+EZWMpuRPYSjhSivp2OEkqrMZBUfEAWlJC31WUCKveZ8ioWXHAC5BXRZfwxCBfYRhPij1YJHK1W6oDA==", + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/@types/etag/-/etag-1.8.3.tgz", + "integrity": "sha512-QYHv9Yeh1ZYSMPQOoxY4XC4F1r+xRUiAriB303F4G6uBsT3KKX60DjiogvVv+2VISVDuJhcIzMdbjT+Bm938QQ==", "dev": true, "dependencies": { "@types/node": "*" @@ -11348,9 +11348,9 @@ } }, "@types/etag": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/@types/etag/-/etag-1.8.2.tgz", - "integrity": "sha512-z8Pbo2e+EZWMpuRPYSjhSivp2OEkqrMZBUfEAWlJC31WUCKveZ8ioWXHAC5BXRZfwxCBfYRhPij1YJHK1W6oDA==", + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/@types/etag/-/etag-1.8.3.tgz", + "integrity": "sha512-QYHv9Yeh1ZYSMPQOoxY4XC4F1r+xRUiAriB303F4G6uBsT3KKX60DjiogvVv+2VISVDuJhcIzMdbjT+Bm938QQ==", "dev": true, "requires": { "@types/node": "*" From f3e4b3ce9db0b7fca15bb987f06985fa5fd7bc91 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 9 Nov 2023 10:28:19 +0800 Subject: [PATCH 256/297] Bump @types/morgan from 1.9.7 to 1.9.9 (#2286) Bumps [@types/morgan](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/morgan) from 1.9.7 to 1.9.9. - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/morgan) --- updated-dependencies: - dependency-name: "@types/morgan" dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 6c2bcdd07..74de38c4d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1473,9 +1473,9 @@ "dev": true }, "node_modules/@types/morgan": { - "version": "1.9.7", - "resolved": "https://registry.npmjs.org/@types/morgan/-/morgan-1.9.7.tgz", - "integrity": "sha512-4sJFBUBrIZkP5EvMm1L6VCXp3SQe8dnXqlVpe1jsmTjS1JQVmSjnpMNs8DosQd6omBi/K7BSKJ6z/Mc3ki0K9g==", + "version": "1.9.9", + "resolved": "https://registry.npmjs.org/@types/morgan/-/morgan-1.9.9.tgz", + "integrity": "sha512-iRYSDKVaC6FkGSpEVVIvrRGw0DfJMiQzIn3qr2G5B3C//AWkulhXgaBd7tS9/J79GWSYMTHGs7PfI5b3Y8m+RQ==", "dev": true, "dependencies": { "@types/node": "*" @@ -11452,9 +11452,9 @@ "dev": true }, "@types/morgan": { - "version": "1.9.7", - "resolved": "https://registry.npmjs.org/@types/morgan/-/morgan-1.9.7.tgz", - "integrity": "sha512-4sJFBUBrIZkP5EvMm1L6VCXp3SQe8dnXqlVpe1jsmTjS1JQVmSjnpMNs8DosQd6omBi/K7BSKJ6z/Mc3ki0K9g==", + "version": "1.9.9", + "resolved": "https://registry.npmjs.org/@types/morgan/-/morgan-1.9.9.tgz", + "integrity": "sha512-iRYSDKVaC6FkGSpEVVIvrRGw0DfJMiQzIn3qr2G5B3C//AWkulhXgaBd7tS9/J79GWSYMTHGs7PfI5b3Y8m+RQ==", "dev": true, "requires": { "@types/node": "*" From 02384a44ec6f3adc16bf34c0fb8f9b6401aeb02b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 9 Nov 2023 10:28:28 +0800 Subject: [PATCH 257/297] Bump @types/fs-extra from 11.0.3 to 11.0.4 (#2284) Bumps [@types/fs-extra](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/fs-extra) from 11.0.3 to 11.0.4. - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/fs-extra) --- updated-dependencies: - dependency-name: "@types/fs-extra" dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 74de38c4d..4652ac060 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1399,9 +1399,9 @@ } }, "node_modules/@types/fs-extra": { - "version": "11.0.3", - "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-11.0.3.tgz", - "integrity": "sha512-sF59BlXtUdzEAL1u0MSvuzWd7PdZvZEtnaVkzX5mjpdWTJ8brG0jUqve3jPCzSzvAKKMHTG8F8o/WMQLtleZdQ==", + "version": "11.0.4", + "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-11.0.4.tgz", + "integrity": "sha512-yTbItCNreRooED33qjunPthRcSjERP1r4MqCZc7wv0u2sUkzTFp45tgUfS5+r7FrZPdmCCNflLhVSP/o+SemsQ==", "dev": true, "dependencies": { "@types/jsonfile": "*", @@ -11378,9 +11378,9 @@ } }, "@types/fs-extra": { - "version": "11.0.3", - "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-11.0.3.tgz", - "integrity": "sha512-sF59BlXtUdzEAL1u0MSvuzWd7PdZvZEtnaVkzX5mjpdWTJ8brG0jUqve3jPCzSzvAKKMHTG8F8o/WMQLtleZdQ==", + "version": "11.0.4", + "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-11.0.4.tgz", + "integrity": "sha512-yTbItCNreRooED33qjunPthRcSjERP1r4MqCZc7wv0u2sUkzTFp45tgUfS5+r7FrZPdmCCNflLhVSP/o+SemsQ==", "dev": true, "requires": { "@types/jsonfile": "*", From cd1a49b9762d468b555fbea57142308a8cf1720d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 9 Nov 2023 10:29:04 +0800 Subject: [PATCH 258/297] Bump @types/async from 3.2.22 to 3.2.23 (#2285) Bumps [@types/async](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/async) from 3.2.22 to 3.2.23. - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/async) --- updated-dependencies: - dependency-name: "@types/async" dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 4652ac060..d594f89f3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1330,9 +1330,9 @@ "dev": true }, "node_modules/@types/async": { - "version": "3.2.22", - "resolved": "https://registry.npmjs.org/@types/async/-/async-3.2.22.tgz", - "integrity": "sha512-aYsrMkRWXwJfchKtwubTIgvWcgRU8zFT+lL48l9jSu7RJKa3A+E3qwmAJVYap4Do9QzTCLm6p63JmOuII3j7dg==", + "version": "3.2.23", + "resolved": "https://registry.npmjs.org/@types/async/-/async-3.2.23.tgz", + "integrity": "sha512-/sDXs+HxCtt4/duO0AZFHs+ydQYHzd3qUybEFb+juRWQJNCFj3sYbqM2ABjWi8m7J93KXdJvIbDiARzqqIEESw==", "dev": true }, "node_modules/@types/bluebird": { @@ -11309,9 +11309,9 @@ "dev": true }, "@types/async": { - "version": "3.2.22", - "resolved": "https://registry.npmjs.org/@types/async/-/async-3.2.22.tgz", - "integrity": "sha512-aYsrMkRWXwJfchKtwubTIgvWcgRU8zFT+lL48l9jSu7RJKa3A+E3qwmAJVYap4Do9QzTCLm6p63JmOuII3j7dg==", + "version": "3.2.23", + "resolved": "https://registry.npmjs.org/@types/async/-/async-3.2.23.tgz", + "integrity": "sha512-/sDXs+HxCtt4/duO0AZFHs+ydQYHzd3qUybEFb+juRWQJNCFj3sYbqM2ABjWi8m7J93KXdJvIbDiARzqqIEESw==", "dev": true }, "@types/bluebird": { From 4ccf345f30caa5f37e5b3e65bf240568bd24e52a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 13 Nov 2023 11:12:54 +0800 Subject: [PATCH 259/297] Bump rcedit from 4.0.0 to 4.0.1 (#2292) Bumps [rcedit](https://github.com/electron/node-rcedit) from 4.0.0 to 4.0.1. - [Release notes](https://github.com/electron/node-rcedit/releases) - [Changelog](https://github.com/electron/node-rcedit/blob/main/.releaserc.json) - [Commits](https://github.com/electron/node-rcedit/compare/v4.0.0...v4.0.1) --- updated-dependencies: - dependency-name: rcedit dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index d594f89f3..dc67f67ba 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8475,9 +8475,9 @@ } }, "node_modules/rcedit": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/rcedit/-/rcedit-4.0.0.tgz", - "integrity": "sha512-OIPwu2e0b2WF4urFMcdiYUZGjmwh5pa52Mt847MK7ovxHkjpiPaI4Ov2atjeKTNFo4Tas0G31Qm7K21t87hp+g==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/rcedit/-/rcedit-4.0.1.tgz", + "integrity": "sha512-bZdaQi34krFWhrDn+O53ccBDw0MkAT2Vhu75SqhtvhQu4OPyFM4RoVheyYiVQYdjhUi6EJMVWQ0tR6bCIYVkUg==", "dev": true, "dependencies": { "cross-spawn-windows-exe": "^1.1.0" @@ -16811,9 +16811,9 @@ } }, "rcedit": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/rcedit/-/rcedit-4.0.0.tgz", - "integrity": "sha512-OIPwu2e0b2WF4urFMcdiYUZGjmwh5pa52Mt847MK7ovxHkjpiPaI4Ov2atjeKTNFo4Tas0G31Qm7K21t87hp+g==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/rcedit/-/rcedit-4.0.1.tgz", + "integrity": "sha512-bZdaQi34krFWhrDn+O53ccBDw0MkAT2Vhu75SqhtvhQu4OPyFM4RoVheyYiVQYdjhUi6EJMVWQ0tR6bCIYVkUg==", "dev": true, "requires": { "cross-spawn-windows-exe": "^1.1.0" From cf04dcf5422c47009e0681962cf9841ef51f4c36 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 13 Nov 2023 11:13:05 +0800 Subject: [PATCH 260/297] Bump @types/jsonwebtoken from 9.0.4 to 9.0.5 (#2291) Bumps [@types/jsonwebtoken](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/jsonwebtoken) from 9.0.4 to 9.0.5. - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/jsonwebtoken) --- updated-dependencies: - dependency-name: "@types/jsonwebtoken" dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index dc67f67ba..feae79569 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1440,9 +1440,9 @@ } }, "node_modules/@types/jsonwebtoken": { - "version": "9.0.4", - "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-9.0.4.tgz", - "integrity": "sha512-8UYapdmR0QlxgvJmyE8lP7guxD0UGVMfknsdtCFZh4ovShdBl3iOI4zdvqBHrB/IS+xUj3PSx73Qkey1fhWz+g==", + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-9.0.5.tgz", + "integrity": "sha512-VRLSGzik+Unrup6BsouBeHsf4d1hOEgYWTm/7Nmw1sXoN1+tRly/Gy/po3yeahnP4jfnQWWAhQAqcNfH7ngOkA==", "dev": true, "dependencies": { "@types/node": "*" @@ -11419,9 +11419,9 @@ } }, "@types/jsonwebtoken": { - "version": "9.0.4", - "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-9.0.4.tgz", - "integrity": "sha512-8UYapdmR0QlxgvJmyE8lP7guxD0UGVMfknsdtCFZh4ovShdBl3iOI4zdvqBHrB/IS+xUj3PSx73Qkey1fhWz+g==", + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-9.0.5.tgz", + "integrity": "sha512-VRLSGzik+Unrup6BsouBeHsf4d1hOEgYWTm/7Nmw1sXoN1+tRly/Gy/po3yeahnP4jfnQWWAhQAqcNfH7ngOkA==", "dev": true, "requires": { "@types/node": "*" From a34083a4570959d5c01c5a040fdd0d2eb554ff60 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 13 Nov 2023 11:13:15 +0800 Subject: [PATCH 261/297] Bump @types/lokijs from 1.5.11 to 1.5.12 (#2289) Bumps [@types/lokijs](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/lokijs) from 1.5.11 to 1.5.12. - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/lokijs) --- updated-dependencies: - dependency-name: "@types/lokijs" dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index feae79569..609acaae9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1449,9 +1449,9 @@ } }, "node_modules/@types/lokijs": { - "version": "1.5.11", - "resolved": "https://registry.npmjs.org/@types/lokijs/-/lokijs-1.5.11.tgz", - "integrity": "sha512-CRBWx6GTJVYPwkP/VSybiYIu/p67nAMgc2eIV3ZHxmYpFK3PYU6rhk37AaTgRAvNgpZlGWi4ecvTr8+0n2iZgg==", + "version": "1.5.12", + "resolved": "https://registry.npmjs.org/@types/lokijs/-/lokijs-1.5.12.tgz", + "integrity": "sha512-MrpgRVnTiNMkeFHR6qtijFztjgHTGl44x9ybLXrMaTh+jmYQgzQURgM5ElEVhiUWvAtcO3sEgWxaDw78Rt3bYA==", "dev": true }, "node_modules/@types/mime": { @@ -11428,9 +11428,9 @@ } }, "@types/lokijs": { - "version": "1.5.11", - "resolved": "https://registry.npmjs.org/@types/lokijs/-/lokijs-1.5.11.tgz", - "integrity": "sha512-CRBWx6GTJVYPwkP/VSybiYIu/p67nAMgc2eIV3ZHxmYpFK3PYU6rhk37AaTgRAvNgpZlGWi4ecvTr8+0n2iZgg==", + "version": "1.5.12", + "resolved": "https://registry.npmjs.org/@types/lokijs/-/lokijs-1.5.12.tgz", + "integrity": "sha512-MrpgRVnTiNMkeFHR6qtijFztjgHTGl44x9ybLXrMaTh+jmYQgzQURgM5ElEVhiUWvAtcO3sEgWxaDw78Rt3bYA==", "dev": true }, "@types/mime": { From 49d1065952306c25ce76f84e041cd1acd2e951ac Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 13 Nov 2023 11:13:25 +0800 Subject: [PATCH 262/297] Bump @types/vscode from 1.84.0 to 1.84.1 (#2290) Bumps [@types/vscode](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/vscode) from 1.84.0 to 1.84.1. - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/vscode) --- updated-dependencies: - dependency-name: "@types/vscode" dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 609acaae9..ae1b47381 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1578,9 +1578,9 @@ "integrity": "sha512-xW4qsT4UIYILu+7ZrBnfQdBYniZrMLYYK3wN9M/NdeIHgBN5pZI2/8Q7UfdWIcr5RLJv/OGENsx91JIpUUoC7Q==" }, "node_modules/@types/vscode": { - "version": "1.84.0", - "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.84.0.tgz", - "integrity": "sha512-lCGOSrhT3cL+foUEqc8G1PVZxoDbiMmxgnUZZTEnHF4mC47eKAUtBGAuMLY6o6Ua8PAuNCoKXbqPmJd1JYnQfg==", + "version": "1.84.1", + "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.84.1.tgz", + "integrity": "sha512-DB10vBRLEPA/us7p3gQilU2Tq5HDu6JWTyCpD9qtb7MKWIvJS5In9HU3YgVGCXf/miwHJiY62aXwjtUSMpT8HA==", "dev": true }, "node_modules/@types/xml2js": { @@ -11557,9 +11557,9 @@ "integrity": "sha512-xW4qsT4UIYILu+7ZrBnfQdBYniZrMLYYK3wN9M/NdeIHgBN5pZI2/8Q7UfdWIcr5RLJv/OGENsx91JIpUUoC7Q==" }, "@types/vscode": { - "version": "1.84.0", - "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.84.0.tgz", - "integrity": "sha512-lCGOSrhT3cL+foUEqc8G1PVZxoDbiMmxgnUZZTEnHF4mC47eKAUtBGAuMLY6o6Ua8PAuNCoKXbqPmJd1JYnQfg==", + "version": "1.84.1", + "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.84.1.tgz", + "integrity": "sha512-DB10vBRLEPA/us7p3gQilU2Tq5HDu6JWTyCpD9qtb7MKWIvJS5In9HU3YgVGCXf/miwHJiY62aXwjtUSMpT8HA==", "dev": true }, "@types/xml2js": { From 813950d4c186c4fe3d52240ce6dad2654af6b347 Mon Sep 17 00:00:00 2001 From: Joel Verhagen Date: Tue, 14 Nov 2023 21:44:56 -0500 Subject: [PATCH 263/297] Allow disk-based persistence to be completely disabled (#2228) * Allow in-memory Loki and extent store * Update config * Plumb config * Switch to newer buffer stream library * Add the config in more places and update markdowns * Use built-in stream * Refactor table creation to a single factory * Move in-memory persistence to an env var * Add QueueTestServerFactory to centralize test server creation * Properly handle offset and count in extents Fix tests * Add in-memory tests to all variants * Fix two flaky tests * Make random local files have some newline characters so diff tools are usable * Use a larger buffer for the download, the test is very slow otherwise * Add design spec * Add logging to MemoryExtentStore * Make queue GC logging consistent with blob GC logging * Add VS Code option * Improve setting description * Don't include docs in the VS Code extension * Fix merge * Prevent SQL and in-memory persistence at the same time * Add MemoryExtentChunkStore for shared in-memory size tracking * Use a shared MemoryExtentChunkStore by default * Align Table and Queue cleaning approach with Blob This clean-up for in-memory queue extents as well as fixes broken Table clean-up in VS Code * Add extentMemoryLimit option per review feedback * Update spec with comments and add note about slower memory release * Reject --location along with --inMemoryPersistence * Fail fast on the binary tests if the binaries don't exist * Properly tag tests * Polish READMEs * Address code review comments * Eliminate unnecessary diff noise * Change extentMemoryLimit to use megabytes as the unit * Address comments * Update README * Fix typo --- .vscode/launch.json | 41 ++ .vscodeignore | 3 +- ChangeLog.md | 4 + README.md | 50 +++ azure-pipelines.yml | 60 +++ docs/designs/2023-10-in-memory-persistence.md | 220 ++++++++++ .../high-memory.png | Bin 0 -> 106165 bytes package.json | 17 + src/azurite.ts | 9 +- src/blob/BlobConfiguration.ts | 5 +- src/blob/BlobEnvironment.ts | 31 +- src/blob/BlobServer.ts | 17 +- src/blob/BlobServerFactory.ts | 11 +- src/blob/IBlobEnvironment.ts | 2 + src/blob/main.ts | 4 + src/blob/persistence/LokiBlobMetadataStore.ts | 7 +- src/common/ConfigurationBase.ts | 44 +- src/common/Environment.ts | 33 +- src/common/IEnvironment.ts | 4 +- src/common/VSCEnvironment.ts | 8 + src/common/VSCServerManagerBlob.ts | 3 +- src/common/VSCServerManagerClosedState.ts | 6 + src/common/VSCServerManagerQueue.ts | 15 +- src/common/VSCServerManagerTable.ts | 3 +- .../persistence/LokiExtentMetadataStore.ts | 7 +- src/common/persistence/MemoryExtentStore.ts | 395 ++++++++++++++++++ src/queue/IQueueEnvironment.ts | 2 + src/queue/QueueConfiguration.ts | 5 +- src/queue/QueueEnvironment.ts | 31 +- src/queue/QueueServer.ts | 48 ++- src/queue/handlers/MessageIdHandler.ts | 4 +- src/queue/handlers/MessagesHandler.ts | 9 +- src/queue/main.ts | 6 +- src/queue/persistence/IQueueMetadataStore.ts | 3 +- .../persistence/LokiQueueMetadataStore.ts | 23 +- src/queue/utils/constants.ts | 6 +- src/table/ITableEnvironment.ts | 2 + src/table/TableConfiguration.ts | 3 +- src/table/TableEnvironment.ts | 17 +- src/table/TableServer.ts | 19 +- src/table/main.ts | 7 +- src/table/persistence/ITableMetadataStore.ts | 3 +- .../persistence/LokiTableMetadataStore.ts | 23 +- tests/BlobTestServerFactory.ts | 12 +- tests/blob/blockblob.highlevel.test.ts | 8 +- tests/blob/memoryStore.unit.test.ts | 169 ++++++++ tests/exe.test.ts | 23 +- tests/linuxbinary.test.ts | 23 +- tests/queue/apis/messageid.test.ts | 19 +- tests/queue/apis/messages.test.ts | 19 +- tests/queue/apis/queue.test.ts | 19 +- tests/queue/apis/queueService.test.ts | 36 +- tests/queue/https.test.ts | 27 +- tests/queue/oauth.test.ts | 55 +-- tests/queue/queueAuthentication.test.ts | 19 +- tests/queue/queueCorsRequest.test.ts | 19 +- tests/queue/queueSas.test.ts | 19 +- tests/queue/queueSpecialnaming.test.ts | 19 +- tests/queue/utils/QueueTestServerFactory.ts | 48 +++ tests/table/apis/table.entity.query.test.ts | 4 +- tests/table/apis/table.entity.rest.test.ts | 28 +- .../table/apis/table.validation.rest.test.ts | 78 ++-- tests/table/auth/oauth.test.ts | 20 +- tests/table/utils/TableTestServerFactory.ts | 42 +- tests/table/utils/table.entity.test.utils.ts | 95 ++--- tests/testutils.ts | 2 +- 66 files changed, 1634 insertions(+), 379 deletions(-) create mode 100644 docs/designs/2023-10-in-memory-persistence.md create mode 100644 docs/designs/meta/resources/2023-10-in-memory-persistence/high-memory.png create mode 100644 src/common/persistence/MemoryExtentStore.ts create mode 100644 tests/blob/memoryStore.unit.test.ts create mode 100644 tests/queue/utils/QueueTestServerFactory.ts diff --git a/.vscode/launch.json b/.vscode/launch.json index 4eb29e85b..02d73d813 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -17,6 +17,19 @@ "skipFiles": ["node_modules/*/**", "/*/**"], "outputCapture": "std" }, + { + "type": "node", + "request": "launch", + "name": "Azurite Service - Loki, in-memory", + "cwd": "${workspaceFolder}", + "runtimeArgs": ["-r", "ts-node/register"], + "args": ["${workspaceFolder}/src/azurite.ts", "-d", "debug.log", "--inMemoryPersistence"], + "env": { + "AZURITE_ACCOUNTS": "" + }, + "skipFiles": ["node_modules/*/**", "/*/**"], + "outputCapture": "std" + }, { "type": "node", "request": "launch", @@ -204,6 +217,34 @@ "internalConsoleOptions": "openOnSessionStart", "outputCapture": "std" }, + { + "type": "node", + "request": "launch", + "name": "Current Mocha TS File - Loki, in-memory", + "cwd": "${workspaceFolder}", + "runtimeArgs": ["-r", "ts-node/register"], + "args": [ + "${workspaceFolder}/node_modules/mocha/bin/_mocha", + "-u", + "tdd", + "--timeout", + "999999", + "--colors", + "${workspaceFolder}/${relativeFile}" + ], + "env": { + "AZURITE_ACCOUNTS": "", + "AZURE_TABLE_STORAGE": "", + "DATATABLES_ACCOUNT_NAME": "", + "DATATABLES_ACCOUNT_KEY" : "", + "AZURE_DATATABLES_STORAGE_STRING": "https://.table.core.windows.net", + "AZURE_DATATABLES_SAS": "?", + "NODE_TLS_REJECT_UNAUTHORIZED": "0", + "AZURITE_TEST_INMEMORYPERSISTENCE": "true" + }, + "internalConsoleOptions": "openOnSessionStart", + "outputCapture": "std" + }, { "name": "VSC Extension", "type": "extensionHost", diff --git a/.vscodeignore b/.vscodeignore index 6af52f223..e99be99e5 100644 --- a/.vscodeignore +++ b/.vscodeignore @@ -30,4 +30,5 @@ temp .github .prettierrc.json README.mcr.md -release \ No newline at end of file +release +docs diff --git a/ChangeLog.md b/ChangeLog.md index 1d873e9ae..b6c364f56 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -4,6 +4,10 @@ ## Upcoming Release +General: + +- Add `--inMemoryPersistence` and `--extentMemoryLimit` options and related configs to store all data in-memory without disk persistence. (issue #2227) + ## 2023.10 Version 3.27.0 General: diff --git a/README.md b/README.md index 559d16c3e..d6896860a 100644 --- a/README.md +++ b/README.md @@ -33,6 +33,8 @@ - [Certificate Configuration (HTTPS)](#certificate-configuration-https) - [OAuth Configuration](#oauth-configuration) - [Skip API Version Check](#skip-api-version-check) + - [Disable Product Style Url](#disable-product-style-url) + - [Use in-memory storage](#use-in-memory-storage) - [Command Line Options Differences between Azurite V2](#command-line-options-differences-between-azurite-v2) - [Supported Environment Variable Options](#supported-environment-variable-options) - [Customized Storage Accounts & Keys](#customized-storage-accounts--keys) @@ -198,6 +200,8 @@ Following extension configurations are supported: - `azurite.oauth` OAuth oauthentication level. Candidate level values: `basic`. - `azurite.skipApiVersionCheck` Skip the request API version check, by default false. - `azurite.disableProductStyleUrl` Force parsing storage account name from request Uri path, instead of from request Uri host. +- `azurite.inMemoryPersistence` Disable persisting any data to disk. If the Azurite process is terminated, all data is lost. +- `azurite.extentMemoryLimit` When using in-memory persistence, limit the total size of extents (blob and queue content) to a specific number of megabytes. This does not limit blob, queue, or table metadata. Defaults to 50% of total memory. ### [DockerHub](https://hub.docker.com/_/microsoft-azure-storage-azurite) @@ -430,6 +434,52 @@ Optional. When using FQDN instead of IP in request Uri host, by default Azurite --disableProductStyleUrl ``` +### Use in-memory storage + +Optional. Disable persisting any data to disk and only store data in-memory. If the Azurite process is terminated, all +data is lost. By default, LokiJS persists blob and queue metadata to disk and content to extent files. Table storage +persists all data to disk. This behavior can be disabled using this option. This setting is rejected when the SQL based +metadata implementation is enabled (via `AZURITE_DB`). This setting is rejected when the `--location` option is +specified. + +```cmd +--inMemoryPersistence +``` + +By default, the in-memory extent store (for blob and queue content) is limited to 50% of the total memory on the host +machine. This is evaluated to using [`os.totalmem()`](https://nodejs.org/api/os.html#ostotalmem). This limit can be +overridden using the `--extentMemoryLimit ` option. There is no restriction on the value specified for this +option but virtual memory may be used if the limit exceeds the amount of available physical memory as provided by the +operating system. A high limit may eventually lead to out of memory errors or reduced performance. + +As blob or queue content (i.e. bytes in the in-memory extent store) is deleted, the memory is not freed immediately. +Similar to the default file-system based extent store, both the blob and queue service have an extent garbage collection +(GC) process. This process is in addition to the standard Node.js runtime GC. The extent GC periodically detects unused +extents and deletes them from the extent store. This happens on a regular time period rather than immediately after +the blob or queue REST API operation that caused some content to be deleted. This means that process memory consumed by +the deleted blob or queue content will only be released after both the extent GC and the runtime GC have run. The extent +GC will remove the reference to the in-memory byte storage and the runtime GC will free the unreferenced memory some +time after that. The blob extent GC runs every 10 minutes and the queue extent GC runs every 1 minute. + +The queue and blob extent storage count towards the same limit. The `--extentMemoryLimit` setting is rejected when +`--inMemoryPersistence` is not specified. LokiJS storage (blob and queue metadata and table data) does +not contribute to this limit and is unbounded which is the same as without the `--inMemoryPersistence` option. + +```cmd +--extentMemoryLimit +``` + +This option is rejected when `--inMemoryPersistence` is not specified. + +When the limit is reached, write operations to the blob or queue endpoints which carry content will fail with an `HTTP +409` status code, a custom storage error code of `MemoryExtentStoreAtSizeLimit`, and a helpful error message. +Well-behaved storage SDKs and tools will not a retry on this failure and will return a related error message. If this +error is met, consider deleting some in-memory content (blobs or queues), raising the limit, or restarting the Azurite +server thus resetting the storage completely. + +Note that if many hundreds of megabytes of content (queue message or blob content) are stored in-memory, it can take +noticeably longer than usual for the process to terminate since all the consumed memory needs to be released. + ### Command Line Options Differences between Azurite V2 Azurite V3 supports SharedKey, Account Shared Access Signature (SAS), Service SAS, OAuth, and Public Container Access authentications, you can use any Azure Storage SDKs or tools like Storage Explorer to connect Azurite V3 with any authentication strategy. diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 0b7fb01b0..92fdcc4ad 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -38,6 +38,12 @@ jobs: displayName: "npm run test:blob" env: {} + - script: | + npm run test:blob:in-memory + workingDirectory: "./" + displayName: "npm run test:blob:in-memory" + env: {} + - job: blobtestubuntu22_04 displayName: Blob Test Linux Ubuntu 22.04 pool: @@ -65,6 +71,12 @@ jobs: displayName: "npm run test:blob" env: {} + - script: | + npm run test:blob:in-memory + workingDirectory: "./" + displayName: "npm run test:blob:in-memory" + env: {} + - job: blobtestwin displayName: Blob Test Windows pool: @@ -92,6 +104,12 @@ jobs: displayName: "npm run test:blob" env: {} + - script: | + npm run test:blob:in-memory + workingDirectory: "./" + displayName: "npm run test:blob:in-memory" + env: {} + - job: blobtestmac displayName: Blob Test Mac pool: @@ -119,6 +137,12 @@ jobs: displayName: "npm run test:blob" env: {} + - script: | + npm run test:blob:in-memory + workingDirectory: "./" + displayName: "npm run test:blob:in-memory" + env: {} + - job: blobtestmysql displayName: Blob Test Mysql pool: @@ -181,6 +205,12 @@ jobs: displayName: "npm run test:queue" env: {} + - script: | + npm run test:queue:in-memory + workingDirectory: "./" + displayName: "npm run test:queue:in-memory" + env: {} + - job: queuetestwin displayName: Queue Test Windows pool: @@ -208,6 +238,12 @@ jobs: displayName: "npm run test:queue" env: {} + - script: | + npm run test:queue:in-memory + workingDirectory: "./" + displayName: "npm run test:queue:in-memory" + env: {} + - job: queuetestmac displayName: Queue Test Mac pool: @@ -235,6 +271,12 @@ jobs: displayName: "npm run test:queue" env: {} + - script: | + npm run test:queue:in-memory + workingDirectory: "./" + displayName: "npm run test:queue:in-memory" + env: {} + - job: tabletestlinux displayName: Table Test Linux pool: @@ -263,6 +305,12 @@ jobs: displayName: "npm run test:table" env: {} + - script: | + npm run test:table:in-memory + workingDirectory: "./" + displayName: "npm run test:table:in-memory" + env: {} + - job: tabletestwin displayName: Table Test Windows pool: @@ -291,6 +339,12 @@ jobs: displayName: "npm run test:table" env: {} + - script: | + npm run test:table:in-memory + workingDirectory: "./" + displayName: "npm run test:table:in-memory" + env: {} + - job: tabletestmac displayName: Table Test Mac pool: @@ -319,6 +373,12 @@ jobs: displayName: "npm run test:table" env: {} + - script: | + npm run test:table:in-memory + workingDirectory: "./" + displayName: "npm run test:table:in-memory" + env: {} + - job: azuritenodejslinux displayName: Azurite Linux pool: diff --git a/docs/designs/2023-10-in-memory-persistence.md b/docs/designs/2023-10-in-memory-persistence.md new file mode 100644 index 000000000..bcb4f6381 --- /dev/null +++ b/docs/designs/2023-10-in-memory-persistence.md @@ -0,0 +1,220 @@ +# Add an option to use only in-memory persistence + +- Author Name: Joel Verhagen ([@joelverhagen](https://github.com/joelverhagen)) +- GitHub Issue: [Azure/Azurite#2227](https://github.com/Azure/Azurite/issues/2227) + +## Summary + +Currently, Azurite uses disk-based persistence for all three storage endpoints (blobs, queues, tables). It is not +possible to change this default behavior to store information only in-memory. This proposal suggests the addition of an +`--inMemoryPersistence` option for Azurite which will disable all disk-based persistence and instead store the data only +in-memory of the Azurite process (node). + +## Motivation + +The current usage pattern of Azurite assumes that the caller is interested in persisting stored data beyond the lifetime +of the node process. This certainly is useful for extended testing scenarios or where Azurite is actually used for +production-like scenarios (perhaps a best-effort approach of free, on-prem Azure Storage). However, some Azurite use +cases are more ephemeral in nature. For example, if you simply want to use Azurite for a single test run in a CI +pipeline, you don't need the storage to persist beyond the lifetime of the node process. + +This sample owned by the Azure-Samples GitHub organization illustrates such a case: + +[`automated-testing-with-azurite/build/azure-pipelines.yml`](https://github.com/Azure-Samples/automated-testing-with-azurite/blob/fb5323344056cfb2e43cbff91ed53858a71b2d8c/build/azure-pipelines.yml#L14-L22) + +For the NuGet team's [NuGet/Insights](https://github.com/NuGet/Insights) project, a similar approach is used in an Azure +DevOps release pipeline, allowing a simple, no-frills Azure Storage instance available with a simple `npx azurite`. + +[`Insights/.pipelines/Retail.PullRequest.yml`](https://github.com/NuGet/Insights/blob/5d0b5ed62a71b10d93d77f5135b4876a1b1bf4dc/.pipelines/Retail.PullRequest.yml#L164-L189) + +Without the option to disable disk-based persistence, an ephemeral use of Azurite requires an explicit clean-up step by +some actor to ensure disk space is not filled up over time. In the case of cloud-hosted Azure DevOps agents, this is +sometimes handled by the build agent software (cleaning up the working directory automatically, for example) but I think +it's best not to assume this, especially since it is possible that the write location of the Azurite data is +inadvertently outside of the scope of any auto-cleanup process. + +The disk-based persistence also incurs an additional performance penalty, especially when writing extents. This is +particularly egregious for queue messages that have a blocking disk operation per queue message enqueue and dequeue. In +some situations this performance is tolerable but for extended integration tests with dozens or even hundreds of queue +messages processed, the performance delta is noticeable. In a prototype implementation of this design, the following +performance improvement for blob and queue was seen for a simple write-then-read pattern for each storage service. + +| Method | Mean | Error | StdDev | +| -------------- | ---------: | --------: | --------: | +| InMemory_Blob | 1,860.0 us | 25.45 us | 21.25 us | +| InMemory_Queue | 1,562.3 us | 26.89 us | 25.15 us | +| InMemory_Table | 975.7 us | 8.65 us | 7.23 us | +| Disk_Blob | 5,505.8 us | 91.37 us | 89.74 us | +| Disk_Queue | 5,327.1 us | 104.47 us | 111.78 us | +| Disk_Table | 963.6 us | 11.34 us | 9.47 us | + +As you can see, the sample blob and queue workflow (write then read) is nearly 3 times faster without the disk +operation. Table storage operations have no significant change because the 5-second disk persistence step done by LokiJS +is not easily captured in a micro-benchmark. + +([benchmark implementation available on Gist](https://gist.github.com/joelverhagen/8394b3eaa276f4baa07806867b5caa37)) + +For the current disk-based implementation, there are no strong consistency or checkpoint guarantees. The LokiJS +persistence configuration has auto-saving set to true, but this is only done every 5 seconds meaning an abrupt +termination of the node process can still lead to data loss (much like an in-memory-only persistence model suggested by +this design). + +Finally, additional failure modes are present when disk-based persistence is enabled. Several issues have been opened in +the past related to this. For users where long-lived storage is needed, this design will not solve their problems since +they need the disk storage. For other users where ephemeral storage is acceptable if not ideal, this design will resolve +those problems. Example issues: + +- [Azure/Azurite#1687](https://github.com/Azure/Azurite/issues/1687), [Azure/Azurite#804 + (comment)](https://github.com/Azure/Azurite/issues/803#issuecomment-1244987098) - additional permissions may be needed + for disk persistence, depending on the configured path +- [Azure/Azurite#1967](https://github.com/Azure/Azurite/issues/1967) - there are OS limits for file handles + +## Explanation + +### Functional explanation + +A ``--inMemoryPersistence`` command line option will be introduced which will do two things: + +1. Switch all LokiJS instances from the default `fs` (file system) persistence model to `memory`. +1. Use a `MemoryExtentStore` for blob and queue extent storage instead of `FSExtentStore`. + +By default, the `MemoryExtentStore` will limit itself to 50% of the total physical memory on the machine as returned by +[`os.totalmem()`](https://nodejs.org/api/os.html#ostotalmem). This can be overridden using a new `--extentMemoryLimit +` option. If this option is specified without `--inMemoryPersistence`, the CLI will error out. The `os.freemem()` +will not be queried because this will lead to unpredictable behavior for the user where an extent write operation (blob +content write or enqueue message) will fail intermittently based on the free memory. It is better to simple us a defined +amount of memory per physical machine and potential exceed the free memory available, thus leveraging virtual memory +available to the node process. + +The SQL-based persistence model will not support the in-memory persistence options and will error out if both the +`AZURITE_DB` environment variable is set and the either of the in-memory persistence options are specified. + +Similar options will be added to the various related configuration types, configuration providers, and the VS Code +options. + +In all cases, the ``--inMemoryPersistence`` option will default to "off" retaining existing behavior by default. This +ensures backward compatibility but will provide the ability for users to cautiously opt-in to this behavior. + +### Technical explanation + +The LokiJS module already supports in-memory persistence out of the box. This can be opted into by using the following +options parameter to the constructor: +```typescript +{ + persistenceMethod: "memory" +} +``` + +Note that LokiJS already is primarily an in-memory store, but Azurite's current usage of it periodically writes the data +to disk to best-effort persistence spanning multiple process lifetimes. + +A new `MemoryExtentStore` implementation will be introduced to be used instead of `FSExtentStore`. This will store +extents in an instance-level map. The key of the map will be a UUID (GUID) and the value will be an extension of the +existing `IExtentChunk` interface. The extension will be `IMemoryExtentChunk` which has a single additional property: +```typescript +export interface IMemoryExtentChunk extends IExtentChunk { + chunks: (Buffer | string)[] +} +``` + +This will allow extent write operations to be stored in-memory (a list of buffered chunks) and read operations to fetch +the list of chunks on demand. The implementation will be simpler than the `FSExtentStore` in that all extent chunks will +have their own extent ID instead of sometimes being appended to existing extent chunks. + +To support the implementation of `MemoryExtentStore` and to allow a shared memory limit between blob and queue extents, +a `MemoryExtentChunkStore` will be added which is the actual store of the `IMemoryExtentChunk` map mentioned above. Both +the blob and queue instances of `MemoryExtentStore` will share an instance of `MemoryExtentChunkStore` which allows the +proper bookkeeping of total bytes used. The `MemoryExtentChunkStore` will operate on two keys, `category: string` and +`id: string`. The category will either be `"blob"` or `"queue"` (allowing clean operations to clean only blob extents or +only queue extents) and the ID being the extent GUID mentioned before. + +All unit tests will be run on both the existing disk-based persistence model and the in-memory model. There is one +exception which is the `13. should find both old and new guids (backward compatible) when using guid type, @loki` test +case. This operates on a legacy LokiJS disk-based DB which is a scenario that is not applicable to an in-memory model +since old legacy DBs cannot be used. + +The test cases will use the in-memory-based persistence when the `AZURITE_TEST_INMEMORYPERSISTENCE` environment variable +is set to a truthy value. + +When a write operation will exceed the default 50% total memory limit or the limit specified by `--extentMemoryLimit`, +an HTTP 409 error will be returned to the called allowing tools and SDKs to avoid retries and notify the end user of the +problem. The error response message will look something like this: + +```http +HTTP/1.1 409 Cannot add an extent chunk to the in-memory store. Size limit of 4096 bytes will be exceeded +Server: Azurite-Blob/3.27.0 +x-ms-error-code: MemoryExtentStoreAtSizeLimit +x-ms-request-id: 9a7967f2-578f-47a4-8006-5ede890f89ff +Date: Wed, 25 Oct 2023 23:07:43 GMT +Connection: keep-alive +Keep-Alive: timeout=5 +Transfer-Encoding: chunked +Content-Type: application/xml + + + + MemoryExtentStoreAtSizeLimit + Cannot add an extent chunk to the in-memory store. Size limit of 4096 bytes will be exceeded +RequestId:9a7967f2-578f-47a4-8006-5ede890f89ff +Time:2023-10-25T23:07:43.658Z + +``` + +## Drawbacks + +Because extents are no longer stored on disk, the limit on the amount of data Azurite can store in this mode is no +longer bounded by the available disk space but is instead bounded by the amount of memory available to the node process. +To mitigate this risk, the `--extentMemoryLimit` is defaulted to 50% of total memory. + +As a side note, the limit on the memory available to the node process is only loosely related to the physical memory of +the host machine. Windows, Linux, and macOS all support virtual memory which allows blocks of memory to be paged onto +disk. + +As you can see below, a load test of the in-memory implementation allows uploads exceeding 64 GiB (which was the amount +of physical memory available on the test machine). There will be a noticeable performance drop when this happens but it +illustrates how the storage available to `--inMemoryPersistence` can be quite large. + +![high memory](meta/resources/2023-10-in-memory-persistence/high-memory.png) + +([load test implementation available on Gist](https://gist.github.com/joelverhagen/8394b3eaa276f4baa07806867b5caa37)) + +This can be a problem if Azurite is used for persisting very large files or many thousands of large queue messages. + +If the user of Azurite needs to store large files, then they should avoid using this feature and instead rely on +disk-based persistence. + +## Rationale and alternatives + +The in-memory extent store will not compact, concatenate or otherwise manipulate the byte arrays (`Buffer` instances) +that are provided by write operations. For large blobs, this can lead to a large array of chunks (based on the buffering +behavior provided by the web application and transport layer). This decision was made to reduce the number of bytes +copied during and upload operation and to avoid the need for a huge amount of contiguous memory. If needed, we can +evaluate concatenating some or all of the buffered chunks for performance or memory reasons. + + +## Prior Art + +N/A + +## Unresolved Questions + +N/A + +## Future Possibilities + +We could consider a more complex set of configuration values where the user can decide on in-memory persistence +individually in all of these places: + +- Blob LokiJS +- Blob Extent store +- Queue LokiJS +- Queue Extent store +- Table LokiJS + +The current proposal allows only two options: allow these places to use disk-persistence (when `--inMemoryPersistence` +is not specified) or none of these places to use disk-persistence (when ``--inMemoryPersistence`` is specified). + +Another future possibility would be to limit the memory used by LokiJS, but this would require support from the LokiJS +library and would likely be much more complex in nature because measuring the memory consumption of a heterogenous +object structure that LokiJS allows is very different that simply measuring the total number of bytes used in extents as +currently designed with `--extentMemoryLimit`. \ No newline at end of file diff --git a/docs/designs/meta/resources/2023-10-in-memory-persistence/high-memory.png b/docs/designs/meta/resources/2023-10-in-memory-persistence/high-memory.png new file mode 100644 index 0000000000000000000000000000000000000000..404282f27ecbe243629702b31c86c5f91fee6f2e GIT binary patch literal 106165 zcmcG$1yq#l+CPj4h#;YKmvkyQ;DC|>(%m5v(hQw~beD7pgMc7ij#7ej3=JZJ-*M%<#HHip1GduzVBaMgefb^;9!wsp`f7P$Uc@-MM1#`M?pb- zkBJIA((5C1iE=H=TUPRsy8GmM!*SCyDHnl@i)$D7O=YG}yhn+Rm=iy_iep@}CGRi} z2)mB)wNPk4j=`Ayd8{j~)on705KTfUNt=fQ*qq_60RaKVBeXe=^x+Jvf-{zPpvR(z z4}7%7OAKmUH-t|!K5nfbjx*pJ-@FP9K8{UlScAPviY{wTH}R%@4!_at(IO5%DEXd8 zqkEqxFdM@`#%HBzr_;V{q1ko#H{a8ZY!M1C#k0?Sf_`&HN7V#e zuw!%msEv6A0-jwnzYIK$UC4P1fv^{vgp48VXujR!FzE;??A;LA6!A;5 z1-CyZ-m|GxX24LfcEDX2hCYoXpl}t?y<=1T$#_t+<358fBjOeb^pSF&iK>;j2Cv< z3;*WYrxPJCB;weG>bm(wr89Nhdt+{XL%J-pY4=A2_S7-9U4v;GS@!vX0*%=2yr2O@ zy6S?aX(c~~W_&`_&KJ_r(6Vt1X>7O-&FnDp9#$a9#!vES=byP)PmQR9pRLzP^cuOh zTeu~qvPg=Z@9E`>@yHQrl~9<(fT=;g=*pe4%$a-f$@R{dC61kRO484S4R)#vz&ME+ z=gl2HC&LhnOqc$7>N*CuMMy1-D$!4**qChr)==S#A%7W5BoA~v^e{qJOsQtAdxLh!LWC- zzZN4j7y6~@f%!fR?NONo{{W^ShH^TlXH(#_903Xe8_ZL#nyi8A;PEB7hJ&X@$K4%c zL0;27qhdz;c6Lv9SKT0&D_TBlMQ+@akJr5qHD*4{w#*aLq|JDYu0VH{nx4-tpKVQG z+moIPat!!(_^bz0h#pMd5Orvao>_qa?XynlqR+?uoHH}4 zo}LP2fZa}VGq*lGH-Wd{d5Kn)BMcxjDKnzyyfZ0Yi);budwF`;pAq>7zj0+~_U)uWq63?G%cqP6-bpP$^g>}KXdDn8MBk*cby+WX?QN_2xVUo%tm-(=1w_C4N$kunBpG4oS=hf74KfB$RiUgU25Nh{HB5aYE^KF+p zeYZ~)nzVH#3sOzPOV|@CQG-D*46Mbb90&Wg=06W=OuXN0Evv{BsZ}Xn6FplED)`GGM|G7k_(^D&2T(DLh-tu*47SwA9MNiHweSCl%obdJCqR&eiCHH2RX)j?z{ zuGh)xsFK*;Kmi>sZr)e5tjd!vB}1Q1x?)_>Bi0*Kdx^~8m987q?%UUHP*z`FC{5Zo zUC%!HeEr~?8*;A?3!%AK_g#Up9=XdegG&uQCJ{4F(%sUXyn(+1@*D~kAqM&?U0LO9z9OEZXsNi0v0mX`SYBzA4H?u8iDtdjKmEz}G5z|+X`%Zt;{fvZ1Iy>OOBj!!aokuvHr?qW8poGwY#3OVdrAvkw#Y zz#O#U?&HV_{~lfLA$vdiEsCPQ5CNBe8zE`I3Qg`-TqMllssdjIr!)HNx~-o(uoFHJ%prwl9VPzVd5jA~<-grdKT>Oqa*+ug?ce9C7@#oom%31wM9{@P6{ z;y1<{mKfXS%=D-4?#G8j217?8>FzfrD+OY=TD^LoAak0=)}MoLDw*wJXI>QcSd_lu zn&qA&l=zyZQSDurnnZ?`j?;Uznl@K!oXjM9A~`}K9hSI!yTm<}pj%FoaK^308ybrz z#l9iwj>|A$V~>^wX^p;B=r6R4RtVy)0sUSvv_Z&KxnQCzFo*lby1pezd>m4cV$$2O zkqopVt@iaQ-%+SunRm%vk83aVL0i%YLSG8_#u30!IoXG~DF?4uQO=Id+RbLq7)2)` z_PqtyX$=yW_57ZrcRwF>0gLb2U;-Wt51~v2Mv!RJEjm5JcJZa1jxh2tO6<~#`9ziD zI@_ynDP3$o<5_k`GzeYVsh27@vXd(g(-_Y<{BzV}SM?m7P?ZN}wxQOo1C#nd9k_4H6>L{$TvfrK?lvXNi^%mtK+tcNM^|uaWDp|3 z!{$V;F_G$~O3_jHeGmH`&t{ut;~jFr0-OF{OE4FK_6Q%S37EM~I7u^F5*x=znABXm zHQ%hFniirHxVWc(zah80+06R2>0X?%b$`@=cWLP! z*N^rn8JdLq4*77wh-zLYaWBjlxn>k(cDm(5~`+r|(pA8_XP< zMF89oNw^CXky|4PDvnDvGMSUTUk7yE;*K)?8YdqX)XGhmv5pBm+JdUrAmg>L&F&Ve zNs~|F*`H07Z-pZ`FIkkJS3>R_nES3y5$ijNb{(H26*!r_T)BJDkLnr3c{*8Z({P^V zdGLlhbKTP8+;Tj!;kvDeEbIQ3ED^#?bMQlUFbUB_FWyGCoB9Cc_aZ$xHBUwY9Owr>#t}->9`XigbA(f9#;PgC&E_dh2sxr1?q>2gIA`65QY>Nx^-$BoIU8dub zA!UxZjI;HujVzEd>I5tmLIDTSi=+jjv4$nwffUVa2R1pz7InLf|~Yo z7jxI+vLFkKk70_2utER9he_t7=yNq(IG-q$YV-J$)qb{uqM+P|#DxaZ;gH%%{MY-2 zxHivB1PJYgFC1F25+SNK{!t9&izUMpp(?YM>cz-KD~ZT?hE*tl zoeOAb;E3GQxA4SWA{472SHM5^7ofVS7-7SmVpsi&fj!pxRb?|zcIQEBKh%Wk4p~lI z_Z!95hmn{iS1+;RgTH9DWO!j0SuoBKtJp-MI&NxqgWP4%s zTCH^qH9bKU6oRG4z`DpndiSkO&VjJ-Ru8)yP@_fn3jM|NBsUh`46EUU`JEQCuJG~t zQFejBkXLTFLEwiIgrZ;);*@p44_I%ak=2n0s?#+{m(j=uiptzw4H^yA4nuBWTLvtk zZ!9aS@rQElt4UKmTbHfD;bQ}Z6m}otIr43eC|o?R-(#bU+9@Mfv!w@D6RG^jlU01+ zR;F)F_|GLN9le(BpOd+#Uob%Q2tSZ9u!K`DMMmsdZ|^c~V&?~!plffV@GG2P8caY5 ze{BrORe7mjF?mj}PfN)<71Cn1;5UC3l;AG@6rM$}YL=NXsPvrS?x&GS79%}iRo(=S z4gmQWc=q4tj)e^NzP=4C*3VU#C8U1)s&Au^Km56!KK*&hTv6hy#{vz~ve*}v=sh=M zNN7D3ftz^s_3LT>c;L4S`~4Ze9th1UZUqQq1^vXj4t3Rue!%PT9CFJ*itB|6Xbna! zmC6(xckdh+JO}^w0(Jp=`pbd`HLvvo&AW;Pz=l<31MWyaa-x(#bk z*Xer>UJ1%K?W8#^hFl8wqJTp*3IrojG*Zb}u|1oDjn$VGQe!6{rmffTOhsf7C2Ya(Td%U4sGF3GBASdE=ODm$8n@4C+M1~Q;4`O3 z=)fJx8HB{`>xjR8r(H1@dOP1n)_%I4EZd>L7^|6J`n}_P5~rRr&I6kxg%mTa?1n(? zoTdu%K5`rA6C1(wx?_F5=V34yY)5)YYfTo|M6teGlY|FcZwEysp3?;#b2W^Z=L{9=o1vq()5+G97_;6mL?#F6*%b167l19J4rh1(SLPGErXmCCfJz5PzLc@5;H(j(Yz9a6=6CVj( z_zGN}GWwDj9m5!ZoJ{it)Eiyl1A`Ti9q&?vm1bO9QWcY)L_)b38x96L=L6khldjnZ zOt)bKqdegOH?cp@+-Xhb56qmbR?sO9Uj`)xBc%MjS-b+r5UUGxl2r|SRe@{)A}vdd zT|)V&Lg;f(-lGw#8E54Ch59PqUupp@5NdaX2~DOCA8UFj;3zI)OOZ8r4r(x7nCx2{ zVmhtK*2Lg0js$yY->4s)Do=a(PAK&Uhvcl9)&OLYlcp_|SPoXc1RMNBNL}(dTCgZ@ z_;wK8gZB^2-aGL->o#hzm@#%6xfVbiJ`i4xV%I_HQ=koWLZ4rMTb(YWzWH{WSOtpn zxzK^HyQxUmHcc9Rk*JYePntzNee7{79THQROzur3!MNjJemwrz^uD8OrhO*++%zjJ z{qi)z$k25+X2x?rbE|OJYHYroEcCNy*=pb}iZf?8r?v0YHAo#PHHx=K6cM0X^Z$Pj&%Zn*%#9Juj-J7 z?o%*2JAAV?ROL`?UsOL0a0&yeNx5Z&zTP<$JHHi!O7M*Mus5P@h)~j;qu+j z*ljszQWXd@g$(k!Cq414jD?)Fde+O;-o?t@tr5B+A!DLNv5%scK{8ShI$c-+JwP9$EsRdW)2$(Wz zSVn}u^1dFY)qBPz&3p8;WHJw3gJ%+;&DVt4`r;EX=y8lrF?)-#uzS%z>Y&M()yUjc z1c5v9C49s^`~6BCG)eTeQ%qB!5SF$UKL-$|oh#2#Tuh^Ip_H_1~ipaozF`M@DoMS*b;lK2?7J$5)^ zTXp-lkl#3(jXl!qUYh+APdnw`$~pT?E5Xz23v;8_$Y_)3_L<-Lnb_st0nNo3v)E;u zlJ7wTj@IS(=0o2b6lXr$xjkM5h=XabEw}o4s#{Qz#Y8oCLW(H~&HiOjB(d?FgRCSx z)1l=i%iUX?YFFjcsP>Ao^xqcXJpCeYY`Hs*x;x~ir%s5gWXPp zkG{%+enmO`n307|QSyM8!2(A_{0Dg3mxxyDwFmj0J?Hm9F?AXEF?uPb|JOLw#9_Sqhy!|0-+qY-hs#&!AW zV(aoEEyi!lhX!VLXApAB`}zj@D$eOAhq#y5-9z{E9QDQXz81B=3rDrmh~&vtkJia_+Sfjh`NI4D|%PJ*T3Qp3Z6_w);S z3BZr*UP+SiVXw=Tt|JdFVeBf9Gj7bUl`^tMVt zL$G<0X{FbS<9i(^&(cYN2aE(R!}3&2*q+OlWipL%=q$Q+jY{uj@Ys6dUUMwaKYv+f zciENDe>pDby)QQ7yz57G_-00QgFp;CKPj?xvH~}B7(Be(3IBMx+Wpb!0OselS>Wd} zeM|yeL#up{?Y5Bs9u?+&$zq*y3W?eHsfo6xx2HvKY&k1IBPlt257jq=X^ehRbhc}(&>=ZnUg3xO{ zV-7lJwKnlfM4xc)Wr&G9878-D4+AKaF8?y7l#YESVKaBRomD8nd|7#REYgJiVx-Lz zpf=I{r#s!>tj{F+Xd_k^#wcY859pqr9QX`E`gA7FC5ZO))s1<@s@Z2$9>EuXV&#kF zSSaFbK~sJ*N?BXNBL37caLyT*@fX$71rf@4NtAS<1JGEHb70RB4=TH&=;_z> zAXy9X?Pi@JNVN6P$8zhwzCuIt0HW4KSwv0(>Jj=-#M2%b9Z)}A;?qY2^-qNqd^cm& zXd7fQV%1*!uN-f2q`d%P14CJp>XG`w07i87#5rZwJ3+5Q{WmtQtoKNrvSg!fk~wa|y~$FQ+|s{W2~}W-@oVoBZGhmmvF78pTV*rEdr4 zC2ZFE(s5Pne4MQA;xPZ~rNe=3liyn3rAND0|5j#JYqjI+X=^M(f4CfGoqz_#H$HdouG74-aOaw0HYU5Q3R81C%@aj`yar zIcW0`fcH}S)lL+A0}`GMiDC*pdzc=LRv=YN@}Sx_dY_!LpUWWrCcNsl}^y-31mKu1(IJBD4M z>zYKi8~+{G^x(Fzq)0@9?W7l35)Y?N8~48|`5wAyO&y;qU9QoTp3KrL`5uL^Z=IdL znYrBJoH_sY4EUG*a{n-!Y~y&l?s7NNqN&WyGkWm(>$;T2?jwGizzC4GDQiJ^1gS6- z;gF+n*J3eYWPZv47d-w>+MUxiSgrpH{hbL~C1xZu9E8X}hSvxi^YTmh)gA;3cRCJR~pMubDLh1tFAkc_DO7(SI^smrqlXeC9$oS1@zFWd> zyH<$rhrT?HN45{Jn+`9|Q@1|NG>OdD3)&rhG#EQZBj|W6jAW&IQzI;(d;=aa^uOiA zeA7ryoc{=Z6Bi%c@m&aQn2sxky&1`WauNAUD%$;0yf3AZEEi5+ZF)8;|3)ByHZ)7m z)ZxC!-BS9t(fm}T)RhE?UcYQf^x1^L;5*8>#1zw%*E#h(lw`Kv!kH*nq6 z6~5=5?=S_tk~-drCetpv6k?Fiwxc{Jc(j#V&M|_49Tw=5tgD27^^T!g>9k;ylPDj~ zW#Sy2og$6matPq+@|wHuo$9k|m97u&cb8NGM%TyAN}t8Pp|bjX{o~mtT!7q}jIR89 z7x8z28Fx?L%qIz-geulodOHyEY3ceTnkjWFQw`4=wIReqt!jo&)gUaXsYPWUWLkH}( zk8)qgCRedCGOoO~pK?dbyFrNB_K&0iFa3|MoScf)5~S5Fc%9YCB7>0fc$0fiDKxoj z<j#J)pS zJs;%e3T!GR;8Oes%d=>7#zUvz+7GDA1pt}-z3$V?|DdY87fz07#6B<1Rjhclt!4+` z-;&2g+zac>EDWBln=5>H##y1JBQfz-;cH?|QD~NgmAfHfXGo=trBA6MwK(5bd0zQK z`u7YrhVhY4*#tPokg_5;SCXk@XOW3y@A1L%74pPpJM&a zSeFJgwZ2OtG1jm310H7v-{>K7P4@|l(*KnANID|PC~Sp1l@7Zqenyv!6(4YkMoE5i ziP|lHbBW9?LeQC-c$q(W)5}-i{Ko7_XmDN6-6;O0CcFhvxivIl7d2~Y6HBmK= z;<;}gA~I0-&Pn|7;G7y{2N}^PD#BX5{kk5+-!(-j56KX@exv)OlG_05pIKVsrj%X_ zP8UYfa3q2h*;RZ#AIaLQ@+`=aTY6Vx7~+DisQ$ZHANZvJL2uW;42w-)y9XPssCK%m zYk4%3dason_g2K4nzSAw&H_aI3K4K9>s=>;#-Qmz>;jh{E^iRa0?qnd1&9`D_L#O# zoz`e&Z@hXVB!kYvIM>5=-@_Xng!lsM>Ftb(R{DgMA+Z3x9;xS z@2OmI8GY1?!neN3hfNoOoT6h#5ojU=t@ggw;Hz8fBYPJ^kGS^E=c{Lvy1 z^yJc&Ppl$OJtktxx(lI5$JOA%W2~GOhw`Mk7N|K{52x+{#p}C)LKSKg|Yia#b*W(+DoA?4H;8KUrmqJ_@Mc9^M8THa|<+PWPJ@s7n zqe4#N$WI$d5{p38scQ(o&kN+aY-x{c1K%cFb5Git&0ipjCRQa4Rf!ue6z|C?o~({$ zb!S1ENS)t$$o9`r3*P?P_+wozpkc*mk4OnOlRss1wP&LNp#kyx(cY8}Tj*13hKE2> z;ylA7h9={OAnb!UUj)QVkT*F{?OFP6YUCjbvzv;{`_VTpU8~@dB@GgH4{ZIs)_EF`XoUrzxT7PNxwX%ow1cG zb+c&HX}L(CKc&Tmvn9w>UKnCwY0c@7h7>Q5=;&tiMuC?yEylu?;*6_&o~{X9z5}N*LA#Y3W`EHdJX&Hs@%QrN@NlF_5Gw z0(wpnM-SUZQEm}{4K^At{?39@%lWefr6k>Q60<%GnQiDE%?J2LTrxM1C}5NcaX2Yj z;B)P_rq*OIWxP^@-EsmmB}QJ9AXxzt8-1O;48b8P$x#uUa%R+d@?~3a^(SXrG~&;n zl=QS@&z+M^$Z+2=>>n7@{m%E>**f2}@W}EI!a=0~I_03VneA_R zaKif3T>1teDwMD^Z3`%8%4aID4o$BMd^kgy(Trz=AWiKqc1u`mxoD9j98!_Tb_`6v=6Bw-vj zU7kw;Ue_|{A1)TKBL*_2yDL5k0WdtlKOj5OkVO7(88%)1--7R-FOZ91dJLrao*H3) zkg`mwe?H2#K2>Y`H8PdzTy(tq6}y*ngH!Rk275DCrHzqC)gF5ptCsIkS?jF)D5mi6)r4guxYa?c8bp?aZ^ zgHj(quDcxh5^#-(F4ovSMbyN`8|3x-_y(o|D(VCX<>U0IHpxkWb=uXKqr$!jSszU2({G&3~t@!O2f(2Rp6=SB@fwU=tg;wl1q zto22KnuWf7*pKYMZx04@ri%N{-(8=!1h6@+=16u<+W+P!-Bd34>UP5NKln+cGPZ0& z=V3*^GAcm70!!6r2vV+ZQun3cTPM*Ia)8qvzS zVlishmJ=jJEws=bu&Q&H6Xu^l)H5VgLVKNF z*%Lk68Li^MUlWvD{{CUSK2JL%vL`*ya3^-qAu&yM#@j~pHrK5JjX6c?4eKJI5WvR> z<}S+se2iBVR1+R^L37Fhxf75|CPf^_{AXRW@jMQrZ?6JytTA%CF3`LfHnUg;&;G$_ z{ZP%)r(16C$wIOy0)Q+;B19u|av?H&X+r&;nqHnjbU0VoZ|Ll5>j4-Ii6X`m_NvkN zU_DbiBC!podCX3qZ7-)i^b}%?s)aoN$F1X{sJlfisE|)~#Gh{KY%DnfV06N{Q0Xyn zoD=o024G|Jt~-r6=dBsNS+aKalu8--21R{5uwa441P zy-zAj_?)D_H^{vDANCD%1u_~NS7??cla|w zYj(rkZMuJug}PGUbB&3mZ7C3NO2&MnmZ733*!?katW@N#5aovL#+j|%MT<%GAIyew z-YuX6DxX$Jv`wZW2EFGC6%?hC<$lBFz(NbnS_Az9l&kXn8&F<>{W~b%W`3_ zu2F8d2w(CrJ36&0P=N)}p!5YQqe&8(DkhL2vVyU<#WqF%{0S*o{_oC)?l(DoPnj>2 znc23U{nLcGcRQXt?djh`X(p+3qa1fqDuJ)Qh6!7!OvGknD9;h zU*)+xH~1>d!zL3Wx&Hykfg>^(@d4luy15ynoxNo|KklY}1zOO_gC%aCm^?@&PqkoS zEU!RU+qn49GKSK35qEI4bx$0AT-C}~GRyQMwC?zR(l125;0!I7x0;TK(5jBVAAJyP>=g{x z?x;${6J#uNsE%!Uh-6Mgy0`|TOjhcWmCy^pjsSo)7A{|FACP^s)zODVq~)YA%6^Hwr*W(YFo_Lw`G zlZFuj3Q>+mSJ;l8I~ZOTzrBbGXfpXnqIaWU7z6<1!1{~Q1~I0>a{=N`3rsr z;QtQ4Yn7o+A&+Uk2NvGgUIC>?eDfT1QaN}G2kkiJ=`)v2EjL@z%JW8|{?G-|WtG%= zLuoz8t*il?v4DcnKyK&%=m9{1tqq900jDGoJi02GXDRQM?ymh;-93(|^MBLb<^29u zch4Ccd+is$AOSUw&8rNWT>HiCK#B8hPOlF2rgM57@)d%jd$1E2*$sC!%O)ggG^as? z2Ph_LM@Yt7IkU``2$)`f#o5Iqf56#5N9D=OPP3E6eJjc>Irp1T9waAsX;sjQZ%f4S zgDTq7A~OIN8c&N9@hr{VywI0Gd@`Q@-5UY% z&hACc)GKXy8K&yFDI<0=NFj4HR@aE0yAdzX#ae%`42@|&evdUSdQcHVG)fOF-r$E_ z_cj8KS+}|5;w1pd&bXZ*gkB+Au92j1)yLa%# zg66h#OXX_>irq`o>)*^TZPB$sZGA{6l;c5|^sgdh32zWt=j#@Jxuo3gpRgrKZ}!Ax zN$^oJ%;Rf>T++LZ-Zzw;zDGkWa>2DL)&C5O2k7gE9_(Ftvi2!{T%iHLNgbF5$zEl-?yRh zJ(@MH**3CCxXmywy@P#PL4bI{|MWh`^<`z;(v#*JqQ)MTQ}8Emd8M@`A#{G zA>L_MS&mt(9Sa>t_yT!Eib^ST??9aFR`sL<|_C^KJ#)m;|SK=cU0unOG1PY zRS`JQNnCCVzDsF4@z24Q$N0f4`uGnoh(w$iX;Wzn>l~*2@ql@#FPRYpP(XT5u6GZ$ zX^(`;y;K^Xt0x+K&A1;UB{jh3@he)1G#vsL72pj=ZQPAjq-DTp9P$<Eg<_RM&0}zeb>$kmMk2_A%~1oA^Frj|=WlSF_lJDembD6=#-6&JI8x zWD}XAyN|5CBuL3-2l~(R2gRxG0H=7>f=02X33K5A8L!BRPw6Xmt%GIHMa?h8nlB8@ zzBK-M-l=?bFZlLrHeQBjkG96~Be5D-2~;T_Co~WTdjZrAsQPk3*2k^6AZ6?okmQHB zSJ(v=#ZUzPsrlN6`-$)Z#Adqg3cs%G*d_~b1!-dzH~lM3+rk;7Qz{u7Ja)~!TQUP! zQIy>0+oSYqZ65J&m(L2C#It%I+%XNhXiwv}E|0oj@y%v>2{Ks7xU{s?O_6F;!mI$- zV1H3&z=C!DfF_l5%ri8;rQciuDW$vf;nP0|Y;svO_;Y-(+c5Vr^u(u+Sw{QG@+Li1 zdtPiBU6kUXMo#WU1LbS{BEA<<@g~)t?^kZiKU06Qp&)x8FzE1-pnH_b%-OH5mVMK<~xh2K0Ev{~FM{Y`b}OVKlu1Y!MibY3wPb zWGjNNS)Mm80YOnJ&uAUrz#kln$*Kjp{SB1gz4e1~n`^({i4^(Md<<+F1DKBqY*pxL z5Q^Mk3r)GMxmH+r_cu8PX>jf7+wW10zLe0Ib%x`L-xdryg z$2&d&Xu#)GhnpPv%|Z&7_~#jBy+J_ku>8vozLBh%q@ou@c!sU)?WeciIV?~u?hoDi z9Zu+6etqW%tU8IUiaCCSz}gFJmjT{| zDtmR=0tPGzcL$G7hsEbtiLg$&M1t3fbz9D?^M#hoPDv6^N}E>Q-dj=aziVE8bY+z< z8flaW^i2ovU>QYmGB`hf?yFdi;V9j}__Nh4H2F*S0 z7WC+3#a9h3f6Y5^ZLB=7d+*l}%*}#d&IX3*xwI?=kR#8`(4H4%Glc9`97`5H6e_vn zwqt3e)&@d~_}(6izYvCI+s`1KtPVjzu+VVj!V$UY#~Oep)L}7(KVVD5Tx}l`KPaz> zSuFy(>I}a`zhipKffpBvpj!r65Jkc@UHbxk6>o>1*s|Pkd1%cirsWLiEk(cCWLJFr zU-}v_y#LYHxLeg#@$d3*r8N($YZcbiI@yWX^a^*c|1do3K1EtRk$16buq~1#X*KJY z7L7&H54C@!rPDhy!~;RNZAPl>zXajp<^FXL?m^TRcdAUhq;Xx&nYko~s8B(Hp@QSnGX9bcY?tfqtFIe>SQfh?G zP_(D0*Dr~JJ37mjrc?=X5gAEJ-NhQ+L_0eoA(Uc^mWc_q>punFN+&eCkmqVcGA-m|Bg5jeSKS8{YEO+FgGo0&EQY$@W19x9)5pGg(>>?b-fU>H|B3$Tt2fIh8*PM zGrsizuGhg$u~}@%dUF`!tn8RyQuyzpVPAplXK}dZ0A(LX+kyrdS5RINu0cTrib}%= zC$HN+k>Xsb@iy%%JX1<@h_Q%f}M_DiAWaX4P%25 zaNObQ;B-g&(XJ9r9AR;lF+FDVZR~e?xSUw;xO)JwxYB{_o?*k9D3e;$c3M@{oj z0o;nnC!au1x|{v1Vul11kZwgE_%Dem-@Z)%{Nw>5du1p}e|#21KVdq^z}ilFe+d5_ zDVLHk9x|*JYe=alDmUSXn?s46_MNKLY6k+CvkJCO!r2)l4+?A=`$cw~Hu?K=?q&$K zkv!WReX2?q-h$EJF%w_k@?m`Ha=STK01c4Qd_4Q}x9be6^%KEBI;)=YXC9b`ymROl z^kMzj8@iPFuB7TEC*;1rB~DipD4zCw-kB9R5Q$ti7n?PS%_V;1&*KTcdkA7~Bc2dK z)teS>xSD*dL2}IY72EfvQty>*WG!$@%AfB}#$R(h`P11rrD#_goAnaZ28T%#Ncz53 zkO>&3|B9VYVY}Gr@m==~2Tw0^<$3w8rFMvT?R9qyu81|!OIl*0(rBS5YiS*XcUq@mxP*oV^gBaBCSG);t#RH;{7ggrrA~10V z2#)pIr8~YoB8g=E)o%wJJxnUi+N?L5JYlHphLG$msDyP@o*?%6zhp~)b|sz@@Ecp- zNUzt*2^ZK}JiIiKkg~QM!4Wi&B~}wSi~3caW38yS0&&!n;f3x)cbT*5wF)QnDPd+0 zGaCP_k)>u?yEK~{TQY;kS)HZu(M)cdMDP+X4JwiG@(N=zR@!9-s6A(pe5Y^s>Lyao zN6L|aU%+J{%iD9^*cYolB7Q*`z{PYg!t8?$HD3~enMb;WLD1|G>Bj+9^(u|ENK@d7 zPk7pmzd>;9qJl{JZjmD+JP#rU!hdLSznc8%E&!_;;64?|9Tyqz`IYdwI*)#4w67k$ zQnHZO@F&9piSPgFR{VO?N$nktVXqJ6wTYj<43cbV zlrKSkFiAM_eFh-}c?j{QiZb+X^nCJ$HP4A$?SSx4dvCOFw)JB7EAR(Hn8ra7kuix* zZCSkzpy?;Fi=B;|U@U{)2{)La6?XSN))_eEM}vyncL$DO44IV$%>r6El6Nevz+|uj zc-+_HJ~5y^@VoVbB zSrV>*8_O^)6dtd-^szTN*>tnu)aV(D8i@#eJu99%pCJp?=DczK*)qy|FpU+`( zoS+~LjPk!281PON{~)9I|68_5yyXoUI9Vi-J@!6Ujb#reW8CdO2aL!$|AfOC?7n5i zg}m$4$7=>`jA*CU(v~ik*gv`$*Z+&Dn4d02Ar{fTOfKbw&usjM!(th6wtA@%%U?ry zMVjgPEP&aAfA-uGXNd5bB27N@7o>a*yW%L>dz2hn6SfD80#4`&7-XEfzKr?SX2Be{ zjC`#Z1*fluT6p+8`1Z0nH{Mv$&Jov>C_JyKYDG<;QWtdD9y`hY*8B%s2bHLPRe_Wfvf>8i4D=9xe*%=aXpz5r#9c&Mf5U z`}ZYa7xe%5R}lOvT;%3t+U286e?U7T@if2*{Ni}Rn_iuE1ZQ($urWUzNX6<~AMJF@ z{+#Dj2q6iVxEXE=?@ANm|D2k{7$V;Stc-sJ#q)A69xsGgE(#y~We7cL=8gI-!GrIG z*L4|e9ySUUg6ul7O7;!1{)j&(G?rmrH&Q77>}D{a#yg@_QyqgrSd_1!LmVJ0+M(^5 znCAMT@@D<=bSVc(&5s`Xz-*QP)hYo}APuVe@V%vlG(3Y}pCvKx2K5KVr)&>P9}?h$ zk7G|AaIXS3y&=!6=br>?Rez8T>Ly-2dst7>w9^QT>Qgg>iEp%|mfWUvDf0kL^ve#> zc}o}k!^)@{x#B7RL)a)6Iht;uF+vt5C+wG=-sC`9LSY98*T8^2D2i>pSLAIJLwEQr zQ#je@MU`jD9_e1Cffm_+tP4JP{13RC_vwGeiWUz~)+@VDB^ykRWRVtQxY(z?S1k&}k5#0eI&u9a)v z$c)jsq85U=&NW`EIFWr}(G3^m+das_Z2RS>?E7pHb4qbFco+cXDi(Ly{$;#Ks?CAm zEzbPuyB3bvYguO}qtD+w`8`o}b=LjYxcr}{HA>KRg_Zc&b>KnjGK6_W`E}yatR+sRF@&{Z`#S6=US;jA~_?^!*9ph1Ly=m5<03?Q>HCAl0lcJbi~=T>9C=2SF1H>C#3VlL1ONRM}b ze(w)6d0hzT=R{Aet~g!a;HMSU3@;FyuFxH+@>fA$lsU}KW`l`X5P1`*6f(v=dIf^` zfbLMJiHv9oAGrp%%UM-h%men#>aR45^e>267 z@c-K>c8|{rrGJhPEw%rL2vIfT>b8(8M{nRQ=UfOUc37qkEpHMwt`f6hSDp_Pd((Rv}M0W z2(RoykcFudDSpR&D7XvT1N$}vS(!f=4?I=CA50MxsPD0m2`v@&K(i5&|8&RXA?1r( zn(P8o2_NyNC_^8_IwxIc|3$JE{=3-J|Ksf~prYK@Hf}@^0YL--B}GzFl#~IaLDB-G z5ftedVrXe4mCivzL1_erp&QAeB!`ZnbLje>LHFLCbKHBK@BQBQTOez>7BTb0|M_3{ zb=|*vuo!69LDS6N&41Z}9rD^7J4SjNCVJv`arXTCj29dj8I=D7t<%tPUDOGIi^lNL z{@0ULhF{P+v7-0p?&ScXWALglVf^_QO_7?fzHFJhzlW zBMU#Fh(*y|a@-sr>Qe21V+@oB{!ak_5oJ;y{4TrylEI3slxAsVWAAuPmMEnt^H=x( zCDZJAK|A(g7alw|Uq;G*cMzz^2eD37ifi=~)x^3`O796cUf7x4tvRO>`@)47`7CUy zsJ|P`)cww|mB9CLpO@TMTurXJ&}UhLKGmEweb5!dH#%U|O-TR*@_8c?S(d#ZOrm#L zU;Vyc5WUrCzs%Zvze8GOfMuCc_o|2hErnkGbavxMK1YJOT&2I4Nz4D_O=Or${Nhb0 zj546~0BQi`jpr4%B$;o+*Y4=+RgL0wHZ0B2lZvvc-E7}v3^w_^1RR6K@wRiF%}?0^ zb?!FNMvl7}{@H4g_|OYzwaCPxA$+hp8++41z4c5L-F|we*ooqxjChoVW&xJN59q8; zx>O!mb-x8}h;A^0SDj^(8*c}D;hvwhzR4$5 zPXS65qV9h7I9rO(lHQi2uLN`C8_|o~@1`7yeXP}+huvah@OfHUja=Q?!-&6>MygHiC_&#c3B*z>5KCR zo33_Oh3?CJd}h~kKYh}i-pl!^p%>ghFlgdUw&PZ5Sr6FaULPx_K1yKXQ0vDWryTn4 zf~hhHBbc^T5K%~ug_^6s^DpKk?`pXp_PdgMuOu?j)|uE7$CcOs9>#Y1Z#)b}(G|x~ z*^PI_47o&7=3vbBN}4UHu6OSw+?h$Cp*tmaeElh(Q(oQQwPai)Pc-r(Z>qf3p|QC* zd$u5@{#69k8Uh{<$k5XuC^fgJ2Al5$HjpP|{#T}#mtjGXI{4YOzhQbM`b|dmf(_H6 znxD^P8_Ka&QFrBGfM%;cCpoyFg8(43{b2Q}WSVq0SRsl2&F+*&l}=>$(<}G521Z;r zX^+Q@A6Q&1?4#-cKoQsWzb9&Altb^Pf^+c$xTKy3>Yb}CO^97jbP}egsa#Dxv}VP| zK66RXjl5&@?}%QkNe>H{^Pon7Pc(1+lBODnf>JkXaghiErmGSnNrF?o&+y~Ba8vdy4V)$K!se_je&0NDc>y8AA+7S634 z@hRfYe#d_4N-oM5VSrxdk!y9> zYz-j}zEH?l&qk8xV0v*5QplVGPyBK5%X6i?o10e~uohxpM7DY5aJKtTDL2zwX?oeI z1ajru;*?bUL|>T|)0BM)F?wR78)TC*n41JQ3XIgo#5jHgI7mb(d-$H&HKm{)Q3fVa zV~fHT@@YB5gib-4tG{O_l~ixs*e|qH1e!^z~*^JE7l%c37*x@xk@x>!TSTA$4mOh ziyBUzD@7s6dqb+82fg&;>rQwk^Ki;U*Ipt)q|Ipg=@;++uw^9H%0OWrt+8?45^V1s zmg=qop|a<*c3Dbiau9H2{Nm&}J$|w>?ooLkL2LJ|DbE{vxIvUb zmza(U1?_%vcCqqGA`^xAgc}XxZatpRjbsV{I=U~NQ*yhDE~Lty7fw;>Z@GS)E+9#& zG_9<1>#X}4XhFFx%GypLYT|1ic%JY&{E{f_ex~0!o3yS{mdoXkbA$DcvTZAa9gVE3 z@^pcAX?ZNXu;azsMONDdsLo#d>ci2sli9@Y_%5pn<2b^*Ax`vLkx4B%TSv$+&!cI2 zU34LisMCzIpciyxvyAn~x*HtCZvFQb6Tl7Pb>VJ9aE&FWqbRNcoE}}bhIzPb=2+*e zvOTrM3nJg(D<~H16ZK@*!?n2$9+Nz)F7WBe+BjtQ3uFqO##6PFTMkfZgY>9+!H3EA zjUD+=apx&ANlfFT_(7WZmroek_u~_zy)dmZsVHoA&ZG${rjogNVJES&`2$jJ9^1@k zFxqA0_qc^k_2exc;2l{qdRXy_IyLgXbzlfR*#n90rV;9w#X?6;l{Ju;TviiNT%1He zFZ93qV*n@Rx(m0&NB%e%4*5W#mh>mzK0c=${1Oo!Gegv>>-a!>M=$tvJ8pm}#{U)f z$U$Kkq8IGMy$&W^Mj|@^^tJOz<(XObL*<_B-+?VCi!y?LuYhGMdSdDk2Pi$pZ9WOA z__D-*5Q=kju`8g)SZhsAAVS_zH`R~ z+ui|l;uunyhnDM<&$)#Ag0Ru@zlvr1G9G=IoMdZ97u^7AtbZVOck^xA{7}l8(P)~w z_YHd&+X&0os>VhIa!EGcWC0_DDq7b2arqzca7v7j_p=Ct=z(+v)SZ_ zjkzo#6LzWx`u?7OJ=pqB{A;xQ!Vms6Ifj3|aQto_K8wpv9f@b=^OLz($@Y34e*F_F zc2@2hVha6`_=D+LOO#pr($F6dBoOb2ZLbi)8jSI>WIW8 zNyLg{*9gpg&2=PC^z{4y(s3zAd%Wnhl2s02o4~8D^fi#PB#}Sv(8FBcz2I*_es=Yg zj%K|AFLKyZQEF6BO5Dwq&Kbns|Xg9EnLCbABxLG~cll z8XV3`SxNs}P2S`d#bL7#aQwn)&p3WpU;oPS<8}Hk`mQMc;`sg2cO~VW_PlhG#K$qq zwc3R#y-r&?iXH<~jr4q4Jj@qD(8}S)UlM%#h3Jp&?t>Im!}i6tE2*gA1>sHWa{&}A zu;};TrRM~lM&}=+bwZQc04Wr!xzT4@jwPy56Y;U7+ve6Ak?L*aEAFAwk9wS`>v9S2IhKk{R@)2 z6V%vqjlh`x`wF`pTTXKGXDqbBP3`I|fTpPR5Zz+?34XmZMU6&bf5(IEPi_BCja*PL zn;as=eNVddcB1-Q5$B@3&r>uQ{xpz^`q^`gdMg-8) z8u321{CE)@rdv55$&E%@l^=KDrlSPt`K#TQq<^r!;{euoyTlpm`^ZD_pV5B_A4j5~ z00~Tt0RRhY2xSp+TXgVkG#n`+38{+%hmER-2k%m>( z#&im#w)Oytj-Y(?_DaE$4HV8sDQ6RgaZHBYwON2)1|CUo|Du6Yy$5LE zHUJG=9o!=FHfwH zt2pXpXeJb*noZ{t`Qb)o16;q!d4OM0{N+{Ao%?{R8hE2!Arbjk*t2+6&E&~oqP;9E zs>0=Xaq>_43BVNMR(Qw%yjPOlLQZcf_49nHcSYORa}Ej*xKbxu=Y`(`2k22t&OoAD zO=S$ZXmgy}f5Fb%SN}C7Nt6iv6Pg#k&;l&B04N+N?EGviyJ4{(|5gexcmAVzpnb@u z-=)KN(|C#9Kj9y+c@AXep`ZWtzVY5Gj@8lru)c}bS=_`u;A~6!c-iLZfCKH1cSOno zvl{nU!4?tZ7NyK#ZhaQgendc~8V(Op4q%T7AbnZQz}qEZspdU_??2owE=X#o~41w zkh2!o#W_Ok8Q{84tq~6pyy{5gvN{oyAD&UGl0QQDRs%v$LN=9{fDtr>Cz)wKE^WrG#-Y{b-;5u^%mz^{;+3zdlj|(@!@f__~&Z|%Cj zb(wOS5ukX@0kMU40@2+~)uS0!aX3aU?bXwtOyG&{t>Sw6;Lp3ctU?K2eMA|kY%FDU zf~>Z1YC);`Ey7D%Z!N@^K~((=@2^mO)>-7c)bOTj@v|&0MHyPf z9PqG!?%Y*lF!?aAPH;G-Y;r?{)mx!1_l(d3?Yxfbz4#!&w&d zjc1u?0 zq!GoB?3Bt40`dMa;Q0)u0t7sje4$b{I_AbSDmA9hLwy-~!LHV2S7(NytQAC_yTf}D zY8GLGVAZ4D$-``ml$jl51nRE6RdSnEou{R0n1Oq?%b78hiX!0nt#ZFj6r1!VYt5@%uOsw492uXgOAEdCpdxBsnEu0elD(In3I!dfPQ4$)?#(fU z+u!&`w;f2fq0hLvK3+Mt{eFLI{6sIY#`2_;_4!8d^4C;5w7xwy&-k-SShWTwrfFpc zeEn(o*4d?^Joel4PxhL{S7V@z;{hZf<8R(p9LY_@tUf7ZM$9fix)|)iv=Ho0_!e|1 zYBt)^{q)iYqdsbGm>mT) z*X44!0t>iRP$G%D`&x=`m{=~abcz7yc!TedhX)7oZF%@M$z^KLInP>oEp?tRzOB-% zTUFWYt8HJj@CSQu>1xDU*e&gA@7|j>+FNnoY5Xv_GhF0%I=YmoX!E9eKMAFS9U823 z9T6w)Iq6%8D7Vl1$_*7~l_+y}MwzPjVUw90T3%Mwv_FyD-ht2417wkZ4e?sBuE`d@ zjmwyT%E!Hrs7t8|*RBQgf+?i03DhJRvab3atH;?~AG+;Aj2dAev7wj>*nAc_8p=fV zI-a`Q|K7U9H_7nFM#8cP!vq-NZrc5Fo-pt3uXpR8`vGlqTjFXKCAzzWar`#UF*;$@ zExo~WZL6k7YM+4H04S&_B69Sr={USQptHPL2(i$<_cQ~XHq(wnc& zXuBZ9unK_Qh0VFAwQSa~ZuUEV!k+h+M{FNUebY|5#bN#a0+7M+U1#T@Iih6~m?nx)?BDF~IFvQ-CXK&g%?3v3 zqQeX~7v6b3up*a601nvyZ3$wLxc0J_Q1)z^8G5yQ`;Tn$tp{I-P9&$82_|;2dRaMH z8pZRNHO;ID;a$8FjiGK6(4*RE_PfX=kEna)7?mYbN zqB-CW6n`*3*I z5C*Au6F@3z5&el&eE3>P^TtUub=Cg}+OjL(q!SGORzfKHRPH~z4&@8Zx(*2?3hNiw z*zV`zO?dR5lLOigYg^a?CL#Yt-QXAg|DSb(wrv6OdZJ$^ZhbkrkMW|9vc7!(H1ttT zZ!)Xkg|98Ti`U@C$g;;DQTHGEW$`k>g%e3|dqaQ%U0VuO{cIOlN4l=xu6SXLJzN`( z&8ZOr?0xRn47nE=vW^Vrb!1@LBP0W%hkc)vlZRWHDs6f*RPLGfsA4tdF4gSI)9p~zd;|&B7|E9{|0Sx{MCM^tG zbc|yBEzyyN{0Gr-iJ1Sqrq=I(j+nN`Ux1DgeTqO57wlnjzp3L;6gg**H2aAoSeVvrgLi0BHH@k<;sh z5tlJ-E&MBL*2b-NnR6I4R^kmD`#}(^)9V5--tx@1eE!ttnowH==$v3Re`?#@f?Sg#}(Y*CK>nc=xD@8ke~1p=op?ABk!3u$+P3Q%wWz!H%0k zH?u}Tm;qY}#M}61T}jV$Z44)y*Z(8Yoz#N~C@9B6jf|p6(texdhIa+4k5_H$F?(8K`HutiGrjNCRiS`@2D727#hyQwQ?2E+4yco#A?ba$7%u<{A-O zFNqO9wc!=Rbce{Q8H6D{}k!VP? z0AtUOX#o_*+|C()H!VPv==akC{-E3NJ#-1}e5644G0#Hy zKO+rE$~E+r`NA&TLqBGe9VF#;s#>iu{eDmY1~r+~N0bp}_Ov?__W7EXOL9xWRh;`XLV3AKrK~AeW;kEO;;;*<1_@wir>p!96^Brji%h~b- zCRQkt^Nl*;&WWz8o$_VQ-rNNO4ZxJmqlw_^mha@L&k`BS`u8}3Cc49AeUPX{i^I63}zMSA7RLp(v%Cefq=K?W(0M*VNba8@nLAaTJL3gmY z``&Bve@{&8vypcT``U57@^-qE(UK?Bz((C?DfRl3zx0+jDzan1Sx&FBvPn47ck9z$ zYI~)N61()n!J7R&?Qjjv-FT7vMq0RoU!yXWbI<5H|D$R~Rxxbh9uk0CTCk1T13~o5 z+MNmoxB{Uy(XgKwnH)^+#5R~9*Zd0iRqdWQ5f{x@HA-iU{huNf$B>iHXTybkXEVt; z_c|xT{}O5EUerI4b{qo2B{;4u^j@t@`+Wi(J@YexZoM6-T;*pLu>^FWa93#j9bxBR zdq&Hy{OlPux9)W)HS{DEcv9pqJ8IJ#Wz74cemwKXbh${+@3CfN3n@8o0$G*qrdj~z z>TeE?+3F{~7GXkYc|la7_9K`7n5@Pn^1I1u#M7LZq&Pb>r{hek@_8rG4(fwW&No!_hu-`!UjuYH44lA}q#@`)MaMM+W7U7*;c zX&;tff%OrvhB0b*K;$n$oX>}*84Ll2Z%YM-zU8GqR0Q26MK7E-$ml1> z*;G%to{#lvJs^19Qx39z5wIx_edy31$QeJ7L252yK$zXs$Tg2$5uittuZ-}g*v@aC z7seV3E!6RwL>1MsdK#PuV*7C^0Jo>ESL3vCPWM`u_+?LO$0Mjafkzhf znBoX(x7V^&Eq*v+BDUMddODPle3UInyV)){<+Ofx?De>Ws=jAeul{a&MiOMgu$eyp zp!8THZ{)PgD0weZW9@K8W5x9w2fgQd8~tv2jMz?1wR8J9bM;lHJ~360-I}|8{=jrH z3^jeSX^PNF>(>1lBJiD+L*UnK`T?u(%Xv7N>f!dClgcfP?loVh6FZdk^k}p7QRC6t znrG;^`RQuL9<9@2*oO9QXnCmn;pGk2j*(TjZSCsQMWS($IW8xft>~4!qmdE4eb~51 zW5UV)e8kDZ$Gqx&<|XTc1hVSFxji0Q2c-DXc7eXo=Jx^6=~G|`ePfiTGx~*G1v*^Z zbE6r0oEmmCr0+R@od)9hq()x7|2bw)j{PN&)xaN5tCs|@!6&iZ`NDa3|p0FykFwb$r6`uXQT%XrV%N^=0Vj>7s?Iy($KUl&S1f|NmIm^g0}Z~KIJYl? z@xAo|%syPPy7WQd3fcp|P0}*|o&2EF=WWa#akjQEcY!D1dZjye9jYnmcZU|u5BJ>f z9nd-}?UiqS)6m`U)^ImF*=P2kjJ`0{`e~j=y=*3>}P3l8sj$POc%h*I{dJ>-wvZi3Hf_ zsVZ!2Hw=c{+Lmgra$Ns5PE&fAC+>#Qcc0(kai8etsW^>BjN8nE*F^V*>UZ5=+8#H3 zrm$Cx%y65iId=rvm}(>f9)Xp4$A`PBgWF$n3I{B)27n<9D~)$7-MNIfmQIB%u%Pu{ zdJ&yCkB4HlqS0n1QWCF1&)Pcj-6W5U!K{1eIE-YL^HJT*T z7AP7HMy=yJ;pbwx)R`clqMj$9La&7FabNt$kTos?zvGacoTP=*cPu4aQyptTDqO{t zm7{v!j?5}wfq)lM;J|Rp9t+aOSx~E+ed{O|m2ORWz>rC-M|e7w@3(V4BPXu|OYpJi zobA(o=!-#tH-m{6ZZqU-l2nr0$C5G3GK5HMktbvpZ=GcCX?eZ7IIcq?00d4)^Ahlj z*)yJ-sy^uc9Gg*mi)HZmMC;v9_9USSDKvsreCHT`MUxW`;h^#O-Ho86E?-^st9ujNj&Gky zE2tbe@&=UN%=Oc%KQ~AL9SI`%at9J^OJLz+QsAiml&TKA^cE%58g_@1wCJIifhpux z*B~Ui(#qQ$w{Am-P{FIDYx(`j#9QD+SH6hjXaMtPq?Q-slP*I%xjHR;QJ7Z?yl7vP zFN&r9tY13d88e-BM?!Yv6-{X@57kFLo(h-4#=fWyA&kOnl9&Qcv~9z0oLJhr#Yydb zhFiDlI7lNH_>nxMGs;6;m&OJ%=_K!rD2hGEWGt%1uenByYq%!TWC60A68EZio};w=?QAx5m2*i6o^SV~UWFngO^)Wvn{IG#8k~ zHE*Spu3+)K+VK%!_dp+&;L*_9ME3{TExA^);5<4Z6+Y3!%ea}JxtDGAwIwO=L-E4S zqkCieg#6TJr!ZW08Xk}==AEw@g4V9hdlG zp}BD=C(T(S!0X+W<-2z(6jqBPg~cg#dyoA8wS$Ei) zc9I~vbrNkR)9#q@-Isx^K;K?15}SKD`@^FP;$gj5gRBY%iAF>>7lfl7}HU!nNQ=^TsPri~Ze)2Rc9yE84`snpE$v2koEc zp5Wvt!(w_iPP8(IE+Q~DH6In?oab^*wG)sV^eLKOhmDuoFZ8r!G_Rgra*seLKyg17 znpa5Eem)Ac1YDiIC~va2FNjZLAjhlXeCtcM5N<`%`m#96Y}}8ZJ!qA^O8p64yjjvNiVNZ2v>@M?VN(`5v(>OK6L+0^6~IfSDklT*B)l0SW1toHQ^=H6rajE4~2iaOnG z;W@EVJz~gOfvomWkBcR)+&kXs+APSWijct5m zLN|aJe4C#?07un3oTq=lfXk^*11Z$E_r%~~ZT{?y0Ere=y<3MSQzf1vMMV#NSmKpt z^vl(arq`O8xK|x|15o|7pEI95fuXukPx`bHR&hjrx!GLSY4Qj9@A9m^6*n#>M^qkd zw&997#dYE%Fdtm>n9&Z@M27VT{X_udsdw)h_e|V*(KjPnsh2i!ny26o`D{`kotNVzSR1|KrW`s)0t-Tg1Rr=?ALk4ne*S7^)v8Heiqy076plune zC1epoe(`|Xq94#$(b`&T_2DeTgZ1BdZ!I;qJfiA{a(gNu)>f*|U7X0t^r#-(QoOm5 zV&p7`2hIAfq0{ERO3R>qq+qe{^W(KCF$Qxx@O4XG) zRXxMp6F(k1^ln~cCAvi|TPMz`m zok6g#map4aZagY4MBOnc->kk%gL+)*5~W+tZ6q=hXH&a;>IXcT)V(ny=}sv$G~{2} zsvNxxWu63D3~>8j+U`hj2>CPetXHGu77{2>Mon)8gn5al9Tipip%cPvMB+yF-Q~0* zrNwVhQ-^1OCB3Cm3Rg6oU2xDWKI#?|$RG@}&> zf2T+AzR#B%hq4rNDEA!Kdo{>23JB@I$sxWE z`s}Vn9?e8ejT0-JBNoVSG$&6J(#|D^omPDa=jS`n6EtE7x=wwfOjXHm%Z?osh=}jC zAQj2}-N9pSpOc)(O@(D?e}+H|v9je%qb(S)a#cI{ zu6#ICj#>$}(X`M3v$@e2@gqgu%iKx~U*D6mYiPfa45#oz0clq*t3;6V=64PK#?wOU zFrp(KkE=}Kz;zvl%Dwce`1BhV479L#&CF%4G53a>3Dmfdb5>d!j_U-=Qdpc=5I7` z)7*H%gpbI%iqHip4ffoVCNIPW0#O(6U@tGOZhkKJA0_y)x~9t+8gXx4;R|O{2p0SY2osgBT5*YEU{tgoE;fHjooN zB+kCbPB>5XQ4>qI@FbiC6jKPlh&T?0td2Fmgsd9XfW?J&9!|j5Xon7V+aRkcv>>O$ z^N4ZBQ$efBHF(0>{-Kmywd4BwY0@OzMBM)H`V@S36pb37KWd*m6w85?1F!AuGvO@? zYa*~-S6K*)*WML-9wZo16TOaPnGzPyFMd6Cgk%3vMh9;l`JG(LDMPIh3~~csD8anZ zpFayxKVI^$sI&gv)s$ZMjj1^d* zfsa3an2!KKKE1F>&wE*y)L8I=j{S4!RjLgg&fp$V@LX_y3`WLC+gnBa`=1nqO3mwt z%@;qsSS1xd@m$CMxgR8Sh-8NpN(OyApNRP}0*3>%Y4*huXK3@Mu^6TW+j$CtNtg;d znF1oFh_xMqKTo=~3Nd=XqwtUF`!_dwmW7PvB z9K7dSj-!DkI{6jQkK&$mLp2=-)^)zODt0OI>rR^b`zcD^|M%)qL!ZlOcmC5KvT^>= z&0DT-Du!xadsV)AxF-l7uOW`P%t;|_jY~TxE$=LE6flItGCWGcaHR@+&PuL-r zqew$-KFsn**-(7bvU8$C>?f{E`|nL+d1eH!QETg9r1RMYbTAEPMsKJOx`G@QuZpTf z`drqU#4~ouOk1a^Fov`b`VR!HL{ByHqMcR_!HoHu#L%VOPd6keL|oIC3sYV;Z5^?Eij2YZPU%hcCErTA_K11w9hn^H|uY@za)!&r7z_> zZOasnZCSekS-atW>Sqebg0aGO@+o-yW3N*`qCNl24Xs|5QX$M414 z=JS4GsW+?9^I#F8-a`DCrv25JTx z>1|`5P8EDltk$COlA)j2W#Zq9L9fs297G<2Sn!bwcJtNbtoU=hcO>vGd6=yx+|i)z z2Fnxe2H`kAb|m!K<^K}!u6-vwjCAqh>UyK%H=&GkIQUcY_V}DQHL))%f=0uix66#@ zR%sDu!(MLrY!~z4##v{#&U7nwO2)6G+btW>jmM1dR5l;&*GW-PQ!l-DuBk=lCr-$p zN#|)@rwRB@xayP=wK<#@RSfgF4tnsG$U3~`1H&c*NNAKSSBuyuoId;NqqmM&RD2gD zsK1+}(h^0v;?ODnBE=g1K#uhN0 zN_@QJL6>nZUo{*p+)Q=<-3R7IG2zf651ITn4Y>l3=GDcl*+G{eV9PylhuqjBpFJoH zDr2cx-tFy!scGzMGWFlFx(=_4P!TDj=@0HGYp7r}u2Icupocqs`81F|G z=)40+KTS_?YXa_I1MG4LIv4LI#6Nyt{hG?eEJ2{wFCN$-7J)zmLdjIbY`KWrY+W!n zc}@?8sA(iP@tEi+NWx5DHxZbx_q8sh4$NvY<=+gBej>J;sLNXmmOm$Vz)%*xj_g_2 zkxiP|n)#6Bm@ko&b(GCtoK+q9XtdI1X(8q-qv8yWhzDL5?}pIFrq5+9=R$s*k+*cVGZab`y>{W&q54$V&e-AY(P{zlAk}H{ACD zgMDg3K4OsCDm(J|Wu%kh9N%j#Z*_^~NSB=}%UU?lrOerXl=@VSb~}}F$ij{;V+6#& z;w2YSelawFUo3rV8mNf$Epp@n6_LPkVos7mcD`S(}mveGvZ?o-3Ke*2C z7>nR(VPv?%mGLoz${e^g-V4eDxU>!a;oY)@dhpW3lRnNb1-$ex1iT*C3RA=y>I8B1 zgp=u1xhE0jm%?wn@Y`Fi68o&F1JMbq%9 z^}r^appRa`1z|Y)VAoGaRlxn}NIk&~n-jttu*fCVSH;?WMG!SdAcm1$a2{3|)BnXH;H1s&vH zr4uVe3gUDAt(i-QB_J2zadK8Vi4H`4o4EMpeqQial=e79d!Cf*$u}UaoHVR4uf#ID=vmPL;GJpL@S`bG{@CZ)I5UQ23PjIx@Z%jz4v_ z`_=-Pc78KTW3bR1FPnrLyHL^B`+>k8@NBgeBPE~{njpcz3*1)``y1*J6T-;`Rss7H z{cZzAkleiJ^G1Yc#fB&belrI@(+!&3PW-)<7&m{GPU7p-+QFzn3BS*`sWNTd<_{*| zp$EV?lv-vQvaqdOkKu7C_4h*BHaVO!aj}2MOjGj=l z_9y;vH(P*Awz_!LLM!$C`?%~=dMdq9*IHRMf%i=Xa=Jwu<8uAstXsCdjlc>rvu|%{ z)hoOF)*!jw%ld~tpHZ#%ZLdP93CI%#-2h#qIt@4Gde~`Zyc$Cfc|y&9Wtwy@m zA>!9kB$9RkM&bG;1fO_^ZYBCy&NQ!9tepwM4W(t-_1_YDzgn9UP2}hs{?Iz@(hZe- zYtuKT8#+c@tf$o1v<UBM^) z8bx{(6Ly)lP2}FXPEOU7)@oMX-ilg1cw<7Hx+o!&H=vejH{!{I=Zah}$@H^crn=`* zM`u(wi*@##l$kpFM)+OrZ@|=-(onbiEdo_!9yt}A9_hZ*H}AxWF%_r-_n56CH;Ydo z#I|6OiOCQ_imT#m_y~S!L=txzYx8ibk7y%RRJ@cmPc;p|iXNH*!OR19m+HX+We$Rb zKaSD64q)>^D*&TLjBd?`y+MU~pbs_Hk%Ug7ZmXREC)=TT)x|!j)x##P-PH+rLg>j# zZN0vz&47lOTk}_XWG&d!xxT}*zz0R_Hn-|3PF}I|?{$r9yh{dsKwaa?IU)ZD?rF~j zv7RVS031yQjJc#~T8W05foj2OR31(9Q_ZLXAMGFrcNNcB5}-KLyuis2#j=Fu$VpTi zJc&-t6aS;I@wI9>+kmpC-~+y1w`#Sb~~dhvRm4)j-If^^EnGBXL(1Czh2soz2m} zNxR5t)&;(1j#)7sxQ-+XxI*?p_}smKJ&|q>)RDv2b;O}Q-Uor^@Vu%(YdmrHryDH^h5YcL z;E8U!DY_cbT3iwZ%M8e(#-5MWw<~1cZ(1F`>of>|8Tn;HX?fkl^6C zk=Gg`8_3Kqa)t18@<7p*9b2?we^Ui*dUV+ihgF+Jx+Z>_hL`+LzmERXd7%|gp8cAy z_UuC1@+tWcNpmxS_d3jU9m;&DIe43gxeok$lKXbXQH(`Lpf294S@lV{GCE!O^_8i; zt7vYm3jq%RJ?cq_0b9f{qxHm$B`$ysf7VR7sd7;pUeS+gYWMx(EDD z_9Ll}DFF?ljiB=jfq#?h0xB>HQ=B~?=76-pOGZrj6)+S*FyU5{^aNsAy?F5#z+Y?x z|EL`RUxAl?_6>NLuYbz=zf4F#N&Qi2`1!5>RsjIM6(dA|UsMOC_D88Ci-nNa3Lv%y z`wqjIM2SZw8IJlDUff*R58v?}GGMqe?)Vw~(-Z{G3-HQsK)3#Xu~A=)SGmiXXce-$ zuOfxr>U6z1UPIT1041C(9%eD|@>tNY?&_E;p{Ajyk-0hHh&25Fg{DgV1Q9Z$l9%Od4l>26vJ z+%_=a(Yku#$E#$HMTQ-OtE<~(sNx$rBHQKW5DQo#7bI`Gfh7iCIfpn_Te0+gNeuib zdJ9uUe={7?b$D&GW5B!pC6T@j<~070d-w=TDyX(3y|rIu^WzMa?rCY^y|Xcz0rvN9CF85K1Er!h2cKW0?Xkr9RgckSt~MP8 zXqGU!gw$1PhTfES*k7!nbLO^x75_1pmEd*gw182SP&@m^pxKx)S7?pc$`qglg|Y!H znDdtw6c=N~pBkrNO%V1?jz9d={!|W4^Qiv#ro>p}Xx)T+$RY#N*UFhR-+SI7ZX2X` zI!&=8yoE@0v4d{i{&aoqxp>Aka5pR~>@7~e_SgN|1Fd-Pc0u(QoAb;j3>}V-gm-wu z*4nJK*WRn9s?HoK6`Wglnmeb;C&+mv{q50Rx(Kt1C1TKk-ljsLsS%gpT*Z##Z6CQ? z1(V8muJcKY`Ql}`);(&^ID$Lkno*5%7+TxttJ+%kFz2*Q&Ghtc zMY`3DHyX%VHSoiqx3whV2sgYJctD)7 z7yAL@wp~^yNUn0!CZGza6)=l@yHjZe>Ry6W$yQp;)nbGQ4h4DQcM}1A%t`Tf?2#3v z=1_|N{BSMrObKFEytECZ!+`GYswlIurjQaQwO|VARK1|Y1MZ5Dg*B8tJu1=;X8fSt zveu$7fhEH3+$w|jJ~YoAXYN@De!ur9r#IuqFrJi!Sz}wOlm`f72Ot)`$*AQ9zgJ8) zJ-D?~;|?=cIiJb=io8MPvk84|uFQmRJo6;>p_fl)>gZs_PxYV!9GkHB(qm;d#$0?x z`PSl)9NB`zoZW9J9ZDpy_8akoSnWSdS-WAw{BzK(DA_-Eh&9*@v=iT*;WeqHZLK7z zgRWsr1;hGtVi2ut!k<%r6~hY_x@aXKUBl@ zqL2?~QZ$cRAJ;=^YD!Pg{mhn+mvL|5b27P(s#2{HKkf*j4@Q5BhvRKQ;jRB6og&t$8*e|{CY>GAB3 zG{Mg&ZwO#ko(<bV^##{QjMf~Va7L*AQ*L*4&x|4N8LS&NCvR`z|#ASn{kYTsqwO&EK~ zzD9{?WGR*GgzP(^A=&qJlx>FW+x?o+zI{I5@BO>~`W@GCT}M}?%)H+-^E#jBc|M-P zIj4DFS4@trztpza*0$TMeO{R^baA{dLTqDsaab(l;Gq?`-E}SHo|jLI@qFO#bPGf~ z*3|~vyin##)Lr(v?zJ}lbckT0g5DOJdnB zdbvxfi7B2lC5sjNcfiNejO&%wS&n@B%tEqi+JN}yUTN`oVTeFGDJ1fH@nf>st zT*k7oW+I!7Ci4CTS`o;4F4Kx9D|{B?Be2btkrB~68o$~CQK)hbXgU3=WpsvVukArL z?Yf=!j8APe0PKwo3wsOc44n4fE&o=tAMty#FaTYAf z0Z%;oS1UHREV3svxHtm4AT-G1(Po(TjKpY=5dNum2Xq9$ok_;haMv^xhOUB#Y z=-$@;wN>s>3bTmdROJ=*RApR5V=L&Ts_M#;}0PTmZ(2~tJN`x zWxnbA$sZpC_7!BTF*0wIWYUQ4;*UR<&V&Lp^N zu(JJ8nSebvKPZ#lb9Z@rYxY|Z9vTyKGzDxo+1ywN_PN2{$<#w+9_ueh1sy95=W_2o z@yEWUf*H+d-3e>G;4TvE*{FKChW18|pX|`IG3PBl!|HPRs`gD!yYLa_)E(O z!nqzfU32l7&osi09>D|ro0k6(}aPFBwEg%|ez z$>IF+j)FVO!$9imt4jEuiUa!N%g<6E4meCU$Et#Trs)NPZv-iYb>JfehfkWhgU2?j zjnf2QzaC2aaeX?|b1YP(VJz&J`0{(j?h06Edj|U%Dq(x#=&NAi2_jG;VcO9m zn?c7NsoCKo*D}d!m?vy_?ih3>v9BE1X9?vat*Aj)bgrk%Sn6EaN^A>UCPC7jj>Fpu zfy#cd!XobidE`S*(~v&6ZeM_V>~?W25C1uP&ApI?D6TPG&4o6NQGW0seX z`2GXl3n5!xEqtfQiM@M5FQFc&>R=9D-3>mD6cKNPUgw&MKBc@?;f22n@}a@>la7k6 zx*IF=30c!OHH|X+@G|ZhZS)2k^{#8!Pj>Ctb>l((Z>A?csBVuOqaI)qD2g#T;>qTzA3GHhPiTU2%WN@p$!pHW!l+$6bF;z zUY7~u_bV>NBr61_m zFs5sbA8ql3ZEcD4_jD;3XX2X{-@d?XopN_ocP8g*-l}eeG+9aM_}xQLdJhX?`)1DV zT48RJ7ZZm)S8ECTMunZv+Mdj8pcX)98X-|dJQ-KML_Sr5QPHjSn)>sY4==8N7QIR) zY3j=u@i8&13TFFcMA495hv&6s5N&BbBd!PEuUDof0;U#+@2zl|q znVyA?-kj3dhv?9X?`)+>EMZ-)nt0P1^Koc_DjFiUcC}6&BwP+@oG76(wS+cl#8tT9 zpRf_703lWM`4p*Dufz?9+yYLRFFa%Ua^+4Hp_@g!efpEoAYH2_5%7s<<_ym`MP@{h zwzu?ALKbwTA6B6T88tuBB!@h4hWvT(h-+rcEv;s>I)w!7u$b(cwp5gI3yP?q4nKk; zse1VQE&RS_2JWD0cuDB;1@BQ)oV+i12M_BDSsUd|t1(O~x|0ufbxKyu%bVM(eH>}i zTspnstVmH9HQws!cA3KR;9Y&Pk<`hu)3A=i68;}-%P&TV7!~lsb(3B8H(K(nok|QF zCetms8v+C7(DAVI4=a-JL(J-myOF2sv_8+096TNt@`uE$H}xCFMcI4x>f1ghVxFJ% z4muuLyrWyFFD9LTa_68%BHjEOd}RJZHwu$pwWd(9%+h1c!&fg^!lM)kN$-)5RDML* zc3?la^qxjs%ENDc(nH?+e6?+{Pl!8O%|^+swpB|Uv1{F7)-;N)A6C2Jrc%%|K2O#8 z&{OaoQgE5$Vdm%Ij@J}ei&iBNb?8{#5x(J6;!4U0M!5$5^;g1$53X9))ow=g$wE;w zo8~eWix+skDWfchX>57fCMjbmvAO3WFnt~_s-7h(+YTy{!e9w2j!6tok za~c?MAqT%2aNz%{Zk$8~zS(JsZ|hPQUvnV=~7YGr=3|CwGg)o7;7^0e?q>+ zK+X*wV)3sQ)#*TM&DKEaOK7?wsi^6gNaZgt;ph<5=B-N3kbsAR_5(d7DzCvCJvb7&s%br&#}s2ot%_ue)OO)$Fe*D`%8 z-=?!FG-b{->R3C~^2qD??iw_c2!F@Ll&g8aHRl68Sa0*GvzkwyKBK zj!=gZ(a6 zpo`SteOS7Yb{dT9#XoUaL(JXSv!3g9+wX=3?{5j%^@)&iS$%jC*r`I;kY4ZUB(rzlOFnr5vgR2bwb#|eT6#v#L^&Nj3AO=yS6fM^SK{N3n>0HkF+r>f0yqiW&QsIiHKR$-|jh)GSba^7k5aZBF5?#Tv~%X&aX zlELSOD}Ck%ub=Zn`AZ^8;2+;lBN>Cp;h3XseAsCZvBZC8sGaco(NF_X+%~-R{i=G4 zaiORg`9zIpjk*wo!jv+a6O}7%H`*W#ttVrr$nFrPPj%9wgmzuk1u`^0Vo-E9ikx5P zm=zkt@yOzQp4$BJ{G*mStZoCZAV>#sYN23_Lx=-|r-fbad%1$}bKX@TnQ{4rbPA*r z#}n@3Tp6}+h1A?zk9zDIKlxzn&2z|vMh)z|Jxvp#TV02$*tHIF>xqostm~S759HP> z(`zZM_NZqZ*5@d-Kb1jPkU@^XN3V~8!3rGxj7(x@{pr9ZwfF`DR7bXm?$S%uRa#Ya!Q0c39izLg@N6W?l%higvr^X)fy) zl@f07MhzFi9b@|G-;JFInO+Uy?!%X4OGEkZh*p+8JpruQAi{|Fn7aiZLb$R(JHWi_ zk*6v{T)RYJK4G96J-^A22RjtCkyn`;FG7V?vfM=~l9IPM=cmB4x9dub7RZnyYkf4W zTCJ1nAcRr<%GXX4(_jkva|F+OaB=JK?KiSNd7Y}MeaMi}#LROb4_eiDjs!$gf%)Br zwQ_vssrspAr95e=bVX`~Uy>tn!TVy{$^hnbhNcN42&J4!+YY1 z-gMe=EpyLkO&j0l!TDnbDE<3;YKU`a>m!v3VFW*FO&`K5@w6qzmf0;tOVnBx2<;05 z%9perJPl(nmP94Y#I(qZoPfkM*JB5ht}>}U@IC!3=xFQa31tv7NlG4_v`*RD%-0jx&t4$>u)5NBe=|YxY?6&f z;l~HLn|t~bo<6)#)KSqlhu*p^jgLTHu;MQ6AulHm+f|fxd2atFi_qqCeM8iB9 zdt(ZGK3wba;TUhQOu75ELnSuii_^n>K`*Rq_M`(6nlMt-Yia9iabIT6cGxyzz#5vm zDu#Vil#hV;Yumb!xX^O>$gs#qc1lB5jUU|-QX3I_k(m)Ju-<5yk|g>`_-G~Jh_QX3FT~Rq}Y6N|Fx9X{a3>DEE){EF{3_2nli^7v98Kr>{#vGV?(dUup z(zV!7oa+TLf?7+eq>i8wsxrvw7;n=T<4D zhALqRg(1MqUPUr&j(ciX!ld@aiGPdmR=@lK%lC?f4z&L-W>Q>UOJv{s|_5P5? zo155+_VrK44ITQ%;M`iCClYPe^ozS-?%8krsweoeA954qewa13QXe!HcN!A|32Sfz zCH?o-AW8if1BNR%IG&AP+4=dtRw;qACGf?Kr0WV+HZ}#c z{N)-vbVvvKvzFQyNsi$S@+(-{(pr#6O^SW&eo(^^8`-Sb{kt9)Lfm(oRVSOVU8^vV z{;Yy?A^im%V@Q=g^sa5b>Ww>fh++iuYoRlnJ$ui#jzzL}&VtF>3_-Dqfw0A@H@2dM z^#d}>j$D}6$NIi$wJ?RLvGlAJ_@@u2UE)s>G3Hf~H+;S#HzEdaM8{;4X43X?)dm|* z&G)XLWc9Kk&@OEyX>U%)bCiziSBHIyyIG76vw#OsYi?9}UGyMzw&*l9LNngfl9%BI z2gBKZ+Sf!06BXUqE`X`9TxNr)LPF0I=Sl@H*0;HCA-86gsP;QoV=j{9`5K3RCMwcd znKrgjpCrL(rL$wov-Z&84H0m4CB0b9eO2bI&B6C=o($feMv5BIkbH6|w46`j;W8%(gJahLdOYHy9oIJ4SyE&Q7u}0v}B1?T< z_QOwk)sp+0>V&nuq=j32HdM~>6H@SKi@Lh%7$Ruf|30j`0iq^SE*^dOVZ%x{D0TTn zpU$s6I&^VOf!X)A2*dxR*M-#?Vp1(k!iK}-)ZRVEl*Z7r=lbz(Qv}k)OEY-)Rb};cJFbUO#TkD(> zx|5I4cUMhQkZDNL&o`AR7`pP__I|;4sli+PU+vDDHRc1wrU}uSlUXbztgi=?TI!eb z$4}*IOcJH#tWK#P3CO4C5-ptPvyrDE8oNE@NPx6&>Bjko|0s7RwXU*DU*oizWNtVS zmUq=&w3aA?aJSnT36lDB(t|ONY>omyM%H_#`iZ$slIZ!g&Mf7PH?c(6-Xa(m*s3J- ze0a(4xku>Thq_e!9+^jO^6Ha5zuj1;G4TlpV{|5;u!UL&I;0&rdZ;?~q133?>buXehYp>RIB*$gj#U%Gd9)XEG~H!z+KSThrz4XvB} zqN2uLa!R^{FfVlaG7&L}u7iv%qH5n(yM`+W;t5!c$X;`TzLID)yNnIiYPi>8gSD7G zFM@L_wP}m?UKi{hJ~;7i>3ff}j%;y_#hICTv@a2-LP>4+*(62R4NXqkxP=0LbseYZ zg@Vm3o8@Aat~>y1o{rY#A8F|_4HB-@GB{G1@%3==Ii?{3TPXCQ}4v`WB`zoU(Qcl&bs=#&%ton!o0Z#54^?mQdu>o;~XB zmE&YDx45yhaHTPM*#D}s8B-9=?XG9()nX%z$Yt}T%YRelJz2-UPASzSWEc!WRL?Kg zbOt^4Z0s@`{bPdihE|&vQ__TzAV3QK>MVM{%xg;yz5aMopwrI258n0i+oLF=ftnN> zUz`Im%={tHQz5PYlgmh@dhxU2+x4H)kiU40&p${McH~rsUE%*^g%udfT%_5eP!!Lj zgqZVXKS{FJzeqCi3`{PBhxG7p(YVIiYHM~$GCs27TP9fuN=t5?FI~J=-5pu27r7zN z&Z5t_9jzJd*N|CT%Mo_u3) z=J;Wnm8V*-YvFr74+EcL_fNyVT&zT~HB9AKe*d>M%*!nQ7H4JGZ;U7YE57*6By`JC zwOj(RqD^(~L3=P{%nzEa>%Igc?$W#OqqPM-31u%uL$%Q{8+)Bjfw1;TKM=$@YPR;eY5c4BA^N8fR%X8hGEA*Q|}@LLX&(q zTZq*eyOQZP>982OP-Mt$u{lox*?bvzxqYm1R~$ zfKBlYm-h>32%Z*(_Da!19T#HyRocF!3m}Y#Rm=tQ@OLZpsT!?ZR}l+d_(bTj+F)9d z=GmC#vgP?9DgCar*Kc(S_GmFRE$7oV<$;q+bLP%i)*d)n+GQzmN<||>bM^O&`DB-U z5%&pVNzJ3uX>?Y=H1Zloi_7JmVKHPxh(rs?HuoZ7*SxKQT^}i``G0HX6$;@U20WPM zSSQzPMNQqfJ=V`$n%kb9zozowIfe#5VD^8iAELTKZIVZGK=}rJjm8A09)uytj!8ru zv&)w&0WM%CC6X&Kyr61u?8WueDZ3sn;)m!mTk(PRQ0T|}Ib9DH8n{*X&tWf>aG77;B#KbjHM{`FFq0dkvo(j~(*L znSD`C8&#fevN>e4>NNUMHv#UlQFC3~GaR~c&5m&d|rNN=KjK_!y;S z$X$c~8*}fi0z*d^#nG#|gO6IsJG8*u;0W!xs%8I#;%4s4S1n?6(j=%tX@sj#di&o8KY0J2$#sS`uH{Yqla%R7n<)L z*Dtd4?lEnhA+ox$Ikjd*F6u3E71(q&y{AEg==J1%wplNWypXhHLop!cpA_&hmO96~&LA0!lpoh-FHx0bNE156D^ zX30rE7HB~m{9OaR@ct=;Glu_pan2qsHqq3nqNPB@Mh&OS9A;4x>=2Oiyp61POv1Gy zz>2SurGaWTokBVZCpR{ixoB6XB$V};^#UUDogsXuohAQyw`Cvkw%tkurYvrI#{P4^ z#N#&D<{2QrB;W7KFQR)m`9*XXE5G=!RctseOCLdqtZ2NAPY5nEo;yBDQ9`3_zL@Lo zUCSGrBue*=uy=Ki(v`{(U-Kurj^AZoAz5N|TmQ$@H{K4T?C9_|nB@~-uRy(0yc?*F}B=Ia5i2w&Tl3Mgon1=J7g9j8gH|{h_KI) zPt>GOj4l6dB3eSPnz}tWe)@I%R}*pdh=D6FF2s3>;(Cu7Qv?0=#m}}`q2|mDekgEV zAxSqax>MZ;ntia?6p*hKO+#9m-;6Dg;u6TOHF1ES-nG1(;bfdM*R;D`L63W5s4SuY z52^2SgG}{Apv*ACm1E)ceDQn3<-9vbc(=DdrDYo6$8*c8gR-I0n{>(;c0aF*p?5xZKkvm7$7ws@esP`|ugArd zUU7?N^Z6xBl8UHY$|jmCW&tiZmvq|kWp3!ken+mo$Tof}jRe_@KYNKRd$Y&*Y{pM3 z@_K5(@b`zbkWKz?<(t9AR}2q$BL8Y4KEFhkZQ^IgRpvxUdGPxS1bqIf9f?)t-V7^U zF4xm{Pm|dPCzH0tvy#MLCAezuAwgmwj_-Vk4DICr+K_}}MI0BcX>R6? zsc>)H5GcDTlVEFg1TCQt+7sZm76z7l2ty)jQtxzX@tw%brkdY#rj|r~&kK`^WY0In znMU*;6y~8UvsMX1y?Gq;=mNHoc+)Id?r33`Xtputl_ZbR*A8=!cY0Cb-841>$h9*n z`vVk=1MpQ8xXn4L*H0CR?h6;2IWPr24u$cNJyV^xp6#obh@nUgH3HP`YD zdP>NQL@(FIe20#YdyG6<3o5QSM~bpLIpCwoML)BjC3#Tx=-GI^q4$TtL+`)*dn(nr z`|`?gCmr*GRYSb{#tXC-na)sKKDIpK231YNK~gw8#6N()p|FE+messj zpSN*~`9Wk%MEOMY(-R98V13WY`!7lZ4Q@sC|INd@85ozeg_`#s)@W3B*Liymt6Ve~ z5cmg}XgMhOBKd3b`7}r?t&iRHZExf|?bmd4314@tK_x`hNVt%DAJfOIrm8t8LR^ee z1bYi)lop{NZ~A&3q*H+=zjoU1YH?p4PA%@3(bn4*9^HP3U@2`Lb!!%FV`Zz;@3;Q= zqK*QK%Ztwv9bG z$LvcA3HQ{jqh6Mn^tuugz2~(hm+^Ih*GG^&_Io;me&zXSh5wg4pHLS{mYfH^>Q@wR zZFi9hw7yGG+iPNC(5U$(H0gt=R?8)R89A-7>T94$w^*55=Yl0?fYj3qIN3=a{QXSs z)#c!PAMya77N19ERg*DJ;9PyJ+KGMb>enDWk2v37q6%QdWOB)lU?2}|C-%_wvqK9; z;MQz{-0DRRv;gXX{b!L8y(ZShEB&54@8d;VwNckfhvdxo+YG-}~}3G0K-Z3J$2}B-%0)1h%mK zgZK07+;`qjc85)J&j)LGt)rpkQxMXBvfBY2?W7z6NrMQe&)>(2f8Iz_SgSn{Y1XZqrPgFdVy7^q;pu^uoTD-Z2ktkq43=n9?-P9 z`vNEqE_&p>CL=>tcjm{01z3|r$gx6rxa0C)rG4`&Wv3*(oFQ&f>zY)4@1l zhOHvnZPNW5RNeo3P?dM^*4Ln_()t*^jawIH%ynwl$OCQz-`}k~t*DIRxi?Ppr%zOS zt6=4AQ{_($H^2nKhHbG4w=W`bx6Ah1&jDTcQ*agMaK$rQ@gp|Ic|O7CO!yGR(<3l( z_}rf1BG0nfvZDy`Whc1U@=!{IVXReTn(ztG5++kumwye(Cul{NRGgT`aQN*P`klxXiMD zD{ zaZ}pgu*nj6?rSSI+c-*)|6;!snY(fON`_Y8H~1Z{I;s?i8lJ7R$-S7A!U5P8Q*8?{ zzGB(QhAI)Ol~%hWqbuv zeI{4^JFWAEhs)|qSkxgQ?Xc${M+<4z5IA>h7~ynRu+$1IH}}~5Wg#BGVlri9YGARL zv$GX-l**^Dpb{>&ub`6nQJ)a+T?VUsg@$41`0KX!vY|q4Vf(g-Qo>LcAEu2Na0UZF zN2(t)uAWi1Uh5QS`X~_RJorFC_-DIv*HxM_Z;kR3HyvR2;NbQsf12>tW&qkOE6W>p z9LoufeAXkUhv0ZN_WEx-lM0!DJ7Ra7IdcYe$WV z1sF1@_ZA9Pa}bK_{c0}_qk+9-k$BX{eWTJMA5F!ob|8SmuP%c7@V+d9ET1AQEcB1P zG^RiI(hU7Aa8Cz+TiL!+>E8a$&`eN|S7JnH5@E5Dp`p$z5in0C_k1X-*uL=>dlEC; zS<(JdT5x_fN5C*l2qMR-uutU|0%&*zTByL}?YspiBG+c}FWLgT?GvXh;+$L8M|=pV z{|o?)za!-e|2W3$^QXuO`CQgXsO~Xn{UG@*1+6YBFjS z_Qv%QS*HE~@yL#r*qBb65F7gKG7Hth;)!czWxBJ<96-bCv*32I;GZOd|H|br5&_?F z0bIKxr@|3vBUJj>U5>1^mO9vS$`!8mC>}Co$CPpt|2;8j?oqKvq;&f<19IJ4Y8)#5 ztP!$Vd++H1!e@7h;_4f9&~S4E6~X)~(E63f^)>Fs0?6Ml1=*isdy#OP!PAOm?BPGf z_M~tA^T0n0ZP!)~MscFF%tUyaQ%>#$6cNdc%-;OTA!?%A*aV=@`7+YjTpKBBL=)}S z^P^|&WAgv&;GR$)T(0l_CMKVPayDixVdCR_c6e@HxwQtv$gLB;U|Ep(h(+duhhz$GIM8ph;q9dRr?p zY@TG$l?qBMYwKGNZ3ovwV;tO=BA;99_JnLSIE7no^^H)X<~&w)=Uk@ZoSTOB z2g61`*>Mu5zJ2X+0c$ti@iP>SCfZRDt}Ijkv)$yAT1RHhH455QoG0((rgWXjs2%iu zY%vfr_w+;zU%bw(n^=%ZM5$=B8$T6ax9@GRMnm;;`?%B0sN$fvm412LgBg!xL01hO>`4*n-F@MybBo z{!1PZi$X}561#v54a1sCJl(&VOZyD%(yy^j)l>G&qZg;tTq8ze_y6nEPrK*GQ-3(x zIo16Y@HYv?Ad0*R_g~sPHK89-5)H!Vf#R4y@MQ-~*eF`gs;!`JmADq-T5+_f+%cfg;UbDv>5jS$BS6f>?BaKPu{ z06j(uoS~UayinF9(@o%<{h9|f;ALuH3ENTRQVv$5V)V{le6(x(>97a+_zQF&?xsC_ zYstK8QsH7r-vVU2j?-^HM}b&814j=RuiTFqSxZC;@aVkxyuRo^im&4)dmG#O{^<{( z2}a?SY{Qj_k1~|JkU^Gvm=#dai0~n*+w{#J!UPp;d2K?)sBmKPTdWV~)pZ_0&KhWn zXIb13)#5-HRy`!V(tFt>Bc&5jpg)CWXgGyp!N|&n7qVIwp~6dL%<|zf1y}Z$J6wys z=u(y=@nSllB#nj-j?xQ)7RNzepJDCDa$*#8a z_S%)DSQkr=)}lxUB?S<`^5?WD;O$(b6OYz&d;9YXM*tc?nu0!Ucv1_9ov4h*wm7n;I zkyTi}qkFhPbL}v9-||+_u!h&(>GYmWJ$Ei8=}G!De&^4Txd(&tf7CHT_`{XW_y|*L zwad25@AX9)I^bQ$;2EXkQKId28rIFuv$J}H;nxhR<8JYr2Dt4fzr50#h;{0TIDBs; z9lJx=;^9<$72w8H@kp32hi1m~>bI9!6ArmV>s>R&k*0x9-)R{s>z8jCE|bu+&xC-i z8JGM4b3je+ig!9LA6cxK250lTbnw-K@rSYsB(7lx7;}$85F7`sOH1BV&yAVz!7>Zp zsnCuTQDu=%DuG|NPDeu^(tyyhN9yAjLWez;(2;{y0)&nPw^AE_E0=04qQf=sS42mQ z;#CN#$zRH1-37?QM`9^Q(lM@ES!@^e)mh40vwVr1`{Yvf77j8yOMBg-vZZ{FG zRQJNq#Z~i!flZEv5S*jM7dj+DZ_k0vutS}mGdzi|f2r+v8`0B()}n;Ofu#k}Nr%8Y zw5AYZF=|iyBK_x-k<%IlK|?{ojCVh#F3{V2w{!%|f3|dB-u1uiS6JmM`Q6ePmjITI zk~d1tU`91hE3MnhOi%@4 z^g^7WlOda*?N^G20-7s;OCo zTUM`3#St82nWlv?vd_n@Edu!)C?UZp*|rK_K<+MaqJW|(n`e0$`yb6eB0}oZrW%Jc`d1>%e@g;kliz3*>XITywDygfiKzmZST(Hp28k-{GnbU*ic1Dh^n24< z7_k9;L!UL&sinQBr5aX#5Z%9(P?$xJ+*$>;IQ%HmeOxNc@+e|M7}IaHveQn6C`L_# zDXIw3++Zb)@y*zdRvk=aez-`g6m#8kVIHv?|*REwz8iAFh+s(>FqmDdTU#^i+(nL4*Z#|D`09?FGWhHM>_-;fiQT80xlz z$0_SDRLroZfL;76a186h^gnvxboUe4%i_9^0Flm*hDeEy4UK*xY2vH6~Pk0pGX@=GqJQw-* zT@d>C^$9Ci<}CU*^#|_ERDUtmkp_S>@z7rE~i) zzL89QuB9qx#xZE8rFSmfu^8MUh`bxng2*Bi`T)u=cjS5H`$GYK_)YkUhH6?Ns52_j z5m-M?_BjX1<-}d@z&3R?u;W)(2=1kocAt11bADNT6MCkT;Z|#Ss!8+H%kIZzlfVlz zQqS>{3RIU3bu#%c$4XM+X#61CHIPWL~eH{5SBXd-$vG2}_7wwt;Z=U}DIV9Mjfib6*VnJA3H1_Dl9KD|28!-O0RA zVb+HYId(;a9&1_NmpWUgTn9pYIgKq>Ma*`IlYmz?uP$uC$&CQC&>x<-#x~e_vm@R? zA4kyTF=k|t(4!SRGz+q2b%ur9HA@0}J`sSRlVan0N^B^ufBcR$l_kAv3AS4$f}o$d zV^xv%7;Zg-vIhLbn~l+rtsrvcx2&4`q|IMUSH{lY625kB!aPm!;`?*xe)~y8?yC45 zv3K04wd1PR7XlzBKL(7?a1!>6I5FVephZfU94Ilz_KJ46@n1gKYs%`?#{Bn z*xj=0V57Fq@%-gtTmkTFfD-%<@GA~f!sgvji74Ij<`M8G;Dlz<|3t7_)WKB6v}T>K znM>|Z|KG1q*tLKZ*dqHR60y-#aMO*uzs9@ozOj7lzulL|Wyz#uiK>koqJ6Ak?&?}x z8nM>l(gx4y!!wvZcWnv}9j$KQQ>=DK1S{UT}`L+{|JHl?rWNOgdx+6*@5 z%DDp-P9Fo3C`+xi1Gn+uLhcJ8-RwXb`jdIt$8!M*!T0>?|g(u)aCeVv1-ax|F1+6W~MJh5}WFim+UEKs^*^`V74IE;36_1M$U49 zXk-%{&rY{{+1;3|D=DN3z#yt%U1SK3M@pc7OG0-thI`qbRx>bq{oJ4}cAr6F57Up^ z48+zcs9sV(l?dcqghxI=PD3VQdb>IBEMXIf|sxe1+mUeBxUGpQXpDD<16)L8c)064<^1DrdR zi<+*@MJ>?bz)28J>wog%NoJXUXFjkz{A_bBVF+5f0(=ZtAP&#HFss z(;?3lElKE7?&bFkOlif@e%U20UiC0%Qgr5Y%s`C=RwFObmHyxxCaYSP?%jO_b_pVU zHui%!;4s^lHdaC~u8n2Q0@_$I*(%&F2 zgx|QmIYVke4a7?Er&Ly)d**4j>z*BYhIP;6_fdW!ItsS@4BekR6aI6o&(1bQe&)AW z-**itUv5B!un_rK0bUFM3Q+w(%aNHra-FoNL`|TW^)~4EIRhI{G@nS+Fi7|1HP-px z_V~4&HC6GYoCPL6G8Psf`daq%nr!H?j94WF`i}0~nld$Q!OhV3Ch@ASeNB~G|D-z_m5^)S?n$lpRvQ@N5qE& zspAb!fcOxSLKv2dkn23!{$70;q$^7 zys=rYp1IvO$aaoJJLK9!yJi6h_fw!wjqpdz;~#M2RK3ftM#@F6{{5XjQbzh!Fwr;T`tnYJbOnhk});wD|aTVG9@Yix*(QXY@1 z*o##xjQLgG#IyI6RAA)|KS90iIKlSAQnKZAS&pKS4kWByp8s&o5uiHf+H6l++t4P*+R@%h!xmP!JVEH-*YZ?~2ee>5O?NAKIs?~B$dHB-IR)uvky0{m zosA3I=g(3`t0l7jR(>bi;sL+36r#byKS8d(*XQ66^~ev9#cTz}`*q`3hW-vya9UgV zNTd~%Z;e^!)%`;8x3^bsO3mki_=ITXaep7;$*5}t#X*O!`Iu1qNC(wTri*-mtC*;U z26yl?K6Ja&Y@3pv>D^9GqyYA>`aB&hdAfE4L13bN%w{T!ya5 z%{wE@a!q!?YE*1nsL0|FlJskyZ5dVo#KX&59K6C|$+|hhle5S3KjiD$X&N)tUOG}r zavsN)sv8mG>?47$5CL=GDts=MmZt@48?9D@6Ecd2M-sMls1KLz6>g52#5)vVDBD_W zdKAJgADKrsikAJYTXnDLTenIB)6dusXF~TEhcOHshnkF&((k(siX}%sX!qb{P~x(R zeOk)BvO0Rr7bLxbOp&KBxko58^64o*z5Ff{{sh#i{uuDfY61aNhMSv=%Gz&?0?HilY1HJx3|&eNY+4i?pA=Be$l;{WU*|o)m{l+}lqDY-bv|ZJ7%= z55sTLib1>Td)Eqk2G`(1xUQQG7Y%KU(qc4j%>M{awvV&EaBpU9d3 zv9Y;9_Sj>-61n{`6bXz%LuIQv`t{Er+tm(RE<(eVN_phpkF|19RoOhg!5WF+F;k8q zrJ=xBJ-oCF2$LNx;_-}y&xL0cTg#yPFPm!R*iUosK1ooKoBt0?GyqU~43-@NOQ}k& zNL9!A!rhC#0`NJB`4e%~LyUvA)qcZb_C=O6FT+#XhgHCnR+O~Tv-isKY@gHZXDqJo zQSTmCv-PtS?wuk|kZ@hzTw81)wC?nzWK|p~Ex1FyEb{vG>#R`0?8me=9=f;9U(C+V zE}xrJoxT9Jvf>A%ACOPPuh29OB%L!*8mWh}RdU}JzA~v&B3Y@|b<*W_duNyNowyea zFcp>-!kwxkk&(!R31+>P4<>|Bc)p+t2zCjI$}TPNlfacFzp+R zI~aGyowm~O?O}vmx#vvskocRWDnN{fc#QY$_Qc$_!^VaRXSY2IClKYuYu!C@VQx#q z1G;6HcRbkL_8vbVUgjmxFRE80!G7YxmKYwg+)L2cj}}!oj$7(RVq7EX-mv_>zYQ?^ zr5^kzEJoS;pOcDv^*~Z_!Zp|VvsOvdYxnY#-PHa9KVvblYuxxxby`=<0!7v^#<`Pk zB9=`G^fj)_hnvq*t=<&pobBM z{lm<|k{^@r{z86S8|=GnU*B{lT6!qowm%Gn=`{;mXvn} zf2D*eD}jeq(KJtd$f^KbpmP}Ro=UxtMSZ36Gt*ntAxQA z4mICe>9xq@+c)1LG6aQ9HbYA$^J8n$zo2G7BOh3Il-i^&@6kNznzc5ywd7Twudk(x z6JIyjU5)-*OA4NU+Y_yJ{4QC^86H|SDkt@$qgsp_n%I;+*8_g@ z8QuilNI5_hKBm$8yzW_Xckk*si$88g-}UaqTAr<%k3CV1#(Qr9A11*yPJ|KSjx%a! zhq7oD)9I1=tm5=Xf^SDWdLD%%ECFl&=#P8Rn_~<~mG3uFcy-hTz5dI3vkl`x+*WkY z8=214(obt7&}P`Z@k@f;SF`Wb!@D-&VaH-dpJ(fJ9ha3)LIr)<9Y1?BHvWO>2m8_} z^0Hj8)=O9uF~RJ}UkB{Cw`{Mp08#K#nVPOoe*aZnyRj?yqyYUnCgOvQ!8$*kNeJxQ z#;%7aePjxN{B`JccJ!~XM$=al22t-#glkpfTH-Ar&S-U=uWRGfHb+2Qp^p6!X0UgU zPa@2MpIzn4n6^kBYIZr@;6JY``<}*u(YV97ap$0YHKC*$6}O?cP@H+G{tU zMC&x?^J-n`+skc7&K=%7krl?IBaN}#&*gP|?;JXlkvMp#Rv+x)C69Ao>QG%90~J)T zX5xUOov;MNPhpsLGsD-^7Yk&vzK+q#i9Tf_#J|!+4m}-a)hvD^-|kf4%H-p!@w5e? z>S__@hTcAYhFS9>k8$OVWI!6yEVr6VOgU4JpjvZpC#7R(6w4i9$k-3_p1)h z^>?hiF5}$_vD$y+(5mn7zWoi#n=!Em1CR2b3U4%wRAi0aC@O-P%r&2PTGAOvOPkJi zoc;7^ZeXB%$i(wqPbp)*g=)HX@uy@_?-+V~$rw2K#9O4U}l$9IFU2pM@=C0lRMzWK<`T)x32 z`X(}JJC{c*F?H&rx*~kxSwi>DDX~+Z2o8EBmckMi_rT2f`g-TsjZq?Yds{z-SW-0P zgAJ7J_Nz~W4ULdfhvr7vbCuDu&usD@FOwjcTI>9`rq5L^?9awjhM=a7?D5QdcaK?E z&i}A-3fEoK>g|OMLw32o;u6~Za5C>ZDDz;{s*k|d(z}fR!`oR$Mb))`A4KVrlvG5J zM!E(RkZ|a3kOqMvh8R*n0cq(TX{4oup{08W>CT}W5%WE$cRbI1-_P&)y=%SiTK=Id z=L~0`efGXS*Y|r}`*Gxo{Wu+h8;2-?lOST4Whj3Pm#%$&aPzLtO$6H(U37|a{JYSt zd&beWh1(b)_CnLB8+#7IT6=TbozPFdp>k-^vGh;sybLH^%J}(W3xbzkjBG8``!Qh* zW2|Y@7Br5Nt4+%+zZkn}GD6FIzdGE=mgPzVLBc*SX9qPU$ilvUko_XhusF@gm{lbV zo{%LMEk>@cS}oN*ws>RlRdu)Fb*B7>{tANSgWj(!o3HT^xPk7DU6W^}ew9FVlpbpW z<|Da{+^0Sa~$nCA{1RKft9_;}%R0%%>0l@pafFP0 zz7p>Ky?!|@(po+JN>z~XdfssHqdcjK*Q2S@ZB?{=ef(8w#ttCTAd!<@v_VW5;kFQb z#}=i{M~f@@_+|y)SYFg?TE_x%=ZPFn*TwZmh{!N(5z=X!d{^`e(O*)AUL#MKFDoNlm$w40pG%X(`8W2|YWOPwjk zl2F;d1JbJR-@#uI5FGO&Pn$epcP)ju2i57a9DDV#_e4a+UubQf_6)`1M0>J6Nh%?l zZaml9fDW!GcSAR78rNmV6(6-j!G2qa^hA?|+Gip@2_84Z)_H_-Ow~eF@e|^aaMq34 zci`61D-+(OqoZ9l?a9ZBiY#`7k=2t*T0OVBWS^Ewl`|*cc4nVejlwON*hvRuJ!^W& zisM}qFb#HtrqPg+U%Q}9aOyU(1GbnN#tbtR(H*umEjd5;U6yVxw?Nc@aT)VQRY$Yi za}>+fDoW0)AS}sNC}S`RO!JuW@QF1@=L{-zRdP7<&e)Lbhn#~d*^NE4&Na7z_Z9bO zdU9Q|^q6nG4uK7=o8e$Rba%B(654VqG6^zVdr@*^vS79%!t6V-6_!MsF`7qo>*vK= zp?`mcM!0uwC`w|k6^gRInA;wNT04HhUqnE{T%6}9JZjvk ztk8!8m3W0%=t$tfw?c^zX%7vFj?$+g0|HrTOhRj+p*S&G2CA;&ZC} z!=`S3a)_g%lG2E1(4!s5as7E`g8sz2XIQJGDJ}Zv)JP^8e~1wonE=|yM3GLghqLmC ztPpb_*AsiyRE6VI^kc4Oim!RZUNeLPX(l=75Et7NMcO~6xnSOtG?YG+j z9w#+?N1DdbzqEU6%eKr}T{Kyl{R?`E-Rp!yTCL{7ESVk6oxHQ;wLJ5>X78#e+%ya>Zvl8@@eCX{-nMA^KA>*9G$jXwF?eWzsqTl?xk1i&I1-oBv7eeOa%@dZy<+4V;s{8wBxZvfTYZV4Pj{LClfdu>! z?8wY5-Ni-l0Ow^?E^s)eI`-Im59g|m9jIEp!i4mo8fGPrZJw@U&xXQDv7`F!n<)ts zIo28Ey+UL3C-SU%wtKi#G$_XI0Jx2DO!9CH*;Ds%3ntZhc@X8R&pi_6^ zX9b!ofsclBrAlLd(HYs4^Y3A2R26ten=1uAJv3wmlp?LVE@*e5l0|s$^iSSX* zy^B8Vo&g2jQ0+KykeS*iJ*~kmFLY-vg`o|BH2(ZWjVkoZm*(=-y8_36_lKfhf092F zyzqAvxYk6@TQ+ixGJ{Y*vWzK;{Zg86|02~*%$XuHRp>y#u6lH@v-H*|(?@;7JV82( zI}gh75_IO)l|*Nf&mKe6G)u3ZxKR;;L5v3q%?e{)TRj@I)D2g9lb|9Bz44>SReQ8K z<_c;eEnwVK16Kq^=venCER$++$PoRxd=&5;*PMpT*Rrv<=DnH(%TYS7ng*m|xCg-p zId_L7)FBUV4?XV&F;A&#dwB#!D7A_&UeB;0EbgH3bS%qSAp=o@3B+5ZF1MJhS`12f zyv-N3tjxN#wPY5aT*f?LVKx(`y4<*d@hhtD#?4+IR`k- z=6nv#%%zm#$6nfAH^tp?cuK>g@DWz=Z}$|+$=fv=^|t2oZlv8HDcAMv4v~?_onJ+$ zK6!qufLyQsGP+2ZeoGPS83|ErBYNcO5rchTyDgK$| zRf=tP>S$EsJo{~o(|k;s2=)feNsw+&Q+W|gxjChKRfKP3<$h7flXh_aCg))zCNZw+ z6qb-?$FkbuxHx>(y?jzeIe3w4&~koCO3);3BAou>V@dT;rKWBD!fwVvd`Y!?=TsIY zvI3PP_SiD|Fg^Bo;S1Z~`tvWNcp=0#svO|0wovMc3HuTbn zgN8)A_L(`S92%~&#CXB3=R`4z4xR04hpT1SRV)KeNDYxjdeAZ|f35_1)+t#7D*2dxh8o|>pCuYOu=W*;^fEeMah z8>D6H9z-7*nKyQGnw(dV4(W`MfO|EC`0Zy_lh2_jlH+1Z7}wfparck=BVn^w=w}hn zX}T73%3h7hf!Dj2x5;VD3%J6gP_gU)By6+7SI;v-L%mG}wYGFsE+bT6lfAWspupd0 zH5h1Pt84FELZo=EQg@O|S@W-$@0xqr(1S#T97lw4iToj;qq!g*puYS=aDPklGEfR_ z!g)BCa}7v>H->Y7&L3bPGmxNA#F`%k>dY!2-f@1UPH??D`<&PX5a&#{dx1-~5M zDUC(nM9)_uhzUl)20o5bl#4xRcwYGNVRBdgR3qFZ%g(Ju!DI9FdxXH%&;j0DAW6ps zqU-~EBuNN74@8xq&40_%@|3#*$6HT=_uF3Nwa`hyln>_EGTb?3x>TvwBoy*>nJs?9 zEZo~*CgqgmWw}ys#Z``@^0Z{RsZ{wa<{$6I1nnqEH-GHE??;WWp`DfqPI$OP9%+qC zeV3lRW5m(iTLTluK0(d?#u~-Jo?~BQu7z(+T`qf)`dsxN8YqoUPGu%RXQul3ujcCa zob|Dh4$Yrh^P_#BV_J(-uyJ!r2 z+KzMHAG$u@uU^)$E_-EEv%jB!ns@F>RVmT^TA_iQsrfQM*RMVQ#=^{M?;2m9UG#n7 zF_VK`+zFN;?fIC`v4_GP>a6$x%ZX-=@XQrN__-86Gq|;Il)UwjDm|HS^(;BDNTRhW zmU`pG$U?Bj_)w|w<+=vDddRYs6?2!038{ z5m}V5(jobv>9KUfR6_9WH?uDd!|{XLlFDSYr98W@5mBW23)|Q(i ztI9!S@wpa?Eo}h7#l$9j;wrD$f+=^IC8_gEu=A~mFtx-RD)*NU&j$E5=cZ+?zt9mC zxau*n8Xv!=e!19vP&BQ67*OYkl^3C2mPhswl;)k=2&ZcY`1@mB6Z4jGp8t)CS_^@)*g z!y-@LH)6*OVZ3^FZg{g1^;)#^mF_iC-Mt4?QO^mhwv9F2R_iOZ@YWDukq1@xW9$pO z=yghzUYZKZz=|}+uD7e(Dvaaat9(?RE9-tanuwS<_DcHpIJM)@iM!5@`J01kgdr{4 z4Ur#;Ff*}Ucf8?$;GxQ9nKXHQ)Sj^S2qL97bj#SBuT-bP6WA1i;nR5$9(23BpfPY@ zQ$EEcNI80!BjqqTDcjuN&$cN z9f-_<$k7(V{;Kg_1ggkyKN#SLcnipMkKd{9L{B4KW^yA}hAEmAhMp!DfB#hgHGahO zEgPng#{8Q_Q7qQT6Jp`Ab{qgfsi!c2KnDX}9I;k6d+nSmYeGg5rHUPxDf*&8D6Db- z6A$P+vtHxz@P0DE8o5Vljp%~Zukf96?n!;UK!NHWsQEBO%tzSkllC~{&=d}^ierH$ zyD5TB5l-I24~VZyE^(+9@(vl}Rt5YPS$!5Ll`F>CQnb=p63K{8$P^(m58q=4z6+!S zd|DFt%#S}mFcfiUh(&oqM24!LB!BiUh*&T8Zn{9bbP$zA0I+LbMr%JI>E}|c)(Qok z7rpBks6cJ3KR9?_CMiXkj+c#J>1h?{(A6g8kz7yyXR!K#QZ(A2NrqSK8Ip^0?V>1X z22s#*Psmtf{GezW#z6-(6Ck3?xaQ|C^#fq$R96tGtc7t;FvbIhE~6bco9-w&e#WWI zaggj;^DXRX=}MOC#yrpY0}g#8rA-C-V_xXFGn`#g8u0aHRz>^RSd##miLQ!N%_rMQ z2`NB&NJ&YnkA}0P8MXI%yiI_HbOTeTxPz5R_Gsq34kkX8YlGzya?RhO+p&SOWZk?x z7UlJhKQM%UW2y_-a3JzV9 z*GPe_ubixBB^+5Nw9 zR(ij^;Av6>19MXE+t3%idKijf7AF|4n;23qM$`!_3PNg*lJWK-WY{eT`D&6AY9+sU zi}#sqYb`W@vRa-rpmOhW1TTYgAWoMhK%Qkq3bjtGo}Thg3bWEF z7Lb4Q9}svChDEUrzaP$aD>@tXQam2zFD9U z2#1y=vozR>=4sTo0ZCPno06;GbFg57wZM8j_X~vV!`|UF8lacCC?p#4*MS< z4*cT4ul*z%g)7(%D|-wj08KuIvcV0+&ek#EpPev}rPIe3grM4QaqN@(fXv^8@F>ys zwUY&P@9ds*&X<%>8@$H7@#z+aNvv%HIkkX7U9j9;aK?DaG7c|vr;tQ?hp&?AaW2M{ z|65G6oA`-ogYGi=T8aE;wH`w9BX(w2-Gxb|Ed!M+rxGR@<(e!Md9Sp_?Mo<$ zQI#MpGk&9QNnEc?9i9PVwS!17M5CxzB&=v_}0HzXKGN4o4KoWrw=%<)W;mNPr} zj+@sS_)C+bK%H4fwXV+lFRS7eS-*mYFk2l+ijP#s(c;mVSRip@F{2PQch9s3F%5=t zMQer=rIU6iUVdlO{TyT$qa~*jUWVFl6tK&?mzJslMAHTG0z&;)>4LEF9!fGn1DCbBhdJ zbLRcAU)$#E!sTK_q?}iO5t|D|)ve>1tlOlbcR?lz#zOPJ5~ImR7Op-7zDE-U??|jt z=P015I!d&UacpY7OmP3q$Nk9oD1)pCF$Xq_s+pC}6l}GRYRwL?Ov?(6Ya#v4{xocm zo(0_7WBeD`1J*K_H(cCFi3p1)xU^73u&B7G74sF5ugwE$Mw=a@aAq$DVP1_!PNyop z(LD6$SK{$k5*vFZ;*InUX$z98*-2bP7N!)_${+2>L^r|{7UZIhq!f3u85QWBjsjT# zcpG}^#cLFAUU0XI#3o2}@zOmSB~^I6k6S!x>{#Kcm{Z_A*QMf z%j$&(D!&|(jjO+NS`KYR@Pu;DKR}uVnjb=mDQP+UB-DMiaui2tPy_>t#}0i=6_QF8`>pFz6OL% z_3oSQ5H}CEXDAy=qCtqjtD=p{-}sE*qBFu{K@4O)auc{as=?elASVj|u`t=L-R5JH zB|Ok21tq;SX=;TsBpHhbgZr$J@v5c<`m$S84&)ER=-6DmS-rxOBFfVORuOBLcjN`s zwfS0`tw094IHyMs4gZX24pno@bDR^*af?7SwE7%Xf_Uhu$yn%@LZ{N`OEZtD_4;Pm zq(abBeUk)sH^|vrO-2k32k}16e%G=@@a#Rk!*mJJ2m>1TuMcAZeTl!0!Q#xT*aFSV z-&R99cUgpw;YQ_|29IFp#@QEKqvFp-_0n>AL!}Jz7Ksc-Z})&>cH=x)5W5s) z>Q~}dM0WHc--nAD8PSnJzo#G=Km{I<1m%Xr+vczFU0yM1l#sMHt|#++o3{(Xz1{gA z#Vgx8^T|rDEfm_J;sU>?`DPZJGK7a3I_Jt8}k zaUPN8|InY(;S};kmqRiawi;h6y35kQLhGEm#Gcx|7UEvPP9XERHmk?*Llho8ui*Sf z!WZ?j@jFYv?xXqh}tq|xGIB0#eKR7X7* z2{#V47EE{JyXPW;Wtc8ArhrtJ?1;sVu7Ia|Py>WC79l+AEh(xKwA8lcX+pby(v&e;B(xTKz^-5O9rf+G#?;n1$lj!p^28N)J3kH8w*L7rqV5{uX_z+vckKNE(L?C=wj&YHK6cSSDaRkgB5 zP;MfUA4HOSjt*3WpX%k{~N{M7eK^DbBC z^)H#?H=_8d!jxfU7-X4tLuVnrku0;SoF@~!0*w9Vwg}kg^VI$tEN&nb5xJgPaNlQ8 zBhvCyZ|N+3LD1pcMlq57rye08qqE3J9dY;N1e2Df<8nyd?#KzZFYN1k>79If&_OnL zdczsi?(MEYlkLGY<-&Ou!7C8->u!;ohf2ElXDU013bV6rWpTU7V?GZK1Go0r(3Bd= zfu%jd-yrFSmIN@#A^h1n?Jq?6O<@7@uxHniRQ6>wp!1&k!VnQWtDd~#L9=`pcx?yo48h#=^t<1u=d&S2 zXf@BRt*wb@g&&M$rU|s*@F^~PN29aP0f+pgX1n3WP0X*k9fY&jlsv;C>blGOv}Rub zt{{juU(dqw1nrO$8kVrXlAaw2QH(cwKb6U!v?hR2ZJ0RPn79(hF}onUz|*NMtP zr`|0jB^7>#%|5l}6QH*pDbf=UNd5EyG5Y3DvXQzw>K)R?&G|0YM5x^|1)~FMnDkgJ zU*m~~x!@OS%h^m0E3v|YUzz{+HXuTg*xiq-MnQSWu`F~uJyEGQZWM;KB2liZ?vq;$m@ zojAYnU}d6Y5|!pCuGwyojXP*)2z6r~qrSTCU5+AM}if7Co3zoE~KOEj-F2e2vQplr< zrfk>0zhMXFfh;f&WbB)=+5sX2FM5$=CfEoR{)J`C!&<1pf$s-@!QnP8vgsrpx_Kb> z*70W6Q0dj>M%d303Q# zS_?zn{~b*;*aaafvvM z>WtbhDaT2W6f+qW(OHJ>;Tj4mu}7DZluYaYh&W7lyB~%!(6KhH2|w%Tl@A4?`MeY} zPkNb+7qw0-oH;HjuW$dO6eYsm=~B-_gPXGQpwN{0@%+Hg1bt@N;oNL_Llo^M#lTP{ z&Aj{)!W~Py3d+7jdl}K*f%9QuSh;HH$K`*@<1hYbP;vh3-Xy?{wd=yI1mr>%j@M#r zQ+=*(RNcnF7ikE^3emDlDuQYO{T<|vc#hKjOg3I~xtdu}_N)G9=$Yc6;&KvuQ|(FW zXrDhgnR}KkXN&|CylyUre7BL9JbGH&XwSwH!;Qw5*HZ^LHV8+2IKc!GUHo^9D~_Wa zc(ZQ0Qp54`WLa8HfgCRP*S%Jpw&8&Cp(G8CFpo#nqlkPv2Nobq?zR9k-Je!nCf1O( z84mn|-rKU0IS>Hd2Qw=;ce8gKi#zMcc$t-k8I=6kq)eV^EXUWMI7#uczb*k71eMYFU};G|r%9 zPVgkETk&q+Qitn}^6qNQGjw>u`+IT`A3oF;%^=3ZQKz3tqS5GgMczA|z2#anw6(gU zLh$Z-&X|&BjMaaHB8I9nc^!Nze-FdMmla!rFsIdGfe8%9s(ZnM1$Bo@eECQ9Qm+7R)biDlZ$25vC>P-`T8j?VIs$-H z#uS`~UjIy;wV^TUWf^+1tc}2HL#+CjXKcTw+%B$jh3eW_yv|E1I@Xio;jNeqCQ^Fn z*AcvH^1*lM=u@yB^)f@rMrFq&+(6v~`czEfqxQfTGyPm)4`$!dHus4|WE>}_jl6mN z@N#jrMv^r-4PV02sA6^X7a`KVRB6UNHx2U27ZoEW#Xk*=EMH5it@TPq#5|?6s(1*} z?#c-oE&smC07vYtMu}|);zi9=+rFFkFn~oR3Nngq+@OBRC7fet!|izg+s6;aGwOzA zU&lZdQ~j%p0?V1CE}ba`fQM}fK?2g5L8A%K5nDwRy=q{<4#Z?iN$07&>HA86*Aa__ zxm+RS-m~ck6bX2Pyy%yPjKg&1V-09wx(GI17QgBj-6%<9GuQJYv*0gWqVHQG-de&SYk zwarNOr3=FJ0XuLzzzrq$D7?a}#Ui+*m!T^OY^%F@_h_&$>Fc*#|8GS06Hb2S|Nr!} zOJw`Ar~~}tFAh53XTQ(}VLBW|CuSr2W~A6NV%t}em_Ecp?RKLXw(XVWi@@MEdz;(W zt9GTfe+(TEB3ydaCZ$2vZ)u=Pn^wI9o@Qo&g7l)UHXTKDo(FczZ9!CN##wqFVhJ8A z=I@28BsN}*qk1O4JKsPD$yF&Ia6QcD=>^iEHH*k!vnK1(H40Nbho&MSZ6l79!|?d z5`dwPjCb_I&@CKC)(6W+(1Z~5P^KhS6&&vhnGut|on#{nbPDn8T7N>L+jl1O)L5JA zg+@LOWIw1|x;+9Ou;agQi&J}6qeweu>8JGKK=Tg zquS@#=C*A(lm17El_bd66GXQL0gzG+`c_6t(=R%;#y; zRf@0gpuN+%S9^Mgl<**x>VZl7D{l$z#*mX*QaThgWX|HdSNi(f0@C6k<1fgk#`Q}A{@2MTI`;$B*iYyiSU0tdsDgEV{29jB4S5^!Y zyBP-UI&ks_`^F=>*PkML$OhURwtnbWLk6vAM5e4nBXzz zOpAH8P47d(rE~hkl*J`!2a-wS z4_6I4^KvjomivK2eQYmXZqA}{E{vF11>zeqE*anwspy+~qek%(K5}H}P+g{l9&acC zdBGCkbKATi?*n{pxJ`5)r?c+Hn=p})C8g7nG6lQlp2p^ADBfjc0=Bm#E8P3OM{n=E zNR;N=GPR}B>V0_OCe8Yw_R&_ajHPXUvJEq^j-A$TVIs$~EYSzw$rIK;<)49dnd|Nkz;aRhSHRNv7r-(N`yT--mrv)lAZ-fk0!7_4$JQvC6gn8w zd8f_dW?vZxEJ{OhhCB?Nh2V|+-?;!e+`c^W9$2+p=RNn@K-)^34wYSG3hrRnUZ_xF z#@9#={@=<<&X;thC7{-v9wAPNp{VpMzT$$>BnQZu{-&nzL>^0LfM~q8k6k z?KfwbxO^?>t^CIYT#PS%c%gUEkQxB zc@A2$zSsPumMY@kBGf{w{^Ir{PU+u&fQ$1tkKRV{D4n=|W<`WvU&c#XzP7o3S;P)T zJr)waGC(JOqqY-9Rfn$K2~DthtO8igotg3Ad>F2K!$6J8{x&9Zgo{2^ybEm-OA)WJd_sVpy;Il87Cb8vVF@k%?6|spFz-tt9z&NOpv&{a-A3@BceX9<01pxd*M} z9{DTmu_>~jRV4c!|62NVfQe*9*ssvQRi+28*y*sstER$c?^m-O$hShXe!7xQYo)P~ zTNwsuFjHGH^O8GCmTd$zzMvR@f^1!^|6*N_&HuhI$G@><@W=Nc+?&zhz;XyhJU%w4U*t zX_-)Xv=tk$!1>MOnZt%J6W}J0G|z7Hd{Rp%Gtr1ibN!-EXh`srWJX!<*$-M`wO*Gw zla=eO=FdZ@%N8br(%Av4-HEMK=+NEX1`=s(mc$`eC79zaZo0u-{#9a<|}*oN)&z zR^pR>mEM5u2yu{=h9hDgPFhu=C1D+tmwuezlw`@AO%dy?dx7Sh%&2{Pkr|vCJCT_h z9(aum=;%&vVDnyT)m!SjLpX3Kmry(`sz~F@HG_Kr8{#@|jiPZ_6PH({ zOcej}fmX41bV|icY8Xpex#lXCOBTqvCn~}Q&g8hsG8G@n%i2+y+9XAx>Ll57a^+H$ z00Z9I4@>B}uUK-sj%P@P20fIInj+yxMszpDjDk@6N+QLZ1v^$|@Y}n-E>wE5%9E`o z5_hsnMEFOIg|ryLZ_s?L!EH*tbSaD?!QP3T)J<`BH3iakVP$fE?8N+G%}@f`30X@z z`Jo4H+Xo*W5p-G6j=DeJ(Y2#9r=3T<(%I`LV1=_g_(uY*2#*ZMk@JAs^NggnZ1wZV zxgO(*yT93Sz3ZA-GJ%B}Vwi*Ur|u*(Q|E18+_x`~jz3U0qr!OTYb_R;a4JvA5hQKw8GmNXz0DK_FJRLE?dl zK?Qp`54!Q8D=R~8%HT?d!Ph7kWt8?ck|^vy%6$Ni$%L;W64-U<`82b!QCIHsoyZX) zm9F>`NPpM8c^ z&M;U)DbCh=ao86lSz8Ap)I&1Hs5{Fg} zH_705GJp*9rb=g^-f~k!?_$4zj zoZE(FAefnir=KgA{zvry0TVn2UfR?F&7d<5Z;C)g(4FvoBb_l7kk02b=$;L5HJ-%j zASJ+tK{gNnpA{(?UON!Mh#_y$_b)q=j|Dovz)H zi=?!pQ8vy*h)Uo!Sf>0{{Ah{dy|i8TDY2@;WxQV|!6&f&Aw0){`vMQcgFFw@(Pw77 z9sDLf4q{O-cnD7eHw(gA?}C;)_I5xOH!D{W64ghTQ(ozC_y+aeyk}e0Z8u*cg7tBb zYDOuBk8LuZG*#2bHM-(YdaQqj-g&c01XmbhW_qCP9?U#vk$07QzEkPC@@;mYGHXWJ zQ}P|yKfOP_H2r`>G?q8pV*(E}DOOS8%r%A~e=f6=hvfaf1~=p&9mW8XNuCbUtT|+s z+%H%luD7qrR0j>h+qeam)+Ps?^fu6r3|ZL62ACV@J`DYev#8BL9!FF(*vRhua&mw ziJ+Hueu|Q@*zRweJ%0x*s=j6d2kBPV!^&WdbM*?mm=m5eLq9$XyK}uZXsPt2b7bOu zO6ZvUc8sRbx?|}Vqsfxl5z)!u!i_=iLF!UhZ)f%wt~kvUI)!;~2h2^kETDw5{gE6^ z)kOzqSWy(`U&SY5sbe*xKZ{TGet#05_@sY|PcC$YQxZ&XY1?lcVEm;9s@w8f!JU6| z*sbeP;CCaK5!_4ggBNZ5AzCYujY5;E&bWYt5)70){IbF0sd!0UXh}&rKY=R7-x!S< zRftmN$%u#tBm|RG)SJ{*EN7rs5J=g-@EF>FDG6(-G|=-eDFKy{l;&mD`wIa zs+ykzP;*=*IIuGCE#gB%hof|n8~1XGM^pK=u=4ae7sHws9TD)p#d@V~blcZ;4BqT7 z6vx&W@4X_YdfYRu1QIUMZ+P!oydt738V0nCJN?Wn=axmv=sgwmq&+5O#UUVVFqVtp z7FnhRaqXJYhpgScK$LK2?x*hZbiyZ4Db|ZZ;Gb(c1oU*kqb8D1J8cQn+&t< zcJbdBD+2YW%PA(^xax#+>lYDi>|qvPBIBP+qXw}5zBFoEjJ7f|nU}3{b3gwUFM;|$ zX-%>Af}VSCekbcjl;*ebtr3blb`xYoWDAW?PwT56kadexHh|1BBSwx0YVqcY-OWaQG3!Qbj;RT!qmaUfFuQ+tz;U@xuW&`K>6@T?JK_)6 zX09TSA-1h80@Y zpXoT@3O(hTdZZ3$}{o@H9((;?lh@Jx{ zYY#aH2yxDybrhFNRM<`TtRe`i?k9`4R8)Q|duEa<5wJDqSxaAcmR|DT*D`U8A@u)T z%jD3{^bb;##7w=Xnvi1W-8TOJ;Je$u+BaQ#zdun+9!E6{Rbq$uN0q6b$XpRWL2|#! z0^B2LOeu7y#k-UX@AhP2-#BXRZG4 ziin1`Yy)z^K-o)Asj#wVF?)7pc-!>?oaSs1ML!$LhEdh4?limy;SHUhSl|E2h*v20 zOK$Q3%(zgQ_+%1vuIWa>13H@Up&Bq69kTb{o_g57anzyi@!vOscy2GvofB{8ra{d5 zO)pl}XJp?*$fxQ^F-+s}TjGL7GOr)T2rYf6JS$`R!R=lWP4>Bh7sUwGQyY`*eNcpwa% zb|Y-$VX_=i5lysEd9dE?u|Ie2l7)oC+!H$RJ?f;S{&jc1p!2yoEj%h@hHt-4^YLLj(fyB0;s(){AdgRS2j8bI zP$o6jNVwQR<4L{10U&K@W~`K#2jY~tXX49Ah3L6)7u7o(O}FWSbXc)$KHQDn(?qU@ z)!^{f(IW-S;oI+BJKku{sMlPHupebFjG;qrom)cI*1}4<4?zh&*=LXD(pbHq@$Jje zhmf46BA||sjfaC^m@XbXz3v8gp^-7Be7CBgL{L6QmX2ifn5!MJl#^udnwDcnv z6|bzaXfrnsn_=3K7IYNvx59bM92A8bu=D({ikhT={jb%ld|XK~H~zbolpfS3w+T`t zMZqKZ$&UQzQOY4kSe^^xb|(8VCS3ysl)|aN-zlN3Y_uFILOpP=cLd zF5xjo;tu!T7%t$BXonVieBJ+gEhA^BG;Y%O+tA>FohPy>M68x8ZN_(g+arn_zSQk*Z{N@V`y1{Ai0+bAWNu(#Fi+XoARHRtNHb?r&UB$82>CIj51_uX4s+6a6)Y^|$ z5X`R(>QBVDpIW0vAEUILk<*p5tiX8omQ;`4-d7Y64xb!MQF~h)mBf47P{_4Is zNC@Xxzz|j@vYXx%gK~C2&Zutlqf$n*lonNKI)VeIkR6#>y`V@xQ6Z2t zM~aUnQ?F=Hy1PSsPwE?r6baD(C@2H8JOXZbgWFekGYbsoOatdO-uhF!TKa+KC=N7h z$QB(O<0B0OF$5E_aEI&-8?<>r3l=OkBRRi5QE+5A{gmjpu5$w^01W7#+?NET@YO91 zThGTk-Jc^+QDPgq)ZS4W`2cHU25lJcp#v6!ezv;NvR=x;g=wBDr*Fcp|s(S-;N7 zv@2i7Cb7u^<3^nA=O0$cGm+!7r?j$Y$dQt<2E3TU2t_VwSo5}OVQbtdV^!ANntHhL z`On;!TM!E7hpFEzbn^JSb;y#!c`ek=u4xZza?2vg5BDko*8fK{XRZO`t+vVR7TXQF zR~()vcKoeMW!>pey~@}K2CF19!GD(*T}j>WZl6nSct524Czz(02l|^Rejm&a<`({u z#34r}3}w#XsUas8Tp^JiQ0=7mTq*&XF`ZCfn^l50XTsv*g96H6tTEf5`?sJ3H6-wy zKB4P3^$Ya5OS|uI)3u)&U3{a(;rR3n6pKMx=h@)6p0Lo$@V6Sq zs&7a#*8ny)N>9dl4TQ{uX6CCUxmYi&YFvT)xGYvQyj9}(XetC~zl2Nv(1*bfy<$_| zi!mNk-Z_W#SC5)gGpM9K#*o(U;iV(pP*!?;tGms$J1o^V%kx+GO0Xvxbs;j{g ziF7|+7yi9b(lB%RGtF8^Uj_IOo-@4Z$NHd|6%jQ0x#+#r8(D8>ZyY9{JfXNG2JTwT%&N;T*4FeM;JK_Zgv2ImH%lRNn6I&_PzZ9k6T!aZNee4FQ4@@*!Iqu=6 z5I8OizkGBU*73YDfzaxe*na`en%Dmd&hXk>l>^Zp38~^OW>V`~zpB#yMK^>4{lapl zveW~pe(Qblo)f-`zGQPz+j92t!Qot$kgr4UQFv99xb++UrpcmdJ%M~^F^cSjO%-$g zwD-H+$3*Y%#T-HlpQHCIKisrIn0{#CPxAiu?UVPnlQZvc`}N{az31nj@%x>>lu41cJN_s)P}m74P@Vm&|RJ!2uHZ&Ck3xF#Br?&5gev*XviXP`UQ6#XcQN;KxhaXCG9IG!3|STjtV7_ z7FGA^Ju+uemc7I~pg6JLnU`0N1wxzph)ALTwS3^fwd<7BvAl-F37@o5ZoVXemxIgG zAU_0c8thB_Zn_cVH3va#*?5LzPLZ*vSEQ{ZA8+q=GY0x=99ifiBrWEPpOkX>#VWlr*|G9_$-(abbDf^YTSM(4hp#MtnFX;~Tk+_mnE_ z{;@#nhd=t0RNhnBcY!R(S580QRV{DD|E)Ba8Um{IyO`$xFbAZ=fl73AK+peGF5-8U)}ftBp^4x~=ov z67#@gXI2M3cQFnd^r&XE$bm{foxCGB(BA~y=Y3MlpG11Bz)dTaDOtgi_dTEF2f6pP zNi{;6=>VBlowNq`cDas`&$8o(N4xVo%mkMz{q@S%YpK!}TxohK_JRyz@7e!lk>72h z;Cr_HAm8B{kiEx%(*Uj1q>JSpv9~64gh18=D(0V@)Y1_-SgUVuaAOFy7QxC$2zFWF zd=2MT@1R!xWpwo!2J=SqOCmF!(pCKwA7pre&`JZ#2`@YY;{!Uam&eh-8>P0!Lh((2cY-C%po{e0*blZ|I&OSngRxE(*N6N#E1{CXkD3~28ShV|_UkEUll z!S*v<5pVwh+*^uRNv1PdGd}5wI@PtzV-V|c1&E>j<=jg_*x#sv9vjRPi^J$b=u7@N zp_cGff{DO0CjAZW_x3Uho&OzNN+$&waY^*q8@5k>(y~CLRzCNxlps(+#>i^i+_v&BkSFbAk-}S4q3PK;AQR;gU=Uc8jtw}#~|Iegs++dLX zn7pv(&jHsYU7|VyXjH3y0zIc7pc2LHapP;6b#P=hQmj@9NXuS+@bEoVynWW)VE5n- z)fTY$!>UhTR`nCkP}NTJd@O`LUkYq?P33GV3PVZPZ-<3)~{N` znB0$8^3+6%fO+|KEfn7JXUs4cXibeh>`uzyWbp6v;8+HLz8D|9e_`_)pZ2UxxRCej z_p|qOW%!QAbsGK;=p<~=W98Cg4x5y(MO^?NKVd4w}+;0BlA7rVPCwKHK@ z%eknVl1j|Z1Cxl>Q&r(z?ZO}2PYzug=EE|OBs(G~R_Wk>;eh`eZpnW-;IXSC{*^oW z%xDG0J%nc$fM!95-dl!ZbNm;Ztn6_tXvudvbcq_M&dzHy;cw#AYpv-*CW6hHn@^ZM zr7|A6I%FtUcnl<6;t9KtLscSf<1Vj^+!ufWxuJ&Z@lq=zJzLpu(Y;Hg&o8C)CS*V|t#{BBnO|C{#( zA_X6(S($lvcDzk?N%DU7kw-RIJ;+yT+ZQHBmG0rkw{fwlUlzxT=0Y7;jjsH>9BP$T z$k1%LD-}sJxmBY#bv5xt;^#AzGFDHR?Mx;*csLM94$~gBdh;OGdHu;}pgfl1QyB?D z%~_=u25qNgE!`L6Q@LbUjCSi`d|GlT!Vh$pD#3P*nFZ7@x4Pq=i*cm5t%!SD)nyA| zuZ9-Q%_(e%_Tm<7e}}9&Cfk#Rmpv(nEC29iDL?>{KfwO(Eri}v9^#qEGQW0+Zp(_~ zQSd5F(&Za!{7=yR_JAMBq#dIb3_=@RY;Vvz?x4N>TvM~`M^zR&aiL`Z{6_zB1FqwU zMYlP6Yu(-dz0M{VNpqkVA?FF3HW{>GOffusf+xd!ssm@A5<55oH6I5G+iQMHdnlnv zaPjLB*mqr6S!jnz`3OEBVXWLI%yw z>Yv%anA?A^t9ymwJe49NBvYlV_DUllj&#;NUi)@95NeRuT6M4=-|J$$4WRI7fz$-& zW8+-@yMpKYrvDxipn&2~W)1AQN;uZh7@5*FAPpO94-apKdM{7YG`-PeX$pz-LYDL< za|*`5&+Y)x4}Kp1%SYrJ{Hs%>#T%yAjP2mgv^Uq22N7#lJl+dDN?Sxm*p7<}w*RrN zwQ}g0Gb=_sE6KrU&8XS}j??wCF7QKnm&cK*oSoZ`&R?_^|0jx#efBl6!{*P9qO7be z>y(DCZqks^oiFA={)aF&^Y`R3F`mMMRIZC((rBL&|E>Eo=+5=dtB_8r`TlkMXgd%w zIH#<&YBaX{FWmO_JbJWZQf|I;JA}tOkxcG0Mz3@fG%2H8MY>NNscOmg$EsnJl+O{y zG~|)4^W6IWzlmCvf`kx^!ow=uIX>Tgyt!7-xGA1o&nk=v)7)K+FilVO-+d3!-(Rds zy>w4a$tHzNEXPgwfA)P(y}PZ(?Fj^!YMf$NykfawGavt1icIxskd1;i+U%ZuM+azjElVK= z1jJHZji2`%YOj(JV_sqcmGw#1dc@r{2aCNZ3e&iIlV)wg67tnshC|dCx6m@~kP8H< z!#p)BpgI0(5I{UA=b!`bd3xRxITc(GQ@AK?{Cv@8RFOpVeEpRlKj;U;ia%%7z-G69 z03a(k4f;wAZZ{OC6zYqz_9`boS5wOm3WR_;y8As$I#o9v^$|z|1J$81G%pvM4{Bn? zsIQ`~8a*70J&tw`J;^#vE=nG9wOKzRcswJz*>VVg`}k!h!TuH$HX7#NpmWz?Vz@wf%YfGRKyklCkFypss~JUSndSW28CjE)Fu&6`Q(99_`TgR zw2gV&&c@!||VUoAXvhdc3fLke4+>#YoP&#yj|RN&)x90xO{bMw-V0(+Nj!kE2k@$9d+Tdc;NUGn z?r1_#BC_ffJa}Dp)5rO`gH60`kAY0!*&F5S2Hve^qkXx=C4PdVp1mV+cNJp6pI(c&_I zrhcc<%}}5Ttn)hBQ}f>qVMiVDCRca5mjJ`aaJuV(Q>uYdckZ;ajXhL%9}o}h;Dl1w zE2EK^oCy8&#apZ;f09}PFaC-Vg^UMcRNf4hOL@pd2=`E60bY6`KD>X{yll>qA%Em?OX*NB9`G!s_-!$)$m zR~Lpx%vehT2+PyKSRI%VqyvD{J#Bp)Bu(_h|B`}A@H^FHbtB8E(Z+*6z@S~DZlw0x zRC#<*m@b5$;iK)ifNXC}{~9u8OxZ9CLfn{IXs? zz8}1$t0vT1UcL4$rc{U^bA6haFRwx!+^Pn5g{>SWKjxta*(vIE7@~?ji)q z!#VkHWsjPuF~(kN=$4k2@c*g;z->WVW=3A@Gbmd5H8X!G?XG!u<}|RI zbRZ80fCEEP7e7~*_aVz=ca6-+{d`b6EvDNHt^`HA3PEnY16Zi`Z5&EwK_MHthwJ?k z$62Un;_|W9Lj9CKMvl*Q=9b6Oj66qB zBo|IIO5g0d$uAe%=FDbCUtZ1a(AgOy^|>}*U&JJChhxs|{8mJ<9!msST(~GFOKLr- z+}PGIvc5E*{djxTufF>Q&|5+RPumUeW-H23=m|`1Wm+~SF?b>cfxKwfF`hdiYbrVc z7#^dOh!g1&E6EBFJM0ou5O$~${dm7W6JY2tX(_&UuQ+kl#zy9Gf&jTnKGycyKG-g4 zsLkgNP`5k1v#@YQhK2mrypF#3^ry0;j1g@m-=XaTzY95OPU*Cmq$bGw^`q|#@jjA> z>#Z^cl-vXYK+T!`)FJz&lQM&$5eU}`aN?4uWX;{*S?>1-cajSX6ZZ_mPF~KxZWQHs zwo)RYE1J=`*S-ir|`Kb?_Ms`7IMyu4*N%zVdHb8>+}nYHwspF1K>!j^8wwvB#K zZpBnX;TTx{WB>=lM~=wj0Y3sV;YBu_m16zwZ1Ln+w>81`g|BhZ0evV631Y7HP~SSF z!I?&IGl*$U)OlGYw3W-?QNd+sX$7S@+AV}a{;ic{Szt3(!1T%<4_bB$mQP-m0iEX!a3i*h0h)o0t5!hHivICl<$dWTkq>v5tWe6&p}RlUi{f@m7#Z{rtY(v zMZWK&qT5f3k~M9!`(kraOtiA%j(=lQf2%_cSR5c}puA7uUhur_#*B9_258LnWzSQpSGB2t3{>C9$9g z?9n~bss``{Zvb0}9$kR11CJofgR#l2h6;OzNsZ|8Ij5S>K#k;4W4p+Ao&a+yT_ab@Y=p?=p3|Dq!t06X|05&GoEHqvc#h`LJ_>gpV;f zv-z+3>A#i7tCG@(k5f8-IkpoFBi`!?Ov{cVE~Ux<*ifK&dh}o;I;F1}j9+4^Cl@TA z!C3^nGdqRRVbyg>Bb}}M9PHIFXCVHuwxK{|_~S;>CD1XN*-LuU2sKTPu!M)UVHb;E z?=vv=vat@_JYl|!8Rim1e}r^>6ia)KNclz7ehdB=5~R0)3&!%ez6qX1>#KAh2d)kD zHMvH61P$EY$d_(6iFiw$5`nb@fFZWw>Sl(K>zUr1@_OXh7zZi=NzH|MGRd^K)rE&jLUbJOO;JC=@m>WuZ3>w?^@z^h{k z9y!jukmD=Y;+(JE$%um4jzkn^;h&eU9dFlDZ`~b~G_4UfkN?#CL?VrkuJaCN52!8& zuFg0G4OBgfrXP19_{YvRd+!(5bdafqq&vv*%`WKiUY9+EeMIrnR@LJAu7f#Z$H@}E zowV#hUR#&nx833L2e82WotKyQR})A5rF@4|?RS1mI;3vS_VMgD0e?4mww5ul?E9XCHdT(<1Zp|m|pSLnAL zkOv)j)dWW)cMTVXz3rE;n#vQV)G$WBS7Z%&3~FBP4<;dB^=APW+c)@%wI{Ip@L|Le zFPxfR_H8lF80f(EU4heoG`mE|j?h`2>^x@QJo_6=fMH9_I*k!=y(k1Pwq$$VOE?=g zmf|40QxV=yEL9TQZr9gSeVLONG3$E+EX<}3%~x;kacfGHmk@UIUBu~#w>s3l6a=q@n6WPlosnZRxQMrYeO(-*z1NQlZ#O=T09z&T;j?`UO7p3;-*+k5l#(hITd4u2J6tK9Y7OqxB~{?a||a9{$s& zPnD>%?7-SuFg=_RrQt;Zn;zj;&EWAkTpBRHmj+F(k<@xx{Qua5+ME?sS7eS;GC zjuCJydhjXT3%Dnh6DO!lbC1T6_BK@_(1l}oyG!P&=)s~F#h|>`+&ulrMelRjXBJjo z(3yy>0N3hz*9f9z>fZS8HGrYCUAEu?XUuxvkazkjZrmXDV38jbDT`F8yZ7)Pi-ci4 zBW1Pu3v7#o!UoPS+4_wIVh0vGrVLn+VUvyujo>-2Ma7ycj+Tn%$I>QWr7a#$Z@>CX z^5P*$0aB^z=^M}=oaENP^#X+p6X1^0he1tMR=b|4Myy;4=An{Q9?3dSWquNYV0dTA zg`M{>2$GlP!98D$x<%4t;8{nsmKPp*Al={zD+{wLpfy$q4n21)?Ib|Q$@A3zBxE!Y zj<{h(MDTUFR0aTz>}{fsmNK1tDb&N|tp@Fw&Uf!+$y`orzf-j@KU&C&$3!tMFhi-+ zsh5DFrmyD#Wel)@{m4PrPQ+2DL_%`?fPqgN{uFTHd!$wB(DHHHsg!O=IIy}Rm(%8H1&^wpX#&@Jf_{Ps6@PvNmQ zj@SNB>xeZV1Fpw!Ppj730$3H4cB9qgutbB7wh@)#W9Dw*Y#w)#)Y5sESO_0&E{5yB zu(EKZA^c+E`VAwwtO8k~Hwev0-1EC0Q>P{n#bDq}k-H^#xW@q(tvjw?I0yu+xz6d( zva{02G0D-6FdcYZk3DIE}uW9j1#vNUZrseC{rZ;z$J`0U&#&}HI#GjJyuQ*9#@B8ki*~; zZ}=3hw3F5x=+~n93aM`AcnT+Uz3IK3mT>T`fxl~a0TFnyKADNDuTIEb-55wM6q#+>gIiz^IIog@RD6PoNne50!N;h)) zC0EvwogGtz<7yIcM6N_9G!32{rE33mS}}K3_Kyr<_cUVpopnBVLKhs zlc`OLv{S2>01G5z7ecVKEhpa!bS2+kaCaz>huWQ~q*L75F|EO0G0+E*a2X6~90tm8 zT!!gp1AY|vp~jk-;y;GxSLBhwRH@6>X2T(C*x=j3mD>woFhZCiQmX$>yJO9onMu`V zz3J{m|I4Nw?TIC1DPb z|L`=LkS%2Kn+Ov8mGA1Uyvc*y4kIYJPxgZgeXTdNoNAZe;8&A9nrTE#B_fk;P)D7w zh<4t|83L-Of0$Ue%WJU z!6ng*-|ZWP_%zg6LbSSfmS7Nr^p{($c{ipI!oLg&Qk$r&6S4*nGYkxI%fHu*AZ}MP zdb|Ana58-#F1dTM-0hBYK|$wo*<%Kq;~3DysxG@%b-DAnKontkW3yd^Fx*4yj`c9H z^sQJWVdBP!%kh2&IEke9T|%SI6HTnA6pC_QzfyN3&ymnd8zW$}qW8FJvkU+D=9(2$ z))m)f~9;s${nU@<;5W2ls>XD~ou5Av;ef4gYr{CN$R71*4 z*G?bGa34^SyuLkEfNnEwc<}>M-R>}4YtMc0*F!1dkrJcwRrB;TGZqOS(hc7R@M8sC z=DwAdz(u1|Q13pya@s^j^kAe%vzQ@P?ntWhx54(l+MxGan`xJIP`S?e#cpi3t$v6jDK6WH^XmQHF;$ox7|u#lPdm&(G_1$WB3eKzMkdg;kSWu(~wikR9xeDTF5=hP=ucd^`pxw))^?y%^Z%xZsP!WX zH%7!+n}b)4CR_UzQ7gXSU98+{GR7MQ_FfEnly6bPn;SH{?%?2sE>B)_S0tBQIto_z z@Y~6Zuk~&3nUhs_l3ke!qj48>=s{eSuhsYLQ82|JcBE@(XOg%Dt{JD(DfxbTgAI*@ z@f+{=6-p`0yI4PRnq@BB>WPQRKJI56YkKB5YTQ}w=F#dn)PK(D%XojNOZdsXe#smo z>H#*}BlUhvtpxYxAIGBI^ZU2quE`q{dgh3?nl;l2O8#?^Pvxae)^VvyUV}-=4*hT9 z6^T~_mR|IG^E>{Mkzvps^H36jc6 zp0{R|5vGRPeFwb!ky;^CA3K+ksn>fsxRn1B8VsPKs&d|7Yu6gaH0EA|)dAG4)n2sE z-rKn-I;E{?Et8eG7ntoTq|-cpttpbZaE};Ys1Us`eGw>+{~=uKJ}B@*7`W^Z-ehIw#0OfZY`C1Ko=a5O9K0=0`Yh4 z-730HFci^liJvs7Xb<&%fGas%N9@{MGz%qM0AzAQu%|uyahgNL@IK?d!AUM}SSgPX zVWhloc_g=`?FYD^KpFcGgu#v6s4;X<#;m6c&>Bywz-t#ZatU( zn8#)DPl4P4Y-t818X4v!g2@XKn@R#y$-w2Ckq1)c?pSAS4eMSJvNFjbd`n z*XUq}%+dN>`anb~g~4V09e6JK?Zz66=~375QX!Dqo)P3u<=j_T<9#fCt46KDqr<7# zbB7n{f!-<^GH}|vqTqs7h+4VtQjxzImCn=D&$20z{ydPTq71t`)_8BxAmTGqU|Aud zxox!P)Y9bga1z|S6y@A)Jg6i-|V8KC$b{D{(X-ui@?^wZacjEM-d5yz**&5{iaGNtrjNA$O;jTcf z3&l7&^wa{Hsk@H1WaZIA!>+h;5WLqDcBI~}PiZKDhD3K7)&7AQePGZ9Ui_x&3H!n^ zYDhKzmK{C1lTm2&kK&R)LH*m3zYJYyoqP|T@z2Mk-9B4MrqibX^LB2m?Z9E!4mhXN z167}X^P;$-OveU}(FaqUKi~wXng{+59t`{-08{>xQ~^GGIQ{?Xoj)lb;G3!jz*;JD zcBG{ImE3z{cagY8CMlpGSyx}c5>vv@{Sxz92 z{pS8{jfnDy4W*5Uq_|`C36-p#FpXdM;r_3VTDwnA8)P(+=ifWj8}C!3=wRx9(h)~` zBGRN3R(7SGOrBI+_i~Z~VOVJg_#b)f^N=U^X008zTlZW1FQn|x>^Z-nT%82`IdHwd z9lPn3n4F;Gvw81n2qRhpU?w(iYs_xP*Rv=9L0XL@A%-D*KW&`toW33lR9tzS@bdI? zECCH95cWw*`!1>2x>jH0F18N#R>xs~jAy@)-~g90*%=J<-)-3^`IG(gO?RiNFtDDB zqir=x`viIg-%i7}$gM4EftT&ng?mUYujQO|6#SvmU5@Z^W4qbk)LJ$DwNrM53X(PA zuhN`H?6{n-HHc2j7u+p!3)Iqx=O!80m)s#DSWR#<4rQ6;FIqdteQI-Pq{NaW{NWy~ z-ZivZ{V9Q?rG|#J5K?Dn={7aBciuez{&0*tOcS)CwqKBA#>3V7i$_891rKr zh{d1$U)O~+Syj_x)t2muypQ_%Z0YSWBVxU`tec{5i|ZWgQ-n&&>OVM<^uwXnna>z` zf8pT+y<;QcX;%JBC|`fRGXB?C9f$Faz5Nv=N6G3)`7tbm-?{-ybmfWcohB=t<9qWu z_`Qw&X@8s#?Cy$Rt;frjtW-ixR(g$=(jF<*aHkMbIc){6d<$E-XC^**3q53WLmTNH56FeI}jUw}CjZ~WT84%l%gvkJ}AXb9JY>$Fn?@YmhK;sZS4;3wCa2Z$`wG?z);rB})i= zNI5e27)gFCJ-N62dgp^=WqwyIM0k{Fqy4L)zkiJQff%m?&1)$`^0cHHLmVrM=~F#_gU{_`RFUlA z_jTd!#F5gfM{`hP$&1Z{{fqO29XV<5i?m*iw zo7k!AtSKryZoruc^(@9gFSAoc`5Vr86JtdD_UCuTcgA*7$>gw9P>w%3xL{CZc5Lo3 z(kXn$#OmQXSiUVYp>UKO>dP97Rld%3t-wabp|iBZ@8mu{93AS|i%H$~@1UY0a{dHY zKX!BMwui6s_VBsqCwNZBr^vZ~L&bs@KHh`c1y?4NV&5(rL9q=Bm?)DV?IIDyP&`9a zp@6EJ)P`2?QhB0qVqawrO(=n&wEgCocpSYKmmA-sj5NbCW zQc~5I153gZQp@Xd*61>1Vyt(r-q@Kmz&AtkTRxnjZVNI33BGi{Bm}K-rx*hs=PkCFGm%GMOMoLW`6y>xfOwkcNGe76_b=3!QS z0ZF_Sxis56Js#&w@LyNTM30HUeO6avmRf*{vBygS@MknZ^=s)((b1)T>-x?W z*$S5qRvv#N9&J-Z@ty6Z*|0)^(Fz>`Z2c#gidKxm6Evf^@?q^l@HNxaAyZX3f^W|K zJ>_=`8u=Mdm*+G`!>SQ(xw~r%M(aNjMC~)v5J!m**b@7V)DAduYuC1UsS-4?7FXZD zQ>j(d?&q|<-W~;u(;P9pvh!-TT+Z}Hp_zz@#baULtE#k~`q>;EPWs6lbXE~7{dADE zT5G7?jj<#;DypC0pWqc7$w)f-Wncba#mBG4BkLsH#yAnb&nZ~BUP7)`w-0zRTo=C1 zj}B%oa~XLCRaZArLK_<^w2yvuin_-!TB;9$4P)7ns-zKkYCIu?-YKlJQlCF5lV3&$ zO80a+7vAlcv{46_FD~-US?X=!W0=c8a_v9Qt`?%AdJPHz(L{-&*Vr+eUwTby_dfO`aFOr~(s3GrOH_a$UP9Mj#Ug@5ytxeP%~}RT-SHh_SYTihFO9;<013l@Q4utlVUQt;_PV1kniEVKA&2k5$c`>XL5vXXJny z3n}bJI{~CS7|whNJlY_+`tbW*CvOE$zOg-`5q1z9p*H1UP)aJ{$6sx&A&yLNT&WDs z`F20$o9m;HPb;Trv$-4OabBPFcbhlu-M1FGEBca4R0mF-u|p0!wCjqWt4bpEl(cC_GGd3~Gk61O z;5s|`z;yXGcrw4}YA8JZW&YVuoz1s3P%>*n#ant8fv&d|Y-2fn%yv@iX#6j@= zYcBd9+k^F_S7*(%veZ?cc}v=tsYqrT=X0e;%6Q-xvS^K)%1uV^<_&2>ahFrGH=Gy2 z^gazSqbyWZx1cIeYSjIW<$`!p6MhcF%1A}^{D2EV&sv5${X?3jx1M-RtJ|`<_>z$2 zrV9REAA5QBtD~k1Efn&~$W?3=ST+6zI+F6DLMy%RwYvn`5!GrCG~29EU((M=u)){Opat zY!&5mdYGi9#6q1rUaAYia;!&ybT_KMplXEBM*x*_5q-qy8PrY}RuWGs=a zLFOEO5?^O;zN0+4+RHQDu|_f?+exFfz1z6@-o#K-QOSr?)cEU=jYkleqQmBVXFIrW z2H^*7CkOd87!!~jBXN%`C2&^aHrWh2DiV`3h z-$XajP*J_IAaW8psi>&xY-eO=fbFJw-AB=xzzeFpXkgwKxRlX{PyMPyZ z5tQA<&drmCT3X&IJ4O>;-a}{)^2Y9K`B(R)>46mk>je%jVP=QIMblJMr8@1T zPHR7<%1=G6n+oy3(64zv0FRicR_-OjwxX9;}>SfZbI<+B%^PZ+KTOd z_reTJ(7DEqfx}e+W6hYtoseJghte3>0uB8lffyPtgo`ZZ7@BK1kYB%vj=1iC z-N16G)vl>$Pq>9Ay1RSXlkxNDjkX7{go`M+u3&*_jI zZXZY`tQ3vC7^Ux(z4!j>$q$Ae9VlT0&p=(OF4jJ!>1TnKj7GBLL<3nacLVcBO3?m;?1*lvIgDR!FC*SUqC3&@Veh^LJ2<*%S)Gr!9AeUn%DwsxmV z-Mjtv3{;mnp$r*Ns3-OT6l%JK0s-WkMXQ$b2>Q_ApgYJ{HSLv@TB8EihXIVcwv zosr64X(>xq{ICE@L2_#=EayGce`jTD%Y7OD@ELKS1O|GQ+x||s5=1}{D8d$rT+dCP!IYe+?>XOBR*2k z7iHf(wOSNWN)Ite;!2awze+r63x< zXllOMGfn+bW4d8JR=TyLkUcVw(Whpd;E{C2#=j%0Tf_}n1vR!Em)~0v8eKAB9ANbM zNn8vcoAh}&eU8zS8JNU@^Ry|h+nnZCKWO3I^ZWcv;}Dy*OPzHJN7e5iuk)WShtb7n zG@pHTew#Q@rXDro=y5k^F)qg!GDap(UpFwsj%2`Z-j`As{9Mnd7hEx!^prt=mJb;E zz%^)n30o3}_|Kn6{?hHr?<8r~{p+=6Sm;AE`}f~7uRrvEyjRFUcMn28yv9EmOgr$| z3)B8?i$CFke@HU|6=LF|&auNkH0-DJWTiwY0rfhh@+6?{Kr}>7r!pqX(BPEfX6E7k zT(ubLw~He{LE~w?xSTm`CRq@f!1LTW8L*2+tIB8MGzs>n2N--qeD)osqp_MUe^-7X zQe<_d_kxV{B-91%01k9F6R%2Cy!j z1B(t3`Xk8`ZDWzxdZe+*?(vJncxj{C;rx~e62lI7JaPuzLezXE!GZbQk4l@61HI( zg^P?CJ4R8v)DVU_EW+=+oqY$v*Et+Cfb+DwfnI9-mH~Nhcb~8Wvtk{SH@W zjpl3ZFs#f+(bxE1)_FV&9G(=R3V-Hq1BeCPcPidU&%0MZB!RUbkWF?DVc+ws z*2mJ|o@#5r5z@lQBt+OY_u|z-Y(W%*QV3Jr6<#drMDkok3+9{VIB8JbFof=TnFpWU z$Y1hlPQG5t2DTyj6XmFPVsHaQe`4u>Z5sgJ{QpoG|Amq9p93XFEiSjWEt9fa6i94P z(Vg1i#ixF#Fk}c|#boePoFLf~Y1wF}s6X?7BXI!?w|hBC})#j`msXszWEbF zi|JM3Nbej1W^S78+l?LW?nAB;+z=Z~e|DdF1~D+zZ|gLaNc<5anQCi3`n@FeOJkyy z0KAVik1?Tm)f(bB5wgjDy+Uez12wpB!s^2aESsXwWGtcHgQ*^U1Ic~K*~NWn5v}@7 z-C8ZI5fv3drag<9{5gg46{|lXFgYjEVz_D9ep8+!X2&G{Uk6xRORQY_RA4PCRBja` zbWeS@USJL}CEiXN`7JB5!+rEny}jxI={kfJe6knmSmFfLh?W+Atbkj%dQCf%j3gmK zmF#8y-O-?bAKM0+H?C1MIwlnt5Lwfow)MKA7{eYU!GNq!<3Y(03}oD)i&u)?hedWm z7kvxqYJu%IPnleE_f7DZ0JgYsVB2|w$=zgX1ykO6#X{K_PuFb$(ag-u z@pc7(2T{Qkw)@Y`2j2PrF;)LD5K6mbaM_d~MLK~uWnJHK5TAbMF#X|o+MZ*~ua>LB z%_#di$7X%4ecw{_=dSQA&NuIX?WmwUfMjdrlJDYiI)H$*vTcdu5{h=mv|4rHxHK zlTZYhl=M_YSHu4^&1P+Ppc;d0I{|QlyDm|9ACY+D&R*8djN6@gkkvs8ev@U$637ET z&I)++6gwXHK%4eF`O$~mkUWj*?&tTNZLzr)rM~a<%0XzZJX8V67hp$m$`PNO_ueR$ zKXVl3C30uWrRR-G+^@o)Ne`u4+s368{batR>}?ze6b|QSEEEJGHu8{HYBt7p$Qwuz zM&LQ@h}?S*mXGkZ-f*wn?L4U+lN)JQ+xolSuC$qRKbDe!aX&NR>d=6Hht z?lcdPiO88Boi`OG9TM-_tQmhLN&Nn@H^SC^)B7`Fm>k+m8b*;1HiV%S{9?iACwL2u z+!-Y_6rMUmAk2-SVodVgoD4Db-*Y32rXly1os@u-6{9>F!`Acw z8mKNh7;;%+mM^k3wT30ZM=Bxj;~FcR#VOa=rwzPU3$SPc0wVk{l8z8y?KqD-cllf; zlDt+Jay|~Zzeh0jUDGCmt-*xa9sJLUaq>F6Z(>4GmJx8Ubg$^nYUhkq49-Tq7}h~Q zO-fveJ(poZ*r-}6a#-UFlJJqdL)xiOd}>I%c1Q(BC>?1!7l8H$;~EMlYnWbmYcDn| zAyW5uu^}2Mbo*>K{dY~t#CS_6T}vC7$Z3?u2Ei}eCt_;7&d)pcs|O#RUK@HKdL3f|7|@aTY^>VaHI=#EbzB2Xl-;7otQAlQrP~a(z7r_lJ57h?9w2J z!=;*Fi#V-MbiIR#PZyLO+u>+5SbLt1qw(<`Sf>=*&}%B4R(TJW*eGzQ~?I3!{%+P5zu76n01z~)= zRleEu!CFDALq;-Ieg(UO?pvFT5;WDSEC)vZ#B(R1g^OFZ{kxq7+NIvanftBp6Sb&ZCKy!gMo=gY7kumLC> z&Omp0>trb>a9zHft};j9DdfdP3I5i_on759tgw$Qj>r8-=Y%#Q1!rz|DCHs+CR@GFnyH^ S)Bt>i>i%8LJ22(v0sjYv0pCgh literal 0 HcmV?d00001 diff --git a/package.json b/package.json index 4704c8347..b2f418990 100644 --- a/package.json +++ b/package.json @@ -248,6 +248,19 @@ "type": "boolean", "default": false, "description": "Disable getting account name from the host of request Uri, always get account name from the first path segment of request Uri." + }, + "azurite.inMemoryPersistence": { + "type": "boolean", + "default": false, + "description": "Disable persisting any data to disk. All data is stored in memory. If the Azurite (node) process is terminated or VS Code is closed, all data is lost." + }, + "azurite.extentMemoryLimit": { + "type": [ + "number", + "null" + ], + "default": null, + "description": "When using in-memory persistence, limit the total size of extents (blob and queue content) to a specific number of megabytes. Defaults to 50% of total memory." } } } @@ -286,11 +299,15 @@ "azurite": "node -r ts-node/register src/azurite.ts", "lint": "npx eslint src/**/*.ts", "test": "npm run lint && cross-env NODE_TLS_REJECT_UNAUTHORIZED=0 mocha --compilers ts-node/register --no-timeouts --grep @loki --recursive --exit tests/**/*.test.ts tests/**/**/*.test.ts", + "test:in-memory": "npm run lint && cross-env AZURITE_TEST_INMEMORYPERSISTENCE=1 NODE_TLS_REJECT_UNAUTHORIZED=0 mocha --compilers ts-node/register --no-timeouts --grep @loki --recursive --exit tests/**/*.test.ts tests/**/**/*.test.ts", "test:blob": "npm run lint && cross-env NODE_TLS_REJECT_UNAUTHORIZED=0 mocha --compilers ts-node/register --no-timeouts --grep @loki --recursive --exit tests/blob/*.test.ts tests/blob/**/*.test.ts", + "test:blob:in-memory": "npm run lint && cross-env AZURITE_TEST_INMEMORYPERSISTENCE=1 NODE_TLS_REJECT_UNAUTHORIZED=0 mocha --compilers ts-node/register --no-timeouts --grep @loki --recursive --exit tests/blob/*.test.ts tests/blob/**/*.test.ts", "test:blob:sql": "npm run lint && cross-env cross-env NODE_TLS_REJECT_UNAUTHORIZED=0 AZURITE_TEST_DB=mysql://root:my-secret-pw@127.0.0.1:3306/azurite_blob_test mocha --compilers ts-node/register --no-timeouts --grep @sql --recursive --exit tests/blob/*.test.ts tests/blob/**/*.test.ts", "test:blob:sql:ci": "npm run lint && cross-env cross-env NODE_TLS_REJECT_UNAUTHORIZED=0 AZURITE_TEST_DB=mysql://root:my-secret-pw@127.0.0.1:13306/azurite_blob_test mocha --compilers ts-node/register --no-timeouts --grep @sql --recursive --exit tests/blob/*.test.ts tests/blob/**/*.test.ts", "test:queue": "npm run lint && cross-env NODE_TLS_REJECT_UNAUTHORIZED=0 mocha --compilers ts-node/register --no-timeouts --recursive --exit tests/queue/*.test.ts tests/queue/**/*.test.ts", + "test:queue:in-memory": "npm run lint && cross-env AZURITE_TEST_INMEMORYPERSISTENCE=1 NODE_TLS_REJECT_UNAUTHORIZED=0 mocha --compilers ts-node/register --no-timeouts --recursive --exit tests/queue/*.test.ts tests/queue/**/*.test.ts", "test:table": "npm run lint && cross-env NODE_TLS_REJECT_UNAUTHORIZED=0 mocha --compilers ts-node/register --no-timeouts --recursive --exit tests/table/**/*.test.ts", + "test:table:in-memory": "npm run lint && cross-env AZURITE_TEST_INMEMORYPERSISTENCE=1 NODE_TLS_REJECT_UNAUTHORIZED=0 mocha --compilers ts-node/register --no-timeouts --recursive --exit tests/table/**/*.test.ts", "test:exe": "npm run lint && cross-env NODE_TLS_REJECT_UNAUTHORIZED=0 mocha --compilers ts-node/register --no-timeouts tests/exe.test.ts --exit", "test:linux": "npm run lint && cross-env NODE_TLS_REJECT_UNAUTHORIZED=0 mocha --compilers ts-node/register --no-timeouts tests/linuxbinary.test.ts --exit", "clean": "rimraf dist typings *.log coverage __testspersistence__ temp __testsstorage__ .nyc_output debug.log *.vsix *.tgz", diff --git a/src/azurite.ts b/src/azurite.ts index 5801d5481..7861c37c3 100644 --- a/src/azurite.ts +++ b/src/azurite.ts @@ -23,6 +23,7 @@ import TableConfiguration from "./table/TableConfiguration"; import TableServer from "./table/TableServer"; import { DEFAULT_TABLE_LOKI_DB_PATH } from "./table/utils/constants"; +import { setExtentMemoryLimit } from "./common/ConfigurationBase"; // tslint:disable:no-console @@ -98,7 +99,8 @@ async function main() { env.key(), env.pwd(), env.oauth(), - env.disableProductStyleUrl() + env.disableProductStyleUrl(), + env.inMemoryPersistence(), ); const tableConfig = new TableConfiguration( @@ -115,7 +117,8 @@ async function main() { env.key(), env.pwd(), env.oauth(), - env.disableProductStyleUrl() + env.disableProductStyleUrl(), + env.inMemoryPersistence(), ); // We use logger singleton as global debugger logger to track detailed outputs cross layers @@ -130,6 +133,8 @@ async function main() { // Create table server instance const tableServer = new TableServer(tableConfig); + setExtentMemoryLimit(env, true); + // Start server console.log( `Azurite Blob service is starting at ${blobConfig.getHttpServerAddress()}` diff --git a/src/blob/BlobConfiguration.ts b/src/blob/BlobConfiguration.ts index 9b9703cb4..45733c0f9 100644 --- a/src/blob/BlobConfiguration.ts +++ b/src/blob/BlobConfiguration.ts @@ -1,5 +1,6 @@ import ConfigurationBase from "../common/ConfigurationBase"; import { StoreDestinationArray } from "../common/persistence/IExtentStore"; +import { MemoryExtentChunkStore } from "../common/persistence/MemoryExtentStore"; import { DEFAULT_BLOB_EXTENT_LOKI_DB_PATH, DEFAULT_BLOB_LISTENING_PORT, @@ -39,7 +40,9 @@ export default class BlobConfiguration extends ConfigurationBase { key: string = "", pwd: string = "", oauth?: string, - disableProductStyleUrl: boolean = false + disableProductStyleUrl: boolean = false, + public readonly isMemoryPersistence: boolean = false, + public readonly memoryStore?: MemoryExtentChunkStore, ) { super( host, diff --git a/src/blob/BlobEnvironment.ts b/src/blob/BlobEnvironment.ts index b5a54ebbb..bdc06f5a0 100644 --- a/src/blob/BlobEnvironment.ts +++ b/src/blob/BlobEnvironment.ts @@ -23,7 +23,8 @@ if (!(args as any).config.name) { .option( ["l", "location"], "Optional. Use an existing folder as workspace path, default is current working directory", - process.cwd() + "", + s => s == "" ? undefined : s ) .option( ["s", "silent"], @@ -40,6 +41,16 @@ if (!(args as any).config.name) { .option(["", "oauth"], 'Optional. OAuth level. Candidate values: "basic"') .option(["", "cert"], "Optional. Path to certificate file") .option(["", "key"], "Optional. Path to certificate key .pem file") + .option( + ["", "inMemoryPersistence"], + "Optional. Disable persisting any data to disk. If the Azurite process is terminated, all data is lost" + ) + .option( + ["", "extentMemoryLimit"], + "Optional. The number of megabytes to limit in-memory extent storage to. Only used with the --inMemoryPersistence option. Defaults to 50% of total memory", + -1, + s => s == -1 ? undefined : parseFloat(s) + ) .option( ["d", "debug"], "Optional. Enable debug log by providing a valid local file path as log destination" @@ -118,6 +129,24 @@ export default class BlobEnvironment implements IBlobEnvironment { return false; } + public inMemoryPersistence(): boolean { + if (this.flags.inMemoryPersistence !== undefined) { + if (this.flags.location) { + throw new RangeError(`The --inMemoryPersistence option is not supported when the --location option is set.`) + } + return true; + } else { + if (this.extentMemoryLimit() !== undefined) { + throw new RangeError(`The --extentMemoryLimit option is only supported when the --inMemoryPersistence option is set.`) + } + } + return false; + } + + public extentMemoryLimit(): number | undefined { + return this.flags.extentMemoryLimit; + } + public async debug(): Promise { if (typeof this.flags.debug === "string") { // Enable debug log to file diff --git a/src/blob/BlobServer.ts b/src/blob/BlobServer.ts index a70de8350..2f0e10dc3 100644 --- a/src/blob/BlobServer.ts +++ b/src/blob/BlobServer.ts @@ -9,6 +9,7 @@ import IGCManager from "../common/IGCManager"; import IRequestListenerFactory from "../common/IRequestListenerFactory"; import logger from "../common/Logger"; import FSExtentStore from "../common/persistence/FSExtentStore"; +import MemoryExtentStore, { SharedChunkStore } from "../common/persistence/MemoryExtentStore"; import IExtentMetadataStore from "../common/persistence/IExtentMetadataStore"; import IExtentStore from "../common/persistence/IExtentStore"; import LokiExtentMetadataStore from "../common/persistence/LokiExtentMetadataStore"; @@ -18,6 +19,7 @@ import BlobRequestListenerFactory from "./BlobRequestListenerFactory"; import BlobGCManager from "./gc/BlobGCManager"; import IBlobMetadataStore from "./persistence/IBlobMetadataStore"; import LokiBlobMetadataStore from "./persistence/LokiBlobMetadataStore"; +import StorageError from "./errors/StorageError"; const BEFORE_CLOSE_MESSAGE = `Azurite Blob service is closing...`; const BEFORE_CLOSE_MESSAGE_GC_ERROR = `Azurite Blob service is closing... Critical error happens during GC.`; @@ -73,15 +75,22 @@ export default class BlobServer extends ServerBase implements ICleaner { // creating a new XXXDataStore class implementing IBlobMetadataStore interface // and replace the default LokiBlobMetadataStore const metadataStore: IBlobMetadataStore = new LokiBlobMetadataStore( - configuration.metadataDBPath - // logger + configuration.metadataDBPath, + configuration.isMemoryPersistence ); const extentMetadataStore: IExtentMetadataStore = new LokiExtentMetadataStore( - configuration.extentDBPath + configuration.extentDBPath, + configuration.isMemoryPersistence ); - const extentStore: IExtentStore = new FSExtentStore( + const extentStore: IExtentStore = configuration.isMemoryPersistence ? new MemoryExtentStore( + "blob", + configuration.memoryStore ?? SharedChunkStore, + extentMetadataStore, + logger, + (sc, er, em, ri) => new StorageError(sc, er, em, ri) + ) : new FSExtentStore( extentMetadataStore, configuration.persistencePathArray, logger diff --git a/src/blob/BlobServerFactory.ts b/src/blob/BlobServerFactory.ts index fb076a65d..a0145418d 100644 --- a/src/blob/BlobServerFactory.ts +++ b/src/blob/BlobServerFactory.ts @@ -42,6 +42,13 @@ export class BlobServerFactory { const isSQL = databaseConnectionString !== undefined; if (isSQL) { + if (env.inMemoryPersistence()) { + throw new Error(`The --inMemoryPersistence option is not supported when using SQL-based metadata storage.`) + } + if (env.extentMemoryLimit() !== undefined) { + throw new Error(`The --extentMemoryLimit option is not supported when using SQL-based metadata storage.`) + } + const config = new SqlBlobConfiguration( env.blobHost(), env.blobPort(), @@ -79,8 +86,10 @@ export class BlobServerFactory { env.key(), env.pwd(), env.oauth(), - env.disableProductStyleUrl() + env.disableProductStyleUrl(), + env.inMemoryPersistence(), ); + return new BlobServer(config); } } else { diff --git a/src/blob/IBlobEnvironment.ts b/src/blob/IBlobEnvironment.ts index 822e770e8..b83cddbd3 100644 --- a/src/blob/IBlobEnvironment.ts +++ b/src/blob/IBlobEnvironment.ts @@ -11,4 +11,6 @@ export default interface IBlobEnvironment { debug(): Promise; oauth(): string | undefined; disableProductStyleUrl(): boolean; + inMemoryPersistence(): boolean; + extentMemoryLimit(): number | undefined; } diff --git a/src/blob/main.ts b/src/blob/main.ts index 1056943b2..41af28052 100644 --- a/src/blob/main.ts +++ b/src/blob/main.ts @@ -3,6 +3,8 @@ import * as Logger from "../common/Logger"; import { BlobServerFactory } from "./BlobServerFactory"; import SqlBlobServer from "./SqlBlobServer"; import BlobServer from "./BlobServer"; +import { setExtentMemoryLimit } from "../common/ConfigurationBase"; +import BlobEnvironment from "./BlobEnvironment"; // tslint:disable:no-console @@ -30,6 +32,8 @@ async function main() { // Enable debug log by default before first release for debugging purpose Logger.configLogger(config.enableDebugLog, config.debugLogFilePath); + setExtentMemoryLimit(new BlobEnvironment(), true); + // Start server console.log( `Azurite Blob service is starting on ${config.host}:${config.port}` diff --git a/src/blob/persistence/LokiBlobMetadataStore.ts b/src/blob/persistence/LokiBlobMetadataStore.ts index ebf53cbfc..fb1b10308 100644 --- a/src/blob/persistence/LokiBlobMetadataStore.ts +++ b/src/blob/persistence/LokiBlobMetadataStore.ts @@ -105,8 +105,11 @@ export default class LokiBlobMetadataStore private readonly pageBlobRangesManager = new PageBlobRangesManager(); - public constructor(public readonly lokiDBPath: string) { - this.db = new Loki(lokiDBPath, { + public constructor(public readonly lokiDBPath: string, inMemory: boolean) { + this.db = new Loki(lokiDBPath, inMemory ? { + persistenceMethod: "memory" + } : { + persistenceMethod: "fs", autosave: true, autosaveInterval: 5000 }); diff --git a/src/common/ConfigurationBase.ts b/src/common/ConfigurationBase.ts index 42336eec7..4ea705d23 100644 --- a/src/common/ConfigurationBase.ts +++ b/src/common/ConfigurationBase.ts @@ -1,5 +1,11 @@ import * as fs from "fs"; import { OAuthLevel } from "./models"; +import IBlobEnvironment from "../blob/IBlobEnvironment"; +import IQueueEnvironment from "../queue/IQueueEnvironment"; +import { DEFAULT_EXTENT_MEMORY_LIMIT, SharedChunkStore } from "./persistence/MemoryExtentStore"; +import { totalmem } from "os"; +import logger from "./Logger"; +import IEnvironment from "./IEnvironment"; export enum CertOptions { Default, @@ -7,6 +13,37 @@ export enum CertOptions { PFX } +export function setExtentMemoryLimit(env: IBlobEnvironment | IQueueEnvironment | IEnvironment, logToConsole: boolean) { + if (env.inMemoryPersistence()) { + let mb = env.extentMemoryLimit() + if (mb === undefined || typeof mb !== 'number') { + mb = DEFAULT_EXTENT_MEMORY_LIMIT / (1024 * 1024) + } + + if (mb < 0) { + throw new Error(`A negative value of '${mb}' is not allowed for the extent memory limit.`) + } + + if (mb >= 0) { + const bytes = Math.round(mb * 1024 * 1024); + const totalPct = Math.round(100 * bytes / totalmem()) + const message = `In-memory extent storage is enabled with a limit of ${mb.toFixed(2)} MB (${bytes} bytes, ${totalPct}% of total memory).` + if (logToConsole) { + console.log(message) + } + logger.info(message) + SharedChunkStore.setSizeLimit(bytes); + } else { + const message = `In-memory extent storage is enabled with no limit on memory used.` + if (logToConsole) { + console.log(message) + } + logger.info(message) + SharedChunkStore.setSizeLimit(); + } + } +} + export default abstract class ConfigurationBase { public constructor( public readonly host: string, @@ -22,7 +59,7 @@ export default abstract class ConfigurationBase { public readonly pwd: string = "", public readonly oauth?: string, public readonly disableProductStyleUrl: boolean = false, - ) {} + ) { } public hasCert() { if (this.cert.length > 0 && this.key.length > 0) { @@ -63,8 +100,7 @@ export default abstract class ConfigurationBase { } public getHttpServerAddress(): string { - return `http${this.hasCert() === CertOptions.Default ? "" : "s"}://${ - this.host - }:${this.port}`; + return `http${this.hasCert() === CertOptions.Default ? "" : "s"}://${this.host + }:${this.port}`; } } diff --git a/src/common/Environment.ts b/src/common/Environment.ts index 5b90ea6b9..47f0dd658 100644 --- a/src/common/Environment.ts +++ b/src/common/Environment.ts @@ -51,7 +51,8 @@ args .option( ["l", "location"], "Optional. Use an existing folder as workspace path, default is current working directory", - process.cwd() + "", + s => s == "" ? undefined : s ) .option(["s", "silent"], "Optional. Disable access log displayed in console") .option( @@ -64,12 +65,22 @@ args ) .option( ["", "disableProductStyleUrl"], - "Optional. Disable getting account name from the host of request Uri, always get account name from the first path segment of request Uri." + "Optional. Disable getting account name from the host of request Uri, always get account name from the first path segment of request Uri" ) .option(["", "oauth"], 'Optional. OAuth level. Candidate values: "basic"') .option(["", "cert"], "Optional. Path to certificate file") .option(["", "key"], "Optional. Path to certificate key .pem file") .option(["", "pwd"], "Optional. Password for .pfx file") + .option( + ["", "inMemoryPersistence"], + "Optional. Disable persisting any data to disk. If the Azurite process is terminated, all data is lost" + ) + .option( + ["", "extentMemoryLimit"], + "Optional. The number of megabytes to limit in-memory extent storage to. Only used with the --inMemoryPersistence option. Defaults to 50% of total memory", + -1, + s => s == -1 ? undefined : parseFloat(s) + ) .option( ["d", "debug"], "Optional. Enable debug log by providing a valid local file path as log destination" @@ -155,6 +166,24 @@ export default class Environment implements IEnvironment { return this.flags.oauth; } + public inMemoryPersistence(): boolean { + if (this.flags.inMemoryPersistence !== undefined) { + if (this.flags.location) { + throw new RangeError(`The --inMemoryPersistence option is not supported when the --location option is set.`) + } + return true; + } else { + if (this.extentMemoryLimit() !== undefined) { + throw new RangeError(`The --extentMemoryLimit option is only supported when the --inMemoryPersistence option is set.`) + } + } + return false; + } + + public extentMemoryLimit(): number | undefined { + return this.flags.extentMemoryLimit; + } + public async debug(): Promise { if (typeof this.flags.debug === "string") { // Enable debug log to file diff --git a/src/common/IEnvironment.ts b/src/common/IEnvironment.ts index 5ae8acb99..e307b0a32 100644 --- a/src/common/IEnvironment.ts +++ b/src/common/IEnvironment.ts @@ -1,6 +1,8 @@ import IBlobEnvironment from "../blob/IBlobEnvironment"; import IQueueEnvironment from "../queue/IQueueEnvironment"; +import ITableEnvironment from "../table/ITableEnvironment"; export default interface IEnvironment extends IBlobEnvironment, - IQueueEnvironment {} + IQueueEnvironment, + ITableEnvironment { } diff --git a/src/common/VSCEnvironment.ts b/src/common/VSCEnvironment.ts index 179c6853d..f5ea1fa4d 100644 --- a/src/common/VSCEnvironment.ts +++ b/src/common/VSCEnvironment.ts @@ -109,4 +109,12 @@ export default class VSCEnvironment implements IEnvironment { this.workspaceConfiguration.get("disableProductStyleUrl") || false ); } + + public inMemoryPersistence(): boolean { + return this.workspaceConfiguration.get("inMemoryPersistence") || false; + } + + public extentMemoryLimit(): number | undefined { + return this.workspaceConfiguration.get("extentMemoryLimit"); + } } diff --git a/src/common/VSCServerManagerBlob.ts b/src/common/VSCServerManagerBlob.ts index 03146322e..e4c497457 100644 --- a/src/common/VSCServerManagerBlob.ts +++ b/src/common/VSCServerManagerBlob.ts @@ -87,7 +87,8 @@ export default class VSCServerManagerBlob extends VSCServerManagerBase { env.key(), env.pwd(), env.oauth(), - env.disableProductStyleUrl() + env.disableProductStyleUrl(), + env.inMemoryPersistence(), ); return config; } diff --git a/src/common/VSCServerManagerClosedState.ts b/src/common/VSCServerManagerClosedState.ts index dda2bd473..200ff918d 100644 --- a/src/common/VSCServerManagerClosedState.ts +++ b/src/common/VSCServerManagerClosedState.ts @@ -1,4 +1,6 @@ +import { setExtentMemoryLimit } from "./ConfigurationBase"; import IVSCServerManagerState from "./IVSCServerManagerState"; +import VSCEnvironment from "./VSCEnvironment"; import VSCServerManagerBase from "./VSCServerManagerBase"; import { VSCServerManagerRunningState } from "./VSCServerManagerRunningState"; @@ -7,8 +9,12 @@ export default class VSCServerManagerClosedState public async start( serverManager: VSCServerManagerBase ): Promise { + const env = new VSCEnvironment() + setExtentMemoryLimit(env, false) + await serverManager.createImpl(); await serverManager.startImpl(); + return new VSCServerManagerRunningState(); } diff --git a/src/common/VSCServerManagerQueue.ts b/src/common/VSCServerManagerQueue.ts index 51005ef4c..791759cf3 100644 --- a/src/common/VSCServerManagerQueue.ts +++ b/src/common/VSCServerManagerQueue.ts @@ -1,6 +1,5 @@ import { access, ensureDir } from "fs-extra"; import { join } from "path"; -import { promisify } from "util"; import QueueConfiguration from "../queue/QueueConfiguration"; import QueueServer from "../queue/QueueServer"; @@ -18,9 +17,6 @@ import VSCEnvironment from "./VSCEnvironment"; import VSCServerManagerBase from "./VSCServerManagerBase"; import VSCServerManagerClosedState from "./VSCServerManagerClosedState"; -import rimraf = require("rimraf"); -const rimrafAsync = promisify(rimraf); - export default class VSCServerManagerBlob extends VSCServerManagerBase { public readonly accessChannelStream = new VSCChannelWriteStream( "Azurite Queue" @@ -62,12 +58,8 @@ export default class VSCServerManagerBlob extends VSCServerManagerBase { } public async cleanImpl(): Promise { - const config = await this.getConfiguration(); - await rimrafAsync(config.extentDBPath); - await rimrafAsync(config.metadataDBPath); - for (const path of config.persistencePathArray) { - await rimrafAsync(path.locationPath); - } + await this.createImpl(); + await this.server!.clean(); } private async getConfiguration(): Promise { @@ -98,7 +90,8 @@ export default class VSCServerManagerBlob extends VSCServerManagerBase { env.key(), env.pwd(), env.oauth(), - env.disableProductStyleUrl() + env.disableProductStyleUrl(), + env.inMemoryPersistence(), ); return config; } diff --git a/src/common/VSCServerManagerTable.ts b/src/common/VSCServerManagerTable.ts index ec8c736e7..b830ab5c9 100644 --- a/src/common/VSCServerManagerTable.ts +++ b/src/common/VSCServerManagerTable.ts @@ -77,7 +77,8 @@ export default class VSCServerManagerTable extends VSCServerManagerBase { env.key(), env.pwd(), env.oauth(), - env.disableProductStyleUrl() + env.disableProductStyleUrl(), + env.inMemoryPersistence(), ); return config; } diff --git a/src/common/persistence/LokiExtentMetadataStore.ts b/src/common/persistence/LokiExtentMetadataStore.ts index 28c2dca16..bad95e27c 100644 --- a/src/common/persistence/LokiExtentMetadataStore.ts +++ b/src/common/persistence/LokiExtentMetadataStore.ts @@ -25,8 +25,11 @@ export default class LokiExtentMetadata implements IExtentMetadataStore { private readonly EXTENTS_COLLECTION = "$EXTENTS_COLLECTION$"; - public constructor(public readonly lokiDBPath: string) { - this.db = new Loki(lokiDBPath, { + public constructor(public readonly lokiDBPath: string, inMemory: boolean) { + this.db = new Loki(lokiDBPath, inMemory ? { + persistenceMethod: "memory" + } : { + persistenceMethod: "fs", autosave: true, autosaveInterval: 5000 }); diff --git a/src/common/persistence/MemoryExtentStore.ts b/src/common/persistence/MemoryExtentStore.ts new file mode 100644 index 000000000..1f5325e35 --- /dev/null +++ b/src/common/persistence/MemoryExtentStore.ts @@ -0,0 +1,395 @@ +import { ZERO_EXTENT_ID } from "../../blob/persistence/IBlobMetadataStore"; +import ILogger from "../ILogger"; +import ZeroBytesStream from "../ZeroBytesStream"; +import IExtentMetadataStore, { IExtentModel } from "./IExtentMetadataStore"; +import IExtentStore, { IExtentChunk } from "./IExtentStore"; +import uuid = require("uuid"); +import multistream = require("multistream"); +import { Readable } from "stream"; +import { totalmem } from "os"; + +export interface IMemoryExtentChunk extends IExtentChunk { + chunks: (Buffer | string)[] +} + +interface IExtentCategoryChunks { + chunks: Map, + totalSize: number, +} + +export class MemoryExtentChunkStore { + private _sizeLimit?: number; + + private readonly _chunks: Map = new Map(); + private _totalSize: number = 0; + + public constructor(sizeLimit?: number) { + this._sizeLimit = sizeLimit; + } + + public clear(categoryName: string): void { + let category = this._chunks.get(categoryName) + if (!category) { + return + } + + this._totalSize -= category.totalSize + this._chunks.delete(categoryName) + } + + public set(categoryName: string, chunk: IMemoryExtentChunk) { + if (!this.trySet(categoryName, chunk)) { + throw new Error(`Cannot add an extent chunk to the in-memory store. Size limit of ${this._sizeLimit} bytes will be exceeded.`) + } + } + + public trySet(categoryName: string, chunk: IMemoryExtentChunk): boolean { + let category = this._chunks.get(categoryName) + if (!category) { + category = { + chunks: new Map(), + totalSize: 0 + } + this._chunks.set(categoryName, category) + } + + let delta = chunk.count + const existing = category.chunks.get(chunk.id) + if (existing) { + delta -= existing.count + } + + if (this._sizeLimit != undefined && this._totalSize + delta > this._sizeLimit) { + return false + } + + category.chunks.set(chunk.id, chunk) + category.totalSize += delta + this._totalSize += delta + return true + } + + public get(categoryName: string, id: string): IMemoryExtentChunk | undefined { + return this._chunks.get(categoryName)?.chunks.get(id) + } + + public delete(categoryName: string, id: string): boolean { + const category = this._chunks.get(categoryName); + if (!category) { + return false + } + + const existing = category.chunks.get(id); + if (!existing) { + return false + } + + category.chunks.delete(id) + category.totalSize -= existing.count + this._totalSize -= existing.count + + if (category.chunks.size === 0) { + this._chunks.delete(categoryName) + } + + return true + } + + public totalSize(): number { + return this._totalSize + } + + public setSizeLimit(sizeLimit?: number) { + if (sizeLimit && sizeLimit < this._totalSize) { + return false; + } + + this._sizeLimit = sizeLimit + return true; + } + + public sizeLimit(): number | undefined { + return this._sizeLimit + } +} + +// By default, allow up to half of the total memory to be used for in-memory +// extents. We don't use freemem (free memory instead of total memory) since +// that would lead to a decent amount of unpredictability. +export const DEFAULT_EXTENT_MEMORY_LIMIT = Math.trunc(totalmem() * 0.5) +export const SharedChunkStore: MemoryExtentChunkStore = new MemoryExtentChunkStore(DEFAULT_EXTENT_MEMORY_LIMIT); + +export default class MemoryExtentStore implements IExtentStore { + private readonly categoryName: string; + private readonly chunks: MemoryExtentChunkStore; + private readonly metadataStore: IExtentMetadataStore; + private readonly logger: ILogger; + private readonly makeError: (statusCode: number, storageErrorCode: string, storageErrorMessage: string, storageRequestID: string) => Error; + + private initialized: boolean = false; + private closed: boolean = true; + public constructor( + categoryName: string, + chunks: MemoryExtentChunkStore, + metadata: IExtentMetadataStore, + logger: ILogger, + makeError: (statusCode: number, storageErrorCode: string, storageErrorMessage: string, storageRequestID: string) => Error, + ) { + this.categoryName = categoryName; + this.chunks = chunks; + this.metadataStore = metadata; + this.logger = logger; + this.makeError = makeError; + } + + public isInitialized(): boolean { + return this.initialized; + } + + public isClosed(): boolean { + return this.closed; + } + + async init(): Promise { + if (!this.metadataStore.isInitialized()) { + await this.metadataStore.init(); + } + + this.initialized = true; + this.closed = false; + } + + public async close(): Promise { + if (!this.metadataStore.isClosed()) { + await this.metadataStore.close(); + } + + this.closed = true; + } + + public async clean(): Promise { + if (this.isClosed()) { + this.chunks.clear(this.categoryName); + return; + } + throw new Error(`Cannot clean MemoryExtentStore, it's not closed.`); + } + + async appendExtent(data: NodeJS.ReadableStream | Buffer, contextId?: string | undefined): Promise { + const chunks: (Buffer | string)[] = [] + let count = 0; + if (data instanceof Buffer) { + if (data.length > 0) { + chunks.push(data) + count = data.length + } + } else { + for await (let chunk of data) { + if (chunk.length > 0) { + chunks.push(chunk) + count += chunk.length + } + } + } + const extentChunk: IMemoryExtentChunk = { + count, + offset: 0, + id: uuid(), + chunks + } + + this.logger.info( + `MemoryExtentStore:appendExtent() Add chunks to in-memory map. id:${extentChunk.id} count:${count} chunks.length:${chunks.length}`, + contextId + ); + + if (!this.chunks.trySet(this.categoryName, extentChunk)) { + throw this.makeError( + 409, + "MemoryExtentStoreAtSizeLimit", + `Cannot add an extent chunk to the in-memory store. Size limit of ${this.chunks.sizeLimit()} bytes will be exceeded`, + contextId ?? ""); + } + + this.logger.debug( + `MemoryExtentStore:appendExtent() Added chunks to in-memory map. id:${extentChunk.id} `, + contextId + ); + + const extent: IExtentModel = { + id: extentChunk.id, + locationId: extentChunk.id, + path: extentChunk.id, + size: count, + lastModifiedInMS: Date.now() + }; + + await this.metadataStore.updateExtent(extent); + + this.logger.debug( + `MemoryExtentStore:appendExtent() Added new extent to metadata store. id:${extentChunk.id}`, + contextId + ); + + return extentChunk + } + + async readExtent(extentChunk?: IExtentChunk | undefined, contextId?: string | undefined): Promise { + if (extentChunk === undefined || extentChunk.count === 0) { + return new ZeroBytesStream(0); + } + + if (extentChunk.id === ZERO_EXTENT_ID) { + const subRangeCount = Math.min(extentChunk.count); + return new ZeroBytesStream(subRangeCount); + } + + this.logger.info( + `MemoryExtentStore:readExtent() Fetch chunks from in-memory map. id:${extentChunk.id}`, + contextId + ); + + const match = this.chunks.get(this.categoryName, extentChunk.id); + if (!match) { + throw new Error(`Extend ${extentChunk.id} does not exist.`); + } + + this.logger.debug( + `MemoryExtentStore:readExtent() Fetched chunks from in-memory map. id:${match.id} count:${match.count} chunks.length:${match.chunks.length} totalSize:${this.chunks.totalSize()}`, + contextId + ); + + const buffer = new Readable() + let skip = extentChunk.offset; + let take = extentChunk.count; + let skippedChunks = 0; + let partialChunks = 0; + let readChunks = 0; + for (const chunk of match.chunks) { + if (take === 0) { + break + } + + if (skip > 0) { + if (chunk.length <= skip) { + // this chunk is entirely skipped + skip -= chunk.length + skippedChunks++ + } else { + // part of the chunk is included + const end = skip + Math.min(take, chunk.length - skip) + const slice = chunk.slice(skip, end); + buffer.push(chunk.slice(skip, end)) + skip = 0 + take -= slice.length + partialChunks++ + } + } else { + if (chunk.length > take) { + // all of the chunk is included, up to the count limit + const slice = chunk.slice(0, take); + buffer.push(slice) + take -= slice.length + partialChunks++ + } else { + // all of the chunk is included + buffer.push(chunk) + take -= chunk.length + readChunks++ + } + } + } + buffer.push(null) + + this.logger.debug( + `MemoryExtentStore:readExtent() Pushed in-memory chunks to Readable stream. id:${match.id} chunks:${readChunks} skipped:${skippedChunks} partial:${partialChunks}`, + contextId + ); + + return buffer; + } + + async readExtents(extentChunkArray: IExtentChunk[], offset: number, count: number, contextId?: string | undefined): Promise { + this.logger.info( + `MemoryExtentStore:readExtents() Start read from multi extents...`, + contextId + ); + + if (count === 0) { + return new ZeroBytesStream(0); + } + + const start = offset; // Start inclusive position in the merged stream + const end = offset + count; // End exclusive position in the merged stream + + const streams: NodeJS.ReadableStream[] = []; + let accumulatedOffset = 0; // Current payload offset in the merged stream + + for (const chunk of extentChunkArray) { + const nextOffset = accumulatedOffset + chunk.count; + + if (nextOffset <= start) { + accumulatedOffset = nextOffset; + continue; + } else if (end <= accumulatedOffset) { + break; + } else { + let chunkStart = chunk.offset; + let chunkEnd = chunk.offset + chunk.count; + if (start > accumulatedOffset) { + chunkStart = chunkStart + start - accumulatedOffset; // Inclusive + } + + if (end <= nextOffset) { + chunkEnd = chunkEnd - (nextOffset - end); // Exclusive + } + + streams.push( + await this.readExtent( + { + id: chunk.id, + offset: chunkStart, + count: chunkEnd - chunkStart + }, + contextId + ) + ); + accumulatedOffset = nextOffset; + } + } + + // TODO: What happens when count exceeds merged payload length? + // throw an error of just return as much data as we can? + if (end !== Infinity && accumulatedOffset < end) { + throw new RangeError( + // tslint:disable-next-line:max-line-length + `Not enough payload data error. Total length of payloads is ${accumulatedOffset}, while required data offset is ${offset}, count is ${count}.` + ); + } + + return multistream(streams); + } + + async deleteExtents(extents: Iterable): Promise { + let count = 0; + for (const id of extents) { + this.logger.info( + `MemoryExtentStore:deleteExtents() Delete extent:${id}` + ); + const extent = this.chunks.get(this.categoryName, id) + if (extent) { + this.chunks.delete(this.categoryName, id) + } + await this.metadataStore.deleteExtent(id); + this.logger.debug( + `MemoryExtentStore:deleteExtents() Deleted extent:${id} totalSize:${this.chunks.totalSize()}` + ); + count++; + } + return count; + } + + getMetadataStore(): IExtentMetadataStore { + return this.metadataStore; + } +} \ No newline at end of file diff --git a/src/queue/IQueueEnvironment.ts b/src/queue/IQueueEnvironment.ts index e15bf3413..b9ed88b43 100644 --- a/src/queue/IQueueEnvironment.ts +++ b/src/queue/IQueueEnvironment.ts @@ -10,4 +10,6 @@ export default interface IQueueEnvironment { key(): string | undefined; pwd(): string | undefined; debug(): Promise; + inMemoryPersistence(): boolean; + extentMemoryLimit(): number | undefined; } diff --git a/src/queue/QueueConfiguration.ts b/src/queue/QueueConfiguration.ts index 39fe3802b..31f52257c 100644 --- a/src/queue/QueueConfiguration.ts +++ b/src/queue/QueueConfiguration.ts @@ -1,5 +1,6 @@ import ConfigurationBase from "../common/ConfigurationBase"; import { StoreDestinationArray } from "../common/persistence/IExtentStore"; +import { MemoryExtentChunkStore } from "../common/persistence/MemoryExtentStore"; import { DEFAULT_ENABLE_ACCESS_LOG, DEFAULT_ENABLE_DEBUG_LOG, @@ -39,7 +40,9 @@ export default class QueueConfiguration extends ConfigurationBase { key: string = "", pwd: string = "", oauth?: string, - disableProductStyleUrl: boolean = false + disableProductStyleUrl: boolean = false, + public readonly isMemoryPersistence: boolean = false, + public readonly memoryStore?: MemoryExtentChunkStore, ) { super( host, diff --git a/src/queue/QueueEnvironment.ts b/src/queue/QueueEnvironment.ts index 8a6d0b8fc..de2c5752c 100644 --- a/src/queue/QueueEnvironment.ts +++ b/src/queue/QueueEnvironment.ts @@ -20,7 +20,8 @@ args .option( ["l", "location"], "Optional. Use an existing folder as workspace path, default is current working directory", - process.cwd() + "", + s => s == "" ? undefined : s ) .option(["s", "silent"], "Optional. Disable access log displayed in console") .option( @@ -39,6 +40,16 @@ args .option(["", "cert"], "Optional. Path to certificate file") .option(["", "key"], "Optional. Path to certificate key .pem file") .option(["", "pwd"], "Optional. Password for .pfx file") + .option( + ["", "inMemoryPersistence"], + "Optional. Disable persisting any data to disk. If the Azurite process is terminated, all data is lost" + ) + .option( + ["", "extentMemoryLimit"], + "Optional. The number of megabytes to limit in-memory extent storage to. Only used with the --inMemoryPersistence option. Defaults to 50% of total memory", + -1, + s => s == -1 ? undefined : parseFloat(s) + ) .option( ["d", "debug"], "Optional. Enable debug log by providing a valid local file path as log destination" @@ -108,6 +119,24 @@ export default class QueueEnvironment implements IQueueEnvironment { return false; } + public inMemoryPersistence(): boolean { + if (this.flags.inMemoryPersistence !== undefined) { + if (this.flags.location) { + throw new RangeError(`The --inMemoryPersistence option is not supported when the --location option is set.`) + } + return true; + } else { + if (this.extentMemoryLimit() !== undefined) { + throw new RangeError(`The --extentMemoryLimit option is only supported when the --inMemoryPersistence option is set.`) + } + } + return false; + } + + public extentMemoryLimit(): number | undefined { + return this.flags.extentMemoryLimit; + } + public async debug(): Promise { if (typeof this.flags.debug === "string") { // Enable debug log to file diff --git a/src/queue/QueueServer.ts b/src/queue/QueueServer.ts index 50d4758dc..3910cfa7e 100644 --- a/src/queue/QueueServer.ts +++ b/src/queue/QueueServer.ts @@ -8,15 +8,17 @@ import IGCManager from "../common/IGCManager"; import IRequestListenerFactory from "../common/IRequestListenerFactory"; import logger from "../common/Logger"; import FSExtentStore from "../common/persistence/FSExtentStore"; +import MemoryExtentStore, { SharedChunkStore } from "../common/persistence/MemoryExtentStore"; import IExtentMetadataStore from "../common/persistence/IExtentMetadataStore"; import IExtentStore from "../common/persistence/IExtentStore"; import LokiExtentMetadataStore from "../common/persistence/LokiExtentMetadataStore"; -import ServerBase from "../common/ServerBase"; +import ServerBase, { ServerStatus } from "../common/ServerBase"; import QueueGCManager from "./gc/QueueGCManager"; import IQueueMetadataStore from "./persistence/IQueueMetadataStore"; import LokiQueueMetadataStore from "./persistence/LokiQueueMetadataStore"; import QueueConfiguration from "./QueueConfiguration"; import QueueRequestListenerFactory from "./QueueRequestListenerFactory"; +import StorageError from "./errors/StorageError"; const BEFORE_CLOSE_MESSAGE = `Azurite Queue service is closing...`; const BEFORE_CLOSE_MESSAGE_GC_ERROR = `Azurite Queue service is closing... Critical error happens during GC.`; @@ -72,15 +74,22 @@ export default class QueueServer extends ServerBase { // creating a new XXXDataStore class implementing IBlobDataStore interface // and replace the default LokiBlobDataStore const metadataStore: IQueueMetadataStore = new LokiQueueMetadataStore( - configuration.metadataDBPath - // logger + configuration.metadataDBPath, + configuration.isMemoryPersistence ); const extentMetadataStore = new LokiExtentMetadataStore( - configuration.extentDBPath + configuration.extentDBPath, + configuration.isMemoryPersistence ); - const extentStore: IExtentStore = new FSExtentStore( + const extentStore: IExtentStore = configuration.isMemoryPersistence ? new MemoryExtentStore( + "queue", + configuration.memoryStore ?? SharedChunkStore, + extentMetadataStore, + logger, + (sc, er, em, ri) => new StorageError(sc, er, em, ri) + ) : new FSExtentStore( extentMetadataStore, configuration.persistencePathArray, logger @@ -128,6 +137,35 @@ export default class QueueServer extends ServerBase { this.gcManager = gcManager; } + /** + * Clean up server persisted data, including Loki metadata database file, + * Loki extent database file and extent data. + * + * @returns {Promise} + * @memberof BlobServer + */ + public async clean(): Promise { + if (this.getStatus() === ServerStatus.Closed) { + if (this.extentStore !== undefined) { + await this.extentStore.clean(); + } + + if (this.extentMetadataStore !== undefined) { + await this.extentMetadataStore.clean(); + } + + if (this.metadataStore !== undefined) { + await this.metadataStore.clean(); + } + + if (this.accountDataStore !== undefined) { + await this.accountDataStore.clean(); + } + return; + } + throw Error(`Cannot clean up queue server in status ${this.getStatus()}.`); + } + protected async beforeStart(): Promise { const msg = `Azurite Queue service is starting on ${this.host}:${this.port}`; logger.info(msg); diff --git a/src/queue/handlers/MessageIdHandler.ts b/src/queue/handlers/MessageIdHandler.ts index d5f74ce90..f00c5b7f4 100644 --- a/src/queue/handlers/MessageIdHandler.ts +++ b/src/queue/handlers/MessageIdHandler.ts @@ -5,7 +5,7 @@ import Context from "../generated/Context"; import IMessageIdHandler from "../generated/handlers/IMessageIdHandler"; import { MessageUpdateProperties } from "../persistence/IQueueMetadataStore"; import { - DEFUALT_UPDATE_VISIBILITYTIMEOUT, + DEFAULT_UPDATE_VISIBILITYTIMEOUT, MESSAGETEXT_LENGTH_MAX, QUEUE_API_VERSION, UPDATE_VISIBILITYTIMEOUT_MAX, @@ -80,7 +80,7 @@ export default class MessageIdHandler extends BaseHandler // Validate the query parameters. const timeNextVisible = new Date( - context.startTime!.getTime() + DEFUALT_UPDATE_VISIBILITYTIMEOUT * 1000 // 30s as default + context.startTime!.getTime() + DEFAULT_UPDATE_VISIBILITYTIMEOUT * 1000 // 30s as default ); if (visibilitytimeout !== undefined) { if ( diff --git a/src/queue/handlers/MessagesHandler.ts b/src/queue/handlers/MessagesHandler.ts index 5c1002d89..4be1192b7 100644 --- a/src/queue/handlers/MessagesHandler.ts +++ b/src/queue/handlers/MessagesHandler.ts @@ -7,8 +7,8 @@ import Context from "../generated/Context"; import IMessagesHandler from "../generated/handlers/IMessagesHandler"; import { MessageModel } from "../persistence/IQueueMetadataStore"; import { - DEFUALT_DEQUEUE_VISIBILITYTIMEOUT, - DEFUALT_MESSAGETTL, + DEFAULT_DEQUEUE_VISIBILITYTIMEOUT, + DEFAULT_MESSAGETTL, DEQUEUE_NUMOFMESSAGES_MAX, DEQUEUE_NUMOFMESSAGES_MIN, DEQUEUE_VISIBILITYTIMEOUT_MAX, @@ -58,7 +58,7 @@ export default class MessagesHandler extends BaseHandler // Validate the query parameters. const timeNextVisible = new Date( - context.startTime!.getTime() + DEFUALT_DEQUEUE_VISIBILITYTIMEOUT * 1000 // 30s as default, convert to ms + context.startTime!.getTime() + DEFAULT_DEQUEUE_VISIBILITYTIMEOUT * 1000 // 30s as default, convert to ms ); if (options.visibilitytimeout !== undefined) { if ( @@ -116,7 +116,6 @@ export default class MessagesHandler extends BaseHandler statusCode: 200; }; - // Read the message text from file system. for (const message of messages) { const textStream = await this.extentStore.readExtent( message.persistency, @@ -218,7 +217,7 @@ export default class MessagesHandler extends BaseHandler messageId: uuid(), insertionTime: new Date(context.startTime!), expirationTime: new Date( - context.startTime!.getTime() + DEFUALT_MESSAGETTL * 1000 + context.startTime!.getTime() + DEFAULT_MESSAGETTL * 1000 ), // Default ttl is 7 days. dequeueCount: 0, timeNextVisible: new Date(context.startTime!), diff --git a/src/queue/main.ts b/src/queue/main.ts index 534ddffb9..1e96b4b9d 100644 --- a/src/queue/main.ts +++ b/src/queue/main.ts @@ -12,6 +12,7 @@ import { DEFAULT_QUEUE_PERSISTENCE_ARRAY, DEFAULT_QUEUE_PERSISTENCE_PATH } from "./utils/constants"; +import { setExtentMemoryLimit } from "../common/ConfigurationBase"; // tslint:disable:no-console @@ -64,7 +65,8 @@ async function main() { env.key(), env.pwd(), env.oauth(), - env.disableProductStyleUrl() + env.disableProductStyleUrl(), + env.inMemoryPersistence(), ); // We use logger singleton as global debugger logger to track detailed outputs cross layers @@ -76,6 +78,8 @@ async function main() { // Create server instance const server = new QueueServer(config); + setExtentMemoryLimit(env, true); + // Start server console.log( `Azurite Queue service is starting on ${config.host}:${config.port}` diff --git a/src/queue/persistence/IQueueMetadataStore.ts b/src/queue/persistence/IQueueMetadataStore.ts index 7a9a34c5b..f193e7609 100644 --- a/src/queue/persistence/IQueueMetadataStore.ts +++ b/src/queue/persistence/IQueueMetadataStore.ts @@ -1,3 +1,4 @@ +import ICleaner from "../../common/ICleaner"; import IDataStore from "../../common/IDataStore"; import IGCExtentProvider from "../../common/IGCExtentProvider"; import * as Models from "../generated/artifacts/models"; @@ -71,7 +72,7 @@ export interface IExtentChunk { * @interface IQueueMetadataStore * @extends {IDataStore} */ -export interface IQueueMetadataStore extends IGCExtentProvider, IDataStore { +export interface IQueueMetadataStore extends IGCExtentProvider, IDataStore, ICleaner { /** * Update queue service properties. Create service properties document if not exists in persistency layer. * Assume service properties collection has been created during start method. diff --git a/src/queue/persistence/LokiQueueMetadataStore.ts b/src/queue/persistence/LokiQueueMetadataStore.ts index e4f6630dc..56b376647 100644 --- a/src/queue/persistence/LokiQueueMetadataStore.ts +++ b/src/queue/persistence/LokiQueueMetadataStore.ts @@ -14,6 +14,7 @@ import { ServicePropertiesModel } from "./IQueueMetadataStore"; import QueueReferredExtentsAsyncIterator from "./QueueReferredExtentsAsyncIterator"; +import { rimrafAsync } from "../../common/utils/utils"; /** * This is a metadata source implementation for queue based on loki DB. @@ -50,8 +51,11 @@ export default class LokiQueueMetadataStore implements IQueueMetadataStore { private readonly QUEUES_COLLECTION = "$QUEUES_COLLECTION$"; private readonly MESSAGES_COLLECTION = "$MESSAGES_COLLECTION$"; - public constructor(public readonly lokiDBPath: string) { - this.db = new Loki(lokiDBPath, { + public constructor(public readonly lokiDBPath: string, inMemory: boolean) { + this.db = new Loki(lokiDBPath, inMemory ? { + persistenceMethod: "memory" + } : { + persistenceMethod: "fs", autosave: true, autosaveInterval: 5000 }); @@ -143,6 +147,21 @@ export default class LokiQueueMetadataStore implements IQueueMetadataStore { this.closed = true; } + /** + * Clean LokiQueueMetadataStore. + * + * @returns {Promise} + * @memberof LokiQueueMetadataStore + */ + public async clean(): Promise { + if (this.isClosed()) { + await rimrafAsync(this.lokiDBPath); + + return; + } + throw new Error(`Cannot clean LokiQueueMetadataStore, it's not closed.`); + } + /** * Update queue service properties. Create service properties document if not exists in persistency layer. * Assume service properties collection has been created during start method. diff --git a/src/queue/utils/constants.ts b/src/queue/utils/constants.ts index 77ca49225..e86fedc47 100644 --- a/src/queue/utils/constants.ts +++ b/src/queue/utils/constants.ts @@ -20,17 +20,17 @@ export const NEVER_EXPIRE_DATE = new Date("9999-12-31T23:59:59.999Z"); export const QUEUE_SERVICE_PERMISSION = "raup"; export const LIST_QUEUE_MAXRESSULTS_MIN = 1; export const LIST_QUEUE_MAXRESSULTS_MAX = 2147483647; -export const DEFUALT_DEQUEUE_VISIBILITYTIMEOUT = 30; // 30s as default. +export const DEFAULT_DEQUEUE_VISIBILITYTIMEOUT = 30; // 30s as default. export const DEQUEUE_VISIBILITYTIMEOUT_MIN = 1; export const DEQUEUE_VISIBILITYTIMEOUT_MAX = 604800; export const DEQUEUE_NUMOFMESSAGES_MIN = 1; export const DEQUEUE_NUMOFMESSAGES_MAX = 32; export const MESSAGETEXT_LENGTH_MAX = 65536; -export const DEFUALT_MESSAGETTL = 604800; // 604800s (7 day) as default. +export const DEFAULT_MESSAGETTL = 604800; // 604800s (7 day) as default. export const ENQUEUE_VISIBILITYTIMEOUT_MIN = 0; export const ENQUEUE_VISIBILITYTIMEOUT_MAX = 604800; export const MESSAGETTL_MIN = 1; -export const DEFUALT_UPDATE_VISIBILITYTIMEOUT = 30; // 30s as default. +export const DEFAULT_UPDATE_VISIBILITYTIMEOUT = 30; // 30s as default. export const UPDATE_VISIBILITYTIMEOUT_MIN = 0; export const UPDATE_VISIBILITYTIMEOUT_MAX = 604800; diff --git a/src/table/ITableEnvironment.ts b/src/table/ITableEnvironment.ts index 79dbbd24e..bbd0b2374 100644 --- a/src/table/ITableEnvironment.ts +++ b/src/table/ITableEnvironment.ts @@ -20,4 +20,6 @@ export default interface ITableEnvironment { disableProductStyleUrl(): boolean; /** Optional. Enable debug log by providing a valid local file, path as log destination path as log destination */ debug(): Promise; + /** Optional. Disable persisting any data to disk. If the Azurite process is terminated, all data is lost */ + inMemoryPersistence(): boolean; } diff --git a/src/table/TableConfiguration.ts b/src/table/TableConfiguration.ts index a63fcb4d5..7b7e89717 100644 --- a/src/table/TableConfiguration.ts +++ b/src/table/TableConfiguration.ts @@ -35,7 +35,8 @@ export default class TableConfiguration extends ConfigurationBase { key: string = "", pwd: string = "", oauth?: string, - disableProductStyleUrl: boolean = false + disableProductStyleUrl: boolean = false, + public readonly isMemoryPersistence: boolean = false, ) { super( host, diff --git a/src/table/TableEnvironment.ts b/src/table/TableEnvironment.ts index 5e016ae89..bc4477a9e 100644 --- a/src/table/TableEnvironment.ts +++ b/src/table/TableEnvironment.ts @@ -23,7 +23,8 @@ args .option( ["l", "location"], "Optional. Use an existing folder as workspace path, default is current working directory", - process.cwd() + "", + s => s == "" ? undefined : s ) .option(["s", "silent"], "Optional. Disable access log displayed in console") .option( @@ -38,6 +39,10 @@ args ["", "disableProductStyleUrl"], "Optional. Disable getting account name from the host of request Uri, always get account name from the first path segment of request Uri." ) + .option( + ["", "inMemoryPersistence"], + "Optional. Disable persisting any data to disk. If the Azurite process is terminated, all data is lost" + ) .option( ["d", "debug"], "Optional. Enable debug log by providing a valid local file path as log destination" @@ -100,6 +105,16 @@ export default class TableEnvironment implements ITableEnvironment { return false; } + public inMemoryPersistence(): boolean { + if (this.flags.inMemoryPersistence !== undefined) { + if (this.flags.location) { + throw new RangeError(`The --inMemoryPersistence option is not supported when the --location option is set.`) + } + return true; + } + return false; + } + public async debug(): Promise { if (typeof this.flags.debug === "string") { // Enable debug log to file diff --git a/src/table/TableServer.ts b/src/table/TableServer.ts index 0968f3768..43e7e3126 100644 --- a/src/table/TableServer.ts +++ b/src/table/TableServer.ts @@ -9,7 +9,7 @@ import logger from "../common/Logger"; import ITableMetadataStore from "../table/persistence/ITableMetadataStore"; import LokiTableMetadataStore from "../table/persistence/LokiTableMetadataStore"; -import ServerBase from "../common/ServerBase"; +import ServerBase, { ServerStatus } from "../common/ServerBase"; import TableConfiguration from "./TableConfiguration"; import TableRequestListenerFactory from "./TableRequestListenerFactory"; @@ -50,7 +50,8 @@ export default class TableServer extends ServerBase { // Create **dataStore with Loki.js const metadataStore: ITableMetadataStore = new LokiTableMetadataStore( - configuration.metadataDBPath + configuration.metadataDBPath, + configuration.isMemoryPersistence ); const accountDataStore: IAccountDataStore = new AccountDataStore(logger); @@ -73,6 +74,20 @@ export default class TableServer extends ServerBase { this.accountDataStore = accountDataStore; } + public async clean(): Promise { + if (this.getStatus() === ServerStatus.Closed) { + if (this.metadataStore !== undefined) { + await this.metadataStore.clean(); + } + + if (this.accountDataStore !== undefined) { + await this.accountDataStore.clean(); + } + return; + } + throw Error(`Cannot clean up table server in status ${this.getStatus()}.`); + } + protected async beforeStart(): Promise { const msg = `Azurite Table service is starting on ${this.host}:${this.port}`; logger.info(msg); diff --git a/src/table/main.ts b/src/table/main.ts index 63a760a75..7f497cd14 100644 --- a/src/table/main.ts +++ b/src/table/main.ts @@ -29,7 +29,7 @@ async function main() { await access(dirname(debugFilePath)); } - // Store table configuation + // Store table configuration const config = new TableConfiguration( env.tableHost(), env.tablePort(), @@ -44,7 +44,8 @@ async function main() { env.key(), env.pwd(), env.oauth(), - env.disableProductStyleUrl() + env.disableProductStyleUrl(), + env.inMemoryPersistence(), ); // We use logger singleton as global debugger logger to track detailed outputs cross layers @@ -78,7 +79,7 @@ async function main() { }) .once("SIGINT", () => { console.log(beforeCloseMessage); - server.clean().then(() => { + server.close().then(() => { console.log(afterCloseMessage); }); }); diff --git a/src/table/persistence/ITableMetadataStore.ts b/src/table/persistence/ITableMetadataStore.ts index a414ef7c9..8e5f8fde6 100644 --- a/src/table/persistence/ITableMetadataStore.ts +++ b/src/table/persistence/ITableMetadataStore.ts @@ -1,3 +1,4 @@ +import ICleaner from "../../common/ICleaner"; import * as Models from "../generated/artifacts/models"; import Context from "../generated/Context"; /** MODELS FOR SERVICE */ @@ -45,7 +46,7 @@ export interface IEntity { export type Entity = IEntity & IOdataAnnotationsOptional; -export default interface ITableMetadataStore { +export default interface ITableMetadataStore extends ICleaner { createTable(context: Context, tableModel: Table): Promise; queryTable( context: Context, diff --git a/src/table/persistence/LokiTableMetadataStore.ts b/src/table/persistence/LokiTableMetadataStore.ts index eedb44409..55186ee5d 100644 --- a/src/table/persistence/LokiTableMetadataStore.ts +++ b/src/table/persistence/LokiTableMetadataStore.ts @@ -9,6 +9,7 @@ import { Entity, Table } from "../persistence/ITableMetadataStore"; import { ODATA_TYPE, QUERY_RESULT_MAX_NUM } from "../utils/constants"; import ITableMetadataStore, { TableACL } from "./ITableMetadataStore"; import LokiTableStoreQueryGenerator from "./LokiTableStoreQueryGenerator"; +import { rimrafAsync } from "../../common/utils/utils"; /** MODELS FOR SERVICE */ interface IServiceAdditionalProperties { @@ -32,8 +33,11 @@ export default class LokiTableMetadataStore implements ITableMetadataStore { private transactionRollbackTheseEntities: Entity[] = []; // can maybe use Entity instead of any private transactionDeleteTheseEntities: Entity[] = []; // can maybe use Entity instead of any - public constructor(public readonly lokiDBPath: string) { - this.db = new Loki(lokiDBPath, { + public constructor(public readonly lokiDBPath: string, inMemory: boolean) { + this.db = new Loki(lokiDBPath, inMemory ? { + persistenceMethod: "memory" + } : { + persistenceMethod: "fs", autosave: true, autosaveInterval: 5000 }); @@ -73,6 +77,21 @@ export default class LokiTableMetadataStore implements ITableMetadataStore { this.closed = true; } + /** + * Clean LokiTableMetadataStore. + * + * @returns {Promise} + * @memberof LokiTableMetadataStore + */ + public async clean(): Promise { + if (this.isClosed()) { + await rimrafAsync(this.lokiDBPath); + + return; + } + throw new Error(`Cannot clean LokiTableMetadataStore, it's not closed.`); + } + public isInitialized(): boolean { return this.initialized; } diff --git a/tests/BlobTestServerFactory.ts b/tests/BlobTestServerFactory.ts index c37c19848..d83b5a4c0 100644 --- a/tests/BlobTestServerFactory.ts +++ b/tests/BlobTestServerFactory.ts @@ -14,6 +14,7 @@ export default class BlobTestServerFactory { ): BlobServer | SqlBlobServer { const databaseConnectionString = process.env.AZURITE_TEST_DB; const isSQL = databaseConnectionString !== undefined; + const inMemoryPersistence = process.env.AZURITE_TEST_INMEMORYPERSISTENCE !== undefined; const port = 11000; const host = "127.0.0.1"; @@ -28,6 +29,10 @@ export default class BlobTestServerFactory { const key = https ? "tests/server.key" : undefined; if (isSQL) { + if (inMemoryPersistence) { + throw new Error(`The in-memory persistence settings is not supported when using SQL-based metadata.`) + } + const config = new SqlBlobConfiguration( host, port, @@ -43,7 +48,8 @@ export default class BlobTestServerFactory { cert, key, undefined, - oauth + oauth, + undefined, ); return new SqlBlobServer(config); @@ -65,7 +71,9 @@ export default class BlobTestServerFactory { cert, key, undefined, - oauth + oauth, + undefined, + inMemoryPersistence ); return new BlobServer(config); } diff --git a/tests/blob/blockblob.highlevel.test.ts b/tests/blob/blockblob.highlevel.test.ts index 22bac9fb3..f2057eeed 100644 --- a/tests/blob/blockblob.highlevel.test.ts +++ b/tests/blob/blockblob.highlevel.test.ts @@ -78,14 +78,14 @@ describe("BlockBlobHighlevel", () => { } tempFileLarge = await createRandomLocalFile( tempFolderPath, - 257, - 1024 * 1024 + 8224, + 1024 * 32 ); tempFileLargeLength = 257 * 1024 * 1024; tempFileSmall = await createRandomLocalFile( tempFolderPath, - 15, - 1024 * 1024 + 480, + 1024 * 32 ); tempFileSmallLength = 15 * 1024 * 1024; }); diff --git a/tests/blob/memoryStore.unit.test.ts b/tests/blob/memoryStore.unit.test.ts new file mode 100644 index 000000000..1378d38dc --- /dev/null +++ b/tests/blob/memoryStore.unit.test.ts @@ -0,0 +1,169 @@ +import assert = require("assert"); +import { IMemoryExtentChunk, MemoryExtentChunkStore, SharedChunkStore } from "../../src/common/persistence/MemoryExtentStore"; +import { totalmem } from "os"; + +function chunk(id: string, count: number, fill?: string): IMemoryExtentChunk { + return { + id, + chunks: [Buffer.alloc(count, fill)], + count: count, + offset: 0, + } +} + +describe("MemoryExtentChunkStore", () => { + + it("should limit max size with try set @loki", () => { + const store = new MemoryExtentChunkStore(1000); + store.set("blob", chunk("a", 1000)) + + assert.strictEqual(false, store.trySet("blob", chunk("b", 1))) + }); + + it("updates current size for add @loki", () => { + const store = new MemoryExtentChunkStore(1000); + + store.set("blob", chunk("a", 555)) + store.set("blob", chunk("b", 1)) + store.set("blob", chunk("c", 123)) + + assert.strictEqual(679, store.totalSize()) + }); + + it("updates current size based on count property @loki", () => { + const store = new MemoryExtentChunkStore(1000); + + store.set("blob", { + id: "a", + chunks: [Buffer.alloc(10, "a"), Buffer.alloc(20, "b")], + count: 15, // a lie, for testing + offset: 0 + }) + + assert.strictEqual(15, store.totalSize()) + }); + + it("updates current size for delete @loki", () => { + const store = new MemoryExtentChunkStore(1000); + store.set("blob", chunk("a", 555)) + store.set("blob", chunk("b", 1)) + store.set("blob", chunk("c", 123)) + + store.delete("blob", "b") + + assert.strictEqual(678, store.totalSize()) + }); + + it("allows size limit to be updated @loki", () => { + const store = new MemoryExtentChunkStore(1000); + store.set("blob", chunk("a", 20)) + + store.setSizeLimit(50) + + assert.throws( + () => store.set("blob", chunk("b", 31)), + /Cannot add an extent chunk to the in-memory store. Size limit of 50 bytes will be exceeded./) + }); + + it("prevents size limit from being set lower than the current size @loki", () => { + const store = new MemoryExtentChunkStore(1000); + store.set("blob", chunk("a", 20)) + + assert.strictEqual(false, store.setSizeLimit(19)) + assert.strictEqual(1000, store.sizeLimit()) + }); + + it("updates current size with delta when ID is replaced @loki", () => { + const store = new MemoryExtentChunkStore(1000); + store.set("blob", chunk("a", 555)) + store.set("blob", chunk("b", 1)) + + store.set("blob", chunk("a", 123)) + + assert.strictEqual(124, store.totalSize()) + }); + + it("resets current size for clear @loki", () => { + const store = new MemoryExtentChunkStore(1000); + store.set("blob", chunk("a", 555)) + store.set("blob", chunk("b", 1)) + store.set("blob", chunk("c", 123)) + + store.clear("blob") + + assert.strictEqual(0, store.totalSize()) + }); + + it("replaces buffers if ID is existing @loki", () => { + const store = new MemoryExtentChunkStore(1000); + store.set("blob", chunk("a", 11, "0")) + + store.set("blob", chunk("a", 12, "1")) + + const existing = store.get("blob", "a") + assert.strictEqual(1, existing?.chunks.length) + assert.deepStrictEqual(Buffer.alloc(12, "1"), existing?.chunks[0]) + }); + + it("keeps categories separate for set and delete @loki", () => { + const store = new MemoryExtentChunkStore(1000); + store.set("queue", chunk("a", 12, "0")) + store.set("blob", chunk("a", 11, "1")) + + store.delete("blob", "a") + + const existing = store.get("queue", "a") + assert.deepStrictEqual([Buffer.alloc(12, "0")], existing?.chunks) + assert.strictEqual(12, store.totalSize()) + }); + + it("only clears a single category at a time @loki", () => { + const store = new MemoryExtentChunkStore(1000); + store.set("queue", chunk("a", 12, "0")) + store.set("blob", chunk("a", 11, "1")) + + store.clear("queue") + + assert.strictEqual(11, store.totalSize()) + }); + + it("can clear all categories clears a single category at a time @loki", () => { + const store = new MemoryExtentChunkStore(1000); + store.set("queue", chunk("a", 12, "0")) + store.set("blob", chunk("a", 11, "1")) + + store.clear("queue") + store.clear("blob") + + assert.strictEqual(0, store.totalSize()) + assert.strictEqual(undefined, store.get("queue", "a")) + assert.strictEqual(undefined, store.get("blob", "a")) + }); + + it("all categories contribute to the same limit @loki", () => { + const store = new MemoryExtentChunkStore(1000); + store.set("queue", chunk("a", 50, "0")) + store.set("blob", chunk("a", 50, "1")) + + const success = store.trySet("queue", chunk("b", 925)) + + assert.strictEqual(false, success) + assert.strictEqual(100, store.totalSize()) + }); + + it("allows deletion by ID @loki", () => { + const store = new MemoryExtentChunkStore(1000); + store.set("blob", chunk("a", 11, "0")) + + store.delete("blob", "a") + + const existing = store.get("blob", "a") + assert.strictEqual(undefined, existing) + }); + + it("should have a shared instance defaulting to close to 50% of the total bytes @loki", () => { + assert.ok(SharedChunkStore.sizeLimit(), "The default store's size limit should be set.") + assert.ok(SharedChunkStore.sizeLimit()! > 0.49 * totalmem()) + assert.ok(SharedChunkStore.sizeLimit()! < 0.51 * totalmem()) + }); +}); diff --git a/tests/exe.test.ts b/tests/exe.test.ts index e1e70387b..73b67cecf 100644 --- a/tests/exe.test.ts +++ b/tests/exe.test.ts @@ -36,6 +36,7 @@ import { overrideRequest, restoreBuildRequestOptions } from "./testutils"; +import { existsSync } from "fs"; // server address used for testing. Note that Azurite.exe has // server address of http://127.0.0.1:10000 and so on by default @@ -53,6 +54,14 @@ configLogger(false); // Azure Storage Connection String (using SAS or Key). const testLocalAzuriteInstance = true; +const binaryPath = ".\\release\\azurite.exe" + +function throwOnMissingBinary() { + if (!existsSync(binaryPath)) { + throw new Error("The Windows binary does not exist. You must build it first using 'npm run build:exe'.") + } +} + describe("exe test", () => { const tableService = Azure.createTableService( createConnectionStringForTest(testLocalAzuriteInstance) @@ -65,11 +74,15 @@ describe("exe test", () => { let childPid: number; + beforeEach(() => throwOnMissingBinary()) + before(async () => { + throwOnMissingBinary() + overrideRequest(requestOverride, tableService); tableName = getUniqueName("table"); const child = execFile( - ".\\release\\azurite.exe", + binaryPath, ["--blobPort 11000", "--queuePort 11001", "--tablePort 11002"], { cwd: process.cwd(), shell: true, env: {} } ); @@ -116,10 +129,14 @@ describe("exe test", () => { tableService.removeAllListeners(); await find("name", "azurite.exe", true).then((list: any) => { - process.kill(list[0].pid); + if (list.length > 0) { + process.kill(list[0].pid); + } }); - process.kill(childPid); + if (childPid) { + process.kill(childPid); + } }); describe("table test", () => { diff --git a/tests/linuxbinary.test.ts b/tests/linuxbinary.test.ts index 4a888f27a..7bfcac2ef 100644 --- a/tests/linuxbinary.test.ts +++ b/tests/linuxbinary.test.ts @@ -23,6 +23,7 @@ import { bodyToString, EMULATOR_ACCOUNT_KEY, EMULATOR_ACCOUNT_NAME, getUniqueName, overrideRequest, restoreBuildRequestOptions } from './testutils'; +import { existsSync } from 'fs'; // server address used for testing. Note that Azuritelinux has // server address of http://127.0.0.1:10000 and so on by default @@ -40,6 +41,14 @@ configLogger(false); // Azure Storage Connection String (using SAS or Key). const testLocalAzuriteInstance = true; +const binaryPath = "./release/azuritelinux" + +function throwOnMissingBinary() { + if (!existsSync(binaryPath)) { + throw new Error("The Linux binary does not exist. You must build it first using 'npm run build:linux'.") + } +} + describe("linux binary test", () => { const tableService = Azure.createTableService( @@ -53,10 +62,14 @@ describe("linux binary test", () => { let childPid: number; + beforeEach(() => throwOnMissingBinary()) + before(async () => { + throwOnMissingBinary() + overrideRequest(requestOverride, tableService); tableName = getUniqueName("table"); - const child = execFile("./release/azuritelinux", ["--blobPort 11000", "--queuePort 11001", "--tablePort 11002"], { cwd: process.cwd(), shell: true, env: {} }); + const child = execFile(binaryPath, ["--blobPort 11000", "--queuePort 11001", "--tablePort 11002"], { cwd: process.cwd(), shell: true, env: {} }); childPid = child.pid; @@ -89,10 +102,14 @@ describe("linux binary test", () => { tableService.removeAllListeners(); await find('name', 'azuritelinux', true).then((list: any) => { - process.kill(list[0].pid); + if (list.length > 0) { + process.kill(list[0].pid); + } }); - process.kill(childPid); + if (childPid) { + process.kill(childPid); + } }); describe("table test", () => { diff --git a/tests/queue/apis/messageid.test.ts b/tests/queue/apis/messageid.test.ts index 8827d86e4..095ea44f1 100644 --- a/tests/queue/apis/messageid.test.ts +++ b/tests/queue/apis/messageid.test.ts @@ -9,7 +9,6 @@ import { import { configLogger } from "../../../src/common/Logger"; import { StoreDestinationArray } from "../../../src/common/persistence/IExtentStore"; -import QueueConfiguration from "../../../src/queue/QueueConfiguration"; import Server from "../../../src/queue/QueueServer"; import { EMULATOR_ACCOUNT_KEY, @@ -18,6 +17,7 @@ import { rmRecursive, sleep } from "../../testutils"; +import QueueTestServerFactory from "../utils/QueueTestServerFactory"; // Set true to enable debug log configLogger(false); @@ -30,7 +30,7 @@ describe("MessageId APIs test", () => { const extentDbPath = "__extentTestsStorage__"; const persistencePath = "__queueTestsPersistence__"; - const DEFUALT_QUEUE_PERSISTENCE_ARRAY: StoreDestinationArray = [ + const DEFAULT_QUEUE_PERSISTENCE_ARRAY: StoreDestinationArray = [ { locationId: "queueTest", locationPath: persistencePath, @@ -38,15 +38,6 @@ describe("MessageId APIs test", () => { } ]; - const config = new QueueConfiguration( - host, - port, - metadataDbPath, - extentDbPath, - DEFUALT_QUEUE_PERSISTENCE_ARRAY, - false - ); - const baseURL = `http://${host}:${port}/devstoreaccount1`; const serviceClient = new QueueServiceClient( baseURL, @@ -68,7 +59,11 @@ describe("MessageId APIs test", () => { const messageContent = "Hello World"; before(async () => { - server = new Server(config); + server = new QueueTestServerFactory().createServer({ + metadataDBPath: metadataDbPath, + extentDBPath: extentDbPath, + persistencePathArray: DEFAULT_QUEUE_PERSISTENCE_ARRAY, + }); await server.start(); }); diff --git a/tests/queue/apis/messages.test.ts b/tests/queue/apis/messages.test.ts index 2056491b6..01f961936 100644 --- a/tests/queue/apis/messages.test.ts +++ b/tests/queue/apis/messages.test.ts @@ -9,7 +9,6 @@ import { import { configLogger } from "../../../src/common/Logger"; import { StoreDestinationArray } from "../../../src/common/persistence/IExtentStore"; -import QueueConfiguration from "../../../src/queue/QueueConfiguration"; import Server from "../../../src/queue/QueueServer"; import { EMULATOR_ACCOUNT_KEY, @@ -18,6 +17,7 @@ import { rmRecursive, sleep } from "../../testutils"; +import QueueTestServerFactory from "../utils/QueueTestServerFactory"; // Set true to enable debug log configLogger(false); @@ -30,7 +30,7 @@ describe("Messages APIs test", () => { const extentDbPath = "__extentTestsStorage__"; const persistencePath = "__queueTestsPersistence__"; - const DEFUALT_QUEUE_PERSISTENCE_ARRAY: StoreDestinationArray = [ + const DEFAULT_QUEUE_PERSISTENCE_ARRAY: StoreDestinationArray = [ { locationId: "queueTest", locationPath: persistencePath, @@ -38,15 +38,6 @@ describe("Messages APIs test", () => { } ]; - const config = new QueueConfiguration( - host, - port, - metadataDbPath, - extentDbPath, - DEFUALT_QUEUE_PERSISTENCE_ARRAY, - false - ); - const baseURL = `http://${host}:${port}/devstoreaccount1`; const serviceClient = new QueueServiceClient( baseURL, @@ -67,7 +58,11 @@ describe("Messages APIs test", () => { const messageContent = "Hello World"; before(async () => { - server = new Server(config); + server = new QueueTestServerFactory().createServer({ + metadataDBPath: metadataDbPath, + extentDBPath: extentDbPath, + persistencePathArray: DEFAULT_QUEUE_PERSISTENCE_ARRAY + }); await server.start(); }); diff --git a/tests/queue/apis/queue.test.ts b/tests/queue/apis/queue.test.ts index d5a1bf733..d1e1f247a 100644 --- a/tests/queue/apis/queue.test.ts +++ b/tests/queue/apis/queue.test.ts @@ -9,7 +9,6 @@ import { import { configLogger } from "../../../src/common/Logger"; import { StoreDestinationArray } from "../../../src/common/persistence/IExtentStore"; -import QueueConfiguration from "../../../src/queue/QueueConfiguration"; import Server from "../../../src/queue/QueueServer"; import { EMULATOR_ACCOUNT_KEY, @@ -17,6 +16,7 @@ import { getUniqueName, rmRecursive } from "../../testutils"; +import QueueTestServerFactory from "../utils/QueueTestServerFactory"; // Set true to enable debug log configLogger(false); @@ -29,7 +29,7 @@ describe("Queue APIs test", () => { const extentDbPath = "__queueExtentTestsStorage__"; const persistencePath = "__queueTestsPersistence__"; - const DEFUALT_QUEUE_PERSISTENCE_ARRAY: StoreDestinationArray = [ + const DEFAULT_QUEUE_PERSISTENCE_ARRAY: StoreDestinationArray = [ { locationId: "queueTest", locationPath: persistencePath, @@ -37,15 +37,6 @@ describe("Queue APIs test", () => { } ]; - const config = new QueueConfiguration( - host, - port, - metadataDbPath, - extentDbPath, - DEFUALT_QUEUE_PERSISTENCE_ARRAY, - false - ); - const baseURL = `http://${host}:${port}/devstoreaccount1`; const serviceClient = new QueueServiceClient( baseURL, @@ -65,7 +56,11 @@ describe("Queue APIs test", () => { let queueClient: QueueClient; before(async () => { - server = new Server(config); + server = new QueueTestServerFactory().createServer({ + metadataDBPath: metadataDbPath, + extentDBPath: extentDbPath, + persistencePathArray: DEFAULT_QUEUE_PERSISTENCE_ARRAY + }); await server.start(); }); diff --git a/tests/queue/apis/queueService.test.ts b/tests/queue/apis/queueService.test.ts index ff5de1e52..519282e6c 100644 --- a/tests/queue/apis/queueService.test.ts +++ b/tests/queue/apis/queueService.test.ts @@ -7,7 +7,6 @@ import * as assert from "assert"; import { configLogger } from "../../../src/common/Logger"; import { StoreDestinationArray } from "../../../src/common/persistence/IExtentStore"; -import QueueConfiguration from "../../../src/queue/QueueConfiguration"; import Server from "../../../src/queue/QueueServer"; import { EMULATOR_ACCOUNT_KEY, @@ -16,6 +15,7 @@ import { rmRecursive, sleep } from "../../testutils"; +import QueueTestServerFactory from "../utils/QueueTestServerFactory"; // Set true to enable debug log configLogger(false); @@ -28,7 +28,7 @@ describe("QueueServiceAPIs", () => { const extentDbPath = "__extentTestsStorage__"; const persistencePath = "__queueTestsPersistence__"; - const DEFUALT_QUEUE_PERSISTENCE_ARRAY: StoreDestinationArray = [ + const DEFAULT_QUEUE_PERSISTENCE_ARRAY: StoreDestinationArray = [ { locationId: "queueTest", locationPath: persistencePath, @@ -36,15 +36,6 @@ describe("QueueServiceAPIs", () => { } ]; - const config = new QueueConfiguration( - host, - port, - metadataDbPath, - extentDbPath, - DEFUALT_QUEUE_PERSISTENCE_ARRAY, - false - ); - const baseURL = `http://${host}:${port}/devstoreaccount1`; const serviceClient = new QueueServiceClient( baseURL, @@ -62,7 +53,11 @@ describe("QueueServiceAPIs", () => { let server: Server; before(async () => { - server = new Server(config); + server = new QueueTestServerFactory().createServer({ + metadataDBPath: metadataDbPath, + extentDBPath: extentDbPath, + persistencePathArray: DEFAULT_QUEUE_PERSISTENCE_ARRAY + }) await server.start(); }); @@ -270,7 +265,7 @@ describe("QueueServiceAPIs - secondary location endpoint", () => { const extentDbPath = "__extentTestsStorage__"; const persistencePath = "__queueTestsPersistence__"; - const DEFUALT_QUEUE_PERSISTENCE_ARRAY: StoreDestinationArray = [ + const DEFAULT_QUEUE_PERSISTENCE_ARRAY: StoreDestinationArray = [ { locationId: "queueTest", locationPath: persistencePath, @@ -278,15 +273,6 @@ describe("QueueServiceAPIs - secondary location endpoint", () => { } ]; - const config = new QueueConfiguration( - host, - port, - metadataDbPath, - extentDbPath, - DEFUALT_QUEUE_PERSISTENCE_ARRAY, - false - ); - const baseURL = `http://${host}:${port}/devstoreaccount1-secondary`; const serviceClient = new QueueServiceClient( baseURL, @@ -304,7 +290,11 @@ describe("QueueServiceAPIs - secondary location endpoint", () => { let server: Server; before(async () => { - server = new Server(config); + server = new QueueTestServerFactory().createServer({ + metadataDBPath: metadataDbPath, + extentDBPath: extentDbPath, + persistencePathArray: DEFAULT_QUEUE_PERSISTENCE_ARRAY + }); await server.start(); }); diff --git a/tests/queue/https.test.ts b/tests/queue/https.test.ts index d342996b5..97807dbb7 100644 --- a/tests/queue/https.test.ts +++ b/tests/queue/https.test.ts @@ -6,7 +6,6 @@ import { import { configLogger } from "../../src/common/Logger"; import { StoreDestinationArray } from "../../src/common/persistence/IExtentStore"; -import QueueConfiguration from "../../src/queue/QueueConfiguration"; import Server from "../../src/queue/QueueServer"; import { EMULATOR_ACCOUNT_KEY, @@ -14,6 +13,7 @@ import { getUniqueName, rmRecursive } from "../testutils"; +import QueueTestServerFactory from "./utils/QueueTestServerFactory"; // Set true to enable debug log configLogger(false); @@ -26,7 +26,7 @@ describe("Queue HTTPS", () => { const extentDbPath = "__extentTestsStorage__"; const persistencePath = "__queueTestsPersistence__"; - const DEFUALT_QUEUE_PERSISTENCE_ARRAY: StoreDestinationArray = [ + const DEFAULT_QUEUE_PERSISTENCE_ARRAY: StoreDestinationArray = [ { locationId: "queueTest", locationPath: persistencePath, @@ -34,26 +34,15 @@ describe("Queue HTTPS", () => { } ]; - const config = new QueueConfiguration( - host, - port, - metadataDbPath, - extentDbPath, - DEFUALT_QUEUE_PERSISTENCE_ARRAY, - false, - undefined, - undefined, - undefined, - false, - false, - "tests/server.cert", - "tests/server.key" - ); - let server: Server; before(async () => { - server = new Server(config); + server = new QueueTestServerFactory().createServer({ + metadataDBPath: metadataDbPath, + extentDBPath: extentDbPath, + persistencePathArray: DEFAULT_QUEUE_PERSISTENCE_ARRAY, + https: true + }); await server.start(); }); diff --git a/tests/queue/oauth.test.ts b/tests/queue/oauth.test.ts index 7494e0b37..99f394181 100644 --- a/tests/queue/oauth.test.ts +++ b/tests/queue/oauth.test.ts @@ -5,9 +5,9 @@ import Server from "../../src/queue/QueueServer"; import { configLogger } from "../../src/common/Logger"; import { StoreDestinationArray } from "../../src/common/persistence/IExtentStore"; -import QueueConfiguration from "../../src/queue/QueueConfiguration"; import { EMULATOR_ACCOUNT_KEY, generateJWTToken, getUniqueName } from "../testutils"; import { SimpleTokenCredential } from "../simpleTokenCredential"; +import QueueTestServerFactory from "./utils/QueueTestServerFactory"; // Set true to enable debug log configLogger(false); @@ -20,7 +20,7 @@ describe("Queue OAuth Basic", () => { const extentDbPath = "__extentTestsStorage__"; const persistencePath = "__queueTestsPersistence__"; - const DEFUALT_QUEUE_PERSISTENCE_ARRAY: StoreDestinationArray = [ + const DEFAULT_QUEUE_PERSISTENCE_ARRAY: StoreDestinationArray = [ { locationId: "queueTest", locationPath: persistencePath, @@ -28,30 +28,18 @@ describe("Queue OAuth Basic", () => { } ]; - const config = new QueueConfiguration( - host, - port, - metadataDbPath, - extentDbPath, - DEFUALT_QUEUE_PERSISTENCE_ARRAY, - false, - undefined, - undefined, - undefined, - false, - false, - "tests/server.cert", - "tests/server.key", - undefined, - "basic" - ); - let server: Server; const baseURL = `https://${host}:${port}/devstoreaccount1`; before(async () => { - server = new Server(config); + server = new QueueTestServerFactory().createServer({ + metadataDBPath: metadataDbPath, + extentDBPath: extentDbPath, + persistencePathArray: DEFAULT_QUEUE_PERSISTENCE_ARRAY, + https: true, + oauth: "basic" + }) await server.start(); }); @@ -534,25 +522,12 @@ describe("Queue OAuth Basic", () => { await server.close(); await server.clean(); - server = new Server( - new QueueConfiguration( - host, - port, - metadataDbPath, - extentDbPath, - DEFUALT_QUEUE_PERSISTENCE_ARRAY, - false, - undefined, - undefined, - undefined, - false, - false, - undefined, - undefined, - undefined, - "basic" - ) - ); + server = new QueueTestServerFactory().createServer({ + metadataDBPath: metadataDbPath, + extentDBPath: extentDbPath, + persistencePathArray: DEFAULT_QUEUE_PERSISTENCE_ARRAY, + oauth: "basic" + }) await server.start(); const httpBaseURL = `http://${server.config.host}:${server.config.port}/devstoreaccount1`; diff --git a/tests/queue/queueAuthentication.test.ts b/tests/queue/queueAuthentication.test.ts index 2994b7912..0d4f72b32 100644 --- a/tests/queue/queueAuthentication.test.ts +++ b/tests/queue/queueAuthentication.test.ts @@ -9,7 +9,6 @@ import { import { configLogger } from "../../src/common/Logger"; import { StoreDestinationArray } from "../../src/common/persistence/IExtentStore"; -import QueueConfiguration from "../../src/queue/QueueConfiguration"; import Server from "../../src/queue/QueueServer"; import { EMULATOR_ACCOUNT_KEY, @@ -17,6 +16,7 @@ import { getUniqueName, rmRecursive } from "../testutils"; +import QueueTestServerFactory from "./utils/QueueTestServerFactory"; // Set true to enable debug log configLogger(false); @@ -29,7 +29,7 @@ describe("Queue Authentication", () => { const extentDbPath = "__extentTestsStorage__"; const persistencePath = "__queueTestsPersistence__"; - const DEFUALT_QUEUE_PERSISTENCE_ARRAY: StoreDestinationArray = [ + const DEFAULT_QUEUE_PERSISTENCE_ARRAY: StoreDestinationArray = [ { locationId: "queueTest", locationPath: persistencePath, @@ -37,19 +37,14 @@ describe("Queue Authentication", () => { } ]; - const config = new QueueConfiguration( - host, - port, - metadataDbPath, - extentDbPath, - DEFUALT_QUEUE_PERSISTENCE_ARRAY, - false - ); - let server: Server; before(async () => { - server = new Server(config); + server = new QueueTestServerFactory().createServer({ + metadataDBPath: metadataDbPath, + extentDBPath: extentDbPath, + persistencePathArray: DEFAULT_QUEUE_PERSISTENCE_ARRAY + }); await server.start(); }); diff --git a/tests/queue/queueCorsRequest.test.ts b/tests/queue/queueCorsRequest.test.ts index 9e06d97f5..5753b2681 100644 --- a/tests/queue/queueCorsRequest.test.ts +++ b/tests/queue/queueCorsRequest.test.ts @@ -7,7 +7,6 @@ import * as assert from "assert"; import { configLogger } from "../../src/common/Logger"; import { StoreDestinationArray } from "../../src/common/persistence/IExtentStore"; -import QueueConfiguration from "../../src/queue/QueueConfiguration"; import Server from "../../src/queue/QueueServer"; import { EMULATOR_ACCOUNT_KEY, @@ -17,6 +16,7 @@ import { } from "../testutils"; import OPTIONSRequestPolicyFactory from "./RequestPolicy/OPTIONSRequestPolicyFactory"; import OriginPolicyFactory from "./RequestPolicy/OriginPolicyFactory"; +import QueueTestServerFactory from "./utils/QueueTestServerFactory"; // Set true to enable debug log configLogger(false); @@ -29,7 +29,7 @@ describe("Queue Cors requests test", () => { const extentDbPath = "__extentTestsStorage__"; const persistencePath = "__queueTestsPersistence__"; - const DEFUALT_QUEUE_PERSISTENCE_ARRAY: StoreDestinationArray = [ + const DEFAULT_QUEUE_PERSISTENCE_ARRAY: StoreDestinationArray = [ { locationId: "queueTest", locationPath: persistencePath, @@ -37,15 +37,6 @@ describe("Queue Cors requests test", () => { } ]; - const config = new QueueConfiguration( - host, - port, - metadataDbPath, - extentDbPath, - DEFUALT_QUEUE_PERSISTENCE_ARRAY, - false - ); - const baseURL = `http://${host}:${port}/devstoreaccount1`; const serviceClient = new QueueServiceClient( baseURL, @@ -62,7 +53,11 @@ describe("Queue Cors requests test", () => { let server: Server; before(async () => { - server = new Server(config); + server = new QueueTestServerFactory().createServer({ + metadataDBPath: metadataDbPath, + extentDBPath: metadataDbPath, + persistencePathArray: DEFAULT_QUEUE_PERSISTENCE_ARRAY + }); await server.start(); }); diff --git a/tests/queue/queueSas.test.ts b/tests/queue/queueSas.test.ts index 05f641f5a..e917434bc 100644 --- a/tests/queue/queueSas.test.ts +++ b/tests/queue/queueSas.test.ts @@ -17,7 +17,6 @@ import { import { configLogger } from "../../src/common/Logger"; import { StoreDestinationArray } from "../../src/common/persistence/IExtentStore"; -import QueueConfiguration from "../../src/queue/QueueConfiguration"; import Server from "../../src/queue/QueueServer"; import { EMULATOR_ACCOUNT_KEY, @@ -26,6 +25,7 @@ import { rmRecursive, sleep } from "../testutils"; +import QueueTestServerFactory from "./utils/QueueTestServerFactory"; // Set true to enable debug log configLogger(false); @@ -38,7 +38,7 @@ describe("Queue SAS test", () => { const extentDbPath = "__extentTestsStorage__"; const persistencePath = "__queueTestsPersistence__"; - const DEFUALT_QUEUE_PERSISTENCE_ARRAY: StoreDestinationArray = [ + const DEFAULT_QUEUE_PERSISTENCE_ARRAY: StoreDestinationArray = [ { locationId: "queueTest", locationPath: persistencePath, @@ -46,15 +46,6 @@ describe("Queue SAS test", () => { } ]; - const config = new QueueConfiguration( - host, - port, - metadataDbPath, - extentDbPath, - DEFUALT_QUEUE_PERSISTENCE_ARRAY, - false - ); - const baseURL = `http://${host}:${port}/devstoreaccount1`; const serviceClient = new QueueServiceClient( baseURL, @@ -72,7 +63,11 @@ describe("Queue SAS test", () => { let server: Server; before(async () => { - server = new Server(config); + server = new QueueTestServerFactory().createServer({ + metadataDBPath: metadataDbPath, + extentDBPath: extentDbPath, + persistencePathArray: DEFAULT_QUEUE_PERSISTENCE_ARRAY + }); await server.start(); }); diff --git a/tests/queue/queueSpecialnaming.test.ts b/tests/queue/queueSpecialnaming.test.ts index 5d245974e..f561b2e69 100644 --- a/tests/queue/queueSpecialnaming.test.ts +++ b/tests/queue/queueSpecialnaming.test.ts @@ -9,7 +9,6 @@ import { import { configLogger } from "../../src/common/Logger"; import { StoreDestinationArray } from "../../src/common/persistence/IExtentStore"; -import QueueConfiguration from "../../src/queue/QueueConfiguration"; import Server from "../../src/queue/QueueServer"; import { EMULATOR_ACCOUNT_KEY, @@ -17,6 +16,7 @@ import { getUniqueName, rmRecursive } from "../testutils"; +import QueueTestServerFactory from "./utils/QueueTestServerFactory"; // Set true to enable debug log configLogger(false); @@ -29,7 +29,7 @@ describe("Queue SpecialNaming", () => { const extentDbPath = "__extentTestsStorage__"; const persistencePath = "__queueTestsPersistence__"; - const DEFUALT_QUEUE_PERSISTENCE_ARRAY: StoreDestinationArray = [ + const DEFAULT_QUEUE_PERSISTENCE_ARRAY: StoreDestinationArray = [ { locationId: "queueTest", locationPath: persistencePath, @@ -37,15 +37,6 @@ describe("Queue SpecialNaming", () => { } ]; - const config = new QueueConfiguration( - host, - port, - metadataDbPath, - extentDbPath, - DEFUALT_QUEUE_PERSISTENCE_ARRAY, - false - ); - const baseURL = `http://${host}:${port}/devstoreaccount1`; const baseSecondaryURL = `http://${host}:${port}/devstoreaccount1-secondary`; const productionStyleHostName = "devstoreaccount1.queue.localhost"; // Use hosts file to make this resolve @@ -67,7 +58,11 @@ describe("Queue SpecialNaming", () => { let server: Server; before(async () => { - server = new Server(config); + server = new QueueTestServerFactory().createServer({ + metadataDBPath: metadataDbPath, + extentDBPath: extentDbPath, + persistencePathArray: DEFAULT_QUEUE_PERSISTENCE_ARRAY + }); await server.start(); }); diff --git a/tests/queue/utils/QueueTestServerFactory.ts b/tests/queue/utils/QueueTestServerFactory.ts new file mode 100644 index 000000000..de2c0303a --- /dev/null +++ b/tests/queue/utils/QueueTestServerFactory.ts @@ -0,0 +1,48 @@ +import { StoreDestinationArray } from "../../../src/common/persistence/IExtentStore" +import QueueConfiguration from "../../../src/queue/QueueConfiguration" +import QueueServer from "../../../src/queue/QueueServer" + +export interface IQueueTestServerFactoryParams { + metadataDBPath: string + extentDBPath: string + persistencePathArray: StoreDestinationArray + enableDebugLog?: boolean + debugLogFilePath?: string + loose?: boolean + skipApiVersionCheck?: boolean + https?: boolean + oauth?: string +} + +export default class QueueTestServerFactory { + public createServer(params: IQueueTestServerFactoryParams): QueueServer { + const inMemoryPersistence = process.env.AZURITE_TEST_INMEMORYPERSISTENCE !== undefined; + + const port = 11001; + const host = "127.0.0.1"; + + const cert = params.https ? "tests/server.cert" : undefined; + const key = params.https ? "tests/server.key" : undefined; + + const config = new QueueConfiguration( + host, + port, + params.metadataDBPath, + params.extentDBPath, + params.persistencePathArray, + false, + undefined, + params.enableDebugLog, + params.debugLogFilePath, + params.loose, + params.skipApiVersionCheck, + cert, + key, + undefined, + params.oauth, + undefined, + inMemoryPersistence + ); + return new QueueServer(config); + } +} diff --git a/tests/table/apis/table.entity.query.test.ts b/tests/table/apis/table.entity.query.test.ts index 746c6163d..e89ec2c9b 100644 --- a/tests/table/apis/table.entity.query.test.ts +++ b/tests/table/apis/table.entity.query.test.ts @@ -15,6 +15,7 @@ import { createUniquePartitionKey } from "../utils/table.entity.test.utils"; import uuid from "uuid"; +import TableTestServerFactory from "../utils/TableTestServerFactory"; // import uuid from "uuid"; // Set true to enable debug log configLogger(false); @@ -798,7 +799,8 @@ describe("table Entity APIs test - using Azure/data-tables", () => { await tableClient.deleteTable(); }); - it("13. should find both old and new guids (backwards compatible) when using guid type, @loki", async () => { + // Skip the case when running in-memory. Backwards compatibility with old DBs does not apply. + (TableTestServerFactory.inMemoryPersistence() ? it.skip : it)("13. should find both old and new guids (backwards compatible) when using guid type, @loki", async () => { const tableClient = createAzureDataTablesClient( testLocalAzuriteInstance, "reproTable" diff --git a/tests/table/apis/table.entity.rest.test.ts b/tests/table/apis/table.entity.rest.test.ts index b96f3a5a7..131090148 100644 --- a/tests/table/apis/table.entity.rest.test.ts +++ b/tests/table/apis/table.entity.rest.test.ts @@ -7,7 +7,6 @@ import * as assert from "assert"; import { AxiosResponse } from "axios"; import { configLogger } from "../../../src/common/Logger"; -import TableConfiguration from "../../../src/table/TableConfiguration"; import TableServer from "../../../src/table/TableServer"; import { getUniqueName } from "../../testutils"; import { createUniquePartitionKey } from "../utils/table.entity.test.utils"; @@ -19,35 +18,26 @@ import { postToAzurite, putToAzurite } from "../utils/table.entity.tests.rest.submitter"; +import TableTestServerFactory from "../utils/TableTestServerFactory"; // Set true to enable debug log configLogger(false); describe("table Entity APIs REST tests", () => { - // TODO: Create a server factory as tests utils - const host = "127.0.0.1"; - const port = 11002; - const metadataDbPath = "__tableTestsStorage__"; - const enableDebugLog: boolean = true; - const debugLogPath: string = ""; - const config = new TableConfiguration( - host, - port, - metadataDbPath, - enableDebugLog, - false, - undefined, - debugLogPath, - false, - true - ); let server: TableServer; let reproFlowsTableName: string = getUniqueName("flows"); before(async () => { - server = new TableServer(config); + server = new TableTestServerFactory().createServer({ + metadataDBPath: "__tableTestsStorage__", + enableDebugLog: true, + debugLogFilePath: "", + loose: false, + skipApiVersionCheck: true, + https: false + }); await server.start(); }); diff --git a/tests/table/apis/table.validation.rest.test.ts b/tests/table/apis/table.validation.rest.test.ts index a48bd2d1a..a891d5bbc 100644 --- a/tests/table/apis/table.validation.rest.test.ts +++ b/tests/table/apis/table.validation.rest.test.ts @@ -5,7 +5,6 @@ // special care is needed to replace etags and folders when used import * as assert from "assert"; import { configLogger } from "../../../src/common/Logger"; -import TableConfiguration from "../../../src/table/TableConfiguration"; import TableServer from "../../../src/table/TableServer"; import { getUniqueName } from "../../testutils"; import { @@ -16,25 +15,15 @@ import { getToAzuriteProductionUrl } from "../utils/table.entity.tests.rest.submitter"; import dns = require("dns"); +import TableTestServerFactory from "../utils/TableTestServerFactory"; // Set true to enable debug log configLogger(false); describe("table name validation tests", () => { - const host = "127.0.0.1"; - const port = 11002; const metadataDbPath = getUniqueName("__tableTestsStorage__"); const enableDebugLog: boolean = true; const debugLogPath: string = "g:/debug.log"; - const config = new TableConfiguration( - host, - port, - metadataDbPath, - enableDebugLog, - false, - undefined, - debugLogPath - ); const productionStyleHostName = "devstoreaccount1.table.localhost"; // Use hosts file to make this resolve const productionStyleHostNameForSecondary = "devstoreaccount1-secondary.table.localhost"; @@ -43,7 +32,14 @@ describe("table name validation tests", () => { let tableName: string = getUniqueName("flows"); before(async () => { - server = new TableServer(config); + server = new TableTestServerFactory().createServer({ + metadataDBPath: metadataDbPath, + enableDebugLog: enableDebugLog, + debugLogFilePath: debugLogPath, + loose: false, + skipApiVersionCheck: false, + https: false + }); await server.start(); }); @@ -196,8 +192,12 @@ describe("table name validation tests", () => { }); it("should create a table with a name which is a substring of an existing table, @loki", async () => { - tableName = getUniqueName("table"); - const body = JSON.stringify({ + // this will be used for 3 table names + // [ a + b ], [ a ], [ b ] + const a = getUniqueName("t") + const b = getUniqueName("t") + tableName = a + b; + const body1 = JSON.stringify({ TableName: tableName }); const createTableHeaders = { @@ -205,7 +205,7 @@ describe("table name validation tests", () => { Accept: "application/json;odata=nometadata" }; try { - await postToAzurite("Tables", body, createTableHeaders); + await postToAzurite("Tables", body1, createTableHeaders); } catch (err: any) { assert.strictEqual( err.response.status, @@ -213,9 +213,8 @@ describe("table name validation tests", () => { `unexpected status code : ${err.response.status}` ); } - const tableName2 = tableName.substring(0, tableName.length - 4); const body2 = JSON.stringify({ - TableName: tableName2 + TableName: a }); try { await postToAzurite("Tables", body2, createTableHeaders); @@ -226,9 +225,8 @@ describe("table name validation tests", () => { `unexpected exception with end trimmed! : ${err}` ); } - const tableName3 = tableName.substring(4); const body3 = JSON.stringify({ - TableName: tableName3 + TableName: b }); try { await postToAzurite("Tables", body3, createTableHeaders); @@ -242,10 +240,14 @@ describe("table name validation tests", () => { }); it("should delete a table with a name which is a substring of an existing table, @loki", async () => { - tableName = getUniqueName("table"); - const shortName = tableName.substring(0, 6); - const basicBody = JSON.stringify({ - TableName: shortName + // this will be used for 4 table names + // [ a ], [ a + b + c ], [ a + b ], [ b + c ] + const a = getUniqueName("t") + const b = getUniqueName("t") + const c = getUniqueName("t") + + const body1 = JSON.stringify({ + TableName: a }); const createTableHeaders = { "Content-Type": "application/json", @@ -259,7 +261,7 @@ describe("table name validation tests", () => { try { const createTable1 = await postToAzurite( "Tables", - basicBody, + body1, createTableHeaders ); assert.strictEqual( @@ -274,14 +276,14 @@ describe("table name validation tests", () => { `unexpected status code creating first table : ${err.response.status}` ); } - const body = JSON.stringify({ - TableName: tableName + const body2 = JSON.stringify({ + TableName: a + b + c }); // create table 2 try { const createTable2 = await postToAzurite( "Tables", - body, + body2, createTableHeaders ); assert.strictEqual( @@ -296,15 +298,14 @@ describe("table name validation tests", () => { `unexpected status code : ${err.response.status}` ); } - const tableName2 = tableName.substring(0, tableName.length - 4); - const body2 = JSON.stringify({ - TableName: tableName2 + const body3 = JSON.stringify({ + TableName: a + b }); // create table 3 try { const createTable3 = await postToAzurite( "Tables", - body2, + body3, createTableHeaders ); assert.strictEqual( @@ -319,15 +320,14 @@ describe("table name validation tests", () => { `unexpected exception with end trimmed! : ${err}` ); } - const tableName3 = tableName.substring(4); - const body3 = JSON.stringify({ - TableName: tableName3 + const body4 = JSON.stringify({ + TableName: b + c }); // create table 4 try { const createTable4 = await postToAzurite( "Tables", - body3, + body4, createTableHeaders ); assert.strictEqual( @@ -342,7 +342,7 @@ describe("table name validation tests", () => { `unexpected exception with start trimmed! : ${err}` ); } - // now list tables after deletion... + // now list tables before deletion... try { const listTableResult1 = await getToAzurite("Tables", createTableHeaders); // we count all tables created in the tests before this one as well @@ -361,7 +361,7 @@ describe("table name validation tests", () => { // now delete "table" try { const deleteResult = await deleteToAzurite( - `Tables('${shortName}')`, + `Tables('${a}')`, "", createTableHeaders ); @@ -388,7 +388,7 @@ describe("table name validation tests", () => { for (const table of listTableResult2.data.value) { assert.notStrictEqual( table.TableName, - shortName, + a, "We still list the table we should have deleted." ); } diff --git a/tests/table/auth/oauth.test.ts b/tests/table/auth/oauth.test.ts index a2648d9fc..a87811ea9 100644 --- a/tests/table/auth/oauth.test.ts +++ b/tests/table/auth/oauth.test.ts @@ -13,7 +13,15 @@ configLogger(false); describe("Table OAuth Basic", () => { const factory = new TableTestServerFactory(); - let server = factory.createServer(false, false, true, "basic"); + let server = factory.createServer({ + metadataDBPath: "__test_db_table__.json", + enableDebugLog: false, + debugLogFilePath: "debug-test-table.log", + loose: false, + skipApiVersionCheck: false, + https: true, + oauth: "basic" + }); const baseURL = `https://${server.config.host}:${server.config.port}/devstoreaccount1`; before(async () => { @@ -386,7 +394,15 @@ describe("Table OAuth Basic", () => { await server.close(); await server.clean(); - server = factory.createServer(false, false, false, "basic"); + server = factory.createServer({ + metadataDBPath: "__test_db_table__.json", + enableDebugLog: false, + debugLogFilePath: "debug-test-table.log", + loose: false, + skipApiVersionCheck: false, + https: false, + oauth: "basic" + }); await server.start(); const httpBaseURL = `http://${server.config.host}:${server.config.port}/devstoreaccount1`; diff --git a/tests/table/utils/TableTestServerFactory.ts b/tests/table/utils/TableTestServerFactory.ts index 4e6f15f31..8f7ace176 100644 --- a/tests/table/utils/TableTestServerFactory.ts +++ b/tests/table/utils/TableTestServerFactory.ts @@ -1,34 +1,46 @@ import TableConfiguration from "../../../src/table/TableConfiguration"; import TableServer from "../../../src/table/TableServer"; +export interface ITableTestServerFactoryParams { + metadataDBPath: string + enableDebugLog: boolean + debugLogFilePath: string + loose: boolean + skipApiVersionCheck: boolean + https: boolean + oauth?: string +} + export default class TableTestServerFactory { - public createServer( - loose: boolean = false, - skipApiVersionCheck: boolean = false, - https: boolean = false, - oauth?: string - ): TableServer { + public static inMemoryPersistence() { + return process.env.AZURITE_TEST_INMEMORYPERSISTENCE !== undefined; + } + + public createServer(params: ITableTestServerFactoryParams): TableServer { + const inMemoryPersistence = TableTestServerFactory.inMemoryPersistence() + const port = 11002; const host = "127.0.0.1"; - const cert = https ? "tests/server.cert" : undefined; - const key = https ? "tests/server.key" : undefined; + const cert = params.https ? "tests/server.cert" : undefined; + const key = params.https ? "tests/server.key" : undefined; - const lokiMetadataDBPath = "__test_db_table__.json"; const config = new TableConfiguration( host, port, - lokiMetadataDBPath, - false, + params.metadataDBPath, + params.enableDebugLog, false, undefined, - "debug-test-table.log", - loose, - skipApiVersionCheck, + params.debugLogFilePath, + params.loose, + params.skipApiVersionCheck, cert, key, undefined, - oauth + params.oauth, + undefined, + inMemoryPersistence ); return new TableServer(config); } diff --git a/tests/table/utils/table.entity.test.utils.ts b/tests/table/utils/table.entity.test.utils.ts index c18ed8ed8..8a7bc1a17 100644 --- a/tests/table/utils/table.entity.test.utils.ts +++ b/tests/table/utils/table.entity.test.utils.ts @@ -5,13 +5,13 @@ import { } from "../../testutils"; import TableServer from "../../../src/table/TableServer"; -import TableConfiguration from "../../../src/table/TableConfiguration"; import { AzureNamedKeyCredential, AzureSASCredential, TableClient } from "@azure/data-tables"; import { copyFile } from "fs"; +import TableTestServerFactory, { ITableTestServerFactoryParams } from "./TableTestServerFactory"; export const PROTOCOL = "http"; export const HOST = "127.0.0.1"; @@ -32,30 +32,6 @@ const AZURITE_TABLE_BASE_URL = "AZURITE_TABLE_BASE_URL"; // Azure Pipelines need a unique name per test instance // const REPRO_DB_PATH = "./querydb.json"; -const config = new TableConfiguration( - HOST, - PORT, - metadataDbPath, - enableDebugLog, - false, - undefined, - debugLogPath -); - -const httpsConfig = new TableConfiguration( - HOST, - PORT, - metadataDbPath, - enableDebugLog, - false, - undefined, - debugLogPath, - false, - true, - "tests/server.cert", - "tests/server.key" -); - /** * Creates the Azurite TableServer used in Table API tests * @@ -63,11 +39,25 @@ const httpsConfig = new TableConfiguration( * @return {*} {TableServer} */ export function createTableServerForTest(): TableServer { - return new TableServer(config); + return new TableTestServerFactory().createServer({ + metadataDBPath: metadataDbPath, + enableDebugLog: enableDebugLog, + debugLogFilePath: debugLogPath, + loose: false, + skipApiVersionCheck: false, + https: false + }); } export function createTableServerForTestHttps(): TableServer { - return new TableServer(httpsConfig); + return new TableTestServerFactory().createServer({ + metadataDBPath: metadataDbPath, + enableDebugLog: enableDebugLog, + debugLogFilePath: debugLogPath, + loose: false, + skipApiVersionCheck: true, + https: true + }); } /** @@ -84,26 +74,19 @@ export function createTableServerForQueryTestHttps(): TableServer { const uniqueDBpath = "./" + uniqueDbName + ".json"; duplicateReproDBForTest(uniqueDBpath); const queryConfig = createQueryConfig(uniqueDBpath); - return new TableServer(queryConfig); + return new TableTestServerFactory().createServer(queryConfig); } export function createTableServerForTestOAuth(oauth?: string): TableServer { - const oAuthConfig = new TableConfiguration( - HOST, - PORT, - metadataDbPath, - enableDebugLog, - false, - undefined, - debugLogPath, - false, - true, - undefined, - undefined, - undefined, - oauth - ); - return new TableServer(oAuthConfig); + return new TableTestServerFactory().createServer({ + metadataDBPath: metadataDbPath, + enableDebugLog: enableDebugLog, + debugLogFilePath: debugLogPath, + loose: false, + skipApiVersionCheck: true, + https: false, + oauth: oauth + }); } /** @@ -219,19 +202,13 @@ function duplicateReproDBForTest(uniqueDBpath: string) { ); } -function createQueryConfig(uniqueDBpath: string): TableConfiguration { - const queryConfig = new TableConfiguration( - HOST, - PORT, - uniqueDBpath, // contains guid and binProp object from legacy schema DB - enableDebugLog, - false, - undefined, - debugLogPath, - false, - true, - "tests/server.cert", - "tests/server.key" - ); - return queryConfig; +function createQueryConfig(uniqueDBpath: string): ITableTestServerFactoryParams { + return { + metadataDBPath: uniqueDBpath, // contains guid and binProp object from legacy schema DB + enableDebugLog: enableDebugLog, + debugLogFilePath: debugLogPath, + loose: false, + skipApiVersionCheck: true, + https: true + }; } diff --git a/tests/testutils.ts b/tests/testutils.ts index 560d7b39a..86c214622 100644 --- a/tests/testutils.ts +++ b/tests/testutils.ts @@ -140,7 +140,7 @@ export async function createRandomLocalFile( function randomValueHex(len = blockSize) { return randomBytes(Math.ceil(len / 2)) .toString("hex") // convert to hexadecimal format - .slice(0, len); // return required number of characters + .slice(0, len - (len > 1 ? 1 : 0)) + (len > 1 ? "\n" : ""); // append newlines to make debugging easier } ws.on("open", () => { From e6525b23f1e36130fb925bcd7f02b9d778dfb36b Mon Sep 17 00:00:00 2001 From: Wei Wei Date: Mon, 20 Nov 2023 09:17:56 +0000 Subject: [PATCH 264/297] fix 1359: table sas failure with upper case table name (#2276) --- ChangeLog.md | 1 + src/table/authentication/ITableSASSignatureValues.ts | 2 +- tests/table/auth/sas.test.ts | 3 ++- 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index b6c364f56..5600d3c98 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -35,6 +35,7 @@ Table: - Fixed the errorCode returned, when malformed Etag is provided for table Update/Delete calls. (issue #2013) - Fixed an issue when comparing `'' eq guid'00000000-0000-0000-0000-000000000000'` which would erroneously report these as equal. (issue #2169) - Fixed authentication error in production style URL for secondary location (issue #2208) +- Fixed table sas request failure with table name include upper case letter (Issue #1359) ## 2023.08 Version 3.26.0 diff --git a/src/table/authentication/ITableSASSignatureValues.ts b/src/table/authentication/ITableSASSignatureValues.ts index c2a280a0d..e404e6db1 100644 --- a/src/table/authentication/ITableSASSignatureValues.ts +++ b/src/table/authentication/ITableSASSignatureValues.ts @@ -245,5 +245,5 @@ function generateTableSASSignature20150405( } function getCanonicalName(accountName: string, tableName: string): string { - return `/table/${accountName}/${tableName}`; + return `/table/${accountName}/${tableName.toLowerCase()}`; } diff --git a/tests/table/auth/sas.test.ts b/tests/table/auth/sas.test.ts index dddaf4808..1f237a26c 100644 --- a/tests/table/auth/sas.test.ts +++ b/tests/table/auth/sas.test.ts @@ -68,7 +68,8 @@ describe("Shared Access Signature (SAS) authentication", () => { }); it("1. insertEntity with Query permission should not work @loki", (done) => { - const tableName: string = getUniqueName("sas1"); + // Use table name include upper case letter to validate SAS signature should calculate from lower case table name (Issue #1359) + const tableName: string = getUniqueName("Sas1"); tableService.createTable(tableName, (error, result, response) => { // created table for tests const expiry = new Date(); From caa3429f861c821882f17a31db4a6393dc162933 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 21 Nov 2023 09:44:05 +0800 Subject: [PATCH 265/297] Bump sequelize from 6.34.0 to 6.35.1 (#2298) Bumps [sequelize](https://github.com/sequelize/sequelize) from 6.34.0 to 6.35.1. - [Release notes](https://github.com/sequelize/sequelize/releases) - [Commits](https://github.com/sequelize/sequelize/compare/v6.34.0...v6.35.1) --- updated-dependencies: - dependency-name: sequelize dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index ae1b47381..88738ae13 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8915,9 +8915,9 @@ "integrity": "sha1-1WgS4cAXpuTnw+Ojeh2m143TyT4=" }, "node_modules/sequelize": { - "version": "6.34.0", - "resolved": "https://registry.npmjs.org/sequelize/-/sequelize-6.34.0.tgz", - "integrity": "sha512-B3eYLG4nUnsIcPO8k6UH6bqSf5Hi3HHCEtcwfiKsp2J0iG3tv9v8lpHFz6Qd8g5QnWxAl9R5rCCXG8fRWo902Q==", + "version": "6.35.1", + "resolved": "https://registry.npmjs.org/sequelize/-/sequelize-6.35.1.tgz", + "integrity": "sha512-UlP5k33nJsN11wCDLaWZXw9bB8w4ESKc5QmG6D04qMimwBwKVNeqRJiaaBlEJdtg8cRK+OJh95dliP+uEi+g9Q==", "funding": [ { "type": "opencollective", @@ -17163,9 +17163,9 @@ "integrity": "sha1-1WgS4cAXpuTnw+Ojeh2m143TyT4=" }, "sequelize": { - "version": "6.34.0", - "resolved": "https://registry.npmjs.org/sequelize/-/sequelize-6.34.0.tgz", - "integrity": "sha512-B3eYLG4nUnsIcPO8k6UH6bqSf5Hi3HHCEtcwfiKsp2J0iG3tv9v8lpHFz6Qd8g5QnWxAl9R5rCCXG8fRWo902Q==", + "version": "6.35.1", + "resolved": "https://registry.npmjs.org/sequelize/-/sequelize-6.35.1.tgz", + "integrity": "sha512-UlP5k33nJsN11wCDLaWZXw9bB8w4ESKc5QmG6D04qMimwBwKVNeqRJiaaBlEJdtg8cRK+OJh95dliP+uEi+g9Q==", "requires": { "@types/debug": "^4.1.8", "@types/validator": "^13.7.17", From 2a91fab566722d4b0828df224e3e360f5928b7fb Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 22 Nov 2023 09:30:52 +0800 Subject: [PATCH 266/297] Bump @types/validator from 13.11.5 to 13.11.7 (#2300) Bumps [@types/validator](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/validator) from 13.11.5 to 13.11.7. - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/validator) --- updated-dependencies: - dependency-name: "@types/validator" dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 88738ae13..f7362a8e0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1573,9 +1573,9 @@ } }, "node_modules/@types/validator": { - "version": "13.11.5", - "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.11.5.tgz", - "integrity": "sha512-xW4qsT4UIYILu+7ZrBnfQdBYniZrMLYYK3wN9M/NdeIHgBN5pZI2/8Q7UfdWIcr5RLJv/OGENsx91JIpUUoC7Q==" + "version": "13.11.7", + "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.11.7.tgz", + "integrity": "sha512-q0JomTsJ2I5Mv7dhHhQLGjMvX0JJm5dyZ1DXQySIUzU1UlwzB8bt+R6+LODUbz0UDIOvEzGc28tk27gBJw2N8Q==" }, "node_modules/@types/vscode": { "version": "1.84.1", @@ -11552,9 +11552,9 @@ } }, "@types/validator": { - "version": "13.11.5", - "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.11.5.tgz", - "integrity": "sha512-xW4qsT4UIYILu+7ZrBnfQdBYniZrMLYYK3wN9M/NdeIHgBN5pZI2/8Q7UfdWIcr5RLJv/OGENsx91JIpUUoC7Q==" + "version": "13.11.7", + "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.11.7.tgz", + "integrity": "sha512-q0JomTsJ2I5Mv7dhHhQLGjMvX0JJm5dyZ1DXQySIUzU1UlwzB8bt+R6+LODUbz0UDIOvEzGc28tk27gBJw2N8Q==" }, "@types/vscode": { "version": "1.84.1", From 319dc368f2a1a7d8a81b32f0c74258646df430b8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 23 Nov 2023 09:52:37 +0800 Subject: [PATCH 267/297] Bump typescript from 5.2.2 to 5.3.2 (#2304) Bumps [typescript](https://github.com/Microsoft/TypeScript) from 5.2.2 to 5.3.2. - [Release notes](https://github.com/Microsoft/TypeScript/releases) - [Commits](https://github.com/Microsoft/TypeScript/compare/v5.2.2...v5.3.2) --- updated-dependencies: - dependency-name: typescript dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index f7362a8e0..72e3ddbf2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9825,9 +9825,9 @@ } }, "node_modules/typescript": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz", - "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==", + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.2.tgz", + "integrity": "sha512-6l+RyNy7oAHDfxC4FzSJcz9vnjTKxrLpDG5M2Vu4SHRVNg6xzqZp6LYSR9zjqQTu8DU/f5xwxUdADOkbrIX2gQ==", "dev": true, "bin": { "tsc": "bin/tsc", @@ -17799,9 +17799,9 @@ } }, "typescript": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz", - "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==", + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.2.tgz", + "integrity": "sha512-6l+RyNy7oAHDfxC4FzSJcz9vnjTKxrLpDG5M2Vu4SHRVNg6xzqZp6LYSR9zjqQTu8DU/f5xwxUdADOkbrIX2gQ==", "dev": true }, "uc.micro": { From 85e2fdc524d775ca032dcc3f37a447dafd90c583 Mon Sep 17 00:00:00 2001 From: EmmaZhu-MSFT Date: Wed, 22 Nov 2023 23:30:41 -0800 Subject: [PATCH 268/297] Fixed issue of not requiring SAS permission for some specific operations. (#2305) --- ChangeLog.md | 8 +- src/blob/authentication/BlobSASPermissions.ts | 12 +- .../authentication/ContainerSASPermissions.ts | 3 +- .../OperationAccountSASPermission.ts | 154 +++++------ .../OperationBlobSASPermission.ts | 22 +- .../authentication/AccountSASPermissions.ts | 5 +- .../authentication/AccountSASResourceTypes.ts | 3 +- tests/blob/oauth.test.ts | 72 +++--- tests/blob/sas.test.ts | 239 +++++++++++++++++- 9 files changed, 375 insertions(+), 143 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index 5600d3c98..8366b7ea6 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -8,6 +8,13 @@ General: - Add `--inMemoryPersistence` and `--extentMemoryLimit` options and related configs to store all data in-memory without disk persistence. (issue #2227) +Blob: + +- Fixed issue of not requiring SAS permission for some specific operations. (issue #2299) + +Table: +- Fixed table sas request failure with table name include upper case letter (Issue #1359) + ## 2023.10 Version 3.27.0 General: @@ -35,7 +42,6 @@ Table: - Fixed the errorCode returned, when malformed Etag is provided for table Update/Delete calls. (issue #2013) - Fixed an issue when comparing `'' eq guid'00000000-0000-0000-0000-000000000000'` which would erroneously report these as equal. (issue #2169) - Fixed authentication error in production style URL for secondary location (issue #2208) -- Fixed table sas request failure with table name include upper case letter (Issue #1359) ## 2023.08 Version 3.26.0 diff --git a/src/blob/authentication/BlobSASPermissions.ts b/src/blob/authentication/BlobSASPermissions.ts index e2462a4c5..cd6f68e58 100644 --- a/src/blob/authentication/BlobSASPermissions.ts +++ b/src/blob/authentication/BlobSASPermissions.ts @@ -4,10 +4,10 @@ export enum BlobSASPermission { Create = "c", Write = "w", Delete = "d", - DeleteVersion = "x", - Tag = "t", - Move = "m", - execute = "e", - SetImmutabilityPolicy = "i", - permanentDelete = "y" + DeleteVersion = "x", + Tag = "t", + Move = "m", + execute = "e", + SetImmutabilityPolicy = "i", + permanentDelete = "y" } diff --git a/src/blob/authentication/ContainerSASPermissions.ts b/src/blob/authentication/ContainerSASPermissions.ts index 9ec9a216d..148c1421f 100644 --- a/src/blob/authentication/ContainerSASPermissions.ts +++ b/src/blob/authentication/ContainerSASPermissions.ts @@ -4,5 +4,6 @@ export enum ContainerSASPermission { Create = "c", Write = "w", Delete = "d", - List = "l" + List = "l", + Any = "AnyPermission" // This is only for blob batch operation. } diff --git a/src/blob/authentication/OperationAccountSASPermission.ts b/src/blob/authentication/OperationAccountSASPermission.ts index 78cf7dfb5..6fc42e445 100644 --- a/src/blob/authentication/OperationAccountSASPermission.ts +++ b/src/blob/authentication/OperationAccountSASPermission.ts @@ -12,9 +12,9 @@ import { AccountSASService } from "../../common/authentication/AccountSASService export class OperationAccountSASPermission { constructor( public readonly service: string, - public readonly resourceType?: string, - public readonly permission?: string - ) {} + public readonly resourceType: string, + public readonly permission: string + ) { } public validate( services: AccountSASServices | string, @@ -35,33 +35,33 @@ export class OperationAccountSASPermission { public validateResourceTypes( resourceTypes: AccountSASResourceTypes | string ): boolean { - if (this.resourceType) { - for (const p of this.resourceType) { - if (resourceTypes.toString().includes(p)) { - return true; - } - } - return false; - } - else { + // Only blob batch operation allows Any resource types. + if (this.resourceType === AccountSASResourceType.Any) { return resourceTypes.toString() !== ""; } + + for (const p of this.resourceType) { + if (resourceTypes.toString().includes(p)) { + return true; + } + } + return false; } public validatePermissions( permissions: AccountSASPermissions | string ): boolean { - if (this.permission) { - for (const p of this.permission) { - if (permissions.toString().includes(p)) { - return true; - } - } - return false; - } - else { + // Only blob batch operation allows Any permissions. + if (this.permission === AccountSASPermission.Any) { return permissions.toString() !== ""; } + + for (const p of this.permission) { + if (permissions.toString().includes(p)) { + return true; + } + } + return false; } } @@ -77,16 +77,16 @@ OPERATION_ACCOUNT_SAS_PERMISSIONS.set( new OperationAccountSASPermission( AccountSASService.Blob, AccountSASResourceType.Service + - AccountSASResourceType.Container + - AccountSASResourceType.Object, + AccountSASResourceType.Container + + AccountSASResourceType.Object, + AccountSASPermission.Read + + AccountSASPermission.Create + + AccountSASPermission.Delete + + AccountSASPermission.List + + AccountSASPermission.Process + AccountSASPermission.Read + - AccountSASPermission.Create + - AccountSASPermission.Delete + - AccountSASPermission.List + - AccountSASPermission.Process + - AccountSASPermission.Read + - AccountSASPermission.Update + - AccountSASPermission.Write + AccountSASPermission.Update + + AccountSASPermission.Write ) ); @@ -95,16 +95,16 @@ OPERATION_ACCOUNT_SAS_PERMISSIONS.set( new OperationAccountSASPermission( AccountSASService.Blob, AccountSASResourceType.Service + - AccountSASResourceType.Container + - AccountSASResourceType.Object, + AccountSASResourceType.Container + + AccountSASResourceType.Object, + AccountSASPermission.Read + + AccountSASPermission.Create + + AccountSASPermission.Delete + + AccountSASPermission.List + + AccountSASPermission.Process + AccountSASPermission.Read + - AccountSASPermission.Create + - AccountSASPermission.Delete + - AccountSASPermission.List + - AccountSASPermission.Process + - AccountSASPermission.Read + - AccountSASPermission.Update + - AccountSASPermission.Write + AccountSASPermission.Update + + AccountSASPermission.Write ) ); @@ -113,16 +113,16 @@ OPERATION_ACCOUNT_SAS_PERMISSIONS.set( new OperationAccountSASPermission( AccountSASService.Blob, AccountSASResourceType.Service + - AccountSASResourceType.Container + - AccountSASResourceType.Object, + AccountSASResourceType.Container + + AccountSASResourceType.Object, AccountSASPermission.Read + - AccountSASPermission.Create + - AccountSASPermission.Delete + - AccountSASPermission.List + - AccountSASPermission.Process + - AccountSASPermission.Read + - AccountSASPermission.Update + - AccountSASPermission.Write + AccountSASPermission.Create + + AccountSASPermission.Delete + + AccountSASPermission.List + + AccountSASPermission.Process + + AccountSASPermission.Read + + AccountSASPermission.Update + + AccountSASPermission.Write ) ); @@ -131,16 +131,16 @@ OPERATION_ACCOUNT_SAS_PERMISSIONS.set( new OperationAccountSASPermission( AccountSASService.Blob, AccountSASResourceType.Service + - AccountSASResourceType.Container + - AccountSASResourceType.Object, + AccountSASResourceType.Container + + AccountSASResourceType.Object, + AccountSASPermission.Read + + AccountSASPermission.Create + + AccountSASPermission.Delete + + AccountSASPermission.List + + AccountSASPermission.Process + AccountSASPermission.Read + - AccountSASPermission.Create + - AccountSASPermission.Delete + - AccountSASPermission.List + - AccountSASPermission.Process + - AccountSASPermission.Read + - AccountSASPermission.Update + - AccountSASPermission.Write + AccountSASPermission.Update + + AccountSASPermission.Write ) ); @@ -149,16 +149,16 @@ OPERATION_ACCOUNT_SAS_PERMISSIONS.set( new OperationAccountSASPermission( AccountSASService.Blob, AccountSASResourceType.Service + - AccountSASResourceType.Container + - AccountSASResourceType.Object, + AccountSASResourceType.Container + + AccountSASResourceType.Object, + AccountSASPermission.Read + + AccountSASPermission.Create + + AccountSASPermission.Delete + + AccountSASPermission.List + + AccountSASPermission.Process + AccountSASPermission.Read + - AccountSASPermission.Create + - AccountSASPermission.Delete + - AccountSASPermission.List + - AccountSASPermission.Process + - AccountSASPermission.Read + - AccountSASPermission.Update + - AccountSASPermission.Write + AccountSASPermission.Update + + AccountSASPermission.Write ) ); @@ -167,16 +167,16 @@ OPERATION_ACCOUNT_SAS_PERMISSIONS.set( new OperationAccountSASPermission( AccountSASService.Blob, AccountSASResourceType.Service + - AccountSASResourceType.Container + - AccountSASResourceType.Object, + AccountSASResourceType.Container + + AccountSASResourceType.Object, AccountSASPermission.Read + - AccountSASPermission.Create + - AccountSASPermission.Delete + - AccountSASPermission.List + - AccountSASPermission.Process + - AccountSASPermission.Read + - AccountSASPermission.Update + - AccountSASPermission.Write + AccountSASPermission.Create + + AccountSASPermission.Delete + + AccountSASPermission.List + + AccountSASPermission.Process + + AccountSASPermission.Read + + AccountSASPermission.Update + + AccountSASPermission.Write ) ); @@ -211,8 +211,8 @@ OPERATION_ACCOUNT_SAS_PERMISSIONS.set( Operation.Service_SubmitBatch, new OperationAccountSASPermission( AccountSASService.Blob, - "", - "" // NOT ALLOWED + AccountSASResourceType.Any, + AccountSASPermission.Any ) ); diff --git a/src/blob/authentication/OperationBlobSASPermission.ts b/src/blob/authentication/OperationBlobSASPermission.ts index 6da16064a..4b7a29564 100644 --- a/src/blob/authentication/OperationBlobSASPermission.ts +++ b/src/blob/authentication/OperationBlobSASPermission.ts @@ -3,24 +3,24 @@ import { BlobSASPermission } from "./BlobSASPermissions"; import { ContainerSASPermission } from "./ContainerSASPermissions"; export class OperationBlobSASPermission { - constructor(public readonly permission: string = "") {} + constructor(public readonly permission: string = "") { } public validate(permissions: string): boolean { return this.validatePermissions(permissions); } public validatePermissions(permissions: string): boolean { - if (this.permission !== "") { - for (const p of this.permission) { - if (permissions.toString().includes(p)) { - return true; - } - } - return false; - } - else { + // Only blob batch operation allows Any permissions. + if (this.permission === ContainerSASPermission.Any) { return permissions.toString() !== ""; } + + for (const p of this.permission) { + if (permissions.toString().includes(p)) { + return true; + } + } + return false; } } @@ -335,7 +335,7 @@ OPERATION_BLOB_SAS_CONTAINER_PERMISSIONS.set( ); OPERATION_BLOB_SAS_CONTAINER_PERMISSIONS.set( Operation.Container_SubmitBatch, - new OperationBlobSASPermission() + new OperationBlobSASPermission(ContainerSASPermission.Any) ); OPERATION_BLOB_SAS_CONTAINER_PERMISSIONS.set( Operation.Container_GetAccessPolicy, diff --git a/src/common/authentication/AccountSASPermissions.ts b/src/common/authentication/AccountSASPermissions.ts index a5c077ae8..1a27ca457 100644 --- a/src/common/authentication/AccountSASPermissions.ts +++ b/src/common/authentication/AccountSASPermissions.ts @@ -10,8 +10,9 @@ export enum AccountSASPermission { Process = "p", Tag = "t", Filter = "f", - SetImmutabilityPolicy = "i", - PermanentDelete = "y" + SetImmutabilityPolicy = "i", + PermanentDelete = "y", + Any = "AnyPermission" // This is only used for blob batch operation. } /** diff --git a/src/common/authentication/AccountSASResourceTypes.ts b/src/common/authentication/AccountSASResourceTypes.ts index 06a50996c..e2d7518dc 100644 --- a/src/common/authentication/AccountSASResourceTypes.ts +++ b/src/common/authentication/AccountSASResourceTypes.ts @@ -1,7 +1,8 @@ export enum AccountSASResourceType { Service = "s", Container = "c", - Object = "o" + Object = "o", + Any = "AnyResourceType" // This is only used for blob batch operation. } /** diff --git a/tests/blob/oauth.test.ts b/tests/blob/oauth.test.ts index 6febeafab..e27480d73 100644 --- a/tests/blob/oauth.test.ts +++ b/tests/blob/oauth.test.ts @@ -6,7 +6,7 @@ import { configLogger } from "../../src/common/Logger"; import BlobTestServerFactory from "../BlobTestServerFactory"; import { EMULATOR_ACCOUNT_KEY, EMULATOR_ACCOUNT_NAME, generateJWTToken, getUniqueName } from "../testutils"; import { SimpleTokenCredential } from "../simpleTokenCredential"; -import { BlobClient, StorageSharedKeyCredential, BlobBatch} from "@azure/storage-blob"; +import { BlobClient, StorageSharedKeyCredential, BlobBatch } from "@azure/storage-blob"; // Set true to enable debug log configLogger(false); @@ -52,7 +52,7 @@ describe("Blob OAuth Basic", () => { await containerClient.create(); await containerClient.delete(); }); - + it(`Should work with blob batch deleting @loki @sql`, async () => { const token = generateJWTToken( new Date("2019/01/01"), @@ -123,7 +123,7 @@ describe("Blob OAuth Basic", () => { ).value; assert.equal(resp2.segment.blobItems.length, 0); }); - + it(`Should work with blob batch set tier @loki @sql`, async () => { const token = generateJWTToken( new Date("2019/01/01"), @@ -182,7 +182,7 @@ describe("Blob OAuth Basic", () => { assert.ok(resp.subResponses[i].headers.contains("x-ms-request-id")); assert.equal(resp.subResponses[i]._request.url, blobClients[i].url); } - + for (const blobClient of blobClients) { // Check blob tier set properly. const resp2 = await blobClient.getProperties(); @@ -211,14 +211,16 @@ describe("Blob OAuth Basic", () => { }) ); + const containerName: string = getUniqueName("1container-with-dash"); + const containerClient = serviceClient.getContainerClient(containerName); + await containerClient.create(); + const startTime = new Date(); startTime.setHours(startTime.getHours() - 1); const expiryTime = new Date(); expiryTime.setDate(expiryTime.getDate() + 1); - - const userDelegationKey = await serviceClient.getUserDelegationKey(startTime, expiryTime); - const containerName: string = getUniqueName("1container-with-dash") + const userDelegationKey = await serviceClient.getUserDelegationKey(startTime, expiryTime); const sasExpirytime = new Date(); sasExpirytime.setHours(sasExpirytime.getHours() + 1); @@ -233,11 +235,12 @@ describe("Blob OAuth Basic", () => { "devstoreaccount1" ); - const containerClient = new ContainerClient( + const containerClientWithSAS = new ContainerClient( `${serviceClient.url}/${containerName}?${containerSAS}`, newPipeline(new AnonymousCredential()) ); - await containerClient.create(); + const result = (await containerClientWithSAS.listBlobsFlat().byPage().next()).value; + assert.ok(result.serviceEndpoint.length > 0); await containerClient.delete(); }); @@ -262,14 +265,16 @@ describe("Blob OAuth Basic", () => { }) ); + const containerName: string = getUniqueName("1container-with-dash"); + const containerClient = serviceClient.getContainerClient(containerName); + await containerClient.create(); + const startTime = new Date(); startTime.setHours(startTime.getHours() - 1); const expiryTime = new Date(); expiryTime.setDate(expiryTime.getDate() + 1); - - const userDelegationKey = await serviceClient.getUserDelegationKey(startTime, expiryTime); - const containerName: string = getUniqueName("1container-with-dash") + const userDelegationKey = await serviceClient.getUserDelegationKey(startTime, expiryTime); const sasExpirytime = new Date(); sasExpirytime.setHours(sasExpirytime.getHours() + 1); @@ -284,12 +289,11 @@ describe("Blob OAuth Basic", () => { "devstoreaccount1" ); - const containerClient = new ContainerClient( + const containerClientWithSAS = new ContainerClient( `${serviceClient.url}/${containerName}?${containerSAS}`, newPipeline(new AnonymousCredential()) ); - await containerClient.create(); - const blobClient = await containerClient.getBlockBlobClient("test"); + const blobClient = await containerClientWithSAS.getBlockBlobClient("test"); const data = "Test Data"; await blobClient.upload(data, data.length); await containerClient.delete(); @@ -348,7 +352,7 @@ describe("Blob OAuth Basic", () => { catch (err) { failed = true; assert.equal(err.statusCode, 403); - } + } assert.ok(failed); // Eearlier user delegation key expirty time @@ -375,7 +379,7 @@ describe("Blob OAuth Basic", () => { `${serviceClient.url}/${containerName}?${containerSAS}`, newPipeline(new AnonymousCredential()) ); - + failed = false; try { await containerClient.create(); @@ -383,11 +387,11 @@ describe("Blob OAuth Basic", () => { catch (err) { failed = true; assert.equal(err.statusCode, 403); - } + } assert.ok(failed); }); - + it(`Should fail with delegation SAS with access policy @loki @sql`, async () => { const token = generateJWTToken( new Date("2019/01/01"), @@ -432,7 +436,7 @@ describe("Blob OAuth Basic", () => { const containerName: string = getUniqueName("1container-with-dash"); const containerClientWithKey = serviceClientWithAccountKey.getContainerClient(containerName); await containerClientWithKey.create(); - await containerClientWithKey.setAccessPolicy(undefined, + await containerClientWithKey.setAccessPolicy(undefined, [ { accessPolicy: { @@ -448,7 +452,7 @@ describe("Blob OAuth Basic", () => { const containerSAS = generateBlobSASQueryParameters( { containerName: containerName, - expiresOn: sasExpirytime, + expiresOn: sasExpirytime, permissions: ContainerSASPermissions.parse("racwdl"), identifier: "MTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTI=" }, @@ -460,7 +464,7 @@ describe("Blob OAuth Basic", () => { `${serviceClient.url}/${containerName}?${containerSAS}`, newPipeline(new AnonymousCredential()) ); - + let failed = false; try { await containerClient.getProperties(); @@ -468,7 +472,7 @@ describe("Blob OAuth Basic", () => { catch (err) { failed = true; assert.equal(err.statusCode, 403); - } + } assert.ok(failed); }); @@ -834,8 +838,8 @@ describe("Blob OAuth Basic", () => { try { await containerClientNotExist.create(); } catch (err) { - if (err.statusCode !== 404 && err.code !== 'ResourceNotFound'){ - assert.fail( "Create queue with shared key not fail as expected." + err.toString()); + if (err.statusCode !== 404 && err.code !== 'ResourceNotFound') { + assert.fail("Create queue with shared key not fail as expected." + err.toString()); } } @@ -863,13 +867,13 @@ describe("Blob OAuth Basic", () => { try { await containerClientNotExist.create(); } catch (err) { - if (err.statusCode !== 404 && err.code !== 'ResourceNotFound'){ - assert.fail( "Create queue with oauth not fail as expected." + err.toString()); + if (err.statusCode !== 404 && err.code !== 'ResourceNotFound') { + assert.fail("Create queue with oauth not fail as expected." + err.toString()); } } // Account SAS const now = new Date(); - now.setMinutes(now.getMinutes() - 5); + now.setMinutes(now.getMinutes() - 5); const tmr = new Date(); tmr.setDate(tmr.getDate() + 1); const sas = generateAccountSASQueryParameters( @@ -893,12 +897,12 @@ describe("Blob OAuth Basic", () => { keepAliveOptions: { enable: false } }) ); - containerClientNotExist = serviceClient.getContainerClient(containerName); + containerClientNotExist = serviceClient.getContainerClient(containerName); try { await containerClientNotExist.create(); } catch (err) { - if (err.statusCode !== 404 && err.code !== 'ResourceNotFound'){ - assert.fail( "Create queue with account sas not fail as expected." + err.toString()); + if (err.statusCode !== 404 && err.code !== 'ResourceNotFound') { + assert.fail("Create queue with account sas not fail as expected." + err.toString()); } } @@ -927,11 +931,11 @@ describe("Blob OAuth Basic", () => { try { await containerClientNotExist.create(); } catch (err) { - if (err.statusCode !== 404 && err.code !== 'ResourceNotFound'){ - assert.fail( "Create queue with service sas not fail as expected." + err.toString()); + if (err.statusCode !== 404 && err.code !== 'ResourceNotFound') { + assert.fail("Create queue with service sas not fail as expected." + err.toString()); } } - }); + }); it(`Should not work with HTTP @loki @sql`, async () => { await server.close(); diff --git a/tests/blob/sas.test.ts b/tests/blob/sas.test.ts index 39bfa441f..3c9a4311e 100644 --- a/tests/blob/sas.test.ts +++ b/tests/blob/sas.test.ts @@ -13,7 +13,8 @@ import { StorageSharedKeyCredential, ContainerClient, PageBlobClient, - AppendBlobClient + AppendBlobClient, + BlobBatch } from "@azure/storage-blob"; import * as assert from "assert"; @@ -116,13 +117,13 @@ describe("Shared Access Signature (SAS) authentication", () => { }); it("generateAccountSASQueryParameters should generate correct hashes", async () => { - + const startDate = new Date(2022, 3, 16, 14, 31, 48, 0); const endDate = new Date(2022, 3, 17, 14, 31, 48, 0); const factories = (serviceClient as any).pipeline.factories; const storageSharedKeyCredential = factories[factories.length - 1]; - + const sas = generateAccountSASQueryParameters( { expiresOn: endDate, @@ -136,7 +137,7 @@ describe("Shared Access Signature (SAS) authentication", () => { }, storageSharedKeyCredential as StorageSharedKeyCredential ).toString(); - + assert.equal(sas, "sv=2016-05-31&ss=btqf&srt=sco&spr=https%2Chttp&st=2022-04-16T13%3A31%3A48Z&se=2022-04-17T13%3A31%3A48Z&sip=0.0.0.0-255.255.255.255&sp=rwdlacup&sig=3tOzYrzhkaX48zalU5WlyEJg%2B7Tj4RzY4jBo9mCi8AM%3D"); const sas2 = generateAccountSASQueryParameters( @@ -152,7 +153,7 @@ describe("Shared Access Signature (SAS) authentication", () => { }, storageSharedKeyCredential as StorageSharedKeyCredential ).toString(); - + assert.equal(sas2, "sv=2018-11-09&ss=btqf&srt=sco&spr=https%2Chttp&st=2022-04-16T13%3A31%3A48Z&se=2022-04-17T13%3A31%3A48Z&sip=0.0.0.0-255.255.255.255&sp=rwdlacup&sig=o23T5PzZn4Daklb%2F8Ef25%2FUprkIIeq4zI4QxT57iim8%3D"); const sas3 = generateAccountSASQueryParameters( @@ -708,6 +709,225 @@ describe("Shared Access Signature (SAS) authentication", () => { await containerClient.delete(); }); + it("Container operations on container should fail with container SAS @loki @sql", async () => { + const now = new Date(); + now.setMinutes(now.getMinutes() - 5); // Skip clock skew with server + + const tmr = new Date(); + tmr.setDate(tmr.getDate() + 1); + + // By default, credential is always the last element of pipeline factories + const factories = (serviceClient as any).pipeline.factories; + const storageSharedKeyCredential = factories[factories.length - 1]; + + const containerName = getUniqueName("container"); + const containerClient = serviceClient.getContainerClient(containerName); + await containerClient.create(); + + const containerSAS = generateBlobSASQueryParameters( + { + containerName, + expiresOn: tmr, + permissions: ContainerSASPermissions.parse("racwdl"), + protocol: SASProtocol.HttpsAndHttp, + startsOn: now + }, + storageSharedKeyCredential as StorageSharedKeyCredential + ); + + const sasURL = `${containerClient.url}?${containerSAS}`; + const containerClientWithSAS = new ContainerClient( + sasURL, + newPipeline(new AnonymousCredential()) + ); + + try { + await containerClientWithSAS.getProperties(); + assert.fail("getProperties should fail"); + } catch (err) { + assert.deepStrictEqual(err.statusCode, 403); + } + + try { + await containerClientWithSAS.create(); + assert.fail("container create should fail"); + } catch (err) { + assert.deepStrictEqual(err.statusCode, 403); + } + + const serviceClientWithSAS = new BlobServiceClient(`${serviceClient.url}?${containerSAS}`); + + try { + await serviceClientWithSAS.getAccountInfo(); + assert.fail("service operation should fail"); + } catch (err) { + assert.deepStrictEqual(err.statusCode, 403); + } + + await containerClient.delete(); + }); + + it("Container operations on container should fail with Blob SAS @loki @sql", async () => { + const now = new Date(); + now.setMinutes(now.getMinutes() - 5); // Skip clock skew with server + + const tmr = new Date(); + tmr.setDate(tmr.getDate() + 1); + + // By default, credential is always the last element of pipeline factories + const factories = (serviceClient as any).pipeline.factories; + const storageSharedKeyCredential = factories[factories.length - 1]; + + const containerName = getUniqueName("container"); + const containerClient = serviceClient.getContainerClient(containerName); + await containerClient.create(); + + const blobName = getUniqueName("blobName"); + const blockBlobClient = containerClient.getBlockBlobClient(blobName); + await blockBlobClient.upload("Hello", 5); + + const blobSAS = generateBlobSASQueryParameters( + { + containerName, + blobName: blobName, + expiresOn: tmr, + permissions: BlobSASPermissions.parse("racwd"), + protocol: SASProtocol.HttpsAndHttp, + startsOn: now + }, + storageSharedKeyCredential as StorageSharedKeyCredential + ); + + const sasURL = `${containerClient.url}?${blobSAS}`; + const containerClientWithSAS = new ContainerClient( + sasURL, + newPipeline(new AnonymousCredential()) + ); + + try { + await containerClientWithSAS.getProperties(); + assert.fail("getProperties should fail"); + } catch (err) { + assert.deepStrictEqual(err.statusCode, 403); + } + + try { + await containerClientWithSAS.create(); + assert.fail("container create should fail"); + } catch (err) { + assert.deepStrictEqual(err.statusCode, 403); + } + + const serviceClientWithSAS = new BlobServiceClient(`${serviceClient.url}?${blobSAS}`, + newPipeline(new AnonymousCredential()) + ); + + try { + await serviceClientWithSAS.getAccountInfo(); + assert.fail("service operation should fail"); + } catch (err) { + assert.deepStrictEqual(err.statusCode, 403); + } + + await containerClient.delete(); + }); + + it(`Blob batch operation on service should fail with blob SAS`, async () => { + const now = new Date(); + now.setMinutes(now.getMinutes() - 5); // Skip clock skew with server + + const tmr = new Date(); + tmr.setDate(tmr.getDate() + 1); + + // By default, credential is always the last element of pipeline factories + const factories = (serviceClient as any).pipeline.factories; + const storageSharedKeyCredential = factories[factories.length - 1]; + + const containerName = getUniqueName("container"); + const containerClient = serviceClient.getContainerClient(containerName); + await containerClient.create(); + + const blobName = getUniqueName("blobName"); + const blockBlobClient = containerClient.getBlockBlobClient(blobName); + await blockBlobClient.upload("Hello", 5); + + const blobSAS = generateBlobSASQueryParameters( + { + containerName, + blobName: blobName, + expiresOn: tmr, + permissions: BlobSASPermissions.parse("racwd"), + protocol: SASProtocol.HttpsAndHttp, + startsOn: now + }, + storageSharedKeyCredential as StorageSharedKeyCredential + ); + + const serviceClientWithSAS = new BlobServiceClient(`${serviceClient.url}?${blobSAS}`, + new AnonymousCredential()); + + const blobBatchClient = serviceClientWithSAS.getBlobBatchClient(); + // Assemble batch delete request. + const batchDeleteRequest = new BlobBatch(); + await batchDeleteRequest.deleteBlob(blockBlobClient); + + // Submit batch request and verify response. + try { + await blobBatchClient.submitBatch(batchDeleteRequest, {}); + assert.fail("batch operation should fail for blob SAS"); + } catch (err) { + assert.deepStrictEqual(err.statusCode, 403); + } + }); + + it(`Blob batch operation on container should fail with blob SAS`, async () => { + const now = new Date(); + now.setMinutes(now.getMinutes() - 5); // Skip clock skew with server + + const tmr = new Date(); + tmr.setDate(tmr.getDate() + 1); + + // By default, credential is always the last element of pipeline factories + const factories = (serviceClient as any).pipeline.factories; + const storageSharedKeyCredential = factories[factories.length - 1]; + + const containerName = getUniqueName("container"); + const containerClient = serviceClient.getContainerClient(containerName); + await containerClient.create(); + + const blobName = getUniqueName("blobName"); + const blockBlobClient = containerClient.getBlockBlobClient(blobName); + await blockBlobClient.upload("Hello", 5); + + const blobSAS = generateBlobSASQueryParameters( + { + containerName, + blobName: blobName, + expiresOn: tmr, + permissions: BlobSASPermissions.parse("racwd"), + protocol: SASProtocol.HttpsAndHttp, + startsOn: now + }, + storageSharedKeyCredential as StorageSharedKeyCredential + ); + + const containerClientWithSAS = new ContainerClient(`${serviceClient.url}?${blobSAS}`, + new AnonymousCredential()); + + const blobBatchClient = containerClientWithSAS.getBlobBatchClient(); + // Assemble batch delete request. + const batchDeleteRequest = new BlobBatch(); + await batchDeleteRequest.deleteBlob(blockBlobClient); + + // Submit batch request and verify response. + try { + await blobBatchClient.submitBatch(batchDeleteRequest, {}); + assert.fail("batch operation should fail for blob SAS"); + } catch (err) { + assert.deepStrictEqual(err.statusCode, 403); + } + }); + it("generateBlobSASQueryParameters should NOT work for blob using unknown key when the account has second key provided in AZURITE_ACCOUNTS @loki @sql", async () => { const now = new Date(); now.setMinutes(now.getMinutes() - 5); // Skip clock skew with server @@ -889,7 +1109,7 @@ describe("Shared Access Signature (SAS) authentication", () => { } }); - const escapedblobName = encodeURIComponent(blobName); + const escapedblobName = encodeURIComponent(blobName); const blobSAS = generateBlobSASQueryParameters( { blobName, @@ -1590,9 +1810,8 @@ describe("Shared Access Signature (SAS) authentication", () => { storageSharedKeyCredential as StorageSharedKeyCredential ); - const sasURL = `${ - blobClient.withSnapshot(response.snapshot!).url - }&${blobSAS}`; + const sasURL = `${blobClient.withSnapshot(response.snapshot!).url + }&${blobSAS}`; const blobClientWithSAS = new PageBlobClient( sasURL, newPipeline(new AnonymousCredential()) @@ -1960,7 +2179,7 @@ describe("Shared Access Signature (SAS) authentication", () => { const properties3 = await targetBlob.getProperties(); assert.equal(properties3.metadata!["foo"], "1"); assert.equal(properties3.metadata!["bar"], "2"); - + const copyResponse4 = await targetBlobWithProps.syncCopyFromURL( `${sourceBlob.url}?${sas}`, { From 1e79017d503ef10f72469727490db89ada7b4b54 Mon Sep 17 00:00:00 2001 From: EmmaZhu-MSFT Date: Thu, 23 Nov 2023 00:42:51 -0800 Subject: [PATCH 269/297] Bump Azurite version for release (#2306) --- ChangeLog.md | 3 +++ README.md | 2 +- package-lock.json | 6 +++--- package.json | 2 +- src/blob/utils/constants.ts | 2 +- src/queue/utils/constants.ts | 2 +- src/table/utils/constants.ts | 2 +- 7 files changed, 11 insertions(+), 8 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index 8366b7ea6..bca2e5041 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -4,6 +4,8 @@ ## Upcoming Release +## 2023.11 Version 3.28.0 + General: - Add `--inMemoryPersistence` and `--extentMemoryLimit` options and related configs to store all data in-memory without disk persistence. (issue #2227) @@ -13,6 +15,7 @@ Blob: - Fixed issue of not requiring SAS permission for some specific operations. (issue #2299) Table: + - Fixed table sas request failure with table name include upper case letter (Issue #1359) ## 2023.10 Version 3.27.0 diff --git a/README.md b/README.md index d6896860a..0bee78a88 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,7 @@ | Version | Azure Storage API Version | Service Support | Description | Reference Links | | ------------------------------------------------------------------ | ------------------------- | ------------------------------ | ------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| 3.27.0 | 2023-11-03 | Blob, Queue and Table(preview) | Azurite V3 based on TypeScript & New Architecture | [NPM](https://www.npmjs.com/package/azurite) - [Docker](https://hub.docker.com/_/microsoft-azure-storage-azurite) - [Visual Studio Code Extension](https://marketplace.visualstudio.com/items?itemName=Azurite.azurite) | +| 3.28.0 | 2023-11-03 | Blob, Queue and Table(preview) | Azurite V3 based on TypeScript & New Architecture | [NPM](https://www.npmjs.com/package/azurite) - [Docker](https://hub.docker.com/_/microsoft-azure-storage-azurite) - [Visual Studio Code Extension](https://marketplace.visualstudio.com/items?itemName=Azurite.azurite) | | [Legacy (v2)](https://github.com/Azure/Azurite/tree/legacy-master) | 2016-05-31 | Blob, Queue and Table | Legacy Azurite V2 | [NPM](https://www.npmjs.com/package/azurite) | - [Azurite V3](#azurite-v3) diff --git a/package-lock.json b/package-lock.json index 72e3ddbf2..3f5f13a88 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "azurite", - "version": "3.27.0", + "version": "3.28.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "azurite", - "version": "3.27.0", + "version": "3.28.0", "license": "MIT", "dependencies": { "@azure/ms-rest-js": "^1.5.0", @@ -18190,4 +18190,4 @@ "dev": true } } -} +} \ No newline at end of file diff --git a/package.json b/package.json index b2f418990..8ec2354ff 100644 --- a/package.json +++ b/package.json @@ -3,7 +3,7 @@ "displayName": "Azurite", "description": "An open source Azure Storage API compatible server", "icon": "icon.png", - "version": "3.27.0", + "version": "3.28.0", "publisher": "Azurite", "categories": [ "Other" diff --git a/src/blob/utils/constants.ts b/src/blob/utils/constants.ts index 971f35750..6ccc40445 100644 --- a/src/blob/utils/constants.ts +++ b/src/blob/utils/constants.ts @@ -1,7 +1,7 @@ import { StoreDestinationArray } from "../../common/persistence/IExtentStore"; import * as Models from "../generated/artifacts/models"; -export const VERSION = "3.27.0"; +export const VERSION = "3.28.0"; export const BLOB_API_VERSION = "2023-11-03"; export const DEFAULT_BLOB_SERVER_HOST_NAME = "127.0.0.1"; // Change to 0.0.0.0 when needs external access export const DEFAULT_LIST_BLOBS_MAX_RESULTS = 5000; diff --git a/src/queue/utils/constants.ts b/src/queue/utils/constants.ts index e86fedc47..422b1f6a2 100644 --- a/src/queue/utils/constants.ts +++ b/src/queue/utils/constants.ts @@ -1,6 +1,6 @@ import { StoreDestinationArray } from "../../common/persistence/IExtentStore"; -export const VERSION = "3.27.0"; +export const VERSION = "3.28.0"; export const QUEUE_API_VERSION = "2023-11-03"; export const DEFAULT_QUEUE_SERVER_HOST_NAME = "127.0.0.1"; // Change to 0.0.0.0 when needs external access export const DEFAULT_QUEUE_LISTENING_PORT = 10001; diff --git a/src/table/utils/constants.ts b/src/table/utils/constants.ts index 73238da2b..16c522bdc 100644 --- a/src/table/utils/constants.ts +++ b/src/table/utils/constants.ts @@ -18,7 +18,7 @@ export enum TABLE_STATUSCODE { export const DEFAULT_TABLE_CONTEXT_PATH = "azurite_table_context"; export const TABLE_API_VERSION = "2023-11-03"; -export const VERSION = "3.27.0"; +export const VERSION = "3.28.0"; // Max Body size is 4 MB export const BODY_SIZE_MAX = 1024 * 1024 * 4; // Max Entity sizxe is 1 MB From 105a9cd217b881922016edb7a683ebea1ab3b28a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 24 Nov 2023 09:55:09 +0800 Subject: [PATCH 270/297] Bump @types/uri-templates from 0.1.33 to 0.1.34 (#2307) Bumps [@types/uri-templates](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/uri-templates) from 0.1.33 to 0.1.34. - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/uri-templates) --- updated-dependencies: - dependency-name: "@types/uri-templates" dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/package-lock.json b/package-lock.json index 3f5f13a88..28d59af03 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1558,9 +1558,9 @@ } }, "node_modules/@types/uri-templates": { - "version": "0.1.33", - "resolved": "https://registry.npmjs.org/@types/uri-templates/-/uri-templates-0.1.33.tgz", - "integrity": "sha512-dW2hVS0wZQ+ATyoRawggFPyFcfi+Wd14sFOdz3vp6VuV/ZYXT/VU3pB3OswTkZmIVi1yxbh3CNOwfrvVSP5q0w==", + "version": "0.1.34", + "resolved": "https://registry.npmjs.org/@types/uri-templates/-/uri-templates-0.1.34.tgz", + "integrity": "sha512-13v4r/Op3iEO1y6FvEHQjrUNnrNyO67SigdFC9n80sVfsrM2AWJRNYbE1pBs4/p87I7z1J979JGeLAo3rM1L/Q==", "dev": true }, "node_modules/@types/uuid": { @@ -11537,9 +11537,9 @@ } }, "@types/uri-templates": { - "version": "0.1.33", - "resolved": "https://registry.npmjs.org/@types/uri-templates/-/uri-templates-0.1.33.tgz", - "integrity": "sha512-dW2hVS0wZQ+ATyoRawggFPyFcfi+Wd14sFOdz3vp6VuV/ZYXT/VU3pB3OswTkZmIVi1yxbh3CNOwfrvVSP5q0w==", + "version": "0.1.34", + "resolved": "https://registry.npmjs.org/@types/uri-templates/-/uri-templates-0.1.34.tgz", + "integrity": "sha512-13v4r/Op3iEO1y6FvEHQjrUNnrNyO67SigdFC9n80sVfsrM2AWJRNYbE1pBs4/p87I7z1J979JGeLAo3rM1L/Q==", "dev": true }, "@types/uuid": { @@ -18190,4 +18190,4 @@ "dev": true } } -} \ No newline at end of file +} From d2fed274fea9529e631b801d1f100d887677024b Mon Sep 17 00:00:00 2001 From: Paul Jewell <109604867+pauljewellmsft@users.noreply.github.com> Date: Thu, 7 Dec 2023 22:22:03 -0500 Subject: [PATCH 271/297] Fix sample command for PFX cert/pwd (#2314) * Fix sample command for PFX cert/pwd * Update README.md --- README.md | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index 0bee78a88..c6751e424 100644 --- a/README.md +++ b/README.md @@ -146,19 +146,19 @@ This tells Azurite to store all data in a particular directory `c:\azurite`. If For example, to start blob service only: ```bash -$ azurite-blob -l path/to/azurite/workspace +azurite-blob -l path/to/azurite/workspace ``` Start queue service only: ```bash -$ azurite-queue -l path/to/azurite/workspace +azurite-queue -l path/to/azurite/workspace ``` Start table service only: ```bash -$ azurite-table -l path/to/azurite/workspace +azurite-table -l path/to/azurite/workspace ``` ### Visual Studio Code Extension @@ -207,7 +207,7 @@ Following extension configurations are supported: #### Run Azurite V3 docker image -> Note. Find more docker images tags in https://mcr.microsoft.com/v2/azure-storage/azurite/tags/list +> Note. Find more docker images tags in ```bash docker run -p 10000:10000 -p 10001:10001 -p 10002:10002 mcr.microsoft.com/azure-storage/azurite @@ -558,7 +558,7 @@ You have a few options to generate PEM certificate and key files. We'll show you ###### Generate Certificate and Key with mkcert -1. Install mkcert: https://github.com/FiloSottile/mkcert#installation. We like to use choco `choco install mkcert`, but you can install with any mechanism you'd like. +1. Install mkcert: . We like to use choco `choco install mkcert`, but you can install with any mechanism you'd like. 2. Run the following commands to install the Root CA and generate a cert for Azurite. ```bash @@ -589,7 +589,7 @@ docker run -p 10000:10000 -p 10001:10001 -p 10002:10002 -v c:/azurite:/workspace ###### Install OpenSSL on Windows -1. Download and install the OpenSSL v1.1.1a+ EXE from http://slproweb.com/products/Win32OpenSSL.html +1. Download and install the OpenSSL v1.1.1a+ EXE from 2. Set the following environment variables ```bash @@ -639,14 +639,14 @@ You can use the following command to generate a PFX file with `dotnet dev-certs` dotnet dev-certs https --trust -ep cert.pfx -p ``` -> Storage Explorer does not currently work with certificates produced by `dotnet dev-certs`. While you can use them for Azurite and Azure SDKs, you won't be able to access the Azurite endpoints with Storage Explorer if you are using the certs created with dotnet dev-certs. We are tracking this issue on GitHub here: https://github.com/microsoft/AzureStorageExplorer/issues/2859 +> Storage Explorer does not currently work with certificates produced by `dotnet dev-certs`. While you can use them for Azurite and Azure SDKs, you won't be able to access the Azurite endpoints with Storage Explorer if you are using the certs created with dotnet dev-certs. We are tracking this issue on GitHub here: #### Start Azurite with HTTPS and PFX -Then you start Azurite with that cert and key. +Then you start Azurite with that cert and password. ```bash -azurite --cert cert.pem --key key.pem +azurite --cert cert.pfx --pwd pfxpassword ``` NOTE: If you are using the Azure SDKs, then you will also need to pass the `--oauth basic` option. @@ -775,7 +775,7 @@ By default Storage Explorer will not open an HTTPS endpoint that uses a self-sig 1. Find the certificate on your local machine. - **OpenSSL**: You can find the PEM file at the location you created in the [HTTPS Setup](#https-setup) section above. - **mkcert**: You need to import the RootCA.pem file, which can be found by executing this command in the terminal: `mkcert -CAROOT`. For mkcert, you want to import the RootCA.pem file, not the certificate file you created. - - **dotnet dev-certs**: Storage Explorer doesn't currently work with certs produced by `dotnet dev-certs`. We are tracking this issue on GitHub here: https://github.com/microsoft/AzureStorageExplorer/issues/2859 + - **dotnet dev-certs**: Storage Explorer doesn't currently work with certs produced by `dotnet dev-certs`. We are tracking this issue on GitHub here: 2. Open Storage Explorer -> Edit -> SSL Certificates -> Import Certificates and import your certificate. If you do not set this, then you will get the following error: @@ -891,9 +891,9 @@ DefaultEndpointsProtocol=http;AccountName=account1;AccountKey=key1;BlobEndpoint= > Note. Do not access default account in this way with Azure Storage Explorer. There is a bug that Storage Explorer is always adding account name in URL path, causing failures. -> Note. When use Production-style URL to access Azurite, by default the account name should be the host name in FQDN, like "http://devstoreaccount1.blob.localhost:10000/container". To use Production-style URL with account name in URL path, like "http://foo.bar.com:10000/devstoreaccount1/container", please start Azurite with `--disableProductStyleUrl`. +> Note. When use Production-style URL to access Azurite, by default the account name should be the host name in FQDN, like "". To use Production-style URL with account name in URL path, like "", please start Azurite with `--disableProductStyleUrl`. -> Note. If use "host.docker.internal" as request Uri host, like "http://host.docker.internal:10000/devstoreaccount1/container", Azurite will always get account name from request Uri path, not matter Azurite start with `--disableProductStyleUrl` or not. +> Note. If use "host.docker.internal" as request Uri host, like "", Azurite will always get account name from request Uri path, not matter Azurite start with `--disableProductStyleUrl` or not. ### Scalability & Performance From 62ea623a79ba6860f49a30f66971b67edd5991c6 Mon Sep 17 00:00:00 2001 From: Edwin Huber Date: Fri, 8 Dec 2023 11:32:05 +0100 Subject: [PATCH 272/297] Fixes issues caused by cloning tables into Azurite from Azure Storage (#2315) * added check to remove etag from property set when writing to storage, need tests * added test for dropping etag on write --- ChangeLog.md | 3 +- src/table/handlers/TableHandler.ts | 49 ++++++++++++++++-- tests/table/apis/table.entity.test.ts | 73 +++++++++++++++++++++++++-- 3 files changed, 116 insertions(+), 9 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index bca2e5041..04294a362 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -8,7 +8,7 @@ General: -- Add `--inMemoryPersistence` and `--extentMemoryLimit` options and related configs to store all data in-memory without disk persistence. (issue #2227) +- Add `--inMemoryPersistence` and `--extentMemoryLimit` options and related configs to store all data in-memory without disk persistence. (issue #2227) Blob: @@ -17,6 +17,7 @@ Blob: Table: - Fixed table sas request failure with table name include upper case letter (Issue #1359) +- Filters etag from entity writes - seen when some tools clone tables (issue #1536) ## 2023.10 Version 3.27.0 diff --git a/src/table/handlers/TableHandler.ts b/src/table/handlers/TableHandler.ts index 5466196d4..699ecc342 100644 --- a/src/table/handlers/TableHandler.ts +++ b/src/table/handlers/TableHandler.ts @@ -192,10 +192,13 @@ export default class TableHandler extends BaseHandler implements ITableHandler { // const partitionKey = this.getAndCheckPartitionKey(tableContext); // const rowKey = this.getAndCheckRowKey(tableContext); if ( + options.tableEntityProperties == undefined || !options.tableEntityProperties || // rowKey and partitionKey may be empty string options.tableEntityProperties.PartitionKey === null || - options.tableEntityProperties.RowKey === null + options.tableEntityProperties.PartitionKey == undefined || + options.tableEntityProperties.RowKey === null || + options.tableEntityProperties.RowKey === undefined ) { throw StorageErrorFactory.getPropertiesNeedValue(context); } @@ -205,11 +208,18 @@ export default class TableHandler extends BaseHandler implements ITableHandler { this.validateKey(context, options.tableEntityProperties.RowKey); this.checkProperties(context, options.tableEntityProperties); + + // need to remove the etags from the properties to avoid errors + // https://docs.microsoft.com/en-us/rest/api/storageservices/insert-entity + options.tableEntityProperties = this.removeEtagProperty( + options.tableEntityProperties + ); + const entity: Entity = this.createPersistedEntity( context, options, - options.tableEntityProperties.PartitionKey, - options.tableEntityProperties.RowKey + options.tableEntityProperties?.PartitionKey, + options.tableEntityProperties?.RowKey ); let normalizedEntity; try { @@ -246,8 +256,8 @@ export default class TableHandler extends BaseHandler implements ITableHandler { account, table, this.getOdataAnnotationUrlPrefix(tableContext, account), - options.tableEntityProperties.PartitionKey, - options.tableEntityProperties.RowKey, + options.tableEntityProperties?.PartitionKey, + options.tableEntityProperties?.RowKey, accept ); @@ -400,6 +410,9 @@ export default class TableHandler extends BaseHandler implements ITableHandler { // check that key properties are valid this.validateKey(context, partitionKey); this.validateKey(context, rowKey); + options.tableEntityProperties = this.removeEtagProperty( + options.tableEntityProperties + ); const entity: Entity = this.createPersistedEntity( context, @@ -462,6 +475,9 @@ export default class TableHandler extends BaseHandler implements ITableHandler { ); this.checkMergeRequest(options, context, partitionKey, rowKey); + options.tableEntityProperties = this.removeEtagProperty( + options.tableEntityProperties + ); const entity: Entity = this.createPersistedEntity( context, @@ -1146,4 +1162,27 @@ export default class TableHandler extends BaseHandler implements ITableHandler { throw StorageErrorFactory.getEntityTooLarge(context); } } + + /** + * remove the etag property to avoid duplicate odata.etag error + * + * @private + * @param {{ + * [propertyName: string]: any; + * }} tableEntityProperties + * @return {*} {({ [propertyName: string]: any } | undefined)} + * @memberof TableHandler + */ + private removeEtagProperty( + tableEntityProperties: + | { + [propertyName: string]: any; + } + | undefined + ): { [propertyName: string]: any } | undefined { + if (tableEntityProperties) { + delete tableEntityProperties["odata.etag"]; + } + return tableEntityProperties; + } } diff --git a/tests/table/apis/table.entity.test.ts b/tests/table/apis/table.entity.test.ts index 2b74afc5f..b0056166d 100644 --- a/tests/table/apis/table.entity.test.ts +++ b/tests/table/apis/table.entity.test.ts @@ -1,6 +1,5 @@ import * as assert from "assert"; import * as Azure from "azure-storage"; - import { configLogger } from "../../../src/common/Logger"; import StorageError from "../../../src/table/errors/StorageError"; @@ -1640,7 +1639,6 @@ describe("table Entity APIs test - using Azure-Storage", () => { (error, result) => { if (error) { assert.fail(error.message); - done(); } else { assert.strictEqual(result.PartitionKey._, partitionKey); assert.strictEqual(result.RowKey._, rowKey); @@ -1651,7 +1649,6 @@ describe("table Entity APIs test - using Azure-Storage", () => { ); } else { assert.fail(mergeError.message); - done(); } } ); @@ -1659,4 +1656,74 @@ describe("table Entity APIs test - using Azure-Storage", () => { } ); }); + + // for github issue #1536 + it("37. Should drop etag property when inserting entity, @loki", (done) => { + const dropEtagPKey = getUniqueName("drop"); + const rowKey1 = getUniqueName("rk1"); + const entityInsert = new TestEntity(dropEtagPKey, rowKey1, "value"); + tableService.insertEntity( + tableName, + entityInsert, + (insertError, insertResult, insertResponse) => { + if (!insertError) { + tableService.retrieveEntity( + tableName, + entityInsert.PartitionKey._, + entityInsert.RowKey._, + (queryError, queryResult, queryResponse) => { + if (!queryError) { + assert.strictEqual(queryResponse.statusCode, 200); + assert.strictEqual( + queryResult.myValue._, + entityInsert.myValue._ + ); + // now add odata etag property to the entity + const entityWithEtag = queryResult; + const rowKey2 = getUniqueName("rk2"); + entityWithEtag.RowKey._ = rowKey2; + (entityWithEtag as any)["odata.etag"] = + "W/\"datetime'2021-06-30T00%3A00%3A00.0000000Z'\""; + tableService.insertEntity( + tableName, + entityWithEtag, + (insert2Error, insert2Result, insert2Response) => { + if (!insert2Error) { + assert.strictEqual(insert2Response.statusCode, 201); + tableService.retrieveEntity( + tableName, + entityWithEtag.PartitionKey._, + entityWithEtag.RowKey._, + (query2Error, query2Result, query2Response) => { + if (!query2Error && query2Result && query2Response) { + assert.strictEqual(query2Response.statusCode, 200); + assert.strictEqual( + query2Result.myValue._, + entityInsert.myValue._ + ); + assert.notDeepStrictEqual( + (query2Response as any).body["odata.etag"], + "W/\"datetime'2021-06-30T00%3A00%3A00.0000000Z'\"", + "Etag value is not writable and should be dropped." + ); + done(); + } else { + assert.fail(query2Error.message); + } + } + ); + } + } + ); + } else { + assert.fail(queryError.message); + } + } + ); + } else { + assert.fail(insertError.message); + } + } + ); + }); }); From 43f92995615564161cb2d0419cc4984d0eee9be0 Mon Sep 17 00:00:00 2001 From: EmmaZhu-MSFT Date: Mon, 11 Dec 2023 23:25:48 -0800 Subject: [PATCH 273/297] Bump sevice API version to 2024-02-04 and package version to 3.29.0 (#2325) --- ChangeLog.md | 10 ++++++++++ README.md | 15 ++++++++------- package-lock.json | 6 +++--- package.json | 2 +- src/blob/utils/constants.ts | 5 +++-- src/queue/utils/constants.ts | 5 +++-- src/table/utils/constants.ts | 5 +++-- 7 files changed, 31 insertions(+), 17 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index 04294a362..45a776bbf 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -4,6 +4,16 @@ ## Upcoming Release +## 2023.12 Version 3.29.0 + +General: + +- Bump up service API version to 2024-02-04 + +Table: + +- Filters etag from entity writes - seen when some tools clone tables (issue #1536) + ## 2023.11 Version 3.28.0 General: diff --git a/README.md b/README.md index c6751e424..207cfc8e6 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,7 @@ | Version | Azure Storage API Version | Service Support | Description | Reference Links | | ------------------------------------------------------------------ | ------------------------- | ------------------------------ | ------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| 3.28.0 | 2023-11-03 | Blob, Queue and Table(preview) | Azurite V3 based on TypeScript & New Architecture | [NPM](https://www.npmjs.com/package/azurite) - [Docker](https://hub.docker.com/_/microsoft-azure-storage-azurite) - [Visual Studio Code Extension](https://marketplace.visualstudio.com/items?itemName=Azurite.azurite) | +| 3.29.0 | 2024-02-04 | Blob, Queue and Table(preview) | Azurite V3 based on TypeScript & New Architecture | [NPM](https://www.npmjs.com/package/azurite) - [Docker](https://hub.docker.com/_/microsoft-azure-storage-azurite) - [Visual Studio Code Extension](https://marketplace.visualstudio.com/items?itemName=Azurite.azurite) | | [Legacy (v2)](https://github.com/Azure/Azurite/tree/legacy-master) | 2016-05-31 | Blob, Queue and Table | Legacy Azurite V2 | [NPM](https://www.npmjs.com/package/azurite) | - [Azurite V3](#azurite-v3) @@ -78,19 +78,19 @@ Compared to V2, Azurite V3 implements a new architecture leveraging code generat ## Features & Key Changes in Azurite V3 -- Blob storage features align with Azure Storage API version 2023-11-03 (Refer to support matrix section below) +- Blob storage features align with Azure Storage API version 2024-02-04 (Refer to support matrix section below) - SharedKey/Account SAS/Service SAS/Public Access Authentications/OAuth - Get/Set Blob Service Properties - Create/List/Delete Containers - Create/Read/List/Update/Delete Block Blobs - Create/Read/List/Update/Delete Page Blobs -- Queue storage features align with Azure Storage API version 2023-11-03 (Refer to support matrix section below) +- Queue storage features align with Azure Storage API version 2024-02-04 (Refer to support matrix section below) - SharedKey/Account SAS/Service SAS/OAuth - Get/Set Queue Service Properties - Preflight Request - Create/List/Delete Queues - Put/Get/Peek/Updata/Deleta/Clear Messages -- Table storage features align with Azure Storage API version 2023-11-03 (Refer to support matrix section below) +- Table storage features align with Azure Storage API version 2024-02-04 (Refer to support matrix section below) - SharedKey/Account SAS/Service SAS/OAuth - Create/List/Delete Tables - Insert/Update/Query/Delete Table Entities @@ -971,7 +971,7 @@ All the generated code is kept in `generated` folder, including the generated mi ## Support Matrix -Latest release targets **2023-11-03** API version **blob** service. +Latest release targets **2024-02-04** API version **blob** service. Detailed support matrix: @@ -1014,6 +1014,7 @@ Detailed support matrix: - SharedKey Lite - Static Website + - Soft delete & Undelete Container - Soft delete & Undelete Blob - Incremental Copy Blob - Blob Tags @@ -1029,7 +1030,7 @@ Detailed support matrix: - Encryption Scope - Get Page Ranges Continuation Token -Latest version supports for **2023-11-03** API version **queue** service. +Latest version supports for **2024-02-04** API version **queue** service. Detailed support matrix: - Supported Vertical Features @@ -1058,7 +1059,7 @@ Detailed support matrix: - Following features or REST APIs are NOT supported or limited supported in this release (will support more features per customers feedback in future releases) - SharedKey Lite -Latest version supports for **2023-11-03** API version **table** service (preview). +Latest version supports for **2024-02-04** API version **table** service (preview). Detailed support matrix: - Supported Vertical Features diff --git a/package-lock.json b/package-lock.json index 28d59af03..7d5fca34b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "azurite", - "version": "3.28.0", + "version": "3.29.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "azurite", - "version": "3.28.0", + "version": "3.29.0", "license": "MIT", "dependencies": { "@azure/ms-rest-js": "^1.5.0", @@ -18190,4 +18190,4 @@ "dev": true } } -} +} \ No newline at end of file diff --git a/package.json b/package.json index 8ec2354ff..be999929d 100644 --- a/package.json +++ b/package.json @@ -3,7 +3,7 @@ "displayName": "Azurite", "description": "An open source Azure Storage API compatible server", "icon": "icon.png", - "version": "3.28.0", + "version": "3.29.0", "publisher": "Azurite", "categories": [ "Other" diff --git a/src/blob/utils/constants.ts b/src/blob/utils/constants.ts index 6ccc40445..4a324b8fa 100644 --- a/src/blob/utils/constants.ts +++ b/src/blob/utils/constants.ts @@ -1,8 +1,8 @@ import { StoreDestinationArray } from "../../common/persistence/IExtentStore"; import * as Models from "../generated/artifacts/models"; -export const VERSION = "3.28.0"; -export const BLOB_API_VERSION = "2023-11-03"; +export const VERSION = "3.29.0"; +export const BLOB_API_VERSION = "2024-02-04"; export const DEFAULT_BLOB_SERVER_HOST_NAME = "127.0.0.1"; // Change to 0.0.0.0 when needs external access export const DEFAULT_LIST_BLOBS_MAX_RESULTS = 5000; export const DEFAULT_LIST_CONTAINERS_MAX_RESULTS = 5000; @@ -97,6 +97,7 @@ export const DEFAULT_BLOB_PERSISTENCE_ARRAY: StoreDestinationArray = [ ]; export const ValidAPIVersions = [ + "2024-02-04", "2023-11-03", "2023-08-03", "2023-01-03", diff --git a/src/queue/utils/constants.ts b/src/queue/utils/constants.ts index 422b1f6a2..15ebe24bc 100644 --- a/src/queue/utils/constants.ts +++ b/src/queue/utils/constants.ts @@ -1,7 +1,7 @@ import { StoreDestinationArray } from "../../common/persistence/IExtentStore"; -export const VERSION = "3.28.0"; -export const QUEUE_API_VERSION = "2023-11-03"; +export const VERSION = "3.29.0"; +export const QUEUE_API_VERSION = "2024-02-04"; export const DEFAULT_QUEUE_SERVER_HOST_NAME = "127.0.0.1"; // Change to 0.0.0.0 when needs external access export const DEFAULT_QUEUE_LISTENING_PORT = 10001; export const IS_PRODUCTION = process.env.NODE_ENV === "production"; @@ -90,6 +90,7 @@ export const DEFAULT_QUEUE_PERSISTENCE_ARRAY: StoreDestinationArray = [ ]; export const ValidAPIVersions = [ + "2024-02-04", "2023-11-03", "2023-08-03", "2023-01-03", diff --git a/src/table/utils/constants.ts b/src/table/utils/constants.ts index 16c522bdc..9cbd2abeb 100644 --- a/src/table/utils/constants.ts +++ b/src/table/utils/constants.ts @@ -17,8 +17,8 @@ export enum TABLE_STATUSCODE { } export const DEFAULT_TABLE_CONTEXT_PATH = "azurite_table_context"; -export const TABLE_API_VERSION = "2023-11-03"; -export const VERSION = "3.28.0"; +export const TABLE_API_VERSION = "2024-02-04"; +export const VERSION = "3.29.0"; // Max Body size is 4 MB export const BODY_SIZE_MAX = 1024 * 1024 * 4; // Max Entity sizxe is 1 MB @@ -73,6 +73,7 @@ export const DEFAULT_TABLE_PERSISTENCE_ARRAY: StoreDestinationArray = [ export const QUERY_RESULT_MAX_NUM = 1000; export const ValidAPIVersions = [ + "2024-02-04", "2023-11-03", "2023-08-03", "2023-01-03", From f00539977f0b339ff7bca1572940cee881b7215f Mon Sep 17 00:00:00 2001 From: Sutou Kouhei Date: Tue, 26 Dec 2023 14:41:56 +0900 Subject: [PATCH 274/297] Fix HTTP header parsing in SubmitBatch request (#2302) * Fix HTTP header parsing in SubmitBatch request If a SubmitBatch request has a HTTP header that has a HTTP header delimiter (":") in its value, the SubmitBatch request is failed as "400 One of the request inputs is not valid." For example, if `user-agent` header is `azsdk-cpp-storage-blobs/12.10.0-beta.1 (Darwin 23.1.0 arm64 Darwin Kernel Version 23.1.0: Mon Oct 9 21:28:12 PDT 2023; root:xnu-10002.41.9~6/RELEASE_ARM64_T8103)`, all `SubmitBatch()` requests are failed. * trigger GitHub actions --------- Co-authored-by: Emma Zhu --- ChangeLog.md | 1 + src/blob/handlers/BlobBatchHandler.ts | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index 45a776bbf..d85cf2bc2 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -23,6 +23,7 @@ General: Blob: - Fixed issue of not requiring SAS permission for some specific operations. (issue #2299) +- Fix HTTP header parsing of `SubmitBatch()`. If a HTTP header has HTTP header delimiter (`:`) in its value, `SubmitBatch()` returns "400 One of the request inputs is not valid". For example, if `user-agent` header is `azsdk-cpp-storage-blobs/12.10.0-beta.1 (Darwin 23.1.0 arm64 Darwin Kernel Version 23.1.0: Mon Oct 9 21:28:12 PDT 2023; root:xnu-10002.41.9~6/RELEASE_ARM64_T8103)`, all `SubmitBatch()` requests are failed. Table: diff --git a/src/blob/handlers/BlobBatchHandler.ts b/src/blob/handlers/BlobBatchHandler.ts index 8fd3f9a8b..296b62c22 100644 --- a/src/blob/handlers/BlobBatchHandler.ts +++ b/src/blob/handlers/BlobBatchHandler.ts @@ -354,7 +354,7 @@ export class BlobBatchHandler { while (lineIndex < requestLines.length) { if (requestLines[lineIndex] === '') break; - const header = requestLines[lineIndex].split(HTTP_HEADER_DELIMITER); + const header = requestLines[lineIndex].split(HTTP_HEADER_DELIMITER, 2); if (header.length !== 2) throw new Error("Bad Request"); @@ -384,7 +384,7 @@ export class BlobBatchHandler { ++lineIndex; while (lineIndex < requestLines.length) { if (requestLines[lineIndex] === '') break; // Last line - const header = requestLines[lineIndex].split(HTTP_HEADER_DELIMITER); + const header = requestLines[lineIndex].split(HTTP_HEADER_DELIMITER, 2); if (header.length !== 2) throw new Error("Bad Request"); blobBatchSubRequest.setHeader(header[0], header[1]); From 9208664c196acb49b133f6152296c7770c0a1d0e Mon Sep 17 00:00:00 2001 From: Wei Wei Date: Tue, 26 Dec 2023 15:32:07 +0800 Subject: [PATCH 275/297] Fix issue 2327: set tag should not change etag, LMT (#2328) * Fix issue 2327: set tag should not change etag, LMT * Fix a format * make change log in the right place --- ChangeLog.md | 6 +++++- src/blob/persistence/LokiBlobMetadataStore.ts | 2 -- src/blob/persistence/SqlBlobMetadataStore.ts | 5 ----- tests/blob/apis/blob.test.ts | 14 +++++++++++--- 4 files changed, 16 insertions(+), 11 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index d85cf2bc2..0c8438bbe 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -4,6 +4,11 @@ ## Upcoming Release +Blob: + +- Fixed issue of setting blob tag should not update Blob Etag and LastModified. (issue #2327) +- Fix HTTP header parsing of `SubmitBatch()`. If a HTTP header has HTTP header delimiter (`:`) in its value, `SubmitBatch()` returns "400 One of the request inputs is not valid". For example, if `user-agent` header is `azsdk-cpp-storage-blobs/12.10.0-beta.1 (Darwin 23.1.0 arm64 Darwin Kernel Version 23.1.0: Mon Oct 9 21:28:12 PDT 2023; root:xnu-10002.41.9~6/RELEASE_ARM64_T8103)`, all `SubmitBatch()` requests are failed. + ## 2023.12 Version 3.29.0 General: @@ -23,7 +28,6 @@ General: Blob: - Fixed issue of not requiring SAS permission for some specific operations. (issue #2299) -- Fix HTTP header parsing of `SubmitBatch()`. If a HTTP header has HTTP header delimiter (`:`) in its value, `SubmitBatch()` returns "400 One of the request inputs is not valid". For example, if `user-agent` header is `azsdk-cpp-storage-blobs/12.10.0-beta.1 (Darwin 23.1.0 arm64 Darwin Kernel Version 23.1.0: Mon Oct 9 21:28:12 PDT 2023; root:xnu-10002.41.9~6/RELEASE_ARM64_T8103)`, all `SubmitBatch()` requests are failed. Table: diff --git a/src/blob/persistence/LokiBlobMetadataStore.ts b/src/blob/persistence/LokiBlobMetadataStore.ts index fb1b10308..bae54c07e 100644 --- a/src/blob/persistence/LokiBlobMetadataStore.ts +++ b/src/blob/persistence/LokiBlobMetadataStore.ts @@ -3353,8 +3353,6 @@ export default class LokiBlobMetadataStore new BlobWriteLeaseValidator(leaseAccessConditions).validate(lease, context); new BlobWriteLeaseSyncer(doc).sync(lease); doc.blobTags = tags; - doc.properties.etag = newEtag(); - doc.properties.lastModified = context.startTime || new Date(); coll.update(doc); } diff --git a/src/blob/persistence/SqlBlobMetadataStore.ts b/src/blob/persistence/SqlBlobMetadataStore.ts index ad0d96264..cb96a6fc4 100644 --- a/src/blob/persistence/SqlBlobMetadataStore.ts +++ b/src/blob/persistence/SqlBlobMetadataStore.ts @@ -3354,14 +3354,9 @@ export default class SqlBlobMetadataStore implements IBlobMetadataStore { .validate(new BlobWriteLeaseValidator(leaseAccessConditions)) .sync(new BlobWriteLeaseSyncer(blobModel)); - const lastModified = context.startTime! || new Date(); - const etag = newEtag(); - await BlobsModel.update( { blobTags: this.serializeModelValue(tags) || null, - lastModified, - etag, ...this.convertLeaseToDbModel(new BlobLeaseAdapter(blobModel)) }, { diff --git a/tests/blob/apis/blob.test.ts b/tests/blob/apis/blob.test.ts index c21212ed9..a95fb9a91 100644 --- a/tests/blob/apis/blob.test.ts +++ b/tests/blob/apis/blob.test.ts @@ -1420,10 +1420,14 @@ describe("BlobAPIs", () => { tag3: "val3", }; - // Set/get tags on base blob + // Set/get tags on base blob, etag, lastModified should not change + var properties1 = await blobClient.getProperties(); await blobClient.setTags(tags); let outputTags1 = (await blobClient.getTags()).tags; assert.deepStrictEqual(outputTags1, tags); + var properties2 = await blobClient.getProperties(); + assert.deepStrictEqual(properties1.etag, properties2.etag); + assert.deepStrictEqual(properties1.lastModified, properties2.lastModified); // create snapshot, the tags should be same as base blob const snapshotResponse = await blobClient.createSnapshot(); @@ -1431,10 +1435,14 @@ describe("BlobAPIs", () => { let outputTags2 = (await blobClientSnapshot.getTags()).tags; assert.deepStrictEqual(outputTags2, tags); - // Set/get tags on snapshot, base blob tags should not be impacted. + // Set/get tags on snapshot, base blob tags should not be impacted, etag, lastModified should not change + var properties1 = await blobClientSnapshot.getProperties(); await blobClientSnapshot.setTags(tags2); outputTags2 = (await blobClientSnapshot.getTags()).tags; - assert.deepStrictEqual(outputTags2, tags2); + assert.deepStrictEqual(outputTags2, tags2); + var properties2 = await blobClientSnapshot.getProperties(); + assert.deepStrictEqual(properties1.etag, properties2.etag); + assert.deepStrictEqual(properties1.lastModified, properties2.lastModified); outputTags1 = (await blobClient.getTags()).tags; assert.deepStrictEqual(outputTags1, tags); From 3f644206f9442675062ab0012a39a4a9b05f2fc0 Mon Sep 17 00:00:00 2001 From: EmmaZhu-MSFT Date: Tue, 26 Dec 2023 00:47:01 -0800 Subject: [PATCH 276/297] Fix issue of copy succeeded without 'r' permission in SAS token credential (#2330) --- ChangeLog.md | 1 + src/blob/handlers/BlobHandler.ts | 127 +++++++++++++++--------------- tests/blob/apis/blockblob.test.ts | 44 ++++++++++- tests/blob/sas.test.ts | 5 +- 4 files changed, 110 insertions(+), 67 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index 0c8438bbe..d141abaaf 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -8,6 +8,7 @@ Blob: - Fixed issue of setting blob tag should not update Blob Etag and LastModified. (issue #2327) - Fix HTTP header parsing of `SubmitBatch()`. If a HTTP header has HTTP header delimiter (`:`) in its value, `SubmitBatch()` returns "400 One of the request inputs is not valid". For example, if `user-agent` header is `azsdk-cpp-storage-blobs/12.10.0-beta.1 (Darwin 23.1.0 arm64 Darwin Kernel Version 23.1.0: Mon Oct 9 21:28:12 PDT 2023; root:xnu-10002.41.9~6/RELEASE_ARM64_T8103)`, all `SubmitBatch()` requests are failed. +- Fixed issue of blob copying succeed without 'r' permission in source blob's SAS token credential. ## 2023.12 Version 3.29.0 diff --git a/src/blob/handlers/BlobHandler.ts b/src/blob/handlers/BlobHandler.ts index b9da01ae2..53eef62bc 100644 --- a/src/blob/handlers/BlobHandler.ts +++ b/src/blob/handlers/BlobHandler.ts @@ -122,39 +122,39 @@ export default class BlobHandler extends BaseHandler implements IBlobHandler { const response: Models.BlobGetPropertiesResponse = againstMetadata ? { - statusCode: 200, - metadata: res.metadata, - eTag: res.properties.etag, - requestId: context.contextId, - version: BLOB_API_VERSION, - date: context.startTime, - clientRequestId: options.requestId, - contentLength: res.properties.contentLength, - lastModified: res.properties.lastModified - } + statusCode: 200, + metadata: res.metadata, + eTag: res.properties.etag, + requestId: context.contextId, + version: BLOB_API_VERSION, + date: context.startTime, + clientRequestId: options.requestId, + contentLength: res.properties.contentLength, + lastModified: res.properties.lastModified + } : { - statusCode: 200, - metadata: res.metadata, - isIncrementalCopy: res.properties.incrementalCopy, - eTag: res.properties.etag, - requestId: context.contextId, - version: BLOB_API_VERSION, - date: context.startTime, - acceptRanges: "bytes", - blobCommittedBlockCount: - res.properties.blobType === Models.BlobType.AppendBlob - ? res.blobCommittedBlockCount - : undefined, - isServerEncrypted: true, - clientRequestId: options.requestId, - ...res.properties, - cacheControl: context.request!.getQuery("rscc") ?? res.properties.cacheControl, - contentDisposition: context.request!.getQuery("rscd") ?? res.properties.contentDisposition, - contentEncoding: context.request!.getQuery("rsce") ?? res.properties.contentEncoding, - contentLanguage: context.request!.getQuery("rscl") ?? res.properties.contentLanguage, - contentType: context.request!.getQuery("rsct") ?? res.properties.contentType, - tagCount: res.properties.tagCount, - }; + statusCode: 200, + metadata: res.metadata, + isIncrementalCopy: res.properties.incrementalCopy, + eTag: res.properties.etag, + requestId: context.contextId, + version: BLOB_API_VERSION, + date: context.startTime, + acceptRanges: "bytes", + blobCommittedBlockCount: + res.properties.blobType === Models.BlobType.AppendBlob + ? res.blobCommittedBlockCount + : undefined, + isServerEncrypted: true, + clientRequestId: options.requestId, + ...res.properties, + cacheControl: context.request!.getQuery("rscc") ?? res.properties.cacheControl, + contentDisposition: context.request!.getQuery("rscd") ?? res.properties.contentDisposition, + contentEncoding: context.request!.getQuery("rsce") ?? res.properties.contentEncoding, + contentLanguage: context.request!.getQuery("rscl") ?? res.properties.contentLanguage, + contentType: context.request!.getQuery("rsct") ?? res.properties.contentType, + tagCount: res.properties.tagCount, + }; return response; } @@ -329,12 +329,10 @@ export default class BlobHandler extends BaseHandler implements IBlobHandler { const metadata = convertRawHeadersToMetadata( blobCtx.request!.getRawHeaders() ); - - if (metadata != undefined) - { + + if (metadata != undefined) { Object.entries(metadata).forEach(([key, value]) => { - if (key.includes("-")) - { + if (key.includes("-")) { throw StorageErrorFactory.getInvalidMetadata(context.contextId!); } }); @@ -664,7 +662,8 @@ export default class BlobHandler extends BaseHandler implements IBlobHandler { throw StorageErrorFactory.getBlobNotFound(context.contextId!); } - if (sourceAccount !== blobCtx.account) { + const sig = url.searchParams.get("sig"); + if ((sourceAccount !== blobCtx.account) || (sig !== null)) { await this.validateCopySource(copySource, sourceAccount, context); } @@ -1103,7 +1102,7 @@ export default class BlobHandler extends BaseHandler implements IBlobHandler { tagCount: getBlobTagsCount(blob.blobTags), isServerEncrypted: true, clientRequestId: options.requestId, - creationTime:blob.properties.creationTime, + creationTime: blob.properties.creationTime, blobCommittedBlockCount: blob.properties.blobType === Models.BlobType.AppendBlob ? (blob.committedBlocksInOrder || []).length @@ -1176,9 +1175,9 @@ export default class BlobHandler extends BaseHandler implements IBlobHandler { contentLength <= 0 ? [] : this.rangesManager.fillZeroRanges(blob.pageRangesInOrder, { - start: rangeStart, - end: rangeEnd - }); + start: rangeStart, + end: rangeEnd + }); const bodyGetter = async () => { return this.extentStore.readExtents( @@ -1233,7 +1232,7 @@ export default class BlobHandler extends BaseHandler implements IBlobHandler { blobContentMD5: blob.properties.contentMD5, tagCount: getBlobTagsCount(blob.blobTags), isServerEncrypted: true, - creationTime:blob.properties.creationTime, + creationTime: blob.properties.creationTime, clientRequestId: options.requestId }; @@ -1243,7 +1242,7 @@ export default class BlobHandler extends BaseHandler implements IBlobHandler { public async query( options: Models.BlobQueryOptionalParams, context: Context - ): Promise{ + ): Promise { throw new NotImplementedError(context.contextId); } @@ -1266,13 +1265,13 @@ export default class BlobHandler extends BaseHandler implements IBlobHandler { ); const response: Models.BlobGetTagsResponse = { - statusCode: 200, - blobTagSet: tags === undefined ? []: tags.blobTagSet, - requestId: context.contextId, - version: BLOB_API_VERSION, - date: context.startTime, - clientRequestId: options.requestId, - }; + statusCode: 200, + blobTagSet: tags === undefined ? [] : tags.blobTagSet, + requestId: context.contextId, + version: BLOB_API_VERSION, + date: context.startTime, + clientRequestId: options.requestId, + }; return response; } @@ -1315,18 +1314,18 @@ export default class BlobHandler extends BaseHandler implements IBlobHandler { return response; } - private NewUriFromCopySource(copySource: string, context: Context): URL{ - try{ - return new URL(copySource) - } - catch - { - throw StorageErrorFactory.getInvalidHeaderValue( - context.contextId, - { - HeaderName: "x-ms-copy-source", - HeaderValue: copySource - }) - } + private NewUriFromCopySource(copySource: string, context: Context): URL { + try { + return new URL(copySource) + } + catch + { + throw StorageErrorFactory.getInvalidHeaderValue( + context.contextId, + { + HeaderName: "x-ms-copy-source", + HeaderValue: copySource + }) + } } } diff --git a/tests/blob/apis/blockblob.test.ts b/tests/blob/apis/blockblob.test.ts index d185ec5b2..8b230344c 100644 --- a/tests/blob/apis/blockblob.test.ts +++ b/tests/blob/apis/blockblob.test.ts @@ -1,7 +1,8 @@ import { StorageSharedKeyCredential, BlobServiceClient, - newPipeline + newPipeline, + BlobSASPermissions } from "@azure/storage-blob"; import assert = require("assert"); import crypto = require("crypto"); @@ -548,4 +549,45 @@ describe("BlockBlobAPIs", () => { body ); }); + + it("Start copy without required permission should fail @loki @sql", async () => { + const body: string = getUniqueName("randomstring"); + const expiryTime = new Date(); + expiryTime.setDate(expiryTime.getDate() + 1); + await blockBlobClient.upload(body, Buffer.byteLength(body)); + + const sourceURLWithoutPermission = await blockBlobClient.generateSasUrl({ + permissions: BlobSASPermissions.parse("w"), + expiresOn: expiryTime + }); + + const destBlobName: string = getUniqueName("destBlobName"); + const destBlobClient = containerClient.getBlockBlobClient(destBlobName); + + try { + await destBlobClient.beginCopyFromURL(sourceURLWithoutPermission); + assert.fail("Copy without required permision should fail"); + } + catch (ex) { + assert.deepStrictEqual(ex.statusCode, 403); + assert.ok(ex.message.startsWith("This request is not authorized to perform this operation using this permission.")); + assert.deepStrictEqual(ex.code, "CannotVerifyCopySource"); + } + + // Copy within the same account without SAS token should succeed. + const result = await (await destBlobClient.beginCopyFromURL(blockBlobClient.url)).pollUntilDone(); + assert.ok(result.copyId); + assert.strictEqual(result.errorCode, undefined); + + // Copy with 'r' permission should succeed. + const sourceURL = await blockBlobClient.generateSasUrl({ + permissions: BlobSASPermissions.parse("r"), + expiresOn: expiryTime + }); + + const resultWithPermission = await (await destBlobClient.beginCopyFromURL(sourceURL)).pollUntilDone(); + assert.ok(resultWithPermission.copyId); + assert.strictEqual(resultWithPermission.errorCode, undefined); + }); + }); diff --git a/tests/blob/sas.test.ts b/tests/blob/sas.test.ts index 3c9a4311e..f7b7d34d3 100644 --- a/tests/blob/sas.test.ts +++ b/tests/blob/sas.test.ts @@ -655,7 +655,8 @@ describe("Shared Access Signature (SAS) authentication", () => { ); const containerName = getUniqueName("con"); - const containerClient = serviceClientWithSAS.getContainerClient( + const containerClient = serviceClient.getContainerClient(containerName); + const containerClientWithSAS = serviceClientWithSAS.getContainerClient( containerName ); await containerClient.create(); @@ -663,7 +664,7 @@ describe("Shared Access Signature (SAS) authentication", () => { const blobName1 = getUniqueName("blob"); const blobName2 = getUniqueName("blob"); const blob1 = containerClient.getBlockBlobClient(blobName1); - const blob2 = containerClient.getBlockBlobClient(blobName2); + const blob2 = containerClientWithSAS.getBlockBlobClient(blobName2); await blob1.upload("hello", 5); From fd207836fa0105e3cb73bb5bf041d57846fc02bb Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 9 Jan 2024 10:43:56 +0800 Subject: [PATCH 277/297] Bump mysql2 from 3.6.3 to 3.7.0 (#2335) Bumps [mysql2](https://github.com/sidorares/node-mysql2) from 3.6.3 to 3.7.0. - [Release notes](https://github.com/sidorares/node-mysql2/releases) - [Changelog](https://github.com/sidorares/node-mysql2/blob/master/Changelog.md) - [Commits](https://github.com/sidorares/node-mysql2/compare/v3.6.3...v3.7.0) --- updated-dependencies: - dependency-name: mysql2 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/package-lock.json b/package-lock.json index 7d5fca34b..500cced89 100644 --- a/package-lock.json +++ b/package-lock.json @@ -7447,9 +7447,9 @@ "dev": true }, "node_modules/mysql2": { - "version": "3.6.3", - "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.6.3.tgz", - "integrity": "sha512-qYd/1CDuW1KYZjD4tzg2O8YS3X/UWuGH8ZMHyMeggMTXL3yOdMisbwZ5SNkHzDGlZXKYLAvV8tMrEH+NUMz3fw==", + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.7.0.tgz", + "integrity": "sha512-c45jA3Jc1X8yJKzrWu1GpplBKGwv/wIV6ITZTlCSY7npF2YfJR+6nMP5e+NTQhUeJPSyOQAbGDCGEHbAl8HN9w==", "dependencies": { "denque": "^2.1.0", "generate-function": "^2.3.1", @@ -16072,9 +16072,9 @@ "dev": true }, "mysql2": { - "version": "3.6.3", - "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.6.3.tgz", - "integrity": "sha512-qYd/1CDuW1KYZjD4tzg2O8YS3X/UWuGH8ZMHyMeggMTXL3yOdMisbwZ5SNkHzDGlZXKYLAvV8tMrEH+NUMz3fw==", + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.7.0.tgz", + "integrity": "sha512-c45jA3Jc1X8yJKzrWu1GpplBKGwv/wIV6ITZTlCSY7npF2YfJR+6nMP5e+NTQhUeJPSyOQAbGDCGEHbAl8HN9w==", "requires": { "denque": "^2.1.0", "generate-function": "^2.3.1", @@ -18190,4 +18190,4 @@ "dev": true } } -} \ No newline at end of file +} From d544d16f910e490fdd9db5565459df701895308f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 11 Jan 2024 15:57:36 +0800 Subject: [PATCH 278/297] Bump prettier from 3.0.3 to 3.1.1 (#2338) Bumps [prettier](https://github.com/prettier/prettier) from 3.0.3 to 3.1.1. - [Release notes](https://github.com/prettier/prettier/releases) - [Changelog](https://github.com/prettier/prettier/blob/main/CHANGELOG.md) - [Commits](https://github.com/prettier/prettier/compare/3.0.3...3.1.1) --- updated-dependencies: - dependency-name: prettier dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 500cced89..47266fba9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8317,9 +8317,9 @@ } }, "node_modules/prettier": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.0.3.tgz", - "integrity": "sha512-L/4pUDMxcNa8R/EthV08Zt42WBO4h1rarVtK0K+QJG0X187OLo7l699jWw0GKuwzkPQ//jMFA/8Xm6Fh3J/DAg==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.1.1.tgz", + "integrity": "sha512-22UbSzg8luF4UuZtzgiUOfcGM8s4tjBv6dJRT7j275NXsy2jb4aJa4NNveul5x4eqlF1wuhuR2RElK71RvmVaw==", "dev": true, "bin": { "prettier": "bin/prettier.cjs" @@ -16706,9 +16706,9 @@ "dev": true }, "prettier": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.0.3.tgz", - "integrity": "sha512-L/4pUDMxcNa8R/EthV08Zt42WBO4h1rarVtK0K+QJG0X187OLo7l699jWw0GKuwzkPQ//jMFA/8Xm6Fh3J/DAg==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.1.1.tgz", + "integrity": "sha512-22UbSzg8luF4UuZtzgiUOfcGM8s4tjBv6dJRT7j275NXsy2jb4aJa4NNveul5x4eqlF1wuhuR2RElK71RvmVaw==", "dev": true }, "private": { From 0e6b520543c47d5b296e2933c028c43ca9e3aad9 Mon Sep 17 00:00:00 2001 From: EmmaZhu-MSFT Date: Mon, 1 Apr 2024 19:05:30 -0700 Subject: [PATCH 279/297] Resolve issue of error when connecting to mssql with docker image or exe (#2370) * Resolve issue of error when connecting to mssql with docker image or exe * Bump pipeline node version to build exe to 20.x --- Dockerfile | 17 +++++++++-------- azure-pipelines.yml | 4 ++-- scripts/buildExe.js | 14 +++++++------- 3 files changed, 18 insertions(+), 17 deletions(-) diff --git a/Dockerfile b/Dockerfile index 414b1a18e..2a6a67713 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,7 +1,7 @@ # # Builder # -FROM node:14-alpine3.17 AS builder +FROM node:20-alpine3.17 as builder WORKDIR /opt/azurite @@ -11,16 +11,14 @@ COPY *.json LICENSE NOTICE.txt ./ # Copy the source code and build the app COPY src ./src COPY tests ./tests -RUN npm config set unsafe-perm=true && \ - npm ci +RUN npm ci --unsafe-perm RUN npm run build && \ - npm install -g --loglevel verbose + npm install -g --unsafe-perm --loglevel verbose -# # Production image # -FROM node:14-alpine3.17 +FROM node:20-alpine3.17 ENV NODE_ENV=production @@ -33,8 +31,11 @@ COPY package*.json LICENSE NOTICE.txt ./ COPY --from=builder /opt/azurite/dist/ dist/ -RUN npm config set unsafe-perm=true && \ - npm install -g --loglevel verbose +RUN npm pkg set scripts.prepare="echo no-prepare" + +RUN npm ci --unsafe-perm + +RUN npm install -g --unsafe-perm --loglevel verbose # Blob Storage Port EXPOSE 10000 diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 92fdcc4ad..26ed48da7 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -571,8 +571,8 @@ jobs: # our .exe build program is currently incompatible with node 10 # node_10_x: # node_version: 10.x - node_14_x: - node_version: 14.x + node_18_x: + node_version: 18.x steps: - task: NodeTool@0 inputs: diff --git a/scripts/buildExe.js b/scripts/buildExe.js index 57b49a05d..851cf7b48 100644 --- a/scripts/buildExe.js +++ b/scripts/buildExe.js @@ -12,13 +12,13 @@ const pkgFetch = require('pkg-fetch'); build(); async function build() { - const pkgTarget = 'node14-win-x64'; + const pkgTarget = 'node18-win-x64'; const cacheExe = await downloadCache(pkgTarget); await rcedit(cacheExe, { "version-string": { - "CompanyName": "Microsoft", - "ProductName": "Azurite", - "FileDescription": "Azurite", + "CompanyName": "Microsoft", + "ProductName": "Azurite", + "FileDescription": "Azurite", "ProductVersion": pjson.version, "OriginalFilename": "", "InternalName": "node", @@ -27,7 +27,7 @@ async function build() { // file-version is kept as the node version used by the .exe for debugging purposes "icon": path.resolve('.\\icon.ico') }); - + // rename the cache file to skip hash check by pkg-fetch since hash check reverts our change of properties const newName = cacheExe.replace("fetched", "built"); @@ -38,14 +38,14 @@ async function build() { } await asyncRename(cacheExe, newName); - + const outputExe = path.resolve('.\\release\\azurite.exe'); await pkg.exec([path.resolve('.'), ...['--target', pkgTarget], ...['--output', outputExe], ...['-C', 'Brotli']]); } async function downloadCache(pkgTarget) { const [nodeRange, platform, arch] = pkgTarget.split('-'); - + await pkgFetch.need({ nodeRange, platform, arch }); const cacheExe = glob.sync(process.env.PKG_CACHE_PATH + "\\**\\fetched*"); if (cacheExe.length < 1) { From ad3114cec9e80062be3ea014c5776a06162fbb32 Mon Sep 17 00:00:00 2001 From: Wei Wei Date: Tue, 16 Apr 2024 14:39:41 +0800 Subject: [PATCH 280/297] Fail the insert entity request with double property whose value is greater than MAX_VALUE (Issue #2387) (#2388) * Fail the insert entity request with double property whose value is greater than MAX_VALUE (Issue #2387) * Fix a typo * Add more accurate value in test and comments --- ChangeLog.md | 4 ++ src/table/entity/EdmDouble.ts | 5 +++ tests/table/apis/table.entity.test.ts | 64 +++++++++++++++++++++++++++ 3 files changed, 73 insertions(+) diff --git a/ChangeLog.md b/ChangeLog.md index d141abaaf..5fb166316 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -10,6 +10,10 @@ Blob: - Fix HTTP header parsing of `SubmitBatch()`. If a HTTP header has HTTP header delimiter (`:`) in its value, `SubmitBatch()` returns "400 One of the request inputs is not valid". For example, if `user-agent` header is `azsdk-cpp-storage-blobs/12.10.0-beta.1 (Darwin 23.1.0 arm64 Darwin Kernel Version 23.1.0: Mon Oct 9 21:28:12 PDT 2023; root:xnu-10002.41.9~6/RELEASE_ARM64_T8103)`, all `SubmitBatch()` requests are failed. - Fixed issue of blob copying succeed without 'r' permission in source blob's SAS token credential. +Table: + +- Fail the insert entity request with double property whose value is greater than MAX_VALUE (Issue #2387) + ## 2023.12 Version 3.29.0 General: diff --git a/src/table/entity/EdmDouble.ts b/src/table/entity/EdmDouble.ts index 3232fbb5e..6fd6efb40 100644 --- a/src/table/entity/EdmDouble.ts +++ b/src/table/entity/EdmDouble.ts @@ -12,6 +12,11 @@ export class EdmDouble implements IEdmType { // TODO: Support convert from string. parseFloat doesn't strictly checks non number chars const val = Number.parseFloat(value); if (!Number.isNaN(val)) { + // Test on both Product server and Azurite, they are aligned: "1.797693134862315e308" will pass validation, "1.797693134862316e308" will fail validation. + if (val === Number.POSITIVE_INFINITY || val === Number.NEGATIVE_INFINITY) + { + throw TypeError(`InvalidInput`); + } return val; } } diff --git a/tests/table/apis/table.entity.test.ts b/tests/table/apis/table.entity.test.ts index b0056166d..8b0c6081c 100644 --- a/tests/table/apis/table.entity.test.ts +++ b/tests/table/apis/table.entity.test.ts @@ -1726,4 +1726,68 @@ describe("table Entity APIs test - using Azure-Storage", () => { } ); }); + + + // For github issue 2387 + // Insert entity property with type "Edm.Double" and value bigger than MAX_VALUE, server will fail the request + it("38. Insert entity with Edm.Double type property whose value is bigger than MAX_VALUE, server will fail the request, @loki", (done) => { + // Double value bigger than MAX_VALUE will fail + const entity1 = { + PartitionKey: "partDouble", + RowKey: "utctestDouble", + myValue: "1.797693134862316e308", + "myValue@odata.type": "Edm.Double" + }; + + tableService.insertEntity( + tableName, + entity1, + (insertError, insertResult, insertResponse) => { + if (!insertError) { + assert.fail( + "Insert should fail with Edm.Double type property whose value is greater than MAX_VALUE."); + } else { + assert.strictEqual( + true, + insertError.message.startsWith( + "An error occurred while processing this request." + ) + ); + }; + assert.strictEqual("InvalidInput", (insertError as any).code); + } + ); + + // Double value smaller than MAX_VALUE will success + const entity2 = { + PartitionKey: "partDouble", + RowKey: "utctestDouble", + myValue: "1.797693134862315e308", + "myValue@odata.type": "Edm.Double" + }; + + tableService.insertEntity( + tableName, + entity2, + (insertError, insertResult, insertResponse) => { + if (!insertError) { + tableService.retrieveEntity( + tableName, + "partDouble", + "utctestDouble", + (error, result) => { + const insertedEntity: TestEntity = result; + assert.strictEqual( + insertedEntity.myValue._.toString(), + "1.797693134862315e+308" + ); + done(); + } + ); + } else { + assert.fail( + "Insert should NOT fail with Edm.Double type property whose value is less than MAX_VALUE."); + } + }); + }); }); From 630ea56043a6149564388b1dc374c329d65d4183 Mon Sep 17 00:00:00 2001 From: Wei Wei Date: Tue, 16 Apr 2024 14:53:39 +0800 Subject: [PATCH 281/297] Fixed issue of list container contains metadata even request doesn't have include=metadata (issue #2382) (#2389) * Fixed issue of list container contains metadata even request doesn't have include=metadata (issue #2382) * Fix a test issue --- ChangeLog.md | 1 + src/blob/handlers/ServiceHandler.ts | 15 +++++++++++++++ src/queue/handlers/ServiceHandler.ts | 2 +- tests/blob/apis/service.test.ts | 26 ++++++++++++++++++++++++++ 4 files changed, 43 insertions(+), 1 deletion(-) diff --git a/ChangeLog.md b/ChangeLog.md index 5fb166316..fd4aa0ce0 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -9,6 +9,7 @@ Blob: - Fixed issue of setting blob tag should not update Blob Etag and LastModified. (issue #2327) - Fix HTTP header parsing of `SubmitBatch()`. If a HTTP header has HTTP header delimiter (`:`) in its value, `SubmitBatch()` returns "400 One of the request inputs is not valid". For example, if `user-agent` header is `azsdk-cpp-storage-blobs/12.10.0-beta.1 (Darwin 23.1.0 arm64 Darwin Kernel Version 23.1.0: Mon Oct 9 21:28:12 PDT 2023; root:xnu-10002.41.9~6/RELEASE_ARM64_T8103)`, all `SubmitBatch()` requests are failed. - Fixed issue of blob copying succeed without 'r' permission in source blob's SAS token credential. +- Fixed issue of list container contains metadata even request doesn't have include=metadata (issue #2382) Table: diff --git a/src/blob/handlers/ServiceHandler.ts b/src/blob/handlers/ServiceHandler.ts index 7fedb096d..8a968f72e 100644 --- a/src/blob/handlers/ServiceHandler.ts +++ b/src/blob/handlers/ServiceHandler.ts @@ -319,6 +319,21 @@ export default class ServiceHandler extends BaseHandler marker ); + // Only the query parameter "include" contains the value "metadata" can the result present the metadata. + let includeMetadata = false; + if (options.include) { + for (const item of options.include) { + if (item.toLowerCase() === "metadata") { + includeMetadata = true; + break; + } + } + } + if (!includeMetadata) { + for (const container of containers[0]) { + container.metadata = undefined; + } + } // TODO: Need update list out container lease properties with ContainerHandler.updateLeaseAttributes() const serviceEndpoint = `${request.getEndpoint()}/${accountName}`; const res: Models.ServiceListContainersSegmentResponse = { diff --git a/src/queue/handlers/ServiceHandler.ts b/src/queue/handlers/ServiceHandler.ts index cd81ae2e2..ad754b6a8 100644 --- a/src/queue/handlers/ServiceHandler.ts +++ b/src/queue/handlers/ServiceHandler.ts @@ -235,7 +235,7 @@ export default class ServiceHandler extends BaseHandler let includeMetadata = false; if (options.include) { for (const item of options.include) { - if (item === "metadata") { + if (item.toLowerCase() === "metadata") { includeMetadata = true; break; } diff --git a/tests/blob/apis/service.test.ts b/tests/blob/apis/service.test.ts index faf7c6e1c..69402f633 100644 --- a/tests/blob/apis/service.test.ts +++ b/tests/blob/apis/service.test.ts @@ -411,6 +411,32 @@ describe("ServiceAPIs", () => { await containerClient1.delete(); await containerClient2.delete(); }); + + // fix issue 2382 + it("ListContainers without include metadata should not return contaienr metadata. @loki @sql", async () => { + const containerNamePrefix = getUniqueName("container"); + const containerName1 = `${containerNamePrefix}x1`; + const containerName2 = `${containerNamePrefix}x2`; + const containerClient1 = serviceClient.getContainerClient(containerName1); + const containerClient2 = serviceClient.getContainerClient(containerName2); + await containerClient1.create({ metadata: { key: "val" } }); + await containerClient2.create({ metadata: { key: "val" } }); + + const result1 = ( + await serviceClient + .listContainers({ + prefix: containerNamePrefix + }) + .byPage() + .next() + ).value; + + assert.equal(result1.containerItems!.length, 2); + assert.ok(result1.containerItems![0].name.startsWith(containerNamePrefix)); + assert.ok(result1.containerItems![1].name.startsWith(containerNamePrefix)); + assert.equal(result1.containerItems![0].metadata, undefined); + assert.equal(result1.containerItems![1].metadata, undefined); + }); it("get Account info @loki @sql", async () => { const result = await serviceClient.getAccountInfo(); From d98901e9231fe51abb3227c7e20c16dbfedd057d Mon Sep 17 00:00:00 2001 From: Will Stephen Date: Tue, 16 Apr 2024 07:55:02 +0100 Subject: [PATCH 282/297] Bump tedious version from 16.0.0 to 16.7.0 (#2364) Co-authored-by: Will Stephen --- package-lock.json | 412 ++++++++++++---------------------------------- package.json | 2 +- 2 files changed, 108 insertions(+), 306 deletions(-) diff --git a/package-lock.json b/package-lock.json index 47266fba9..b458a147f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -24,7 +24,7 @@ "rimraf": "^3.0.2", "sequelize": "^6.31.0", "stoppable": "^1.1.0", - "tedious": "^16.0.0", + "tedious": "^16.7.0", "to-readable-stream": "^2.1.0", "tslib": "^2.3.0", "uri-templates": "^0.2.0", @@ -294,15 +294,26 @@ } }, "node_modules/@azure/core-util": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@azure/core-util/-/core-util-1.3.2.tgz", - "integrity": "sha512-2bECOUh88RvL1pMZTcc6OzfobBeWDBf5oBbhjIhT1MV9otMVWCzpOJkkiKtrnO88y5GGBelgY8At73KGAdbkeQ==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@azure/core-util/-/core-util-1.7.0.tgz", + "integrity": "sha512-Zq2i3QO6k9DA8vnm29mYM4G8IE9u1mhF1GUabVEqPNX8Lj833gdxQ2NAFxt2BZsfAL+e9cT8SyVN7dFVJ/Hf0g==", "dependencies": { - "@azure/abort-controller": "^1.0.0", + "@azure/abort-controller": "^2.0.0", "tslib": "^2.2.0" }, "engines": { - "node": ">=14.0.0" + "node": ">=18.0.0" + } + }, + "node_modules/@azure/core-util/node_modules/@azure/abort-controller": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@azure/abort-controller/-/abort-controller-2.0.0.tgz", + "integrity": "sha512-RP/mR/WJchR+g+nQFJGOec+nzeN/VvjlwbinccoqfhTsTHbb8X5+mLDp48kHT0ueyum0BNSwGm0kX0UZuIqTGg==", + "dependencies": { + "tslib": "^2.2.0" + }, + "engines": { + "node": ">=18.0.0" } }, "node_modules/@azure/core-xml": { @@ -360,26 +371,35 @@ } }, "node_modules/@azure/identity": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@azure/identity/-/identity-2.0.4.tgz", - "integrity": "sha512-ZgFubAsmo7dji63NLPaot6O7pmDfceAUPY57uphSCr0hmRj+Cakqb4SUz5SohCHFtscrhcmejRU903Fowz6iXg==", + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/@azure/identity/-/identity-3.4.2.tgz", + "integrity": "sha512-0q5DL4uyR0EZ4RXQKD8MadGH6zTIcloUoS/RVbCpNpej4pwte0xpqYxk8K97Py2RiuUvI7F4GXpoT4046VfufA==", "dependencies": { "@azure/abort-controller": "^1.0.0", - "@azure/core-auth": "^1.3.0", + "@azure/core-auth": "^1.5.0", "@azure/core-client": "^1.4.0", "@azure/core-rest-pipeline": "^1.1.0", - "@azure/core-tracing": "1.0.0-preview.13", - "@azure/core-util": "^1.0.0-beta.1", + "@azure/core-tracing": "^1.0.0", + "@azure/core-util": "^1.6.1", "@azure/logger": "^1.0.0", - "@azure/msal-browser": "^2.16.0", - "@azure/msal-common": "^4.5.1", - "@azure/msal-node": "^1.3.0", + "@azure/msal-browser": "^3.5.0", + "@azure/msal-node": "^2.5.1", "events": "^3.0.0", "jws": "^4.0.0", "open": "^8.0.0", "stoppable": "^1.1.0", - "tslib": "^2.2.0", - "uuid": "^8.3.0" + "tslib": "^2.2.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@azure/identity/node_modules/@azure/core-tracing": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@azure/core-tracing/-/core-tracing-1.0.1.tgz", + "integrity": "sha512-I5CGMoLtX+pI17ZdiFJZgxMJApsK6jjfm85hpgp3oazCdq5Wxgh4wMr7ge/TTWW1B5WBuvIOI1fMU/FrOAMKrw==", + "dependencies": { + "tslib": "^2.2.0" }, "engines": { "node": ">=12.0.0" @@ -404,14 +424,6 @@ "safe-buffer": "^5.0.1" } }, - "node_modules/@azure/identity/node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "bin": { - "uuid": "dist/bin/uuid" - } - }, "node_modules/@azure/keyvault-keys": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/@azure/keyvault-keys/-/keyvault-keys-4.4.0.tgz", @@ -483,162 +495,35 @@ } }, "node_modules/@azure/msal-browser": { - "version": "2.22.1", - "resolved": "https://registry.npmjs.org/@azure/msal-browser/-/msal-browser-2.22.1.tgz", - "integrity": "sha512-VYvdSHnOen1CDok01OhfQ2qNxsrY10WAKe6c2reIuwqqDDOkWwq1IDkieGHpDRjj4kGdPZ/dle4d7SlvNi9EJQ==", - "dependencies": { - "@azure/msal-common": "^6.1.0" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@azure/msal-browser/node_modules/@azure/msal-common": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-6.1.0.tgz", - "integrity": "sha512-IGjAHttOgKDPQr0Qxx1NjABR635ZNuN7LHjxI0Y7SEA2thcaRGTccy+oaXTFabM/rZLt4F2VrPKUX4BnR9hW9g==", + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/@azure/msal-browser/-/msal-browser-3.9.0.tgz", + "integrity": "sha512-Ts+Q3fw9u92koCkk+oZgL6lhwDrwWSyXBcKdsKJko1Ra7ZzDl0z7pod+1g+v4Qbt8l1YqSX4wXbXs5sWUv0VWw==", "dependencies": { - "debug": "^4.1.1" + "@azure/msal-common": "14.7.0" }, "engines": { "node": ">=0.8.0" } }, - "node_modules/@azure/msal-browser/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/@azure/msal-browser/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, "node_modules/@azure/msal-common": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-4.5.1.tgz", - "integrity": "sha512-/i5dXM+QAtO+6atYd5oHGBAx48EGSISkXNXViheliOQe+SIFMDo3gSq3lL54W0suOSAsVPws3XnTaIHlla0PIQ==", - "dependencies": { - "debug": "^4.1.1" - }, + "version": "14.7.0", + "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-14.7.0.tgz", + "integrity": "sha512-WexujW5jKWib7xtIxR7fEVyd5xcA3FNwenELy2HO4YC/ivTFdsEcDhtpKQuRUHqXRwxoqBblyZzTAhBm4v6fHA==", "engines": { "node": ">=0.8.0" } }, - "node_modules/@azure/msal-common/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/@azure/msal-common/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, "node_modules/@azure/msal-node": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@azure/msal-node/-/msal-node-1.7.0.tgz", - "integrity": "sha512-qDkW+Z4b0SGkkYrM1x+0s5WJ3z96vgiNZ20iwpmtCUHVfSrDiGFB8s8REKVaz7JZJi2L1s0vQRbUahly8EoGnw==", + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/@azure/msal-node/-/msal-node-2.6.3.tgz", + "integrity": "sha512-ojjJqUwb297T5Tcln4PbJANFEqRXfbQXcyOrtdr1HQYIo+dSuCT/o0nG6bFVihf6fcNykDwJLCQPVXzTkx/oGg==", "dependencies": { - "@azure/msal-common": "^6.1.0", - "axios": "^0.21.4", - "https-proxy-agent": "^5.0.0", - "jsonwebtoken": "^8.5.1", + "@azure/msal-common": "14.7.0", + "jsonwebtoken": "^9.0.0", "uuid": "^8.3.0" }, "engines": { - "node": "10 || 12 || 14 || 16" - } - }, - "node_modules/@azure/msal-node/node_modules/@azure/msal-common": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-6.1.0.tgz", - "integrity": "sha512-IGjAHttOgKDPQr0Qxx1NjABR635ZNuN7LHjxI0Y7SEA2thcaRGTccy+oaXTFabM/rZLt4F2VrPKUX4BnR9hW9g==", - "dependencies": { - "debug": "^4.1.1" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@azure/msal-node/node_modules/axios": { - "version": "0.21.4", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", - "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==", - "dependencies": { - "follow-redirects": "^1.14.0" - } - }, - "node_modules/@azure/msal-node/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/@azure/msal-node/node_modules/jsonwebtoken": { - "version": "8.5.1", - "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz", - "integrity": "sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w==", - "dependencies": { - "jws": "^3.2.2", - "lodash.includes": "^4.3.0", - "lodash.isboolean": "^3.0.3", - "lodash.isinteger": "^4.0.4", - "lodash.isnumber": "^3.0.3", - "lodash.isplainobject": "^4.0.6", - "lodash.isstring": "^4.0.1", - "lodash.once": "^4.0.0", - "ms": "^2.1.1", - "semver": "^5.6.0" - }, - "engines": { - "node": ">=4", - "npm": ">=1.4.28" - } - }, - "node_modules/@azure/msal-node/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "node_modules/@azure/msal-node/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "bin": { - "semver": "bin/semver" + "node": ">=16" } }, "node_modules/@azure/msal-node/node_modules/uuid": { @@ -7704,9 +7589,9 @@ } }, "node_modules/open": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/open/-/open-8.4.0.tgz", - "integrity": "sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==", + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", + "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", "dependencies": { "define-lazy-prop": "^2.0.0", "is-docker": "^2.1.1", @@ -9482,11 +9367,11 @@ } }, "node_modules/tedious": { - "version": "16.6.0", - "resolved": "https://registry.npmjs.org/tedious/-/tedious-16.6.0.tgz", - "integrity": "sha512-Gsi/XzWtJ+oyYsoDHSxjV5k/LzZb/3pJseC1NJoCkQ1VJF66rxj7pRLDF6jOFL4F52uSqOhtYTucs3K1sKYB7g==", + "version": "16.7.0", + "resolved": "https://registry.npmjs.org/tedious/-/tedious-16.7.0.tgz", + "integrity": "sha512-AwZeknjoPSg1z4sDkZYIpNUzqq3/GrPRWxoJEY0yL2RJbbIViD+AURnC+apbNpUza7sOUONagO1FQf74en8gxw==", "dependencies": { - "@azure/identity": "^2.0.4", + "@azure/identity": "^3.4.1", "@azure/keyvault-keys": "^4.4.0", "@js-joda/core": "^5.5.3", "bl": "^6.0.3", @@ -10505,12 +10390,22 @@ } }, "@azure/core-util": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@azure/core-util/-/core-util-1.3.2.tgz", - "integrity": "sha512-2bECOUh88RvL1pMZTcc6OzfobBeWDBf5oBbhjIhT1MV9otMVWCzpOJkkiKtrnO88y5GGBelgY8At73KGAdbkeQ==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@azure/core-util/-/core-util-1.7.0.tgz", + "integrity": "sha512-Zq2i3QO6k9DA8vnm29mYM4G8IE9u1mhF1GUabVEqPNX8Lj833gdxQ2NAFxt2BZsfAL+e9cT8SyVN7dFVJ/Hf0g==", "requires": { - "@azure/abort-controller": "^1.0.0", + "@azure/abort-controller": "^2.0.0", "tslib": "^2.2.0" + }, + "dependencies": { + "@azure/abort-controller": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@azure/abort-controller/-/abort-controller-2.0.0.tgz", + "integrity": "sha512-RP/mR/WJchR+g+nQFJGOec+nzeN/VvjlwbinccoqfhTsTHbb8X5+mLDp48kHT0ueyum0BNSwGm0kX0UZuIqTGg==", + "requires": { + "tslib": "^2.2.0" + } + } } }, "@azure/core-xml": { @@ -10558,28 +10453,34 @@ } }, "@azure/identity": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@azure/identity/-/identity-2.0.4.tgz", - "integrity": "sha512-ZgFubAsmo7dji63NLPaot6O7pmDfceAUPY57uphSCr0hmRj+Cakqb4SUz5SohCHFtscrhcmejRU903Fowz6iXg==", + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/@azure/identity/-/identity-3.4.2.tgz", + "integrity": "sha512-0q5DL4uyR0EZ4RXQKD8MadGH6zTIcloUoS/RVbCpNpej4pwte0xpqYxk8K97Py2RiuUvI7F4GXpoT4046VfufA==", "requires": { "@azure/abort-controller": "^1.0.0", - "@azure/core-auth": "^1.3.0", + "@azure/core-auth": "^1.5.0", "@azure/core-client": "^1.4.0", "@azure/core-rest-pipeline": "^1.1.0", - "@azure/core-tracing": "1.0.0-preview.13", - "@azure/core-util": "^1.0.0-beta.1", + "@azure/core-tracing": "^1.0.0", + "@azure/core-util": "^1.6.1", "@azure/logger": "^1.0.0", - "@azure/msal-browser": "^2.16.0", - "@azure/msal-common": "^4.5.1", - "@azure/msal-node": "^1.3.0", + "@azure/msal-browser": "^3.5.0", + "@azure/msal-node": "^2.5.1", "events": "^3.0.0", "jws": "^4.0.0", "open": "^8.0.0", "stoppable": "^1.1.0", - "tslib": "^2.2.0", - "uuid": "^8.3.0" + "tslib": "^2.2.0" }, "dependencies": { + "@azure/core-tracing": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@azure/core-tracing/-/core-tracing-1.0.1.tgz", + "integrity": "sha512-I5CGMoLtX+pI17ZdiFJZgxMJApsK6jjfm85hpgp3oazCdq5Wxgh4wMr7ge/TTWW1B5WBuvIOI1fMU/FrOAMKrw==", + "requires": { + "tslib": "^2.2.0" + } + }, "jwa": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.0.tgz", @@ -10598,11 +10499,6 @@ "jwa": "^2.0.0", "safe-buffer": "^5.0.1" } - }, - "uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" } } }, @@ -10675,122 +10571,28 @@ } }, "@azure/msal-browser": { - "version": "2.22.1", - "resolved": "https://registry.npmjs.org/@azure/msal-browser/-/msal-browser-2.22.1.tgz", - "integrity": "sha512-VYvdSHnOen1CDok01OhfQ2qNxsrY10WAKe6c2reIuwqqDDOkWwq1IDkieGHpDRjj4kGdPZ/dle4d7SlvNi9EJQ==", + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/@azure/msal-browser/-/msal-browser-3.9.0.tgz", + "integrity": "sha512-Ts+Q3fw9u92koCkk+oZgL6lhwDrwWSyXBcKdsKJko1Ra7ZzDl0z7pod+1g+v4Qbt8l1YqSX4wXbXs5sWUv0VWw==", "requires": { - "@azure/msal-common": "^6.1.0" - }, - "dependencies": { - "@azure/msal-common": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-6.1.0.tgz", - "integrity": "sha512-IGjAHttOgKDPQr0Qxx1NjABR635ZNuN7LHjxI0Y7SEA2thcaRGTccy+oaXTFabM/rZLt4F2VrPKUX4BnR9hW9g==", - "requires": { - "debug": "^4.1.1" - } - }, - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - } + "@azure/msal-common": "14.7.0" } }, "@azure/msal-common": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-4.5.1.tgz", - "integrity": "sha512-/i5dXM+QAtO+6atYd5oHGBAx48EGSISkXNXViheliOQe+SIFMDo3gSq3lL54W0suOSAsVPws3XnTaIHlla0PIQ==", - "requires": { - "debug": "^4.1.1" - }, - "dependencies": { - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - } - } + "version": "14.7.0", + "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-14.7.0.tgz", + "integrity": "sha512-WexujW5jKWib7xtIxR7fEVyd5xcA3FNwenELy2HO4YC/ivTFdsEcDhtpKQuRUHqXRwxoqBblyZzTAhBm4v6fHA==" }, "@azure/msal-node": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@azure/msal-node/-/msal-node-1.7.0.tgz", - "integrity": "sha512-qDkW+Z4b0SGkkYrM1x+0s5WJ3z96vgiNZ20iwpmtCUHVfSrDiGFB8s8REKVaz7JZJi2L1s0vQRbUahly8EoGnw==", + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/@azure/msal-node/-/msal-node-2.6.3.tgz", + "integrity": "sha512-ojjJqUwb297T5Tcln4PbJANFEqRXfbQXcyOrtdr1HQYIo+dSuCT/o0nG6bFVihf6fcNykDwJLCQPVXzTkx/oGg==", "requires": { - "@azure/msal-common": "^6.1.0", - "axios": "^0.21.4", - "https-proxy-agent": "^5.0.0", - "jsonwebtoken": "^8.5.1", + "@azure/msal-common": "14.7.0", + "jsonwebtoken": "^9.0.0", "uuid": "^8.3.0" }, "dependencies": { - "@azure/msal-common": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-6.1.0.tgz", - "integrity": "sha512-IGjAHttOgKDPQr0Qxx1NjABR635ZNuN7LHjxI0Y7SEA2thcaRGTccy+oaXTFabM/rZLt4F2VrPKUX4BnR9hW9g==", - "requires": { - "debug": "^4.1.1" - } - }, - "axios": { - "version": "0.21.4", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", - "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==", - "requires": { - "follow-redirects": "^1.14.0" - } - }, - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "requires": { - "ms": "2.1.2" - } - }, - "jsonwebtoken": { - "version": "8.5.1", - "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz", - "integrity": "sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w==", - "requires": { - "jws": "^3.2.2", - "lodash.includes": "^4.3.0", - "lodash.isboolean": "^3.0.3", - "lodash.isinteger": "^4.0.4", - "lodash.isnumber": "^3.0.3", - "lodash.isplainobject": "^4.0.6", - "lodash.isstring": "^4.0.1", - "lodash.once": "^4.0.0", - "ms": "^2.1.1", - "semver": "^5.6.0" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" - }, "uuid": { "version": "8.3.2", "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", @@ -16262,9 +16064,9 @@ } }, "open": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/open/-/open-8.4.0.tgz", - "integrity": "sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==", + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", + "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", "requires": { "define-lazy-prop": "^2.0.0", "is-docker": "^2.1.1", @@ -17541,11 +17343,11 @@ } }, "tedious": { - "version": "16.6.0", - "resolved": "https://registry.npmjs.org/tedious/-/tedious-16.6.0.tgz", - "integrity": "sha512-Gsi/XzWtJ+oyYsoDHSxjV5k/LzZb/3pJseC1NJoCkQ1VJF66rxj7pRLDF6jOFL4F52uSqOhtYTucs3K1sKYB7g==", + "version": "16.7.0", + "resolved": "https://registry.npmjs.org/tedious/-/tedious-16.7.0.tgz", + "integrity": "sha512-AwZeknjoPSg1z4sDkZYIpNUzqq3/GrPRWxoJEY0yL2RJbbIViD+AURnC+apbNpUza7sOUONagO1FQf74en8gxw==", "requires": { - "@azure/identity": "^2.0.4", + "@azure/identity": "^3.4.1", "@azure/keyvault-keys": "^4.4.0", "@js-joda/core": "^5.5.3", "bl": "^6.0.3", diff --git a/package.json b/package.json index be999929d..15e2c1ce5 100644 --- a/package.json +++ b/package.json @@ -35,7 +35,7 @@ "rimraf": "^3.0.2", "sequelize": "^6.31.0", "stoppable": "^1.1.0", - "tedious": "^16.0.0", + "tedious": "^16.7.0", "to-readable-stream": "^2.1.0", "tslib": "^2.3.0", "uri-templates": "^0.2.0", From fcfaba53d46115e66b1c4637b9d42e2a7976bdb7 Mon Sep 17 00:00:00 2001 From: EmmaZhu-MSFT Date: Tue, 23 Apr 2024 18:49:01 -0700 Subject: [PATCH 283/297] Fix issue of returning incorrect entities when querying table with int64 values (#2386) --- ChangeLog.md | 4 + .../QueryNodes/BigNumberNode.ts | 95 ++++++++++++++++ .../QueryInterpreter/QueryParser.ts | 3 +- tests/table/apis/table.entity.query.test.ts | 103 ++++++++++++++++++ tests/table/unit/query.parser.unit.test.ts | 4 +- tsconfig.json | 21 +++- 6 files changed, 222 insertions(+), 8 deletions(-) create mode 100644 src/table/persistence/QueryInterpreter/QueryNodes/BigNumberNode.ts diff --git a/ChangeLog.md b/ChangeLog.md index fd4aa0ce0..fc4d64aec 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -15,6 +15,10 @@ Table: - Fail the insert entity request with double property whose value is greater than MAX_VALUE (Issue #2387) +Table: + +- Fixed issue of returning incorrect entities when querying table with int64 values. (issue #2385) + ## 2023.12 Version 3.29.0 General: diff --git a/src/table/persistence/QueryInterpreter/QueryNodes/BigNumberNode.ts b/src/table/persistence/QueryInterpreter/QueryNodes/BigNumberNode.ts new file mode 100644 index 000000000..d70837c5b --- /dev/null +++ b/src/table/persistence/QueryInterpreter/QueryNodes/BigNumberNode.ts @@ -0,0 +1,95 @@ +import { IQueryContext } from "../IQueryContext"; +import IQueryNode from "./IQueryNode"; +import ValueNode from "./ValueNode"; + +/** + * Represents a constant value which is stored in its underlying JavaScript representation. + * + * This is used to hold boolean, number, and string values that are provided in the query. + * For example, the query `PartitionKey eq 'foo'` would contain a `ConstantNode` with the value `foo`. + */ +export default class BigNumberNode extends ValueNode { + get name(): string { + return "BigNumber"; + } + + compare(context: IQueryContext, other: IQueryNode): number { + const thisValue = this.evaluate(context) as string; + const otherValue = other.evaluate(context) as string; + + if (thisValue === undefined || otherValue === undefined || otherValue === null) { + return NaN; + } + + if (thisValue.startsWith("-")) { + // Compare two negative number + if (otherValue.startsWith("-")) { + return -(this.comparePositiveNumber(thisValue.substring(1), otherValue.substring(1))); + } + else { + // Could be two 0s formated with -000 and 000 + if (this.trimZeros(thisValue.substring(1)).length === 0 + && this.trimZeros(otherValue).length === 0) { + return 0; + } + else { + return -1; + } + } + } + else { + // Could be two 0s formated with -000 and 000 + if (otherValue.startsWith("-")) { + if (this.trimZeros(thisValue.substring(1)).length === 0 + && this.trimZeros(otherValue).length === 0) { + return 0; + } + else { + return 1; + } + } + else { + return this.comparePositiveNumber(thisValue, otherValue); + } + } + } + + comparePositiveNumber(thisValue: string, otherValue: string): number { + const thisNumberValue = this.trimZeros(thisValue); + const otherNumberValue = this.trimZeros(otherValue); + + if (thisNumberValue.length < otherNumberValue.length) { + return -1 + } + else if (thisNumberValue.length > otherNumberValue.length) { + return 1; + } + + let index = 0; + while (index < thisNumberValue.length) { + if (thisNumberValue[index] < otherNumberValue[index]) { + return -1; + } + else if (thisNumberValue[index] > otherNumberValue[index]) { + return 1; + } + ++index + } + + return 0; + } + + trimZeros(numberString: string): string { + let index = 0; + while (index < numberString.length) { + if (numberString[index] === '0') { + ++index; + } + else { + break; + } + } + + return numberString.substring(index); + } +} \ No newline at end of file diff --git a/src/table/persistence/QueryInterpreter/QueryParser.ts b/src/table/persistence/QueryInterpreter/QueryParser.ts index d2e71e1ef..ae0e983ae 100644 --- a/src/table/persistence/QueryInterpreter/QueryParser.ts +++ b/src/table/persistence/QueryInterpreter/QueryParser.ts @@ -1,5 +1,6 @@ import { QueryLexer, QueryTokenKind } from "./QueryLexer"; import AndNode from "./QueryNodes/AndNode"; +import BigNumberNode from "./QueryNodes/BigNumberNode"; import BinaryDataNode from "./QueryNodes/BinaryDataNode"; import ConstantNode from "./QueryNodes/ConstantNode"; import DateTimeNode from "./QueryNodes/DateTimeNode"; @@ -246,7 +247,7 @@ class QueryParser { if (token.value!.endsWith("L")) { // This is a "long" number, which should be represented by its string equivalent - return new ConstantNode(token.value!.substring(0, token.value!.length - 1)); + return new BigNumberNode(token.value!.substring(0, token.value!.length - 1)); } else { return new ConstantNode(parseFloat(token.value!)); } diff --git a/tests/table/apis/table.entity.query.test.ts b/tests/table/apis/table.entity.query.test.ts index e89ec2c9b..9b9936e93 100644 --- a/tests/table/apis/table.entity.query.test.ts +++ b/tests/table/apis/table.entity.query.test.ts @@ -1397,4 +1397,107 @@ describe("table Entity APIs test - using Azure/data-tables", () => { await tableClient.deleteTable(); }); + + it("23. should find the correct long int, @loki", async () => { + const tableClient = createAzureDataTablesClient( + testLocalAzuriteInstance, + getUniqueName("longint") + ); + const partitionKey = createUniquePartitionKey(""); + const testEntity: TableTestEntity = + entityFactory.createBasicEntityForTest(partitionKey); + + await tableClient.createTable({ requestOptions: { timeout: 60000 } }); + let result = await tableClient.createEntity(testEntity); + + const anotherPartitionKey = createUniquePartitionKey(""); + const anotherEntity: TableTestEntity = + entityFactory.createBasicEntityForTest(anotherPartitionKey); + anotherEntity.int64Field = { value: "1234", type: "Int64" }; + + result = await tableClient.createEntity(anotherEntity); + assert.ok(result.etag); + + for await (const entity of tableClient + .listEntities({ + queryOptions: { + filter: `int64Field gt 1233L and int64Field lt 1235L` + } + })) { + assert.deepStrictEqual(entity.int64Field, 1234n); + } + + await tableClient.deleteTable(); + }); + + it("24. should find the correct negative long int, @loki", async () => { + const tableClient = createAzureDataTablesClient( + testLocalAzuriteInstance, + getUniqueName("longint") + ); + const partitionKey = createUniquePartitionKey(""); + const testEntity: TableTestEntity = + entityFactory.createBasicEntityForTest(partitionKey); + testEntity.int64Field = { value: "-12345", type: "Int64" }; + + await tableClient.createTable({ requestOptions: { timeout: 60000 } }); + let result = await tableClient.createEntity(testEntity); + + const anotherPartitionKey = createUniquePartitionKey(""); + const anotherEntity: TableTestEntity = + entityFactory.createBasicEntityForTest(anotherPartitionKey); + anotherEntity.int64Field = { value: "-1234", type: "Int64" }; + + result = await tableClient.createEntity(anotherEntity); + assert.ok(result.etag); + + for await (const entity of tableClient + .listEntities({ + queryOptions: { + filter: `int64Field lt -1233L and int64Field gt -1235L` + } + })) { + assert.deepStrictEqual(entity.int64Field, -1234n); + } + + await tableClient.deleteTable(); + }); + + it("25. should find the correct negative long int, @loki", async () => { + const tableClient = createAzureDataTablesClient( + testLocalAzuriteInstance, + getUniqueName("longint") + ); + const partitionKey = createUniquePartitionKey(""); + const testEntity: TableTestEntity = + entityFactory.createBasicEntityForTest(partitionKey); + testEntity.int64Field = { value: "12345", type: "Int64" }; + + await tableClient.createTable({ requestOptions: { timeout: 60000 } }); + let result = await tableClient.createEntity(testEntity); + + const anotherPartitionKey = createUniquePartitionKey(""); + const anotherEntity: TableTestEntity = + entityFactory.createBasicEntityForTest(anotherPartitionKey); + anotherEntity.int64Field = { value: "-1234", type: "Int64" }; + + result = await tableClient.createEntity(anotherEntity); + assert.ok(result.etag); + + let count = 0; + + for await (const entity of tableClient + .listEntities({ + queryOptions: { + filter: `int64Field gt -1235L` + } + })) { + entity; + ++count; + } + + assert.deepStrictEqual(count, 2); + + await tableClient.deleteTable(); + }); }); diff --git a/tests/table/unit/query.parser.unit.test.ts b/tests/table/unit/query.parser.unit.test.ts index f7f8c900d..803a5e915 100644 --- a/tests/table/unit/query.parser.unit.test.ts +++ b/tests/table/unit/query.parser.unit.test.ts @@ -260,12 +260,12 @@ describe("Query Parser", () => { { name: "Correctly handles longs", originalQuery: "myInt lt 123.01L", - expectedQuery: "(lt (id myInt) \"123.01\")" + expectedQuery: "(lt (id myInt) (BigNumber 123.01))" }, { name: "Correctly handles longs with a negative sign", originalQuery: "myInt gt -123.01L", - expectedQuery: "(gt (id myInt) \"-123.01\")" + expectedQuery: "(gt (id myInt) (BigNumber -123.01))" } ]) diff --git a/tsconfig.json b/tsconfig.json index 42a2e39db..a6034e671 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -5,7 +5,7 @@ "preserveConstEnums": true, "sourceMap": true, "newLine": "LF", - "target": "es2017", + "target": "ES2020", "moduleResolution": "node", "noUnusedLocals": true, "noUnusedParameters": false, @@ -16,13 +16,24 @@ "declarationMap": true, "importHelpers": true, "declarationDir": "./typings", - "lib": ["es5", "es6", "es7", "esnext", "dom"], + "lib": [ + "es5", + "es6", + "es7", + "esnext", + "dom" + ], "esModuleInterop": true, "downlevelIteration": true, "useUnknownInCatchVariables": false, "skipLibCheck": true, }, "compileOnSave": true, - "exclude": ["node_modules"], - "include": ["./src/**/*.ts", "./tests/**/*.ts"] -} + "exclude": [ + "node_modules" + ], + "include": [ + "./src/**/*.ts", + "./tests/**/*.ts" + ] +} \ No newline at end of file From 2bb552e703772b9a57ca713ef271c3c7c624a535 Mon Sep 17 00:00:00 2001 From: EmmaZhu-MSFT Date: Tue, 23 Apr 2024 22:43:37 -0700 Subject: [PATCH 284/297] Bump API version to 2024-05-04 and package version to 3.30.0 (#2390) --- ChangeLog.md | 7 +++++++ README.md | 14 +++++++------- package-lock.json | 6 +++--- package.json | 2 +- src/blob/utils/constants.ts | 5 +++-- src/queue/utils/constants.ts | 5 +++-- src/table/utils/constants.ts | 5 +++-- 7 files changed, 27 insertions(+), 17 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index fc4d64aec..1fcaab053 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -4,6 +4,13 @@ ## Upcoming Release +## 2024.04 Version 3.30.0 + +General: + +- Bump up service API version to 2024-05-04 +- Fixed issue of failure when connecting to mssql with docker image or exe. + Blob: - Fixed issue of setting blob tag should not update Blob Etag and LastModified. (issue #2327) diff --git a/README.md b/README.md index 207cfc8e6..f650d9624 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,7 @@ | Version | Azure Storage API Version | Service Support | Description | Reference Links | | ------------------------------------------------------------------ | ------------------------- | ------------------------------ | ------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| 3.29.0 | 2024-02-04 | Blob, Queue and Table(preview) | Azurite V3 based on TypeScript & New Architecture | [NPM](https://www.npmjs.com/package/azurite) - [Docker](https://hub.docker.com/_/microsoft-azure-storage-azurite) - [Visual Studio Code Extension](https://marketplace.visualstudio.com/items?itemName=Azurite.azurite) | +| 3.30.0 | 2024-05-04 | Blob, Queue and Table(preview) | Azurite V3 based on TypeScript & New Architecture | [NPM](https://www.npmjs.com/package/azurite) - [Docker](https://hub.docker.com/_/microsoft-azure-storage-azurite) - [Visual Studio Code Extension](https://marketplace.visualstudio.com/items?itemName=Azurite.azurite) | | [Legacy (v2)](https://github.com/Azure/Azurite/tree/legacy-master) | 2016-05-31 | Blob, Queue and Table | Legacy Azurite V2 | [NPM](https://www.npmjs.com/package/azurite) | - [Azurite V3](#azurite-v3) @@ -78,19 +78,19 @@ Compared to V2, Azurite V3 implements a new architecture leveraging code generat ## Features & Key Changes in Azurite V3 -- Blob storage features align with Azure Storage API version 2024-02-04 (Refer to support matrix section below) +- Blob storage features align with Azure Storage API version 2024-05-04 (Refer to support matrix section below) - SharedKey/Account SAS/Service SAS/Public Access Authentications/OAuth - Get/Set Blob Service Properties - Create/List/Delete Containers - Create/Read/List/Update/Delete Block Blobs - Create/Read/List/Update/Delete Page Blobs -- Queue storage features align with Azure Storage API version 2024-02-04 (Refer to support matrix section below) +- Queue storage features align with Azure Storage API version 2024-05-04 (Refer to support matrix section below) - SharedKey/Account SAS/Service SAS/OAuth - Get/Set Queue Service Properties - Preflight Request - Create/List/Delete Queues - Put/Get/Peek/Updata/Deleta/Clear Messages -- Table storage features align with Azure Storage API version 2024-02-04 (Refer to support matrix section below) +- Table storage features align with Azure Storage API version 2024-05-04 (Refer to support matrix section below) - SharedKey/Account SAS/Service SAS/OAuth - Create/List/Delete Tables - Insert/Update/Query/Delete Table Entities @@ -971,7 +971,7 @@ All the generated code is kept in `generated` folder, including the generated mi ## Support Matrix -Latest release targets **2024-02-04** API version **blob** service. +Latest release targets **2024-05-04** API version **blob** service. Detailed support matrix: @@ -1030,7 +1030,7 @@ Detailed support matrix: - Encryption Scope - Get Page Ranges Continuation Token -Latest version supports for **2024-02-04** API version **queue** service. +Latest version supports for **2024-05-04** API version **queue** service. Detailed support matrix: - Supported Vertical Features @@ -1059,7 +1059,7 @@ Detailed support matrix: - Following features or REST APIs are NOT supported or limited supported in this release (will support more features per customers feedback in future releases) - SharedKey Lite -Latest version supports for **2024-02-04** API version **table** service (preview). +Latest version supports for **2024-05-04** API version **table** service (preview). Detailed support matrix: - Supported Vertical Features diff --git a/package-lock.json b/package-lock.json index b458a147f..9347b9438 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "azurite", - "version": "3.29.0", + "version": "3.30.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "azurite", - "version": "3.29.0", + "version": "3.30.0", "license": "MIT", "dependencies": { "@azure/ms-rest-js": "^1.5.0", @@ -17992,4 +17992,4 @@ "dev": true } } -} +} \ No newline at end of file diff --git a/package.json b/package.json index 15e2c1ce5..20cf3c65c 100644 --- a/package.json +++ b/package.json @@ -3,7 +3,7 @@ "displayName": "Azurite", "description": "An open source Azure Storage API compatible server", "icon": "icon.png", - "version": "3.29.0", + "version": "3.30.0", "publisher": "Azurite", "categories": [ "Other" diff --git a/src/blob/utils/constants.ts b/src/blob/utils/constants.ts index 4a324b8fa..4b8c64cb6 100644 --- a/src/blob/utils/constants.ts +++ b/src/blob/utils/constants.ts @@ -1,8 +1,8 @@ import { StoreDestinationArray } from "../../common/persistence/IExtentStore"; import * as Models from "../generated/artifacts/models"; -export const VERSION = "3.29.0"; -export const BLOB_API_VERSION = "2024-02-04"; +export const VERSION = "3.30.0"; +export const BLOB_API_VERSION = "2024-05-04"; export const DEFAULT_BLOB_SERVER_HOST_NAME = "127.0.0.1"; // Change to 0.0.0.0 when needs external access export const DEFAULT_LIST_BLOBS_MAX_RESULTS = 5000; export const DEFAULT_LIST_CONTAINERS_MAX_RESULTS = 5000; @@ -97,6 +97,7 @@ export const DEFAULT_BLOB_PERSISTENCE_ARRAY: StoreDestinationArray = [ ]; export const ValidAPIVersions = [ + "2024-05-04", "2024-02-04", "2023-11-03", "2023-08-03", diff --git a/src/queue/utils/constants.ts b/src/queue/utils/constants.ts index 15ebe24bc..427870538 100644 --- a/src/queue/utils/constants.ts +++ b/src/queue/utils/constants.ts @@ -1,7 +1,7 @@ import { StoreDestinationArray } from "../../common/persistence/IExtentStore"; -export const VERSION = "3.29.0"; -export const QUEUE_API_VERSION = "2024-02-04"; +export const VERSION = "3.30.0"; +export const QUEUE_API_VERSION = "2024-05-04"; export const DEFAULT_QUEUE_SERVER_HOST_NAME = "127.0.0.1"; // Change to 0.0.0.0 when needs external access export const DEFAULT_QUEUE_LISTENING_PORT = 10001; export const IS_PRODUCTION = process.env.NODE_ENV === "production"; @@ -90,6 +90,7 @@ export const DEFAULT_QUEUE_PERSISTENCE_ARRAY: StoreDestinationArray = [ ]; export const ValidAPIVersions = [ + "2024-05-04", "2024-02-04", "2023-11-03", "2023-08-03", diff --git a/src/table/utils/constants.ts b/src/table/utils/constants.ts index 9cbd2abeb..a2dbf75ba 100644 --- a/src/table/utils/constants.ts +++ b/src/table/utils/constants.ts @@ -17,8 +17,8 @@ export enum TABLE_STATUSCODE { } export const DEFAULT_TABLE_CONTEXT_PATH = "azurite_table_context"; -export const TABLE_API_VERSION = "2024-02-04"; -export const VERSION = "3.29.0"; +export const TABLE_API_VERSION = "2024-05-04"; +export const VERSION = "3.30.0"; // Max Body size is 4 MB export const BODY_SIZE_MAX = 1024 * 1024 * 4; // Max Entity sizxe is 1 MB @@ -73,6 +73,7 @@ export const DEFAULT_TABLE_PERSISTENCE_ARRAY: StoreDestinationArray = [ export const QUERY_RESULT_MAX_NUM = 1000; export const ValidAPIVersions = [ + "2024-05-04", "2024-02-04", "2023-11-03", "2023-08-03", From e53428818dc418372a6885ad9c5fe8789c1061e3 Mon Sep 17 00:00:00 2001 From: David Gardiner Date: Tue, 11 Jun 2024 16:24:14 +0930 Subject: [PATCH 285/297] Fix a few typos (#2411) Fix some spelling/typos in README --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index f650d9624..1a622780b 100644 --- a/README.md +++ b/README.md @@ -89,7 +89,7 @@ Compared to V2, Azurite V3 implements a new architecture leveraging code generat - Get/Set Queue Service Properties - Preflight Request - Create/List/Delete Queues - - Put/Get/Peek/Updata/Deleta/Clear Messages + - Put/Get/Peek/Update/Delete/Clear Messages - Table storage features align with Azure Storage API version 2024-05-04 (Refer to support matrix section below) - SharedKey/Account SAS/Service SAS/OAuth - Create/List/Delete Tables @@ -261,7 +261,7 @@ Above command will try to start Azurite image with configurations: `--disableProductStyleUrl` force parsing storage account name from request Uri path, instead of from request Uri host. -> If you use customized azurite paramters for docker image, `--blobHost 0.0.0.0`, `--queueHost 0.0.0.0` are required parameters. +> If you use customized azurite parameters for docker image, `--blobHost 0.0.0.0`, `--queueHost 0.0.0.0` are required parameters. > In above sample, you need to use **double first forward slash** for location and debug path parameters to avoid a [known issue](https://stackoverflow.com/questions/48427366/docker-build-command-add-c-program-files-git-to-the-path-passed-as-build-argu) for Git on Windows. From cfe74761a58017199931e8ccf4d884a1bbbd521d Mon Sep 17 00:00:00 2001 From: EmmaZhu-MSFT Date: Mon, 17 Jun 2024 20:52:04 -0700 Subject: [PATCH 286/297] Fix issue of not refreshing lease state within blockBlob.upload operation. (#2354) * Fix issue of not refreshing lease state within blockBlob.upload operation. * Add change log --- ChangeLog.md | 4 +++ src/blob/persistence/LokiBlobMetadataStore.ts | 28 ++++++++------- src/blob/persistence/SqlBlobMetadataStore.ts | 34 +++++++++---------- tests/blob/apis/appendblob.test.ts | 25 ++++++++++++-- tests/blob/apis/blockblob.test.ts | 25 +++++++++++++- 5 files changed, 83 insertions(+), 33 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index 1fcaab053..4c04286e0 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -4,6 +4,10 @@ ## Upcoming Release +Blob: + +- Fix issue of not refreshing lease state within block blob/append blob upload operation. (issue #2352) + ## 2024.04 Version 3.30.0 General: diff --git a/src/blob/persistence/LokiBlobMetadataStore.ts b/src/blob/persistence/LokiBlobMetadataStore.ts index bae54c07e..964ea8485 100644 --- a/src/blob/persistence/LokiBlobMetadataStore.ts +++ b/src/blob/persistence/LokiBlobMetadataStore.ts @@ -326,9 +326,9 @@ export default class LokiBlobMetadataStore prefix === "" ? { name: { $gt: marker }, accountName: account } : { - name: { $regex: `^${this.escapeRegex(prefix)}`, $gt: marker }, - accountName: account - }; + name: { $regex: `^${this.escapeRegex(prefix)}`, $gt: marker }, + accountName: account + }; // Workaround for loki which will ignore $gt when providing $regex const query2 = { name: { $gt: marker } }; @@ -750,10 +750,10 @@ export default class LokiBlobMetadataStore const leaseTimeSeconds: number = doc.properties.leaseState === Models.LeaseStateType.Breaking && - doc.leaseBreakTime + doc.leaseBreakTime ? Math.round( - (doc.leaseBreakTime.getTime() - context.startTime!.getTime()) / 1000 - ) + (doc.leaseBreakTime.getTime() - context.startTime!.getTime()) / 1000 + ) : 0; coll.update(doc); @@ -975,7 +975,7 @@ export default class LokiBlobMetadataStore if (blobDoc) { LeaseFactory.createLeaseState(new BlobLeaseAdapter(blobDoc), context) .validate(new BlobWriteLeaseValidator(leaseAccessConditions)) - .sync(new BlobLeaseSyncer(blob)); // Keep original blob lease + .sync(new BlobWriteLeaseSyncer(blob)); // Keep original blob lease if ( blobDoc.properties !== undefined && @@ -1689,10 +1689,10 @@ export default class LokiBlobMetadataStore const leaseTimeSeconds: number = doc.properties.leaseState === Models.LeaseStateType.Breaking && - doc.leaseBreakTime + doc.leaseBreakTime ? Math.round( - (doc.leaseBreakTime.getTime() - context.startTime!.getTime()) / 1000 - ) + (doc.leaseBreakTime.getTime() - context.startTime!.getTime()) / 1000 + ) : 0; coll.update(doc); @@ -1919,7 +1919,7 @@ export default class LokiBlobMetadataStore leaseBreakTime: destBlob !== undefined ? destBlob.leaseBreakTime : undefined, committedBlocksInOrder: sourceBlob.committedBlocksInOrder, - persistency: sourceBlob.persistency, + persistency: sourceBlob.persistency, blobTags: options.blobTagsString === undefined ? undefined : getTagsFromString(options.blobTagsString, context.contextId!) }; @@ -2106,7 +2106,7 @@ export default class LokiBlobMetadataStore leaseBreakTime: destBlob !== undefined ? destBlob.leaseBreakTime : undefined, committedBlocksInOrder: sourceBlob.committedBlocksInOrder, - persistency: sourceBlob.persistency, + persistency: sourceBlob.persistency, blobTags: options.blobTagsString === undefined ? undefined : getTagsFromString(options.blobTagsString, context.contextId!) }; @@ -2334,8 +2334,9 @@ export default class LokiBlobMetadataStore throw StorageErrorFactory.getBlobNotFound(context.contextId); } + const lease = new BlobLeaseAdapter(doc); new BlobWriteLeaseValidator(leaseAccessConditions).validate( - new BlobLeaseAdapter(doc), + lease, context ); @@ -2372,6 +2373,7 @@ export default class LokiBlobMetadataStore } const coll = this.db.getCollection(this.BLOBS_COLLECTION); + new BlobWriteLeaseSyncer(doc).sync(lease); doc.committedBlocksInOrder = doc.committedBlocksInOrder || []; doc.committedBlocksInOrder.push(block); doc.properties.etag = newEtag(); diff --git a/src/blob/persistence/SqlBlobMetadataStore.ts b/src/blob/persistence/SqlBlobMetadataStore.ts index cb96a6fc4..b137eaf31 100644 --- a/src/blob/persistence/SqlBlobMetadataStore.ts +++ b/src/blob/persistence/SqlBlobMetadataStore.ts @@ -70,10 +70,10 @@ import PageWithDelimiter from "./PageWithDelimiter"; import { getBlobTagsCount, getTagsFromString } from "../utils/utils"; // tslint:disable: max-classes-per-file -class ServicesModel extends Model {} -class ContainersModel extends Model {} -class BlobsModel extends Model {} -class BlocksModel extends Model {} +class ServicesModel extends Model { } +class ContainersModel extends Model { } +class BlobsModel extends Model { } +class BlocksModel extends Model { } // class PagesModel extends Model {} interface IBlobContentProperties { @@ -1037,10 +1037,10 @@ export default class SqlBlobMetadataStore implements IBlobMetadataStore { containerModel.properties.leaseState === Models.LeaseStateType.Breaking && containerModel.leaseBreakTime ? Math.round( - (containerModel.leaseBreakTime.getTime() - - context.startTime!.getTime()) / - 1000 - ) + (containerModel.leaseBreakTime.getTime() - + context.startTime!.getTime()) / + 1000 + ) : 0; return { @@ -1162,7 +1162,7 @@ export default class SqlBlobMetadataStore implements IBlobMetadataStore { LeaseFactory.createLeaseState(new BlobLeaseAdapter(blobModel), context) .validate(new BlobWriteLeaseValidator(leaseAccessConditions)) - .sync(new BlobLeaseSyncer(blob)); // Keep original blob lease; + .sync(new BlobWriteLeaseSyncer(blob)); // Keep original blob lease; if ( blobModel.properties !== undefined && @@ -1729,7 +1729,7 @@ export default class SqlBlobMetadataStore implements IBlobMetadataStore { // TODO: Return blobCommittedBlockCount for append blob - let responds = LeaseFactory.createLeaseState( + let responds = LeaseFactory.createLeaseState( new BlobLeaseAdapter(blobModel), context ) @@ -1737,7 +1737,7 @@ export default class SqlBlobMetadataStore implements IBlobMetadataStore { .sync(new BlobLeaseSyncer(blobModel)); return { ...responds, - properties : { + properties: { ...responds.properties, tagCount: getBlobTagsCount(blobModel.blobTags), }, @@ -2418,11 +2418,11 @@ export default class SqlBlobMetadataStore implements IBlobMetadataStore { const leaseTimeSeconds: number = lease.leaseState === Models.LeaseStateType.Breaking && - lease.leaseBreakTime + lease.leaseBreakTime ? Math.round( - (lease.leaseBreakTime.getTime() - context.startTime!.getTime()) / - 1000 - ) + (lease.leaseBreakTime.getTime() - context.startTime!.getTime()) / + 1000 + ) : 0; await BlobsModel.update(this.convertLeaseToDbModel(lease), { @@ -3407,8 +3407,8 @@ export default class SqlBlobMetadataStore implements IBlobMetadataStore { if (!blobModel.isCommitted) { throw StorageErrorFactory.getBlobNotFound(context.contextId); - } - + } + LeaseFactory.createLeaseState( new BlobLeaseAdapter(blobModel), context diff --git a/tests/blob/apis/appendblob.test.ts b/tests/blob/apis/appendblob.test.ts index 10e38822b..cba0f18c9 100644 --- a/tests/blob/apis/appendblob.test.ts +++ b/tests/blob/apis/appendblob.test.ts @@ -452,7 +452,7 @@ describe("AppendBlobAPIs", () => { }); } catch (err) { assert.deepStrictEqual( - err.code, + err.code, "MaxBlobSizeConditionNotMet"); assert.deepStrictEqual(err.statusCode, 412); @@ -470,7 +470,7 @@ describe("AppendBlobAPIs", () => { }); } catch (err) { assert.deepStrictEqual( - err.code, + err.code, "AppendPositionConditionNotMet"); assert.deepStrictEqual(err.statusCode, 412); return; @@ -565,4 +565,25 @@ describe("AppendBlobAPIs", () => { } assert.fail(); }); + + it("Append block should refresh lease state @loki", async () => { + await appendBlobClient.create(); + + const leaseId = "abcdefg"; + const blobLeaseClient = await appendBlobClient.getBlobLeaseClient(leaseId); + await blobLeaseClient.acquireLease(20); + + await sleep(20000); + + await appendBlobClient.appendBlock("a", 1); + + try { + await blobLeaseClient.renewLease(); + assert.fail(); + } catch (err) { + assert.deepStrictEqual(err.code, "LeaseIdMismatchWithLeaseOperation"); + assert.deepStrictEqual(err.statusCode, 409); + return; + } + }); }); diff --git a/tests/blob/apis/blockblob.test.ts b/tests/blob/apis/blockblob.test.ts index 8b230344c..da691c3d6 100644 --- a/tests/blob/apis/blockblob.test.ts +++ b/tests/blob/apis/blockblob.test.ts @@ -14,7 +14,8 @@ import { bodyToString, EMULATOR_ACCOUNT_KEY, EMULATOR_ACCOUNT_NAME, - getUniqueName + getUniqueName, + sleep } from "../../testutils"; // Set true to enable debug log @@ -68,6 +69,28 @@ describe("BlockBlobAPIs", () => { await containerClient.delete(); }); + it("Block blob upload should refresh lease state @loki @sql", async () => { + await blockBlobClient.upload('a', 1); + + const leaseId = "abcdefg"; + const blobLeaseClient = await blockBlobClient.getBlobLeaseClient(leaseId); + await blobLeaseClient.acquireLease(20); + + // Waiting for 20 seconds for lease to expire + await sleep(20000); + + await blockBlobClient.upload('b', 1); + + try { + await blobLeaseClient.renewLease(); + assert.fail(); + } + catch (error) { + assert.deepStrictEqual(error.code, "LeaseIdMismatchWithLeaseOperation"); + assert.deepStrictEqual(error.statusCode, 409); + } + }); + it("upload with string body and default parameters @loki @sql", async () => { const body: string = getUniqueName("randomstring"); const result_upload = await blockBlobClient.upload(body, body.length); From afa2c37579b9a8c9506ded4b6c545f9d5fb80812 Mon Sep 17 00:00:00 2001 From: EmmaZhu-MSFT Date: Tue, 18 Jun 2024 21:21:11 -0700 Subject: [PATCH 287/297] Bump API version to 2024-08-04 (#2414) --- ChangeLog.md | 6 ++++++ README.md | 14 +++++++------- package-lock.json | 4 ++-- package.json | 2 +- src/blob/utils/constants.ts | 5 +++-- src/queue/utils/constants.ts | 5 +++-- src/table/utils/constants.ts | 5 +++-- 7 files changed, 25 insertions(+), 16 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index 4c04286e0..f13fee0be 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -4,6 +4,12 @@ ## Upcoming Release +## 2024.06 Version 3.31.0 + +General: + +- Bump up service API version to 2024-08-04 + Blob: - Fix issue of not refreshing lease state within block blob/append blob upload operation. (issue #2352) diff --git a/README.md b/README.md index 1a622780b..822d4464a 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,7 @@ | Version | Azure Storage API Version | Service Support | Description | Reference Links | | ------------------------------------------------------------------ | ------------------------- | ------------------------------ | ------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| 3.30.0 | 2024-05-04 | Blob, Queue and Table(preview) | Azurite V3 based on TypeScript & New Architecture | [NPM](https://www.npmjs.com/package/azurite) - [Docker](https://hub.docker.com/_/microsoft-azure-storage-azurite) - [Visual Studio Code Extension](https://marketplace.visualstudio.com/items?itemName=Azurite.azurite) | +| 3.31.0 | 2024-08-04 | Blob, Queue and Table(preview) | Azurite V3 based on TypeScript & New Architecture | [NPM](https://www.npmjs.com/package/azurite) - [Docker](https://hub.docker.com/_/microsoft-azure-storage-azurite) - [Visual Studio Code Extension](https://marketplace.visualstudio.com/items?itemName=Azurite.azurite) | | [Legacy (v2)](https://github.com/Azure/Azurite/tree/legacy-master) | 2016-05-31 | Blob, Queue and Table | Legacy Azurite V2 | [NPM](https://www.npmjs.com/package/azurite) | - [Azurite V3](#azurite-v3) @@ -78,19 +78,19 @@ Compared to V2, Azurite V3 implements a new architecture leveraging code generat ## Features & Key Changes in Azurite V3 -- Blob storage features align with Azure Storage API version 2024-05-04 (Refer to support matrix section below) +- Blob storage features align with Azure Storage API version 2024-08-04 (Refer to support matrix section below) - SharedKey/Account SAS/Service SAS/Public Access Authentications/OAuth - Get/Set Blob Service Properties - Create/List/Delete Containers - Create/Read/List/Update/Delete Block Blobs - Create/Read/List/Update/Delete Page Blobs -- Queue storage features align with Azure Storage API version 2024-05-04 (Refer to support matrix section below) +- Queue storage features align with Azure Storage API version 2024-08-04 (Refer to support matrix section below) - SharedKey/Account SAS/Service SAS/OAuth - Get/Set Queue Service Properties - Preflight Request - Create/List/Delete Queues - Put/Get/Peek/Update/Delete/Clear Messages -- Table storage features align with Azure Storage API version 2024-05-04 (Refer to support matrix section below) +- Table storage features align with Azure Storage API version 2024-08-04 (Refer to support matrix section below) - SharedKey/Account SAS/Service SAS/OAuth - Create/List/Delete Tables - Insert/Update/Query/Delete Table Entities @@ -971,7 +971,7 @@ All the generated code is kept in `generated` folder, including the generated mi ## Support Matrix -Latest release targets **2024-05-04** API version **blob** service. +Latest release targets **2024-08-04** API version **blob** service. Detailed support matrix: @@ -1030,7 +1030,7 @@ Detailed support matrix: - Encryption Scope - Get Page Ranges Continuation Token -Latest version supports for **2024-05-04** API version **queue** service. +Latest version supports for **2024-08-04** API version **queue** service. Detailed support matrix: - Supported Vertical Features @@ -1059,7 +1059,7 @@ Detailed support matrix: - Following features or REST APIs are NOT supported or limited supported in this release (will support more features per customers feedback in future releases) - SharedKey Lite -Latest version supports for **2024-05-04** API version **table** service (preview). +Latest version supports for **2024-08-04** API version **table** service (preview). Detailed support matrix: - Supported Vertical Features diff --git a/package-lock.json b/package-lock.json index 9347b9438..1e64dbf43 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "azurite", - "version": "3.30.0", + "version": "3.31.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "azurite", - "version": "3.30.0", + "version": "3.31.0", "license": "MIT", "dependencies": { "@azure/ms-rest-js": "^1.5.0", diff --git a/package.json b/package.json index 20cf3c65c..634dbe72b 100644 --- a/package.json +++ b/package.json @@ -3,7 +3,7 @@ "displayName": "Azurite", "description": "An open source Azure Storage API compatible server", "icon": "icon.png", - "version": "3.30.0", + "version": "3.31.0", "publisher": "Azurite", "categories": [ "Other" diff --git a/src/blob/utils/constants.ts b/src/blob/utils/constants.ts index 4b8c64cb6..b92815a92 100644 --- a/src/blob/utils/constants.ts +++ b/src/blob/utils/constants.ts @@ -1,8 +1,8 @@ import { StoreDestinationArray } from "../../common/persistence/IExtentStore"; import * as Models from "../generated/artifacts/models"; -export const VERSION = "3.30.0"; -export const BLOB_API_VERSION = "2024-05-04"; +export const VERSION = "3.31.0"; +export const BLOB_API_VERSION = "2024-08-04"; export const DEFAULT_BLOB_SERVER_HOST_NAME = "127.0.0.1"; // Change to 0.0.0.0 when needs external access export const DEFAULT_LIST_BLOBS_MAX_RESULTS = 5000; export const DEFAULT_LIST_CONTAINERS_MAX_RESULTS = 5000; @@ -97,6 +97,7 @@ export const DEFAULT_BLOB_PERSISTENCE_ARRAY: StoreDestinationArray = [ ]; export const ValidAPIVersions = [ + "2024-08-04", "2024-05-04", "2024-02-04", "2023-11-03", diff --git a/src/queue/utils/constants.ts b/src/queue/utils/constants.ts index 427870538..b990bc6f3 100644 --- a/src/queue/utils/constants.ts +++ b/src/queue/utils/constants.ts @@ -1,7 +1,7 @@ import { StoreDestinationArray } from "../../common/persistence/IExtentStore"; -export const VERSION = "3.30.0"; -export const QUEUE_API_VERSION = "2024-05-04"; +export const VERSION = "3.31.0"; +export const QUEUE_API_VERSION = "2024-08-04"; export const DEFAULT_QUEUE_SERVER_HOST_NAME = "127.0.0.1"; // Change to 0.0.0.0 when needs external access export const DEFAULT_QUEUE_LISTENING_PORT = 10001; export const IS_PRODUCTION = process.env.NODE_ENV === "production"; @@ -90,6 +90,7 @@ export const DEFAULT_QUEUE_PERSISTENCE_ARRAY: StoreDestinationArray = [ ]; export const ValidAPIVersions = [ + "2024-08-04", "2024-05-04", "2024-02-04", "2023-11-03", diff --git a/src/table/utils/constants.ts b/src/table/utils/constants.ts index a2dbf75ba..3dc443a2d 100644 --- a/src/table/utils/constants.ts +++ b/src/table/utils/constants.ts @@ -17,8 +17,8 @@ export enum TABLE_STATUSCODE { } export const DEFAULT_TABLE_CONTEXT_PATH = "azurite_table_context"; -export const TABLE_API_VERSION = "2024-05-04"; -export const VERSION = "3.30.0"; +export const TABLE_API_VERSION = "2024-08-04"; +export const VERSION = "3.31.0"; // Max Body size is 4 MB export const BODY_SIZE_MAX = 1024 * 1024 * 4; // Max Entity sizxe is 1 MB @@ -73,6 +73,7 @@ export const DEFAULT_TABLE_PERSISTENCE_ARRAY: StoreDestinationArray = [ export const QUERY_RESULT_MAX_NUM = 1000; export const ValidAPIVersions = [ + "2024-08-04", "2024-05-04", "2024-02-04", "2023-11-03", From 9fa8f4a1a5fad9745e92e521f9b58ed561aa100b Mon Sep 17 00:00:00 2001 From: Wei Wei Date: Thu, 27 Jun 2024 10:49:49 +0800 Subject: [PATCH 288/297] Fix 2410/2409: fix issue of download blob range. (#2417) * Fix 2410/2409: fix issue of download blob range. * Fix test cases --- ChangeLog.md | 5 +++ src/blob/errors/StorageErrorFactory.ts | 9 ++++++ src/blob/handlers/BlobHandler.ts | 20 +++++++++--- tests/blob/apis/appendblob.test.ts | 4 +-- tests/blob/apis/blockblob.test.ts | 43 ++++++++++++++++++++++++++ tests/blob/apis/pageblob.test.ts | 42 +++++++++++++++++++++++++ 6 files changed, 117 insertions(+), 6 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index f13fee0be..1dd789755 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -4,6 +4,11 @@ ## Upcoming Release +Blob: + +- Fixed issue of download 0 size blob with range > 0 should report error. (issue #2410) +- Fixed issue of download a blob range without header x-ms-range-get-content-md5, should not return content-md5. (issue #2409) + ## 2024.06 Version 3.31.0 General: diff --git a/src/blob/errors/StorageErrorFactory.ts b/src/blob/errors/StorageErrorFactory.ts index aac7462a8..41bc8b43c 100644 --- a/src/blob/errors/StorageErrorFactory.ts +++ b/src/blob/errors/StorageErrorFactory.ts @@ -199,6 +199,15 @@ export default class StorageErrorFactory { ); } + public static getInvalidPageRange2(contextID: string): StorageError { + return new StorageError( + 416, + "InvalidRange", + "The range specified is invalid for the current size of the resource.", + contextID + ); + } + public static getInvalidLeaseDuration( contextID: string = DefaultID ): StorageError { diff --git a/src/blob/handlers/BlobHandler.ts b/src/blob/handlers/BlobHandler.ts index 53eef62bc..05f068b62 100644 --- a/src/blob/handlers/BlobHandler.ts +++ b/src/blob/handlers/BlobHandler.ts @@ -1018,7 +1018,13 @@ export default class BlobHandler extends BaseHandler implements IBlobHandler { // Will automatically shift request with longer data end than blob size to blob size if (rangeEnd + 1 >= blob.properties.contentLength!) { - rangeEnd = blob.properties.contentLength! - 1; + // report error is blob size is 0, and rangeEnd is specified but not 0 + if (blob.properties.contentLength == 0 && rangeEnd !== 0 && rangeEnd !== Infinity) { + throw StorageErrorFactory.getInvalidPageRange2(context.contextId!); + } + else { + rangeEnd = blob.properties.contentLength! - 1; + } } const contentLength = rangeEnd - rangeStart + 1; @@ -1098,7 +1104,7 @@ export default class BlobHandler extends BaseHandler implements IBlobHandler { acceptRanges: "bytes", contentLength, contentRange, - contentMD5, + contentMD5: contentRange ? (context.request!.getHeader("x-ms-range-get-content-md5") ? contentMD5: undefined) : contentMD5, tagCount: getBlobTagsCount(blob.blobTags), isServerEncrypted: true, clientRequestId: options.requestId, @@ -1143,7 +1149,13 @@ export default class BlobHandler extends BaseHandler implements IBlobHandler { // Will automatically shift request with longer data end than blob size to blob size if (rangeEnd + 1 >= blob.properties.contentLength!) { - rangeEnd = blob.properties.contentLength! - 1; + // report error is blob size is 0, and rangeEnd is specified but not 0 + if (blob.properties.contentLength == 0 && rangeEnd !== 0 && rangeEnd !== Infinity) { + throw StorageErrorFactory.getInvalidPageRange2(context.contextId!); + } + else { + rangeEnd = blob.properties.contentLength! - 1; + } } const contentLength = rangeEnd - rangeStart + 1; @@ -1228,7 +1240,7 @@ export default class BlobHandler extends BaseHandler implements IBlobHandler { contentType: context.request!.getQuery("rsct") ?? blob.properties.contentType, contentLength, contentRange, - contentMD5, + contentMD5: contentRange ? (context.request!.getHeader("x-ms-range-get-content-md5") ? contentMD5: undefined) : contentMD5, blobContentMD5: blob.properties.contentMD5, tagCount: getBlobTagsCount(blob.blobTags), isServerEncrypted: true, diff --git a/tests/blob/apis/appendblob.test.ts b/tests/blob/apis/appendblob.test.ts index cba0f18c9..64ff23667 100644 --- a/tests/blob/apis/appendblob.test.ts +++ b/tests/blob/apis/appendblob.test.ts @@ -387,7 +387,7 @@ describe("AppendBlobAPIs", () => { await appendBlobClient.appendBlock("T", 1); await appendBlobClient.appendBlock("@", 2); - const response = await snapshotAppendBlobURL.download(3); + const response = await snapshotAppendBlobURL.download(3, undefined, {rangeGetContentMD5: true}); const string = await bodyToString(response); assert.deepStrictEqual(string, "def"); assert.deepEqual(response.contentMD5, await getMD5FromString("def")); @@ -404,7 +404,7 @@ describe("AppendBlobAPIs", () => { await appendBlobClient.delete(); - const response = await copiedAppendBlobClient.download(3); + const response = await copiedAppendBlobClient.download(3, undefined, {rangeGetContentMD5: true}); const string = await bodyToString(response); assert.deepStrictEqual(string, "def"); assert.deepEqual(response.contentMD5, await getMD5FromString("def")); diff --git a/tests/blob/apis/blockblob.test.ts b/tests/blob/apis/blockblob.test.ts index da691c3d6..35845deae 100644 --- a/tests/blob/apis/blockblob.test.ts +++ b/tests/blob/apis/blockblob.test.ts @@ -17,6 +17,7 @@ import { getUniqueName, sleep } from "../../testutils"; +import { getMD5FromString } from "../../../src/common/utils/utils"; // Set true to enable debug log configLogger(false); @@ -335,6 +336,48 @@ describe("BlockBlobAPIs", () => { assert.equal(true, result._response.headers.contains("x-ms-creation-time")); }); + it("download a 0 size block blob with range > 0 will get error @loki @sql", async () => { + await blockBlobClient.commitBlockList([]); + + const listResponse = await blockBlobClient.getBlockList("committed"); + assert.equal(listResponse.committedBlocks!.length, 0); + + try { + await blockBlobClient.download(0, 3); + } catch (error) { + assert.deepStrictEqual(error.statusCode, 416); + return; + } + assert.fail(); + }); + + it("Download a blob range should only return ContentMD5 when has request header x-ms-range-get-content-md5 @loki @sql", async () => { + blockBlobClient.deleteIfExists(); + + await blockBlobClient.upload("abc", 0); + + const properties1 = await blockBlobClient.getProperties(); + assert.deepEqual(properties1.contentMD5, await getMD5FromString("abc")); + + let result = await blockBlobClient.download(0, 6); + assert.deepStrictEqual(await bodyToString(result, 3), "abc"); + assert.deepStrictEqual(result.contentLength, 3); + assert.deepEqual(result.contentMD5, undefined); + assert.deepEqual(result.blobContentMD5, await getMD5FromString("abc")); + + result = await blockBlobClient.download(); + assert.deepStrictEqual(await bodyToString(result, 3), "abc"); + assert.deepStrictEqual(result.contentLength, 3); + assert.deepEqual(result.contentMD5, await getMD5FromString("abc")); + assert.deepEqual(result.blobContentMD5, await getMD5FromString("abc")); + + result = await blockBlobClient.download(0, 1, {rangeGetContentMD5: true}); + assert.deepStrictEqual(await bodyToString(result, 1), "a"); + assert.deepStrictEqual(result.contentLength, 1); + assert.deepEqual(result.contentMD5, await getMD5FromString("a")); + assert.deepEqual(result.blobContentMD5, await getMD5FromString("abc")); + }); + it("commitBlockList with empty list should not work with ifNoneMatch=* for existing blob @loki @sql", async () => { await blockBlobClient.commitBlockList([]); diff --git a/tests/blob/apis/pageblob.test.ts b/tests/blob/apis/pageblob.test.ts index 570cfef0e..eb9bdfb27 100644 --- a/tests/blob/apis/pageblob.test.ts +++ b/tests/blob/apis/pageblob.test.ts @@ -14,6 +14,7 @@ import { EMULATOR_ACCOUNT_NAME, getUniqueName } from "../../testutils"; +import { getMD5FromString } from "../../../src/common/utils/utils"; // Set true to enable debug log configLogger(false); @@ -268,6 +269,47 @@ describe("PageBlobAPIs", () => { ); }); + it("download a 0 size page blob with range > 0 will get error @loki", async () => { + pageBlobClient.deleteIfExists(); + await pageBlobClient.create(0); + + try { + await pageBlobClient.download(0, 3); + } catch (error) { + assert.deepStrictEqual(error.statusCode, 416); + return; + } + assert.fail(); + }); + + it("Download a blob range should only return ContentMD5 when has request header x-ms-range-get-content-md5 @loki", async () => { + pageBlobClient.deleteIfExists(); + + await pageBlobClient.create(512, {blobHTTPHeaders: {blobContentMD5: await getMD5FromString("a".repeat(512))}}); + await pageBlobClient.uploadPages("a".repeat(512), 0, 512); + + const properties1 = await pageBlobClient.getProperties(); + assert.deepEqual(properties1.contentMD5, await getMD5FromString("a".repeat(512))); + + let result = await pageBlobClient.download(0, 1024); + assert.deepStrictEqual(await bodyToString(result, 512), "a".repeat(512)); + assert.deepStrictEqual(result.contentLength, 512); + assert.deepEqual(result.contentMD5, undefined); + assert.deepEqual(result.blobContentMD5, await getMD5FromString("a".repeat(512))); + + result = await pageBlobClient.download(); + assert.deepStrictEqual(await bodyToString(result, 512), "a".repeat(512)); + assert.deepStrictEqual(result.contentLength, 512); + assert.deepEqual(properties1.contentMD5, await getMD5FromString("a".repeat(512))); + assert.deepEqual(result.blobContentMD5, await getMD5FromString("a".repeat(512))); + + result = await pageBlobClient.download(0, 3, {rangeGetContentMD5: true}); + assert.deepStrictEqual(await bodyToString(result, 3), "aaa"); + assert.deepStrictEqual(result.contentLength, 3); + assert.deepEqual(result.contentMD5, await getMD5FromString("aaa")); + assert.deepEqual(result.blobContentMD5, await getMD5FromString("a".repeat(512))); + }); + it("uploadPages @loki", async () => { await pageBlobClient.create(1024); From ef2e3128400d775acd11872be85af60b00faae31 Mon Sep 17 00:00:00 2001 From: Nicholas Lockhart Date: Mon, 1 Jul 2024 21:51:11 -0500 Subject: [PATCH 289/297] [Issue #2415] Bump mysql2 version (#2418) * Bump mysql2 for critical security updates * Updated for upcoming release * Corrected version * Update mysql2 for recent package availability --- ChangeLog.md | 6 ++++++ package-lock.json | 12 ++++++------ package.json | 2 +- 3 files changed, 13 insertions(+), 7 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index 1dd789755..8642eb14e 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -4,11 +4,17 @@ ## Upcoming Release + +General: + +- Bump mysql2 to resolve to 3.10.1 for security patches + Blob: - Fixed issue of download 0 size blob with range > 0 should report error. (issue #2410) - Fixed issue of download a blob range without header x-ms-range-get-content-md5, should not return content-md5. (issue #2409) + ## 2024.06 Version 3.31.0 General: diff --git a/package-lock.json b/package-lock.json index 1e64dbf43..f57328b53 100644 --- a/package-lock.json +++ b/package-lock.json @@ -7332,9 +7332,9 @@ "dev": true }, "node_modules/mysql2": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.7.0.tgz", - "integrity": "sha512-c45jA3Jc1X8yJKzrWu1GpplBKGwv/wIV6ITZTlCSY7npF2YfJR+6nMP5e+NTQhUeJPSyOQAbGDCGEHbAl8HN9w==", + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.10.1.tgz", + "integrity": "sha512-6zo1T3GILsXMCex3YEu7hCz2OXLUarxFsxvFcUHWMpkPtmZLeTTWgRdc1gWyNJiYt6AxITmIf9bZDRy/jAfWew==", "dependencies": { "denque": "^2.1.0", "generate-function": "^2.3.1", @@ -15874,9 +15874,9 @@ "dev": true }, "mysql2": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.7.0.tgz", - "integrity": "sha512-c45jA3Jc1X8yJKzrWu1GpplBKGwv/wIV6ITZTlCSY7npF2YfJR+6nMP5e+NTQhUeJPSyOQAbGDCGEHbAl8HN9w==", + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.10.1.tgz", + "integrity": "sha512-6zo1T3GILsXMCex3YEu7hCz2OXLUarxFsxvFcUHWMpkPtmZLeTTWgRdc1gWyNJiYt6AxITmIf9bZDRy/jAfWew==", "requires": { "denque": "^2.1.0", "generate-function": "^2.3.1", diff --git a/package.json b/package.json index 634dbe72b..05d5ae514 100644 --- a/package.json +++ b/package.json @@ -31,7 +31,7 @@ "lokijs": "^1.5.6", "morgan": "^1.9.1", "multistream": "^2.1.1", - "mysql2": "^3.2.0", + "mysql2": "^3.10.1", "rimraf": "^3.0.2", "sequelize": "^6.31.0", "stoppable": "^1.1.0", From 8f3b809a8f3319e3730c002d8796e94e33d0deb0 Mon Sep 17 00:00:00 2001 From: Wei Wei Date: Tue, 9 Jul 2024 07:28:56 +0000 Subject: [PATCH 290/297] support x-ms-copy-source-tag-option in copy blob (issue #2398) (#2419) --- ChangeLog.md | 3 +- src/blob/errors/StorageErrorFactory.ts | 9 ++++ src/blob/handlers/BlobHandler.ts | 5 ++ src/blob/persistence/LokiBlobMetadataStore.ts | 4 +- tests/blob/apis/blob.test.ts | 53 ++++++++++++++++++- 5 files changed, 70 insertions(+), 4 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index 8642eb14e..d3b9dd9d0 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -4,7 +4,6 @@ ## Upcoming Release - General: - Bump mysql2 to resolve to 3.10.1 for security patches @@ -13,7 +12,7 @@ Blob: - Fixed issue of download 0 size blob with range > 0 should report error. (issue #2410) - Fixed issue of download a blob range without header x-ms-range-get-content-md5, should not return content-md5. (issue #2409) - +- Supported x-ms-copy-source-tag-option in copy blob from Uri. (issue #2398) ## 2024.06 Version 3.31.0 diff --git a/src/blob/errors/StorageErrorFactory.ts b/src/blob/errors/StorageErrorFactory.ts index 41bc8b43c..f37d1949b 100644 --- a/src/blob/errors/StorageErrorFactory.ts +++ b/src/blob/errors/StorageErrorFactory.ts @@ -578,6 +578,15 @@ export default class StorageErrorFactory { ); } + public static getBothUserTagsAndSourceTagsCopyPresentException(contextID: string): StorageError { + return new StorageError( + 400, + "BothUserTagsAndSourceTagsCopyPresentException", + "x-ms-tags header must not be present with x-ms-copy-source-tag-option as COPY.", + contextID + ); + } + public static getNoPendingCopyOperation(contextID: string): StorageError { return new StorageError( 409, diff --git a/src/blob/handlers/BlobHandler.ts b/src/blob/handlers/BlobHandler.ts index 05f068b62..981f9a278 100644 --- a/src/blob/handlers/BlobHandler.ts +++ b/src/blob/handlers/BlobHandler.ts @@ -865,6 +865,11 @@ export default class BlobHandler extends BaseHandler implements IBlobHandler { await this.validateCopySource(copySource, sourceAccount, context); } + // Specifying x-ms-copy-source-tag-option as COPY and x-ms-tags will result in error + if (options.copySourceTags === Models.BlobCopySourceTags.COPY && options.blobTagsString !== undefined) { + throw StorageErrorFactory.getBothUserTagsAndSourceTagsCopyPresentException(context.contextId!); + } + // Preserve metadata key case const metadata = convertRawHeadersToMetadata( blobCtx.request!.getRawHeaders() diff --git a/src/blob/persistence/LokiBlobMetadataStore.ts b/src/blob/persistence/LokiBlobMetadataStore.ts index 964ea8485..21b041a6d 100644 --- a/src/blob/persistence/LokiBlobMetadataStore.ts +++ b/src/blob/persistence/LokiBlobMetadataStore.ts @@ -2107,7 +2107,9 @@ export default class LokiBlobMetadataStore destBlob !== undefined ? destBlob.leaseBreakTime : undefined, committedBlocksInOrder: sourceBlob.committedBlocksInOrder, persistency: sourceBlob.persistency, - blobTags: options.blobTagsString === undefined ? undefined : getTagsFromString(options.blobTagsString, context.contextId!) + blobTags: options.copySourceTags === Models.BlobCopySourceTags.COPY ? + sourceBlob.blobTags + : options.blobTagsString === undefined ? undefined : getTagsFromString(options.blobTagsString, context.contextId!) }; if ( diff --git a/tests/blob/apis/blob.test.ts b/tests/blob/apis/blob.test.ts index a95fb9a91..51325c3b1 100644 --- a/tests/blob/apis/blob.test.ts +++ b/tests/blob/apis/blob.test.ts @@ -7,7 +7,7 @@ import { } from "@azure/storage-blob"; import assert = require("assert"); -import { BlobHTTPHeaders } from "../../../src/blob/generated/artifacts/models"; +import { BlobCopySourceTags, BlobHTTPHeaders } from "../../../src/blob/generated/artifacts/models"; import { configLogger } from "../../../src/common/Logger"; import BlobTestServerFactory from "../../BlobTestServerFactory"; import { @@ -1349,6 +1349,57 @@ describe("BlobAPIs", () => { assert.equal(getResult.leaseStatus, "locked"); await destLeaseClient.releaseLease(); + }); + + it("Synchronized copy blob should work to override tag @loki", async () => { + const tags = { + tag1: "val1" + }; + const tags2 = { + tag2: "val22" + }; + + const sourceBlob = getUniqueName("blob"); + const destBlob = getUniqueName("blob"); + + const sourceBlobClient = containerClient.getBlockBlobClient(sourceBlob); + const destBlobClient = containerClient.getBlockBlobClient(destBlob); + + await sourceBlobClient.upload("hello", 5, { + tags: tags + }); + + // with default x-ms-copy-source-tag-option (REPLACE), if copy request has tags, will overwrite with the tags in copy request + await destBlobClient.syncCopyFromURL(sourceBlobClient.url, { + tags: tags2 + }); + let result = await destBlobClient.getTags(); + assert.deepStrictEqual(result.tags, tags2); + + // with default x-ms-copy-source-tag-option (REPLACE), if copy request has no tags, dest blob will have no tags + await destBlobClient.syncCopyFromURL(sourceBlobClient.url); + result = await destBlobClient.getTags() + assert.deepStrictEqual(result.tags.tag1, undefined); + assert.deepStrictEqual(result.tags.tag2, undefined); + + // with x-ms-copy-source-tag-option as COPY, will use source tags + await destBlobClient.syncCopyFromURL(sourceBlobClient.url, { + copySourceTags: BlobCopySourceTags.COPY + }); + result = await destBlobClient.getTags(); + assert.deepStrictEqual(result.tags, tags); + + // with x-ms-copy-source-tag-option as COPY, and copy request has tags, will report error + let statusCode + try { + await destBlobClient.syncCopyFromURL(sourceBlobClient.url, { + copySourceTags: BlobCopySourceTags.COPY, + tags: tags2 + }); + } catch (error) { + statusCode = error.statusCode; + } + assert.deepStrictEqual(statusCode, 400); }); it("Synchronized copy blob should work for page blob @loki", async () => { From ce4970406b11568e1a1464f18b979e9befec091c Mon Sep 17 00:00:00 2001 From: Wei Wei Date: Wed, 10 Jul 2024 03:35:41 +0000 Subject: [PATCH 291/297] Fix issue 2416: list container without include=metadata should not clear metadata on server. (#2426) --- ChangeLog.md | 1 + src/blob/handlers/ServiceHandler.ts | 12 ++++++------ tests/blob/apis/service.test.ts | 20 +++++++++++++++++++- 3 files changed, 26 insertions(+), 7 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index d3b9dd9d0..5c339687c 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -12,6 +12,7 @@ Blob: - Fixed issue of download 0 size blob with range > 0 should report error. (issue #2410) - Fixed issue of download a blob range without header x-ms-range-get-content-md5, should not return content-md5. (issue #2409) +- Fixed issue of list container without include=metadata should not clear container metadata on server. (issue #2416) - Supported x-ms-copy-source-tag-option in copy blob from Uri. (issue #2398) ## 2024.06 Version 3.31.0 diff --git a/src/blob/handlers/ServiceHandler.ts b/src/blob/handlers/ServiceHandler.ts index 8a968f72e..ae377ecc5 100644 --- a/src/blob/handlers/ServiceHandler.ts +++ b/src/blob/handlers/ServiceHandler.ts @@ -329,15 +329,15 @@ export default class ServiceHandler extends BaseHandler } } } - if (!includeMetadata) { - for (const container of containers[0]) { - container.metadata = undefined; - } - } // TODO: Need update list out container lease properties with ContainerHandler.updateLeaseAttributes() const serviceEndpoint = `${request.getEndpoint()}/${accountName}`; const res: Models.ServiceListContainersSegmentResponse = { - containerItems: containers[0], + containerItems: containers[0].map(item => { + return { + ...item, + metadata: includeMetadata ? item.metadata : undefined + }; + }), maxResults: options.maxresults, nextMarker: `${containers[1] || ""}`, prefix: options.prefix, diff --git a/tests/blob/apis/service.test.ts b/tests/blob/apis/service.test.ts index 69402f633..a79884450 100644 --- a/tests/blob/apis/service.test.ts +++ b/tests/blob/apis/service.test.ts @@ -412,7 +412,7 @@ describe("ServiceAPIs", () => { await containerClient2.delete(); }); - // fix issue 2382 + // fix issue 2382, 2416 it("ListContainers without include metadata should not return contaienr metadata. @loki @sql", async () => { const containerNamePrefix = getUniqueName("container"); const containerName1 = `${containerNamePrefix}x1`; @@ -422,6 +422,7 @@ describe("ServiceAPIs", () => { await containerClient1.create({ metadata: { key: "val" } }); await containerClient2.create({ metadata: { key: "val" } }); + // list containers without include metadata will not return metadata const result1 = ( await serviceClient .listContainers({ @@ -436,6 +437,23 @@ describe("ServiceAPIs", () => { assert.ok(result1.containerItems![1].name.startsWith(containerNamePrefix)); assert.equal(result1.containerItems![0].metadata, undefined); assert.equal(result1.containerItems![1].metadata, undefined); + + // then list containers with include metadata will return metadata + const result2 = ( + await serviceClient + .listContainers({ + includeMetadata: true, + prefix: containerNamePrefix + }) + .byPage() + .next() + ).value; + + assert.equal(result2.containerItems!.length, 2); + assert.ok(result2.containerItems![0].name.startsWith(containerNamePrefix)); + assert.ok(result2.containerItems![1].name.startsWith(containerNamePrefix)); + assert.deepEqual(result2.containerItems![0].metadata!.key, "val"); + assert.deepEqual(result2.containerItems![1].metadata!.key, "val"); }); it("get Account info @loki @sql", async () => { From 2945f6b2a3964362d2f417f17e3a33e1bb9388d0 Mon Sep 17 00:00:00 2001 From: Josh Soref <2119212+jsoref@users.noreply.github.com> Date: Wed, 17 Jul 2024 03:16:45 -0400 Subject: [PATCH 292/297] Spelling (#2424) * spelling: account Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: actually Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: annotation Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: audience Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: authentication Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: azurite Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: because Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: behavior Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: binary Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: breakperiod Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: calculate Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: calling Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: case-insensitive Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: case-sensitive Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: committed Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: conflict Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: conflicting Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: container Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: corresponding Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: count Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: currently Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: daemon Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: datetime Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: definition Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: delete Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: deliberately Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: deserializer Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: disable Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: doesn't Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: earlier Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: entities Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: expiry Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: expression Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: fine-grained Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: functions Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: granularity Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: identifier Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: ignore Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: immediately Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: initialization Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: internal Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: invalid Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: its Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: javascript Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: local Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: maxresults Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: merged Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: message Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: metadata Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: multiple Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: nonexistent Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: nonexistentcontainer Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: odataid Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: opened Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: origin Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: overlap Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: overridden Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: parameters Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: partition Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: payload Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: permission Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: pipeline Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: precondition Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: prettier Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: request Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: response Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: result Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: retrieve Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: return Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: separately Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: service Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: size Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: snapshot Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: specified Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: support Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: table Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: the Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: typescript Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: uncommitted Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: unmatchedetag Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: uri Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: variable Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: version Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: was Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: with Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> --------- Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> Co-authored-by: Wei Wei --- BreakingChanges.md | 4 +- CONTRIBUTION.md | 2 +- ChangeLog.md | 32 ++++++++-------- README.mcr.md | 6 +-- README.md | 22 +++++------ azure-pipelines.yml | 14 +++---- src/blob/BlobEnvironment.ts | 6 +-- src/blob/BlobRequestListenerFactory.ts | 2 +- .../BlobSharedKeyAuthenticator.ts | 2 +- .../authentication/BlobTokenAuthenticator.ts | 2 +- .../OperationAccountSASPermission.ts | 6 +-- .../conditions/ConditionResourceAdapter.ts | 4 +- .../ReadConditionalHeadersValidator.ts | 4 +- .../WriteConditionalHeadersValidator.ts | 4 +- src/blob/errors/StorageErrorFactory.ts | 6 +-- src/blob/handlers/BlobBatchHandler.ts | 4 +- src/blob/handlers/BlockBlobHandler.ts | 2 +- src/blob/handlers/ServiceHandler.ts | 2 +- .../blobStorageContext.middleware.ts | 6 +-- src/blob/persistence/LokiBlobMetadataStore.ts | 16 ++++---- src/blob/persistence/SqlBlobMetadataStore.ts | 2 +- src/common/Environment.ts | 6 +-- src/common/persistence/IExtentMetadata.ts | 2 +- src/common/utils/constants.ts | 2 +- src/common/utils/utils.ts | 2 +- src/queue/QueueEnvironment.ts | 6 +-- .../authentication/QueueSASAuthenticator.ts | 2 +- .../QueueSharedKeyAuthenticator.ts | 2 +- .../authentication/QueueTokenAuthenticator.ts | 2 +- src/queue/errors/StorageErrorFactory.ts | 15 +------- src/queue/handlers/MessageIdHandler.ts | 2 +- src/queue/handlers/MessagesHandler.ts | 2 +- src/queue/handlers/QueueHandler.ts | 2 +- src/queue/handlers/ServiceHandler.ts | 14 +++---- .../persistence/LokiQueueMetadataStore.ts | 6 +-- src/queue/utils/constants.ts | 4 +- src/queue/utils/utils.ts | 2 +- src/table/ITableEnvironment.ts | 2 +- src/table/TableEnvironment.ts | 6 +-- .../TableSharedKeyAuthenticator.ts | 2 +- .../TableSharedKeyLiteAuthenticator.ts | 2 +- .../authentication/TableTokenAuthenticator.ts | 2 +- src/table/batch/BatchErrorConstants.ts | 2 +- src/table/batch/BatchRequest.ts | 4 +- src/table/batch/TableBatchOrchestrator.ts | 8 ++-- src/table/batch/TableBatchSerialization.ts | 38 +++++++++---------- src/table/entity/EntityProperty.ts | 2 +- src/table/errors/StorageError.ts | 10 ++--- src/table/errors/StorageErrorFactory.ts | 2 +- src/table/handlers/ServiceHandler.ts | 2 +- src/table/handlers/TableHandler.ts | 2 +- src/table/persistence/ITableMetadataStore.ts | 2 +- .../persistence/LokiTableMetadataStore.ts | 34 ++++++++--------- src/table/utils/constants.ts | 2 +- swagger/queue.md | 2 +- .../OPTIONSRequestPolicyFactory.ts | 18 ++++----- .../QueryRequestPolicyFactory.ts | 2 +- tests/blob/apis/blob.test.ts | 10 ++--- tests/blob/apis/blockblob.test.ts | 14 +++---- tests/blob/apis/container.test.ts | 8 ++-- tests/blob/apis/pageblob.test.ts | 6 +-- tests/blob/apis/service.test.ts | 4 +- tests/blob/blobCorsRequest.test.ts | 24 ++++++------ tests/blob/conditions.test.ts | 14 +++---- tests/blob/oauth.test.ts | 2 +- tests/blob/sas.test.ts | 2 +- tests/exe.test.ts | 2 +- tests/linuxbinary.test.ts | 2 +- .../OPTIONSRequestPolicyFactory.ts | 18 ++++----- tests/queue/queueCorsRequest.test.ts | 24 ++++++------ tests/queue/queueSpecialnaming.test.ts | 8 ++-- .../RequestPolicy/OPTIONSRequestPolicy.ts | 10 ++--- ...le.entity.apostrophe.azure-storage.test.ts | 2 +- .../table.entity.azure.data-tables.test.ts | 6 +-- tests/table/apis/table.entity.issues.test.ts | 2 +- tests/table/apis/table.entity.rest.test.ts | 6 +-- tests/table/apis/table.test.ts | 2 +- tests/table/auth/tableCorsRequest.test.ts | 2 +- tests/table/go/main.go | 2 +- tests/table/unit/deserialization.unit.test.ts | 2 +- .../mock.request.serialization.strings.ts | 12 +++--- .../mock.response.serialization.strings.ts | 4 +- ...mock.serialization.batchrequest.factory.ts | 2 +- .../table/unit/query.interpreter.unit.test.ts | 4 +- tests/table/unit/query.parser.unit.test.ts | 2 +- tests/table/unit/serialization.unit.test.ts | 2 +- tests/table/utils/table.entity.test.utils.ts | 4 +- 87 files changed, 277 insertions(+), 288 deletions(-) diff --git a/BreakingChanges.md b/BreakingChanges.md index ba651f3b5..375baccc2 100644 --- a/BreakingChanges.md +++ b/BreakingChanges.md @@ -10,8 +10,8 @@ ## 2021.9 Version 3.14.2 -- [Breaking] Remove the support of DNS name with mutiple blocks but without accout name, like "http://foo.bar.com:10000/devstoreaccount1/container". - - When use DNS name with mutiple blocks, storage account name must be in the first block, like "http://devstoreaccount1.blob.localhost:10000/container" +- [Breaking] Remove the support of DNS name with multiple blocks but without account name, like "http://foo.bar.com:10000/devstoreaccount1/container". + - When use DNS name with multiple blocks, storage account name must be in the first block, like "http://devstoreaccount1.blob.localhost:10000/container" ## 2019.12 Version 3.4.0 diff --git a/CONTRIBUTION.md b/CONTRIBUTION.md index f34da77a3..e22217373 100644 --- a/CONTRIBUTION.md +++ b/CONTRIBUTION.md @@ -51,7 +51,7 @@ Select and start Visual Studio Code debug configuration "Run Extension". For every newly implemented REST API and handler, there should be at least coverage from 1 unit / integration test case. -We also provide a predefined Visual Studio Code debug configuration "Current Mocha", allowing you to execute mocha tests within the currently opended file. +We also provide a predefined Visual Studio Code debug configuration "Current Mocha", allowing you to execute mocha tests within the currently opened file. Or manually execute all test cases: diff --git a/ChangeLog.md b/ChangeLog.md index 5c339687c..0fc1d2323 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -104,7 +104,7 @@ Table: General: -- Updated examples of setting Customized Storage Accounts & Keys in enviroment varialbe. +- Updated examples of setting Customized Storage Accounts & Keys in enviroment variable. - Bump up service API version to 2023-08-03 Blob: @@ -143,7 +143,7 @@ General: Blob: -- Fixed issue of: blob batch subresponse is slightly different from the on from Azure serivce, which causes exception in CPP SDK. +- Fixed issue of: blob batch subresponse is slightly different from the on from Azure service, which causes exception in CPP SDK. - Fixed issue of: setMetadata API allows invalid metadata name with hyphen. - Supported rest API GetBlobTag, SetBlobTag. - Supported set Blob Tags in upload blob, copy blob. @@ -162,7 +162,7 @@ General: - Return 404 StatusCode when Storage account not exist - Migrated tslint to eslint. -- Typescript upgraded from 4.2.4 to 4.9.5. +- TypeScript upgraded from 4.2.4 to 4.9.5. - Migrated test pipeline from Node.js 10/12 to Node.js 14/16/18. - Bump up service API version to 2022-11-02 @@ -248,7 +248,7 @@ General: Table: -- Correctly responds with status 202 on merge with non-existent entity. +- Correctly responds with status 202 on merge with nonexistent entity. - Properly differentiate between upsert and update in batch merge and replace. - Added additional tests via raw REST tests. - Correctly deletes a table that is a substring of another table. @@ -260,7 +260,7 @@ Table: General: - Bump up service API version to 2021-08-06 -- Modified the error messge for invalid API version to make it more actionable. +- Modified the error message for invalid API version to make it more actionable. Blob: @@ -291,7 +291,7 @@ General: Table: - Fixed empty partition key and row key handling in batch write operations. -- Fixed batch reponse for Go SDK, includes additional CRLF on closure of changesetresponse section. +- Fixed batch response for Go SDK, includes additional CRLF on closure of changesetresponse section. - Removed query strings from Location and DataServiceId batch response headers. - Modified the deserialization of batch request for case that a raw / not url encoded % is present in the body. - Added additional tests and checks for table names on creation. @@ -310,7 +310,7 @@ General: Blob: -- Fixed issue that startCopyFromURL and copyFromURL API not respect `--disableProductStyleUrl` parameter in parse source Uri. +- Fixed issue that startCopyFromURL and copyFromURL API not respect `--disableProductStyleUrl` parameter in parse source URI. Queue: @@ -338,7 +338,7 @@ Table: General: - Bump up service API version to 2021-02-12 -- Fixed access to secondary location with IP style Uri from JS/.net SDK failure. +- Fixed access to secondary location with IP style URI from JS/.net SDK failure. - Fixed an issue in Visual Studio Code extension, by changing the Location with relative path, from base on Visual Studio Code installation path, to base on the current opened workspace folder. Blob: @@ -349,17 +349,17 @@ Blob: General: -- Added new parameter `--disableProductStyleUrl`, to force parsing storage account from request Uri path, instead of from request Uri host. +- Added new parameter `--disableProductStyleUrl`, to force parsing storage account from request URI path, instead of from request URI host. - Restored ability to connect to host.docker.internal. Blob: -- Fixed list blob API "include" query parameter not work when not lower case, by make it case insensitive. +- Fixed list blob API "include" query parameter not work when not lower case, by make it case-insensitive. - Supported list container/blob with "include" query parameter as empty string. - Added more allowed value to list blob request "include" query parameter:'tags', 'versions', 'deletedwithversions', 'immutabilitypolicy', 'legalhold', 'permissions'. - Added more allowed value to list container request "include" query parameter: 'deleted'. - Raised 416 when start range is bigger than blob length. -- Fixed issue that duplicated decode rscd, rsce, rscl and rsct of SAS token in input request Uri. +- Fixed issue that duplicated decode rscd, rsce, rscl and rsct of SAS token in input request URI. Queue: @@ -367,7 +367,7 @@ Queue: Table: -- Supported basic level of OAuth autentication on Table service. +- Supported basic level of OAuth authentication on Table service. - Removed extra CRLF from batch transaction response which caused issues for Microsoft.Azure.Cosmos.Table NuGet package. Table: @@ -426,7 +426,7 @@ Table: Blob: -- Fixed list containers, get service properties or account properties API failure, when request Uri has a suffix '/' after account name. +- Fixed list containers, get service properties or account properties API failure, when request URI has a suffix '/' after account name. - Fixed get system container failure. ## 2021.6 Version 3.13.0 @@ -458,7 +458,7 @@ Table: - Preview of Table Service in npm package and docker image. (Visual Studio Code extension doesn't support Table Service in this release) - Allow empty RowKey in an entity. - Fix etag format to be aligned with Azure server. -- Fix delet none exist table error code and error message, to be aligned with Azure server. +- Fix delete nonexistent table error code and error message, to be aligned with Azure server. - Convert entity properties with type "Edm.DateTime" to UTC time, to be aligned with Azure server. - Support Batch API. - Allow complex RowKey and PartitionKey in batch API. @@ -502,7 +502,7 @@ Blob: - Add support for async copy blobs on sql metadata store. - Add support for blob syncCopyFromURL within same Azurite instance on loki metadata store. - Allow mixed case characters for blob metadata prefix. -- Fix SqlBlobMetadataStore.getBlockList, to make it fail for non-existent blobs. +- Fix SqlBlobMetadataStore.getBlockList, to make it fail for nonexistent blobs. ## 2020.07 Version 3.8.0 @@ -515,7 +515,7 @@ Blob: ## 2020.04 Version 3.7.0 - Supported HTTPS endpoint. Specific parameter `azurite --cert server.cert --key server.key` to enable HTTPS mode. -- Supported basic level of OAuth autentication. Specific parameter `azurite --oauth basic` to enable OAuth autentication. +- Supported basic level of OAuth authentication. Specific parameter `azurite --oauth basic` to enable OAuth authentication. Blob: diff --git a/README.mcr.md b/README.mcr.md index 531c4cfd1..f9275a60e 100644 --- a/README.mcr.md +++ b/README.mcr.md @@ -30,7 +30,7 @@ Just run blob service: docker run -p 10000:10000 mcr.microsoft.com/azure-storage/azurite azurite-blob --blobHost 0.0.0.0 ``` -Run the image as a service (`-d` = deamon) named `azurite` and restart unless specifically stopped (this is useful when re-starting your development machine for example) +Run the image as a service (`-d` = daemon) named `azurite` and restart unless specifically stopped (this is useful when re-starting your development machine for example) ```bash docker run --name azurite -d --restart unless-stopped -p 10000:10000 -p 10001:10001 -p 10002:10002 mcr.microsoft.com/azure-storage/azurite @@ -72,9 +72,9 @@ Above command will try to start Azurite image with configurations: `--skipApiVersionCheck` skip the request API version check. -`--disableProductStyleUrl` force parsing storage account name from request Uri path, instead of from request Uri host. +`--disableProductStyleUrl` force parsing storage account name from request URI path, instead of from request URI host. -> If you use customized azurite paramters for docker image, `--blobHost 0.0.0.0`, `--queueHost 0.0.0.0` are required parameters. +> If you use customized azurite parameters for docker image, `--blobHost 0.0.0.0`, `--queueHost 0.0.0.0` are required parameters. > In above sample, you need to use **double first forward slash** for location and debug path parameters to avoid a [known issue](https://stackoverflow.com/questions/48427366/docker-build-command-add-c-program-files-git-to-the-path-passed-as-build-argu) for Git on Windows. diff --git a/README.md b/README.md index 822d4464a..7b5633bf2 100644 --- a/README.md +++ b/README.md @@ -199,7 +199,7 @@ Following extension configurations are supported: - `azurite.pwd` PFX cert password. Required when `azurite.cert` points to a PFX file. - `azurite.oauth` OAuth oauthentication level. Candidate level values: `basic`. - `azurite.skipApiVersionCheck` Skip the request API version check, by default false. -- `azurite.disableProductStyleUrl` Force parsing storage account name from request Uri path, instead of from request Uri host. +- `azurite.disableProductStyleUrl` Force parsing storage account name from request URI path, instead of from request URI host. - `azurite.inMemoryPersistence` Disable persisting any data to disk. If the Azurite process is terminated, all data is lost. - `azurite.extentMemoryLimit` When using in-memory persistence, limit the total size of extents (blob and queue content) to a specific number of megabytes. This does not limit blob, queue, or table metadata. Defaults to 50% of total memory. @@ -259,7 +259,7 @@ Above command will try to start Azurite image with configurations: `--skipApiVersionCheck` skip the request API version check. -`--disableProductStyleUrl` force parsing storage account name from request Uri path, instead of from request Uri host. +`--disableProductStyleUrl` force parsing storage account name from request URI path, instead of from request URI host. > If you use customized azurite parameters for docker image, `--blobHost 0.0.0.0`, `--queueHost 0.0.0.0` are required parameters. @@ -390,13 +390,13 @@ Optional. By default Azurite will listen on HTTP protocol. Provide a PEM or PFX --cert path/server.pem ``` -When `--cert` is provided for a PEM file, must provide coresponding `--key`. +When `--cert` is provided for a PEM file, must provide corresponding `--key`. ```cmd --key path/key.pem ``` -When `--cert` is provided for a PFX file, must provide coresponding `--pwd` +When `--cert` is provided for a PFX file, must provide corresponding `--pwd` ```cmd --pwd pfxpassword @@ -428,7 +428,7 @@ Optional. By default Azurite will check the request API version is valid API ver ### Disable Product Style Url -Optional. When using FQDN instead of IP in request Uri host, by default Azurite will parse storage account name from request Uri host. Force parsing storage account name from request Uri path by: +Optional. When using FQDN instead of IP in request URI host, by default Azurite will parse storage account name from request URI host. Force parsing storage account name from request URI path by: ```cmd --disableProductStyleUrl @@ -807,10 +807,10 @@ Following files or folders may be created when initializing Azurite in selected - `azurite_db_blob.json` Metadata file used by Azurite blob service. (No when starting Azurite against external database) - `azurite_db_blob_extent.json` Extent metadata file used by Azurite blob service. (No when starting Azurite against external database) -- `blobstorage` Persisted bindary data by Azurite blob service. +- `blobstorage` Persisted binary data by Azurite blob service. - `azurite_db_queue.json` Metadata file used by Azurite queue service. (No when starting Azurite against external database) - `azurite_db_queue_extent.json` Extent metadata file used by Azurite queue service. (No when starting Azurite against external database) -- `queuestorage` Persisted bindary data by Azurite queue service. +- `queuestorage` Persisted binary data by Azurite queue service. - `azurite_db_table.json` Metadata file used by Azurite table service. > Note. Delete above files and folders and restart Azurite to clean up Azurite. It will remove all data stored in Azurite!! @@ -827,7 +827,7 @@ Optionally, you could modify your hosts file, to access accounts with production ### Endpoint & Connection URL -The service endpoints for Azurite are different from those of an Azure storage account. The difference is because Azuite runs on local computer, and normally, no DNS resolves address to local. +The service endpoints for Azurite are different from those of an Azure storage account. The difference is because Azurite runs on local computer, and normally, no DNS resolves address to local. When you address a resource in an Azure storage account, use the following scheme. The account name is part of the URI host name, and the resource being addressed is part of the URI path: @@ -843,7 +843,7 @@ https://myaccount.blob.core.windows.net/mycontainer/myblob.txt #### IP-style URL -However, because Azuite runs on local computer, it use IP-style URI by default, and the account name is part of the URI path instead of the host name. Use the following URI format for a resource in Azurite: +However, because Azurite runs on local computer, it use IP-style URI by default, and the account name is part of the URI path instead of the host name. Use the following URI format for a resource in Azurite: ``` http://:// @@ -893,7 +893,7 @@ DefaultEndpointsProtocol=http;AccountName=account1;AccountKey=key1;BlobEndpoint= > Note. When use Production-style URL to access Azurite, by default the account name should be the host name in FQDN, like "". To use Production-style URL with account name in URL path, like "", please start Azurite with `--disableProductStyleUrl`. -> Note. If use "host.docker.internal" as request Uri host, like "", Azurite will always get account name from request Uri path, not matter Azurite start with `--disableProductStyleUrl` or not. +> Note. If use "host.docker.internal" as request URI host, like "", Azurite will always get account name from request URI path, not matter Azurite start with `--disableProductStyleUrl` or not. ### Scalability & Performance @@ -952,7 +952,7 @@ Azurite V3 leverages a TypeScript server code generator based on Azure Storage R ### TypeScript -Azurite V3 selected TypeScript as its' programming language, as this facilitates broad collaboration, whilst also ensuring quality. +Azurite V3 selected TypeScript as its programming language, as this facilitates broad collaboration, whilst also ensuring quality. ### Features Scope diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 26ed48da7..8e192fa02 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -283,7 +283,7 @@ jobs: vmImage: "ubuntu-latest" strategy: matrix: - # Table tests no longer suport older node versions + # Table tests no longer support older node versions node_14_x: node_version: 14.x node_16_x: @@ -317,7 +317,7 @@ jobs: vmImage: "windows-latest" strategy: matrix: - # Table tests no longer suport older node versions + # Table tests no longer support older node versions node_14_x: node_version: 14.x node_16_x: @@ -351,7 +351,7 @@ jobs: vmImage: "macOS-latest" strategy: matrix: - # Table tests no longer suport older node versions + # Table tests no longer support older node versions node_16_x: node_version: 16.x node_18_x: @@ -385,8 +385,8 @@ jobs: vmImage: "ubuntu-latest" strategy: matrix: - # Table tests no longer suport older node versions - # skip node 14 Azurite install test, since it has issue iwth new npm, which is not azurite issue. + # Table tests no longer support older node versions + # skip node 14 Azurite install test, since it has issue with new npm, which is not azurite issue. # Track with https://github.com/Azure/Azurite/issues/1550. Will add node 14 back later when the issue resolved. #node_14_x: # node_version: 14.x @@ -435,7 +435,7 @@ jobs: vmImage: "windows-latest" strategy: matrix: - # Table tests no longer suport older node versions + # Table tests no longer support older node versions node_14_x: node_version: 14.x node_16_x: @@ -483,7 +483,7 @@ jobs: vmImage: "macOS-latest" strategy: matrix: - # Table tests no longer suport node_8_x + # Table tests no longer support node_8_x node_14_x: node_version: 14.x node_16_x: diff --git a/src/blob/BlobEnvironment.ts b/src/blob/BlobEnvironment.ts index bdc06f5a0..65e203828 100644 --- a/src/blob/BlobEnvironment.ts +++ b/src/blob/BlobEnvironment.ts @@ -58,7 +58,7 @@ if (!(args as any).config.name) { .option(["", "pwd"], "Optional. Password for .pfx file") .option( ["", "disableProductStyleUrl"], - "Optional. Disable getting account name from the host of request Uri, always get account name from the first path segment of request Uri." + "Optional. Disable getting account name from the host of request URI, always get account name from the first path segment of request URI." ); (args as any).config.name = "azurite-blob"; @@ -101,7 +101,7 @@ export default class BlobEnvironment implements IBlobEnvironment { if (this.flags.skipApiVersionCheck !== undefined) { return true; } - // default is false which will check API veresion + // default is false which will check API version return false; } @@ -125,7 +125,7 @@ export default class BlobEnvironment implements IBlobEnvironment { if (this.flags.disableProductStyleUrl !== undefined) { return true; } - // default is false which will try to get account name from request Uri hostname + // default is false which will try to get account name from request URI hostname return false; } diff --git a/src/blob/BlobRequestListenerFactory.ts b/src/blob/BlobRequestListenerFactory.ts index c3bd075a8..c01f248b2 100644 --- a/src/blob/BlobRequestListenerFactory.ts +++ b/src/blob/BlobRequestListenerFactory.ts @@ -137,7 +137,7 @@ export default class BlobRequestListenerFactory app.use(morgan("common", { stream: this.accessLogWriteStream })); } - // Manually created middleware to deserialize feature related context which swagger doesn"t know + // Manually created middleware to deserialize feature related context which swagger doesn't know app.use(createStorageBlobContextMiddleware(this.skipApiVersionCheck, this.disableProductStyleUrl, this.loose)); // Dispatch incoming HTTP request to specific operation diff --git a/src/blob/authentication/BlobSharedKeyAuthenticator.ts b/src/blob/authentication/BlobSharedKeyAuthenticator.ts index f762d5438..f0f184326 100644 --- a/src/blob/authentication/BlobSharedKeyAuthenticator.ts +++ b/src/blob/authentication/BlobSharedKeyAuthenticator.ts @@ -139,7 +139,7 @@ export default class BlobSharedKeyAuthenticator implements IAuthenticator { if (context.context.isSecondary && blobContext.authenticationPath?.indexOf(account) === 1) { - // JS/.net Track2 SDK will generate stringToSign from IP style Uri with "-secondary" in authenticationPath, so will also compare signature with this kind stringToSign + // JS/.net Track2 SDK will generate stringToSign from IP style URI with "-secondary" in authenticationPath, so will also compare signature with this kind stringToSign const stringToSign_secondary: string = [ req.getMethod().toUpperCase(), diff --git a/src/blob/authentication/BlobTokenAuthenticator.ts b/src/blob/authentication/BlobTokenAuthenticator.ts index d81b9d82e..a9959a85a 100644 --- a/src/blob/authentication/BlobTokenAuthenticator.ts +++ b/src/blob/authentication/BlobTokenAuthenticator.ts @@ -225,7 +225,7 @@ export default class BlobTokenAuthenticator implements IAuthenticator { if (m !== null) { if (m[0] === aud) { if (m[1] !== undefined && m[1] !== blobContext.account) { - // If account name doesn't match for fine grained audiance + // If account name doesn't match for fine-grained audience break; } audMatch = true; diff --git a/src/blob/authentication/OperationAccountSASPermission.ts b/src/blob/authentication/OperationAccountSASPermission.ts index 6fc42e445..56cd123f8 100644 --- a/src/blob/authentication/OperationAccountSASPermission.ts +++ b/src/blob/authentication/OperationAccountSASPermission.ts @@ -358,7 +358,7 @@ OPERATION_ACCOUNT_SAS_PERMISSIONS.set( new OperationAccountSASPermission( AccountSASService.Blob, AccountSASResourceType.Object, - // Create permission is only available for non existing block blob. Handle this scenario separately + // Create permission is only available for nonexistent block blob. Handle this scenario separately AccountSASPermission.Write + AccountSASPermission.Create ) ); @@ -368,7 +368,7 @@ OPERATION_ACCOUNT_SAS_PERMISSIONS.set( new OperationAccountSASPermission( AccountSASService.Blob, AccountSASResourceType.Object, - // Create permission is only available for non existing page blob. Handle this scenario separately + // Create permission is only available for nonexistent page blob. Handle this scenario separately AccountSASPermission.Write + AccountSASPermission.Create ) ); @@ -378,7 +378,7 @@ OPERATION_ACCOUNT_SAS_PERMISSIONS.set( new OperationAccountSASPermission( AccountSASService.Blob, AccountSASResourceType.Object, - // Create permission is only available for non existing append blob. Handle this scenario separately + // Create permission is only available for nonexistent append blob. Handle this scenario separately AccountSASPermission.Write + AccountSASPermission.Create ) ); diff --git a/src/blob/conditions/ConditionResourceAdapter.ts b/src/blob/conditions/ConditionResourceAdapter.ts index 2cc0144db..f6a54c0ed 100644 --- a/src/blob/conditions/ConditionResourceAdapter.ts +++ b/src/blob/conditions/ConditionResourceAdapter.ts @@ -10,10 +10,10 @@ export default class ConditionResourceAdapter implements IConditionResource { if ( resource === undefined || resource === null || - (resource as BlobModel).isCommitted === false // Treat uncommitted blob as unexist resource + (resource as BlobModel).isCommitted === false // Treat uncommitted blob as nonexistent resource ) { this.exist = false; - this.etag = "UNEXIST_RESOURCE_ETAG"; + this.etag = "NONEXISTENT_RESOURCE_ETAG"; this.lastModified = undefined as any; return; } diff --git a/src/blob/conditions/ReadConditionalHeadersValidator.ts b/src/blob/conditions/ReadConditionalHeadersValidator.ts index 6943d5f5e..acf6036e7 100644 --- a/src/blob/conditions/ReadConditionalHeadersValidator.ts +++ b/src/blob/conditions/ReadConditionalHeadersValidator.ts @@ -46,7 +46,7 @@ export default class ReadConditionalHeadersValidator } // If If-Unmodified-Since - // Skip for unexist resource + // Skip for nonexistent resource // If-None-Match if ( @@ -58,7 +58,7 @@ export default class ReadConditionalHeadersValidator } // If-Modified-Since - // Skip for unexist resource + // Skip for nonexistent resource } else { // Read against an existing resource // If-Match && If-Unmodified-Since && (If-None-Match || If-Modified-Since) diff --git a/src/blob/conditions/WriteConditionalHeadersValidator.ts b/src/blob/conditions/WriteConditionalHeadersValidator.ts index 15cf67728..9572f47b1 100644 --- a/src/blob/conditions/WriteConditionalHeadersValidator.ts +++ b/src/blob/conditions/WriteConditionalHeadersValidator.ts @@ -124,9 +124,9 @@ export default class WriteConditionalHeadersValidator if (conditionalHeaders.ifNoneMatch[0] === "*") { // According to restful doc, specify the wildcard character (*) to perform the operation // only if the resource does not exist, and fail the operation if it does exist. - // However, Azure Storage Set Blob Properties Operation for an existing blob doesn't reuturn 412 with * + // However, Azure Storage Set Blob Properties Operation for an existing blob doesn't return 412 with * // TODO: Check accurate behavior for different write operations - // Put Blob, Commit Block List has special logic for ifNoneMatch equals *, will return 409 conflict for existing blob, will handled in createBlob metatdata store. + // Put Blob, Commit Block List has special logic for ifNoneMatch equals *, will return 409 conflict for existing blob, will handled in createBlob metadata store. // throw StorageErrorFactory.getConditionNotMet(context.contextId!); return; } diff --git a/src/blob/errors/StorageErrorFactory.ts b/src/blob/errors/StorageErrorFactory.ts index f37d1949b..5290b7854 100644 --- a/src/blob/errors/StorageErrorFactory.ts +++ b/src/blob/errors/StorageErrorFactory.ts @@ -754,7 +754,7 @@ export default class StorageErrorFactory { return new StorageError( 400, "InvalidResourceName", - `The specifed resource name contains invalid characters.`, + `The specified resource name contains invalid characters.`, contextID ); } @@ -827,12 +827,12 @@ export default class StorageErrorFactory { ); } - public static getInvaidXmlDocument( + public static getInvalidXmlDocument( contextID: string = "" ): StorageError { return new StorageError( 400, - "InvaidXmlDocument", + "InvalidXmlDocument", `XML specified is not syntactically valid.`, contextID ); diff --git a/src/blob/handlers/BlobBatchHandler.ts b/src/blob/handlers/BlobBatchHandler.ts index 296b62c22..98cdabfba 100644 --- a/src/blob/handlers/BlobBatchHandler.ts +++ b/src/blob/handlers/BlobBatchHandler.ts @@ -25,7 +25,7 @@ import HandlerMiddlewareFactory from "../generated/middleware/HandlerMiddlewareF import serializerMiddleware from "../generated/middleware/serializer.middleware"; import ILogger from "../generated/utils/ILogger"; import AuthenticationMiddlewareFactory from "../middlewares/AuthenticationMiddlewareFactory"; -import { internnalBlobStorageContextMiddleware } from "../middlewares/blobStorageContext.middleware"; +import { internalBlobStorageContextMiddleware } from "../middlewares/blobStorageContext.middleware"; import IBlobMetadataStore from "../persistence/IBlobMetadataStore"; import { DEFAULT_CONTEXT_PATH, HTTP_HEADER_DELIMITER, HTTP_LINE_ENDING } from "../utils/constants"; import AppendBlobHandler from "./AppendBlobHandler"; @@ -61,7 +61,7 @@ export class BlobBatchHandler { ) { const subRequestContextMiddleware = (req: IRequest, res: IResponse, locals: any, next: SubRequestNextFunction) => { const urlbuilder = URLBuilder.parse(req.getUrl()); - internnalBlobStorageContextMiddleware( + internalBlobStorageContextMiddleware( new BlobStorageContext(locals, DEFAULT_CONTEXT_PATH), req, res, diff --git a/src/blob/handlers/BlockBlobHandler.ts b/src/blob/handlers/BlockBlobHandler.ts index 97ad30838..025809987 100644 --- a/src/blob/handlers/BlockBlobHandler.ts +++ b/src/blob/handlers/BlockBlobHandler.ts @@ -304,7 +304,7 @@ export default class BlockBlobHandler parsed = await parseXML(rawBody, true); } catch (err) { // return the 400(InvalidXmlDocument) error for issue 1955 - throw StorageErrorFactory.getInvaidXmlDocument(context.contextId); + throw StorageErrorFactory.getInvalidXmlDocument(context.contextId); } // Validate selected block list diff --git a/src/blob/handlers/ServiceHandler.ts b/src/blob/handlers/ServiceHandler.ts index ae377ecc5..27a2d3f96 100644 --- a/src/blob/handlers/ServiceHandler.ts +++ b/src/blob/handlers/ServiceHandler.ts @@ -171,7 +171,7 @@ export default class ServiceHandler extends BaseHandler const blobCtx = new BlobStorageContext(context); const accountName = blobCtx.account!; - // TODO: deserializor has a bug that when cors is undefined, + // TODO: deserializer has a bug that when cors is undefined, // it will serialize it to empty array instead of undefined const body = blobCtx.request!.getBody(); const parsedBody = await parseXML(body || ""); diff --git a/src/blob/middlewares/blobStorageContext.middleware.ts b/src/blob/middlewares/blobStorageContext.middleware.ts index e325f5d5b..db992db10 100644 --- a/src/blob/middlewares/blobStorageContext.middleware.ts +++ b/src/blob/middlewares/blobStorageContext.middleware.ts @@ -41,7 +41,7 @@ export default function createStorageBlobContextMiddleware( * @param {Response} res An express compatible Response object * @param {NextFunction} next An express middleware next callback */ -export function internnalBlobStorageContextMiddleware( +export function internalBlobStorageContextMiddleware( blobContext: BlobStorageContext, req: IRequest, res: IResponse, @@ -121,7 +121,7 @@ export function internnalBlobStorageContextMiddleware( return next(handlerError); } - // validate conatainer name, when container name has value (not undefined or empty string) + // validate container name, when container name has value (not undefined or empty string) // skip validate system container if (container && !container.startsWith("$")) { validateContainerName(requestID, container); @@ -224,7 +224,7 @@ export function blobStorageContextMiddleware( return next(handlerError); } - // validate conatainer name, when container name has value (not undefined or empty string) + // validate container name, when container name has value (not undefined or empty string) // skip validate system container if (container && !container.startsWith("$")) { validateContainerName(requestID, container); diff --git a/src/blob/persistence/LokiBlobMetadataStore.ts b/src/blob/persistence/LokiBlobMetadataStore.ts index 21b041a6d..dbf231c9b 100644 --- a/src/blob/persistence/LokiBlobMetadataStore.ts +++ b/src/blob/persistence/LokiBlobMetadataStore.ts @@ -1193,7 +1193,7 @@ export default class LokiBlobMetadataStore validateReadConditions(context, modifiedAccessConditions, doc); - // When block blob don't have commited block, should return 404 + // When block blob don't have committed block, should return 404 if (!doc) { throw StorageErrorFactory.getBlobNotFound(context.contextId); } @@ -1468,7 +1468,7 @@ export default class LokiBlobMetadataStore undefined, context, false - ); // This may return an uncommitted blob, or undefined for an unexist blob + ); // This may return an uncommitted blob, or undefined for an nonexistent blob validateWriteConditions(context, options.modifiedAccessConditions, doc); @@ -1518,7 +1518,7 @@ export default class LokiBlobMetadataStore undefined, context, false - ); // This may return an uncommitted blob, or undefined for an unexist blob + ); // This may return an uncommitted blob, or undefined for an nonexistent blob validateWriteConditions(context, options.modifiedAccessConditions, doc); @@ -1568,7 +1568,7 @@ export default class LokiBlobMetadataStore undefined, context, false - ); // This may return an uncommitted blob, or undefined for an unexist blob + ); // This may return an uncommitted blob, or undefined for an nonexistent blob validateWriteConditions(context, options.modifiedAccessConditions, doc); @@ -1620,7 +1620,7 @@ export default class LokiBlobMetadataStore undefined, context, false - ); // This may return an uncommitted blob, or undefined for an unexist blob + ); // This may return an uncommitted blob, or undefined for an nonexistent blob validateWriteConditions(context, options.modifiedAccessConditions, doc); @@ -1670,7 +1670,7 @@ export default class LokiBlobMetadataStore undefined, context, false - ); // This may return an uncommitted blob, or undefined for an unexist blob + ); // This may return an uncommitted blob, or undefined for an nonexistent blob validateWriteConditions(context, options.modifiedAccessConditions, doc); @@ -2280,7 +2280,7 @@ export default class LokiBlobMetadataStore const coll = this.db.getCollection(this.BLOCKS_COLLECTION); - // If the new block ID does not have same length with before uncommited block ID, return failure. + // If the new block ID does not have same length with before uncommitted block ID, return failure. if (blobExist) { const existBlockDoc = coll.findOne({ accountName: block.accountName, @@ -3392,7 +3392,7 @@ export default class LokiBlobMetadataStore true ); - // When block blob don't have commited block, should return 404 + // When block blob don't have committed block, should return 404 if (!doc) { throw StorageErrorFactory.getBlobNotFound(context.contextId); } diff --git a/src/blob/persistence/SqlBlobMetadataStore.ts b/src/blob/persistence/SqlBlobMetadataStore.ts index b137eaf31..45666056f 100644 --- a/src/blob/persistence/SqlBlobMetadataStore.ts +++ b/src/blob/persistence/SqlBlobMetadataStore.ts @@ -1383,7 +1383,7 @@ export default class SqlBlobMetadataStore implements IBlobMetadataStore { ).validate(new BlobWriteLeaseValidator(leaseAccessConditions)); } - // If the new block ID does not have same length with before uncommited block ID, return failure. + // If the new block ID does not have same length with before uncommitted block ID, return failure. const existBlock = await BlocksModel.findOne({ attributes: ["blockName"], where: { diff --git a/src/common/Environment.ts b/src/common/Environment.ts index 47f0dd658..768c53402 100644 --- a/src/common/Environment.ts +++ b/src/common/Environment.ts @@ -65,7 +65,7 @@ args ) .option( ["", "disableProductStyleUrl"], - "Optional. Disable getting account name from the host of request Uri, always get account name from the first path segment of request Uri" + "Optional. Disable getting account name from the host of request URI, always get account name from the first path segment of request URI" ) .option(["", "oauth"], 'Optional. OAuth level. Candidate values: "basic"') .option(["", "cert"], "Optional. Path to certificate file") @@ -138,7 +138,7 @@ export default class Environment implements IEnvironment { if (this.flags.skipApiVersionCheck !== undefined) { return true; } - // default is false which will check API veresion + // default is false which will check API version return false; } @@ -146,7 +146,7 @@ export default class Environment implements IEnvironment { if (this.flags.disableProductStyleUrl !== undefined) { return true; } - // default is false which will try to get account name from request Uri hostname + // default is false which will try to get account name from request URI hostname return false; } diff --git a/src/common/persistence/IExtentMetadata.ts b/src/common/persistence/IExtentMetadata.ts index 595a2e845..4b7f6831b 100644 --- a/src/common/persistence/IExtentMetadata.ts +++ b/src/common/persistence/IExtentMetadata.ts @@ -14,7 +14,7 @@ export interface IExtentModel { } /** - * This interface is provided to arrange the loacal extent storage + * This interface is provided to arrange the local extent storage * * @export * @interface IExtentMetadata diff --git a/src/common/utils/constants.ts b/src/common/utils/constants.ts index 6bf50c37b..4ed88ae2d 100644 --- a/src/common/utils/constants.ts +++ b/src/common/utils/constants.ts @@ -18,7 +18,7 @@ export const IP_REGEX = new RegExp("^(?:[0-9]{1,3}\.){3}[0-9]{1,3}$"); // Otherwise, try to extract string before first dot, as account name. export const NO_ACCOUNT_HOST_NAMES = new Set().add("host.docker.internal"); -// Use utf8mb4_bin instead of utf8mb4_general_ci to honor case sensitive +// Use utf8mb4_bin instead of utf8mb4_general_ci to honor case-sensitive // https://dev.mysql.com/doc/refman/8.0/en/case-sensitivity.html export const DEFAULT_SQL_COLLATE = "utf8mb4_bin"; export const DEFAULT_SQL_OPTIONS = { diff --git a/src/common/utils/utils.ts b/src/common/utils/utils.ts index 12f47291a..8df02200f 100644 --- a/src/common/utils/utils.ts +++ b/src/common/utils/utils.ts @@ -13,7 +13,7 @@ export function minDate(date1: Date, date2: Date): Date { return date1 > date2 ? date2 : date1; } -// Blob Snapshot is has 7 digital for Milliseconds, but Datatime has Milliseconds with 3 digital. So need convert. +// Blob Snapshot is has 7 digital for Milliseconds, but Datetime has Milliseconds with 3 digital. So need convert. export function convertDateTimeStringMsTo7Digital( dateTimeString: string ): string { diff --git a/src/queue/QueueEnvironment.ts b/src/queue/QueueEnvironment.ts index de2c5752c..e169e6788 100644 --- a/src/queue/QueueEnvironment.ts +++ b/src/queue/QueueEnvironment.ts @@ -30,7 +30,7 @@ args ) .option( ["", "disableProductStyleUrl"], - "Optional. DDisable getting account name from the host of request Uri, always get account name from the first path segment of request Uri." + "Optional. Disable getting account name from the host of request URI, always get account name from the first path segment of request URI." ) .option( ["", "skipApiVersionCheck"], @@ -91,7 +91,7 @@ export default class QueueEnvironment implements IQueueEnvironment { if (this.flags.skipApiVersionCheck !== undefined) { return true; } - // default is false which will check API veresion + // default is false which will check API version return false; } @@ -115,7 +115,7 @@ export default class QueueEnvironment implements IQueueEnvironment { if (this.flags.disableProductStyleUrl !== undefined) { return true; } - // default is false which will try to get account name from request Uri hostname + // default is false which will try to get account name from request URI hostname return false; } diff --git a/src/queue/authentication/QueueSASAuthenticator.ts b/src/queue/authentication/QueueSASAuthenticator.ts index 463e20a67..0bedeabee 100644 --- a/src/queue/authentication/QueueSASAuthenticator.ts +++ b/src/queue/authentication/QueueSASAuthenticator.ts @@ -194,7 +194,7 @@ export default class QueueSASAuthenticator implements IAuthenticator { throw StorageErrorFactory.getAuthorizationFailure(context.contextID!); } - // As Azure Storage, SAS with indentifier should not contains any overlap values. + // As Azure Storage, SAS with identifier should not contains any overlap values. if ( values.startTime !== undefined || values.expiryTime !== undefined || diff --git a/src/queue/authentication/QueueSharedKeyAuthenticator.ts b/src/queue/authentication/QueueSharedKeyAuthenticator.ts index a6dc36378..6c779fd6f 100644 --- a/src/queue/authentication/QueueSharedKeyAuthenticator.ts +++ b/src/queue/authentication/QueueSharedKeyAuthenticator.ts @@ -105,7 +105,7 @@ export default class QueueSharedKeyAuthenticator implements IAuthenticator { if (context.context.isSecondary && queueContext.authenticationPath?.indexOf(account) === 1) { - // JS/.net Track2 SDK will generate stringToSign from IP style Uri with "-secondary" in authenticationPath, so will also compare signature with this kind stringToSign + // JS/.net Track2 SDK will generate stringToSign from IP style URI with "-secondary" in authenticationPath, so will also compare signature with this kind stringToSign const stringToSign_secondary: string = headersToSign + this.getCanonicalizedResourceString( diff --git a/src/queue/authentication/QueueTokenAuthenticator.ts b/src/queue/authentication/QueueTokenAuthenticator.ts index f2b0a0879..22e80a89d 100644 --- a/src/queue/authentication/QueueTokenAuthenticator.ts +++ b/src/queue/authentication/QueueTokenAuthenticator.ts @@ -225,7 +225,7 @@ export default class QueueTokenAuthenticator implements IAuthenticator { if (m !== null) { if (m[0] === aud) { if (m[1] !== undefined && m[1] !== queueContext.account) { - // If account name doesn't match for fine grained audiance + // If account name doesn't match for fine-grained audience break; } audMatch = true; diff --git a/src/queue/errors/StorageErrorFactory.ts b/src/queue/errors/StorageErrorFactory.ts index f564d9da8..be2d3f77e 100644 --- a/src/queue/errors/StorageErrorFactory.ts +++ b/src/queue/errors/StorageErrorFactory.ts @@ -55,17 +55,6 @@ export default class StorageErrorFactory { ); } - public static getInvaidXmlDocument( - contextID: string = defaultID - ): StorageError { - return new StorageError( - 400, - "InvaidXmlDocument", - `XML specified is not syntactically valid.`, - contextID - ); - } - public static corsPreflightFailure( contextID: string = defaultID, additionalMessages?: { [key: string]: string } @@ -86,7 +75,7 @@ export default class StorageErrorFactory { return new StorageError( 400, "InvalidUri", - "The specifed resource name contains invalid characters.", + "The specified resource name contains invalid characters.", contextID ); } @@ -315,7 +304,7 @@ export default class StorageErrorFactory { return new StorageError( 400, "InvalidResourceName", - `The specifed resource name contains invalid characters.`, + `The specified resource name contains invalid characters.`, contextID ); } diff --git a/src/queue/handlers/MessageIdHandler.ts b/src/queue/handlers/MessageIdHandler.ts index f00c5b7f4..1bd820a4d 100644 --- a/src/queue/handlers/MessageIdHandler.ts +++ b/src/queue/handlers/MessageIdHandler.ts @@ -51,7 +51,7 @@ export default class MessageIdHandler extends BaseHandler const messageId = queueCtx.messageId!; // TODO: Similar to enqueue, deserialize does not support the message text with only empty character. - // If the text is undefined, try to retrive it from the XML body here. + // If the text is undefined, try to retrieve it from the XML body here. if (queueMessage.messageText === undefined) { const body = queueCtx.request!.getBody(); const parsedBody = await parseXMLwithEmpty(body || ""); diff --git a/src/queue/handlers/MessagesHandler.ts b/src/queue/handlers/MessagesHandler.ts index 4be1192b7..6a9a2bc1a 100644 --- a/src/queue/handlers/MessagesHandler.ts +++ b/src/queue/handlers/MessagesHandler.ts @@ -188,7 +188,7 @@ export default class MessagesHandler extends BaseHandler const body = queueCtx.request!.getBody(); // TODO: deserialize does not support the message text with only empty character. - // If the text is undefined, try to retrive it from the XML body here. + // If the text is undefined, try to retrieve it from the XML body here. const parsedBody = await parseXMLwithEmpty(body || ""); for (const text in parsedBody) { if ( diff --git a/src/queue/handlers/QueueHandler.ts b/src/queue/handlers/QueueHandler.ts index 22133d6eb..9983b89e4 100644 --- a/src/queue/handlers/QueueHandler.ts +++ b/src/queue/handlers/QueueHandler.ts @@ -289,7 +289,7 @@ export default class QueueHandler extends BaseHandler implements IQueueHandler { } /** - * Parse and retrive the original metadata name headers array to preserve its case. + * Parse and retrieve the original metadata name headers array to preserve its case. * * @private * @param {({ [propertyName: string]: string } | undefined)} reqMetadata diff --git a/src/queue/handlers/ServiceHandler.ts b/src/queue/handlers/ServiceHandler.ts index ad754b6a8..cf55b4f35 100644 --- a/src/queue/handlers/ServiceHandler.ts +++ b/src/queue/handlers/ServiceHandler.ts @@ -5,8 +5,8 @@ import Context from "../generated/Context"; import IServiceHandler from "../generated/handlers/IServiceHandler"; import { parseXML } from "../generated/utils/xml"; import { - LIST_QUEUE_MAXRESSULTS_MAX, - LIST_QUEUE_MAXRESSULTS_MIN, + LIST_QUEUE_MAXRESULTS_MAX, + LIST_QUEUE_MAXRESULTS_MIN, QUEUE_API_VERSION } from "../utils/constants"; import BaseHandler from "./BaseHandler"; @@ -82,7 +82,7 @@ export default class ServiceHandler extends BaseHandler const queueCtx = new QueueStorageContext(context); const accountName = queueCtx.account!; - // TODO: deserializor has a bug that when cors is undefined, + // TODO: deserializer has a bug that when cors is undefined, // it will serialize it to empty array instead of undefined const body = queueCtx.request!.getBody(); const parsedBody = await parseXML(body || ""); @@ -204,16 +204,16 @@ export default class ServiceHandler extends BaseHandler let maxresults = this.LIST_QUEUES_MAX_RESULTS_DEFAULT; if (options.maxresults !== undefined) { if ( - options.maxresults < LIST_QUEUE_MAXRESSULTS_MIN || - options.maxresults > LIST_QUEUE_MAXRESSULTS_MAX + options.maxresults < LIST_QUEUE_MAXRESULTS_MIN || + options.maxresults > LIST_QUEUE_MAXRESULTS_MAX ) { throw StorageErrorFactory.getOutOfRangeQueryParameterValue( context.contextID, { QueryParameterName: "maxresults", QueryParameterValue: `${options.maxresults}`, - MinimumAllowed: `${LIST_QUEUE_MAXRESSULTS_MIN}`, - MaximumAllowed: `${LIST_QUEUE_MAXRESSULTS_MAX}` + MinimumAllowed: `${LIST_QUEUE_MAXRESULTS_MIN}`, + MaximumAllowed: `${LIST_QUEUE_MAXRESULTS_MAX}` } ); } diff --git a/src/queue/persistence/LokiQueueMetadataStore.ts b/src/queue/persistence/LokiQueueMetadataStore.ts index 56b376647..a93534c82 100644 --- a/src/queue/persistence/LokiQueueMetadataStore.ts +++ b/src/queue/persistence/LokiQueueMetadataStore.ts @@ -293,7 +293,7 @@ export default class LokiQueueMetadataStore implements IQueueMetadataStore { /** * Create a queue in persistency layer. - * Return 201 if create a new one, 204 if a same one exist, 409 error if a conflit one exist. + * Return 201 if create a new one, 204 if a same one exist, 409 error if a conflicting one exist. * @see https://docs.microsoft.com/en-us/rest/api/storageservices/create-queue4 * * @param {QueueModel} queue @@ -311,7 +311,7 @@ export default class LokiQueueMetadataStore implements IQueueMetadataStore { name: queue.name }); - // Check whether a conflication exists if there exist a queue with the given name. + // Check whether a conflict exists if there exist a queue with the given name. // If the exist queue has the same metadata as the given queue, then return 204, else throw 409 error. if (doc) { const docMeta = doc.metadata; @@ -348,7 +348,7 @@ export default class LokiQueueMetadataStore implements IQueueMetadataStore { } } - // Check if all the matadata of exist queue is the same as another. + // Check if all the metadata of exist queue is the same as another. for (const item in docMeta) { if (docMeta.hasOwnProperty(item)) { const queueMetaName = nameMap.get(item.toLowerCase()); diff --git a/src/queue/utils/constants.ts b/src/queue/utils/constants.ts index b990bc6f3..3af4b0b0f 100644 --- a/src/queue/utils/constants.ts +++ b/src/queue/utils/constants.ts @@ -18,8 +18,8 @@ export const LOGGER_CONFIGS = {}; export const DEFAULT_GC_INTERVAL_MS = 60 * 1000; export const NEVER_EXPIRE_DATE = new Date("9999-12-31T23:59:59.999Z"); export const QUEUE_SERVICE_PERMISSION = "raup"; -export const LIST_QUEUE_MAXRESSULTS_MIN = 1; -export const LIST_QUEUE_MAXRESSULTS_MAX = 2147483647; +export const LIST_QUEUE_MAXRESULTS_MIN = 1; +export const LIST_QUEUE_MAXRESULTS_MAX = 2147483647; export const DEFAULT_DEQUEUE_VISIBILITYTIMEOUT = 30; // 30s as default. export const DEQUEUE_VISIBILITYTIMEOUT_MIN = 1; export const DEQUEUE_VISIBILITYTIMEOUT_MAX = 604800; diff --git a/src/queue/utils/utils.ts b/src/queue/utils/utils.ts index e36fded0d..d1899e35a 100644 --- a/src/queue/utils/utils.ts +++ b/src/queue/utils/utils.ts @@ -179,7 +179,7 @@ export function getUTF8ByteSize(text: string): number { } /** - * Retrive the value from XML body without ignoring the empty characters. + * Retrieve the value from XML body without ignoring the empty characters. * * @export * @param {string} param diff --git a/src/table/ITableEnvironment.ts b/src/table/ITableEnvironment.ts index bbd0b2374..d1932d4bb 100644 --- a/src/table/ITableEnvironment.ts +++ b/src/table/ITableEnvironment.ts @@ -16,7 +16,7 @@ export default interface ITableEnvironment { loose(): boolean; /** Optional. Skip the request API version check request with all Api versions will be allowed */ skipApiVersionCheck(): boolean; - /** Optional. Disable getting account name from the host of request Uri, always get account name from the first path segment of request Uri. */ + /** Optional. Disable getting account name from the host of request URI, always get account name from the first path segment of request URI. */ disableProductStyleUrl(): boolean; /** Optional. Enable debug log by providing a valid local file, path as log destination path as log destination */ debug(): Promise; diff --git a/src/table/TableEnvironment.ts b/src/table/TableEnvironment.ts index bc4477a9e..73a7f735f 100644 --- a/src/table/TableEnvironment.ts +++ b/src/table/TableEnvironment.ts @@ -37,7 +37,7 @@ args ) .option( ["", "disableProductStyleUrl"], - "Optional. Disable getting account name from the host of request Uri, always get account name from the first path segment of request Uri." + "Optional. Disable getting account name from the host of request URI, always get account name from the first path segment of request URI." ) .option( ["", "inMemoryPersistence"], @@ -93,7 +93,7 @@ export default class TableEnvironment implements ITableEnvironment { if (this.flags.skipApiVersionCheck !== undefined) { return true; } - // default is false which will check API veresion + // default is false which will check API version return false; } @@ -101,7 +101,7 @@ export default class TableEnvironment implements ITableEnvironment { if (this.flags.disableProductStyleUrl !== undefined) { return true; } - // default is false which will try to get account name from request Uri hostname + // default is false which will try to get account name from request URI hostname return false; } diff --git a/src/table/authentication/TableSharedKeyAuthenticator.ts b/src/table/authentication/TableSharedKeyAuthenticator.ts index 7f98ab67f..bbded03fd 100644 --- a/src/table/authentication/TableSharedKeyAuthenticator.ts +++ b/src/table/authentication/TableSharedKeyAuthenticator.ts @@ -105,7 +105,7 @@ export default class TableSharedKeyAuthenticator implements IAuthenticator { if (context.context.isSecondary && tableContext.authenticationPath?.indexOf(account) === 1) { - // JS/.net Track2 SDK will generate stringToSign from IP style Uri with "-secondary" in authenticationPath, so will also compare signature with this kind stringToSign + // JS/.net Track2 SDK will generate stringToSign from IP style URI with "-secondary" in authenticationPath, so will also compare signature with this kind stringToSign const stringToSign_secondary: string = [ req.getMethod().toUpperCase(), diff --git a/src/table/authentication/TableSharedKeyLiteAuthenticator.ts b/src/table/authentication/TableSharedKeyLiteAuthenticator.ts index 8c3a6d9c4..91914a3ce 100644 --- a/src/table/authentication/TableSharedKeyLiteAuthenticator.ts +++ b/src/table/authentication/TableSharedKeyLiteAuthenticator.ts @@ -105,7 +105,7 @@ export default class TableSharedKeyLiteAuthenticator implements IAuthenticator { if (context.context.isSecondary && tableContext.authenticationPath?.indexOf(account) === 1) { - // JS/.net Track2 SDK will generate stringToSign from IP style Uri with "-secondary" in authenticationPath, so will also compare signature with this kind stringToSignconst stringToSign: string = + // JS/.net Track2 SDK will generate stringToSign from IP style URI with "-secondary" in authenticationPath, so will also compare signature with this kind stringToSignconst stringToSign: string = const stringToSign_secondary: string = [ this.getHeaderValueToSign(req, HeaderConstants.DATE) || diff --git a/src/table/authentication/TableTokenAuthenticator.ts b/src/table/authentication/TableTokenAuthenticator.ts index 548900de8..d1eb0426d 100644 --- a/src/table/authentication/TableTokenAuthenticator.ts +++ b/src/table/authentication/TableTokenAuthenticator.ts @@ -225,7 +225,7 @@ export default class TableTokenAuthenticator implements IAuthenticator { if (m !== null) { if (m[0] === aud) { if (m[1] !== undefined && m[1] !== tableContext.account) { - // If account name doesn't match for fine grained audiance + // If account name doesn't match for fine-grained audience break; } audMatch = true; diff --git a/src/table/batch/BatchErrorConstants.ts b/src/table/batch/BatchErrorConstants.ts index 25be2b935..17e3935f0 100644 --- a/src/table/batch/BatchErrorConstants.ts +++ b/src/table/batch/BatchErrorConstants.ts @@ -7,5 +7,5 @@ export default class BatchErrorConstants { public static readonly PROTOCOL_NULL = "Protocol null when calling getProtocol on BatchRequest"; public static readonly TOO_MANY_OPERATIONS = "0:The batch request operation exceeds the maximum 100 changes per change set."; public static readonly UNKNOWN_QUERYOPTION = "Unknown query options type."; - public static readonly URI_NULL = "Uri or path null when calling getUrl on BatchRequest."; + public static readonly URI_NULL = "URI or path null when calling getUrl on BatchRequest."; } \ No newline at end of file diff --git a/src/table/batch/BatchRequest.ts b/src/table/batch/BatchRequest.ts index 719149d62..e6067f24a 100644 --- a/src/table/batch/BatchRequest.ts +++ b/src/table/batch/BatchRequest.ts @@ -12,7 +12,7 @@ import BatchErrorConstants from "./BatchErrorConstants"; /* * Represents a request in the context of batch operations. * ToDo: Requires validation against all operation types - * Currently several funcitons of the interface are not implemented + * Currently several functions of the interface are not implemented * @export * @class BatchRequest * @implements {IRequest} @@ -108,7 +108,7 @@ export default class BatchRequest implements IRequest { // ToDo: here we also assume https, which is also not true... // we need to parse this from the request // return `https://${this.accountName}.${this.batchOperation.batchType}.core.windows.net/$batch`; - // in delete, it seems that we actuall expect the full uri + // in delete, it seems that we actually expect the full uri if (this.batchOperation.uri != null && this.batchOperation.path != null) { return this.batchOperation.uri; } else { diff --git a/src/table/batch/TableBatchOrchestrator.ts b/src/table/batch/TableBatchOrchestrator.ts index c1ceca892..a30215521 100644 --- a/src/table/batch/TableBatchOrchestrator.ts +++ b/src/table/batch/TableBatchOrchestrator.ts @@ -349,9 +349,9 @@ export default class TableBatchOrchestrator { /** * Creates a clone of the context for the batch operation. - * Becuase the context that we have will not work with the calls and needs + * Because the context that we have will not work with the calls and needs * updating for batch operations. - * We use a deep clone, as each request needs to be treated seaprately. + * We use a deep clone, as each request needs to be treated separately. * * @private * @param {Context} context @@ -623,7 +623,7 @@ export default class TableBatchOrchestrator { ); return { - __return: this.serialization.serializeTablMergeEntityBatchResponse( + __return: this.serialization.serializeTableMergeEntityBatchResponse( request, response ), @@ -697,7 +697,7 @@ export default class TableBatchOrchestrator { /** * Replace Double ticks for single ticks without replaceAll string prototype - * function, becuase node 14 does not support it. + * function, because node 14 does not support it. * @param key * @returns */ diff --git a/src/table/batch/TableBatchSerialization.ts b/src/table/batch/TableBatchSerialization.ts index b00017fcc..40205f1b3 100644 --- a/src/table/batch/TableBatchSerialization.ts +++ b/src/table/batch/TableBatchSerialization.ts @@ -54,7 +54,7 @@ export class TableBatchSerialization extends BatchSerialization { subRequests = splitBody; } - // This goes through each operation in the the request and maps the content + // This goes through each operation in the request and maps the content // of the request by deserializing it into a BatchOperation Type const batchOperations: TableBatchOperation[] = subRequests.map( (subRequest) => { @@ -286,7 +286,7 @@ export class TableBatchSerialization extends BatchSerialization { * @return {*} {string} * @memberof TableBatchSerialization */ - public serializeTablMergeEntityBatchResponse( + public serializeTableMergeEntityBatchResponse( request: BatchRequest, response: Models.TableMergeEntityResponse ): string { @@ -597,24 +597,24 @@ export class TableBatchSerialization extends BatchSerialization { contentID: number, request: BatchRequest ): string { - let errorReponse = ""; + let errorResponse = ""; const odataError = err as StorageError; // Errors in batch processing generate Bad Request error - errorReponse = this.serializeHttpStatusCode(errorReponse, err.statusCode); - errorReponse += "Content-ID: " + contentID + "\r\n"; - errorReponse = this.serializeDataServiceVersion(errorReponse, request); + errorResponse = this.serializeHttpStatusCode(errorResponse, err.statusCode); + errorResponse += "Content-ID: " + contentID + "\r\n"; + errorResponse = this.serializeDataServiceVersion(errorResponse, request); // ToDo: Check if we need to observe other odata formats for errors - errorReponse += + errorResponse += "Content-Type: application/json;odata=minimalmetadata;charset=utf-8\r\n"; - errorReponse += "\r\n"; + errorResponse += "\r\n"; // the odata error needs to include the index of the operation that fails // see sample from: // https://docs.microsoft.com/en-us/rest/api/storageservices/performing-entity-group-transactions#sample-error-response // In this case, we need to use a 0 based index for the failing operation - errorReponse += + errorResponse += odataError.body?.replace('"value":"', `\"value\":\"${contentID - 1}:`) + "\r\n"; - return errorReponse; + return errorResponse; } /** @@ -633,24 +633,24 @@ export class TableBatchSerialization extends BatchSerialization { "changeset", "changesetresponse" ); - let errorReponse = ""; + let errorResponse = ""; - errorReponse += changesetBoundary + "\r\n"; + errorResponse += changesetBoundary + "\r\n"; // Errors in batch processing generate Bad Request error - errorReponse = this.serializeHttpStatusCode(errorReponse, 400); - errorReponse = this.SerializeXContentTypeOptions(errorReponse); - errorReponse = this.serializeDataServiceVersion(errorReponse, undefined); + errorResponse = this.serializeHttpStatusCode(errorResponse, 400); + errorResponse = this.SerializeXContentTypeOptions(errorResponse); + errorResponse = this.serializeDataServiceVersion(errorResponse, undefined); // ToDo: Serialize Content type etc - errorReponse += + errorResponse += "Content-Type: application/json;odata=minimalmetadata;charset=utf-8\r\n"; - errorReponse += "\r\n"; + errorResponse += "\r\n"; let requestIdResponseString = ""; if (requestId !== undefined) { requestIdResponseString = `RequestId:${requestId}\\n`; } // 2021-04-23T12:40:31.4944778 const date = truncatedISO8061Date(new Date(), true); - errorReponse += `{\"odata.error\":{\"code\":\"InvalidInput\",\"message\":{\"lang\":\"en-US\",\"value\":\"${odataErrorString}\\n${requestIdResponseString}Time:${date}\"}}}\r\n`; - return errorReponse; + errorResponse += `{\"odata.error\":{\"code\":\"InvalidInput\",\"message\":{\"lang\":\"en-US\",\"value\":\"${odataErrorString}\\n${requestIdResponseString}Time:${date}\"}}}\r\n`; + return errorResponse; } } diff --git a/src/table/entity/EntityProperty.ts b/src/table/entity/EntityProperty.ts index 94a850809..45c7b353b 100644 --- a/src/table/entity/EntityProperty.ts +++ b/src/table/entity/EntityProperty.ts @@ -30,7 +30,7 @@ export function toAnnotationLevel(level: string): AnnotationLevel { case NO_METADATA_ACCEPT: return AnnotationLevel.NO; default: - throw TypeError(`Invalid OData annonation level ${level}.`); + throw TypeError(`Invalid OData annotation level ${level}.`); } } diff --git a/src/table/errors/StorageError.ts b/src/table/errors/StorageError.ts index eac709909..cd75395e5 100644 --- a/src/table/errors/StorageError.ts +++ b/src/table/errors/StorageError.ts @@ -41,11 +41,11 @@ export default class StorageError extends MiddlewareError { storageAdditionalErrorMessages: { [key: string]: string } = {}, context: Context ) { - const pyaload = getPayloadFormat(context); + const payload = getPayloadFormat(context); const isJSON = - pyaload === NO_METADATA_ACCEPT || - pyaload === MINIMAL_METADATA_ACCEPT || - pyaload === FULL_METADATA_ACCEPT; + payload === NO_METADATA_ACCEPT || + payload === MINIMAL_METADATA_ACCEPT || + payload === FULL_METADATA_ACCEPT; const bodyInJSON: any = isJSON ? { @@ -81,7 +81,7 @@ export default class StorageError extends MiddlewareError { "x-ms-version": TABLE_API_VERSION }, body, - isJSON ? `${pyaload};streaming=true;charset=utf-8` : "application/xml" + isJSON ? `${payload};streaming=true;charset=utf-8` : "application/xml" ); this.name = "StorageError"; diff --git a/src/table/errors/StorageErrorFactory.ts b/src/table/errors/StorageErrorFactory.ts index d84a1a834..d9638860c 100644 --- a/src/table/errors/StorageErrorFactory.ts +++ b/src/table/errors/StorageErrorFactory.ts @@ -298,7 +298,7 @@ export default class StorageErrorFactory { return new StorageError( 400, "", - `The specifed resource name contains invalid characters.`, + `The specified resource name contains invalid characters.`, context.contextID || defaultID, undefined, context diff --git a/src/table/handlers/ServiceHandler.ts b/src/table/handlers/ServiceHandler.ts index 51bd3e003..6fe1ad820 100644 --- a/src/table/handlers/ServiceHandler.ts +++ b/src/table/handlers/ServiceHandler.ts @@ -94,7 +94,7 @@ export default class ServiceHandler const tableCtx = new TableStorageContext(context); const accountName = tableCtx.account!; - // TODO: deserializor has a bug that when cors is undefined, + // TODO: deserializer has a bug that when cors is undefined, // it will serialize it to empty array instead of undefined const body = tableCtx.request!.getBody(); const parsedBody = await parseXML(body || ""); diff --git a/src/table/handlers/TableHandler.ts b/src/table/handlers/TableHandler.ts index 699ecc342..183418659 100644 --- a/src/table/handlers/TableHandler.ts +++ b/src/table/handlers/TableHandler.ts @@ -187,7 +187,7 @@ export default class TableHandler extends BaseHandler implements ITableHandler { const prefer = this.getAndCheckPreferHeader(tableContext); this.checkBodyLimit(context, context.request?.getBody()); - // curently unable to use checking functions as the partitionKey + // currently unable to use checking functions as the partitionKey // and rowKey are not coming through the context. // const partitionKey = this.getAndCheckPartitionKey(tableContext); // const rowKey = this.getAndCheckRowKey(tableContext); diff --git a/src/table/persistence/ITableMetadataStore.ts b/src/table/persistence/ITableMetadataStore.ts index 8e5f8fde6..3248e4c5d 100644 --- a/src/table/persistence/ITableMetadataStore.ts +++ b/src/table/persistence/ITableMetadataStore.ts @@ -9,7 +9,7 @@ interface IServiceAdditionalProperties { export type ServicePropertiesModel = Models.TableServiceProperties & IServiceAdditionalProperties; -// Since the host name may change, we don't store host in {@code odatametadata, odatatid} +// Since the host name may change, we don't store host in {@code odatametadata, odataid} export interface IOdataAnnotations { odatametadata: string; odatatype: string; diff --git a/src/table/persistence/LokiTableMetadataStore.ts b/src/table/persistence/LokiTableMetadataStore.ts index 55186ee5d..88cb09503 100644 --- a/src/table/persistence/LokiTableMetadataStore.ts +++ b/src/table/persistence/LokiTableMetadataStore.ts @@ -54,7 +54,7 @@ export default class LokiTableMetadataStore implements ITableMetadataStore { this.createTablesCollection(); this.createServicePropsCollection(); await this.saveDBState(); - this.finalizeInitializionState(); + this.finalizeInitializationState(); } /** @@ -111,7 +111,7 @@ export default class LokiTableMetadataStore implements ITableMetadataStore { public async createTable(context: Context, tableModel: Table): Promise { // Check for table entry in the table registry collection const coll = this.db.getCollection(this.TABLES_COLLECTION); - // Azure Storage Service is case insensitive + // Azure Storage Service is case-insensitive tableModel.table = tableModel.table; this.checkIfTableExists(coll, tableModel, context); @@ -136,7 +136,7 @@ export default class LokiTableMetadataStore implements ITableMetadataStore { ): Promise { // remove table reference from collection registry const coll = this.db.getCollection(this.TABLES_COLLECTION); - // Azure Storage Service is case insensitive + // Azure Storage Service is case-insensitive const tableLower = table.toLocaleLowerCase(); const doc = coll.findOne({ account, @@ -165,7 +165,7 @@ export default class LokiTableMetadataStore implements ITableMetadataStore { tableACL?: TableACL ): Promise { const coll = this.db.getCollection(this.TABLES_COLLECTION); - // Azure Storage Service is case insensitive + // Azure Storage Service is case-insensitive const tableLower = table.toLocaleLowerCase(); const persistedTable = coll.findOne({ account, @@ -195,7 +195,7 @@ export default class LokiTableMetadataStore implements ITableMetadataStore { context: Context ): Promise
{ const coll = this.db.getCollection(this.TABLES_COLLECTION); - // Azure Storage Service is case insensitive + // Azure Storage Service is case-insensitive const doc = coll.findOne({ account, table: { $regex: [`^${table}$`, "i"] } @@ -607,7 +607,7 @@ export default class LokiTableMetadataStore implements ITableMetadataStore { this.transactionRollbackTheseEntities.length > 0 || this.transactionDeleteTheseEntities.length > 0 ) { - throw new Error("Transaction Overlapp!"); + throw new Error("Transaction Overlap!"); } } @@ -651,7 +651,7 @@ export default class LokiTableMetadataStore implements ITableMetadataStore { * @private * @memberof LokiTableMetadataStore */ - private finalizeInitializionState() { + private finalizeInitializationState() { this.initialized = true; this.closed = false; } @@ -805,8 +805,8 @@ export default class LokiTableMetadataStore implements ITableMetadataStore { } /** - * Gets the collection of entites for a specific table. - * Ensures that table name is case insensitive. + * Gets the collection of entities for a specific table. + * Ensures that table name is case-insensitive. * * @private * @param {string} account @@ -990,7 +990,7 @@ export default class LokiTableMetadataStore implements ITableMetadataStore { encodedIfMatch === "*" || (encodedIfMatch !== undefined && encodedEtag === encodedIfMatch) ) { - const mergedDEntity: Entity = { + const mergedEntity: Entity = { ...doc, ...entity, properties: { @@ -1007,14 +1007,14 @@ export default class LokiTableMetadataStore implements ITableMetadataStore { } const value = entity.properties[key]; - mergedDEntity.properties[key] = value; + mergedEntity.properties[key] = value; - this.filterOdataMetaData(entity, key, mergedDEntity); + this.filterOdataMetaData(entity, key, mergedEntity); } } - tableEntityCollection.update(mergedDEntity); - return mergedDEntity; + tableEntityCollection.update(mergedEntity); + return mergedEntity; } throw StorageErrorFactory.getPreconditionFailed(context); } @@ -1022,13 +1022,13 @@ export default class LokiTableMetadataStore implements ITableMetadataStore { private filterOdataMetaData( entity: Entity, key: string, - mergedDEntity: Entity + mergedEntity: Entity ) { if (entity.properties[`${key}${ODATA_TYPE}`] !== undefined) { - mergedDEntity.properties[`${key}${ODATA_TYPE}`] = + mergedEntity.properties[`${key}${ODATA_TYPE}`] = entity.properties[`${key}${ODATA_TYPE}`]; } else { - delete mergedDEntity.properties[`${key}${ODATA_TYPE}`]; + delete mergedEntity.properties[`${key}${ODATA_TYPE}`]; } } diff --git a/src/table/utils/constants.ts b/src/table/utils/constants.ts index 3dc443a2d..b9d1d78b1 100644 --- a/src/table/utils/constants.ts +++ b/src/table/utils/constants.ts @@ -21,7 +21,7 @@ export const TABLE_API_VERSION = "2024-08-04"; export const VERSION = "3.31.0"; // Max Body size is 4 MB export const BODY_SIZE_MAX = 1024 * 1024 * 4; -// Max Entity sizxe is 1 MB +// Max Entity size is 1 MB export const ENTITY_SIZE_MAX = 1024 * 1024; export const HeaderConstants = { diff --git a/swagger/queue.md b/swagger/queue.md index 44bfbbee0..26e419ba1 100644 --- a/swagger/queue.md +++ b/swagger/queue.md @@ -20,4 +20,4 @@ enum-types: true 1. Remove minimum/maximum limitation for "VisibilityTimeout" and "VisibilityTimeoutRequired". -2. Remove "required" section from defination "AccessPolicy" to align with server behavior. +2. Remove "required" section from definition "AccessPolicy" to align with server behavior. diff --git a/tests/blob/RequestPolicy/OPTIONSRequestPolicyFactory.ts b/tests/blob/RequestPolicy/OPTIONSRequestPolicyFactory.ts index 57e042fcc..a96d8d60a 100644 --- a/tests/blob/RequestPolicy/OPTIONSRequestPolicyFactory.ts +++ b/tests/blob/RequestPolicy/OPTIONSRequestPolicyFactory.ts @@ -5,12 +5,12 @@ import { BaseRequestPolicy, WebResource } from "@azure/storage-blob"; export default class OPTIONSRequestPolicyFactory { // Constructor to accept parameters private origin: string | undefined; - private requstMethod: string | undefined; + private requestMethod: string | undefined; private requestHeaders: string | undefined; - constructor(origin?: string, requstMethod?: string, requestHeaders?: string) { + constructor(origin?: string, requestMethod?: string, requestHeaders?: string) { this.origin = origin; - this.requstMethod = requstMethod; + this.requestMethod = requestMethod; this.requestHeaders = requestHeaders; } @@ -20,7 +20,7 @@ export default class OPTIONSRequestPolicyFactory { nextPolicy, options, this.origin, - this.requstMethod, + this.requestMethod, this.requestHeaders ); } @@ -29,18 +29,18 @@ export default class OPTIONSRequestPolicyFactory { // Create a policy by extending from Azure.BaseRequestPolicy class OPTIONSRequestPolicy extends BaseRequestPolicy { private origin: string | undefined; - private requstMethod: string | undefined; + private requestMethod: string | undefined; private requestHeaders: string | undefined; constructor( nextPolicy: any, options: any, origin?: string, - requstMethod?: string, + requestMethod?: string, requestHeaders?: string ) { super(nextPolicy, options); this.origin = origin; - this.requstMethod = requstMethod; + this.requestMethod = requestMethod; this.requestHeaders = requestHeaders; } @@ -52,10 +52,10 @@ class OPTIONSRequestPolicy extends BaseRequestPolicy { if (this.origin !== undefined) { request.headers.set("Origin", `${this.origin}`); } - if (this.requstMethod !== undefined) { + if (this.requestMethod !== undefined) { request.headers.set( "Access-Control-Request-Method", - `${this.requstMethod}` + `${this.requestMethod}` ); } if (this.requestHeaders !== undefined) { diff --git a/tests/blob/RequestPolicy/QueryRequestPolicyFactory.ts b/tests/blob/RequestPolicy/QueryRequestPolicyFactory.ts index 22996816b..99d3d4fc1 100644 --- a/tests/blob/RequestPolicy/QueryRequestPolicyFactory.ts +++ b/tests/blob/RequestPolicy/QueryRequestPolicyFactory.ts @@ -1,6 +1,6 @@ import { BaseRequestPolicy, WebResource } from "@azure/storage-blob"; -// Replace the Query in Uri, from old value to new value. This need run with SAS authentication. +// Replace the Query in URI, from old value to new value. This need run with SAS authentication. // Create a policy factory with create() method provided // In TypeScript, following factory class needs to implement Azure.RequestPolicyFactory type export default class QueryRequestPolicyFactory { diff --git a/tests/blob/apis/blob.test.ts b/tests/blob/apis/blob.test.ts index 51325c3b1..ac07bc396 100644 --- a/tests/blob/apis/blob.test.ts +++ b/tests/blob/apis/blob.test.ts @@ -73,7 +73,7 @@ describe("BlobAPIs", () => { await containerClient.delete(); }); - it("download with with default parameters @loki @sql", async () => { + it("download with default parameters @loki @sql", async () => { const result = await blobClient.download(0); assert.deepStrictEqual(await bodyToString(result, content.length), content); assert.equal(result.contentRange, undefined); @@ -295,7 +295,7 @@ describe("BlobAPIs", () => { it("delete should work for valid ifNoneMatch @loki @sql", async () => { const result = await blobClient.delete({ conditions: { - ifNoneMatch: "unmatchetag" + ifNoneMatch: "unmatchedetag" } }); assert.equal( @@ -1762,7 +1762,7 @@ describe("BlobAPIs", () => { let blockBlobClient1 = containerClient.getBlockBlobClient(blockBlobName1); await blockBlobClient1.upload(content, content.length); - // tag acount should <= 10 + // tag count should <= 10 const tooManyTags = { tag1: "val1", tag2: "val2", @@ -1954,11 +1954,11 @@ describe("BlobAPIs", () => { // TODO: implement the case later }); - it("Break Lease on Infinite Lease, if give valid breakPeriod, should be broken after breadperiod @loki @sql", async () => { + it("Break Lease on Infinite Lease, if give valid breakPeriod, should be broken after breakperiod @loki @sql", async () => { // TODO: implement the case later }); - it("Break Lease on Infinite Lease, if not give breakPeriod, should be broken immidiately @loki @sql", async () => { + it("Break Lease on Infinite Lease, if not give breakPeriod, should be broken immediately @loki @sql", async () => { // TODO: implement the case later }); diff --git a/tests/blob/apis/blockblob.test.ts b/tests/blob/apis/blockblob.test.ts index 35845deae..b483a2e7a 100644 --- a/tests/blob/apis/blockblob.test.ts +++ b/tests/blob/apis/blockblob.test.ts @@ -164,7 +164,7 @@ describe("BlockBlobAPIs", () => { ); await blockBlobClient.stageBlock(base64encode("2"), body, body.length); - // TODO: azure/storage-blob 12.9.0 will fail on list uncimmited blob from container, will skip following code until this is fix in SDK or Azurite + // TODO: azure/storage-blob 12.9.0 will fail on list uncommitted blob from container, will skip following code until this is fix in SDK or Azurite // const listBlobResponse = await ( // await containerClient // .listBlobsFlat({ includeUncommitedBlobs: true }) @@ -196,7 +196,7 @@ describe("BlockBlobAPIs", () => { await blockBlobClient.stageBlock(base64encode("1"), body, body.length); - // TODO: azure/storage-blob 12.9.0 will fail on list uncimmited blob from container, will skip following code until this is fix in SDK or Azurite + // TODO: azure/storage-blob 12.9.0 will fail on list uncommitted blob from container, will skip following code until this is fix in SDK or Azurite // const listBlobResponse = ( // await containerClient // .listBlobsFlat({ includeUncommitedBlobs: true }) @@ -480,7 +480,7 @@ describe("BlockBlobAPIs", () => { await blockBlobClient.stageBlock(base64encode("1"), body, body.length); await blockBlobClient.stageBlock(base64encode("2"), body, body.length); - // Getproperties on a block blob without commited block will return 404 + // Getproperties on a block blob without committed block will return 404 let err; try { await blockBlobClient.getProperties(); @@ -489,7 +489,7 @@ describe("BlockBlobAPIs", () => { } assert.deepStrictEqual(err.statusCode, 404); - // Stage block with block Id length different than the exist uncommited blocks will fail with 400 + // Stage block with block Id length different than the exist uncommitted blocks will fail with 400 try { await blockBlobClient.stageBlock(base64encode("123"), body, body.length); } catch (error) { @@ -529,7 +529,7 @@ describe("BlockBlobAPIs", () => { assert.equal(listResponse.uncommittedBlocks![0].size, body.length); }); - it("getBlockList for non-existent blob @loki @sql", async () => { + it("getBlockList for nonexistent blob @loki @sql", async () => { try { await blockBlobClient.getBlockList("committed"); } catch (error) { @@ -539,7 +539,7 @@ describe("BlockBlobAPIs", () => { assert.fail(); }); - it("getBlockList for non-existent container @loki @sql", async () => { + it("getBlockList for nonexistent container @loki @sql", async () => { const fakeContainer = getUniqueName("container"); const fakeContainerClient = serviceClient.getContainerClient(fakeContainer); const fakeBlobClient = fakeContainerClient.getBlobClient(blobName); @@ -632,7 +632,7 @@ describe("BlockBlobAPIs", () => { try { await destBlobClient.beginCopyFromURL(sourceURLWithoutPermission); - assert.fail("Copy without required permision should fail"); + assert.fail("Copy without required permission should fail"); } catch (ex) { assert.deepStrictEqual(ex.statusCode, 403); diff --git a/tests/blob/apis/container.test.ts b/tests/blob/apis/container.test.ts index 64cf39880..ca9aa039a 100644 --- a/tests/blob/apis/container.test.ts +++ b/tests/blob/apis/container.test.ts @@ -563,7 +563,7 @@ describe("ContainerAPIs", () => { } }); - // TODO: azure/storage-blob 12.9.0 will fail on list uncimmited blob from container, will skip the case until this is fix in SDK or Azurite + // TODO: azure/storage-blob 12.9.0 will fail on list uncommitted blob from container, will skip the case until this is fix in SDK or Azurite it.skip("should only show uncommitted blobs in listBlobFlatSegment with uncommittedblobs option @loki @sql", async () => { const blobClient = containerClient.getBlobClient( getUniqueName("uncommittedblob") @@ -1121,7 +1121,7 @@ describe("ContainerAPIs", () => { assert.ok(result); assert.equal(result.segment.blobItems.length, 4); - // list with mutiple include + // list with multiple include // create container client for pipeline = newPipeline( new AnonymousCredential(), @@ -1138,7 +1138,7 @@ describe("ContainerAPIs", () => { ContainerClientForOptions = serviceClientForOptions.getContainerClient(containerName); - // list blob with mutiple include + // list blob with multiple include result = ( await ContainerClientForOptions .listBlobsFlat({ @@ -1151,7 +1151,7 @@ describe("ContainerAPIs", () => { assert.equal(result.segment.blobItems.length, 4); }); - // Skip the case currently since js sdk caculate the stringToSign with "+" in prefix instead of decode to space + // Skip the case currently since js sdk calculate the stringToSign with "+" in prefix instead of decode to space it.skip("List blob should success with '+' in query @loki @sql", async () => { const blobClients = []; let blobNames: Array = [ diff --git a/tests/blob/apis/pageblob.test.ts b/tests/blob/apis/pageblob.test.ts index eb9bdfb27..ac6ed07d2 100644 --- a/tests/blob/apis/pageblob.test.ts +++ b/tests/blob/apis/pageblob.test.ts @@ -68,10 +68,10 @@ describe("PageBlobAPIs", () => { }); it("create with default parameters @loki", async () => { - const reuslt_create = await pageBlobClient.create(512); + const result_create = await pageBlobClient.create(512); assert.equal( - reuslt_create._response.request.headers.get("x-ms-client-request-id"), - reuslt_create.clientRequestId + result_create._response.request.headers.get("x-ms-client-request-id"), + result_create.clientRequestId ); const result = await blobClient.download(0); diff --git a/tests/blob/apis/service.test.ts b/tests/blob/apis/service.test.ts index a79884450..1f52e86d9 100644 --- a/tests/blob/apis/service.test.ts +++ b/tests/blob/apis/service.test.ts @@ -413,7 +413,7 @@ describe("ServiceAPIs", () => { }); // fix issue 2382, 2416 - it("ListContainers without include metadata should not return contaienr metadata. @loki @sql", async () => { + it("ListContainers without include metadata should not return container metadata. @loki @sql", async () => { const containerNamePrefix = getUniqueName("container"); const containerName1 = `${containerNamePrefix}x1`; const containerName2 = `${containerNamePrefix}x2`; @@ -467,7 +467,7 @@ describe("ServiceAPIs", () => { ); }); - it("Get Account/Service Properties with Uri has suffix '/' after account name @loki @sql", async () => { + it("Get Account/Service Properties with URI has suffix '/' after account name @loki @sql", async () => { const baseURL1 = `http://${server.config.host}:${server.config.port}/devstoreaccount1/`; const serviceClient1 = new BlobServiceClient( baseURL1, diff --git a/tests/blob/blobCorsRequest.test.ts b/tests/blob/blobCorsRequest.test.ts index a2daa1188..cd54d667f 100644 --- a/tests/blob/blobCorsRequest.test.ts +++ b/tests/blob/blobCorsRequest.test.ts @@ -352,7 +352,7 @@ describe("Blob Cors requests test", () => { // No match let origin = "test"; let requestMethod = "GET"; - let reqestHeaders = "head"; + let requestHeaders = "head"; let pipeline = newPipeline( new StorageSharedKeyCredential( @@ -366,7 +366,7 @@ describe("Blob Cors requests test", () => { } ); pipeline.factories.unshift( - new OPTIONSRequestPolicyFactory(origin, requestMethod, reqestHeaders) + new OPTIONSRequestPolicyFactory(origin, requestMethod, requestHeaders) ); let serviceClientForOptions = new BlobServiceClient(baseURL, pipeline); @@ -387,7 +387,7 @@ describe("Blob Cors requests test", () => { // Match first cors. origin = "test"; requestMethod = "GET"; - reqestHeaders = "header"; + requestHeaders = "header"; pipeline = newPipeline( new StorageSharedKeyCredential( @@ -401,7 +401,7 @@ describe("Blob Cors requests test", () => { } ); pipeline.factories.unshift( - new OPTIONSRequestPolicyFactory(origin, requestMethod, reqestHeaders) + new OPTIONSRequestPolicyFactory(origin, requestMethod, requestHeaders) ); serviceClientForOptions = new BlobServiceClient(baseURL, pipeline); @@ -411,7 +411,7 @@ describe("Blob Cors requests test", () => { // Match second cors. origin = "test"; requestMethod = "PUT"; - reqestHeaders = "head"; + requestHeaders = "head"; pipeline = newPipeline( new StorageSharedKeyCredential( @@ -425,7 +425,7 @@ describe("Blob Cors requests test", () => { } ); pipeline.factories.unshift( - new OPTIONSRequestPolicyFactory(origin, requestMethod, reqestHeaders) + new OPTIONSRequestPolicyFactory(origin, requestMethod, requestHeaders) ); serviceClientForOptions = new BlobServiceClient(baseURL, pipeline); @@ -435,7 +435,7 @@ describe("Blob Cors requests test", () => { // No match. origin = "test"; requestMethod = "POST"; - reqestHeaders = "hea"; + requestHeaders = "hea"; pipeline = newPipeline( new StorageSharedKeyCredential( @@ -449,7 +449,7 @@ describe("Blob Cors requests test", () => { } ); pipeline.factories.unshift( - new OPTIONSRequestPolicyFactory(origin, requestMethod, reqestHeaders) + new OPTIONSRequestPolicyFactory(origin, requestMethod, requestHeaders) ); serviceClientForOptions = new BlobServiceClient(baseURL, pipeline); @@ -470,7 +470,7 @@ describe("Blob Cors requests test", () => { // Match third cors. origin = "test"; requestMethod = "POST"; - reqestHeaders = "headerheader"; + requestHeaders = "headerheader"; pipeline = newPipeline( new StorageSharedKeyCredential( @@ -484,7 +484,7 @@ describe("Blob Cors requests test", () => { } ); pipeline.factories.unshift( - new OPTIONSRequestPolicyFactory(origin, requestMethod, reqestHeaders) + new OPTIONSRequestPolicyFactory(origin, requestMethod, requestHeaders) ); serviceClientForOptions = new BlobServiceClient(baseURL, pipeline); @@ -492,7 +492,7 @@ describe("Blob Cors requests test", () => { assert.ok(res._response.status === 200); }); - it("OPTIONS request should work with matching rule containing Origion * @loki @sql", async () => { + it("OPTIONS request should work with matching rule containing Origin * @loki @sql", async () => { const serviceProperties = await serviceClient.getProperties(); const newCORS = { @@ -787,7 +787,7 @@ describe("Blob Cors requests test", () => { const serviceClientWithOrigin = new BlobServiceClient(baseURL, pipeline); const containerClientWithOrigin = - serviceClientWithOrigin.getContainerClient("notexistcontainer"); + serviceClientWithOrigin.getContainerClient("nonexistentcontainer"); try { await containerClientWithOrigin.getProperties(); diff --git a/tests/blob/conditions.test.ts b/tests/blob/conditions.test.ts index a155b4217..388535752 100644 --- a/tests/blob/conditions.test.ts +++ b/tests/blob/conditions.test.ts @@ -167,7 +167,7 @@ describe("ConditionResourceAdapter", () => { }); describe("ReadConditionalHeadersValidator for exist resource", () => { - it("Should return 412 preconditoin failed for failed if-match results @loki @sql", () => { + it("Should return 412 precondition failed for failed if-match results @loki @sql", () => { const validator = new ReadConditionalHeadersValidator(); const modifiedAccessConditions = { ifMatch: "etag1" }; const blobModel = { @@ -202,7 +202,7 @@ describe("ReadConditionalHeadersValidator for exist resource", () => { assert.fail(); }); - it("Should not return 412 preconditoin failed for successful if-match results @loki @sql", () => { + it("Should not return 412 precondition failed for successful if-match results @loki @sql", () => { const validator = new ReadConditionalHeadersValidator(); const modifiedAccessConditions = { ifMatch: "etag1" }; const blobModel = { @@ -364,7 +364,7 @@ describe("ReadConditionalHeadersValidator for exist resource", () => { ); }); - it("Should return 412 preconditoin failed for failed if-unmodified-since results @loki @sql", () => { + it("Should return 412 precondition failed for failed if-unmodified-since results @loki @sql", () => { const validator = new ReadConditionalHeadersValidator(); const modifiedAccessConditions = { ifUnmodifiedSince: new Date("2019/01/01") @@ -401,7 +401,7 @@ describe("ReadConditionalHeadersValidator for exist resource", () => { assert.fail(); }); - it("Should not return 412 preconditoin failed when if-unmodified-since same with lastModified @loki @sql", () => { + it("Should not return 412 precondition failed when if-unmodified-since same with lastModified @loki @sql", () => { const validator = new ReadConditionalHeadersValidator(); const modifiedAccessConditions = { ifUnmodifiedSince: new Date("2019/01/01") @@ -420,7 +420,7 @@ describe("ReadConditionalHeadersValidator for exist resource", () => { ); }); - it("Should not return 412 preconditoin failed for successful if-unmodified-since results @loki @sql", () => { + it("Should not return 412 precondition failed for successful if-unmodified-since results @loki @sql", () => { const validator = new ReadConditionalHeadersValidator(); const modifiedAccessConditions = { ifUnmodifiedSince: new Date("2019/01/01") @@ -627,7 +627,7 @@ describe("ReadConditionalHeadersValidator for exist resource", () => { }); }); -describe("ReadConditionalHeadersValidator for unexist resource", () => { +describe("ReadConditionalHeadersValidator for nonexistent resource", () => { it("Should return 412 Precondition Failed for any ifMatch @loki @sql", () => { const validator = new ReadConditionalHeadersValidator(); const modifiedAccessConditions = { @@ -693,7 +693,7 @@ describe("ReadConditionalHeadersValidator for unexist resource", () => { }); }); -describe("WriteConditionalHeadersValidator for unexist resource", () => { +describe("WriteConditionalHeadersValidator for nonexistent resource", () => { it("Should throw 400 Bad Request for invalid combinations conditional headers @loki @sql", () => { const validator = new WriteConditionalHeadersValidator(); const modifiedAccessConditions = { diff --git a/tests/blob/oauth.test.ts b/tests/blob/oauth.test.ts index e27480d73..ad5b8fdaf 100644 --- a/tests/blob/oauth.test.ts +++ b/tests/blob/oauth.test.ts @@ -355,7 +355,7 @@ describe("Blob OAuth Basic", () => { } assert.ok(failed); - // Eearlier user delegation key expirty time + // Earlier user delegation key expiry time startTime = new Date(); startTime.setDate(startTime.getDate() - 1); expiryTime = new Date(); diff --git a/tests/blob/sas.test.ts b/tests/blob/sas.test.ts index f7b7d34d3..d3164f58e 100644 --- a/tests/blob/sas.test.ts +++ b/tests/blob/sas.test.ts @@ -2168,7 +2168,7 @@ describe("Shared Access Signature (SAS) authentication", () => { } }); - // Copy From Uri + // Copy From URI const targetBlob = targetContainerClient.getBlockBlobClient(blobName); const targetBlobWithProps = targetContainerClient.getBlockBlobClient( blobName2 diff --git a/tests/exe.test.ts b/tests/exe.test.ts index 73b67cecf..267289704 100644 --- a/tests/exe.test.ts +++ b/tests/exe.test.ts @@ -287,7 +287,7 @@ describe("exe test", () => { afterEach(async () => { await containerClient.delete(); }); - it("download with with default parameters @loki @sql", async () => { + it("download with default parameters @loki @sql", async () => { const result = await blobClient.download(0); assert.deepStrictEqual( await bodyToString(result, content.length), diff --git a/tests/linuxbinary.test.ts b/tests/linuxbinary.test.ts index 7bfcac2ef..b0d56f03f 100644 --- a/tests/linuxbinary.test.ts +++ b/tests/linuxbinary.test.ts @@ -254,7 +254,7 @@ describe("linux binary test", () => { afterEach(async () => { await containerClient.delete(); }); - it("download with with default parameters @loki @sql", async () => { + it("download with default parameters @loki @sql", async () => { const result = await blobClient.download(0); assert.deepStrictEqual(await bodyToString(result, content.length), content); assert.equal(result.contentRange, undefined); diff --git a/tests/queue/RequestPolicy/OPTIONSRequestPolicyFactory.ts b/tests/queue/RequestPolicy/OPTIONSRequestPolicyFactory.ts index 9f859a2c3..e53271798 100644 --- a/tests/queue/RequestPolicy/OPTIONSRequestPolicyFactory.ts +++ b/tests/queue/RequestPolicy/OPTIONSRequestPolicyFactory.ts @@ -5,12 +5,12 @@ import { BaseRequestPolicy, WebResource } from "@azure/storage-queue"; export default class OPTIONSRequestPolicyFactory { // Constructor to accept parameters private origin: string | undefined; - private requstMethod: string | undefined; + private requestMethod: string | undefined; private requestHeaders: string | undefined; - constructor(origin?: string, requstMethod?: string, requestHeaders?: string) { + constructor(origin?: string, requestMethod?: string, requestHeaders?: string) { this.origin = origin; - this.requstMethod = requstMethod; + this.requestMethod = requestMethod; this.requestHeaders = requestHeaders; } @@ -20,7 +20,7 @@ export default class OPTIONSRequestPolicyFactory { nextPolicy, options, this.origin, - this.requstMethod, + this.requestMethod, this.requestHeaders ); } @@ -30,18 +30,18 @@ export default class OPTIONSRequestPolicyFactory { // tslint:disable-next-line: max-classes-per-file class OPTIONSRequestPolicy extends BaseRequestPolicy { private origin: string | undefined; - private requstMethod: string | undefined; + private requestMethod: string | undefined; private requestHeaders: string | undefined; constructor( nextPolicy: any, options: any, origin?: string, - requstMethod?: string, + requestMethod?: string, requestHeaders?: string ) { super(nextPolicy, options); this.origin = origin; - this.requstMethod = requstMethod; + this.requestMethod = requestMethod; this.requestHeaders = requestHeaders; } @@ -53,10 +53,10 @@ class OPTIONSRequestPolicy extends BaseRequestPolicy { if (this.origin !== undefined) { request.headers.set("Origin", `${this.origin}`); } - if (this.requstMethod !== undefined) { + if (this.requestMethod !== undefined) { request.headers.set( "Access-Control-Request-Method", - `${this.requstMethod}` + `${this.requestMethod}` ); } if (this.requestHeaders !== undefined) { diff --git a/tests/queue/queueCorsRequest.test.ts b/tests/queue/queueCorsRequest.test.ts index 5753b2681..f7e3ca726 100644 --- a/tests/queue/queueCorsRequest.test.ts +++ b/tests/queue/queueCorsRequest.test.ts @@ -358,7 +358,7 @@ describe("Queue Cors requests test", () => { // No match let origin = "test"; let requestMethod = "GET"; - let reqestHeaders = "head"; + let requestHeaders = "head"; let pipeline = newPipeline( new StorageSharedKeyCredential( @@ -370,7 +370,7 @@ describe("Queue Cors requests test", () => { } ); pipeline.factories.unshift( - new OPTIONSRequestPolicyFactory(origin, requestMethod, reqestHeaders) + new OPTIONSRequestPolicyFactory(origin, requestMethod, requestHeaders) ); let serviceClientForOPTIONS = new QueueServiceClient(baseURL, pipeline); @@ -391,7 +391,7 @@ describe("Queue Cors requests test", () => { // Match first cors. origin = "test"; requestMethod = "GET"; - reqestHeaders = "header"; + requestHeaders = "header"; pipeline = newPipeline( new StorageSharedKeyCredential( @@ -403,7 +403,7 @@ describe("Queue Cors requests test", () => { } ); pipeline.factories.unshift( - new OPTIONSRequestPolicyFactory(origin, requestMethod, reqestHeaders) + new OPTIONSRequestPolicyFactory(origin, requestMethod, requestHeaders) ); serviceClientForOPTIONS = new QueueServiceClient(baseURL, pipeline); @@ -413,7 +413,7 @@ describe("Queue Cors requests test", () => { // Match second cors. origin = "test"; requestMethod = "PUT"; - reqestHeaders = "head"; + requestHeaders = "head"; pipeline = newPipeline( new StorageSharedKeyCredential( @@ -425,7 +425,7 @@ describe("Queue Cors requests test", () => { } ); pipeline.factories.unshift( - new OPTIONSRequestPolicyFactory(origin, requestMethod, reqestHeaders) + new OPTIONSRequestPolicyFactory(origin, requestMethod, requestHeaders) ); serviceClientForOPTIONS = new QueueServiceClient(baseURL, pipeline); @@ -435,7 +435,7 @@ describe("Queue Cors requests test", () => { // No match. origin = "test"; requestMethod = "POST"; - reqestHeaders = "hea"; + requestHeaders = "hea"; pipeline = newPipeline( new StorageSharedKeyCredential( @@ -447,7 +447,7 @@ describe("Queue Cors requests test", () => { } ); pipeline.factories.unshift( - new OPTIONSRequestPolicyFactory(origin, requestMethod, reqestHeaders) + new OPTIONSRequestPolicyFactory(origin, requestMethod, requestHeaders) ); serviceClientForOPTIONS = new QueueServiceClient(baseURL, pipeline); @@ -468,7 +468,7 @@ describe("Queue Cors requests test", () => { // Match third cors. origin = "test"; requestMethod = "POST"; - reqestHeaders = "headerheader"; + requestHeaders = "headerheader"; pipeline = newPipeline( new StorageSharedKeyCredential( @@ -480,7 +480,7 @@ describe("Queue Cors requests test", () => { } ); pipeline.factories.unshift( - new OPTIONSRequestPolicyFactory(origin, requestMethod, reqestHeaders) + new OPTIONSRequestPolicyFactory(origin, requestMethod, requestHeaders) ); serviceClientForOPTIONS = new QueueServiceClient(baseURL, pipeline); @@ -488,7 +488,7 @@ describe("Queue Cors requests test", () => { assert.ok(res._response.status === 200); }); - it("OPTIONS request should work with matching rule containing Origion * @loki", async () => { + it("OPTIONS request should work with matching rule containing Origin * @loki", async () => { const serviceProperties = await serviceClient.getProperties(); const newCORS = { @@ -700,7 +700,7 @@ describe("Queue Cors requests test", () => { const serviceClientWithOrigin = new QueueServiceClient(baseURL, pipeline); const queueClientWithOrigin = serviceClientWithOrigin.getQueueClient( - "notexistcontainer" + "nonexistentcontainer" ); try { diff --git a/tests/queue/queueSpecialnaming.test.ts b/tests/queue/queueSpecialnaming.test.ts index f561b2e69..eb0046a44 100644 --- a/tests/queue/queueSpecialnaming.test.ts +++ b/tests/queue/queueSpecialnaming.test.ts @@ -127,7 +127,7 @@ describe("Queue SpecialNaming", () => { assert.ok(error); assert.ok( error.message.includes( - "The specifed resource name contains invalid characters." + "The specified resource name contains invalid characters." ) ); @@ -149,7 +149,7 @@ describe("Queue SpecialNaming", () => { assert.ok(error); assert.ok( error.message.includes( - "The specifed resource name contains invalid characters." + "The specified resource name contains invalid characters." ) ); @@ -164,7 +164,7 @@ describe("Queue SpecialNaming", () => { assert.ok(error); assert.ok( error.message.includes( - "The specifed resource name contains invalid characters." + "The specified resource name contains invalid characters." ) ); @@ -184,7 +184,7 @@ describe("Queue SpecialNaming", () => { assert.ok(error); assert.ok( error.message.includes( - "The specifed resource name contains invalid characters." + "The specified resource name contains invalid characters." ) ); }); diff --git a/tests/table/RequestPolicy/OPTIONSRequestPolicy.ts b/tests/table/RequestPolicy/OPTIONSRequestPolicy.ts index 1b2f4eaf5..02bee4e4a 100644 --- a/tests/table/RequestPolicy/OPTIONSRequestPolicy.ts +++ b/tests/table/RequestPolicy/OPTIONSRequestPolicy.ts @@ -4,14 +4,14 @@ import { SendRequest, PipelineRequest, PipelineResponse } from "@azure/core-rest export default class OPTIONSRequestPolicy { // Constructor to accept parameters private origin: string | undefined; - private requstMethod: string | undefined; + private requestMethod: string | undefined; private requestHeaders: string | undefined; name: string; - constructor(name: string, origin?: string, requstMethod?: string, requestHeaders?: string) { + constructor(name: string, origin?: string, requestMethod?: string, requestHeaders?: string) { this.name = name; this.origin = origin; - this.requstMethod = requstMethod; + this.requestMethod = requestMethod; this.requestHeaders = requestHeaders; } @@ -21,10 +21,10 @@ export default class OPTIONSRequestPolicy { if (this.origin !== undefined) { request.headers.set("Origin", `${this.origin}`); } - if (this.requstMethod !== undefined) { + if (this.requestMethod !== undefined) { request.headers.set( "Access-Control-Request-Method", - `${this.requstMethod}` + `${this.requestMethod}` ); } if (this.requestHeaders !== undefined) { diff --git a/tests/table/apis/table.entity.apostrophe.azure-storage.test.ts b/tests/table/apis/table.entity.apostrophe.azure-storage.test.ts index af951e17b..72537bdd9 100644 --- a/tests/table/apis/table.entity.apostrophe.azure-storage.test.ts +++ b/tests/table/apis/table.entity.apostrophe.azure-storage.test.ts @@ -405,7 +405,7 @@ function testMergeBatch( reject(batchError); } else { assert.strictEqual(batchResponse.statusCode, 202); - // the checks below deliverately do not follow the ordering + // the checks below deliberately do not follow the ordering // of the entity array tableService.retrieveEntity( tableName, diff --git a/tests/table/apis/table.entity.azure.data-tables.test.ts b/tests/table/apis/table.entity.azure.data-tables.test.ts index 8a7fc1ad1..3f4b9f3ff 100644 --- a/tests/table/apis/table.entity.azure.data-tables.test.ts +++ b/tests/table/apis/table.entity.azure.data-tables.test.ts @@ -224,7 +224,7 @@ describe("table Entity APIs test - using Azure/data-tables", () => { assert.notStrictEqual( result1259a.etag, undefined, - "Did not create entity correctly, etag weas null" + "Did not create entity correctly, etag was null" ); const check1259a = await tableClient.getEntity( @@ -284,7 +284,7 @@ describe("table Entity APIs test - using Azure/data-tables", () => { assert.notStrictEqual( result1259a.etag, undefined, - "Did not create entity correctly, etag weas null" + "Did not create entity correctly, etag was null" ); const check1259a = await tableClient.getEntity( @@ -384,7 +384,7 @@ describe("table Entity APIs test - using Azure/data-tables", () => { }); // https://github.com/Azure/Azurite/issues/1286 - it("08. Should update Etags with sufficient granualrity, @loki", async () => { + it("08. Should update Etags with sufficient granularity, @loki", async () => { const tableClient = createAzureDataTablesClient( testLocalAzuriteInstance, getUniqueName("etags") diff --git a/tests/table/apis/table.entity.issues.test.ts b/tests/table/apis/table.entity.issues.test.ts index 3cc1b03f6..a8d3af055 100644 --- a/tests/table/apis/table.entity.issues.test.ts +++ b/tests/table/apis/table.entity.issues.test.ts @@ -299,7 +299,7 @@ describe("table Entity APIs test : Issues", () => { }); // from issue #1201 - it("should allow the deletion of entities using empty string as the parition key, @loki", async () => { + it("should allow the deletion of entities using empty string as the partition key, @loki", async () => { const emptyPartitionKey = ""; const tableClient = createAzureDataTablesClient( testLocalAzuriteInstance, diff --git a/tests/table/apis/table.entity.rest.test.ts b/tests/table/apis/table.entity.rest.test.ts index 131090148..b5976b742 100644 --- a/tests/table/apis/table.entity.rest.test.ts +++ b/tests/table/apis/table.entity.rest.test.ts @@ -343,7 +343,7 @@ describe("table Entity APIs REST tests", () => { assert.strictEqual( notExist, 1, - "We did not get the expected non-existent error." + "We did not get the expected nonexistent error." ); }); @@ -631,7 +631,7 @@ describe("table Entity APIs REST tests", () => { * Check that ifmatch * update works... * if etag == *, then tableClient.updateEntity is calling "Merge" via PATCH with merge option. * Same if etag is omitted. Patch usage is not documented. - * if Replace option, calling "Update" in the table handler, which is caling insertOrUpdate in metadata + * if Replace option, calling "Update" in the table handler, which is calling insertOrUpdate in metadata * * Test If-Match cases * https://docs.microsoft.com/en-us/rest/api/storageservices/update-entity2 @@ -699,7 +699,7 @@ describe("table Entity APIs REST tests", () => { restFunction: putToAzurite, expectedStatus: 204, expectSuccess: true, - errorMessage: "We should not fail PUT with with * If-Match" + errorMessage: "We should not fail PUT with * If-Match" }, { name: "case 2 : Update Entity : PUT with old etag in If-Match.", diff --git a/tests/table/apis/table.test.ts b/tests/table/apis/table.test.ts index 6051bb996..82774c3f5 100644 --- a/tests/table/apis/table.test.ts +++ b/tests/table/apis/table.test.ts @@ -399,7 +399,7 @@ describe("table APIs test", () => { }); }); - it("should delete a table using case insensitive logic, @loki", (done) => { + it("should delete a table using case-insensitive logic, @loki", (done) => { tableName = getUniqueName("caseInsensitive"); tableService.createTable(tableName, (error) => { if (error) { diff --git a/tests/table/auth/tableCorsRequest.test.ts b/tests/table/auth/tableCorsRequest.test.ts index 076737670..611e150e2 100644 --- a/tests/table/auth/tableCorsRequest.test.ts +++ b/tests/table/auth/tableCorsRequest.test.ts @@ -405,7 +405,7 @@ describe("table Entity APIs test", () => { await serviceClientForOPTIONS.getProperties(); }); - it("OPTIONS request should work with matching rule containing Origion * @loki", async () => { + it("OPTIONS request should work with matching rule containing Origin * @loki", async () => { const serviceProperties = await serviceClient.getProperties(); const newCORS = { diff --git a/tests/table/go/main.go b/tests/table/go/main.go index 144bb9c20..752643cfa 100644 --- a/tests/table/go/main.go +++ b/tests/table/go/main.go @@ -18,7 +18,7 @@ insert some entities as a batch, and query the table for those entities. This is to reproduce and ensure that we have not introduced any MIME Serialization bugs for the Azure Go SDK. I use the modified samples from the SDK and the Go SDK team to create this test and validate -the behvaior of Azurite: +the behavior of Azurite: https://github.com/Azure/azure-sdk-for-go/tree/sdk/data/aztables/v1.0.1/sdk/data/aztables/ */ func main() { diff --git a/tests/table/unit/deserialization.unit.test.ts b/tests/table/unit/deserialization.unit.test.ts index b185611ba..95f0557d0 100644 --- a/tests/table/unit/deserialization.unit.test.ts +++ b/tests/table/unit/deserialization.unit.test.ts @@ -356,7 +356,7 @@ describe("batch deserialization unit tests, these are not the API integration te assert.strictEqual( extractedPath[0], value.path, - "Uri path did not parse correctly!" + "URI path did not parse correctly!" ); } else { assert.notStrictEqual( diff --git a/tests/table/unit/mock.request.serialization.strings.ts b/tests/table/unit/mock.request.serialization.strings.ts index 2ecd2d3e6..053c15c1a 100644 --- a/tests/table/unit/mock.request.serialization.strings.ts +++ b/tests/table/unit/mock.request.serialization.strings.ts @@ -2,25 +2,25 @@ export default class SerializationRequestMockStrings { // #################### - // Mocks for a batch of 3 Inserts using the Javascript SDK + // Mocks for a batch of 3 Inserts using the JavaScript SDK // #################### // prettier-ignore public static Sample3InsertsUsingSDK: string ='--batch_7679a9f9b2dde130e791580c53508a5a\ncontent-type: multipart/mixed;charset="utf-8";boundary=changeset_7679a9f9b2dde130e791580c53508a5a\n\n--changeset_7679a9f9b2dde130e791580c53508a5a\ncontent-type: application/http\ncontent-transfer-encoding: binary\n\nPOST http://127.0.0.1:11002/devstoreaccount1/table160837408807101776 HTTP/1.1\nPrefer: return-content\ncontent-length: 76\ncontent-type: application/json;type=entry\naccept: application/json;odata=minimalmetadata\nmaxdataserviceversion: 3.0;NetFx\n\n{"PartitionKey":"part1","RowKey":"row160837408812000231","myValue":"value1"}\n--changeset_7679a9f9b2dde130e791580c53508a5a\ncontent-type: application/http\ncontent-transfer-encoding: binary\n\nPOST http://127.0.0.1:11002/devstoreaccount1/table160837408807101776 HTTP/1.1\nPrefer: return-content\ncontent-length: 76\ncontent-type: application/json;type=entry\naccept: application/json;odata=minimalmetadata\nmaxdataserviceversion: 3.0;NetFx\ncontent-id: 1\n\n{"PartitionKey":"part1","RowKey":"row160837408812008370","myValue":"value1"}\n--changeset_7679a9f9b2dde130e791580c53508a5a\ncontent-type: application/http\ncontent-transfer-encoding: binary\n\nPOST http://127.0.0.1:11002/devstoreaccount1/table160837408807101776 HTTP/1.1\nPrefer: return-content\ncontent-length: 76\ncontent-type: application/json;type=entry\naccept: application/json;odata=minimalmetadata\nmaxdataserviceversion: 3.0;NetFx\ncontent-id: 2\n\n{"PartitionKey":"part1","RowKey":"row160837408812003154","myValue":"value1"}\n--changeset_7679a9f9b2dde130e791580c53508a5a--\n--batch_7679a9f9b2dde130e791580c53508a5a--'; // #################### - // Mocks for a batch containing single retrieve entity using the Javascript SDK + // Mocks for a batch containing single retrieve entity using the JavaScript SDK // #################### // prettier-ignore public static Sample1QueryUsingSDK: string = "--batch_d737e1b79cb362526a8b4a13d46d6fc3\ncontent-type: application/http\ncontent-transfer-encoding: binary\n\nGET http://127.0.0.1:11002/devstoreaccount1/table160837567141205013(PartitionKey=%27part1%27,RowKey=%27row160837567145205850%27) HTTP/1.1\naccept: application/json;odata=minimalmetadata\nmaxdataserviceversion: 3.0;NetFx\n\n--batch_d737e1b79cb362526a8b4a13d46d6fc3--"; // #################### - // Mocks for a batch with insert then merge using the Javascript SDK + // Mocks for a batch with insert then merge using the JavaScript SDK // #################### // prettier-ignore public static SampleInsertThenMergeUsingSDK: string = '--batch_aa71f86e6ed5d85b178b2a28cbb61f97\ncontent-type: multipart/mixed;charset="utf-8";boundary=changeset_aa71f86e6ed5d85b178b2a28cbb61f97\n\n--changeset_aa71f86e6ed5d85b178b2a28cbb61f97\ncontent-type: application/http\ncontent-transfer-encoding: binary\n\nPOST http://127.0.0.1:11002/devstoreaccount1/table160837770303307822 HTTP/1.1\nPrefer: return-content\ncontent-length: 76\ncontent-type: application/json;type=entry\naccept: application/json;odata=minimalmetadata\nmaxdataserviceversion: 3.0;NetFx\n\n{"PartitionKey":"part1","RowKey":"row160837770307508823","myValue":"value2"}\n--changeset_aa71f86e6ed5d85b178b2a28cbb61f97\ncontent-type: application/http\ncontent-transfer-encoding: binary\n\nMERGE http://127.0.0.1:11002/devstoreaccount1/table160837770303307822(PartitionKey=%27part1%27,RowKey=%27row160837770307508823%27) HTTP/1.1\nif-match: *\ncontent-length: 76\ncontent-type: application/json;type=entry\naccept: application/json;odata=minimalmetadata\nmaxdataserviceversion: 3.0;NetFx\ncontent-id: 1\n\n{"PartitionKey":"part1","RowKey":"row160837770307508823","myValue":"valueMerge"}\n--changeset_aa71f86e6ed5d85b178b2a28cbb61f97--\n--batch_aa71f86e6ed5d85b178b2a28cbb61f97--'; // #################### - // Mocks for a batch of 3 Deletes using the Javascript SDK + // Mocks for a batch of 3 Deletes using the JavaScript SDK // #################### // prettier-ignore public static Sample3DeletesUsingSDK: string = '--batch_2d60b21ff9edaf2bc1bc4f60664c0283\ncontent-type: multipart/mixed;charset="utf-8";boundary=changeset_2d60b21ff9edaf2bc1bc4f60664c0283\n\n--changeset_2d60b21ff9edaf2bc1bc4f60664c0283\ncontent-type: application/http\ncontent-transfer-encoding: binary\n\nDELETE http://127.0.0.1:11002/devstoreaccount1/table161216830457901592(PartitionKey=%27part1%27,RowKey=%27row161216830462208585%27) HTTP/1.1\nif-match: *\naccept: application/json;odata=minimalmetadata\nmaxdataserviceversion: 3.0;NetFx\n\n\n--changeset_2d60b21ff9edaf2bc1bc4f60664c0283\ncontent-type: application/http\ncontent-transfer-encoding: binary\n\nDELETE http://127.0.0.1:11002/devstoreaccount1/table161216830457901592(PartitionKey=%27part1%27,RowKey=%27row161216830462204546%27) HTTP/1.1\nif-match: *\naccept: application/json;odata=minimalmetadata\nmaxdataserviceversion: 3.0;NetFx\ncontent-id: 1\n\n\n--changeset_2d60b21ff9edaf2bc1bc4f60664c0283\ncontent-type: application/http\ncontent-transfer-encoding: binary\n\nDELETE http://127.0.0.1:11002/devstoreaccount1/table161216830457901592(PartitionKey=%27part1%27,RowKey=%27row161216830462201168%27) HTTP/1.1\nif-match: *\naccept: application/json;odata=minimalmetadata\nmaxdataserviceversion: 3.0;NetFx\ncontent-id: 2\n\n\n--changeset_2d60b21ff9edaf2bc1bc4f60664c0283--\n--batch_2d60b21ff9edaf2bc1bc4f60664c0283--'; @@ -82,10 +82,10 @@ export default class SerializationRequestMockStrings { "--batch_5496aa30-4c31-467f-4a4d-d51307b6f323\r\nContent-Type: multipart/mixed; boundary=changeset_67ee7ecb-8e1d-42ba-5eb8-70569f8a7236\r\n\r\n--changeset_67ee7ecb-8e1d-42ba-5eb8-70569f8a7236\r\nContent-Transfer-Encoding: binary\r\nContent-Type: application/http\r\n\r\nPOST http://127.0.0.1:10002/devstoreaccount1/TestTable?%24format=application%2Fjson%3Bodata%3Dminimalmetadata HTTP/1.1\r\nAccept: application/json;odata=minimalmetadata\r\nContent-Length: 93\r\nContent-Type: application/json\r\nDataserviceversion: 3.0\r\nPrefer: return-no-content\r\nX-Ms-Version: 2019-02-02\r\n\r\n{\"PartitionKey\":\"5cad691a-3fb3-4016-8061-9a18fd8dea4a\",\"RowKey\":\"rkey1\",\"product\":\"product1\"}\r\n--changeset_67ee7ecb-8e1d-42ba-5eb8-70569f8a7236\r\nContent-Transfer-Encoding: binary\r\nContent-Type: application/http\r\n\r\nPOST http://127.0.0.1:10002/devstoreaccount1/TestTable?%24format=application%2Fjson%3Bodata%3Dminimalmetadata HTTP/1.1\r\nAccept: application/json;odata=minimalmetadata\r\nContent-Length: 93\r\nContent-Type: application/json\r\nDataserviceversion: 3.0\r\nPrefer: return-no-content\r\nX-Ms-Version: 2019-02-02\r\n\r\n{\"PartitionKey\":\"5cad691a-3fb3-4016-8061-9a18fd8dea4a\",\"RowKey\":\"rkey2\",\"product\":\"product2\"}\r\n--changeset_67ee7ecb-8e1d-42ba-5eb8-70569f8a7236--\r\n\r\n--batch_5496aa30-4c31-467f-4a4d-d51307b6f323--\r\n"; public static BatchFuncToolsDeleteString: string = - // prettier-ingore + // prettier-ignore "--batch_e6bedae0-33a0-4875-bf7a-dc3963071819\nContent-Type: multipart/mixed; boundary=changeset_f3679e9d-3491-4ba7-95f3-59a8e24cd7bf\n\n--changeset_f3679e9d-3491-4ba7-95f3-59a8e24cd7bf\nContent-Type: application/http\nContent-Transfer-Encoding: binary\n\nDELETE http://127.0.0.1:10002/devstoreaccount1/TestHubNameHistory(PartitionKey='00000000EDGC5674',RowKey='0000000000000000') HTTP/1.1\nAccept: application/json;odata=minimalmetadata\nContent-Type: application/json\nDataServiceVersion: 3.0;\nIf-Match: W/\"datetime'2023-03-17T15%3A06%3A18.3075721Z'\"\n\n--changeset_f3679e9d-3491-4ba7-95f3-59a8e24cd7bf\nContent-Type: application/http\nContent-Transfer-Encoding: binary\n\nDELETE http://127.0.0.1:10002/devstoreaccount1/TestHubNameHistory(PartitionKey='00000000EDGC5674',RowKey='0000000000000001') HTTP/1.1\nAccept: application/json;odata=minimalmetadata\nContent-Type: application/json\nDataServiceVersion: 3.0;\nIf-Match: W/\"datetime'2023-03-17T15%3A06%3A18.3075732Z'\"\n\n--changeset_f3679e9d-3491-4ba7-95f3-59a8e24cd7bf\nContent-Type: application/http\nContent-Transfer-Encoding: binary\n\nDELETE http://127.0.0.1:10002/devstoreaccount1/TestHubNameHistory(PartitionKey='00000000EDGC5674',RowKey='0000000000000002') HTTP/1.1\nAccept: application/json;odata=minimalmetadata\nContent-Type: application/json\nDataServiceVersion: 3.0;\nIf-Match: W/\"datetime'2023-03-17T15%3A06%3A18.3075737Z'\"\n\n--changeset_f3679e9d-3491-4ba7-95f3-59a8e24cd7bf\nContent-Type: application/http\nContent-Transfer-Encoding: binary\n\nDELETE http://127.0.0.1:10002/devstoreaccount1/TestHubNameHistory(PartitionKey='00000000EDGC5674',RowKey='0000000000000003') HTTP/1.1\nAccept: application/json;odata=minimalmetadata\nContent-Type: application/json\nDataServiceVersion: 3.0;\nIf-Match: W/\"datetime'2023-03-17T15%3A06%3A18.3075742Z'\"\n\n--changeset_f3679e9d-3491-4ba7-95f3-59a8e24cd7bf--\n--batch_e6bedae0-33a0-4875-bf7a-dc3963071819--"; public static BatchCloudNetDeleteString: string = - // prettier-ingore + // prettier-ignore "--batch_d5351566-6c65-4b24-b030-a3c1e7c459ab\r\nContent-Type: multipart/mixed; boundary=changeset_a8e76d7b-1421-4226-9e63-0fb67554be26\r\n\r\n--changeset_a8e76d7b-1421-4226-9e63-0fb67554be26\r\nContent-Type: application/http\r\nContent-Transfer-Encoding: binary\r\n\r\nDELETE http://127.0.0.1:10002/devstoreaccount1/GatewayManagerInventoryTable(PartitionKey='0',RowKey='device_0_device1') HTTP/1.1\r\nAccept: application/json;odata=minimalmetadata\r\nContent-Type: application/json\r\nDataServiceVersion: 3.0;\r\nIf-Match: W/\"datetime'2022-07-19T15%3A36%3A46.297987Z'\"\r\n\r\n--changeset_a8e76d7b-1421-4226-9e63-0fb67554be26\r\nContent-Type: application/http\r\nContent-Transfer-Encoding: binary\r\n\r\nDELETE http://127.0.0.1:10002/devstoreaccount1/GatewayManagerInventoryTable(PartitionKey='0',RowKey='devicelocationmap_0_sanjose_0_device1') HTTP/1.1\r\nAccept: application/json;odata=minimalmetadata\r\nContent-Type: application/json\r\nDataServiceVersion: 3.0;\r\nIf-Match: W/\"datetime'2022-07-19T15%3A36%3A46.297103Z'\"\r\n\r\n--changeset_a8e76d7b-1421-4226-9e63-0fb67554be26--\r\n--batch_d5351566-6c65-4b24-b030-a3c1e7c459ab--\r\n"; } diff --git a/tests/table/unit/mock.response.serialization.strings.ts b/tests/table/unit/mock.response.serialization.strings.ts index aa3a56ddd..2dd3a31b3 100644 --- a/tests/table/unit/mock.response.serialization.strings.ts +++ b/tests/table/unit/mock.response.serialization.strings.ts @@ -37,12 +37,12 @@ export default class SerializationResponseMockStrings { // #################### // "--batchresponse_5920f66b-704c-4f0d-a1ba-a024f44e4754\r\nContent-Type: multipart/mixed; boundary=changesetresponse_a3dab894-5e6c-4f3d-877e-dc918125467e\r\n\r\n--changesetresponse_a3dab894-5e6c-4f3d-877e-dc918125467e\r\nContent-Type: application/http\r\nContent-Transfer-Encoding: binary\r\n\r\nHTTP/1.1 204 No Content\r\nX-Content-Type-Options: nosniff\r\nCache-Control: no-cache\r\nDataServiceVersion: 1.0;\r\n\r\n\r\n--changesetresponse_a3dab894-5e6c-4f3d-877e-dc918125467e--\r\n--batchresponse_5920f66b-704c-4f0d-a1ba-a024f44e4754--\r\n" public static FullBatchSingleDeleteResponseString: string = - // pretier-ignore + // prettier-ignore "--batchresponse_5920f66b-704c-4f0d-a1ba-a024f44e4754\r\nContent-Type: multipart/mixed; boundary=changesetresponse_a3dab894-5e6c-4f3d-877e-dc918125467e\r\n\r\n--changesetresponse_a3dab894-5e6c-4f3d-877e-dc918125467e\r\nContent-Type: application/http\r\nContent-Transfer-Encoding: binary\r\n\r\nHTTP/1.1 204 No Content\r\nX-Content-Type-Options: nosniff\r\nCache-Control: no-cache\r\nDataServiceVersion: 1.0;\r\n\r\n\r\n--changesetresponse_a3dab894-5e6c-4f3d-877e-dc918125467e--\r\n--batchresponse_5920f66b-704c-4f0d-a1ba-a024f44e4754--\r\n"; // manually set dataserviceversion to 3.0, service responds with 1.0 public static PartialBatchSingleDeleteResponseString: string = - // pretier-ignore + // prettier-ignore "Content-Type: application/http\r\nContent-Transfer-Encoding: binary\r\n\r\nHTTP/1.1 204 No Content\r\nX-Content-Type-Options: nosniff\r\nCache-Control: no-cache\r\nDataServiceVersion: 3.0;\r\n"; // #################### diff --git a/tests/table/unit/mock.serialization.batchrequest.factory.ts b/tests/table/unit/mock.serialization.batchrequest.factory.ts index 2d27a7a2c..eedf18886 100644 --- a/tests/table/unit/mock.serialization.batchrequest.factory.ts +++ b/tests/table/unit/mock.serialization.batchrequest.factory.ts @@ -23,7 +23,7 @@ export default class SerializationObjectForBatchRequestFactory { return mockRequest; } - public static GetBatchRequestForSingleDeletetResponseMock(): BatchRequest { + public static GetBatchRequestForSingleDeleteResponseMock(): BatchRequest { const mockRequest = new BatchRequest( SerializationBatchOperationFactory.GetBatchOperationMockForDeleteSingleEntity( SerializationResponseMockStrings.EmptyHeaderMock diff --git a/tests/table/unit/query.interpreter.unit.test.ts b/tests/table/unit/query.interpreter.unit.test.ts index 9f52361ce..5a9981952 100644 --- a/tests/table/unit/query.interpreter.unit.test.ts +++ b/tests/table/unit/query.interpreter.unit.test.ts @@ -428,7 +428,7 @@ describe("Query Interpreter", () => { }) describe("Regression Tests", () => { - runTestCases("Issue #1929: Querying non-existent fields", referenceEntity, [ + runTestCases("Issue #1929: Querying nonexistent fields", referenceEntity, [ { name: "Empty string fields should be queryable", originalQuery: "emptyString eq ''", @@ -445,7 +445,7 @@ describe("Query Interpreter", () => { expectedResult: true }, { - name: "Non-existent fields should not be queryable", + name: "Nonexistent fields should not be queryable", originalQuery: "nonExistent ne ''", expectedResult: false } diff --git a/tests/table/unit/query.parser.unit.test.ts b/tests/table/unit/query.parser.unit.test.ts index 803a5e915..ba4ea7c7a 100644 --- a/tests/table/unit/query.parser.unit.test.ts +++ b/tests/table/unit/query.parser.unit.test.ts @@ -51,7 +51,7 @@ describe("Query Parser", () => { expectedQuery: "(not (eq (id PartitionKey) \"test\"))" }, { - name: "Wrapping an expresssion group", + name: "Wrapping an expression group", originalQuery: "not (PartitionKey lt 'Part2')", expectedQuery: "(not (lt (id PartitionKey) \"Part2\"))" } diff --git a/tests/table/unit/serialization.unit.test.ts b/tests/table/unit/serialization.unit.test.ts index a8140f13f..d309e2fca 100644 --- a/tests/table/unit/serialization.unit.test.ts +++ b/tests/table/unit/serialization.unit.test.ts @@ -98,7 +98,7 @@ describe("batch serialization unit tests, these are not the API integration test ); const request = - SerializationObjectForBatchRequestFactory.GetBatchRequestForSingleDeletetResponseMock(); + SerializationObjectForBatchRequestFactory.GetBatchRequestForSingleDeleteResponseMock(); request.ingestOptionalParams(new BatchTableDeleteEntityOptionalParams()); const serializedBatchOperationResponse = diff --git a/tests/table/utils/table.entity.test.utils.ts b/tests/table/utils/table.entity.test.utils.ts index 8a7bc1a17..1f6aed6bd 100644 --- a/tests/table/utils/table.entity.test.utils.ts +++ b/tests/table/utils/table.entity.test.utils.ts @@ -68,7 +68,7 @@ export function createTableServerForTestHttps(): TableServer { * @return {*} {TableServer} */ export function createTableServerForQueryTestHttps(): TableServer { - // we need a unique name for the pipieline tests which + // we need a unique name for the pipeline tests which // all run on the same VM. const uniqueDbName = getUniqueName("querydb"); const uniqueDBpath = "./" + uniqueDbName + ".json"; @@ -134,7 +134,7 @@ export function createSecondaryConnectionStringForTest(dev: boolean): string { } /** - * return a unique parition key for data-tables tests + * return a unique partition key for data-tables tests * * @export * @return {*} {string} From a527e2a4056cb4f9dac21f77b74faff09a6bf772 Mon Sep 17 00:00:00 2001 From: Ben Lewis Date: Thu, 1 Aug 2024 13:27:49 +1200 Subject: [PATCH 293/297] Fixed an issue where premature client disconnections led to all following requests failing with a 500 error. (#2433) The underlying file, where the data is saved was closed if any error occurred while reading from the client connection. Subsequently, the file was attempted to be used again, but it is closed. --- ChangeLog.md | 1 + src/common/persistence/FSExtentStore.ts | 18 ++++++++++-- tests/blob/fsStore.test.ts | 38 +++++++++++++++++++++++++ 3 files changed, 55 insertions(+), 2 deletions(-) create mode 100644 tests/blob/fsStore.test.ts diff --git a/ChangeLog.md b/ChangeLog.md index 0fc1d2323..2b6deb099 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -7,6 +7,7 @@ General: - Bump mysql2 to resolve to 3.10.1 for security patches +- Fixed an issue where premature client disconnections led to all following requests failing with a 500 error. (issue #1346) Blob: diff --git a/src/common/persistence/FSExtentStore.ts b/src/common/persistence/FSExtentStore.ts index 199a8012d..6701f2f08 100644 --- a/src/common/persistence/FSExtentStore.ts +++ b/src/common/persistence/FSExtentStore.ts @@ -3,6 +3,7 @@ import { createReadStream, createWriteStream, fdatasync, + ftruncate, mkdir, open, stat, @@ -34,6 +35,7 @@ import OperationQueue from "./OperationQueue"; const statAsync = promisify(stat); const mkdirAsync = promisify(mkdir); const unlinkAsync = promisify(unlink); +const ftruncateAsync = promisify(ftruncate); // The max size of an extent. const MAX_EXTENT_SIZE = DEFAULT_MAX_EXTENT_SIZE; @@ -293,6 +295,17 @@ export default class FSExtentStore implements IExtentStore { count }; } catch (err) { + // Reset cursor position to the current offset. + try { + await ftruncateAsync(fd, appendExtent.offset); + } catch (truncate_err) { + this.logger.error( + `FSExtentStore:appendExtent() Truncate fd:${fd} len: ${appendExtent.offset} error:${JSON.stringify( + truncate_err + )}.`, + contextId + ); + } appendExtent.appendStatus = AppendStatusCode.Idle; throw err; } @@ -541,10 +554,11 @@ export default class FSExtentStore implements IExtentStore { this.logger.debug( `FSExtentStore:streamPipe() Readable stream triggers error event, error:${JSON.stringify( err - )}, after ${count} bytes piped. Invoke write stream destroy() method.`, + )}, after ${count} bytes piped. Reject streamPipe().`, contextId ); - ws.destroy(err); + + reject(err); }); ws.on("drain", () => { diff --git a/tests/blob/fsStore.test.ts b/tests/blob/fsStore.test.ts new file mode 100644 index 000000000..49dbbb511 --- /dev/null +++ b/tests/blob/fsStore.test.ts @@ -0,0 +1,38 @@ +import assert from "assert"; +import { Readable } from "stream"; +import FSExtentStore from "../../src/common/persistence/FSExtentStore"; +import IExtentMetadataStore from "../../src/common/persistence/IExtentMetadataStore"; +import { DEFAULT_BLOB_PERSISTENCE_ARRAY } from "../../src/blob/utils/constants"; +import logger from "../../src/common/Logger"; + +import { mock } from "ts-mockito"; + +describe("FSExtentStore", () => { + + const metadataStore: IExtentMetadataStore = mock(); + metadataStore.getExtentLocationId = () => Promise.resolve("Default"); + + it("should handle input stream error gracefully during appendExtent @loki", async () => { + const store = new FSExtentStore(metadataStore, DEFAULT_BLOB_PERSISTENCE_ARRAY, logger); + await store.init(); + + // A null value within the Readable.from array causes the stream to emit an error. + const stream1 = Readable.from(["deadbeef", null], { objectMode: false }); + await assert.rejects(store.appendExtent(stream1)); + + // Write a valid stream to the store. + const stream2 = Readable.from("Test", { objectMode: false }); + const extent = await store.appendExtent(stream2); + assert.strictEqual(extent.offset, 0); + assert.strictEqual(extent.count, 4); + + // Check that the extent is readable. + let readable = await store.readExtent(extent); + const chunks: Buffer[] = []; + for await (const chunk of readable) { + chunks.push(chunk as Buffer); + } + const data = Buffer.concat(chunks); + assert.strictEqual(data.toString(), "Test"); + }); +}); From e2494376a8d9b8f1699382e10af18a8517f0b0fa Mon Sep 17 00:00:00 2001 From: Wei Wei Date: Thu, 1 Aug 2024 09:22:24 +0000 Subject: [PATCH 294/297] learn github action (#2444) --- .github/workflows/PrValidation.yml | 448 +++++++++++++++++++++++++++++ 1 file changed, 448 insertions(+) create mode 100644 .github/workflows/PrValidation.yml diff --git a/.github/workflows/PrValidation.yml b/.github/workflows/PrValidation.yml new file mode 100644 index 000000000..3519a68f0 --- /dev/null +++ b/.github/workflows/PrValidation.yml @@ -0,0 +1,448 @@ +name: Azurite PR check +run-name: ${{ github.actor }}'s PR is being checked. + +on: + pull_request: + schedule: + - cron: '0 19 * * 0' + +jobs: + BlobTest_Ubuntu_Node16: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 + with: + node-version: '16' + - run: npm ci --legacy-peer-deps + - run: npm run test:blob + - run: npm run test:blob:in-memory + + BlobTest_Ubuntu_Node18: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 + with: + node-version: '18' + - run: npm ci --legacy-peer-deps + - run: npm run test:blob + - run: npm run test:blob:in-memory + + BlobTest_Ubuntu_Node20: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 + with: + node-version: '20' + - run: npm ci --legacy-peer-deps + - run: npm run test:blob + - run: npm run test:blob:in-memory + + BlobTest_Ubuntu_Node22: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 + with: + node-version: '22' + - run: npm ci --legacy-peer-deps + - run: npm run test:blob + - run: npm run test:blob:in-memory + + BlobTest_Win_Node20: + runs-on: windows-latest + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 + with: + node-version: '20' + - run: npm ci --legacy-peer-deps + - run: npm run test:blob + - run: npm run test:blob:in-memory + + BlobTest_Win_Node18: + runs-on: windows-latest + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 + with: + node-version: '18' + - run: npm ci --legacy-peer-deps + - run: npm run test:blob + - run: npm run test:blob:in-memory + + BlobTest_MacOS_Node16: + runs-on: macOS-latest + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 + with: + node-version: '16' + - run: npm ci --legacy-peer-deps + - run: npm run test:blob + - run: npm run test:blob:in-memory + + BlobTest_MacOS_Node22: + runs-on: macOS-latest + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 + with: + node-version: '22' + - run: npm ci --legacy-peer-deps + - run: npm run test:blob + - run: npm run test:blob:in-memory + + BlobTest_MySQL_Ubuntu_Node22: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 + with: + node-version: '22' + - run: npm ci --legacy-peer-deps + - name: Setup mysql docker instance + run: | + docker run --name mysql -p 13306:3306 -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql + sleep 60 + docker exec mysql mysql -u root -pmy-secret-pw -e "GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION; FLUSH PRIVILEGES;" + docker exec mysql mysql -u root -pmy-secret-pw -e "create database azurite_blob_test;" + - run: npm run test:blob:sql:ci + + BlobTest_MySQL_Ubuntu_Node16: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 + with: + node-version: '16' + - run: npm ci --legacy-peer-deps + - name: Setup mysql docker instance + run: | + docker run --name mysql -p 13306:3306 -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql + sleep 60 + docker exec mysql mysql -u root -pmy-secret-pw -e "GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION; FLUSH PRIVILEGES;" + docker exec mysql mysql -u root -pmy-secret-pw -e "create database azurite_blob_test;" + - run: npm run test:blob:sql:ci + + QueueTest_Ubuntu_Node22: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 + with: + node-version: '22' + - run: npm ci --legacy-peer-deps + - run: npm run test:queue + - run: npm run test:queue:in-memory + + QueueTest_Ubuntu_Node20: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 + with: + node-version: '20' + - run: npm ci --legacy-peer-deps + - run: npm run test:queue + - run: npm run test:queue:in-memory + + QueueTest_Win_Node16: + runs-on: windows-latest + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 + with: + node-version: '16' + - run: npm ci --legacy-peer-deps + - run: npm run test:queue + - run: npm run test:queue:in-memory + + QueueTest_Win_Node18: + runs-on: windows-latest + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 + with: + node-version: '18' + - run: npm ci --legacy-peer-deps + - run: npm run test:queue + - run: npm run test:queue:in-memory + + QueueTest_MacOS_Node20: + runs-on: macOS-latest + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 + with: + node-version: '20' + - run: npm ci --legacy-peer-deps + - run: npm run test:queue + - run: npm run test:queue:in-memory + + QueueTest_MacOS_Node18: + runs-on: macOS-latest + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 + with: + node-version: '18' + - run: npm ci --legacy-peer-deps + - run: npm run test:queue + - run: npm run test:queue:in-memory + + TableTest_Ubuntu_Node22: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 + with: + node-version: '22' + - run: npm ci --legacy-peer-deps + - run: npm run test:table + - run: npm run test:table:in-memory + + TableTest_Ubuntu_Node16: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 + with: + node-version: '16' + - run: npm ci --legacy-peer-deps + - run: npm run test:table + - run: npm run test:table:in-memory + + TableTest_Win_Node20: + runs-on: windows-latest + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 + with: + node-version: '20' + - run: npm ci --legacy-peer-deps + - run: npm run test:table + - run: npm run test:table:in-memory + + TableTest_Win_Node16: + runs-on: windows-latest + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 + with: + node-version: '16' + - run: npm ci --legacy-peer-deps + - run: npm run test:table + - run: npm run test:table:in-memory + + TableTest_MacOS_Node20: + runs-on: macOS-latest + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 + with: + node-version: '20' + - run: npm ci --legacy-peer-deps + - run: npm run test:table + - run: npm run test:table:in-memory + + TableTest_MacOS_Node18: + runs-on: macOS-latest + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 + with: + node-version: '18' + - run: npm ci --legacy-peer-deps + - run: npm run test:table + - run: npm run test:table:in-memory + + Azurite_Linux_Node18: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 + with: + node-version: '18' + - run: npm ci --legacy-peer-deps + - name: tslint + run: npm run lint + - name: Validate npm package installation + run: npm run validate:npmpack:linux_mac + - name: Validate Visual Studio Code extension package generation + run: npm run vscode:pack + - name: Validate npm global installation from GitHub code base + run: | + sudo npm uninstall -g azurite + npm run build + npm install --location=global + azurite -v + azurite-blob -v + azurite-queue -v + azurite-table -v + + Azurite_Linux_Node16: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 + with: + node-version: '16' + - run: npm ci --legacy-peer-deps + - name: tslint + run: npm run lint + - name: Validate npm package installation + run: npm run validate:npmpack:linux_mac + - name: Validate Visual Studio Code extension package generation + run: npm run vscode:pack + - name: Validate npm global installation from GitHub code base + run: | + sudo npm uninstall -g azurite + npm run build + npm install --location=global + azurite -v + azurite-blob -v + azurite-queue -v + azurite-table -v + + Azurite_Win_Node22: + runs-on: windows-latest + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 + with: + node-version: '22' + - run: npm ci --legacy-peer-deps + - name: tslint + run: npm run lint + - name: Validate npm package installation + run: npm run validate:npmpack:win + - name: Validate Visual Studio Code extension package generation + run: npm run vscode:pack + - name: Validate npm global installation from GitHub code base + run: | + npm uninstall -g azurite + npm run build + npm install -g + azurite -v + azurite-blob -v + azurite-queue -v + azurite-table -v + + Azurite_Win_Node20: + runs-on: windows-latest + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 + with: + node-version: '20' + - run: npm ci --legacy-peer-deps + - name: tslint + run: npm run lint + - name: Validate npm package installation + run: npm run validate:npmpack:win + - name: Validate Visual Studio Code extension package generation + run: npm run vscode:pack + - name: Validate npm global installation from GitHub code base + run: | + npm uninstall -g azurite + npm run build + npm install -g + azurite -v + azurite-blob -v + azurite-queue -v + azurite-table -v + + Azurite_Mac_Node20: + runs-on: macOS-latest + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 + with: + node-version: '20' + - run: npm ci --legacy-peer-deps + - name: tslint + run: npm run lint + - name: Validate npm package installation + run: npm run validate:npmpack:linux_mac + - name: Validate Visual Studio Code extension package generation + run: npm run vscode:pack + - name: Validate npm global installation from GitHub code base + run: | + sudo npm uninstall -g azurite + npm run build + sudo npm install -g + azurite -v + azurite-blob -v + azurite-queue -v + azurite-table -v + + Azurite_Mac_Node16: + runs-on: macOS-latest + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 + with: + node-version: '16' + - run: npm ci --legacy-peer-deps + - run: npm run lint + - run: npm run validate:npmpack:linux_mac + - run: npm run vscode:pack + - name: Validate npm global installation from GitHub code base + run: | + sudo npm uninstall -g azurite + npm run build + sudo npm install -g + azurite -v + azurite-blob -v + azurite-queue -v + azurite-table -v + + Azurite_Docker: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - run: npm ci --legacy-peer-deps + - run: npm run docker:build + - name: Validate docker image + run: | + docker run xstoreazurite.azurecr.io/public/azure-storage/azurite:latest azurite -v + docker run xstoreazurite.azurecr.io/public/azure-storage/azurite:latest azurite-blob -v + docker run xstoreazurite.azurecr.io/public/azure-storage/azurite:latest azurite-queue -v + docker run xstoreazurite.azurecr.io/public/azure-storage/azurite:latest azurite-table -v + + Azurite_ExeTest: + runs-on: windows-latest + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 + with: + node-version: '18' + - run: npm ci --legacy-peer-deps + - run: npm run build:exe + - run: npm run test:exe + + Azurite_LinuxBinaryTest: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 + with: + node-version: '20' + - run: npm ci --legacy-peer-deps + - run: npm run build:linux + - run: npm run test:linux + +## TODO: the following job in Azure pipeline is still not added to github action +# Azurite_Governance_Origin: +# runs-on: ubuntu-latest +# steps: +# - uses: actions/checkout@v4 +# - name: Component detection +# uses: ComponentGovernanceComponentDetection@0 +# inputs: +# scanType: "Register" +# verbosity: "Verbose" +# alertWarningLevel: "High" \ No newline at end of file From 128ea4142fea529c9f113cde43537b3845c69ac0 Mon Sep 17 00:00:00 2001 From: Ben Lewis Date: Thu, 8 Aug 2024 02:52:50 +1200 Subject: [PATCH 295/297] Fixed failing test on Windows caused by #2433 (#2446) * Fixed failing test on Windows. On Windows to truncate the file, which is opened in append mode, the file first needs to be closed. Expanded the test case to include another valid extent, this time prior to failed update. * Remove redundant changelog entry. --- src/common/persistence/FSExtentStore.ts | 16 ++++++---- tests/blob/fsStore.test.ts | 42 ++++++++++++++++--------- 2 files changed, 37 insertions(+), 21 deletions(-) diff --git a/src/common/persistence/FSExtentStore.ts b/src/common/persistence/FSExtentStore.ts index 6701f2f08..31eedb31a 100644 --- a/src/common/persistence/FSExtentStore.ts +++ b/src/common/persistence/FSExtentStore.ts @@ -3,7 +3,7 @@ import { createReadStream, createWriteStream, fdatasync, - ftruncate, + truncate, mkdir, open, stat, @@ -35,7 +35,7 @@ import OperationQueue from "./OperationQueue"; const statAsync = promisify(stat); const mkdirAsync = promisify(mkdir); const unlinkAsync = promisify(unlink); -const ftruncateAsync = promisify(ftruncate); +const truncateAsync = promisify(truncate); // The max size of an extent. const MAX_EXTENT_SIZE = DEFAULT_MAX_EXTENT_SIZE; @@ -295,18 +295,22 @@ export default class FSExtentStore implements IExtentStore { count }; } catch (err) { - // Reset cursor position to the current offset. + // Reset cursor position to the current offset. On Windows, truncating a file open in append mode doesn't + // work, so we need to close the file descriptor first. try { - await ftruncateAsync(fd, appendExtent.offset); + appendExtent.fd = undefined; + await closeAsync(fd); + await truncateAsync(path, appendExtent.offset); + // Indicate that the extent is ready for the next append operation. + appendExtent.appendStatus = AppendStatusCode.Idle; } catch (truncate_err) { this.logger.error( - `FSExtentStore:appendExtent() Truncate fd:${fd} len: ${appendExtent.offset} error:${JSON.stringify( + `FSExtentStore:appendExtent() Truncate path:${path} len: ${appendExtent.offset} error:${JSON.stringify( truncate_err )}.`, contextId ); } - appendExtent.appendStatus = AppendStatusCode.Idle; throw err; } })() diff --git a/tests/blob/fsStore.test.ts b/tests/blob/fsStore.test.ts index 49dbbb511..b0aee39bb 100644 --- a/tests/blob/fsStore.test.ts +++ b/tests/blob/fsStore.test.ts @@ -12,27 +12,39 @@ describe("FSExtentStore", () => { const metadataStore: IExtentMetadataStore = mock(); metadataStore.getExtentLocationId = () => Promise.resolve("Default"); + async function readIntoString(readable: NodeJS.ReadableStream): Promise { + const chunks: Buffer[] = []; + for await (const chunk of readable) { + chunks.push(chunk as Buffer); + } + const buffer = Buffer.concat(chunks); + return buffer.toString(); + } + it("should handle input stream error gracefully during appendExtent @loki", async () => { const store = new FSExtentStore(metadataStore, DEFAULT_BLOB_PERSISTENCE_ARRAY, logger); await store.init(); + // Write a valid stream to the store. + const stream1 = Readable.from("First", { objectMode: false }); + const extent1 = await store.appendExtent(stream1); + assert.strictEqual(extent1.offset, 0); + assert.strictEqual(extent1.count, 5); + // A null value within the Readable.from array causes the stream to emit an error. - const stream1 = Readable.from(["deadbeef", null], { objectMode: false }); - await assert.rejects(store.appendExtent(stream1)); + const stream2 = Readable.from(["deadbeef", null], { objectMode: false }); + await assert.rejects(store.appendExtent(stream2)); - // Write a valid stream to the store. - const stream2 = Readable.from("Test", { objectMode: false }); - const extent = await store.appendExtent(stream2); - assert.strictEqual(extent.offset, 0); - assert.strictEqual(extent.count, 4); + // Write another valid stream to the store. + const stream3 = Readable.from("Test", { objectMode: false }); + const extent3 = await store.appendExtent(stream3); + assert.strictEqual(extent3.offset, 5); + assert.strictEqual(extent3.count, 4); - // Check that the extent is readable. - let readable = await store.readExtent(extent); - const chunks: Buffer[] = []; - for await (const chunk of readable) { - chunks.push(chunk as Buffer); - } - const data = Buffer.concat(chunks); - assert.strictEqual(data.toString(), "Test"); + // Check that the extents is readable. + let readable1 = await store.readExtent(extent1); + assert.strictEqual(await readIntoString(readable1), "First"); + let readable3 = await store.readExtent(extent3); + assert.strictEqual(await readIntoString(readable3), "Test"); }); }); From 331dff24bc97205f16303e136a40a9e35598cc19 Mon Sep 17 00:00:00 2001 From: EmmaZhu-MSFT Date: Tue, 20 Aug 2024 23:46:04 -0700 Subject: [PATCH 296/297] Bump REST API version to 2024-11-04 (#2452) --- ChangeLog.md | 3 +++ README.md | 14 +++++++------- package-lock.json | 4 ++-- package.json | 2 +- src/blob/utils/constants.ts | 5 +++-- src/queue/utils/constants.ts | 5 +++-- src/table/utils/constants.ts | 5 +++-- 7 files changed, 22 insertions(+), 16 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index 2b6deb099..4053d41ac 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -4,10 +4,13 @@ ## Upcoming Release +## 2024.08 Version 3.32.0 + General: - Bump mysql2 to resolve to 3.10.1 for security patches - Fixed an issue where premature client disconnections led to all following requests failing with a 500 error. (issue #1346) +- Bump up service API version to 2024-11-04 Blob: diff --git a/README.md b/README.md index 7b5633bf2..a4150bcc7 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,7 @@ | Version | Azure Storage API Version | Service Support | Description | Reference Links | | ------------------------------------------------------------------ | ------------------------- | ------------------------------ | ------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| 3.31.0 | 2024-08-04 | Blob, Queue and Table(preview) | Azurite V3 based on TypeScript & New Architecture | [NPM](https://www.npmjs.com/package/azurite) - [Docker](https://hub.docker.com/_/microsoft-azure-storage-azurite) - [Visual Studio Code Extension](https://marketplace.visualstudio.com/items?itemName=Azurite.azurite) | +| 3.32.0 | 2024-11-04 | Blob, Queue and Table(preview) | Azurite V3 based on TypeScript & New Architecture | [NPM](https://www.npmjs.com/package/azurite) - [Docker](https://hub.docker.com/_/microsoft-azure-storage-azurite) - [Visual Studio Code Extension](https://marketplace.visualstudio.com/items?itemName=Azurite.azurite) | | [Legacy (v2)](https://github.com/Azure/Azurite/tree/legacy-master) | 2016-05-31 | Blob, Queue and Table | Legacy Azurite V2 | [NPM](https://www.npmjs.com/package/azurite) | - [Azurite V3](#azurite-v3) @@ -78,19 +78,19 @@ Compared to V2, Azurite V3 implements a new architecture leveraging code generat ## Features & Key Changes in Azurite V3 -- Blob storage features align with Azure Storage API version 2024-08-04 (Refer to support matrix section below) +- Blob storage features align with Azure Storage API version 2024-11-04 (Refer to support matrix section below) - SharedKey/Account SAS/Service SAS/Public Access Authentications/OAuth - Get/Set Blob Service Properties - Create/List/Delete Containers - Create/Read/List/Update/Delete Block Blobs - Create/Read/List/Update/Delete Page Blobs -- Queue storage features align with Azure Storage API version 2024-08-04 (Refer to support matrix section below) +- Queue storage features align with Azure Storage API version 2024-11-04 (Refer to support matrix section below) - SharedKey/Account SAS/Service SAS/OAuth - Get/Set Queue Service Properties - Preflight Request - Create/List/Delete Queues - Put/Get/Peek/Update/Delete/Clear Messages -- Table storage features align with Azure Storage API version 2024-08-04 (Refer to support matrix section below) +- Table storage features align with Azure Storage API version 2024-11-04 (Refer to support matrix section below) - SharedKey/Account SAS/Service SAS/OAuth - Create/List/Delete Tables - Insert/Update/Query/Delete Table Entities @@ -971,7 +971,7 @@ All the generated code is kept in `generated` folder, including the generated mi ## Support Matrix -Latest release targets **2024-08-04** API version **blob** service. +Latest release targets **2024-11-04** API version **blob** service. Detailed support matrix: @@ -1030,7 +1030,7 @@ Detailed support matrix: - Encryption Scope - Get Page Ranges Continuation Token -Latest version supports for **2024-08-04** API version **queue** service. +Latest version supports for **2024-11-04** API version **queue** service. Detailed support matrix: - Supported Vertical Features @@ -1059,7 +1059,7 @@ Detailed support matrix: - Following features or REST APIs are NOT supported or limited supported in this release (will support more features per customers feedback in future releases) - SharedKey Lite -Latest version supports for **2024-08-04** API version **table** service (preview). +Latest version supports for **2024-11-04** API version **table** service (preview). Detailed support matrix: - Supported Vertical Features diff --git a/package-lock.json b/package-lock.json index f57328b53..0a2c6e702 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "azurite", - "version": "3.31.0", + "version": "3.32.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "azurite", - "version": "3.31.0", + "version": "3.32.0", "license": "MIT", "dependencies": { "@azure/ms-rest-js": "^1.5.0", diff --git a/package.json b/package.json index 05d5ae514..8843a1d3c 100644 --- a/package.json +++ b/package.json @@ -3,7 +3,7 @@ "displayName": "Azurite", "description": "An open source Azure Storage API compatible server", "icon": "icon.png", - "version": "3.31.0", + "version": "3.32.0", "publisher": "Azurite", "categories": [ "Other" diff --git a/src/blob/utils/constants.ts b/src/blob/utils/constants.ts index b92815a92..e7d008f4a 100644 --- a/src/blob/utils/constants.ts +++ b/src/blob/utils/constants.ts @@ -1,8 +1,8 @@ import { StoreDestinationArray } from "../../common/persistence/IExtentStore"; import * as Models from "../generated/artifacts/models"; -export const VERSION = "3.31.0"; -export const BLOB_API_VERSION = "2024-08-04"; +export const VERSION = "3.32.0"; +export const BLOB_API_VERSION = "2024-11-04"; export const DEFAULT_BLOB_SERVER_HOST_NAME = "127.0.0.1"; // Change to 0.0.0.0 when needs external access export const DEFAULT_LIST_BLOBS_MAX_RESULTS = 5000; export const DEFAULT_LIST_CONTAINERS_MAX_RESULTS = 5000; @@ -97,6 +97,7 @@ export const DEFAULT_BLOB_PERSISTENCE_ARRAY: StoreDestinationArray = [ ]; export const ValidAPIVersions = [ + "2024-11-04", "2024-08-04", "2024-05-04", "2024-02-04", diff --git a/src/queue/utils/constants.ts b/src/queue/utils/constants.ts index 3af4b0b0f..9829b2963 100644 --- a/src/queue/utils/constants.ts +++ b/src/queue/utils/constants.ts @@ -1,7 +1,7 @@ import { StoreDestinationArray } from "../../common/persistence/IExtentStore"; -export const VERSION = "3.31.0"; -export const QUEUE_API_VERSION = "2024-08-04"; +export const VERSION = "3.32.0"; +export const QUEUE_API_VERSION = "2024-11-04"; export const DEFAULT_QUEUE_SERVER_HOST_NAME = "127.0.0.1"; // Change to 0.0.0.0 when needs external access export const DEFAULT_QUEUE_LISTENING_PORT = 10001; export const IS_PRODUCTION = process.env.NODE_ENV === "production"; @@ -90,6 +90,7 @@ export const DEFAULT_QUEUE_PERSISTENCE_ARRAY: StoreDestinationArray = [ ]; export const ValidAPIVersions = [ + "2024-11-04", "2024-08-04", "2024-05-04", "2024-02-04", diff --git a/src/table/utils/constants.ts b/src/table/utils/constants.ts index b9d1d78b1..16bdf4888 100644 --- a/src/table/utils/constants.ts +++ b/src/table/utils/constants.ts @@ -17,8 +17,8 @@ export enum TABLE_STATUSCODE { } export const DEFAULT_TABLE_CONTEXT_PATH = "azurite_table_context"; -export const TABLE_API_VERSION = "2024-08-04"; -export const VERSION = "3.31.0"; +export const TABLE_API_VERSION = "2024-11-04"; +export const VERSION = "3.32.0"; // Max Body size is 4 MB export const BODY_SIZE_MAX = 1024 * 1024 * 4; // Max Entity size is 1 MB @@ -73,6 +73,7 @@ export const DEFAULT_TABLE_PERSISTENCE_ARRAY: StoreDestinationArray = [ export const QUERY_RESULT_MAX_NUM = 1000; export const ValidAPIVersions = [ + "2024-11-04", "2024-08-04", "2024-05-04", "2024-02-04", From 76f626284e4b4b58b95065bb3c92351f30af7f3d Mon Sep 17 00:00:00 2001 From: Benny Nazimov <66024037+benny-n@users.noreply.github.com> Date: Wed, 28 Aug 2024 13:59:15 +0300 Subject: [PATCH 297/297] Prevents invalid metadata names in Blob APIs (#2453) * do not allow invalid metadata names in blob APIs * update chanelog * more test coverage --- ChangeLog.md | 4 ++++ src/blob/handlers/AppendBlobHandler.ts | 2 +- src/blob/handlers/BlobHandler.ts | 16 ++++------------ src/blob/handlers/BlockBlobHandler.ts | 4 ++-- src/blob/handlers/ContainerHandler.ts | 4 ++-- src/blob/handlers/PageBlobHandler.ts | 2 +- src/common/utils/constants.ts | 2 ++ src/common/utils/utils.ts | 7 ++++++- tests/blob/apis/appendblob.test.ts | 26 ++++++++++++++++++++++++++ tests/blob/apis/blob.test.ts | 25 +++++++++++++++++++++++++ tests/blob/apis/blockblob.test.ts | 26 ++++++++++++++++++++++++++ tests/blob/apis/container.test.ts | 26 ++++++++++++++++++++++++++ tests/blob/apis/pageblob.test.ts | 26 ++++++++++++++++++++++++++ 13 files changed, 151 insertions(+), 19 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index 4053d41ac..ff49c163a 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -4,6 +4,10 @@ ## Upcoming Release +Blob: + +- Fixed an issue where all blob APIs allowed metadata names which were not valid C# identifiers. + ## 2024.08 Version 3.32.0 General: diff --git a/src/blob/handlers/AppendBlobHandler.ts b/src/blob/handlers/AppendBlobHandler.ts index d52bd788f..9731b7c71 100644 --- a/src/blob/handlers/AppendBlobHandler.ts +++ b/src/blob/handlers/AppendBlobHandler.ts @@ -45,7 +45,7 @@ export default class AppendBlobHandler extends BaseHandler // Preserve metadata key case const metadata = convertRawHeadersToMetadata( - blobCtx.request!.getRawHeaders() + blobCtx.request!.getRawHeaders(), context.contextId! ); const blob: BlobModel = { diff --git a/src/blob/handlers/BlobHandler.ts b/src/blob/handlers/BlobHandler.ts index 981f9a278..ef3625cee 100644 --- a/src/blob/handlers/BlobHandler.ts +++ b/src/blob/handlers/BlobHandler.ts @@ -327,17 +327,9 @@ export default class BlobHandler extends BaseHandler implements IBlobHandler { // Preserve metadata key case const metadata = convertRawHeadersToMetadata( - blobCtx.request!.getRawHeaders() + blobCtx.request!.getRawHeaders(), context.contextId! ); - if (metadata != undefined) { - Object.entries(metadata).forEach(([key, value]) => { - if (key.includes("-")) { - throw StorageErrorFactory.getInvalidMetadata(context.contextId!); - } - }); - } - const res = await this.metadataStore.setBlobMetadata( context, account, @@ -597,7 +589,7 @@ export default class BlobHandler extends BaseHandler implements IBlobHandler { // Preserve metadata key case const metadata = convertRawHeadersToMetadata( - blobCtx.request!.getRawHeaders() + blobCtx.request!.getRawHeaders(), context.contextId! ); const res = await this.metadataStore.createSnapshot( @@ -669,7 +661,7 @@ export default class BlobHandler extends BaseHandler implements IBlobHandler { // Preserve metadata key case const metadata = convertRawHeadersToMetadata( - blobCtx.request!.getRawHeaders() + blobCtx.request!.getRawHeaders(), context.contextId! ); const res = await this.metadataStore.startCopyFromURL( @@ -872,7 +864,7 @@ export default class BlobHandler extends BaseHandler implements IBlobHandler { // Preserve metadata key case const metadata = convertRawHeadersToMetadata( - blobCtx.request!.getRawHeaders() + blobCtx.request!.getRawHeaders(), context.contextId! ); const res = await this.metadataStore.copyFromURL( diff --git a/src/blob/handlers/BlockBlobHandler.ts b/src/blob/handlers/BlockBlobHandler.ts index 025809987..c3252161d 100644 --- a/src/blob/handlers/BlockBlobHandler.ts +++ b/src/blob/handlers/BlockBlobHandler.ts @@ -97,7 +97,7 @@ export default class BlockBlobHandler const blob: BlobModel = { deleted: false, // Preserve metadata key case - metadata: convertRawHeadersToMetadata(blobCtx.request!.getRawHeaders()), + metadata: convertRawHeadersToMetadata(blobCtx.request!.getRawHeaders(), context.contextId!), accountName, containerName, name: blobName, @@ -345,7 +345,7 @@ export default class BlockBlobHandler blob.properties.blobType = Models.BlobType.BlockBlob; blob.metadata = convertRawHeadersToMetadata( // Preserve metadata key case - blobCtx.request!.getRawHeaders() + blobCtx.request!.getRawHeaders(), context.contextId! ); blob.properties.accessTier = Models.AccessTier.Hot; blob.properties.cacheControl = options.blobHTTPHeaders.blobCacheControl; diff --git a/src/blob/handlers/ContainerHandler.ts b/src/blob/handlers/ContainerHandler.ts index 9fde0d7b4..c8d82d786 100644 --- a/src/blob/handlers/ContainerHandler.ts +++ b/src/blob/handlers/ContainerHandler.ts @@ -64,7 +64,7 @@ export default class ContainerHandler extends BaseHandler // Preserve metadata key case const metadata = convertRawHeadersToMetadata( - blobCtx.request!.getRawHeaders() + blobCtx.request!.getRawHeaders(), context.contextId! ); await this.metadataStore.createContainer(context, { @@ -205,7 +205,7 @@ export default class ContainerHandler extends BaseHandler // Preserve metadata key case const metadata = convertRawHeadersToMetadata( - blobCtx.request!.getRawHeaders() + blobCtx.request!.getRawHeaders(), context.contextId! ); await this.metadataStore.setContainerMetadata( diff --git a/src/blob/handlers/PageBlobHandler.ts b/src/blob/handlers/PageBlobHandler.ts index 51ec16eaa..429d860ef 100644 --- a/src/blob/handlers/PageBlobHandler.ts +++ b/src/blob/handlers/PageBlobHandler.ts @@ -100,7 +100,7 @@ export default class PageBlobHandler extends BaseHandler // Preserve metadata key case const metadata = convertRawHeadersToMetadata( - blobCtx.request!.getRawHeaders() + blobCtx.request!.getRawHeaders(), context.contextId! ); const etag = newEtag(); diff --git a/src/common/utils/constants.ts b/src/common/utils/constants.ts index 4ed88ae2d..c4fa903f5 100644 --- a/src/common/utils/constants.ts +++ b/src/common/utils/constants.ts @@ -58,3 +58,5 @@ export const EMULATOR_ACCOUNT_KEY = Buffer.from( "Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==", "base64" ); + +export const VALID_CSHARP_IDENTIFIER_REGEX = /^[a-zA-Z_][a-zA-Z0-9_]*$/; diff --git a/src/common/utils/utils.ts b/src/common/utils/utils.ts index 8df02200f..3debf4f56 100644 --- a/src/common/utils/utils.ts +++ b/src/common/utils/utils.ts @@ -2,6 +2,8 @@ import { createHash, createHmac } from "crypto"; import rimraf = require("rimraf"); import { parse } from "url"; import { promisify } from "util"; +import StorageErrorFactory from "../../blob/errors/StorageErrorFactory"; +import { VALID_CSHARP_IDENTIFIER_REGEX } from "./constants"; // LokiFsStructuredAdapter // tslint:disable-next-line:no-var-requires @@ -21,7 +23,7 @@ export function convertDateTimeStringMsTo7Digital( } export function convertRawHeadersToMetadata( - rawHeaders: string[] = [] + rawHeaders: string[] = [], contextId: string = "" ): { [propertyName: string]: string } | undefined { const metadataPrefix = "x-ms-meta-"; const res: { [propertyName: string]: string } = {}; @@ -34,6 +36,9 @@ export function convertRawHeadersToMetadata( header.length > metadataPrefix.length ) { const key = header.substr(metadataPrefix.length); + if (!key.match(VALID_CSHARP_IDENTIFIER_REGEX)) { + throw StorageErrorFactory.getInvalidMetadata(contextId); + } let value = rawHeaders[i + 1] || ""; if (res[key] !== undefined) { value = `${res[key]},${value}`; diff --git a/tests/blob/apis/appendblob.test.ts b/tests/blob/apis/appendblob.test.ts index 64ff23667..c0ec6b97f 100644 --- a/tests/blob/apis/appendblob.test.ts +++ b/tests/blob/apis/appendblob.test.ts @@ -133,6 +133,32 @@ describe("AppendBlobAPIs", () => { assert.deepStrictEqual(properties.blobCommittedBlockCount, 0); }); + it("Create append blob should fail when metadata names are invalid C# identifiers @loki @sql", async () => { + let invalidNames = [ + "1invalid", + "invalid.name", + "invalid-name", + ] + for (let i = 0; i < invalidNames.length; i++) { + const metadata = { + [invalidNames[i]]: "value" + }; + let hasError = false; + try { + await appendBlobClient.create({ + metadata: metadata + }); + } catch (error) { + assert.deepStrictEqual(error.statusCode, 400); + assert.strictEqual(error.code, 'InvalidMetadata'); + hasError = true; + } + if (!hasError) { + assert.fail(); + } + } + }); + it("Delete append blob should work @loki", async () => { await appendBlobClient.create(); await appendBlobClient.delete(); diff --git a/tests/blob/apis/blob.test.ts b/tests/blob/apis/blob.test.ts index ac07bc396..5574a4f81 100644 --- a/tests/blob/apis/blob.test.ts +++ b/tests/blob/apis/blob.test.ts @@ -496,6 +496,31 @@ describe("BlobAPIs", () => { }); + it("should fail when upload has metadata names that are invalid C# identifiers @loki @sql", async () => { + let invalidNames = [ + "1invalid", + "invalid.name", + "invalid-name", + ] + for (let i = 0; i < invalidNames.length; i++) { + const metadata = { + [invalidNames[i]]: "value" + }; + let hasError = false; + try { + await blockBlobClient.upload(content, content.length, { metadata }); + } catch (error) { + assert.deepStrictEqual(error.statusCode, 400); + assert.strictEqual(error.code, 'InvalidMetadata'); + hasError = true; + } + if (!hasError) + { + assert.fail(); + } + } + }); + it("acquireLease_available_proposedLeaseId_fixed @loki @sql", async () => { const guid = "ca761232ed4211cebacd00aa0057b223"; const duration = 30; diff --git a/tests/blob/apis/blockblob.test.ts b/tests/blob/apis/blockblob.test.ts index b483a2e7a..a23a09b13 100644 --- a/tests/blob/apis/blockblob.test.ts +++ b/tests/blob/apis/blockblob.test.ts @@ -151,6 +151,32 @@ describe("BlockBlobAPIs", () => { ); }); + it("upload should fail when metadata names are invalid C# identifiers @loki @sql", async () => { + let invalidNames = [ + "1invalid", + "invalid.name", + "invalid-name", + ] + for (let i = 0; i < invalidNames.length; i++) { + const metadata = { + [invalidNames[i]]: "value" + }; + let hasError = false; + try { + await blockBlobClient.upload('b', 1, { + metadata: metadata + }); + } catch (error) { + assert.deepStrictEqual(error.statusCode, 400); + assert.strictEqual(error.code, 'InvalidMetadata'); + hasError = true; + } + if (!hasError) { + assert.fail(); + } + } + }); + it("stageBlock @loki @sql", async () => { const body = "HelloWorld"; const result_stage = await blockBlobClient.stageBlock( diff --git a/tests/blob/apis/container.test.ts b/tests/blob/apis/container.test.ts index ca9aa039a..3a51cb75c 100644 --- a/tests/blob/apis/container.test.ts +++ b/tests/blob/apis/container.test.ts @@ -239,6 +239,32 @@ describe("ContainerAPIs", () => { done(); }); + it("create should fail when metadata names are invalid C# identifiers @loki @sql", async () => { + let invalidNames = [ + "1invalid", + "invalid.name", + "invalid-name", + ] + for (let i = 0; i < invalidNames.length; i++) { + const metadata = { + [invalidNames[i]]: "value" + }; + let hasError = false; + try { + const cURL = serviceClient.getContainerClient(getUniqueName(containerName)); + const access = "container"; + await cURL.create({ metadata, access }); + } catch (error) { + assert.deepStrictEqual(error.statusCode, 400); + assert.strictEqual(error.code, 'InvalidMetadata'); + hasError = true; + } + if (!hasError) { + assert.fail(); + } + } + }); + it("listBlobHierarchySegment with default parameters @loki @sql", async () => { const blobClients = []; for (let i = 0; i < 3; i++) { diff --git a/tests/blob/apis/pageblob.test.ts b/tests/blob/apis/pageblob.test.ts index ac6ed07d2..e66ec5756 100644 --- a/tests/blob/apis/pageblob.test.ts +++ b/tests/blob/apis/pageblob.test.ts @@ -145,6 +145,32 @@ describe("PageBlobAPIs", () => { ); }); + it("create should fail when metadata names are invalid C# identifiers @loki @sql", async () => { + let invalidNames = [ + "1invalid", + "invalid.name", + "invalid-name", + ] + for (let i = 0; i < invalidNames.length; i++) { + const metadata = { + [invalidNames[i]]: "value" + }; + let hasError = false; + try { + await pageBlobClient.create(512, { + metadata: metadata + }); + } catch (error) { + assert.deepStrictEqual(error.statusCode, 400); + assert.strictEqual(error.code, 'InvalidMetadata'); + hasError = true; + } + if (!hasError) { + assert.fail(); + } + } + }); + it("download page blob with partial ranges @loki", async () => { const length = 512 * 10; await pageBlobClient.create(length);