From ecb488266d6585229476a3dab1dfa4ab3045e434 Mon Sep 17 00:00:00 2001 From: Oliver King Date: Mon, 6 Feb 2023 13:42:55 -0500 Subject: [PATCH 01/10] Fixes multiple namespaces bug (#276) * fix ns bug * add tests * rename some variables * rename ns to namespace * fix delete + correctly type * add typing to input obj parser --- src/actions/deploy.ts | 4 +- .../blueGreen/blueGreenHelper.ts | 8 +- .../blueGreen/ingressBlueGreenHelper.ts | 3 +- .../blueGreen/serviceBlueGreenHelper.ts | 3 +- .../blueGreen/smiBlueGreenHelper.ts | 6 +- src/strategyHelpers/canary/canaryHelper.ts | 13 +- src/strategyHelpers/deploymentHelper.ts | 8 +- src/types/k8sObject.ts | 2 + src/types/kubectl.test.ts | 177 +++++++++++++++++- src/types/kubectl.ts | 84 +++++---- src/types/privatekubectl.ts | 2 - src/utilities/kubectlUtils.ts | 15 +- src/utilities/manifestStabilityUtils.ts | 79 +++++--- src/utilities/manifestUpdateUtils.ts | 3 +- 14 files changed, 326 insertions(+), 81 deletions(-) diff --git a/src/actions/deploy.ts b/src/actions/deploy.ts index e3021217c..8106badd9 100644 --- a/src/actions/deploy.ts +++ b/src/actions/deploy.ts @@ -56,7 +56,9 @@ export async function deploy( for (const ingressResource of ingressResources) { await kubectl.getResource( KubernetesConstants.DiscoveryAndLoadBalancerResource.INGRESS, - ingressResource.name + ingressResource.name, + false, + ingressResource.namespace ) } core.endGroup() diff --git a/src/strategyHelpers/blueGreen/blueGreenHelper.ts b/src/strategyHelpers/blueGreen/blueGreenHelper.ts index ac4543637..b2ba445de 100644 --- a/src/strategyHelpers/blueGreen/blueGreenHelper.ts +++ b/src/strategyHelpers/blueGreen/blueGreenHelper.ts @@ -38,7 +38,8 @@ export async function deleteGreenObjects( const resourcesToDelete: K8sDeleteObject[] = toDelete.map((obj) => { return { name: getBlueGreenResourceName(obj.metadata.name, GREEN_SUFFIX), - kind: obj.kind + kind: obj.kind, + namespace: obj.metadata.namespace } }) @@ -234,9 +235,10 @@ export function isServiceSelectorSubsetOfMatchLabel( export async function fetchResource( kubectl: Kubectl, kind: string, - name: string + name: string, + namespace?: string ): Promise { - const result = await kubectl.getResource(kind, name) + const result = await kubectl.getResource(kind, name, false, namespace) if (result == null || !!result.stderr) { return null } diff --git a/src/strategyHelpers/blueGreen/ingressBlueGreenHelper.ts b/src/strategyHelpers/blueGreen/ingressBlueGreenHelper.ts index 17625d7dd..83bda19f3 100644 --- a/src/strategyHelpers/blueGreen/ingressBlueGreenHelper.ts +++ b/src/strategyHelpers/blueGreen/ingressBlueGreenHelper.ts @@ -97,7 +97,8 @@ export async function validateIngresses( const existingIngress = await fetchResource( kubectl, inputObject.kind, - inputObject.metadata.name + inputObject.metadata.name, + inputObject?.metadata?.namespace ) const isValid = diff --git a/src/strategyHelpers/blueGreen/serviceBlueGreenHelper.ts b/src/strategyHelpers/blueGreen/serviceBlueGreenHelper.ts index 8fde8c409..d3bb50a83 100644 --- a/src/strategyHelpers/blueGreen/serviceBlueGreenHelper.ts +++ b/src/strategyHelpers/blueGreen/serviceBlueGreenHelper.ts @@ -31,7 +31,8 @@ export async function validateServicesState( const existingService = await fetchResource( kubectl, serviceObject.kind, - serviceObject.metadata.name + serviceObject.metadata.name, + serviceObject?.metadata?.namespace ) let isServiceGreen = diff --git a/src/strategyHelpers/blueGreen/smiBlueGreenHelper.ts b/src/strategyHelpers/blueGreen/smiBlueGreenHelper.ts index a6af0c810..144f6eeab 100644 --- a/src/strategyHelpers/blueGreen/smiBlueGreenHelper.ts +++ b/src/strategyHelpers/blueGreen/smiBlueGreenHelper.ts @@ -142,7 +142,8 @@ export async function validateTrafficSplitsState( let trafficSplitObject = await fetchResource( kubectl, TRAFFIC_SPLIT_OBJECT, - getBlueGreenResourceName(name, TRAFFIC_SPLIT_OBJECT_NAME_SUFFIX) + getBlueGreenResourceName(name, TRAFFIC_SPLIT_OBJECT_NAME_SUFFIX), + serviceObject?.metadata?.namespace ) core.debug( `ts object extracted was ${JSON.stringify(trafficSplitObject)}` @@ -183,7 +184,8 @@ export async function cleanupSMI( serviceObject.metadata.name, GREEN_SUFFIX ), - kind: serviceObject.kind + kind: serviceObject.kind, + namespace: serviceObject?.metadata?.namespace }) }) diff --git a/src/strategyHelpers/canary/canaryHelper.ts b/src/strategyHelpers/canary/canaryHelper.ts index 413578d62..194d5a4ae 100644 --- a/src/strategyHelpers/canary/canaryHelper.ts +++ b/src/strategyHelpers/canary/canaryHelper.ts @@ -195,9 +195,13 @@ async function cleanUpCanary( files: string[], includeServices: boolean ): Promise { - const deleteObject = async function (kind, name) { + const deleteObject = async function ( + kind: string, + name: string, + namespace: string | undefined + ) { try { - const result = await kubectl.delete([kind, name]) + const result = await kubectl.delete([kind, name], namespace) checkForErrors([result]) } catch (ex) { // Ignore failures of delete if it doesn't exist @@ -213,6 +217,7 @@ async function cleanUpCanary( for (const inputObject of parsedYaml) { const name = inputObject.metadata.name const kind = inputObject.kind + const namespace: string | undefined = inputObject?.metadata?.namespace if ( isDeploymentEntity(kind) || @@ -222,8 +227,8 @@ async function cleanUpCanary( const canaryObjectName = getCanaryResourceName(name) const baselineObjectName = getBaselineResourceName(name) - await deleteObject(kind, canaryObjectName) - await deleteObject(kind, baselineObjectName) + await deleteObject(kind, canaryObjectName, namespace) + await deleteObject(kind, baselineObjectName, namespace) } } } diff --git a/src/strategyHelpers/deploymentHelper.ts b/src/strategyHelpers/deploymentHelper.ts index 30336e5fb..76e276912 100644 --- a/src/strategyHelpers/deploymentHelper.ts +++ b/src/strategyHelpers/deploymentHelper.ts @@ -218,7 +218,12 @@ async function annotateResources( ) if (annotateNamespace) { annotateResults.push( - await kubectl.annotate('namespace', namespace, annotationKeyValStr) + await kubectl.annotate( + 'namespace', + namespace, + annotationKeyValStr, + namespace + ) ) } for (const file of files) { @@ -243,6 +248,7 @@ async function annotateResources( kubectl, resource.type, resource.name, + resource.namespace, annotationKeyValStr, allPods ) diff --git a/src/types/k8sObject.ts b/src/types/k8sObject.ts index db0c2f755..c23ff1202 100644 --- a/src/types/k8sObject.ts +++ b/src/types/k8sObject.ts @@ -2,6 +2,7 @@ export interface K8sObject { metadata: { name: string labels: Map + namespace?: string } kind: string spec: any @@ -16,6 +17,7 @@ export interface K8sServiceObject extends K8sObject { export interface K8sDeleteObject { name: string kind: string + namespace?: string } export interface K8sIngress extends K8sObject { diff --git a/src/types/kubectl.test.ts b/src/types/kubectl.test.ts index 489a7bed3..352a36cbf 100644 --- a/src/types/kubectl.test.ts +++ b/src/types/kubectl.test.ts @@ -3,7 +3,6 @@ import * as exec from '@actions/exec' import * as io from '@actions/io' import * as core from '@actions/core' import * as toolCache from '@actions/tool-cache' -import {config} from 'process' describe('Kubectl path', () => { const version = '1.1' @@ -38,6 +37,7 @@ describe('Kubectl path', () => { const kubectlPath = 'kubectlPath' const testNamespace = 'testNamespace' const defaultNamespace = 'default' +const otherNamespace = 'otherns' describe('Kubectl class', () => { describe('default namespace behavior', () => { const kubectl = new Kubectl(kubectlPath, defaultNamespace) @@ -122,6 +122,26 @@ describe('Kubectl class', () => { ], {silent: false} ) + + // overrided ns + const silent = false + await kubectl.describe( + resourceType, + resourceName, + silent, + otherNamespace + ) + expect(exec.getExecOutput).toBeCalledWith( + kubectlPath, + [ + 'describe', + resourceType, + resourceName, + '--namespace', + otherNamespace + ], + {silent} + ) }) it('describes a resource silently', async () => { @@ -140,6 +160,26 @@ describe('Kubectl class', () => { ], {silent: true} ) + + // overrided ns + const silent = false + await kubectl.describe( + resourceType, + resourceName, + silent, + otherNamespace + ) + expect(exec.getExecOutput).toBeCalledWith( + kubectlPath, + [ + 'describe', + resourceType, + resourceName, + '--namespace', + otherNamespace + ], + {silent} + ) }) it('annotates resource', async () => { @@ -165,6 +205,27 @@ describe('Kubectl class', () => { ], {silent: false} ) + + // override ns + await kubectl.annotate( + resourceType, + resourceName, + annotation, + otherNamespace + ) + expect(exec.getExecOutput).toBeCalledWith( + kubectlPath, + [ + 'annotate', + resourceType, + resourceName, + annotation, + '--overwrite', + '--namespace', + otherNamespace + ], + {silent: false} + ) }) it('annotates files with single file', async () => { @@ -185,6 +246,22 @@ describe('Kubectl class', () => { ], {silent: false} ) + + // override ns + await kubectl.annotateFiles(file, annotation, otherNamespace) + expect(exec.getExecOutput).toBeCalledWith( + kubectlPath, + [ + 'annotate', + '-f', + file, + annotation, + '--overwrite', + '--namespace', + otherNamespace + ], + {silent: false} + ) }) it('annotates files with mulitple files', async () => { @@ -205,6 +282,22 @@ describe('Kubectl class', () => { ], {silent: false} ) + + // override ns + await kubectl.annotateFiles(files, annotation, otherNamespace) + expect(exec.getExecOutput).toBeCalledWith( + kubectlPath, + [ + 'annotate', + '-f', + files.join(','), + annotation, + '--overwrite', + '--namespace', + otherNamespace + ], + {silent: false} + ) }) it('labels files with single file', async () => { @@ -225,6 +318,21 @@ describe('Kubectl class', () => { ], {silent: false} ) + + await kubectl.labelFiles(file, labels, otherNamespace) + expect(exec.getExecOutput).toBeCalledWith( + kubectlPath, + [ + 'label', + '-f', + file, + ...labels, + '--overwrite', + '--namespace', + otherNamespace + ], + {silent: false} + ) }) it('labels files with multiple files', async () => { @@ -245,6 +353,21 @@ describe('Kubectl class', () => { ], {silent: false} ) + + await kubectl.labelFiles(files, labels, otherNamespace) + expect(exec.getExecOutput).toBeCalledWith( + kubectlPath, + [ + 'label', + '-f', + files.join(','), + ...labels, + '--overwrite', + '--namespace', + otherNamespace + ], + {silent: false} + ) }) it('gets all pods', async () => { @@ -273,6 +396,20 @@ describe('Kubectl class', () => { ], {silent: false} ) + + // override ns + await kubectl.checkRolloutStatus(resourceType, name, otherNamespace) + expect(exec.getExecOutput).toBeCalledWith( + kubectlPath, + [ + 'rollout', + 'status', + `${resourceType}/${name}`, + '--namespace', + otherNamespace + ], + {silent: false} + ) }) it('gets resource', async () => { @@ -291,6 +428,22 @@ describe('Kubectl class', () => { ], {silent: false} ) + + // override ns + const silent = true + await kubectl.getResource(resourceType, name, silent, otherNamespace) + expect(exec.getExecOutput).toBeCalledWith( + kubectlPath, + [ + 'get', + `${resourceType}/${name}`, + '-o', + 'json', + '--namespace', + otherNamespace + ], + {silent} + ) }) it('executes a command', async () => { @@ -321,6 +474,14 @@ describe('Kubectl class', () => { ['delete', arg, '--namespace', testNamespace], {silent: false} ) + + // override ns + await kubectl.delete(arg, otherNamespace) + expect(exec.getExecOutput).toBeCalledWith( + kubectlPath, + ['delete', arg, '--namespace', otherNamespace], + {silent: false} + ) }) it('deletes with multiple arguments', async () => { @@ -331,6 +492,14 @@ describe('Kubectl class', () => { ['delete', ...args, '--namespace', testNamespace], {silent: false} ) + + // override ns + await kubectl.delete(args, otherNamespace) + expect(exec.getExecOutput).toBeCalledWith( + kubectlPath, + ['delete', ...args, '--namespace', otherNamespace], + {silent: false} + ) }) }) @@ -369,5 +538,11 @@ describe('Kubectl class', () => { [command, '--insecure-skip-tls-verify', '--namespace', testNamespace], {silent: false} ) + + const kubectlNoFlags = new Kubectl(kubectlPath) + kubectlNoFlags.executeCommand(command) + expect(exec.getExecOutput).toBeCalledWith(kubectlPath, [command], { + silent: false + }) }) }) diff --git a/src/types/kubectl.ts b/src/types/kubectl.ts index 61e0d8d6a..c096c77e1 100644 --- a/src/types/kubectl.ts +++ b/src/types/kubectl.ts @@ -3,11 +3,11 @@ import {createInlineArray} from '../utilities/arrayUtils' import * as core from '@actions/core' import * as toolCache from '@actions/tool-cache' import * as io from '@actions/io' -import {exec} from 'child_process' export interface Resource { name: string type: string + namespace?: string } export class Kubectl { @@ -20,7 +20,7 @@ export class Kubectl { constructor( kubectlPath: string, - namespace: string = 'default', + namespace: string = '', ignoreSSLErrors: boolean = false, resourceGroup: string = '', name: string = '' @@ -47,7 +47,7 @@ export class Kubectl { ] if (force) applyArgs.push('--force') - return await this.execute(applyArgs) + return await this.execute(applyArgs.concat(this.getFlags())) } catch (err) { core.debug('Kubectl apply failed:' + err) } @@ -56,16 +56,24 @@ export class Kubectl { public async describe( resourceType: string, resourceName: string, - silent: boolean = false + silent: boolean = false, + namespace?: string ): Promise { return await this.execute( - ['describe', resourceType, resourceName], + ['describe', resourceType, resourceName].concat( + this.getFlags(namespace) + ), silent ) } - public async getNewReplicaSet(deployment: string) { - const result = await this.describe('deployment', deployment, true) + public async getNewReplicaSet(deployment: string, namespace?: string) { + const result = await this.describe( + 'deployment', + deployment, + true, + namespace + ) let newReplicaSet = '' if (result?.stdout) { @@ -94,7 +102,8 @@ export class Kubectl { public async annotate( resourceType: string, resourceName: string, - annotation: string + annotation: string, + namespace?: string ): Promise { const args = [ 'annotate', @@ -102,13 +111,14 @@ export class Kubectl { resourceName, annotation, '--overwrite' - ] + ].concat(this.getFlags(namespace)) return await this.execute(args) } public async annotateFiles( files: string | string[], - annotation: string + annotation: string, + namespace?: string ): Promise { const filesToAnnotate = createInlineArray(files) core.debug(`annotating ${filesToAnnotate} with annotation ${annotation}`) @@ -118,16 +128,14 @@ export class Kubectl { filesToAnnotate, annotation, '--overwrite' - ] - core.debug( - `sending args from annotate to execute: ${JSON.stringify(args)}` - ) + ].concat(this.getFlags(namespace)) return await this.execute(args) } public async labelFiles( files: string | string[], - labels: string[] + labels: string[], + namespace?: string ): Promise { const args = [ 'label', @@ -135,51 +143,59 @@ export class Kubectl { createInlineArray(files), ...labels, '--overwrite' - ] + ].concat(this.getFlags(namespace)) return await this.execute(args) } public async getAllPods(): Promise { - return await this.execute(['get', 'pods', '-o', 'json'], true) + return await this.execute( + ['get', 'pods', '-o', 'json'].concat(this.getFlags()), + true + ) } public async checkRolloutStatus( resourceType: string, - name: string + name: string, + namespace?: string ): Promise { - return await this.execute([ - 'rollout', - 'status', - `${resourceType}/${name}` - ]) + return await this.execute( + ['rollout', 'status', `${resourceType}/${name}`].concat( + this.getFlags(namespace) + ) + ) } public async getResource( resourceType: string, name: string, - silentFailure: boolean = false + silentFailure: boolean = false, + namespace?: string ): Promise { core.debug( 'fetching resource of type ' + resourceType + ' and name ' + name ) return await this.execute( - ['get', `${resourceType}/${name}`, '-o', 'json'], + ['get', `${resourceType}/${name}`, '-o', 'json'].concat( + this.getFlags(namespace) + ), silentFailure ) } public executeCommand(command: string, args?: string) { if (!command) throw new Error('Command must be defined') - return args ? this.execute([command, args]) : this.execute([command]) + const a = args ? [args] : [] + return this.execute([command, ...a.concat(this.getFlags())]) } - public delete(args: string | string[]) { - if (typeof args === 'string') return this.execute(['delete', args]) - return this.execute(['delete', ...args]) + public delete(args: string | string[], namespace?: string) { + if (typeof args === 'string') + return this.execute(['delete', args].concat(this.getFlags(namespace))) + return this.execute(['delete', ...args.concat(this.getFlags(namespace))]) } protected async execute(args: string[], silent: boolean = false) { - args = args.concat(this.getExecuteFlags()) core.debug(`Kubectl run with command: ${this.kubectlPath} ${args}`) return await getExecOutput(this.kubectlPath, args, { @@ -187,13 +203,15 @@ export class Kubectl { }) } - protected getExecuteFlags(): string[] { + protected getFlags(namespaceOverride?: string): string[] { const flags = [] if (this.ignoreSSLErrors) { flags.push('--insecure-skip-tls-verify') } - if (this.namespace) { - flags.push('--namespace', this.namespace) + + const ns = namespaceOverride || this.namespace + if (ns) { + flags.push('--namespace', ns) } return flags diff --git a/src/types/privatekubectl.ts b/src/types/privatekubectl.ts index d975103c0..19c80bb82 100644 --- a/src/types/privatekubectl.ts +++ b/src/types/privatekubectl.ts @@ -8,8 +8,6 @@ import * as path from 'path' export class PrivateKubectl extends Kubectl { protected async execute(args: string[], silent: boolean = false) { - args = args.concat(this.getExecuteFlags()) - args.unshift('kubectl') let kubectlCmd = args.join(' ') let addFileFlag = false diff --git a/src/utilities/kubectlUtils.ts b/src/utilities/kubectlUtils.ts index 38d9953bf..05d9f9cce 100644 --- a/src/utilities/kubectlUtils.ts +++ b/src/utilities/kubectlUtils.ts @@ -2,6 +2,8 @@ import * as core from '@actions/core' import {ExecOutput} from '@actions/exec' import {Kubectl} from '../types/kubectl' +const NAMESPACE = 'namespace' + export function checkForErrors( execResults: ExecOutput[], warnIfError?: boolean @@ -30,7 +32,12 @@ export async function getLastSuccessfulRunSha( annotationKey: string ): Promise { try { - const result = await kubectl.getResource('namespace', namespaceName) + const result = await kubectl.getResource( + NAMESPACE, + namespaceName, + false, + namespaceName + ) if (result?.stderr) { core.warning(result.stderr) return process.env.GITHUB_SHA @@ -53,12 +60,13 @@ export async function annotateChildPods( kubectl: Kubectl, resourceType: string, resourceName: string, + namespace: string | undefined, annotationKeyValStr: string, allPods ): Promise { let owner = resourceName if (resourceType.toLowerCase().indexOf('deployment') > -1) { - owner = await kubectl.getNewReplicaSet(resourceName) + owner = await kubectl.getNewReplicaSet(resourceName, namespace) } const commandExecutionResults = [] @@ -72,7 +80,8 @@ export async function annotateChildPods( kubectl.annotate( 'pod', pod.metadata.name, - annotationKeyValStr + annotationKeyValStr, + namespace ) ) break diff --git a/src/utilities/manifestStabilityUtils.ts b/src/utilities/manifestStabilityUtils.ts index 881cfe2f2..cd4b1390b 100644 --- a/src/utilities/manifestStabilityUtils.ts +++ b/src/utilities/manifestStabilityUtils.ts @@ -4,6 +4,9 @@ import {Kubectl, Resource} from '../types/kubectl' import {checkForErrors} from './kubectlUtils' import {sleep} from './timeUtils' +const IS_SILENT = false +const POD = 'pod' + export async function checkManifestStability( kubectl: Kubectl, resources: Resource[] @@ -20,24 +23,35 @@ export async function checkManifestStability( try { const result = await kubectl.checkRolloutStatus( resource.type, - resource.name + resource.name, + resource.namespace ) checkForErrors([result]) } catch (ex) { core.error(ex) - await kubectl.describe(resource.type, resource.name) + await kubectl.describe( + resource.type, + resource.name, + IS_SILENT, + resource.namespace + ) rolloutStatusHasErrors = true } } if (resource.type == KubernetesConstants.KubernetesWorkload.POD) { try { - await checkPodStatus(kubectl, resource.name) + await checkPodStatus(kubectl, resource) } catch (ex) { core.warning( `Could not determine pod status: ${JSON.stringify(ex)}` ) - await kubectl.describe(resource.type, resource.name) + await kubectl.describe( + resource.type, + resource.name, + IS_SILENT, + resource.namespace + ) } } if ( @@ -45,14 +59,11 @@ export async function checkManifestStability( KubernetesConstants.DiscoveryAndLoadBalancerResource.SERVICE ) { try { - const service = await getService(kubectl, resource.name) + const service = await getService(kubectl, resource) const {spec, status} = service if (spec.type === KubernetesConstants.ServiceTypes.LOAD_BALANCER) { if (!isLoadBalancerIPAssigned(status)) { - await waitForServiceExternalIPAssignment( - kubectl, - resource.name - ) + await waitForServiceExternalIPAssignment(kubectl, resource) } else { core.info( `ServiceExternalIP ${resource.name} ${status.loadBalancer.ingress[0].ip}` @@ -63,7 +74,12 @@ export async function checkManifestStability( core.warning( `Could not determine service status of: ${resource.name} Error: ${ex}` ) - await kubectl.describe(resource.type, resource.name) + await kubectl.describe( + resource.type, + resource.name, + IS_SILENT, + resource.namespace + ) } } } @@ -75,7 +91,7 @@ export async function checkManifestStability( export async function checkPodStatus( kubectl: Kubectl, - podName: string + pod: Resource ): Promise { const sleepTimeout = 10 * 1000 // 10 seconds const iterations = 60 // 60 * 10 seconds timeout = 10 minutes max timeout @@ -85,8 +101,8 @@ export async function checkPodStatus( for (let i = 0; i < iterations; i++) { await sleep(sleepTimeout) - core.debug(`Polling for pod status: ${podName}`) - podStatus = await getPodStatus(kubectl, podName) + core.debug(`Polling for pod status: ${pod.name}`) + podStatus = await getPodStatus(kubectl, pod) if ( podStatus && @@ -97,37 +113,42 @@ export async function checkPodStatus( } } - podStatus = await getPodStatus(kubectl, podName) + podStatus = await getPodStatus(kubectl, pod) switch (podStatus.phase) { case 'Succeeded': case 'Running': if (isPodReady(podStatus)) { - console.log(`pod/${podName} is successfully rolled out`) + console.log(`pod/${pod.name} is successfully rolled out`) } else { kubectlDescribeNeeded = true } break case 'Pending': if (!isPodReady(podStatus)) { - core.warning(`pod/${podName} rollout status check timed out`) + core.warning(`pod/${pod.name} rollout status check timed out`) kubectlDescribeNeeded = true } break case 'Failed': - core.error(`pod/${podName} rollout failed`) + core.error(`pod/${pod.name} rollout failed`) kubectlDescribeNeeded = true break default: - core.warning(`pod/${podName} rollout status: ${podStatus.phase}`) + core.warning(`pod/${pod.name} rollout status: ${podStatus.phase}`) } if (kubectlDescribeNeeded) { - await kubectl.describe('pod', podName) + await kubectl.describe(POD, pod.name, IS_SILENT, pod.namespace) } } -async function getPodStatus(kubectl: Kubectl, podName: string) { - const podResult = await kubectl.getResource('pod', podName) +async function getPodStatus(kubectl: Kubectl, pod: Resource) { + const podResult = await kubectl.getResource( + POD, + pod.name, + IS_SILENT, + pod.namespace + ) checkForErrors([podResult]) return JSON.parse(podResult.stdout).status @@ -151,10 +172,12 @@ function isPodReady(podStatus: any): boolean { return allContainersAreReady } -async function getService(kubectl: Kubectl, serviceName) { +async function getService(kubectl: Kubectl, service: Resource) { const serviceResult = await kubectl.getResource( KubernetesConstants.DiscoveryAndLoadBalancerResource.SERVICE, - serviceName + service.name, + IS_SILENT, + service.namespace ) checkForErrors([serviceResult]) @@ -163,25 +186,25 @@ async function getService(kubectl: Kubectl, serviceName) { async function waitForServiceExternalIPAssignment( kubectl: Kubectl, - serviceName: string + service: Resource ): Promise { const sleepTimeout = 10 * 1000 // 10 seconds const iterations = 18 // 18 * 10 seconds timeout = 3 minutes max timeout for (let i = 0; i < iterations; i++) { - core.info(`Wait for service ip assignment : ${serviceName}`) + core.info(`Wait for service ip assignment : ${service.name}`) await sleep(sleepTimeout) - const status = (await getService(kubectl, serviceName)).status + const status = (await getService(kubectl, service)).status if (isLoadBalancerIPAssigned(status)) { core.info( - `ServiceExternalIP ${serviceName} ${status.loadBalancer.ingress[0].ip}` + `ServiceExternalIP ${service.name} ${status.loadBalancer.ingress[0].ip}` ) return } } - core.warning(`Wait for service ip assignment timed out${serviceName}`) + core.warning(`Wait for service ip assignment timed out ${service.name}`) } function isLoadBalancerIPAssigned(status: any) { diff --git a/src/utilities/manifestUpdateUtils.ts b/src/utilities/manifestUpdateUtils.ts index 77f7814b1..468f2ba64 100644 --- a/src/utilities/manifestUpdateUtils.ts +++ b/src/utilities/manifestUpdateUtils.ts @@ -280,7 +280,8 @@ export function getResources( ) { resources.push({ type: inputObject.kind, - name: inputObject.metadata.name + name: inputObject.metadata.name, + namespace: inputObject?.metadata?.namespace }) } }) From dd4bbd13a5abd2fc9ca8bdcb8aee152bb718fa78 Mon Sep 17 00:00:00 2001 From: David Gamero Date: Wed, 22 Feb 2023 16:05:36 -0500 Subject: [PATCH 02/10] bump codeql to node 16 (#281) * upgrade codeql * bump codeql init * name the unit test job * tats feedback --- .github/workflows/codeql.yml | 4 ++-- .github/workflows/unit-tests.yml | 3 ++- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index ffd80e032..ca8280a3e 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -13,7 +13,7 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@v2 + uses: actions/checkout@v3 with: # We must fetch at least the immediate parents so that if this is # a pull request then we can checkout the head. @@ -21,7 +21,7 @@ jobs: # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL - uses: github/codeql-action/init@v1 + uses: github/codeql-action/init@v2 # Override language selection by uncommenting this and choosing your languages # with: # languages: go, javascript, csharp, python, cpp, java diff --git a/.github/workflows/unit-tests.yml b/.github/workflows/unit-tests.yml index 4b65ad276..eb9ce2d86 100644 --- a/.github/workflows/unit-tests.yml +++ b/.github/workflows/unit-tests.yml @@ -11,9 +11,10 @@ on: # rebuild any PRs and main branch changes jobs: build: # make sure build/ci works properly + name: Run Unit Tests runs-on: ubuntu-latest steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v3 - run: | npm install npm test From e52890db9e060ccdf4126dec08d1ea1734c8b099 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Olivier=20T=C3=A9tard?= Date: Mon, 17 Apr 2023 19:52:50 +0200 Subject: [PATCH 03/10] =?UTF-8?q?Fix=20=E2=80=9CService=E2=80=9D=20route-m?= =?UTF-8?q?ethod=20of=20the=20Blue-Green=20strategy=20with=20some=20manife?= =?UTF-8?q?st=20files=20(#283)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package-lock.json | 224 ++---------------- package.json | 2 +- .../blueGreen/blueGreenHelper.ts | 24 +- 3 files changed, 31 insertions(+), 219 deletions(-) diff --git a/package-lock.json b/package-lock.json index 77657281e..16755f88e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -22,8 +22,8 @@ "@types/jest": "^26.0.0", "@types/js-yaml": "^3.12.7", "@types/node": "^12.20.41", + "@vercel/ncc": "^0.36.1", "jest": "^26.0.0", - "ncc": "^0.3.6", "prettier": "^2.7.1", "ts-jest": "^26.0.0", "typescript": "3.9.5" @@ -1183,6 +1183,15 @@ "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==", "dev": true }, + "node_modules/@vercel/ncc": { + "version": "0.36.1", + "resolved": "https://registry.npmjs.org/@vercel/ncc/-/ncc-0.36.1.tgz", + "integrity": "sha512-S4cL7Taa9yb5qbv+6wLgiKVZ03Qfkc4jGRuiUQMQ8HGBD5pcNRnHeYM33zBvJE4/zJGjJJ8GScB+WmTsn9mORw==", + "dev": true, + "bin": { + "ncc": "dist/ncc/cli.js" + } + }, "node_modules/abab": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", @@ -1875,15 +1884,6 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "node_modules/colors": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.2.3.tgz", - "integrity": "sha512-qTfM2pNFeMZcLvf/RbrVAzDEVttZjFhaApfx9dplNjvHSX88Ui66zBRb/4YGob/xUWxDceirgoC1lT676asfCQ==", - "dev": true, - "engines": { - "node": ">=0.1.90" - } - }, "node_modules/combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", @@ -1978,15 +1978,6 @@ "node": ">=10" } }, - "node_modules/dateformat": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz", - "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==", - "dev": true, - "engines": { - "node": "*" - } - }, "node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -4091,58 +4082,6 @@ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "dev": true }, - "node_modules/ncc": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/ncc/-/ncc-0.3.6.tgz", - "integrity": "sha512-OXudTB2Ebt/FnOuDoPQbaa17+tdVqSOWA+gLfPxccWwsNED1uA2zEhpoB1hwdFC9yYbio/mdV5cvOtQI3Zrx1w==", - "dev": true, - "dependencies": { - "mkdirp": "^0.5.1", - "rimraf": "^2.6.1", - "tracer": "^0.8.7", - "ws": "^2.3.1" - } - }, - "node_modules/ncc/node_modules/mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "dev": true, - "dependencies": { - "minimist": "^1.2.6" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/ncc/node_modules/rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - } - }, - "node_modules/ncc/node_modules/safe-buffer": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.0.1.tgz", - "integrity": "sha512-cr7dZWLwOeaFBLTIuZeYdkfO7UzGIKhjYENJFAxUOMKWGaWDm2nJM2rzxNRm5Owu0DH3ApwNo6kx5idXZfb/Iw==", - "dev": true - }, - "node_modules/ncc/node_modules/ws": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-2.3.1.tgz", - "integrity": "sha512-61a+9LgtYZxTq1hAonhX8Xwpo2riK4IOR/BIVxioFbCfc3QFKmpE4x9dLExfLHKtUfVZigYa36tThVhO57erEw==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.0.1", - "ultron": "~1.1.0" - } - }, "node_modules/nice-try": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", @@ -5883,15 +5822,6 @@ "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==", "dev": true }, - "node_modules/tinytim": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/tinytim/-/tinytim-0.1.1.tgz", - "integrity": "sha512-NIpsp9lBIxPNzB++HnMmUd4byzJSVbbO4F+As1Gb1IG/YQT5QvmBDjpx8SpDS8fhGC+t+Qw8ldQgbcAIaU+2cA==", - "dev": true, - "engines": { - "node": ">= 0.2.0" - } - }, "node_modules/tmpl": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", @@ -5984,33 +5914,6 @@ "node": ">=8" } }, - "node_modules/tracer": { - "version": "0.8.15", - "resolved": "https://registry.npmjs.org/tracer/-/tracer-0.8.15.tgz", - "integrity": "sha512-ZQzlhd6zZFIpAhACiZkxLjl65XqVwi8t8UEBVGRIHAQN6nj55ftJWiFell+WSqWCP/vEycrIbUSuiyMwul+TFw==", - "dev": true, - "dependencies": { - "colors": "1.2.3", - "dateformat": "3.0.3", - "mkdirp": "^0.5.1", - "tinytim": "0.1.1" - }, - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/tracer/node_modules/mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "dev": true, - "dependencies": { - "minimist": "^1.2.6" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, "node_modules/ts-jest": { "version": "26.5.6", "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-26.5.6.tgz", @@ -6127,12 +6030,6 @@ "node": ">=4.2.0" } }, - "node_modules/ultron": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz", - "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==", - "dev": true - }, "node_modules/underscore": { "version": "1.13.4", "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.4.tgz", @@ -7493,6 +7390,12 @@ "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==", "dev": true }, + "@vercel/ncc": { + "version": "0.36.1", + "resolved": "https://registry.npmjs.org/@vercel/ncc/-/ncc-0.36.1.tgz", + "integrity": "sha512-S4cL7Taa9yb5qbv+6wLgiKVZ03Qfkc4jGRuiUQMQ8HGBD5pcNRnHeYM33zBvJE4/zJGjJJ8GScB+WmTsn9mORw==", + "dev": true + }, "abab": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", @@ -8020,12 +7923,6 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "colors": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.2.3.tgz", - "integrity": "sha512-qTfM2pNFeMZcLvf/RbrVAzDEVttZjFhaApfx9dplNjvHSX88Ui66zBRb/4YGob/xUWxDceirgoC1lT676asfCQ==", - "dev": true - }, "combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", @@ -8107,12 +8004,6 @@ "whatwg-url": "^8.0.0" } }, - "dateformat": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz", - "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==", - "dev": true - }, "debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -9728,54 +9619,6 @@ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "dev": true }, - "ncc": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/ncc/-/ncc-0.3.6.tgz", - "integrity": "sha512-OXudTB2Ebt/FnOuDoPQbaa17+tdVqSOWA+gLfPxccWwsNED1uA2zEhpoB1hwdFC9yYbio/mdV5cvOtQI3Zrx1w==", - "dev": true, - "requires": { - "mkdirp": "^0.5.1", - "rimraf": "^2.6.1", - "tracer": "^0.8.7", - "ws": "^2.3.1" - }, - "dependencies": { - "mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "dev": true, - "requires": { - "minimist": "^1.2.6" - } - }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "safe-buffer": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.0.1.tgz", - "integrity": "sha512-cr7dZWLwOeaFBLTIuZeYdkfO7UzGIKhjYENJFAxUOMKWGaWDm2nJM2rzxNRm5Owu0DH3ApwNo6kx5idXZfb/Iw==", - "dev": true - }, - "ws": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-2.3.1.tgz", - "integrity": "sha512-61a+9LgtYZxTq1hAonhX8Xwpo2riK4IOR/BIVxioFbCfc3QFKmpE4x9dLExfLHKtUfVZigYa36tThVhO57erEw==", - "dev": true, - "requires": { - "safe-buffer": "~5.0.1", - "ultron": "~1.1.0" - } - } - } - }, "nice-try": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", @@ -11139,12 +10982,6 @@ "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==", "dev": true }, - "tinytim": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/tinytim/-/tinytim-0.1.1.tgz", - "integrity": "sha512-NIpsp9lBIxPNzB++HnMmUd4byzJSVbbO4F+As1Gb1IG/YQT5QvmBDjpx8SpDS8fhGC+t+Qw8ldQgbcAIaU+2cA==", - "dev": true - }, "tmpl": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", @@ -11218,29 +11055,6 @@ "punycode": "^2.1.1" } }, - "tracer": { - "version": "0.8.15", - "resolved": "https://registry.npmjs.org/tracer/-/tracer-0.8.15.tgz", - "integrity": "sha512-ZQzlhd6zZFIpAhACiZkxLjl65XqVwi8t8UEBVGRIHAQN6nj55ftJWiFell+WSqWCP/vEycrIbUSuiyMwul+TFw==", - "dev": true, - "requires": { - "colors": "1.2.3", - "dateformat": "3.0.3", - "mkdirp": "^0.5.1", - "tinytim": "0.1.1" - }, - "dependencies": { - "mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "dev": true, - "requires": { - "minimist": "^1.2.6" - } - } - } - }, "ts-jest": { "version": "26.5.6", "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-26.5.6.tgz", @@ -11321,12 +11135,6 @@ "integrity": "sha512-hSAifV3k+i6lEoCJ2k6R2Z/rp/H3+8sdmcn5NrS3/3kE7+RyZXm9aqvxWqjEXHAd8b0pShatpcdMTvEdvAJltQ==", "dev": true }, - "ultron": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz", - "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==", - "dev": true - }, "underscore": { "version": "1.13.4", "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.4.tgz", diff --git a/package.json b/package.json index b35032bc1..b18ba9343 100644 --- a/package.json +++ b/package.json @@ -24,8 +24,8 @@ "@types/jest": "^26.0.0", "@types/js-yaml": "^3.12.7", "@types/node": "^12.20.41", + "@vercel/ncc": "^0.36.1", "jest": "^26.0.0", - "ncc": "^0.3.6", "prettier": "^2.7.1", "ts-jest": "^26.0.0", "typescript": "3.9.5" diff --git a/src/strategyHelpers/blueGreen/blueGreenHelper.ts b/src/strategyHelpers/blueGreen/blueGreenHelper.ts index b2ba445de..673f1e4a8 100644 --- a/src/strategyHelpers/blueGreen/blueGreenHelper.ts +++ b/src/strategyHelpers/blueGreen/blueGreenHelper.ts @@ -67,31 +67,25 @@ export async function deleteObjects( // other common functions export function getManifestObjects(filePaths: string[]): BlueGreenManifests { const deploymentEntityList: K8sObject[] = [] + const serviceEntityList: K8sObject[] = [] const routedServiceEntityList: K8sObject[] = [] const unroutedServiceEntityList: K8sObject[] = [] const ingressEntityList: K8sObject[] = [] const otherEntitiesList: K8sObject[] = [] const serviceNameMap = new Map() + // Manifest objects per type. All resources should be parsed and + // organized before we can check if services are “routed” or not. filePaths.forEach((filePath: string) => { const fileContents = fs.readFileSync(filePath).toString() yaml.safeLoadAll(fileContents, (inputObject) => { if (!!inputObject) { const kind = inputObject.kind - const name = inputObject.metadata.name if (isDeploymentEntity(kind)) { deploymentEntityList.push(inputObject) } else if (isServiceEntity(kind)) { - if (isServiceRouted(inputObject, deploymentEntityList)) { - routedServiceEntityList.push(inputObject) - serviceNameMap.set( - name, - getBlueGreenResourceName(name, GREEN_SUFFIX) - ) - } else { - unroutedServiceEntityList.push(inputObject) - } + serviceEntityList.push(inputObject) } else if (isIngressEntity(kind)) { ingressEntityList.push(inputObject) } else { @@ -101,6 +95,16 @@ export function getManifestObjects(filePaths: string[]): BlueGreenManifests { }) }) + serviceEntityList.forEach((inputObject: any) => { + if (isServiceRouted(inputObject, deploymentEntityList)) { + const name = inputObject.metadata.name + routedServiceEntityList.push(inputObject) + serviceNameMap.set(name, getBlueGreenResourceName(name, GREEN_SUFFIX)) + } else { + unroutedServiceEntityList.push(inputObject) + } + }) + return { serviceEntityList: routedServiceEntityList, serviceNameMap: serviceNameMap, From a462095a3c7339ba96b99abd728aedf5f3218558 Mon Sep 17 00:00:00 2001 From: Bram de Hart <110542946+bramdehart@users.noreply.github.com> Date: Mon, 16 Oct 2023 16:28:01 +0200 Subject: [PATCH 04/10] Make annotating resources optional (#287) * Make annotating resources optional * Clarify descriptions * Update README * Refactor retrieving pods * Remove annotating resources check in deploy.ts * Add resource annotation integration test * Move resource annotation integration test to seperate file * Lint code * Remove temporary debugging statements * Fix integration test name * Fix test * Abstracting out repeated logic between verifyDeployment and verifyService * Fix formattin * Fix reference * Fix test * Refactor test * Update ubuntu version to latest on canary SMI test * Update ubuntu version to latest on canary SMI test * Make annotating resources optional Signed-off-by: Bram de Hart * Clarify descriptions Signed-off-by: Bram de Hart * Update README Signed-off-by: Bram de Hart * Refactor retrieving pods Signed-off-by: Bram de Hart * Remove annotating resources check in deploy.ts Signed-off-by: Bram de Hart * Add resource annotation integration test Signed-off-by: Bram de Hart * Move resource annotation integration test to seperate file Signed-off-by: Bram de Hart * Lint code Signed-off-by: Bram de Hart * Remove temporary debugging statements Signed-off-by: Bram de Hart * Fix integration test name Signed-off-by: Bram de Hart * Fix test Signed-off-by: Bram de Hart * Abstracting out repeated logic between verifyDeployment and verifyService Signed-off-by: Bram de Hart * Fix formattin Signed-off-by: Bram de Hart * Fix reference Signed-off-by: Bram de Hart * Fix test Signed-off-by: Bram de Hart * Refactor test Signed-off-by: Bram de Hart * Update ubuntu version to latest on canary SMI test Signed-off-by: Bram de Hart --------- Signed-off-by: Bram de Hart --- .../run-integration-tests-canary-smi.yml | 2 +- ...-integration-tests-resource-annotation.yml | 89 +++++++++++++++++++ README.md | 6 +- action.yml | 6 +- src/actions/deploy.ts | 9 +- src/actions/promote.ts | 21 +---- src/strategyHelpers/deploymentHelper.ts | 34 +++---- src/utilities/kubectlUtils.ts | 11 ++- test/integration/k8s-deploy-delete.py | 4 +- test/integration/k8s-deploy-test.py | 36 ++++---- 10 files changed, 154 insertions(+), 64 deletions(-) create mode 100644 .github/workflows/run-integration-tests-resource-annotation.yml diff --git a/.github/workflows/run-integration-tests-canary-smi.yml b/.github/workflows/run-integration-tests-canary-smi.yml index b94bbd772..1ad969422 100644 --- a/.github/workflows/run-integration-tests-canary-smi.yml +++ b/.github/workflows/run-integration-tests-canary-smi.yml @@ -13,7 +13,7 @@ on: jobs: run-integration-test: name: Run Minikube Integration Tests - runs-on: ubuntu-20.04 + runs-on: ubuntu-latest env: KUBECONFIG: /home/runner/.kube/config NAMESPACE: test-${{ github.run_id }} diff --git a/.github/workflows/run-integration-tests-resource-annotation.yml b/.github/workflows/run-integration-tests-resource-annotation.yml new file mode 100644 index 000000000..41327aa85 --- /dev/null +++ b/.github/workflows/run-integration-tests-resource-annotation.yml @@ -0,0 +1,89 @@ +name: Minikube Integration Tests - resource annotation +on: + pull_request: + branches: + - main + - 'releases/*' + push: + branches: + - main + - 'releases/*' + workflow_dispatch: + +jobs: + run-integration-test: + name: Run Minikube Integration Tests + runs-on: ubuntu-latest + env: + KUBECONFIG: /home/runner/.kube/config + NAMESPACE: test-${{ github.run_id }} + steps: + - uses: actions/checkout@v3 + + - name: Install dependencies + run: | + rm -rf node_modules/ + npm install + - name: Install ncc + run: npm i -g @vercel/ncc + - name: Install conntrack + run: sudo apt-get install -y conntrack + - name: Build + run: ncc build src/run.ts -o lib + + - uses: Azure/setup-kubectl@v3 + name: Install Kubectl + + - id: setup-minikube + name: Setup Minikube + uses: medyagh/setup-minikube@latest + with: + minikube-version: 1.24.0 + kubernetes-version: 1.22.3 + driver: 'none' + timeout-minutes: 3 + + - name: Create namespace to run tests + run: kubectl create ns ${{ env.NAMESPACE }} + + - uses: actions/setup-python@v2 + name: Install Python + with: + python-version: '3.x' + + - name: Cleaning any previously created items + run: | + python test/integration/k8s-deploy-delete.py 'Service' 'all' ${{ env.NAMESPACE }} + python test/integration/k8s-deploy-delete.py 'Deployment' 'all' ${{ env.NAMESPACE }} + python test/integration/k8s-deploy-delete.py 'Ingress' 'all' ${{ env.NAMESPACE }} + + - name: Executing deploy action for pod with resource annotation enabled by default + uses: ./ + with: + namespace: ${{ env.NAMESPACE }} + images: nginx:1.14.2 + manifests: | + test/integration/manifests/test.yml + action: deploy + + - name: Checking if deployments is created with additional resource annotation + run: | + python test/integration/k8s-deploy-test.py namespace=${{ env.NAMESPACE }} kind=Deployment name=nginx-deployment containerName=nginx:1.14.2 labels=app:nginx,workflow:actions.github.com-k8s-deploy,workflowFriendlyName:Minikube_Integration_Tests_-_resource_annotation selectorLabels=app:nginx annotations=actions.github.com/k8s-deploy,deployment.kubernetes.io/revision,kubectl.kubernetes.io/last-applied-configuration + + - name: Cleaning previously created deployment + run: | + python test/integration/k8s-deploy-delete.py 'Deployment' 'all' ${{ env.NAMESPACE }} + + - name: Executing deploy action for pod with resource annotation disabled + uses: ./ + with: + namespace: ${{ env.NAMESPACE }} + images: nginx:1.14.2 + manifests: | + test/integration/manifests/test.yml + action: deploy + annotate-resources: false + + - name: Checking if deployment is created without additional resource annotation + run: | + python test/integration/k8s-deploy-test.py namespace=${{ env.NAMESPACE }} kind=Deployment name=nginx-deployment containerName=nginx:1.14.2 selectorLabels=app:nginx annotations=deployment.kubernetes.io/revision,kubectl.kubernetes.io/last-applied-configuration diff --git a/README.md b/README.md index bc1ff0653..b51acf167 100644 --- a/README.md +++ b/README.md @@ -113,9 +113,13 @@ Following are the key capabilities of this action: force

(Optional) Deploy when a previous deployment already exists. If true then '--force' argument is added to the apply command. Using '--force' argument is not recommended in production. + + annotate-resources

(Optional) + Acceptable values: true/false
Default value: true
Switch whether to annotate the resources or not. If set to false all annotations are skipped completely. + annotate-namespace

(Optional) - Acceptable values: true/false
Default value: true
Switch whether to annotate the namespace resources object or not + Acceptable values: true/false
Default value: true
Switch whether to annotate the namespace resources object or not. Ignored when annotate-resources is set to false. skip-tls-verify

(Optional) diff --git a/action.yml b/action.yml index 7863035f5..e908574dd 100644 --- a/action.yml +++ b/action.yml @@ -59,8 +59,12 @@ inputs: description: 'Github token' default: ${{ github.token }} required: true + annotate-resources: + description: 'Annotate the resources. If set to false all annotations are skipped completely.' + required: false + default: true annotate-namespace: - description: 'Annotate the target namespace' + description: 'Annotate the target namespace. Ignored when annotate-resources is set to false.' required: false default: true private-cluster: diff --git a/src/actions/deploy.ts b/src/actions/deploy.ts index 8106badd9..17311298c 100644 --- a/src/actions/deploy.ts +++ b/src/actions/deploy.ts @@ -65,17 +65,10 @@ export async function deploy( // annotate resources core.startGroup('Annotating resources') - let allPods - try { - allPods = JSON.parse((await kubectl.getAllPods()).stdout) - } catch (e) { - core.debug(`Unable to parse pods: ${e}`) - } await annotateAndLabelResources( deployedManifestFiles, kubectl, - resourceTypes, - allPods + resourceTypes ) core.endGroup() } diff --git a/src/actions/promote.ts b/src/actions/promote.ts index 7523ffd34..2c11384c4 100644 --- a/src/actions/promote.ts +++ b/src/actions/promote.ts @@ -129,19 +129,13 @@ async function promoteCanary(kubectl: Kubectl, manifests: string[]) { // annotate resources core.startGroup('Annotating resources') - let allPods - try { - allPods = JSON.parse((await kubectl.getAllPods()).stdout) - } catch (e) { - core.debug(`Unable to parse pods: ${e}`) - } const resources: Resource[] = getResources( filesToAnnotate, models.DEPLOYMENT_TYPES.concat([ models.DiscoveryAndLoadBalancerResource.SERVICE ]) ) - await annotateAndLabelResources(filesToAnnotate, kubectl, resources, allPods) + await annotateAndLabelResources(filesToAnnotate, kubectl, resources) core.endGroup() } @@ -219,17 +213,6 @@ async function promoteBlueGreen(kubectl: Kubectl, manifests: string[]) { // annotate resources core.startGroup('Annotating resources') - let allPods - try { - allPods = JSON.parse((await kubectl.getAllPods()).stdout) - } catch (e) { - core.debug(`Unable to parse pods: ${e}`) - } - await annotateAndLabelResources( - deployedManifestFiles, - kubectl, - resources, - allPods - ) + await annotateAndLabelResources(deployedManifestFiles, kubectl, resources) core.endGroup() } diff --git a/src/strategyHelpers/deploymentHelper.ts b/src/strategyHelpers/deploymentHelper.ts index 76e276912..3a3d5e3a0 100644 --- a/src/strategyHelpers/deploymentHelper.ts +++ b/src/strategyHelpers/deploymentHelper.ts @@ -147,8 +147,7 @@ export async function checkManifestStability( export async function annotateAndLabelResources( files: string[], kubectl: Kubectl, - resourceTypes: Resource[], - allPods: any + resourceTypes: Resource[] ) { const defaultWorkflowFileName = 'k8s-deploy-failed-workflow-annotation' const githubToken = core.getInput('token') @@ -163,15 +162,20 @@ export async function annotateAndLabelResources( const deploymentConfig = await getDeploymentConfig() const annotationKeyLabel = getWorkflowAnnotationKeyLabel() - await annotateResources( - files, - kubectl, - resourceTypes, - allPods, - annotationKeyLabel, - workflowFilePath, - deploymentConfig - ).catch((err) => core.warning(`Failed to annotate resources: ${err} `)) + const shouldAnnotateResources = !( + core.getInput('annotate-resources').toLowerCase() === 'false' + ) + + if (shouldAnnotateResources) { + await annotateResources( + files, + kubectl, + resourceTypes, + annotationKeyLabel, + workflowFilePath, + deploymentConfig + ).catch((err) => core.warning(`Failed to annotate resources: ${err} `)) + } await labelResources(files, kubectl, annotationKeyLabel).catch((err) => core.warning(`Failed to label resources: ${err}`) @@ -182,7 +186,6 @@ async function annotateResources( files: string[], kubectl: Kubectl, resourceTypes: Resource[], - allPods: any, annotationKey: string, workflowFilePath: string, deploymentConfig: DeploymentConfig @@ -226,11 +229,13 @@ async function annotateResources( ) ) } + for (const file of files) { try { const annotateResult = await kubectl.annotateFiles( file, - annotationKeyValStr + annotationKeyValStr, + namespace ) annotateResults.push(annotateResult) } catch (e) { @@ -249,8 +254,7 @@ async function annotateResources( resource.type, resource.name, resource.namespace, - annotationKeyValStr, - allPods + annotationKeyValStr ) ).forEach((execResult) => annotateResults.push(execResult)) } diff --git a/src/utilities/kubectlUtils.ts b/src/utilities/kubectlUtils.ts index 05d9f9cce..831cad1af 100644 --- a/src/utilities/kubectlUtils.ts +++ b/src/utilities/kubectlUtils.ts @@ -61,8 +61,7 @@ export async function annotateChildPods( resourceType: string, resourceName: string, namespace: string | undefined, - annotationKeyValStr: string, - allPods + annotationKeyValStr: string ): Promise { let owner = resourceName if (resourceType.toLowerCase().indexOf('deployment') > -1) { @@ -70,6 +69,14 @@ export async function annotateChildPods( } const commandExecutionResults = [] + + let allPods + try { + allPods = JSON.parse((await kubectl.getAllPods()).stdout) + } catch (e) { + core.debug(`Unable to parse pods: ${e}`) + } + if (allPods?.items && allPods.items?.length > 0) { allPods.items.forEach((pod) => { const owners = pod?.metadata?.ownerReferences diff --git a/test/integration/k8s-deploy-delete.py b/test/integration/k8s-deploy-delete.py index 4ba946816..8c6338f37 100644 --- a/test/integration/k8s-deploy-delete.py +++ b/test/integration/k8s-deploy-delete.py @@ -7,7 +7,7 @@ def delete(kind, name, namespace): if (name == "all"): print('kubectl delete --all' + kind + ' -n ' + namespace) deletion = subprocess.Popen( - ['kubectl', 'delete', kind, name, '--namespace', namespace]) + ['kubectl', 'delete', kind, '--all', '--namespace', namespace]) result, err = deletion.communicate() else: print('kubectl delete ' + kind + ' ' + name + ' -n ' + namespace) @@ -21,7 +21,7 @@ def delete(kind, name, namespace): def main(): kind = sys.argv[1] name = sys.argv[2] - namespace = 'test-' + sys.argv[3] + namespace = sys.argv[3] delete(kind, name, namespace) diff --git a/test/integration/k8s-deploy-test.py b/test/integration/k8s-deploy-test.py index 7b80babb6..7e00b445d 100644 --- a/test/integration/k8s-deploy-test.py +++ b/test/integration/k8s-deploy-test.py @@ -41,10 +41,6 @@ def parseArgs(sysArgs): argsDict[labelsKey] = stringListToDict( argsDict[labelsKey].split(","), ":") - if annotationsKey in argsDict: - argsDict[annotationsKey] = stringListToDict( - argsDict[annotationsKey].split(","), ":") - if selectorLabelsKey in argsDict: argsDict[selectorLabelsKey] = stringListToDict( argsDict[selectorLabelsKey].split(","), ":") @@ -60,6 +56,9 @@ def parseArgs(sysArgs): if ingressServicesKey in argsDict: argsDict[ingressServicesKey] = argsDict[ingressServicesKey].split(",") + if annotationsKey in argsDict: + argsDict[annotationsKey] = argsDict[annotationsKey].split(",") + return argsDict @@ -98,14 +97,14 @@ def verifyDeployment(deployment, parsedArgs): return dictMatch, msg if annotationsKey in parsedArgs: - dictMatch, msg = compareDicts( - deployment['metadata']['annotations'], parsedArgs[annotationsKey], annotationsKey) - if not dictMatch: - return dictMatch, msg - + if len(parsedArgs[annotationsKey]) != len(deployment['metadata']['annotations']): + return False, f"expected {len(parsedArgs[annotationsKey])} annotations but found {len(deployment['metadata']['annotations'])}" + keysPresent, msg = validateKeyPresence( + deployment['metadata']['annotations'], parsedArgs[annotationsKey]) + if not keysPresent: + return keysPresent, msg return True, "" - def verifyService(service, parsedArgs): # test selector labels, labels, annotations if not selectorLabelsKey in parsedArgs: @@ -124,10 +123,10 @@ def verifyService(service, parsedArgs): return dictMatch, msg if annotationsKey in parsedArgs: - dictMatch, msg = compareDicts( - service['metadata']['annotations'], parsedArgs[annotationsKey], annotationsKey) - if not dictMatch: - return dictMatch, msg + keysPresent, msg = validateKeyPresence( + service['metadata']['annotations'], parsedArgs[annotationsKey]) + if not keysPresent: + return keysPresent, msg return True, "" @@ -188,6 +187,13 @@ def compareDicts(actual: dict, expected: dict, paramName=""): return True, "" +def validateKeyPresence(actualDict: dict, expectedKeys: list): + actualKeys = actualDict.keys() + for key in expectedKeys: + if key not in actualKeys: + return False, f"expected key {key} not found in actual dict. \n actual dict keys {','.join(actualKeys)}" + + return True, "" def main(): parsedArgs: dict = parseArgs(sys.argv[1:]) @@ -220,7 +226,7 @@ def main(): if k8_object == None: raise ValueError(f"{kind} {name} was not found") - + except: msg = kind+' '+name+' not created or not found' getAllObjectsCmd = azPrefix + 'kubectl get '+kind+' -n '+namespace From d6508445a1e60522db8a684024fed289f983d1d4 Mon Sep 17 00:00:00 2001 From: David Gamero Date: Mon, 30 Oct 2023 16:33:02 -0400 Subject: [PATCH 05/10] release workflow (#297) * release workflow * prettier * switch to azure repo and sha --- .github/workflows/release-pr.yml | 17 +++++++++-------- CHANGELOG.md | 11 +++++++++++ 2 files changed, 20 insertions(+), 8 deletions(-) create mode 100644 CHANGELOG.md diff --git a/.github/workflows/release-pr.yml b/.github/workflows/release-pr.yml index bf4489907..62b916f25 100644 --- a/.github/workflows/release-pr.yml +++ b/.github/workflows/release-pr.yml @@ -1,14 +1,15 @@ -name: Create release PR +name: release Project on: + push: + branches: + - main + paths: + - CHANGELOG.md workflow_dispatch: - inputs: - release: - description: 'Define release version (ex: v1, v2, v3)' - required: true jobs: - release-pr: - uses: OliverMKing/javascript-release-workflow/.github/workflows/release-pr.yml@main + release: + uses: Azure/action-release-workflows/.github/workflows/release_js_project.yaml@12e20b8 with: - release: ${{ github.event.inputs.release }} + changelogPath: ./CHANGELOG.md diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 000000000..22f4ff59f --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,11 @@ +# Changelog + +## [4.10.0] - 2023-10-30 + +### Added + +- #287 Make annotating resources optional +- #283 Fix “Service” route-method of the Blue-Green strategy with some manifest files +- #281 bump codeql to node 16 +- #279 upgrade codeql +- #276 Fixes multiple namespaces bug From 4aba7c26f320f2560dbea35bde6b33b824df448b Mon Sep 17 00:00:00 2001 From: David Gamero Date: Tue, 31 Oct 2023 10:25:13 -0400 Subject: [PATCH 06/10] bump minikube to fix runner deps (#298) --- .github/workflows/run-integration-tests-bluegreen-ingress.yml | 2 +- .github/workflows/run-integration-tests-bluegreen-service.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/run-integration-tests-bluegreen-ingress.yml b/.github/workflows/run-integration-tests-bluegreen-ingress.yml index a1672e897..598702a64 100644 --- a/.github/workflows/run-integration-tests-bluegreen-ingress.yml +++ b/.github/workflows/run-integration-tests-bluegreen-ingress.yml @@ -38,7 +38,7 @@ jobs: name: Setup Minikube uses: medyagh/setup-minikube@latest with: - minikube-version: 1.24.0 + minikube-version: 1.31.2 kubernetes-version: 1.22.3 driver: 'none' timeout-minutes: 3 diff --git a/.github/workflows/run-integration-tests-bluegreen-service.yml b/.github/workflows/run-integration-tests-bluegreen-service.yml index 61c5b6a5d..acdcc2d25 100644 --- a/.github/workflows/run-integration-tests-bluegreen-service.yml +++ b/.github/workflows/run-integration-tests-bluegreen-service.yml @@ -38,7 +38,7 @@ jobs: name: Setup Minikube uses: medyagh/setup-minikube@latest with: - minikube-version: 1.24.0 + minikube-version: 1.31.2 kubernetes-version: 1.22.3 driver: 'none' timeout-minutes: 3 From 2f2901757b592f49ee10dd378023fc5c3bc53875 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 31 Oct 2023 12:01:40 -0400 Subject: [PATCH 07/10] Bump @babel/traverse from 7.18.9 to 7.23.2 (#295) Bumps [@babel/traverse](https://github.com/babel/babel/tree/HEAD/packages/babel-traverse) from 7.18.9 to 7.23.2. - [Release notes](https://github.com/babel/babel/releases) - [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md) - [Commits](https://github.com/babel/babel/commits/v7.23.2/packages/babel-traverse) --- updated-dependencies: - dependency-name: "@babel/traverse" dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: David Gamero --- package-lock.json | 402 +++++++++++++++++++++++++++++++--------------- 1 file changed, 276 insertions(+), 126 deletions(-) diff --git a/package-lock.json b/package-lock.json index 16755f88e..25260a878 100644 --- a/package-lock.json +++ b/package-lock.json @@ -94,17 +94,89 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", - "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", + "version": "7.22.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", + "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", "dev": true, "dependencies": { - "@babel/highlight": "^7.18.6" + "@babel/highlight": "^7.22.13", + "chalk": "^2.4.2" }, "engines": { "node": ">=6.9.0" } }, + "node_modules/@babel/code-frame/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/code-frame/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/@babel/code-frame/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/code-frame/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/@babel/compat-data": { "version": "7.18.8", "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.18.8.tgz", @@ -145,13 +217,14 @@ } }, "node_modules/@babel/generator": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.9.tgz", - "integrity": "sha512-wt5Naw6lJrL1/SGkipMiFxJjtyczUWTP38deiP1PO60HsBjDeKk08CGC3S8iVuvf0FmTdgKwU1KIXzSKL1G0Ug==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.0.tgz", + "integrity": "sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==", "dev": true, "dependencies": { - "@babel/types": "^7.18.9", + "@babel/types": "^7.23.0", "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" }, "engines": { @@ -191,34 +264,34 @@ } }, "node_modules/@babel/helper-environment-visitor": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", - "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", + "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-function-name": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.18.9.tgz", - "integrity": "sha512-fJgWlZt7nxGksJS9a0XdSaI4XvpExnNIgRP+rVefWh5U7BL8pPuir6SJUmFKRfjWQ51OtWSzwOxhaH/EBWWc0A==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", + "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", "dev": true, "dependencies": { - "@babel/template": "^7.18.6", - "@babel/types": "^7.18.9" + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-hoist-variables": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", - "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", "dev": true, "dependencies": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -277,21 +350,30 @@ } }, "node_modules/@babel/helper-split-export-declaration": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", - "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", "dev": true, "dependencies": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, + "node_modules/@babel/helper-string-parser": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", + "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz", - "integrity": "sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", "dev": true, "engines": { "node": ">=6.9.0" @@ -321,13 +403,13 @@ } }, "node_modules/@babel/highlight": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", - "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", + "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", "dev": true, "dependencies": { - "@babel/helper-validator-identifier": "^7.18.6", - "chalk": "^2.0.0", + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", "js-tokens": "^4.0.0" }, "engines": { @@ -406,9 +488,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.9.tgz", - "integrity": "sha512-9uJveS9eY9DJ0t64YbIBZICtJy8a5QrDEVdiLCG97fVLpDTpGX7t8mMSb6OWw6Lrnjqj4O8zwjELX3dhoMgiBg==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.0.tgz", + "integrity": "sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -565,33 +647,33 @@ } }, "node_modules/@babel/template": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.6.tgz", - "integrity": "sha512-JoDWzPe+wgBsTTgdnIma3iHNFC7YVJoPssVBDjiHfNlyt4YcunDtcDOUmfVDfCK5MfdsaIoX9PkijPhjH3nYUw==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", + "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.18.6", - "@babel/parser": "^7.18.6", - "@babel/types": "^7.18.6" + "@babel/code-frame": "^7.22.13", + "@babel/parser": "^7.22.15", + "@babel/types": "^7.22.15" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.18.9.tgz", - "integrity": "sha512-LcPAnujXGwBgv3/WHv01pHtb2tihcyW1XuL9wd7jqh1Z8AQkTd+QVjMrMijrln0T7ED3UXLIy36P9Ao7W75rYg==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.18.9", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.18.9", - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.18.9", - "@babel/types": "^7.18.9", + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.2.tgz", + "integrity": "sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.23.0", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.23.0", + "@babel/types": "^7.23.0", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -600,12 +682,13 @@ } }, "node_modules/@babel/types": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.9.tgz", - "integrity": "sha512-WwMLAg2MvJmt/rKEVQBBhIVffMmnilX4oe0sRe7iPOHIGsqpruFHHdrfj4O1CMMtgMtCU4oPafZjDPCRgO57Wg==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.0.tgz", + "integrity": "sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==", "dev": true, "dependencies": { - "@babel/helper-validator-identifier": "^7.18.6", + "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.20", "to-fast-properties": "^2.0.0" }, "engines": { @@ -924,13 +1007,13 @@ "dev": true }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.14", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.14.tgz", - "integrity": "sha512-bJWEfQ9lPTvm3SneWwRFVLzrh6nhjwqw7TUFFBEMzwvg7t7PCDenf2lDwqo4NQXzdpgBXyFgDWnQA+2vkruksQ==", + "version": "0.3.19", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz", + "integrity": "sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==", "dev": true, "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" } }, "node_modules/@octokit/auth-token": { @@ -6486,12 +6569,71 @@ } }, "@babel/code-frame": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", - "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", + "version": "7.22.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", + "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", "dev": true, "requires": { - "@babel/highlight": "^7.18.6" + "@babel/highlight": "^7.22.13", + "chalk": "^2.4.2" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } } }, "@babel/compat-data": { @@ -6524,13 +6666,14 @@ } }, "@babel/generator": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.9.tgz", - "integrity": "sha512-wt5Naw6lJrL1/SGkipMiFxJjtyczUWTP38deiP1PO60HsBjDeKk08CGC3S8iVuvf0FmTdgKwU1KIXzSKL1G0Ug==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.0.tgz", + "integrity": "sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==", "dev": true, "requires": { - "@babel/types": "^7.18.9", + "@babel/types": "^7.23.0", "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" }, "dependencies": { @@ -6560,28 +6703,28 @@ } }, "@babel/helper-environment-visitor": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", - "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", + "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", "dev": true }, "@babel/helper-function-name": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.18.9.tgz", - "integrity": "sha512-fJgWlZt7nxGksJS9a0XdSaI4XvpExnNIgRP+rVefWh5U7BL8pPuir6SJUmFKRfjWQ51OtWSzwOxhaH/EBWWc0A==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", + "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", "dev": true, "requires": { - "@babel/template": "^7.18.6", - "@babel/types": "^7.18.9" + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" } }, "@babel/helper-hoist-variables": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", - "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", "dev": true, "requires": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.5" } }, "@babel/helper-module-imports": { @@ -6625,18 +6768,24 @@ } }, "@babel/helper-split-export-declaration": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", - "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", "dev": true, "requires": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.5" } }, + "@babel/helper-string-parser": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", + "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", + "dev": true + }, "@babel/helper-validator-identifier": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz", - "integrity": "sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", "dev": true }, "@babel/helper-validator-option": { @@ -6657,13 +6806,13 @@ } }, "@babel/highlight": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", - "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", + "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.18.6", - "chalk": "^2.0.0", + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", "js-tokens": "^4.0.0" }, "dependencies": { @@ -6726,9 +6875,9 @@ } }, "@babel/parser": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.9.tgz", - "integrity": "sha512-9uJveS9eY9DJ0t64YbIBZICtJy8a5QrDEVdiLCG97fVLpDTpGX7t8mMSb6OWw6Lrnjqj4O8zwjELX3dhoMgiBg==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.0.tgz", + "integrity": "sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==", "dev": true }, "@babel/plugin-syntax-async-generators": { @@ -6840,41 +6989,42 @@ } }, "@babel/template": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.6.tgz", - "integrity": "sha512-JoDWzPe+wgBsTTgdnIma3iHNFC7YVJoPssVBDjiHfNlyt4YcunDtcDOUmfVDfCK5MfdsaIoX9PkijPhjH3nYUw==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", + "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", "dev": true, "requires": { - "@babel/code-frame": "^7.18.6", - "@babel/parser": "^7.18.6", - "@babel/types": "^7.18.6" + "@babel/code-frame": "^7.22.13", + "@babel/parser": "^7.22.15", + "@babel/types": "^7.22.15" } }, "@babel/traverse": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.18.9.tgz", - "integrity": "sha512-LcPAnujXGwBgv3/WHv01pHtb2tihcyW1XuL9wd7jqh1Z8AQkTd+QVjMrMijrln0T7ED3UXLIy36P9Ao7W75rYg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.18.9", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.18.9", - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.18.9", - "@babel/types": "^7.18.9", + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.2.tgz", + "integrity": "sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.23.0", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.23.0", + "@babel/types": "^7.23.0", "debug": "^4.1.0", "globals": "^11.1.0" } }, "@babel/types": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.9.tgz", - "integrity": "sha512-WwMLAg2MvJmt/rKEVQBBhIVffMmnilX4oe0sRe7iPOHIGsqpruFHHdrfj4O1CMMtgMtCU4oPafZjDPCRgO57Wg==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.0.tgz", + "integrity": "sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.18.6", + "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.20", "to-fast-properties": "^2.0.0" } }, @@ -7134,13 +7284,13 @@ "dev": true }, "@jridgewell/trace-mapping": { - "version": "0.3.14", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.14.tgz", - "integrity": "sha512-bJWEfQ9lPTvm3SneWwRFVLzrh6nhjwqw7TUFFBEMzwvg7t7PCDenf2lDwqo4NQXzdpgBXyFgDWnQA+2vkruksQ==", + "version": "0.3.19", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz", + "integrity": "sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==", "dev": true, "requires": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" } }, "@octokit/auth-token": { From 7c36b75ebe26c887767ce07231a12da795e141c9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 31 Oct 2023 16:06:59 +0000 Subject: [PATCH 08/10] Bump word-wrap from 1.2.3 to 1.2.4 (#292) Bumps [word-wrap](https://github.com/jonschlinkert/word-wrap) from 1.2.3 to 1.2.4. - [Release notes](https://github.com/jonschlinkert/word-wrap/releases) - [Commits](https://github.com/jonschlinkert/word-wrap/compare/1.2.3...1.2.4) --- updated-dependencies: - dependency-name: word-wrap dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Jaiveer Katariya <35347859+jaiveerk@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 25260a878..b794ce898 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6378,9 +6378,9 @@ "dev": true }, "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==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.4.tgz", + "integrity": "sha512-2V81OA4ugVo5pRo46hAoD2ivUJx8jXmWXfUkY4KFNw0hEptvN0QfH3K4nHiwzGeKl5rFKedV48QVoqYavy4YpA==", "dev": true, "engines": { "node": ">=0.10.0" @@ -11492,9 +11492,9 @@ "dev": true }, "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==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.4.tgz", + "integrity": "sha512-2V81OA4ugVo5pRo46hAoD2ivUJx8jXmWXfUkY4KFNw0hEptvN0QfH3K4nHiwzGeKl5rFKedV48QVoqYavy4YpA==", "dev": true }, "wrap-ansi": { From a1d061da9d6197f4f58fe72da32e7614236157f2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 31 Oct 2023 16:14:24 +0000 Subject: [PATCH 09/10] Bump semver from 5.7.1 to 5.7.2 (#291) Bumps [semver](https://github.com/npm/node-semver) from 5.7.1 to 5.7.2. - [Release notes](https://github.com/npm/node-semver/releases) - [Changelog](https://github.com/npm/node-semver/blob/v5.7.2/CHANGELOG.md) - [Commits](https://github.com/npm/node-semver/compare/v5.7.1...v5.7.2) --- updated-dependencies: - dependency-name: semver dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: David Gamero --- package-lock.json | 72 +++++++++++++++++++++++------------------------ 1 file changed, 36 insertions(+), 36 deletions(-) diff --git a/package-lock.json b/package-lock.json index b794ce898..3b36a7a7c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3726,9 +3726,9 @@ } }, "node_modules/jest-snapshot/node_modules/semver": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", - "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" @@ -4231,9 +4231,9 @@ } }, "node_modules/node-notifier/node_modules/semver": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", - "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, "optional": true, "dependencies": { @@ -4275,9 +4275,9 @@ } }, "node_modules/normalize-package-data/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true, "bin": { "semver": "bin/semver" @@ -5176,9 +5176,9 @@ } }, "node_modules/sane/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true, "bin": { "semver": "bin/semver" @@ -5243,9 +5243,9 @@ } }, "node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "bin": { "semver": "bin/semver.js" } @@ -6026,9 +6026,9 @@ } }, "node_modules/ts-jest/node_modules/semver": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", - "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" @@ -9433,9 +9433,9 @@ }, "dependencies": { "semver": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", - "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -9826,9 +9826,9 @@ }, "dependencies": { "semver": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", - "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, "optional": true, "requires": { @@ -9863,9 +9863,9 @@ }, "dependencies": { "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true } } @@ -10547,9 +10547,9 @@ "dev": true }, "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true }, "shebang-command": { @@ -10598,9 +10598,9 @@ } }, "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==" }, "set-blocking": { "version": "2.0.0", @@ -11224,9 +11224,9 @@ }, "dependencies": { "semver": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", - "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, "requires": { "lru-cache": "^6.0.0" From 699a70732d98d606601a71f3e6d8b9115eb46847 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 31 Oct 2023 12:19:50 -0400 Subject: [PATCH 10/10] Bump tough-cookie from 4.0.0 to 4.1.3 (#290) Bumps [tough-cookie](https://github.com/salesforce/tough-cookie) from 4.0.0 to 4.1.3. - [Release notes](https://github.com/salesforce/tough-cookie/releases) - [Changelog](https://github.com/salesforce/tough-cookie/blob/master/CHANGELOG.md) - [Commits](https://github.com/salesforce/tough-cookie/compare/v4.0.0...v4.1.3) --- updated-dependencies: - dependency-name: tough-cookie dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: David Gamero --- package-lock.json | 74 ++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 60 insertions(+), 14 deletions(-) diff --git a/package-lock.json b/package-lock.json index 3b36a7a7c..33467dcae 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4729,6 +4729,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", + "dev": true + }, "node_modules/react-is": { "version": "17.0.2", "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", @@ -4837,6 +4843,12 @@ "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", "dev": true }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "dev": true + }, "node_modules/resolve": { "version": "1.22.1", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", @@ -5972,14 +5984,15 @@ } }, "node_modules/tough-cookie": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.0.0.tgz", - "integrity": "sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg==", + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.3.tgz", + "integrity": "sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==", "dev": true, "dependencies": { "psl": "^1.1.33", "punycode": "^2.1.1", - "universalify": "^0.1.2" + "universalify": "^0.2.0", + "url-parse": "^1.5.3" }, "engines": { "node": ">=6" @@ -6148,9 +6161,9 @@ "integrity": "sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w==" }, "node_modules/universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", + "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", "dev": true, "engines": { "node": ">= 4.0.0" @@ -6237,6 +6250,16 @@ "deprecated": "Please see https://github.com/lydell/urix#deprecated", "dev": true }, + "node_modules/url-parse": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + "dev": true, + "dependencies": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, "node_modules/use": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", @@ -10194,6 +10217,12 @@ "side-channel": "^1.0.4" } }, + "querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", + "dev": true + }, "react-is": { "version": "17.0.2", "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", @@ -10279,6 +10308,12 @@ "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", "dev": true }, + "requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "dev": true + }, "resolve": { "version": "1.22.1", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", @@ -11186,14 +11221,15 @@ } }, "tough-cookie": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.0.0.tgz", - "integrity": "sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg==", + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.3.tgz", + "integrity": "sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==", "dev": true, "requires": { "psl": "^1.1.33", "punycode": "^2.1.1", - "universalify": "^0.1.2" + "universalify": "^0.2.0", + "url-parse": "^1.5.3" } }, "tr46": { @@ -11316,9 +11352,9 @@ "integrity": "sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w==" }, "universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", + "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", "dev": true }, "unset-value": { @@ -11377,6 +11413,16 @@ "integrity": "sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==", "dev": true }, + "url-parse": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + "dev": true, + "requires": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, "use": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz",