From 501d7047979edf6903429fea69e09ed22ed135e0 Mon Sep 17 00:00:00 2001 From: Mark Frisbey <5108740+mfrisbey@users.noreply.github.com> Date: Mon, 31 Jul 2023 16:46:45 -0600 Subject: [PATCH 1/4] add support for proxies. --- README.md | 21 ++++++---- package-lock.json | 14 +++++++ package.json | 1 + src/commands/aem/upload.js | 44 +++++++++++++++++--- test/commands/aem/upload.test.js | 71 ++++++++++++++++++++++++++++---- 5 files changed, 131 insertions(+), 20 deletions(-) diff --git a/README.md b/README.md index 2ef5320..6b9c67d 100644 --- a/README.md +++ b/README.md @@ -2,13 +2,16 @@ Plugin to Adobe I/O CLI for executing commands related to Adobe Experience Manager. -* [Overview](#overview) -* [Usage](#usage) -* [Adding New Commands](#adding-new-commands) -* [Commands](#commands) -* [Releasing](#releasing) -* [Contributing](#contributing) -* [Licensing](#licensing) +- [Overview](#overview) +- [Usage](#usage) +- [Adding New Commands](#adding-new-commands) + - [Testing Commands](#testing-commands) +- [Commands](#commands) + - [`aio-aem aem:upload FILES_FOLDERS`](#aio-aem-aemupload-files_folders) +- [Proxy Support](#proxy-support) +- [Releasing](#releasing) +- [Contributing](#contributing) +- [Licensing](#licensing) @@ -142,6 +145,10 @@ EXAMPLES _See code: [src/commands/aem/upload.js](https://github.com/adobe/aio-cli-plugin-aem/blob/v1.1.1/src/commands/aem/upload.js)_ +# Proxy Support + +The AEM plugin supports proxies inline with the [AIO CLI](https://github.com/adobe/aio-cli#proxy-support). See the documentation there for details. + # Releasing This module uses [semantic-release](https://github.com/semantic-release/semantic-release) when publishing new versions. The process is initiated upon merging commits to the `master` branch. Review semantic-release's documentation for commit message format. diff --git a/package-lock.json b/package-lock.json index 9f7afd1..8e8c13e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,6 +14,7 @@ "@oclif/config": "^1.14.0", "@oclif/errors": "^1.1.2", "debug": "^4.1.0", + "hpagent": "^1.2.0", "mustache": "^3.2.1", "winston": "^3.2.1" }, @@ -11357,6 +11358,14 @@ "node": ">=10" } }, + "node_modules/hpagent": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/hpagent/-/hpagent-1.2.0.tgz", + "integrity": "sha512-A91dYTeIB6NoXG+PxTQpCCDDnfHsW9kc06Lvpu1TEe9gnd6ZFeiBoRO9JvzEv6xK7EX97/dUE8g/vBMTqTS3CA==", + "engines": { + "node": ">=14" + } + }, "node_modules/html-escaper": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", @@ -32146,6 +32155,11 @@ "lru-cache": "^6.0.0" } }, + "hpagent": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/hpagent/-/hpagent-1.2.0.tgz", + "integrity": "sha512-A91dYTeIB6NoXG+PxTQpCCDDnfHsW9kc06Lvpu1TEe9gnd6ZFeiBoRO9JvzEv6xK7EX97/dUE8g/vBMTqTS3CA==" + }, "html-escaper": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", diff --git a/package.json b/package.json index a8b4b2c..f0b2957 100644 --- a/package.json +++ b/package.json @@ -13,6 +13,7 @@ "@oclif/config": "^1.14.0", "@oclif/errors": "^1.1.2", "debug": "^4.1.0", + "hpagent": "^1.2.0", "mustache": "^3.2.1", "winston": "^3.2.1" }, diff --git a/src/commands/aem/upload.js b/src/commands/aem/upload.js index 63d7413..b7d930f 100644 --- a/src/commands/aem/upload.js +++ b/src/commands/aem/upload.js @@ -14,6 +14,7 @@ const Path = require('path'); const fs = require('fs'); const winston = require('winston'); const mustache = require('mustache'); +const { HttpProxyAgent, HttpsProxyAgent } = require('hpagent'); const {flags} = require('@oclif/command'); const { @@ -67,11 +68,7 @@ class UploadCommand extends BaseCommand { const uploadOptions = new FileSystemUploadOptions() .withUrl(`${trimRight(host, ['/'])}${target}`) - .withHttpOptions({ - headers: { - Authorization: `Basic ${Buffer.from(credential).toString('base64')}` - } - }) + .withHttpOptions(this.buildHttpOptions(credential)) .withDeepUpload(deep) .withMaxConcurrent(parseInt(threads, 10)); @@ -94,6 +91,43 @@ class UploadCommand extends BaseCommand { log.info(`Log file is saved to log file '${logFile}'`); } + + /** + * Creates a simple object containing the options that will be provided + * to Fetch for requests sent by the CLI. + * @param {string} credential Basic auth credentials to include in + * each request. + * @returns {*} HTTP options for Fetch. + */ + buildHttpOptions(credential) { + const httpOptions = { + headers: { + Authorization: `Basic ${Buffer.from(credential).toString('base64')}` + } + }; + const agent = this.getProxyAgent(); + if (agent) { + httpOptions.agent = agent; + } + return httpOptions; + } + + /** + * Retrieves the HTTP agent that should be used to provide proxy capabilities + * for the command. + * @returns {*} An object that can be used as an HTTP agent for fetch. + */ + getProxyAgent() { + const httpsProxy = process.env.HTTPS_PROXY; + const httpProxy = process.env.HTTP_PROXY; + + if (httpsProxy) { + return new HttpsProxyAgent({ proxy: httpsProxy }); + } else if (httpProxy) { + return new HttpProxyAgent({ proxy: httpProxy }); + } + return undefined; + } } UploadCommand.flags = Object.assign({}, BaseCommand.flags, { diff --git a/test/commands/aem/upload.test.js b/test/commands/aem/upload.test.js index 293bd8b..cef8ad9 100644 --- a/test/commands/aem/upload.test.js +++ b/test/commands/aem/upload.test.js @@ -13,13 +13,68 @@ governing permissions and limitations under the License. const UploadCommand = require('../../../src/commands/aem/upload') const {stdout} = require('stdout-stderr') -beforeAll(() => stdout.start()) -afterAll(() => stdout.stop()) +describe('upload tests', () => { + const OLD_ENV = process.env; -test('exports', async () => { - expect(typeof UploadCommand.upload).toEqual('function') -}) + beforeAll(() => stdout.start()) + afterAll(() => stdout.stop()) -test('deep', async () => { - expect(UploadCommand.upload.flags.deep.char).toEqual('d') -}) + beforeEach(() => { + jest.resetModules(); + process.env = { ...OLD_ENV }; + }); + + afterEach(() => { + process.env = OLD_ENV; + }); + + test('exports', async () => { + expect(typeof UploadCommand.upload).toEqual('function') + }) + + test('deep', async () => { + expect(UploadCommand.upload.flags.deep.char).toEqual('d') + }) + + test('http options', () => { + const command = new UploadCommand.upload(); + const options = command.buildHttpOptions('testing:testing'); + expect(options).toStrictEqual({ + headers: { + Authorization: 'Basic dGVzdGluZzp0ZXN0aW5n' + } + }); + }); + + test('https proxy', () => { + process.env.HTTPS_PROXY = 'https://fakeproxy'; + const command = new UploadCommand.upload(); + const options = command.buildHttpOptions('testing:testing'); + expect(options.headers).toStrictEqual({ + Authorization: 'Basic dGVzdGluZzp0ZXN0aW5n' + }); + console.log(options.agent); + expect(options.agent.constructor.name).toEqual('HttpsProxyAgent'); + }); + + test('http proxy', () => { + process.env.HTTP_PROXY = 'http://fakeproxy'; + const command = new UploadCommand.upload(); + const options = command.buildHttpOptions('testing:testing'); + expect(options.headers).toStrictEqual({ + Authorization: 'Basic dGVzdGluZzp0ZXN0aW5n' + }); + expect(options.agent.constructor.name).toEqual('HttpProxyAgent'); + }); + + test('http both proxies', () => { + process.env.HTTPS_PROXY = 'https://fakeproxy'; + process.env.HTTP_PROXY = 'http://fakeproxy'; + const command = new UploadCommand.upload(); + const options = command.buildHttpOptions('testing:testing'); + expect(options.headers).toStrictEqual({ + Authorization: 'Basic dGVzdGluZzp0ZXN0aW5n' + }); + expect(options.agent.constructor.name).toEqual('HttpsProxyAgent'); + }); +}); From 3dca92a9f91d9a4d8233deae4ce8e8d1218e8181 Mon Sep 17 00:00:00 2001 From: Mark Frisbey <5108740+mfrisbey@users.noreply.github.com> Date: Thu, 3 Aug 2023 17:25:49 -0600 Subject: [PATCH 2/4] correctly choose proxy based on target url. --- src/commands/aem/upload.js | 19 ++++++++++++------- test/commands/aem/upload.test.js | 14 +++++++++----- 2 files changed, 21 insertions(+), 12 deletions(-) diff --git a/src/commands/aem/upload.js b/src/commands/aem/upload.js index b7d930f..8ebd19f 100644 --- a/src/commands/aem/upload.js +++ b/src/commands/aem/upload.js @@ -66,9 +66,10 @@ class UploadCommand extends BaseCommand { deep, } = newFlags; + const uploadUrl = `${trimRight(host, ['/'])}${target}`; const uploadOptions = new FileSystemUploadOptions() - .withUrl(`${trimRight(host, ['/'])}${target}`) - .withHttpOptions(this.buildHttpOptions(credential)) + .withUrl(uploadUrl) + .withHttpOptions(this.buildHttpOptions(uploadUrl, credential)) .withDeepUpload(deep) .withMaxConcurrent(parseInt(threads, 10)); @@ -95,17 +96,18 @@ class UploadCommand extends BaseCommand { /** * Creates a simple object containing the options that will be provided * to Fetch for requests sent by the CLI. + * @param {string} uploadUrl URL to which items are being uploaded. * @param {string} credential Basic auth credentials to include in * each request. * @returns {*} HTTP options for Fetch. */ - buildHttpOptions(credential) { + buildHttpOptions(uploadUrl, credential) { const httpOptions = { headers: { Authorization: `Basic ${Buffer.from(credential).toString('base64')}` } }; - const agent = this.getProxyAgent(); + const agent = this.getProxyAgent(uploadUrl); if (agent) { httpOptions.agent = agent; } @@ -115,15 +117,18 @@ class UploadCommand extends BaseCommand { /** * Retrieves the HTTP agent that should be used to provide proxy capabilities * for the command. + * @param {string} uploadUrl URL to which the uploading is being performed. + * Will be used to determine which proxy to use. * @returns {*} An object that can be used as an HTTP agent for fetch. */ - getProxyAgent() { + getProxyAgent(uploadUrl) { + const url = new URL(uploadUrl); const httpsProxy = process.env.HTTPS_PROXY; const httpProxy = process.env.HTTP_PROXY; - if (httpsProxy) { + if (url.protocol === 'https:' && httpsProxy) { return new HttpsProxyAgent({ proxy: httpsProxy }); - } else if (httpProxy) { + } else if (url.protocol === 'http:' && httpProxy) { return new HttpProxyAgent({ proxy: httpProxy }); } return undefined; diff --git a/test/commands/aem/upload.test.js b/test/commands/aem/upload.test.js index cef8ad9..6ae2e27 100644 --- a/test/commands/aem/upload.test.js +++ b/test/commands/aem/upload.test.js @@ -38,29 +38,30 @@ describe('upload tests', () => { test('http options', () => { const command = new UploadCommand.upload(); - const options = command.buildHttpOptions('testing:testing'); + const options = command.buildHttpOptions('https://faketargeturl', 'testing:testing'); expect(options).toStrictEqual({ headers: { Authorization: 'Basic dGVzdGluZzp0ZXN0aW5n' } }); + const httpOptions = command.buildHttpOptions('http://faketargeturl', 'testing:testing'); + expect(httpOptions).toStrictEqual(options); }); test('https proxy', () => { process.env.HTTPS_PROXY = 'https://fakeproxy'; const command = new UploadCommand.upload(); - const options = command.buildHttpOptions('testing:testing'); + const options = command.buildHttpOptions('https://faketargeturl', 'testing:testing'); expect(options.headers).toStrictEqual({ Authorization: 'Basic dGVzdGluZzp0ZXN0aW5n' }); - console.log(options.agent); expect(options.agent.constructor.name).toEqual('HttpsProxyAgent'); }); test('http proxy', () => { process.env.HTTP_PROXY = 'http://fakeproxy'; const command = new UploadCommand.upload(); - const options = command.buildHttpOptions('testing:testing'); + const options = command.buildHttpOptions('http://faketargeturl', 'testing:testing'); expect(options.headers).toStrictEqual({ Authorization: 'Basic dGVzdGluZzp0ZXN0aW5n' }); @@ -71,10 +72,13 @@ describe('upload tests', () => { process.env.HTTPS_PROXY = 'https://fakeproxy'; process.env.HTTP_PROXY = 'http://fakeproxy'; const command = new UploadCommand.upload(); - const options = command.buildHttpOptions('testing:testing'); + const options = command.buildHttpOptions('https://fakeproxyurl', 'testing:testing'); expect(options.headers).toStrictEqual({ Authorization: 'Basic dGVzdGluZzp0ZXN0aW5n' }); expect(options.agent.constructor.name).toEqual('HttpsProxyAgent'); + + const httpOptions = command.buildHttpOptions('http://fakeproxyurl', 'testing:testing'); + expect(httpOptions.agent.constructor.name).toEqual('HttpProxyAgent'); }); }); From 37e038fb8681dbc76a01119138f49e4dd1af9f11 Mon Sep 17 00:00:00 2001 From: Mark Frisbey <5108740+mfrisbey@users.noreply.github.com> Date: Thu, 3 Aug 2023 18:35:21 -0600 Subject: [PATCH 3/4] handle eventual consistency errors. --- src/commands/aem/upload.js | 21 ++++++++++++++++++++- test/commands/aem/upload.test.js | 32 ++++++++++++++++++++++++++++---- 2 files changed, 48 insertions(+), 5 deletions(-) diff --git a/src/commands/aem/upload.js b/src/commands/aem/upload.js index 8ebd19f..e09d6a4 100644 --- a/src/commands/aem/upload.js +++ b/src/commands/aem/upload.js @@ -105,7 +105,10 @@ class UploadCommand extends BaseCommand { const httpOptions = { headers: { Authorization: `Basic ${Buffer.from(credential).toString('base64')}` - } + }, + retryOptions: { + retryOnHttpResponseError: UploadCommand.shouldRetry, + }, }; const agent = this.getProxyAgent(uploadUrl); if (agent) { @@ -114,6 +117,22 @@ class UploadCommand extends BaseCommand { return httpOptions; } + /** + * Determines whether a given HTTP response error should be retried. Qualifying errors will include + * 404 response codes to the initiate/complete servlets. This is for handling eventual consistency + * issues. + * @param {*} [httpResponseError] An error received by the node-httptransfer module. + * @returns {boolean} True if a request should be retried, false otherwise. + */ + static shouldRetry(httpResponseError = {}) { + const { status, url = '' } = httpResponseError; + const lowerCaseUrl = url.toLowerCase(); + if (status === 404 && (lowerCaseUrl.includes('.initiateupload.json') || lowerCaseUrl.includes('.completeupload.json'))) { + return true; + } + return false; + } + /** * Retrieves the HTTP agent that should be used to provide proxy capabilities * for the command. diff --git a/test/commands/aem/upload.test.js b/test/commands/aem/upload.test.js index 6ae2e27..8a1cb04 100644 --- a/test/commands/aem/upload.test.js +++ b/test/commands/aem/upload.test.js @@ -39,11 +39,10 @@ describe('upload tests', () => { test('http options', () => { const command = new UploadCommand.upload(); const options = command.buildHttpOptions('https://faketargeturl', 'testing:testing'); - expect(options).toStrictEqual({ - headers: { - Authorization: 'Basic dGVzdGluZzp0ZXN0aW5n' - } + expect(options.headers).toStrictEqual({ + Authorization: 'Basic dGVzdGluZzp0ZXN0aW5n' }); + expect(typeof options.retryOptions.retryOnHttpResponseError).toStrictEqual('function'); const httpOptions = command.buildHttpOptions('http://faketargeturl', 'testing:testing'); expect(httpOptions).toStrictEqual(options); }); @@ -81,4 +80,29 @@ describe('upload tests', () => { const httpOptions = command.buildHttpOptions('http://fakeproxyurl', 'testing:testing'); expect(httpOptions.agent.constructor.name).toEqual('HttpProxyAgent'); }); + + test('should retry', () => { + expect(UploadCommand.upload.shouldRetry()).toStrictEqual(false); + expect(UploadCommand.upload.shouldRetry({})).toStrictEqual(false); + expect(UploadCommand.upload.shouldRetry({ + status: 200, + url: 'http://fakeurl/path.initiateupload.json', + })).toStrictEqual(false); + expect(UploadCommand.upload.shouldRetry({ + status: 404, + url: 'http://fakeurl/path.initiateupload.json', + })).toStrictEqual(true); + expect(UploadCommand.upload.shouldRetry({ + status: 404, + url: 'http://fakeurl/path.completeupload.json', + })).toStrictEqual(true); + expect(UploadCommand.upload.shouldRetry({ + status: 200, + url: 'http://fakeurl/path.completeupload.json', + })).toStrictEqual(false); + expect(UploadCommand.upload.shouldRetry({ + status: 404, + url: 'http://fakeurl/path', + })).toStrictEqual(false); + }); }); From 58cebc266f56f847c4488052179ecd65f1dcff8d Mon Sep 17 00:00:00 2001 From: Mark Frisbey <5108740+mfrisbey@users.noreply.github.com> Date: Fri, 4 Aug 2023 09:27:35 -0600 Subject: [PATCH 4/4] update aem-upload so cors requests are proxied --- package-lock.json | 78 +++++++++++++++++++++++------------------------ package.json | 2 +- 2 files changed, 40 insertions(+), 40 deletions(-) diff --git a/package-lock.json b/package-lock.json index 8e8c13e..8804bab 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,7 +9,7 @@ "version": "1.1.1", "license": "Apache-2.0", "dependencies": { - "@adobe/aem-upload": "^2.0.1", + "@adobe/aem-upload": "^2.0.2", "@oclif/command": "^1", "@oclif/config": "^1.14.0", "@oclif/errors": "^1.1.2", @@ -53,12 +53,12 @@ } }, "node_modules/@adobe/aem-upload": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@adobe/aem-upload/-/aem-upload-2.0.1.tgz", - "integrity": "sha512-Znd7TfINBA1NfvoPUXeaQlh7dx5FNrfIOBfA6nuyU+NI7nen/C7vKRVqypHJAMFqQHfpecut3r+ZJhTTlXBdrg==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@adobe/aem-upload/-/aem-upload-2.0.2.tgz", + "integrity": "sha512-KRbGRgO+0L94nEc5NKeba+jlkkiASY6ZX4EdBSLCDxzkVim98eqk2Tiqnm3YpnTsqUMXCbIlSa05su63E50RzA==", "dependencies": { "@adobe/cloud-service-client": "^1.1.0", - "@adobe/httptransfer": "^3.3.1", + "@adobe/httptransfer": "^3.4.1", "async": "^3.2.0", "async-lock": "^1.2.8", "filesize": "^4.2.1", @@ -3080,15 +3080,15 @@ } }, "node_modules/@adobe/httptransfer": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/@adobe/httptransfer/-/httptransfer-3.3.1.tgz", - "integrity": "sha512-tbKgk7/vRaIqihZeszCC+b30rG13d5fK4/eoL65zMJ7issNZjFGokk67Rfphr97Zou9ue8NgySc3bHzsi2Im1g==", + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/@adobe/httptransfer/-/httptransfer-3.4.1.tgz", + "integrity": "sha512-R2v4olg1emsEvewM5ciC3M0irhifmI1F/GHDLun58RMornf/Q/xOKgrFSqqUFQLYr/dKCAWThkJkGmchbkbPtA==", "dependencies": { - "@babel/runtime": "^7.16.7", + "@babel/runtime": "^7.22.3", "content-disposition": "^0.5.4", "content-range": "^2.0.2", - "content-type": "^1.0.4", - "core-js": "^3.21.1", + "content-type": "^1.0.5", + "core-js": "^3.30.2", "debug": "^4.3.4", "drange": "^2.0.1", "file-url": "2.0.2", @@ -3591,9 +3591,9 @@ } }, "node_modules/@babel/runtime": { - "version": "7.22.0", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.0.tgz", - "integrity": "sha512-TT6NB0oszYQ4oxLNUdG+FNHIc3MohXVCKA2BeyQ4WeM2VCSC6wBZ6P0Yfkdzxv+87D8Xk0LJyHeCKlWMvpZt0g==", + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.6.tgz", + "integrity": "sha512-wDb5pWm4WDdF6LFUde3Jl8WzPA+3ZbxYqkC6xAXuD3irdEHN1k0NfTRrJD8ZD378SJ61miMLCqIOXYhd8x+AJQ==", "dependencies": { "regenerator-runtime": "^0.13.11" }, @@ -8702,9 +8702,9 @@ } }, "node_modules/content-type": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", "engines": { "node": ">= 0.6" } @@ -8815,9 +8815,9 @@ } }, "node_modules/core-js": { - "version": "3.30.2", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.30.2.tgz", - "integrity": "sha512-uBJiDmwqsbJCWHAwjrx3cvjbMXP7xD72Dmsn5LOJpiRmE3WbBbN5rCqQ2Qh6Ek6/eOrjlWngEynBWo4VxerQhg==", + "version": "3.32.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.32.0.tgz", + "integrity": "sha512-rd4rYZNlF3WuoYuRIDEmbR/ga9CeuWX9U05umAvgrrZoHY4Z++cp/xwPQMvUpBB4Ag6J8KfD80G0zwCyaSxDww==", "hasInstallScript": true, "funding": { "type": "opencollective", @@ -23642,12 +23642,12 @@ }, "dependencies": { "@adobe/aem-upload": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@adobe/aem-upload/-/aem-upload-2.0.1.tgz", - "integrity": "sha512-Znd7TfINBA1NfvoPUXeaQlh7dx5FNrfIOBfA6nuyU+NI7nen/C7vKRVqypHJAMFqQHfpecut3r+ZJhTTlXBdrg==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@adobe/aem-upload/-/aem-upload-2.0.2.tgz", + "integrity": "sha512-KRbGRgO+0L94nEc5NKeba+jlkkiASY6ZX4EdBSLCDxzkVim98eqk2Tiqnm3YpnTsqUMXCbIlSa05su63E50RzA==", "requires": { "@adobe/cloud-service-client": "^1.1.0", - "@adobe/httptransfer": "^3.3.1", + "@adobe/httptransfer": "^3.4.1", "async": "^3.2.0", "async-lock": "^1.2.8", "filesize": "^4.2.1", @@ -25785,15 +25785,15 @@ } }, "@adobe/httptransfer": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/@adobe/httptransfer/-/httptransfer-3.3.1.tgz", - "integrity": "sha512-tbKgk7/vRaIqihZeszCC+b30rG13d5fK4/eoL65zMJ7issNZjFGokk67Rfphr97Zou9ue8NgySc3bHzsi2Im1g==", + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/@adobe/httptransfer/-/httptransfer-3.4.1.tgz", + "integrity": "sha512-R2v4olg1emsEvewM5ciC3M0irhifmI1F/GHDLun58RMornf/Q/xOKgrFSqqUFQLYr/dKCAWThkJkGmchbkbPtA==", "requires": { - "@babel/runtime": "^7.16.7", + "@babel/runtime": "^7.22.3", "content-disposition": "^0.5.4", "content-range": "^2.0.2", - "content-type": "^1.0.4", - "core-js": "^3.21.1", + "content-type": "^1.0.5", + "core-js": "^3.30.2", "debug": "^4.3.4", "drange": "^2.0.1", "file-url": "2.0.2", @@ -26167,9 +26167,9 @@ } }, "@babel/runtime": { - "version": "7.22.0", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.0.tgz", - "integrity": "sha512-TT6NB0oszYQ4oxLNUdG+FNHIc3MohXVCKA2BeyQ4WeM2VCSC6wBZ6P0Yfkdzxv+87D8Xk0LJyHeCKlWMvpZt0g==", + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.6.tgz", + "integrity": "sha512-wDb5pWm4WDdF6LFUde3Jl8WzPA+3ZbxYqkC6xAXuD3irdEHN1k0NfTRrJD8ZD378SJ61miMLCqIOXYhd8x+AJQ==", "requires": { "regenerator-runtime": "^0.13.11" } @@ -30111,9 +30111,9 @@ "integrity": "sha512-ayHd/VQMRfWFBLVXyYvNhbbR+vq5OgLJnViGV4arzQiX9odRhf1spmXF7pFEHiR8htli29Hbii0URCNfUTN4vQ==" }, "content-type": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==" }, "conventional-changelog-angular": { "version": "5.0.13", @@ -30196,9 +30196,9 @@ "dev": true }, "core-js": { - "version": "3.30.2", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.30.2.tgz", - "integrity": "sha512-uBJiDmwqsbJCWHAwjrx3cvjbMXP7xD72Dmsn5LOJpiRmE3WbBbN5rCqQ2Qh6Ek6/eOrjlWngEynBWo4VxerQhg==" + "version": "3.32.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.32.0.tgz", + "integrity": "sha512-rd4rYZNlF3WuoYuRIDEmbR/ga9CeuWX9U05umAvgrrZoHY4Z++cp/xwPQMvUpBB4Ag6J8KfD80G0zwCyaSxDww==" }, "core-util-is": { "version": "1.0.3", diff --git a/package.json b/package.json index f0b2957..7969f3d 100644 --- a/package.json +++ b/package.json @@ -8,7 +8,7 @@ "Mark Frisbey" ], "dependencies": { - "@adobe/aem-upload": "^2.0.1", + "@adobe/aem-upload": "^2.0.2", "@oclif/command": "^1", "@oclif/config": "^1.14.0", "@oclif/errors": "^1.1.2",