From 3df87e39cd7586551b657d01861bf4f38dcbbf2e Mon Sep 17 00:00:00 2001 From: raj pandey Date: Wed, 24 Jul 2024 00:35:05 +0530 Subject: [PATCH 1/4] fixed the SRE issues --- .../contentstack-audit/src/messages/index.ts | 10 ++-- .../src/utils/asset-helper.ts | 47 +++++++++++++---- .../src/utils/entries-helper.ts | 51 +++++++++++++++---- .../05-Update-reference-entry-from-mapper.js | 14 ++--- .../src/utils/modules.js | 9 ++-- 5 files changed, 95 insertions(+), 36 deletions(-) diff --git a/packages/contentstack-audit/src/messages/index.ts b/packages/contentstack-audit/src/messages/index.ts index 61e1e0d827..c6058e5622 100644 --- a/packages/contentstack-audit/src/messages/index.ts +++ b/packages/contentstack-audit/src/messages/index.ts @@ -76,13 +76,9 @@ function $t(msg: string, args: Record): string { if (!msg) return ''; for (const key of Object.keys(args)) { - const escapedKey = escapeRegExp(key); - const escapedKeyRegex = new RegExp(`{${escapedKey}}`, 'g'); - let { status } = validateRegex(escapedKeyRegex) - if (status === 'safe') { - const sanitizedValue = args[key] ? escapeRegExp(args[key]) : ''; - msg = msg.replace(escapedKeyRegex, sanitizedValue || escapedKey); - } + const escapedKey = key.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); + const placeholder = `{${escapedKey}}`; + msg = msg.split(placeholder).join(args[key]); } return msg; diff --git a/packages/contentstack-import/src/utils/asset-helper.ts b/packages/contentstack-import/src/utils/asset-helper.ts index d13bb8dd57..4dc2d73b21 100644 --- a/packages/contentstack-import/src/utils/asset-helper.ts +++ b/packages/contentstack-import/src/utils/asset-helper.ts @@ -247,31 +247,56 @@ export const lookupAssets = function ( assetUids = _.uniq(assetUids); assetUrls = _.uniq(assetUrls); let entry = JSON.stringify(data.entry); + + // Note: Use this code in case production breaks + // assetUrls.forEach(function (assetUrl: any) { + // let mappedAssetUrl = mappedAssetUrls[assetUrl]; + // if (typeof mappedAssetUrl !== 'undefined') { + // //NOTE - This code was added to resolve the SRE issue but once the code was merged Assets URLs in JSON RTE started breaking + // // const sanitizedUrl = escapeRegExp(assetUrl).replace(/\.\./g, '\\$&'); + // // const escapedMappedUrl = escapeRegExp(mappedAssetUrl).replace(/\.\./g, '\\$&'); + // // entry = entry.replace(new RegExp(sanitizedUrl, 'img'), escapedMappedUrl); + // entry = entry.replace(new RegExp(assetUrl, 'img'), mappedAssetUrl); + // matchedUrls.push(mappedAssetUrl); + // } else { + // unmatchedUrls.push(assetUrl); + // } + // }); + // To be deleted when prod breaks assetUrls.forEach(function (assetUrl: any) { let mappedAssetUrl = mappedAssetUrls[assetUrl]; if (typeof mappedAssetUrl !== 'undefined') { - //NOTE - This code was added to resolve the SRE issue but once the code was merged Assets URLs in JSON RTE started breaking - // const sanitizedUrl = escapeRegExp(assetUrl).replace(/\.\./g, '\\$&'); - // const escapedMappedUrl = escapeRegExp(mappedAssetUrl).replace(/\.\./g, '\\$&'); - // entry = entry.replace(new RegExp(sanitizedUrl, 'img'), escapedMappedUrl); - entry = entry.replace(new RegExp(assetUrl, 'img'), mappedAssetUrl); + entry = entry.split(assetUrl).join(mappedAssetUrl); matchedUrls.push(mappedAssetUrl); } else { unmatchedUrls.push(assetUrl); } }); + // Note: Use this incase the production breaks + // assetUids.forEach(function (assetUid: any) { + // let uid = mappedAssetUids[assetUid]; + // if (typeof uid !== 'undefined') { + // const escapedAssetUid = assetUid.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); + // const regex = new RegExp(`\\b${escapedAssetUid}\\b`, 'img'); + // let { status } = validateRegex(new RegExp(regex, 'img')); + // if (status === 'safe') { + // entry = entry.replace(regex, uid); + // matchedUids.push(assetUid); + // } + // } else { + // unmatchedUids.push(assetUid); + // } + // }); + + // To be deleted when prod breaks assetUids.forEach(function (assetUid: any) { let uid = mappedAssetUids[assetUid]; if (typeof uid !== 'undefined') { const escapedAssetUid = assetUid.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); - const regex = new RegExp(`\\b${escapedAssetUid}\\b`, 'img'); - let { status } = validateRegex(new RegExp(regex, 'img')); - if (status === 'safe') { - entry = entry.replace(regex, uid); - matchedUids.push(assetUid); - } + entry = entry.split(escapedAssetUid).join(uid); + matchedUids.push(assetUid); } else { unmatchedUids.push(assetUid); } diff --git a/packages/contentstack-import/src/utils/entries-helper.ts b/packages/contentstack-import/src/utils/entries-helper.ts index 2a6019225c..c57f02b04f 100644 --- a/packages/contentstack-import/src/utils/entries-helper.ts +++ b/packages/contentstack-import/src/utils/entries-helper.ts @@ -89,7 +89,9 @@ export const lookupEntries = function ( } else { const key = _parent[j]; if (Object.prototype.hasOwnProperty.call(_entry, key)) { - _entry = _entry[key]; + const tempEntry = Object.create(null); + _.merge(tempEntry, _entry); + _entry = tempEntry[key]; let _keys = _.clone(_parent).splice(j + 1, len); if (Array.isArray(_entry)) { for (let i = 0, _i = _entry?.length; i < _i; i++) { @@ -201,20 +203,51 @@ export const lookupEntries = function ( uids = _.uniq(uids); let entry = JSON.stringify(data.entry); + + //Note: Use this in case prod breaks + // uids?.forEach(function (uid: any) { + // if (mappedUids.hasOwnProperty(uid)) { + // const sanitizedUid = escapeRegExp(uid); + // const escapedMappedUid = escapeRegExp(mappedUids[uid]); + // const uidRegex = new RegExp(`\\b${sanitizedUid}\\b`, 'img'); + // let { status } = validateRegex(uidRegex); + // if (status === 'safe') { + // entry = entry.replace(uidRegex, escapedMappedUid); + // mapped.push(uid); + // } + // } else { + // unmapped.push(uid); + // } + // }); + uids?.forEach(function (uid: any) { if (mappedUids.hasOwnProperty(uid)) { const sanitizedUid = escapeRegExp(uid); const escapedMappedUid = escapeRegExp(mappedUids[uid]); - const uidRegex = new RegExp(`\\b${sanitizedUid}\\b`, 'img'); - let { status } = validateRegex(uidRegex); - if (status === 'safe') { - entry = entry.replace(uidRegex, escapedMappedUid); - mapped.push(uid); + let index = entry.indexOf(sanitizedUid); + while (index !== -1) { + if ((index === 0 || !isWordCharacter(entry.charAt(index - 1))) && + (index + sanitizedUid.length === entry.length || !isWordCharacter(entry.charAt(index + sanitizedUid.length)))) { + entry = entry.substring(0, index) + escapedMappedUid + entry.substring(index + sanitizedUid.length); + index += escapedMappedUid.length; + } else { + index += sanitizedUid.length; + } + index = entry.indexOf(sanitizedUid, index); } + mapped.push(uid); } else { unmapped.push(uid); } }); + // Note: Delete when prod breaks + function escapeRegExp(str:string) { + return str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); + } + + function isWordCharacter(char:string) { + return /[a-zA-Z0-9_]/.test(char); + } if (unmapped.length > 0) { let unmappedUids = fileHelper.readFileSync(path.join(uidMapperPath, 'unmapped-uids.json')); @@ -580,9 +613,9 @@ export const restoreJsonRteEntryRefs = ( function updateUids(str: string, match: string, uidMapper: Record) { const sanitizedMatch = escapeRegExp(match); - const regex = new RegExp(`\\b${sanitizedMatch}\\b`, 'g'); - let { status } = validateRegex(regex); - if (status === 'safe') return str.replace(regex, (matchedString) => uidMapper[matchedString]); + const parts = str.split(sanitizedMatch); + let result = parts.join(uidMapper[match] || sanitizedMatch); + return result; } function setDirtyTrue(jsonRteChild: any) { diff --git a/packages/contentstack-migration/examples/05-Update-reference-entry-from-mapper.js b/packages/contentstack-migration/examples/05-Update-reference-entry-from-mapper.js index d02ddc2d68..c67fd60659 100644 --- a/packages/contentstack-migration/examples/05-Update-reference-entry-from-mapper.js +++ b/packages/contentstack-migration/examples/05-Update-reference-entry-from-mapper.js @@ -7,7 +7,7 @@ module.exports = async ({ migration, stackSDKInstance, managementAPIClient, conf const modules = ['entries', 'assets', 'extensions', 'marketplace_apps']; const readAllModulesUids = (filePath) => { - let uidMapping = {}; + let uidMapping = Object.create(null); modules.forEach((module) => { const mappingFilePath = path.join(sanitizePath(filePath), 'mapper', sanitizePath(module), 'uid-mapping.json'); @@ -15,9 +15,11 @@ module.exports = async ({ migration, stackSDKInstance, managementAPIClient, conf const mappedIds = JSON.parse(fs.readFileSync(sanitizePath(mappingFilePath), 'utf-8')); if (module === 'marketplace_apps') { - Object.values(mappedIds).forEach((ids) => Object.assign(uidMapping, ids)); + Object.values(mappedIds).forEach((ids) => { + uidMapping = { ...uidMapping, ...sanitizeObject(ids) }; + }); } else { - Object.assign(uidMapping, sanitizeObject(mappedIds)); + uidMapping = { ...uidMapping, ...sanitizeObject(mappedIds) }; } } }); @@ -33,7 +35,7 @@ module.exports = async ({ migration, stackSDKInstance, managementAPIClient, conf } } return sanitized; - } + }; const getEntries = async (ct) => { try { @@ -73,10 +75,10 @@ module.exports = async ({ migration, stackSDKInstance, managementAPIClient, conf let oldUids = Object.keys(uidMapping); matches.forEach((m) => { if (oldUids.includes(m)) { - let regex = new RegExp(m, 'g'); + let sanitizedUid = m; let { status } = validateRegex(regex); if (status === 'safe') { - stringifiedEntry = stringifiedEntry.replace(regex, uidMapping[m]); + stringifiedEntry = stringifiedEntry.split(sanitizedUid).join(uisdMapping[sanitizedUid]); console.log(chalk.green(`Replacing the UID '${m}' with '${uidMapping[m]}'...`)); isUpdated = true; } diff --git a/packages/contentstack-migration/src/utils/modules.js b/packages/contentstack-migration/src/utils/modules.js index b6fa55b76c..da6ee5c96a 100644 --- a/packages/contentstack-migration/src/utils/modules.js +++ b/packages/contentstack-migration/src/utils/modules.js @@ -1,5 +1,5 @@ const fs = require('fs'); -const { execSync } = require('child_process'); +const { execFileSync } = require('child_process'); const path = require('path'); const { sanitizePath } = require('@contentstack/cli-utilities'); const os = require('os'); @@ -70,8 +70,11 @@ function installDependencies(dependencies, directory) { function executeShellCommand(command, directory = '') { try { - execSync(command, { stdio: 'inherit', cwd: directory }); - console.log(`Command executed successfully: ${command}`); + if (command.startsWith('npm i')) { + const [cmd, ...args] = command.split(' '); + execFileSync(cmd, args, { stdio: 'inherit', cwd: directory }); + console.log(`Command executed successfully: ${command}`); + } } catch (error) { console.error(`Error: ${error.message}`); } From 36044abf01db91f6c941d6747a4f38b5b03ae100 Mon Sep 17 00:00:00 2001 From: raj pandey Date: Tue, 6 Aug 2024 17:09:53 +0530 Subject: [PATCH 2/4] PR comments resolved --- .../src/utils/asset-helper.ts | 33 ------------- .../src/utils/entries-helper.ts | 46 +++---------------- .../05-Update-reference-entry-from-mapper.js | 11 ++--- 3 files changed, 11 insertions(+), 79 deletions(-) diff --git a/packages/contentstack-import/src/utils/asset-helper.ts b/packages/contentstack-import/src/utils/asset-helper.ts index 4dc2d73b21..6abb268caf 100644 --- a/packages/contentstack-import/src/utils/asset-helper.ts +++ b/packages/contentstack-import/src/utils/asset-helper.ts @@ -247,23 +247,7 @@ export const lookupAssets = function ( assetUids = _.uniq(assetUids); assetUrls = _.uniq(assetUrls); let entry = JSON.stringify(data.entry); - - // Note: Use this code in case production breaks - // assetUrls.forEach(function (assetUrl: any) { - // let mappedAssetUrl = mappedAssetUrls[assetUrl]; - // if (typeof mappedAssetUrl !== 'undefined') { - // //NOTE - This code was added to resolve the SRE issue but once the code was merged Assets URLs in JSON RTE started breaking - // // const sanitizedUrl = escapeRegExp(assetUrl).replace(/\.\./g, '\\$&'); - // // const escapedMappedUrl = escapeRegExp(mappedAssetUrl).replace(/\.\./g, '\\$&'); - // // entry = entry.replace(new RegExp(sanitizedUrl, 'img'), escapedMappedUrl); - // entry = entry.replace(new RegExp(assetUrl, 'img'), mappedAssetUrl); - // matchedUrls.push(mappedAssetUrl); - // } else { - // unmatchedUrls.push(assetUrl); - // } - // }); - // To be deleted when prod breaks assetUrls.forEach(function (assetUrl: any) { let mappedAssetUrl = mappedAssetUrls[assetUrl]; if (typeof mappedAssetUrl !== 'undefined') { @@ -274,23 +258,6 @@ export const lookupAssets = function ( } }); - // Note: Use this incase the production breaks - // assetUids.forEach(function (assetUid: any) { - // let uid = mappedAssetUids[assetUid]; - // if (typeof uid !== 'undefined') { - // const escapedAssetUid = assetUid.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); - // const regex = new RegExp(`\\b${escapedAssetUid}\\b`, 'img'); - // let { status } = validateRegex(new RegExp(regex, 'img')); - // if (status === 'safe') { - // entry = entry.replace(regex, uid); - // matchedUids.push(assetUid); - // } - // } else { - // unmatchedUids.push(assetUid); - // } - // }); - - // To be deleted when prod breaks assetUids.forEach(function (assetUid: any) { let uid = mappedAssetUids[assetUid]; if (typeof uid !== 'undefined') { diff --git a/packages/contentstack-import/src/utils/entries-helper.ts b/packages/contentstack-import/src/utils/entries-helper.ts index c57f02b04f..ac070662aa 100644 --- a/packages/contentstack-import/src/utils/entries-helper.ts +++ b/packages/contentstack-import/src/utils/entries-helper.ts @@ -203,51 +203,20 @@ export const lookupEntries = function ( uids = _.uniq(uids); let entry = JSON.stringify(data.entry); - - //Note: Use this in case prod breaks - // uids?.forEach(function (uid: any) { - // if (mappedUids.hasOwnProperty(uid)) { - // const sanitizedUid = escapeRegExp(uid); - // const escapedMappedUid = escapeRegExp(mappedUids[uid]); - // const uidRegex = new RegExp(`\\b${sanitizedUid}\\b`, 'img'); - // let { status } = validateRegex(uidRegex); - // if (status === 'safe') { - // entry = entry.replace(uidRegex, escapedMappedUid); - // mapped.push(uid); - // } - // } else { - // unmapped.push(uid); - // } - // }); - uids?.forEach(function (uid: any) { if (mappedUids.hasOwnProperty(uid)) { const sanitizedUid = escapeRegExp(uid); const escapedMappedUid = escapeRegExp(mappedUids[uid]); - let index = entry.indexOf(sanitizedUid); - while (index !== -1) { - if ((index === 0 || !isWordCharacter(entry.charAt(index - 1))) && - (index + sanitizedUid.length === entry.length || !isWordCharacter(entry.charAt(index + sanitizedUid.length)))) { - entry = entry.substring(0, index) + escapedMappedUid + entry.substring(index + sanitizedUid.length); - index += escapedMappedUid.length; - } else { - index += sanitizedUid.length; - } - index = entry.indexOf(sanitizedUid, index); + const uidRegex = new RegExp(`\\b${sanitizedUid}\\b`, 'img'); + let { status } = validateRegex(uidRegex); + if (status === 'safe') { + entry = entry.replace(uidRegex, escapedMappedUid); + mapped.push(uid); } - mapped.push(uid); } else { unmapped.push(uid); } }); - // Note: Delete when prod breaks - function escapeRegExp(str:string) { - return str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); - } - - function isWordCharacter(char:string) { - return /[a-zA-Z0-9_]/.test(char); - } if (unmapped.length > 0) { let unmappedUids = fileHelper.readFileSync(path.join(uidMapperPath, 'unmapped-uids.json')); @@ -613,9 +582,8 @@ export const restoreJsonRteEntryRefs = ( function updateUids(str: string, match: string, uidMapper: Record) { const sanitizedMatch = escapeRegExp(match); - const parts = str.split(sanitizedMatch); - let result = parts.join(uidMapper[match] || sanitizedMatch); - return result; + const replacement = uidMapper[match] ?? sanitizedMatch; + return str.split(sanitizedMatch).join(replacement); } function setDirtyTrue(jsonRteChild: any) { diff --git a/packages/contentstack-migration/examples/05-Update-reference-entry-from-mapper.js b/packages/contentstack-migration/examples/05-Update-reference-entry-from-mapper.js index c67fd60659..63eeb1784e 100644 --- a/packages/contentstack-migration/examples/05-Update-reference-entry-from-mapper.js +++ b/packages/contentstack-migration/examples/05-Update-reference-entry-from-mapper.js @@ -75,13 +75,10 @@ module.exports = async ({ migration, stackSDKInstance, managementAPIClient, conf let oldUids = Object.keys(uidMapping); matches.forEach((m) => { if (oldUids.includes(m)) { - let sanitizedUid = m; - let { status } = validateRegex(regex); - if (status === 'safe') { - stringifiedEntry = stringifiedEntry.split(sanitizedUid).join(uisdMapping[sanitizedUid]); - console.log(chalk.green(`Replacing the UID '${m}' with '${uidMapping[m]}'...`)); - isUpdated = true; - } + let sanitizedUid = m; + stringifiedEntry = stringifiedEntry.split(sanitizedUid).join(uisdMapping[sanitizedUid]); + console.log(chalk.green(`Replacing the UID '${m}' with '${uidMapping[m]}'...`)); + isUpdated = true; } }); return { stringifiedEntry, isUpdated }; From fc8e6c2e7221645518a7c7289e1ce47de7b1dcbe Mon Sep 17 00:00:00 2001 From: raj pandey Date: Tue, 6 Aug 2024 18:01:18 +0530 Subject: [PATCH 3/4] added else --- packages/contentstack-migration/src/utils/modules.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/contentstack-migration/src/utils/modules.js b/packages/contentstack-migration/src/utils/modules.js index 1ebbea3b1e..7144d81b61 100644 --- a/packages/contentstack-migration/src/utils/modules.js +++ b/packages/contentstack-migration/src/utils/modules.js @@ -74,6 +74,8 @@ function executeShellCommand(command, directory = '') { const [cmd, ...args] = command.split(' '); execFileSync(cmd, args, { stdio: 'inherit', cwd: directory }); console.log(`Command executed successfully: ${command}`); + } else { + console.log(`Command should only be 'npm i '`); } } catch (error) { console.error(`Command execution failed. Error: ${error.message}`); From 3069cdb620a8c60876fb94e90349ed26c41930c9 Mon Sep 17 00:00:00 2001 From: raj pandey Date: Wed, 7 Aug 2024 00:34:40 +0530 Subject: [PATCH 4/4] fixed setup-repo issue --- package-lock.json | 6 +++--- .../contentstack-audit/src/messages/index.ts | 5 ++--- pnpm-lock.yaml | 18 +++++++++--------- 3 files changed, 14 insertions(+), 15 deletions(-) diff --git a/package-lock.json b/package-lock.json index 8d12b089a7..54be44d642 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4348,9 +4348,9 @@ } }, "node_modules/aws-sdk": { - "version": "2.1668.0", - "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.1668.0.tgz", - "integrity": "sha512-4Vcg3KjNZDHbvG4DI6jusN0DUPpRy3E/tBb6CA6ojlS2V1X5zljU9tkspICtbxXdY1gPFmKUe5COPc34XHG1RA==", + "version": "2.1669.0", + "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.1669.0.tgz", + "integrity": "sha512-ua3AfvS2rUiOpf9choxNXLKE3T70yY6klGovdekXd5ZTwzDXQoYw1dokfArIub/2BM9Dmgi/bFq/crnz83tX0w==", "dev": true, "hasInstallScript": true, "dependencies": { diff --git a/packages/contentstack-audit/src/messages/index.ts b/packages/contentstack-audit/src/messages/index.ts index c6058e5622..20298f66d4 100644 --- a/packages/contentstack-audit/src/messages/index.ts +++ b/packages/contentstack-audit/src/messages/index.ts @@ -1,5 +1,4 @@ import memoize from 'lodash/memoize'; -import { escapeRegExp, validateRegex } from '@contentstack/cli-utilities'; const errors = {}; @@ -47,7 +46,7 @@ const auditFixMsg = { AUDIT_FIX_CMD_DESCRIPTION: 'Perform audits and fix possible errors in the exported Contentstack data.', WF_FIX_MSG: 'Successfully removed the workflow {uid} named {name}.', ENTRY_MANDATORY_FIELD_FIX: `Removing the publish details from the entry with UID '{uid}' in Locale '{locale}'...`, - ENTRY_SELECT_FIELD_FIX: `Adding the value '{value}' in the select field of entry UID '{uid}'...` + ENTRY_SELECT_FIELD_FIX: `Adding the value '{value}' in the select field of entry UID '{uid}'...`, }; const messages: typeof errors & @@ -76,7 +75,7 @@ function $t(msg: string, args: Record): string { if (!msg) return ''; for (const key of Object.keys(args)) { - const escapedKey = key.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); + const escapedKey = key.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); const placeholder = `{${escapedKey}}`; msg = msg.split(placeholder).join(args[key]); } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 2ff65dc3dc..2311b41997 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -4658,8 +4658,8 @@ packages: dependencies: possible-typed-array-names: 1.0.0 - /aws-sdk/2.1668.0: - resolution: {integrity: sha512-4Vcg3KjNZDHbvG4DI6jusN0DUPpRy3E/tBb6CA6ojlS2V1X5zljU9tkspICtbxXdY1gPFmKUe5COPc34XHG1RA==} + /aws-sdk/2.1669.0: + resolution: {integrity: sha512-ua3AfvS2rUiOpf9choxNXLKE3T70yY6klGovdekXd5ZTwzDXQoYw1dokfArIub/2BM9Dmgi/bFq/crnz83tX0w==} engines: {node: '>= 10.0.0'} requiresBuild: true dependencies: @@ -11218,7 +11218,7 @@ packages: '@oclif/plugin-not-found': 2.4.3 '@oclif/plugin-warn-if-update-available': 2.1.1 async-retry: 1.3.3 - aws-sdk: 2.1668.0 + aws-sdk: 2.1669.0 concurrently: 7.6.0 debug: 4.3.6 find-yarn-workspace-root: 2.0.0 @@ -11253,7 +11253,7 @@ packages: '@oclif/plugin-not-found': 2.4.3_4j7van2hzdd6hrxfrj2mlmuwxm '@oclif/plugin-warn-if-update-available': 2.1.1_4j7van2hzdd6hrxfrj2mlmuwxm async-retry: 1.3.3 - aws-sdk: 2.1668.0 + aws-sdk: 2.1669.0 concurrently: 7.6.0 debug: 4.3.6 find-yarn-workspace-root: 2.0.0 @@ -11288,7 +11288,7 @@ packages: '@oclif/plugin-not-found': 2.4.3 '@oclif/plugin-warn-if-update-available': 2.1.1 async-retry: 1.3.3 - aws-sdk: 2.1668.0 + aws-sdk: 2.1669.0 concurrently: 7.6.0 debug: 4.3.6 find-yarn-workspace-root: 2.0.0 @@ -11323,7 +11323,7 @@ packages: '@oclif/plugin-not-found': 2.4.3_typescript@4.9.5 '@oclif/plugin-warn-if-update-available': 2.1.1_typescript@4.9.5 async-retry: 1.3.3 - aws-sdk: 2.1668.0 + aws-sdk: 2.1669.0 concurrently: 7.6.0 debug: 4.3.6 find-yarn-workspace-root: 2.0.0 @@ -11358,7 +11358,7 @@ packages: '@oclif/plugin-not-found': 2.4.3_kb3eoetozq7tj3ldxanlv4btym '@oclif/plugin-warn-if-update-available': 2.1.1_kb3eoetozq7tj3ldxanlv4btym async-retry: 1.3.3 - aws-sdk: 2.1668.0 + aws-sdk: 2.1669.0 concurrently: 7.6.0 debug: 4.3.6 find-yarn-workspace-root: 2.0.0 @@ -11393,7 +11393,7 @@ packages: '@oclif/plugin-not-found': 2.4.3_ogreqof3k35xezedraj6pnd45y '@oclif/plugin-warn-if-update-available': 2.1.1_ogreqof3k35xezedraj6pnd45y async-retry: 1.3.3 - aws-sdk: 2.1668.0 + aws-sdk: 2.1669.0 concurrently: 7.6.0 debug: 4.3.6 find-yarn-workspace-root: 2.0.0 @@ -11428,7 +11428,7 @@ packages: '@oclif/plugin-not-found': 2.4.3_ogreqof3k35xezedraj6pnd45y '@oclif/plugin-warn-if-update-available': 2.1.1_ogreqof3k35xezedraj6pnd45y async-retry: 1.3.3 - aws-sdk: 2.1668.0 + aws-sdk: 2.1669.0 concurrently: 7.6.0 debug: 4.3.6 find-yarn-workspace-root: 2.0.0