mirror of
https://github.com/cloudnative-pg/plugin-barman-cloud.git
synced 2026-07-06 17:52:21 +02:00
Compare commits
5 Commits
f3fcbe14ee
...
16bc55f67e
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
16bc55f67e | ||
|
|
1b383e0e20 | ||
|
|
e4d375c4a5 | ||
|
|
bb53820c57 | ||
|
|
bf52833594 |
2
go.mod
2
go.mod
@ -10,7 +10,7 @@ require (
|
||||
github.com/cloudnative-pg/cnpg-i v0.5.0
|
||||
github.com/cloudnative-pg/cnpg-i-machinery v0.4.2
|
||||
github.com/cloudnative-pg/machinery v0.5.0
|
||||
github.com/onsi/ginkgo/v2 v2.31.0
|
||||
github.com/onsi/ginkgo/v2 v2.32.0
|
||||
github.com/onsi/gomega v1.42.0
|
||||
github.com/spf13/cobra v1.10.2
|
||||
github.com/spf13/viper v1.21.0
|
||||
|
||||
4
go.sum
4
go.sum
@ -161,8 +161,8 @@ github.com/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00 h1:n6/
|
||||
github.com/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00/go.mod h1:Pm3mSP3c5uWn86xMLZ5Sa7JB9GsEZySvHYXCTK4E9q4=
|
||||
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA=
|
||||
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ=
|
||||
github.com/onsi/ginkgo/v2 v2.31.0 h1:GtuJos5DFUV9EerYJo8RhYxosYNGvOdDE5haKq6Grfs=
|
||||
github.com/onsi/ginkgo/v2 v2.31.0/go.mod h1:+aXOY+vzZ5mu2iI2HpTZUPmM//oQfsNFX6gU9kNcA44=
|
||||
github.com/onsi/ginkgo/v2 v2.32.0 h1:Hw7s2pVrQo/8Yz5N77qdnpHaoc+c6cC9WIV1Jce+J6E=
|
||||
github.com/onsi/ginkgo/v2 v2.32.0/go.mod h1:+aXOY+vzZ5mu2iI2HpTZUPmM//oQfsNFX6gU9kNcA44=
|
||||
github.com/onsi/gomega v1.42.0 h1:CJby8u36xb7v34W78F8WKvqTQP7PCMIPB78IVDB73l4=
|
||||
github.com/onsi/gomega v1.42.0/go.mod h1:M/Uqpu/8qTjtzCLUA2zJHX9Iilrau25x1PdoSRbWh5A=
|
||||
github.com/pelletier/go-toml/v2 v2.2.4 h1:mye9XuhQ6gvn5h28+VilKrrPoQVanw5PMw/TB0t5Ec4=
|
||||
|
||||
@ -39,6 +39,7 @@ import (
|
||||
_ "github.com/cloudnative-pg/plugin-barman-cloud/test/e2e/internal/tests/backup"
|
||||
_ "github.com/cloudnative-pg/plugin-barman-cloud/test/e2e/internal/tests/credentialrotation"
|
||||
_ "github.com/cloudnative-pg/plugin-barman-cloud/test/e2e/internal/tests/replicacluster"
|
||||
_ "github.com/cloudnative-pg/plugin-barman-cloud/test/e2e/internal/tests/walrestore"
|
||||
|
||||
. "github.com/onsi/ginkgo/v2"
|
||||
. "github.com/onsi/gomega"
|
||||
|
||||
24
test/e2e/internal/tests/walrestore/doc.go
Normal file
24
test/e2e/internal/tests/walrestore/doc.go
Normal file
@ -0,0 +1,24 @@
|
||||
/*
|
||||
Copyright © contributors to CloudNativePG, established as
|
||||
CloudNativePG a Series of LF Projects, LLC.
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
|
||||
SPDX-License-Identifier: Apache-2.0
|
||||
*/
|
||||
|
||||
// Package walrestore contains the end-to-end test for the parallel WAL restore
|
||||
// behaviour of the Barman Cloud Plugin: prefetching upcoming segments into the
|
||||
// spool directory, serving later requests from the spool, and tracking the
|
||||
// end-of-wal-stream sentinel.
|
||||
package walrestore
|
||||
177
test/e2e/internal/tests/walrestore/fixtures.go
Normal file
177
test/e2e/internal/tests/walrestore/fixtures.go
Normal file
@ -0,0 +1,177 @@
|
||||
/*
|
||||
Copyright © contributors to CloudNativePG, established as
|
||||
CloudNativePG a Series of LF Projects, LLC.
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
|
||||
SPDX-License-Identifier: Apache-2.0
|
||||
*/
|
||||
|
||||
package walrestore
|
||||
|
||||
import (
|
||||
cloudnativepgv1 "github.com/cloudnative-pg/api/pkg/api/v1"
|
||||
barmanapi "github.com/cloudnative-pg/barman-cloud/pkg/api"
|
||||
appsv1 "k8s.io/api/apps/v1"
|
||||
corev1 "k8s.io/api/core/v1"
|
||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||
"k8s.io/utils/ptr"
|
||||
|
||||
pluginBarmanCloudV1 "github.com/cloudnative-pg/plugin-barman-cloud/api/v1"
|
||||
"github.com/cloudnative-pg/plugin-barman-cloud/test/e2e/internal/objectstore"
|
||||
)
|
||||
|
||||
const (
|
||||
minioName = "minio"
|
||||
objectStoreName = "source"
|
||||
clusterName = "source"
|
||||
s3ClientName = "s3-client"
|
||||
storageSize = "1Gi"
|
||||
// walMaxParallel is the prefetch parallelism under test: for a regular WAL
|
||||
// request the plugin restores the requested segment and prefetches the next
|
||||
// ones, up to this many segments in total.
|
||||
walMaxParallel = 3
|
||||
)
|
||||
|
||||
// newObjectStoreResources returns the minio server Deployment/Service/Secret/PVC.
|
||||
func newObjectStoreResources(namespace string) *objectstore.Resources {
|
||||
return objectstore.NewMinioObjectStoreResources(namespace, minioName)
|
||||
}
|
||||
|
||||
// newObjectStore returns a minio-backed ObjectStore configured with the WAL
|
||||
// prefetch parallelism (maxParallel) under test. Archiving with gzip makes the
|
||||
// archived segments carry the ".gz" suffix that forged segments are copied from.
|
||||
func newObjectStore(namespace string) *pluginBarmanCloudV1.ObjectStore {
|
||||
store := objectstore.NewMinioObjectStore(namespace, objectStoreName, minioName)
|
||||
store.Spec.Configuration.Wal = &barmanapi.WalBackupConfiguration{
|
||||
MaxParallel: walMaxParallel,
|
||||
Compression: barmanapi.CompressionTypeGzip,
|
||||
}
|
||||
return store
|
||||
}
|
||||
|
||||
// newCluster returns a 2-instance cluster that uses the plugin as its WAL
|
||||
// archiver, so the standby drives WAL restore (and its prefetch/spool/
|
||||
// end-of-wal-stream state machine) through the plugin.
|
||||
func newCluster(namespace string) *cloudnativepgv1.Cluster {
|
||||
return &cloudnativepgv1.Cluster{
|
||||
TypeMeta: metav1.TypeMeta{
|
||||
Kind: "Cluster",
|
||||
APIVersion: "postgresql.cnpg.io/v1",
|
||||
},
|
||||
ObjectMeta: metav1.ObjectMeta{
|
||||
Name: clusterName,
|
||||
Namespace: namespace,
|
||||
},
|
||||
Spec: cloudnativepgv1.ClusterSpec{
|
||||
Instances: 2,
|
||||
ImagePullPolicy: corev1.PullAlways,
|
||||
Plugins: []cloudnativepgv1.PluginConfiguration{
|
||||
{
|
||||
Name: "barman-cloud.cloudnative-pg.io",
|
||||
Parameters: map[string]string{
|
||||
"barmanObjectName": objectStoreName,
|
||||
},
|
||||
IsWALArchiver: ptr.To(true),
|
||||
},
|
||||
},
|
||||
PostgresConfiguration: cloudnativepgv1.PostgresConfiguration{
|
||||
Parameters: map[string]string{
|
||||
"log_min_messages": "DEBUG4",
|
||||
},
|
||||
},
|
||||
StorageConfiguration: cloudnativepgv1.StorageConfiguration{
|
||||
Size: storageSize,
|
||||
},
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
// newS3ClientDeployment returns a deployment running the AWS CLI configured to
|
||||
// talk to the in-namespace minio service. The test execs `aws s3` commands in
|
||||
// it to forge WAL segments on the object store and to check their presence.
|
||||
func newS3ClientDeployment(namespace string) *appsv1.Deployment {
|
||||
labels := map[string]string{"app": s3ClientName}
|
||||
return &appsv1.Deployment{
|
||||
TypeMeta: metav1.TypeMeta{
|
||||
Kind: "Deployment",
|
||||
APIVersion: "apps/v1",
|
||||
},
|
||||
ObjectMeta: metav1.ObjectMeta{
|
||||
Name: s3ClientName,
|
||||
Namespace: namespace,
|
||||
},
|
||||
Spec: appsv1.DeploymentSpec{
|
||||
Replicas: ptr.To(int32(1)),
|
||||
Selector: &metav1.LabelSelector{MatchLabels: labels},
|
||||
Template: corev1.PodTemplateSpec{
|
||||
ObjectMeta: metav1.ObjectMeta{Labels: labels},
|
||||
Spec: corev1.PodSpec{
|
||||
Containers: []corev1.Container{
|
||||
{
|
||||
Name: s3ClientName,
|
||||
// renovate: datasource=docker depName=amazon/aws-cli versioning=docker
|
||||
Image: "docker.io/amazon/aws-cli:2.35.11",
|
||||
Command: []string{"sleep", "infinity"},
|
||||
Env: []corev1.EnvVar{
|
||||
{
|
||||
Name: "AWS_ENDPOINT_URL",
|
||||
Value: "http://" + minioName + ":9000",
|
||||
},
|
||||
{
|
||||
Name: "AWS_ACCESS_KEY_ID",
|
||||
ValueFrom: &corev1.EnvVarSource{
|
||||
SecretKeyRef: &corev1.SecretKeySelector{
|
||||
LocalObjectReference: corev1.LocalObjectReference{Name: minioName},
|
||||
Key: "ACCESS_KEY_ID",
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
Name: "AWS_SECRET_ACCESS_KEY",
|
||||
ValueFrom: &corev1.EnvVarSource{
|
||||
SecretKeyRef: &corev1.SecretKeySelector{
|
||||
LocalObjectReference: corev1.LocalObjectReference{Name: minioName},
|
||||
Key: "ACCESS_SECRET_KEY",
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
Name: "AWS_DEFAULT_REGION",
|
||||
Value: "us-east-1",
|
||||
},
|
||||
// The CRC-based default checksums introduced in AWS
|
||||
// CLI 2.23 are not supported by every S3-compatible
|
||||
// object store, minio included.
|
||||
{
|
||||
Name: "AWS_REQUEST_CHECKSUM_CALCULATION",
|
||||
Value: "when_required",
|
||||
},
|
||||
{
|
||||
Name: "AWS_RESPONSE_CHECKSUM_VALIDATION",
|
||||
Value: "when_required",
|
||||
},
|
||||
},
|
||||
SecurityContext: &corev1.SecurityContext{
|
||||
AllowPrivilegeEscalation: ptr.To(false),
|
||||
SeccompProfile: &corev1.SeccompProfile{
|
||||
Type: corev1.SeccompProfileTypeRuntimeDefault,
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
}
|
||||
308
test/e2e/internal/tests/walrestore/walrestore.go
Normal file
308
test/e2e/internal/tests/walrestore/walrestore.go
Normal file
@ -0,0 +1,308 @@
|
||||
/*
|
||||
Copyright © contributors to CloudNativePG, established as
|
||||
CloudNativePG a Series of LF Projects, LLC.
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
|
||||
SPDX-License-Identifier: Apache-2.0
|
||||
*/
|
||||
|
||||
package walrestore
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"strconv"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
corev1 "k8s.io/api/core/v1"
|
||||
apitypes "k8s.io/apimachinery/pkg/types"
|
||||
"k8s.io/client-go/kubernetes"
|
||||
"k8s.io/client-go/rest"
|
||||
"sigs.k8s.io/controller-runtime/pkg/client"
|
||||
|
||||
internalClient "github.com/cloudnative-pg/plugin-barman-cloud/test/e2e/internal/client"
|
||||
internalCluster "github.com/cloudnative-pg/plugin-barman-cloud/test/e2e/internal/cluster"
|
||||
"github.com/cloudnative-pg/plugin-barman-cloud/test/e2e/internal/command"
|
||||
"github.com/cloudnative-pg/plugin-barman-cloud/test/e2e/internal/deployment"
|
||||
nmsp "github.com/cloudnative-pg/plugin-barman-cloud/test/e2e/internal/namespace"
|
||||
|
||||
. "github.com/onsi/ginkgo/v2"
|
||||
. "github.com/onsi/gomega"
|
||||
)
|
||||
|
||||
const (
|
||||
// spoolDirectory is where the plugin sidecar prefetches WAL segments and
|
||||
// records the end-of-wal-stream sentinel. It must match the SPOOL_DIRECTORY
|
||||
// the operator injects on the sidecar (internal/cnpgi/operator/lifecycle.go),
|
||||
// which lives on the CloudNativePG scratch-data volume shared with the
|
||||
// postgres container, so the path is visible from the postgres container too.
|
||||
spoolDirectory = "/controller/wal-restore-spool"
|
||||
// pgWalPath is PgDataPath + "/pg_wal" in the CloudNativePG operand image.
|
||||
pgWalPath = "/var/lib/postgresql/data/pgdata/pg_wal"
|
||||
// endOfWALStreamFlag is the sentinel file the barman-cloud restorer writes in
|
||||
// the spool to record that the archive ran out of segments.
|
||||
endOfWALStreamFlag = "end-of-wal-stream"
|
||||
// managerExecutable is the CloudNativePG instance manager. Its wal-restore
|
||||
// subcommand delegates to the plugin when the cluster uses it as WAL archiver.
|
||||
managerExecutable = "/controller/manager"
|
||||
// postgresContainer is the container we exec into on instance pods.
|
||||
postgresContainer = "postgres"
|
||||
// walLogDir is the WALs subdirectory (timeline + log id) the forged segments
|
||||
// live under; a freshly bootstrapped, idle cluster stays within it.
|
||||
walLogDir = "0000000100000000"
|
||||
// bucket is the destination bucket of the minio ObjectStore.
|
||||
bucket = "backups"
|
||||
)
|
||||
|
||||
// walFile returns the name of the n-th forged WAL segment (segment 0xF0+n on
|
||||
// timeline 1, log 0). The high segment number keeps it out of the range an idle
|
||||
// PostgreSQL would archive on its own. Hex formatting keeps the name a valid
|
||||
// 24-character segment for any small n.
|
||||
func walFile(n int) string {
|
||||
return fmt.Sprintf("0000000100000000%08X", 0xF0+n)
|
||||
}
|
||||
|
||||
// walObjectURI returns the s3 URI of a wals object (by file name) in the store.
|
||||
func walObjectURI(name string) string {
|
||||
return fmt.Sprintf("s3://%s/%s/wals/%s/%s", bucket, clusterName, walLogDir, name)
|
||||
}
|
||||
|
||||
// execInPod runs a command in the given container and returns stdout, stderr
|
||||
// and the error (non-nil for a non-zero exit code).
|
||||
func execInPod(
|
||||
ctx context.Context,
|
||||
clientSet *kubernetes.Clientset,
|
||||
cfg *rest.Config,
|
||||
namespace, pod, container string,
|
||||
args ...string,
|
||||
) (string, string, error) {
|
||||
return command.ExecuteInContainer(
|
||||
ctx,
|
||||
*clientSet,
|
||||
cfg,
|
||||
command.ContainerLocator{
|
||||
NamespaceName: namespace,
|
||||
PodName: pod,
|
||||
ContainerName: container,
|
||||
},
|
||||
nil,
|
||||
args,
|
||||
)
|
||||
}
|
||||
|
||||
// This test drives the plugin's parallel WAL restore directly: it invokes the
|
||||
// instance-manager wal-restore command on the standby (which delegates to the
|
||||
// plugin) and asserts the prefetch/spool/end-of-wal-stream state machine with
|
||||
// maxParallel = 3. To control the archive deterministically, it forges WAL
|
||||
// segments on the object store by copying a real archived segment under new
|
||||
// names.
|
||||
var _ = Describe("Parallel WAL restore", func() {
|
||||
var (
|
||||
namespace *corev1.Namespace
|
||||
cl client.Client
|
||||
clientSet *kubernetes.Clientset
|
||||
cfg *rest.Config
|
||||
)
|
||||
|
||||
BeforeEach(func(ctx SpecContext) {
|
||||
var err error
|
||||
cl, _, err = internalClient.NewClient()
|
||||
Expect(err).NotTo(HaveOccurred())
|
||||
clientSet, cfg, err = internalClient.NewClientSet()
|
||||
Expect(err).NotTo(HaveOccurred())
|
||||
namespace, err = nmsp.CreateUniqueNamespace(ctx, cl, "wal-restore-parallel")
|
||||
Expect(err).NotTo(HaveOccurred())
|
||||
})
|
||||
|
||||
AfterEach(func(ctx SpecContext) {
|
||||
Expect(cl.Delete(ctx, namespace)).To(Succeed())
|
||||
})
|
||||
|
||||
It("prefetches segments, serves them from the spool and tracks end-of-wal-stream",
|
||||
func(ctx SpecContext) {
|
||||
ns := namespace.Name
|
||||
|
||||
By("creating the object store backing resources")
|
||||
Expect(newObjectStoreResources(ns).Create(ctx, cl)).To(Succeed())
|
||||
|
||||
By("creating the ObjectStore with WAL maxParallel")
|
||||
Expect(cl.Create(ctx, newObjectStore(ns))).To(Succeed())
|
||||
|
||||
By("deploying the S3 client used to forge and inspect WAL segments")
|
||||
Expect(cl.Create(ctx, newS3ClientDeployment(ns))).To(Succeed())
|
||||
|
||||
By("creating the cluster using the plugin as WAL archiver")
|
||||
cluster := newCluster(ns)
|
||||
Expect(cl.Create(ctx, cluster)).To(Succeed())
|
||||
|
||||
By("waiting for the cluster to become ready")
|
||||
Eventually(func(g Gomega) {
|
||||
g.Expect(cl.Get(ctx,
|
||||
apitypes.NamespacedName{Name: clusterName, Namespace: ns},
|
||||
cluster)).To(Succeed())
|
||||
g.Expect(internalCluster.IsReady(*cluster)).To(BeTrue())
|
||||
}).WithTimeout(10 * time.Minute).WithPolling(10 * time.Second).Should(Succeed())
|
||||
|
||||
By("waiting for the S3 client to become ready")
|
||||
Eventually(func(g Gomega) {
|
||||
ready, err := deployment.IsReady(ctx, cl,
|
||||
apitypes.NamespacedName{Name: s3ClientName, Namespace: ns})
|
||||
g.Expect(err).NotTo(HaveOccurred())
|
||||
g.Expect(ready).To(BeTrue())
|
||||
}).WithTimeout(2 * time.Minute).WithPolling(5 * time.Second).Should(Succeed())
|
||||
|
||||
primary := cluster.Status.CurrentPrimary
|
||||
Expect(primary).NotTo(BeEmpty())
|
||||
standby := clusterName + "-2"
|
||||
|
||||
var s3ClientPods corev1.PodList
|
||||
Expect(cl.List(ctx, &s3ClientPods,
|
||||
client.InNamespace(ns),
|
||||
client.MatchingLabels{"app": s3ClientName})).To(Succeed())
|
||||
Expect(s3ClientPods.Items).NotTo(BeEmpty())
|
||||
s3Client := s3ClientPods.Items[0].Name
|
||||
|
||||
// Operations scoped to the fixed pods/clients, kept as closures so the
|
||||
// step assertions below read like the original state-machine table.
|
||||
restore := func(name string) error {
|
||||
_, _, err := execInPod(ctx, clientSet, cfg, ns, standby, postgresContainer,
|
||||
managerExecutable, "wal-restore", name, pgWalPath+"/"+name)
|
||||
return err
|
||||
}
|
||||
existsIn := func(dir, name string) bool {
|
||||
_, _, err := execInPod(ctx, clientSet, cfg, ns, standby, postgresContainer,
|
||||
"test", "-f", dir+"/"+name)
|
||||
return err == nil
|
||||
}
|
||||
flagSet := func() bool { return existsIn(spoolDirectory, endOfWALStreamFlag) }
|
||||
spoolSegments := func() int {
|
||||
out, _, _ := execInPod(ctx, clientSet, cfg, ns, standby, postgresContainer,
|
||||
"sh", "-c",
|
||||
"ls -1 "+spoolDirectory+" 2>/dev/null | grep -Ec '^[0-9A-F]{24}$' || true")
|
||||
n, _ := strconv.Atoi(strings.TrimSpace(out))
|
||||
return n
|
||||
}
|
||||
purgeSpool := func() {
|
||||
_, _, _ = execInPod(ctx, clientSet, cfg, ns, standby, postgresContainer,
|
||||
"sh", "-c", "rm -f "+spoolDirectory+"/* 2>/dev/null; true")
|
||||
}
|
||||
forge := func(src, dst string) {
|
||||
// ExecuteInContainer folds a non-zero exit (and its output) into the
|
||||
// returned error, so we surface that rather than the empty stderr.
|
||||
_, _, err := execInPod(ctx, clientSet, cfg, ns, s3Client, s3ClientName,
|
||||
"aws", "s3", "cp", walObjectURI(src), walObjectURI(dst))
|
||||
Expect(err).NotTo(HaveOccurred(), "forging %s -> %s", src, dst)
|
||||
}
|
||||
objectExists := func(name string) bool {
|
||||
out, _, err := execInPod(ctx, clientSet, cfg, ns, s3Client, s3ClientName,
|
||||
"aws", "s3", "ls", walObjectURI(name))
|
||||
return err == nil && strings.TrimSpace(out) != ""
|
||||
}
|
||||
|
||||
var latestWAL string
|
||||
By("archiving a real WAL on the primary and learning its name")
|
||||
_, _, err := execInPod(ctx, clientSet, cfg, ns, primary, postgresContainer,
|
||||
"psql", "-tAc", "CHECKPOINT")
|
||||
Expect(err).NotTo(HaveOccurred(), "CHECKPOINT on the primary failed")
|
||||
out, _, err := execInPod(ctx, clientSet, cfg, ns, primary, postgresContainer,
|
||||
"psql", "-tAc", "SELECT pg_walfile_name(pg_switch_wal())")
|
||||
Expect(err).NotTo(HaveOccurred(), "switching WAL on the primary failed")
|
||||
latestWAL = strings.TrimSpace(out)
|
||||
Expect(latestWAL).To(HavePrefix(walLogDir),
|
||||
"the freshly bootstrapped cluster should still be on the first WAL log")
|
||||
|
||||
By("waiting for the archived WAL to land on the object store")
|
||||
Eventually(func() bool {
|
||||
return objectExists(latestWAL + ".gz")
|
||||
}).WithTimeout(2 * time.Minute).WithPolling(5 * time.Second).Should(BeTrue())
|
||||
|
||||
By("forging WAL segments #1 to #5 from the archived WAL")
|
||||
for n := 1; n <= 5; n++ {
|
||||
forge(latestWAL+".gz", walFile(n))
|
||||
}
|
||||
|
||||
By("ensuring the spool directory is empty on the standby")
|
||||
purgeSpool()
|
||||
|
||||
// #1: served fresh; #2 and #3 prefetched into the spool; flag unset.
|
||||
By("requesting WAL #1: #1 restored, #2 and #3 prefetched")
|
||||
Expect(restore(walFile(1))).To(Succeed())
|
||||
Eventually(func(g Gomega) {
|
||||
g.Expect(existsIn(pgWalPath, walFile(1))).To(BeTrue(), "#1 in pg_wal")
|
||||
g.Expect(existsIn(spoolDirectory, walFile(2))).To(BeTrue(), "#2 in spool")
|
||||
g.Expect(existsIn(spoolDirectory, walFile(3))).To(BeTrue(), "#3 in spool")
|
||||
g.Expect(flagSet()).To(BeFalse(), "end-of-wal-stream unset")
|
||||
}).WithTimeout(time.Minute).WithPolling(2 * time.Second).Should(Succeed())
|
||||
|
||||
// #2: served from the spool; #3 stays prefetched; no new prefetch; flag unset.
|
||||
By("requesting WAL #2: served from the spool, #3 still prefetched")
|
||||
Expect(restore(walFile(2))).To(Succeed())
|
||||
Eventually(func(g Gomega) {
|
||||
g.Expect(existsIn(pgWalPath, walFile(2))).To(BeTrue(), "#2 in pg_wal")
|
||||
g.Expect(existsIn(spoolDirectory, walFile(3))).To(BeTrue(), "#3 in spool")
|
||||
g.Expect(flagSet()).To(BeFalse(), "end-of-wal-stream unset")
|
||||
}).WithTimeout(time.Minute).WithPolling(2 * time.Second).Should(Succeed())
|
||||
|
||||
// #3: served from the spool; spool now empty; flag unset.
|
||||
By("requesting WAL #3: served from the spool, spool now empty")
|
||||
Expect(restore(walFile(3))).To(Succeed())
|
||||
Eventually(func(g Gomega) {
|
||||
g.Expect(existsIn(pgWalPath, walFile(3))).To(BeTrue(), "#3 in pg_wal")
|
||||
g.Expect(spoolSegments()).To(Equal(0), "no WAL segments in spool")
|
||||
g.Expect(flagSet()).To(BeFalse(), "end-of-wal-stream unset")
|
||||
}).WithTimeout(time.Minute).WithPolling(2 * time.Second).Should(Succeed())
|
||||
|
||||
// #4: served fresh; #5 prefetched; #6 absent so end-of-wal-stream is set.
|
||||
By("requesting WAL #4: #4 restored, #5 prefetched, end-of-wal-stream set")
|
||||
Expect(restore(walFile(4))).To(Succeed())
|
||||
Eventually(func(g Gomega) {
|
||||
g.Expect(existsIn(pgWalPath, walFile(4))).To(BeTrue(), "#4 in pg_wal")
|
||||
g.Expect(existsIn(spoolDirectory, walFile(5))).To(BeTrue(), "#5 in spool")
|
||||
g.Expect(flagSet()).To(BeTrue(), "end-of-wal-stream set (#6 absent)")
|
||||
}).WithTimeout(time.Minute).WithPolling(2 * time.Second).Should(Succeed())
|
||||
|
||||
By("forging WAL segment #6 on the object store")
|
||||
forge(latestWAL+".gz", walFile(6))
|
||||
|
||||
// #5: served from the spool; flag untouched (served before it is checked).
|
||||
By("requesting WAL #5: served from the spool, end-of-wal-stream still set")
|
||||
Expect(restore(walFile(5))).To(Succeed())
|
||||
Eventually(func(g Gomega) {
|
||||
g.Expect(existsIn(pgWalPath, walFile(5))).To(BeTrue(), "#5 in pg_wal")
|
||||
g.Expect(spoolSegments()).To(Equal(0), "no WAL segments in spool")
|
||||
g.Expect(flagSet()).To(BeTrue(), "end-of-wal-stream still set")
|
||||
}).WithTimeout(time.Minute).WithPolling(2 * time.Second).Should(Succeed())
|
||||
|
||||
// #6 (first): flag is set, so the request fails fast (exit 1) and the
|
||||
// flag is consumed, leaving an empty spool.
|
||||
By("requesting WAL #6: fails fast on the end-of-wal-stream flag, spool cleared")
|
||||
Expect(restore(walFile(6))).To(HaveOccurred(), "exit code should be 1")
|
||||
Eventually(func(g Gomega) {
|
||||
g.Expect(existsIn(pgWalPath, walFile(6))).To(BeFalse(), "#6 not restored")
|
||||
g.Expect(spoolSegments()).To(Equal(0), "no WAL segments in spool")
|
||||
g.Expect(flagSet()).To(BeFalse(), "end-of-wal-stream consumed")
|
||||
}).WithTimeout(time.Minute).WithPolling(2 * time.Second).Should(Succeed())
|
||||
|
||||
// #6 (second): now present, restored; #7 and #8 absent so the flag is
|
||||
// set again.
|
||||
By("requesting WAL #6 again: #6 restored, end-of-wal-stream set again")
|
||||
Expect(restore(walFile(6))).To(Succeed())
|
||||
Eventually(func(g Gomega) {
|
||||
g.Expect(existsIn(pgWalPath, walFile(6))).To(BeTrue(), "#6 in pg_wal")
|
||||
g.Expect(spoolSegments()).To(Equal(0), "no WAL segments in spool")
|
||||
g.Expect(flagSet()).To(BeTrue(), "end-of-wal-stream set (#7/#8 absent)")
|
||||
}).WithTimeout(time.Minute).WithPolling(2 * time.Second).Should(Succeed())
|
||||
})
|
||||
})
|
||||
408
web/yarn.lock
408
web/yarn.lock
@ -2,15 +2,15 @@
|
||||
# yarn lockfile v1
|
||||
|
||||
|
||||
"@algolia/abtesting@1.20.0":
|
||||
version "1.20.0"
|
||||
resolved "https://registry.yarnpkg.com/@algolia/abtesting/-/abtesting-1.20.0.tgz#0cbfa218156c1f522d49f2818c31447d356a1f19"
|
||||
integrity sha512-5CqkS592H3+24b6H6CQ2RVpphdmAuIElZzv0Hngqo/ZEZpUZJ+KGLcueBhx33fv2wYBXyuuvskG5aQ7Ti+lR0g==
|
||||
"@algolia/abtesting@1.21.0":
|
||||
version "1.21.0"
|
||||
resolved "https://registry.yarnpkg.com/@algolia/abtesting/-/abtesting-1.21.0.tgz#a156291a4b3f19516f79dc8c163a8f5a38b5e8ae"
|
||||
integrity sha512-kGvHfBa9oQCvZh0YXeguSToBD9GNJ+gzUZQ9KPTg+KSsM36obYcsKPoX0NnlJtPflHXu7RkMaIi44xs9meR6Zw==
|
||||
dependencies:
|
||||
"@algolia/client-common" "5.54.0"
|
||||
"@algolia/requester-browser-xhr" "5.54.0"
|
||||
"@algolia/requester-fetch" "5.54.0"
|
||||
"@algolia/requester-node-http" "5.54.0"
|
||||
"@algolia/client-common" "5.55.0"
|
||||
"@algolia/requester-browser-xhr" "5.55.0"
|
||||
"@algolia/requester-fetch" "5.55.0"
|
||||
"@algolia/requester-node-http" "5.55.0"
|
||||
|
||||
"@algolia/autocomplete-core@1.19.2":
|
||||
version "1.19.2"
|
||||
@ -52,126 +52,126 @@
|
||||
resolved "https://registry.yarnpkg.com/@algolia/autocomplete-shared/-/autocomplete-shared-1.19.8.tgz#5d723d8bdb448efbb1b0e1c7ff94cc18e5b1dc0e"
|
||||
integrity sha512-h5hf2t8ejF6vlOgvLaZzQbWs5SyH2z4PAWygNAvvD/2RI29hdQ54ldUGwqVuj9Srs+n8XUKTPUqb7fvhBhQrnQ==
|
||||
|
||||
"@algolia/client-abtesting@5.54.0":
|
||||
version "5.54.0"
|
||||
resolved "https://registry.yarnpkg.com/@algolia/client-abtesting/-/client-abtesting-5.54.0.tgz#d8e0f66dd4d33c38dd3536b9f309cf6bfa5da97e"
|
||||
integrity sha512-IXnH1x3DBsPQA4/FRO0Pvkfy79tKy5Qr+ugAV9jdcGkpzHc476D0WV1MFJ+pZxtbts0xh2JqzUVmYEqA6LkOpA==
|
||||
"@algolia/client-abtesting@5.55.0":
|
||||
version "5.55.0"
|
||||
resolved "https://registry.yarnpkg.com/@algolia/client-abtesting/-/client-abtesting-5.55.0.tgz#8bcfc18f7796790ec68ece4cc4a5a6b26b80ff1e"
|
||||
integrity sha512-Zt2GjIm7vsaf7K23tk5JmtcVNc38G9p0C2L2Lrm06miyLE/NL2etHtHInvuLc1DjxTp7Y2nId4X/tzwo372K8Q==
|
||||
dependencies:
|
||||
"@algolia/client-common" "5.54.0"
|
||||
"@algolia/requester-browser-xhr" "5.54.0"
|
||||
"@algolia/requester-fetch" "5.54.0"
|
||||
"@algolia/requester-node-http" "5.54.0"
|
||||
"@algolia/client-common" "5.55.0"
|
||||
"@algolia/requester-browser-xhr" "5.55.0"
|
||||
"@algolia/requester-fetch" "5.55.0"
|
||||
"@algolia/requester-node-http" "5.55.0"
|
||||
|
||||
"@algolia/client-analytics@5.54.0":
|
||||
version "5.54.0"
|
||||
resolved "https://registry.yarnpkg.com/@algolia/client-analytics/-/client-analytics-5.54.0.tgz#9da08afc41c17a683362a65e39df694186e16b79"
|
||||
integrity sha512-pBpRqm1wpE0GnGy2rNLk9rjDn0Le4iywNRtnAWblLeqfjxpWKg8lWnk7nmSoTShFO31sz2jatXXzxK2lz8ipbA==
|
||||
"@algolia/client-analytics@5.55.0":
|
||||
version "5.55.0"
|
||||
resolved "https://registry.yarnpkg.com/@algolia/client-analytics/-/client-analytics-5.55.0.tgz#895c0460b52d304cf5db2df8d0f78861d9a87dca"
|
||||
integrity sha512-7BueMuWYg/KBA2EX9zsQ+3OAleEyrJcB+SV5Al/9pLjMQq5mXB/8M5HaUPqZwN812g5kLzj9j43VThlZgWq0hg==
|
||||
dependencies:
|
||||
"@algolia/client-common" "5.54.0"
|
||||
"@algolia/requester-browser-xhr" "5.54.0"
|
||||
"@algolia/requester-fetch" "5.54.0"
|
||||
"@algolia/requester-node-http" "5.54.0"
|
||||
"@algolia/client-common" "5.55.0"
|
||||
"@algolia/requester-browser-xhr" "5.55.0"
|
||||
"@algolia/requester-fetch" "5.55.0"
|
||||
"@algolia/requester-node-http" "5.55.0"
|
||||
|
||||
"@algolia/client-common@5.54.0":
|
||||
version "5.54.0"
|
||||
resolved "https://registry.yarnpkg.com/@algolia/client-common/-/client-common-5.54.0.tgz#c9afb4677dc401d1e0fad6fc5c6c07ce5ef1fe0c"
|
||||
integrity sha512-WbuwRUlFvSOsuxqTDjSSmgusuF5KFt+oFPzobvPDvodra6EWnVwUXjz0elkNSsnsIlZGtcXlX3LhxkO7rF90jw==
|
||||
"@algolia/client-common@5.55.0":
|
||||
version "5.55.0"
|
||||
resolved "https://registry.yarnpkg.com/@algolia/client-common/-/client-common-5.55.0.tgz#5b4e1cea958da4ad0c91bc4d7858ea87998eb5bf"
|
||||
integrity sha512-pJZIyhvUrs+B7c5Lw0iP5yP/NsqJMda7pKRYbfG4KtfGIVSMcAalZhdqL5UX8Z9DOC4KxO9tKV5RDeVjZU0VfQ==
|
||||
|
||||
"@algolia/client-insights@5.54.0":
|
||||
version "5.54.0"
|
||||
resolved "https://registry.yarnpkg.com/@algolia/client-insights/-/client-insights-5.54.0.tgz#191f0086ad96e78cb2807cab293a3374e77e9123"
|
||||
integrity sha512-/HNLVi3kPI+JhO59WbglLjPM2c4uECU+x4gk1iADseKtE5eYqJ/RJ+FIwM8xzPFKhFJaw+8hVq4lkd0nn8HDDg==
|
||||
"@algolia/client-insights@5.55.0":
|
||||
version "5.55.0"
|
||||
resolved "https://registry.yarnpkg.com/@algolia/client-insights/-/client-insights-5.55.0.tgz#20a1c3cd34c44a5b7cf3f5734096b2bcb5fb877d"
|
||||
integrity sha512-RydkKDhx0GWTYuw0ndTXHGM8hD8hgwftKE65FfnJZb5bPc9CevOqv3qNPUQiviAwkqT9hQNH31uDGeV3yZkgfA==
|
||||
dependencies:
|
||||
"@algolia/client-common" "5.54.0"
|
||||
"@algolia/requester-browser-xhr" "5.54.0"
|
||||
"@algolia/requester-fetch" "5.54.0"
|
||||
"@algolia/requester-node-http" "5.54.0"
|
||||
"@algolia/client-common" "5.55.0"
|
||||
"@algolia/requester-browser-xhr" "5.55.0"
|
||||
"@algolia/requester-fetch" "5.55.0"
|
||||
"@algolia/requester-node-http" "5.55.0"
|
||||
|
||||
"@algolia/client-personalization@5.54.0":
|
||||
version "5.54.0"
|
||||
resolved "https://registry.yarnpkg.com/@algolia/client-personalization/-/client-personalization-5.54.0.tgz#92611c484655d8da5dc42d80c08e89636558c1c2"
|
||||
integrity sha512-6TolyyDRumIKeLGBGSFAZsSIJ8hrm6NFCGR1jO7pQTiOtSWgAIxcFE5/JRpZ3g+unG4OkNOFy+I0dUEquIDbig==
|
||||
"@algolia/client-personalization@5.55.0":
|
||||
version "5.55.0"
|
||||
resolved "https://registry.yarnpkg.com/@algolia/client-personalization/-/client-personalization-5.55.0.tgz#041ec1f2a43bb24860805d236afb9d06e2220fc1"
|
||||
integrity sha512-XiS7gdFq/COWiwdWXZ8+RHuewfEo03TkGESk44zU8zTc/Z6R8fm4DNmV52swJKkeB2N9iC7NKpgpM22OOkcgTw==
|
||||
dependencies:
|
||||
"@algolia/client-common" "5.54.0"
|
||||
"@algolia/requester-browser-xhr" "5.54.0"
|
||||
"@algolia/requester-fetch" "5.54.0"
|
||||
"@algolia/requester-node-http" "5.54.0"
|
||||
"@algolia/client-common" "5.55.0"
|
||||
"@algolia/requester-browser-xhr" "5.55.0"
|
||||
"@algolia/requester-fetch" "5.55.0"
|
||||
"@algolia/requester-node-http" "5.55.0"
|
||||
|
||||
"@algolia/client-query-suggestions@5.54.0":
|
||||
version "5.54.0"
|
||||
resolved "https://registry.yarnpkg.com/@algolia/client-query-suggestions/-/client-query-suggestions-5.54.0.tgz#f0870521076609f0dd57432b82bef19a7d036a43"
|
||||
integrity sha512-AxW2MLBhjBtGX5kIZrVLO2SP2vRkZxJw5qHGxnQJfLcYhA04mFNP0fWRtHshlcVnDk9M8L9lwfr2lGpf3Er+hw==
|
||||
"@algolia/client-query-suggestions@5.55.0":
|
||||
version "5.55.0"
|
||||
resolved "https://registry.yarnpkg.com/@algolia/client-query-suggestions/-/client-query-suggestions-5.55.0.tgz#94c57fbf92233f60bdade9a8a53a1976c031cb58"
|
||||
integrity sha512-LBEJ/q+hn1nJ0aYg5IcWgLNCPjWHTahWmpHNx1qUZMho+9CyWM6LaEnhac45UHjQm/j0m374HP685VrpL133lA==
|
||||
dependencies:
|
||||
"@algolia/client-common" "5.54.0"
|
||||
"@algolia/requester-browser-xhr" "5.54.0"
|
||||
"@algolia/requester-fetch" "5.54.0"
|
||||
"@algolia/requester-node-http" "5.54.0"
|
||||
"@algolia/client-common" "5.55.0"
|
||||
"@algolia/requester-browser-xhr" "5.55.0"
|
||||
"@algolia/requester-fetch" "5.55.0"
|
||||
"@algolia/requester-node-http" "5.55.0"
|
||||
|
||||
"@algolia/client-search@5.54.0":
|
||||
version "5.54.0"
|
||||
resolved "https://registry.yarnpkg.com/@algolia/client-search/-/client-search-5.54.0.tgz#ec49bbb4592e93a971af23f119e0244a123afc5d"
|
||||
integrity sha512-ngdgVGp05lJzUyA+sUzr0MDZ7AMtANcJpwIzq4ZsfpZL5B3S7A4XYfMcU2sECZc3bx3ysOhYcdbbaTjc3ve0WQ==
|
||||
"@algolia/client-search@5.55.0":
|
||||
version "5.55.0"
|
||||
resolved "https://registry.yarnpkg.com/@algolia/client-search/-/client-search-5.55.0.tgz#eace5977fa8a6ff3d1170ec387a363184d2165b0"
|
||||
integrity sha512-2/9jUXKH4IcdU5qxH6cbDH46ZBe46G7xr+MrcHwgEXZcUfdAvUgLSH53MAWuMgxvw0G5yoqiWMifHc62Os0fiQ==
|
||||
dependencies:
|
||||
"@algolia/client-common" "5.54.0"
|
||||
"@algolia/requester-browser-xhr" "5.54.0"
|
||||
"@algolia/requester-fetch" "5.54.0"
|
||||
"@algolia/requester-node-http" "5.54.0"
|
||||
"@algolia/client-common" "5.55.0"
|
||||
"@algolia/requester-browser-xhr" "5.55.0"
|
||||
"@algolia/requester-fetch" "5.55.0"
|
||||
"@algolia/requester-node-http" "5.55.0"
|
||||
|
||||
"@algolia/events@^4.0.1":
|
||||
version "4.0.1"
|
||||
resolved "https://registry.yarnpkg.com/@algolia/events/-/events-4.0.1.tgz#fd39e7477e7bc703d7f893b556f676c032af3950"
|
||||
integrity sha512-FQzvOCgoFXAbf5Y6mYozw2aj5KCJoA3m4heImceldzPSMbdyS4atVjJzXKMsfX3wnZTFYwkkt8/z8UesLHlSBQ==
|
||||
|
||||
"@algolia/ingestion@1.54.0":
|
||||
version "1.54.0"
|
||||
resolved "https://registry.yarnpkg.com/@algolia/ingestion/-/ingestion-1.54.0.tgz#2fd01d4f4c4dbc90a987325302fc997c2beabb48"
|
||||
integrity sha512-hee59Z7FgZ6/13FYL05ANPwRJY1pfvIlrwC8eBZYdiRFXTJVvf94IyTWOxLqRVpbseDP6eQQTW+PT7/DxTZIng==
|
||||
"@algolia/ingestion@1.55.0":
|
||||
version "1.55.0"
|
||||
resolved "https://registry.yarnpkg.com/@algolia/ingestion/-/ingestion-1.55.0.tgz#ad2ba098363d8d3849991f0d5e50a65bd091a193"
|
||||
integrity sha512-80tKsQgxXWo+jK0v4YGCHqyTEXawhAKYyr3kOdN51ElfRqUFjZNPVhZk6vRiqSqXfvrH85ytacT3cbJR6+qolA==
|
||||
dependencies:
|
||||
"@algolia/client-common" "5.54.0"
|
||||
"@algolia/requester-browser-xhr" "5.54.0"
|
||||
"@algolia/requester-fetch" "5.54.0"
|
||||
"@algolia/requester-node-http" "5.54.0"
|
||||
"@algolia/client-common" "5.55.0"
|
||||
"@algolia/requester-browser-xhr" "5.55.0"
|
||||
"@algolia/requester-fetch" "5.55.0"
|
||||
"@algolia/requester-node-http" "5.55.0"
|
||||
|
||||
"@algolia/monitoring@1.54.0":
|
||||
version "1.54.0"
|
||||
resolved "https://registry.yarnpkg.com/@algolia/monitoring/-/monitoring-1.54.0.tgz#05e6019095cb8eb3ef43c9328992ad90a33c9a92"
|
||||
integrity sha512-diCjZVbIO7Pzw98tEKqLWIAgmQBI3Zt1sHsXyAPNGZgn32derpIXTnjjpJbZl+uAhSSznd6SfxFGdC9uYdN1TA==
|
||||
"@algolia/monitoring@1.55.0":
|
||||
version "1.55.0"
|
||||
resolved "https://registry.yarnpkg.com/@algolia/monitoring/-/monitoring-1.55.0.tgz#4a4935c61b11c4e0319569e355c585d4c1ed3262"
|
||||
integrity sha512-4UjmAL8ywGW4rCfK6Qmgw3wIjbrO2wl2s4Eq56JTiN40L2t0XTv0HZkYAmr6nfeiXO0he/2crvZRX6SATSepag==
|
||||
dependencies:
|
||||
"@algolia/client-common" "5.54.0"
|
||||
"@algolia/requester-browser-xhr" "5.54.0"
|
||||
"@algolia/requester-fetch" "5.54.0"
|
||||
"@algolia/requester-node-http" "5.54.0"
|
||||
"@algolia/client-common" "5.55.0"
|
||||
"@algolia/requester-browser-xhr" "5.55.0"
|
||||
"@algolia/requester-fetch" "5.55.0"
|
||||
"@algolia/requester-node-http" "5.55.0"
|
||||
|
||||
"@algolia/recommend@5.54.0":
|
||||
version "5.54.0"
|
||||
resolved "https://registry.yarnpkg.com/@algolia/recommend/-/recommend-5.54.0.tgz#5320031101788363852e5c74bd36b74a3efea1d6"
|
||||
integrity sha512-6zeslypRAGWDgVJEJYAPuqmyquHvnw4MQwG+XXdrw5dTNDjXYIcCJdQQcCY06xPF9tUvmzy/1vHiH9QxhgwuOQ==
|
||||
"@algolia/recommend@5.55.0":
|
||||
version "5.55.0"
|
||||
resolved "https://registry.yarnpkg.com/@algolia/recommend/-/recommend-5.55.0.tgz#d89fbb2148731dafcb7f458cd334dc18465bb9ed"
|
||||
integrity sha512-LMpJPtIkfDsHIx5Ga+baNr22ntYbY+e2wT7MSIc/FjAnu9wnBFhx1H/GfhmP/c5/IvbThDX+3ilxPRjSfCI8aA==
|
||||
dependencies:
|
||||
"@algolia/client-common" "5.54.0"
|
||||
"@algolia/requester-browser-xhr" "5.54.0"
|
||||
"@algolia/requester-fetch" "5.54.0"
|
||||
"@algolia/requester-node-http" "5.54.0"
|
||||
"@algolia/client-common" "5.55.0"
|
||||
"@algolia/requester-browser-xhr" "5.55.0"
|
||||
"@algolia/requester-fetch" "5.55.0"
|
||||
"@algolia/requester-node-http" "5.55.0"
|
||||
|
||||
"@algolia/requester-browser-xhr@5.54.0":
|
||||
version "5.54.0"
|
||||
resolved "https://registry.yarnpkg.com/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.54.0.tgz#90326acee59cf7eb002f3c959932f0f565e01e4b"
|
||||
integrity sha512-iHZax214LPXd7XizQ4BNnTsegl8f3IeKm8JcrmSNZ/5x1rZ5xLkbG/anltAWtLpoRNnfpr4Z80YdYeVVPpx6wQ==
|
||||
"@algolia/requester-browser-xhr@5.55.0":
|
||||
version "5.55.0"
|
||||
resolved "https://registry.yarnpkg.com/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.55.0.tgz#5b05c8a993b1c8052ec656005a1989515bcdb2ea"
|
||||
integrity sha512-tDymJ7nFOAoUuecma3usK6o94dp8m4HYFDGh4ByYQXWkv14cpmDn+nWdylmcZO0Qvco107vqDo4+Anksnl8w1Q==
|
||||
dependencies:
|
||||
"@algolia/client-common" "5.54.0"
|
||||
"@algolia/client-common" "5.55.0"
|
||||
|
||||
"@algolia/requester-fetch@5.54.0":
|
||||
version "5.54.0"
|
||||
resolved "https://registry.yarnpkg.com/@algolia/requester-fetch/-/requester-fetch-5.54.0.tgz#cb08734a88394d8c5c80973f33cfb076557c1c68"
|
||||
integrity sha512-YKtuG5YwPxZ+kkfd4HmUO7Z9aICPUSMlHslzKTmtMMhxGnetxEqGj9T/v2r/PdcuOUC5oW0CHe8akJk8cpS3gQ==
|
||||
"@algolia/requester-fetch@5.55.0":
|
||||
version "5.55.0"
|
||||
resolved "https://registry.yarnpkg.com/@algolia/requester-fetch/-/requester-fetch-5.55.0.tgz#4b9aefcc31debd8c58429dab70a95d49b923eeea"
|
||||
integrity sha512-6IDSB5o5dkDPQ4LdOW0Yuw/qy5MdWlO2xDHgPVZgW4YDjbxvnX5PAiV7/WWZdWyVObScZZnnHpPbiqfYs/zBLg==
|
||||
dependencies:
|
||||
"@algolia/client-common" "5.54.0"
|
||||
"@algolia/client-common" "5.55.0"
|
||||
|
||||
"@algolia/requester-node-http@5.54.0":
|
||||
version "5.54.0"
|
||||
resolved "https://registry.yarnpkg.com/@algolia/requester-node-http/-/requester-node-http-5.54.0.tgz#2d32cc6cfa5972653e6b3cb942c804d38d2a83ac"
|
||||
integrity sha512-zyZDJ4WS5TnjZZ5pqywTBFO9olW7QMtY2kf2dbLnu+UTzfc9ri/HGf27jRN2NTbX9FcRPxSqPqzUhF/BZIx0VA==
|
||||
"@algolia/requester-node-http@5.55.0":
|
||||
version "5.55.0"
|
||||
resolved "https://registry.yarnpkg.com/@algolia/requester-node-http/-/requester-node-http-5.55.0.tgz#d62bf8a3b4f053e1b0df3f0e409b4aca330ac4fc"
|
||||
integrity sha512-Yyyne4l//vDSdg4MhYJkaVne+KEPi833eCj3/T/87ernTwrvP6j9biXXZELsN8sLI/f2ndV/vugDIy2jdJQB6g==
|
||||
dependencies:
|
||||
"@algolia/client-common" "5.54.0"
|
||||
"@algolia/client-common" "5.55.0"
|
||||
|
||||
"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.29.7":
|
||||
version "7.29.7"
|
||||
@ -2132,74 +2132,74 @@
|
||||
resolved "https://registry.yarnpkg.com/@jsonjoy.com/codegen/-/codegen-1.0.0.tgz#5c23f796c47675f166d23b948cdb889184b93207"
|
||||
integrity sha512-E8Oy+08cmCf0EK/NMxpaJZmOxPqM+6iSe2S4nlSBrPZOORoDJILxtbSUEDKQyTamm/BVAhIGllOBNU79/dwf0g==
|
||||
|
||||
"@jsonjoy.com/fs-core@4.57.7":
|
||||
version "4.57.7"
|
||||
resolved "https://registry.yarnpkg.com/@jsonjoy.com/fs-core/-/fs-core-4.57.7.tgz#5d4bfbc95147407c8265d4bb67605c0c18c762a1"
|
||||
integrity sha512-GDKuYHjP7vAI1kjBo73V+STKr9XIMZknW/xirpRW/EcShX0IKSev/ALafeRfC8Q331nodrXUFu04PugPB0MAhw==
|
||||
"@jsonjoy.com/fs-core@4.57.8":
|
||||
version "4.57.8"
|
||||
resolved "https://registry.yarnpkg.com/@jsonjoy.com/fs-core/-/fs-core-4.57.8.tgz#3e399ca856968194b0be73aa4b6fc943bf313bb8"
|
||||
integrity sha512-YzVbwggV9452VCeHgo0bjsTaUt1O7JE0XpEsPar93nn/+RAwXk0mb1Y+f5EDJ3TRtRCFe+Ck5RuojdfB4jeHVw==
|
||||
dependencies:
|
||||
"@jsonjoy.com/fs-node-builtins" "4.57.7"
|
||||
"@jsonjoy.com/fs-node-utils" "4.57.7"
|
||||
"@jsonjoy.com/fs-node-builtins" "4.57.8"
|
||||
"@jsonjoy.com/fs-node-utils" "4.57.8"
|
||||
thingies "^2.5.0"
|
||||
|
||||
"@jsonjoy.com/fs-fsa@4.57.7":
|
||||
version "4.57.7"
|
||||
resolved "https://registry.yarnpkg.com/@jsonjoy.com/fs-fsa/-/fs-fsa-4.57.7.tgz#2c09a99ea9af292af7447c9eb78537763bf85433"
|
||||
integrity sha512-1rWsah2nZtRbNeP+c61QcfGfVrJXBmBD0Hm7Akvv4C9MKEasXnbiOS//iH3T3HwUSSBATGrfSp0Xi8nlNhATeQ==
|
||||
"@jsonjoy.com/fs-fsa@4.57.8":
|
||||
version "4.57.8"
|
||||
resolved "https://registry.yarnpkg.com/@jsonjoy.com/fs-fsa/-/fs-fsa-4.57.8.tgz#26a1688ff5c8d1189d32e76bfe2364e0763b6737"
|
||||
integrity sha512-vmClyvCQMxgqz7uamDiGtRfp4MjzOznk3pcQjCxlIwJcw7TWeyr+bF30hI0x8NxdtNOGMg1pHM74VDIXOeyjuw==
|
||||
dependencies:
|
||||
"@jsonjoy.com/fs-core" "4.57.7"
|
||||
"@jsonjoy.com/fs-node-builtins" "4.57.7"
|
||||
"@jsonjoy.com/fs-node-utils" "4.57.7"
|
||||
"@jsonjoy.com/fs-core" "4.57.8"
|
||||
"@jsonjoy.com/fs-node-builtins" "4.57.8"
|
||||
"@jsonjoy.com/fs-node-utils" "4.57.8"
|
||||
thingies "^2.5.0"
|
||||
|
||||
"@jsonjoy.com/fs-node-builtins@4.57.7":
|
||||
version "4.57.7"
|
||||
resolved "https://registry.yarnpkg.com/@jsonjoy.com/fs-node-builtins/-/fs-node-builtins-4.57.7.tgz#cc0fd121f58705878ce9b3f372fc00bd7d897ce3"
|
||||
integrity sha512-LWqfY1m+uAosjwM1RrKhMkUnP9jcq1RUczHsNO779ovm1E9v8I/pmj04eBAcoBjhC7ltcPbNFGyRJ5JqSJ7Jdg==
|
||||
"@jsonjoy.com/fs-node-builtins@4.57.8":
|
||||
version "4.57.8"
|
||||
resolved "https://registry.yarnpkg.com/@jsonjoy.com/fs-node-builtins/-/fs-node-builtins-4.57.8.tgz#ba350bf262571e38d3c195f5346eddec07c1d053"
|
||||
integrity sha512-mxXSXw8zZwRVakcjLqR2I/psy4gURFSASZS10kKJ2kJw05GC2nXGroGrWVHxwgkxXgQLsFQnB74QaLzsxzdL/w==
|
||||
|
||||
"@jsonjoy.com/fs-node-to-fsa@4.57.7":
|
||||
version "4.57.7"
|
||||
resolved "https://registry.yarnpkg.com/@jsonjoy.com/fs-node-to-fsa/-/fs-node-to-fsa-4.57.7.tgz#2c4b1807bd1a7be599536d47fedf802706b6b366"
|
||||
integrity sha512-9T0zC9LKcAWXDoTLRdLMoJ0seOvJ5bgDKq1tSBoQAFQpPDstQUeV1Oe7PLypdu7F2D3ddRstmwgeNUEN/VaZ4Q==
|
||||
"@jsonjoy.com/fs-node-to-fsa@4.57.8":
|
||||
version "4.57.8"
|
||||
resolved "https://registry.yarnpkg.com/@jsonjoy.com/fs-node-to-fsa/-/fs-node-to-fsa-4.57.8.tgz#4372e75e7a6a76b4d8ac91dc2d93edfa8587599f"
|
||||
integrity sha512-AWZcT/4+H+iDl4XCukbXrarvwEgOrf/prFI5/7eg4ix9FxqVsZysIDJd1Kjd+AjlCeHKHJOaRqjLd5HiGSCJEw==
|
||||
dependencies:
|
||||
"@jsonjoy.com/fs-fsa" "4.57.7"
|
||||
"@jsonjoy.com/fs-node-builtins" "4.57.7"
|
||||
"@jsonjoy.com/fs-node-utils" "4.57.7"
|
||||
"@jsonjoy.com/fs-fsa" "4.57.8"
|
||||
"@jsonjoy.com/fs-node-builtins" "4.57.8"
|
||||
"@jsonjoy.com/fs-node-utils" "4.57.8"
|
||||
|
||||
"@jsonjoy.com/fs-node-utils@4.57.7":
|
||||
version "4.57.7"
|
||||
resolved "https://registry.yarnpkg.com/@jsonjoy.com/fs-node-utils/-/fs-node-utils-4.57.7.tgz#51308c4bdfc717ccbb155759fe7df9c91afec099"
|
||||
integrity sha512-jjWSDOsfcog2cZnUCwX5AHmlIq6b6wx5Pz/2LAcNjJ62Rajwg89Fy7ubN+lDHew0/1reLDa9Z5urybYadhh37g==
|
||||
"@jsonjoy.com/fs-node-utils@4.57.8":
|
||||
version "4.57.8"
|
||||
resolved "https://registry.yarnpkg.com/@jsonjoy.com/fs-node-utils/-/fs-node-utils-4.57.8.tgz#a1a15d587fff235b616d5ea775e0f9a88f387a56"
|
||||
integrity sha512-E/bJ7sQAb4pu9nbeJhbULU3WnqWrswte4N9Js/oHt7aHB746S8/XBqKlcbrqIgnD3095XluovNEZuu5ONT230g==
|
||||
dependencies:
|
||||
"@jsonjoy.com/fs-node-builtins" "4.57.7"
|
||||
"@jsonjoy.com/fs-node-builtins" "4.57.8"
|
||||
|
||||
"@jsonjoy.com/fs-node@4.57.7":
|
||||
version "4.57.7"
|
||||
resolved "https://registry.yarnpkg.com/@jsonjoy.com/fs-node/-/fs-node-4.57.7.tgz#3d62f93af1ccdffd39d439154f36155d7e3eb5c6"
|
||||
integrity sha512-xhnyeyEVTiIOibFvda/5n89nChMLCPKHHM2WQ+GGDf6+U/IrQBW3Qx6x+Uq1bkDbxBkybLOdIGoBtVBrE8Nngg==
|
||||
"@jsonjoy.com/fs-node@4.57.8":
|
||||
version "4.57.8"
|
||||
resolved "https://registry.yarnpkg.com/@jsonjoy.com/fs-node/-/fs-node-4.57.8.tgz#d16b418d2179f7092f9fe5daeb18d31a5835a19b"
|
||||
integrity sha512-IPEOlDYSnTDYpjQlQg2F8h+eqxKQN3sdbroI0WrteRiQZ462HzVpBo9ZZX485njz4nAacoe3fd4iDiIhk+k5Hg==
|
||||
dependencies:
|
||||
"@jsonjoy.com/fs-core" "4.57.7"
|
||||
"@jsonjoy.com/fs-node-builtins" "4.57.7"
|
||||
"@jsonjoy.com/fs-node-utils" "4.57.7"
|
||||
"@jsonjoy.com/fs-print" "4.57.7"
|
||||
"@jsonjoy.com/fs-snapshot" "4.57.7"
|
||||
"@jsonjoy.com/fs-core" "4.57.8"
|
||||
"@jsonjoy.com/fs-node-builtins" "4.57.8"
|
||||
"@jsonjoy.com/fs-node-utils" "4.57.8"
|
||||
"@jsonjoy.com/fs-print" "4.57.8"
|
||||
"@jsonjoy.com/fs-snapshot" "4.57.8"
|
||||
glob-to-regex.js "^1.0.0"
|
||||
thingies "^2.5.0"
|
||||
|
||||
"@jsonjoy.com/fs-print@4.57.7":
|
||||
version "4.57.7"
|
||||
resolved "https://registry.yarnpkg.com/@jsonjoy.com/fs-print/-/fs-print-4.57.7.tgz#aec8e3f5d66cd64e90e1fc9913a5fa4811d824b1"
|
||||
integrity sha512-mFM4P4Gjq0QQHkLnXzPYPEMFrAoe6a5Myedgb6+CmL+nGd3MKvTxYPuD7N1dLIH9RBy1fLdzxd80qvuK8xrx3Q==
|
||||
"@jsonjoy.com/fs-print@4.57.8":
|
||||
version "4.57.8"
|
||||
resolved "https://registry.yarnpkg.com/@jsonjoy.com/fs-print/-/fs-print-4.57.8.tgz#5ff6b2e0dd3f85aa7563f66cd36b4de1f0ce89a3"
|
||||
integrity sha512-DfzhOBpmvNu5P/KSe4NNQaOnvNliTdcf0qrh/4EReErF/XUQXYkd0vZl/OiJCm/qjEEo8DWRstliw2/JNS84dA==
|
||||
dependencies:
|
||||
"@jsonjoy.com/fs-node-utils" "4.57.7"
|
||||
"@jsonjoy.com/fs-node-utils" "4.57.8"
|
||||
tree-dump "^1.1.0"
|
||||
|
||||
"@jsonjoy.com/fs-snapshot@4.57.7":
|
||||
version "4.57.7"
|
||||
resolved "https://registry.yarnpkg.com/@jsonjoy.com/fs-snapshot/-/fs-snapshot-4.57.7.tgz#370cf405bac358a4ff426d848b733df9ec5149d2"
|
||||
integrity sha512-1GS3+plfm2giB3PqokiqyydyqYTPLcCQIKSkp0TdMNRh3KVk7rqRM6U785FLlVRG7XLmkc0KWr215OY+22K3QA==
|
||||
"@jsonjoy.com/fs-snapshot@4.57.8":
|
||||
version "4.57.8"
|
||||
resolved "https://registry.yarnpkg.com/@jsonjoy.com/fs-snapshot/-/fs-snapshot-4.57.8.tgz#65b317f7698816c7196dbebc73e9d43e06f143be"
|
||||
integrity sha512-L+eqKaWOHLDaiMv1dh/EWQ4hA+o6xAhWSumTo3Teg7OM18jU/KE13/e8Mfal+eAZ/pSl4wIhKHcDiwapJzC8Wg==
|
||||
dependencies:
|
||||
"@jsonjoy.com/buffers" "^17.65.0"
|
||||
"@jsonjoy.com/fs-node-utils" "4.57.7"
|
||||
"@jsonjoy.com/fs-node-utils" "4.57.8"
|
||||
"@jsonjoy.com/json-pack" "^17.65.0"
|
||||
"@jsonjoy.com/util" "^17.65.0"
|
||||
|
||||
@ -2923,11 +2923,11 @@
|
||||
integrity sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==
|
||||
|
||||
"@types/node@*":
|
||||
version "25.9.3"
|
||||
resolved "https://registry.yarnpkg.com/@types/node/-/node-25.9.3.tgz#11dfe7a33e68fa5c560f0aa76cc5595621ef26b9"
|
||||
integrity sha512-603BddQMv3pUcr4U2dhujk83N2tTDVr/34wII2B6bJy6g+8WD6yUb11jszNs0gdi4PesVWl7ABt8nYMVpnLUcg==
|
||||
version "26.0.0"
|
||||
resolved "https://registry.yarnpkg.com/@types/node/-/node-26.0.0.tgz#d4aece9e9412e9f2008d59bc2d74f5279316b665"
|
||||
integrity sha512-vf2YFi1iY9lHGwNJMs01biZFbKJkrZR1T6/MlzjhJLPdntOHLhTrDSnSVcdtvjihi4VQNlrFRIxLsDBlQpAipA==
|
||||
dependencies:
|
||||
undici-types ">=7.24.0 <7.24.7"
|
||||
undici-types "~8.3.0"
|
||||
|
||||
"@types/node@^17.0.5":
|
||||
version "17.0.45"
|
||||
@ -3295,24 +3295,24 @@ algoliasearch-helper@^3.26.0:
|
||||
"@algolia/events" "^4.0.1"
|
||||
|
||||
algoliasearch@^5.37.0:
|
||||
version "5.54.0"
|
||||
resolved "https://registry.yarnpkg.com/algoliasearch/-/algoliasearch-5.54.0.tgz#49a65f246f85cf351c22fdff294a41c2afa44a80"
|
||||
integrity sha512-APAX4ajIOgsmYoUlGe++oNZkSTBgmXYM4maHC0OxC+Yo7xkaKQElV0ATZYCZA7jzrSJX1OBiqEs7mk+ZxXgYqA==
|
||||
version "5.55.0"
|
||||
resolved "https://registry.yarnpkg.com/algoliasearch/-/algoliasearch-5.55.0.tgz#ed56f8f10ad42e056761b1200b867ada2f5c5db4"
|
||||
integrity sha512-af+rI+tUVeS9KWHPAZQHIHPOIC3StPRR6IwQu2nz1aQoTL6Gs5Ty3KsHCgbXMHOpoh9QqSjq8F3KJ8xmaCZSBA==
|
||||
dependencies:
|
||||
"@algolia/abtesting" "1.20.0"
|
||||
"@algolia/client-abtesting" "5.54.0"
|
||||
"@algolia/client-analytics" "5.54.0"
|
||||
"@algolia/client-common" "5.54.0"
|
||||
"@algolia/client-insights" "5.54.0"
|
||||
"@algolia/client-personalization" "5.54.0"
|
||||
"@algolia/client-query-suggestions" "5.54.0"
|
||||
"@algolia/client-search" "5.54.0"
|
||||
"@algolia/ingestion" "1.54.0"
|
||||
"@algolia/monitoring" "1.54.0"
|
||||
"@algolia/recommend" "5.54.0"
|
||||
"@algolia/requester-browser-xhr" "5.54.0"
|
||||
"@algolia/requester-fetch" "5.54.0"
|
||||
"@algolia/requester-node-http" "5.54.0"
|
||||
"@algolia/abtesting" "1.21.0"
|
||||
"@algolia/client-abtesting" "5.55.0"
|
||||
"@algolia/client-analytics" "5.55.0"
|
||||
"@algolia/client-common" "5.55.0"
|
||||
"@algolia/client-insights" "5.55.0"
|
||||
"@algolia/client-personalization" "5.55.0"
|
||||
"@algolia/client-query-suggestions" "5.55.0"
|
||||
"@algolia/client-search" "5.55.0"
|
||||
"@algolia/ingestion" "1.55.0"
|
||||
"@algolia/monitoring" "1.55.0"
|
||||
"@algolia/recommend" "5.55.0"
|
||||
"@algolia/requester-browser-xhr" "5.55.0"
|
||||
"@algolia/requester-fetch" "5.55.0"
|
||||
"@algolia/requester-node-http" "5.55.0"
|
||||
|
||||
ansi-align@^3.0.1:
|
||||
version "3.0.1"
|
||||
@ -3471,9 +3471,9 @@ balanced-match@^1.0.0:
|
||||
integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==
|
||||
|
||||
baseline-browser-mapping@^2.10.12:
|
||||
version "2.10.37"
|
||||
resolved "https://registry.yarnpkg.com/baseline-browser-mapping/-/baseline-browser-mapping-2.10.37.tgz#3e636475b6b293244e2b23e2c71a2ab9d9e6ba7d"
|
||||
integrity sha512-girxaJ7WZssDOFhzCGZTDKoTa1gk6A1TbflaYTpykLJ4UU9Fz9kx1aREM8JCuoVHbL8X8T/mJg7w2oYSq72Oig==
|
||||
version "2.10.38"
|
||||
resolved "https://registry.yarnpkg.com/baseline-browser-mapping/-/baseline-browser-mapping-2.10.38.tgz#c84d093c4bf7325c5053c279d90f153c66526042"
|
||||
integrity sha512-31/02mVB4yuQU6adKk5SlY6m+mxDwUq5KZkyYgnLrrKl7TEm1+3PyDtDBz2kOv/wxZz41GHsvV1A/u6RmiyBvw==
|
||||
|
||||
batch@0.6.1:
|
||||
version "0.6.1"
|
||||
@ -4476,9 +4476,9 @@ ee-first@1.1.1:
|
||||
integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==
|
||||
|
||||
electron-to-chromium@^1.5.328:
|
||||
version "1.5.372"
|
||||
resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.372.tgz#ae8ac69942a37b231773b8fb01759f73733599e3"
|
||||
integrity sha512-M3yhbAlilnwqC8D21t28UCDGHyitShTmmLRU/H+b74P6Ski16Nb9HONYEaVpMj/pwC7BEo5B95FpjODLCWbtfA==
|
||||
version "1.5.376"
|
||||
resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.376.tgz#16a9d4b72cb16c416aa73a879d92b047b96797ac"
|
||||
integrity sha512-cUVA7/RvbFTEuw/i3obUwDTRIXojaxkResf+ibByPFxjc6XK3VNtcQXV0NSbAlJ0FMjcJGgftVVB4Qo184EXvA==
|
||||
|
||||
emoji-regex@^8.0.0:
|
||||
version "8.0.0"
|
||||
@ -5418,9 +5418,9 @@ http-parser-js@>=0.5.1:
|
||||
integrity sha512-Pysuw9XpUq5dVc/2SMHpuTY01RFl8fttgcyunjL7eEMhGM3cI4eOmiCycJDVCo/7O7ClfQD3SaI6ftDzqOXYMA==
|
||||
|
||||
http-proxy-middleware@^2.0.9:
|
||||
version "2.0.9"
|
||||
resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-2.0.9.tgz#e9e63d68afaa4eee3d147f39149ab84c0c2815ef"
|
||||
integrity sha512-c1IyJYLYppU574+YI7R4QyX2ystMtVXZwIdzazUIPIJsHuWNd+mho2j+bKoHftndicGj9yh+xjd+l0yj7VeT1Q==
|
||||
version "2.0.10"
|
||||
resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-2.0.10.tgz#b2df7b705203d7a8c269ac8450cf96b00c532f94"
|
||||
integrity sha512-RKzRWNPxUZqbuk3BC5mGVJbBnWgr+diEnjJexIOytFbBzDy88Fbh/YvBr3DsNrl1jYAfjWfpATEv0NO35FDuPQ==
|
||||
dependencies:
|
||||
"@types/http-proxy" "^1.17.8"
|
||||
http-proxy "^1.18.1"
|
||||
@ -6247,18 +6247,18 @@ media-typer@0.3.0:
|
||||
integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==
|
||||
|
||||
memfs@^4.43.1:
|
||||
version "4.57.7"
|
||||
resolved "https://registry.yarnpkg.com/memfs/-/memfs-4.57.7.tgz#bad8bc1680d8b5349da6575b095779956f6b89b0"
|
||||
integrity sha512-YZPphUQZSRGk6ddPlsNuMbztrLwsbUATFNZcqKscSbSJZ4g0+Y3vSZLJ/rfnGZaB1FFhC7SrywZXev6i8lnHgg==
|
||||
version "4.57.8"
|
||||
resolved "https://registry.yarnpkg.com/memfs/-/memfs-4.57.8.tgz#b9c1995040307c60a1503e65a3e5902ad3927628"
|
||||
integrity sha512-bApYhn8BLpFAnAQmFfEl/NPN+8qx5Ar3V4Qt3ek23mVwBEElzV7c6XoPkb/PCG8ZFpowCEpHcPwMFTwHS7tSMA==
|
||||
dependencies:
|
||||
"@jsonjoy.com/fs-core" "4.57.7"
|
||||
"@jsonjoy.com/fs-fsa" "4.57.7"
|
||||
"@jsonjoy.com/fs-node" "4.57.7"
|
||||
"@jsonjoy.com/fs-node-builtins" "4.57.7"
|
||||
"@jsonjoy.com/fs-node-to-fsa" "4.57.7"
|
||||
"@jsonjoy.com/fs-node-utils" "4.57.7"
|
||||
"@jsonjoy.com/fs-print" "4.57.7"
|
||||
"@jsonjoy.com/fs-snapshot" "4.57.7"
|
||||
"@jsonjoy.com/fs-core" "4.57.8"
|
||||
"@jsonjoy.com/fs-fsa" "4.57.8"
|
||||
"@jsonjoy.com/fs-node" "4.57.8"
|
||||
"@jsonjoy.com/fs-node-builtins" "4.57.8"
|
||||
"@jsonjoy.com/fs-node-to-fsa" "4.57.8"
|
||||
"@jsonjoy.com/fs-node-utils" "4.57.8"
|
||||
"@jsonjoy.com/fs-print" "4.57.8"
|
||||
"@jsonjoy.com/fs-snapshot" "4.57.8"
|
||||
"@jsonjoy.com/json-pack" "^1.11.0"
|
||||
"@jsonjoy.com/util" "^1.9.0"
|
||||
glob-to-regex.js "^1.0.1"
|
||||
@ -6815,9 +6815,9 @@ multicast-dns@^7.2.5:
|
||||
thunky "^1.0.2"
|
||||
|
||||
nanoid@^3.3.12:
|
||||
version "3.3.12"
|
||||
resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.12.tgz#ab3d912e217a6d0a514f00a72a16543a28982c05"
|
||||
integrity sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==
|
||||
version "3.3.15"
|
||||
resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.15.tgz#36c490fad8c6e86c824c940dfdde999b69ed4316"
|
||||
integrity sha512-y7Wygv/7mEOvxTuEQDB8StXdMRBWf1kR/tlhAzBRUFkB2jfcLOAxO/SHmOO2zgz1pVgK29/kyupn059/bCHdjA==
|
||||
|
||||
negotiator@0.6.3:
|
||||
version "0.6.3"
|
||||
@ -6853,9 +6853,9 @@ node-emoji@^2.1.0:
|
||||
skin-tone "^2.0.0"
|
||||
|
||||
node-releases@^2.0.36:
|
||||
version "2.0.47"
|
||||
resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.47.tgz#521bb2786da8eb140b748841c0b3b3a75334ffc4"
|
||||
integrity sha512-Uzmd6LXpouKo8EUK68IjH4+E01w/hXyV3R3g/geCJo+rXLNfh1xucB+LOzYEOQPSiUK3h/xZf0cQGcSsmyL2Og==
|
||||
version "2.0.48"
|
||||
resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.48.tgz#4da73d040ada751fc9959d993f27de48792e3b7d"
|
||||
integrity sha512-1uz8041X6LoI6ZSdZacM9lVY28vuzDlSKitnpbSNK0RfKoIJkX29NBPVEFXhnuSuEOA9Ww0xnPJ+ILWbGAv8DA==
|
||||
|
||||
normalize-path@^3.0.0, normalize-path@~3.0.0:
|
||||
version "3.0.0"
|
||||
@ -8372,9 +8372,9 @@ semver@^6.3.1:
|
||||
integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==
|
||||
|
||||
semver@^7.3.5, semver@^7.3.7, semver@^7.5.4:
|
||||
version "7.8.4"
|
||||
resolved "https://registry.yarnpkg.com/semver/-/semver-7.8.4.tgz#c73eceebae0616934be8dff28a7fd70757c8e696"
|
||||
integrity sha512-rUCObTnP32Q08R2uuIrt7r9PlEonuTmtuXYcW6s5kjdlj3xbnwe+21yXptAUYcMAABLkYYTtnmzb3w3EDZfueA==
|
||||
version "7.8.5"
|
||||
resolved "https://registry.yarnpkg.com/semver/-/semver-7.8.5.tgz#39b646037dd50c14fb451e7e4cac58ed8b863f69"
|
||||
integrity sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==
|
||||
|
||||
send@~0.19.0, send@~0.19.1:
|
||||
version "0.19.2"
|
||||
@ -8937,15 +8937,15 @@ typescript@~6.0.0:
|
||||
resolved "https://registry.yarnpkg.com/typescript/-/typescript-6.0.3.tgz#90251dc007916e972786cb94d74d15b185577d21"
|
||||
integrity sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==
|
||||
|
||||
"undici-types@>=7.24.0 <7.24.7":
|
||||
version "7.24.6"
|
||||
resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-7.24.6.tgz#61275b485d7fd4e9d269c7cf04ec2873c9cc0f91"
|
||||
integrity sha512-WRNW+sJgj5OBN4/0JpHFqtqzhpbnV0GuB+OozA9gCL7a993SmU+1JBZCzLNxYsbMfIeDL+lTsphD5jN5N+n0zg==
|
||||
undici-types@~8.3.0:
|
||||
version "8.3.0"
|
||||
resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-8.3.0.tgz#44e9fc9f3244648cdea35e4f9bb2d681e9410809"
|
||||
integrity sha512-j375ScV60dom+YkPFIfTLcOiPxkN/buHz5GobjLhixFuANaNs3C9l4GmrWqejgXWJ7BbJcFYpTEUkS1Ge8bpZQ==
|
||||
|
||||
undici@^7.19.0:
|
||||
version "7.27.2"
|
||||
resolved "https://registry.yarnpkg.com/undici/-/undici-7.27.2.tgz#f8fae968ee68377cfc61713d9cd152773716804f"
|
||||
integrity sha512-uZsKNuzQxDMUY6M3pIMvy5tvlGmtq8XJ2oLAkfRKGNu+1VQAIvLy2xIVG5ATZl5wDXl/tddByAWCizRbOme+TA==
|
||||
version "7.28.0"
|
||||
resolved "https://registry.yarnpkg.com/undici/-/undici-7.28.0.tgz#97d64564198b285bc281f0e8e29597e3d11fe7ec"
|
||||
integrity sha512-cRZYrTDwWznlnRiPjggAGxZXanty6M8RV1ff8Wm4LWXBp7/IG8v5DnOm74DtUBp9OONpK75YlPnIjQqX0dBDtA==
|
||||
|
||||
unicode-canonical-property-names-ecmascript@^2.0.0:
|
||||
version "2.0.1"
|
||||
|
||||
Loading…
Reference in New Issue
Block a user