From 3104f50c5897db754026eeb99c84c66299e546b7 Mon Sep 17 00:00:00 2001 From: Peter Kurfer Date: Mon, 20 Jan 2025 17:06:41 +0100 Subject: [PATCH] refactor: implement control plane as controller-runtime manager --- .golangci.yml | 7 + PROJECT | 9 + api/v1alpha1/apigateway_types.go | 19 +- api/v1alpha1/storage_types.go | 64 + api/v1alpha1/zz_generated.deepcopy.go | 136 +- cmd/control_plane.go | 166 +- cmd/manager.go | 25 +- .../supabase.k8s.icb4dc0.de_apigateways.yaml | 88 +- .../supabase.k8s.icb4dc0.de_storages.yaml | 54 + config/crd/kustomization.yaml | 1 + config/rbac/control-plane-role.yaml | 17 + config/rbac/kustomization.yaml | 7 + config/rbac/leader_election_role_binding.yaml | 3 + config/rbac/role.yaml | 3 + config/rbac/storage_admin_role.yaml | 27 + config/rbac/storage_editor_role.yaml | 33 + config/rbac/storage_viewer_role.yaml | 29 + config/samples/kustomization.yaml | 1 + config/samples/supabase_v1alpha1_storage.yaml | 9 + hack/boilerplate.go.txt | 4 +- hack/header.tmpl | 13 + internal/controller/apigateway_controller.go | 2 +- internal/controller/core_db_controller.go | 2 +- internal/controller/core_gotrue_controller.go | 4 +- .../controller/core_postgrest_controller.go | 4 +- .../dashboard_pg-meta_controller.go | 4 +- .../controller/dashboard_studio_controller.go | 4 +- internal/controller/pwgen.go | 16 + internal/controller/storage_controller.go | 63 + .../controller/storage_controller_test.go | 84 + .../controlplane/apigateway_controller.go | 197 ++ internal/controlplane/endpoints.go | 37 +- .../{controller.go => snapshot.go} | 202 +- internal/meta/labels.go | 8 +- .../dotnet-client/supabase-integration.sln | 27 + .../supabase-integration.sln.DotSettings.user | 6 + .../ServiceKeyTest.cs | 27 + .../SupabaseClientFixture.cs | 22 + ...CoreApp,Version=v9.0.AssemblyAttributes.cs | 4 + .../Debug/net9.0/AutoRegisteredExtensions.cs | 16 + .../Debug/net9.0/TestPlatformEntryPoint.cs | 19 + .../obj/Debug/net9.0/apphost | Bin 0 -> 124960 bytes .../ref/supabase-integration.api-test.dll | Bin 0 -> 9728 bytes .../refint/supabase-integration.api-test.dll | Bin 0 -> 9728 bytes ...abase-integration.api-test.AssemblyInfo.cs | 23 + ...egration.api-test.AssemblyInfoInputs.cache | 1 + ....GeneratedMSBuildEditorConfig.editorconfig | 15 + ...ase-integration.api-test.GlobalUsings.g.cs | 12 + ...supabase-integration.api-test.assets.cache | Bin 0 -> 47515 bytes ...on.api-test.csproj.AssemblyReference.cache | Bin 0 -> 16293 bytes ...on.api-test.csproj.CoreCompileInputs.cache | 1 + ...ation.api-test.csproj.FileListAbsolute.txt | 73 + .../net9.0/supabase-integration.api-test.dll | Bin 0 -> 18432 bytes ...enautoregisteredextensionsinputcache.cache | 1 + ...ntegration.api-test.genruntimeconfig.cache | 1 + ...ntestingplatformentrypointinputcache.cache | 1 + .../net9.0/supabase-integration.api-test.pdb | Bin 0 -> 16264 bytes .../Debug/net9.0/supabase.88E5058B.Up2Date | 0 .../obj/project.assets.json | 2176 +++++++++++++++++ .../obj/project.nuget.cache | 47 + .../obj/project.packagespec.json | 1 + .../obj/rider.project.model.nuget.info | 1 + .../obj/rider.project.restore.info | 1 + ...egration.api-test.csproj.nuget.dgspec.json | 81 + ...-integration.api-test.csproj.nuget.g.props | 23 + ...ntegration.api-test.csproj.nuget.g.targets | 11 + .../supabase-integration.api-test.csproj | 22 + 67 files changed, 3693 insertions(+), 261 deletions(-) create mode 100644 api/v1alpha1/storage_types.go create mode 100644 config/crd/bases/supabase.k8s.icb4dc0.de_storages.yaml create mode 100644 config/rbac/storage_admin_role.yaml create mode 100644 config/rbac/storage_editor_role.yaml create mode 100644 config/rbac/storage_viewer_role.yaml create mode 100644 config/samples/supabase_v1alpha1_storage.yaml create mode 100644 hack/header.tmpl create mode 100644 internal/controller/storage_controller.go create mode 100644 internal/controller/storage_controller_test.go create mode 100644 internal/controlplane/apigateway_controller.go rename internal/controlplane/{controller.go => snapshot.go} (54%) create mode 100644 testdata/dotnet-client/supabase-integration.sln create mode 100644 testdata/dotnet-client/supabase-integration.sln.DotSettings.user create mode 100644 testdata/dotnet-client/test/supabase-integration.api-test/ServiceKeyTest.cs create mode 100644 testdata/dotnet-client/test/supabase-integration.api-test/SupabaseClientFixture.cs create mode 100644 testdata/dotnet-client/test/supabase-integration.api-test/obj/Debug/net9.0/.NETCoreApp,Version=v9.0.AssemblyAttributes.cs create mode 100644 testdata/dotnet-client/test/supabase-integration.api-test/obj/Debug/net9.0/AutoRegisteredExtensions.cs create mode 100644 testdata/dotnet-client/test/supabase-integration.api-test/obj/Debug/net9.0/TestPlatformEntryPoint.cs create mode 100755 testdata/dotnet-client/test/supabase-integration.api-test/obj/Debug/net9.0/apphost create mode 100644 testdata/dotnet-client/test/supabase-integration.api-test/obj/Debug/net9.0/ref/supabase-integration.api-test.dll create mode 100644 testdata/dotnet-client/test/supabase-integration.api-test/obj/Debug/net9.0/refint/supabase-integration.api-test.dll create mode 100644 testdata/dotnet-client/test/supabase-integration.api-test/obj/Debug/net9.0/supabase-integration.api-test.AssemblyInfo.cs create mode 100644 testdata/dotnet-client/test/supabase-integration.api-test/obj/Debug/net9.0/supabase-integration.api-test.AssemblyInfoInputs.cache create mode 100644 testdata/dotnet-client/test/supabase-integration.api-test/obj/Debug/net9.0/supabase-integration.api-test.GeneratedMSBuildEditorConfig.editorconfig create mode 100644 testdata/dotnet-client/test/supabase-integration.api-test/obj/Debug/net9.0/supabase-integration.api-test.GlobalUsings.g.cs create mode 100644 testdata/dotnet-client/test/supabase-integration.api-test/obj/Debug/net9.0/supabase-integration.api-test.assets.cache create mode 100644 testdata/dotnet-client/test/supabase-integration.api-test/obj/Debug/net9.0/supabase-integration.api-test.csproj.AssemblyReference.cache create mode 100644 testdata/dotnet-client/test/supabase-integration.api-test/obj/Debug/net9.0/supabase-integration.api-test.csproj.CoreCompileInputs.cache create mode 100644 testdata/dotnet-client/test/supabase-integration.api-test/obj/Debug/net9.0/supabase-integration.api-test.csproj.FileListAbsolute.txt create mode 100644 testdata/dotnet-client/test/supabase-integration.api-test/obj/Debug/net9.0/supabase-integration.api-test.dll create mode 100644 testdata/dotnet-client/test/supabase-integration.api-test/obj/Debug/net9.0/supabase-integration.api-test.genautoregisteredextensionsinputcache.cache create mode 100644 testdata/dotnet-client/test/supabase-integration.api-test/obj/Debug/net9.0/supabase-integration.api-test.genruntimeconfig.cache create mode 100644 testdata/dotnet-client/test/supabase-integration.api-test/obj/Debug/net9.0/supabase-integration.api-test.gentestingplatformentrypointinputcache.cache create mode 100644 testdata/dotnet-client/test/supabase-integration.api-test/obj/Debug/net9.0/supabase-integration.api-test.pdb create mode 100644 testdata/dotnet-client/test/supabase-integration.api-test/obj/Debug/net9.0/supabase.88E5058B.Up2Date create mode 100644 testdata/dotnet-client/test/supabase-integration.api-test/obj/project.assets.json create mode 100644 testdata/dotnet-client/test/supabase-integration.api-test/obj/project.nuget.cache create mode 100644 testdata/dotnet-client/test/supabase-integration.api-test/obj/project.packagespec.json create mode 100644 testdata/dotnet-client/test/supabase-integration.api-test/obj/rider.project.model.nuget.info create mode 100644 testdata/dotnet-client/test/supabase-integration.api-test/obj/rider.project.restore.info create mode 100644 testdata/dotnet-client/test/supabase-integration.api-test/obj/supabase-integration.api-test.csproj.nuget.dgspec.json create mode 100644 testdata/dotnet-client/test/supabase-integration.api-test/obj/supabase-integration.api-test.csproj.nuget.g.props create mode 100644 testdata/dotnet-client/test/supabase-integration.api-test/obj/supabase-integration.api-test.csproj.nuget.g.targets create mode 100644 testdata/dotnet-client/test/supabase-integration.api-test/supabase-integration.api-test.csproj diff --git a/.golangci.yml b/.golangci.yml index 64275d2..9305561 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -27,6 +27,7 @@ linters: - gocyclo - gofmt - goimports + - goheader - gosimple - godox - govet @@ -56,6 +57,12 @@ linters-settings: - dot goimports: local-prefixes: code.icb4dc0.de/prskr/supabase-operator + goheader: + values: + const: + AUTHOR: Peter Kurfer + template-path: hack/header.tmpl + importas: no-unaliased: true no-extra-aliases: true diff --git a/PROJECT b/PROJECT index 732e315..49a57b9 100644 --- a/PROJECT +++ b/PROJECT @@ -47,4 +47,13 @@ resources: defaulting: true validation: true webhookVersion: v1 +- api: + crdVersion: v1 + namespaced: true + controller: true + domain: k8s.icb4dc0.de + group: supabase + kind: Storage + path: code.icb4dc0.de/prskr/supabase-operator/api/v1alpha1 + version: v1alpha1 version: "3" diff --git a/api/v1alpha1/apigateway_types.go b/api/v1alpha1/apigateway_types.go index 782679a..e246c33 100644 --- a/api/v1alpha1/apigateway_types.go +++ b/api/v1alpha1/apigateway_types.go @@ -1,5 +1,5 @@ /* -Copyright 2024 Peter Kurfer. +Copyright 2025 Peter Kurfer. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -54,15 +54,30 @@ type APIGatewaySpec struct { Envoy *EnvoySpec `json:"envoy"` // JWKSSelector - selector where the JWKS can be retrieved from to enable the API gateway to validate JWTs JWKSSelector *corev1.SecretKeySelector `json:"jwks"` + // ServiceSelector - selector to match all Supabase services (or in fact EndpointSlices) that should be considered for this APIGateway + // +kubebuilder:default={"matchExpressions":{{"key": "app.kubernetes.io/part-of", "operator":"In", "values":{"supabase"}},{"key":"supabase.k8s.icb4dc0.de/api-gateway-target","operator":"Exists"}}} + ServiceSelector *metav1.LabelSelector `json:"serviceSelector"` + // ComponentTypeLabel - Label to identify which Supabase component a Service represents (e.g. auth, postgrest, ...) + // +kubebuilder:default="app.kubernetes.io/name" + ComponentTypeLabel string `json:"componentTypeLabel,omitempty"` +} + +type EnvoyStatus struct { + ConfigVersion string `json:"configVersion,omitempty"` + ResourceHash []byte `json:"resourceHash,omitempty"` } // APIGatewayStatus defines the observed state of APIGateway. -type APIGatewayStatus struct{} +type APIGatewayStatus struct { + Envoy EnvoyStatus `json:"envoy,omitempty"` + ServiceTargets map[string][]string `json:"serviceTargets,omitempty"` +} // +kubebuilder:object:root=true // +kubebuilder:subresource:status // APIGateway is the Schema for the apigateways API. +// +kubebuilder:printcolumn:name="EnvoyConfigVersion",type=string,JSONPath=`.status.envoy.configVersion` type APIGateway struct { metav1.TypeMeta `json:",inline"` metav1.ObjectMeta `json:"metadata,omitempty"` diff --git a/api/v1alpha1/storage_types.go b/api/v1alpha1/storage_types.go new file mode 100644 index 0000000..3b6d376 --- /dev/null +++ b/api/v1alpha1/storage_types.go @@ -0,0 +1,64 @@ +/* +Copyright 2025 Peter Kurfer. + +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. +*/ + +package v1alpha1 + +import ( + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +// EDIT THIS FILE! THIS IS SCAFFOLDING FOR YOU TO OWN! +// NOTE: json tags are required. Any new fields you add must have json tags for the fields to be serialized. + +// StorageSpec defines the desired state of Storage. +type StorageSpec struct { + // INSERT ADDITIONAL SPEC FIELDS - desired state of cluster + // Important: Run "make" to regenerate code after modifying this file + + // Foo is an example field of Storage. Edit storage_types.go to remove/update + Foo string `json:"foo,omitempty"` +} + +// StorageStatus defines the observed state of Storage. +type StorageStatus struct { + // INSERT ADDITIONAL STATUS FIELD - define observed state of cluster + // Important: Run "make" to regenerate code after modifying this file +} + +// +kubebuilder:object:root=true +// +kubebuilder:subresource:status + +// Storage is the Schema for the storages API. +type Storage struct { + metav1.TypeMeta `json:",inline"` + metav1.ObjectMeta `json:"metadata,omitempty"` + + Spec StorageSpec `json:"spec,omitempty"` + Status StorageStatus `json:"status,omitempty"` +} + +// +kubebuilder:object:root=true + +// StorageList contains a list of Storage. +type StorageList struct { + metav1.TypeMeta `json:",inline"` + metav1.ListMeta `json:"metadata,omitempty"` + Items []Storage `json:"items"` +} + +func init() { + SchemeBuilder.Register(&Storage{}, &StorageList{}) +} diff --git a/api/v1alpha1/zz_generated.deepcopy.go b/api/v1alpha1/zz_generated.deepcopy.go index 5fe7d9b..cd86b06 100644 --- a/api/v1alpha1/zz_generated.deepcopy.go +++ b/api/v1alpha1/zz_generated.deepcopy.go @@ -1,7 +1,7 @@ //go:build !ignore_autogenerated /* -Copyright 2024 Peter Kurfer. +Copyright 2025 Peter Kurfer. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -22,6 +22,7 @@ package v1alpha1 import ( v1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" runtime "k8s.io/apimachinery/pkg/runtime" ) @@ -31,7 +32,7 @@ func (in *APIGateway) DeepCopyInto(out *APIGateway) { out.TypeMeta = in.TypeMeta in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) in.Spec.DeepCopyInto(&out.Spec) - out.Status = in.Status + in.Status.DeepCopyInto(&out.Status) } // DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new APIGateway. @@ -97,6 +98,11 @@ func (in *APIGatewaySpec) DeepCopyInto(out *APIGatewaySpec) { *out = new(v1.SecretKeySelector) (*in).DeepCopyInto(*out) } + if in.ServiceSelector != nil { + in, out := &in.ServiceSelector, &out.ServiceSelector + *out = new(metav1.LabelSelector) + (*in).DeepCopyInto(*out) + } } // DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new APIGatewaySpec. @@ -112,6 +118,23 @@ func (in *APIGatewaySpec) DeepCopy() *APIGatewaySpec { // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *APIGatewayStatus) DeepCopyInto(out *APIGatewayStatus) { *out = *in + in.Envoy.DeepCopyInto(&out.Envoy) + if in.ServiceTargets != nil { + in, out := &in.ServiceTargets, &out.ServiceTargets + *out = make(map[string][]string, len(*in)) + for key, val := range *in { + var outVal []string + if val == nil { + (*out)[key] = nil + } else { + inVal := (*in)[key] + in, out := &inVal, &outVal + *out = make([]string, len(*in)) + copy(*out, *in) + } + (*out)[key] = outVal + } + } } // DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new APIGatewayStatus. @@ -764,6 +787,26 @@ func (in *EnvoySpec) DeepCopy() *EnvoySpec { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *EnvoyStatus) DeepCopyInto(out *EnvoyStatus) { + *out = *in + if in.ResourceHash != nil { + in, out := &in.ResourceHash, &out.ResourceHash + *out = make([]byte, len(*in)) + copy(*out, *in) + } +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new EnvoyStatus. +func (in *EnvoyStatus) DeepCopy() *EnvoyStatus { + if in == nil { + return nil + } + out := new(EnvoyStatus) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *GithubAuthProvider) DeepCopyInto(out *GithubAuthProvider) { *out = *in @@ -903,6 +946,95 @@ func (in *PostgrestSpec) DeepCopy() *PostgrestSpec { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *Storage) DeepCopyInto(out *Storage) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) + out.Spec = in.Spec + out.Status = in.Status +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Storage. +func (in *Storage) DeepCopy() *Storage { + if in == nil { + return nil + } + out := new(Storage) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *Storage) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *StorageList) DeepCopyInto(out *StorageList) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ListMeta.DeepCopyInto(&out.ListMeta) + if in.Items != nil { + in, out := &in.Items, &out.Items + *out = make([]Storage, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new StorageList. +func (in *StorageList) DeepCopy() *StorageList { + if in == nil { + return nil + } + out := new(StorageList) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *StorageList) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *StorageSpec) DeepCopyInto(out *StorageSpec) { + *out = *in +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new StorageSpec. +func (in *StorageSpec) DeepCopy() *StorageSpec { + if in == nil { + return nil + } + out := new(StorageSpec) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *StorageStatus) DeepCopyInto(out *StorageStatus) { + *out = *in +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new StorageStatus. +func (in *StorageStatus) DeepCopy() *StorageStatus { + if in == nil { + return nil + } + out := new(StorageStatus) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *StudioSpec) DeepCopyInto(out *StudioSpec) { *out = *in diff --git a/cmd/control_plane.go b/cmd/control_plane.go index 1adfd0f..aada234 100644 --- a/cmd/control_plane.go +++ b/cmd/control_plane.go @@ -1,5 +1,5 @@ /* -Copyright 2024 Peter Kurfer. +Copyright 2025 Peter Kurfer. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -18,12 +18,11 @@ package main import ( "context" - "errors" + "crypto/tls" "fmt" "net" "time" - "github.com/alecthomas/kong" clusterservice "github.com/envoyproxy/go-control-plane/envoy/service/cluster/v3" discoverygrpc "github.com/envoyproxy/go-control-plane/envoy/service/discovery/v3" endpointservice "github.com/envoyproxy/go-control-plane/envoy/service/endpoint/v3" @@ -31,7 +30,7 @@ import ( routeservice "github.com/envoyproxy/go-control-plane/envoy/service/route/v3" runtimeservice "github.com/envoyproxy/go-control-plane/envoy/service/runtime/v3" secretservice "github.com/envoyproxy/go-control-plane/envoy/service/secret/v3" - "github.com/envoyproxy/go-control-plane/pkg/cache/v3" + cachev3 "github.com/envoyproxy/go-control-plane/pkg/cache/v3" "github.com/envoyproxy/go-control-plane/pkg/server/v3" "google.golang.org/grpc" grpchealth "google.golang.org/grpc/health" @@ -39,16 +38,103 @@ import ( "google.golang.org/grpc/keepalive" "google.golang.org/grpc/reflection" ctrl "sigs.k8s.io/controller-runtime" - "sigs.k8s.io/controller-runtime/pkg/client" + mgr "sigs.k8s.io/controller-runtime/pkg/manager" + "sigs.k8s.io/controller-runtime/pkg/metrics/filters" + metricsserver "sigs.k8s.io/controller-runtime/pkg/metrics/server" "code.icb4dc0.de/prskr/supabase-operator/internal/controlplane" ) +//nolint:lll // flag declaration with struct tags is as long as it is type controlPlane struct { - ListenAddr string `name:"listen-address" default:":18000" help:"The address the control plane binds to."` + ListenAddr string `name:"listen-address" default:":18000" help:"The address the control plane binds to."` + MetricsAddr string `name:"metrics-bind-address" default:"0" help:"The address the metrics endpoint binds to. Use :8443 for HTTPS or :8080 for HTTP, or leave as 0 to disable the metrics service."` + EnableLeaderElection bool `name:"leader-elect" default:"false" help:"Enable leader election for controller manager. Enabling this will ensure there is only one active controller manager."` + ProbeAddr string `name:"health-probe-bind-address" default:":8081" help:"The address the probe endpoint binds to."` + SecureMetrics bool `name:"metrics-secure" default:"true" help:"If set, the metrics endpoint is served securely via HTTPS. Use --metrics-secure=false to use HTTP instead."` + EnableHTTP2 bool `name:"enable-http2" default:"false" help:"If set, HTTP/2 will be enabled for the metrics and webhook servers"` } -func (p controlPlane) Run(ctx context.Context, cache cache.SnapshotCache) (err error) { +func (cp controlPlane) Run(ctx context.Context) error { + var tlsOpts []func(*tls.Config) + + // if the enable-http2 flag is false (the default), http/2 should be disabled + // due to its vulnerabilities. More specifically, disabling http/2 will + // prevent from being vulnerable to the HTTP/2 Stream Cancellation and + // Rapid Reset CVEs. For more information see: + // - https://github.com/advisories/GHSA-qppj-fm5r-hxr3 + // - https://github.com/advisories/GHSA-4374-p667-p6c8 + disableHTTP2 := func(c *tls.Config) { + setupLog.Info("disabling http/2") + c.NextProtos = []string{"http/1.1"} + } + + if !cp.EnableHTTP2 { + tlsOpts = append(tlsOpts, disableHTTP2) + } + + // Metrics endpoint is enabled in 'config/default/kustomization.yaml'. The Metrics options configure the server. + // More info: + // - https://pkg.go.dev/sigs.k8s.io/controller-runtime@v0.19.1/pkg/metrics/server + // - https://book.kubebuilder.io/reference/metrics.html + metricsServerOptions := metricsserver.Options{ + BindAddress: cp.MetricsAddr, + SecureServing: cp.SecureMetrics, + TLSOpts: tlsOpts, + } + + if cp.SecureMetrics { + // FilterProvider is used to protect the metrics endpoint with authn/authz. + // These configurations ensure that only authorized users and service accounts + // can access the metrics endpoint. The RBAC are configured in 'config/rbac/kustomization.yaml'. More info: + // https://pkg.go.dev/sigs.k8s.io/controller-runtime@v0.19.1/pkg/metrics/filters#WithAuthenticationAndAuthorization + metricsServerOptions.FilterProvider = filters.WithAuthenticationAndAuthorization + } + + mgr, err := ctrl.NewManager(ctrl.GetConfigOrDie(), ctrl.Options{ + Scheme: scheme, + Metrics: metricsServerOptions, + HealthProbeBindAddress: cp.ProbeAddr, + LeaderElection: cp.EnableLeaderElection, + BaseContext: func() context.Context { return ctx }, + LeaderElectionID: "30f6fafb.k8s.icb4dc0.de", + LeaderElectionReleaseOnCancel: true, + }) + if err != nil { + return fmt.Errorf("unable to start control plane: %w", err) + } + + envoySnapshotCache := cachev3.NewSnapshotCache(false, cachev3.IDHash{}, nil) + + envoySrv, err := cp.envoyServer(ctx, envoySnapshotCache) + if err != nil { + return err + } + + if err := mgr.Add(envoySrv); err != nil { + return fmt.Errorf("failed to add enovy server to manager: %w", err) + } + + if err = (&controlplane.APIGatewayReconciler{ + Client: mgr.GetClient(), + Scheme: mgr.GetScheme(), + Cache: envoySnapshotCache, + }).SetupWithManager(mgr); err != nil { + return fmt.Errorf("unable to create controller Core DB: %w", err) + } + + setupLog.Info("starting manager") + if err := mgr.Start(ctx); err != nil { + return fmt.Errorf("problem running manager: %w", err) + } + + return nil +} + +func (cp controlPlane) envoyServer( + ctx context.Context, + cache cachev3.SnapshotCache, +) (runnable mgr.Runnable, err error) { const ( grpcKeepaliveTime = 30 * time.Second grpcKeepaliveTimeout = 5 * time.Second @@ -56,19 +142,10 @@ func (p controlPlane) Run(ctx context.Context, cache cache.SnapshotCache) (err e grpcMaxConcurrentStreams = 1000000 ) - logger := ctrl.Log.WithName("control-plane") - - clientOpts := client.Options{ - Scheme: scheme, - } - - logger.Info("Creating client") - watcherClient, err := client.NewWithWatch(ctrl.GetConfigOrDie(), clientOpts) - if err != nil { - return err - } - - srv := server.NewServer(ctx, cache, nil) + var ( + logger = ctrl.Log.WithName("control-plane") + srv = server.NewServer(ctx, cache, nil) + ) // gRPC golang library sets a very small upper bound for the number gRPC/h2 // streams over a single TCP connection. If a proxy multiplexes requests over @@ -89,13 +166,14 @@ func (p controlPlane) Run(ctx context.Context, cache cache.SnapshotCache) (err e ) grpcServer := grpc.NewServer(grpcOptions...) - logger.Info("Opening listener", "addr", p.ListenAddr) - lis, err := net.Listen("tcp", p.ListenAddr) + logger.Info("Opening listener", "addr", cp.ListenAddr) + lis, err := net.Listen("tcp", cp.ListenAddr) if err != nil { - return fmt.Errorf("opening listener: %w", err) + return nil, fmt.Errorf("opening listener: %w", err) } logger.Info("Preparing health endpoints") + healthService := grpchealth.NewServer() healthService.SetServingStatus("", grpc_health_v1.HealthCheckResponse_SERVING) @@ -109,39 +187,11 @@ func (p controlPlane) Run(ctx context.Context, cache cache.SnapshotCache) (err e runtimeservice.RegisterRuntimeDiscoveryServiceServer(grpcServer, srv) grpc_health_v1.RegisterHealthServer(grpcServer, healthService) - // discoverygrpc.AggregatedDiscoveryService_ServiceDesc.ServiceName - - endpointsController := controlplane.EndpointsController{ - Client: watcherClient, - Cache: cache, - } - - errOut := make(chan error) - - go func(errOut chan<- error) { - logger.Info("Starting gRPC server") - errOut <- grpcServer.Serve(lis) - }(errOut) - - go func(errOut chan<- error) { - logger.Info("Staring endpoints controller") - errOut <- endpointsController.Run(ctx) - }(errOut) - - go func(errOut chan error) { - for out := range errOut { - err = errors.Join(err, out) - } - }(errOut) - - <-ctx.Done() - grpcServer.Stop() - - return err -} - -//nolint:unparam // signature required by kong -func (p controlPlane) AfterApply(kongctx *kong.Context) error { - kongctx.BindTo(cache.NewSnapshotCache(false, cache.IDHash{}, nil), (*cache.SnapshotCache)(nil)) - return nil + return mgr.RunnableFunc(func(ctx context.Context) error { + go func(ctx context.Context) { + <-ctx.Done() + grpcServer.GracefulStop() + }(ctx) + return grpcServer.Serve(lis) + }), nil } diff --git a/cmd/manager.go b/cmd/manager.go index fab0eec..8b96828 100644 --- a/cmd/manager.go +++ b/cmd/manager.go @@ -87,23 +87,14 @@ func (m manager) Run(ctx context.Context) error { } mgr, err := ctrl.NewManager(ctrl.GetConfigOrDie(), ctrl.Options{ - Scheme: scheme, - Metrics: metricsServerOptions, - WebhookServer: webhookServer, - HealthProbeBindAddress: m.ProbeAddr, - LeaderElection: m.EnableLeaderElection, - LeaderElectionID: "05f9463f.k8s.icb4dc0.de", - // LeaderElectionReleaseOnCancel defines if the leader should step down voluntarily - // when the Manager ends. This requires the binary to immediately end when the - // Manager is stopped, otherwise, this setting is unsafe. Setting this significantly - // speeds up voluntary leader transitions as the new leader don't have to wait - // LeaseDuration time first. - // - // In the default scaffold provided, the program ends immediately after - // the manager stops, so would be fine to enable this option. However, - // if you are doing or is intended to do any operation such as perform cleanups - // after the manager stops then its usage might be unsafe. - // LeaderElectionReleaseOnCancel: true, + Scheme: scheme, + Metrics: metricsServerOptions, + WebhookServer: webhookServer, + HealthProbeBindAddress: m.ProbeAddr, + LeaderElection: m.EnableLeaderElection, + BaseContext: func() context.Context { return ctx }, + LeaderElectionID: "05f9463f.k8s.icb4dc0.de", + LeaderElectionReleaseOnCancel: true, }) if err != nil { return fmt.Errorf("unable to start manager: %w", err) diff --git a/config/crd/bases/supabase.k8s.icb4dc0.de_apigateways.yaml b/config/crd/bases/supabase.k8s.icb4dc0.de_apigateways.yaml index 36709d4..939e2cf 100644 --- a/config/crd/bases/supabase.k8s.icb4dc0.de_apigateways.yaml +++ b/config/crd/bases/supabase.k8s.icb4dc0.de_apigateways.yaml @@ -14,7 +14,11 @@ spec: singular: apigateway scope: Namespaced versions: - - name: v1alpha1 + - additionalPrinterColumns: + - jsonPath: .status.envoy.configVersion + name: EnvoyConfigVersion + type: string + name: v1alpha1 schema: openAPIV3Schema: description: APIGateway is the Schema for the apigateways API. @@ -39,6 +43,11 @@ spec: spec: description: APIGatewaySpec defines the desired state of APIGateway. properties: + componentTypeLabel: + default: app.kubernetes.io/name + description: ComponentTypeLabel - Label to identify which Supabase + component a Service represents (e.g. auth, postgrest, ...) + type: string envoy: description: Envoy - configure the envoy instance and most importantly the control-plane @@ -61,6 +70,12 @@ spec: - host - port type: object + nodeName: + description: |- + NodeName - identifies the Envoy cluster within the current namespace + if not set, the name of the APIGateway resource will be used + The primary use case is to make the assignment of multiple supabase instances in a single namespace explicit. + type: string workloadTemplate: description: WorkloadTemplate - customize the Envoy deployment properties: @@ -776,12 +791,83 @@ spec: - key type: object x-kubernetes-map-type: atomic + serviceSelector: + default: + matchExpressions: + - key: app.kubernetes.io/part-of + operator: In + values: + - supabase + - key: supabase.k8s.icb4dc0.de/api-gateway-target + operator: Exists + description: ServiceSelector - selector to match all Supabase services + (or in fact EndpointSlices) that should be considered for this APIGateway + properties: + matchExpressions: + description: matchExpressions is a list of label selector requirements. + The requirements are ANDed. + items: + description: |- + A label selector requirement is a selector that contains values, a key, and an operator that + relates the key and values. + properties: + key: + description: key is the label key that the selector applies + to. + type: string + operator: + description: |- + operator represents a key's relationship to a set of values. + Valid operators are In, NotIn, Exists and DoesNotExist. + type: string + values: + description: |- + values is an array of string values. If the operator is In or NotIn, + the values array must be non-empty. If the operator is Exists or DoesNotExist, + the values array must be empty. This array is replaced during a strategic + merge patch. + items: + type: string + type: array + x-kubernetes-list-type: atomic + required: + - key + - operator + type: object + type: array + x-kubernetes-list-type: atomic + matchLabels: + additionalProperties: + type: string + description: |- + matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels + map is equivalent to an element of matchExpressions, whose key field is "key", the + operator is "In", and the values array contains only "value". The requirements are ANDed. + type: object + type: object + x-kubernetes-map-type: atomic required: - envoy - jwks + - serviceSelector type: object status: description: APIGatewayStatus defines the observed state of APIGateway. + properties: + envoy: + properties: + configVersion: + type: string + resourceHash: + format: byte + type: string + type: object + serviceTargets: + additionalProperties: + items: + type: string + type: array + type: object type: object type: object served: true diff --git a/config/crd/bases/supabase.k8s.icb4dc0.de_storages.yaml b/config/crd/bases/supabase.k8s.icb4dc0.de_storages.yaml new file mode 100644 index 0000000..7d0791f --- /dev/null +++ b/config/crd/bases/supabase.k8s.icb4dc0.de_storages.yaml @@ -0,0 +1,54 @@ +--- +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.16.5 + name: storages.supabase.k8s.icb4dc0.de +spec: + group: supabase.k8s.icb4dc0.de + names: + kind: Storage + listKind: StorageList + plural: storages + singular: storage + scope: Namespaced + versions: + - name: v1alpha1 + schema: + openAPIV3Schema: + description: Storage is the Schema for the storages API. + properties: + apiVersion: + description: |- + APIVersion defines the versioned schema of this representation of an object. + Servers should convert recognized schemas to the latest internal value, and + may reject unrecognized values. + More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources + type: string + kind: + description: |- + Kind is a string value representing the REST resource this object represents. + Servers may infer this from the endpoint the client submits requests to. + Cannot be updated. + In CamelCase. + More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds + type: string + metadata: + type: object + spec: + description: StorageSpec defines the desired state of Storage. + properties: + foo: + description: Foo is an example field of Storage. Edit storage_types.go + to remove/update + type: string + type: object + status: + description: StorageStatus defines the observed state of Storage. + type: object + type: object + served: true + storage: true + subresources: + status: {} diff --git a/config/crd/kustomization.yaml b/config/crd/kustomization.yaml index cc2769b..fa629d2 100644 --- a/config/crd/kustomization.yaml +++ b/config/crd/kustomization.yaml @@ -5,6 +5,7 @@ resources: - bases/supabase.k8s.icb4dc0.de_cores.yaml - bases/supabase.k8s.icb4dc0.de_apigateways.yaml - bases/supabase.k8s.icb4dc0.de_dashboards.yaml + - bases/supabase.k8s.icb4dc0.de_storages.yaml # +kubebuilder:scaffold:crdkustomizeresource patches: diff --git a/config/rbac/control-plane-role.yaml b/config/rbac/control-plane-role.yaml index e85f47b..9bccf5c 100644 --- a/config/rbac/control-plane-role.yaml +++ b/config/rbac/control-plane-role.yaml @@ -4,6 +4,23 @@ kind: ClusterRole metadata: name: control-plane-role rules: + - apiGroups: + - supabase.k8s.icb4dc0.de + resources: + - apigateways + verbs: + - get + - list + - watch + - apiGroups: + - supabase.k8s.icb4dc0.de + resources: + - apigateways/status + verbs: + - get + - patch + - update + - apiGroups: - discovery.k8s.io resources: diff --git a/config/rbac/kustomization.yaml b/config/rbac/kustomization.yaml index 37a83d4..76bbd52 100644 --- a/config/rbac/kustomization.yaml +++ b/config/rbac/kustomization.yaml @@ -36,3 +36,10 @@ resources: # if you do not want those helpers be installed with your Project. - dashboard_editor_role.yaml - dashboard_viewer_role.yaml + # For each CRD, "Admin", "Editor" and "Viewer" roles are scaffolded by + # default, aiding admins in cluster management. Those roles are + # not used by the {{ .ProjectName }} itself. You can comment the following lines + # if you do not want those helpers be installed with your Project. + - storage_admin_role.yaml + - storage_editor_role.yaml + - storage_viewer_role.yaml diff --git a/config/rbac/leader_election_role_binding.yaml b/config/rbac/leader_election_role_binding.yaml index 60907a6..1c6ae09 100644 --- a/config/rbac/leader_election_role_binding.yaml +++ b/config/rbac/leader_election_role_binding.yaml @@ -13,3 +13,6 @@ subjects: - kind: ServiceAccount name: controller-manager namespace: supabase-system + - kind: ServiceAccount + name: control-plane + namespace: supabase-system diff --git a/config/rbac/role.yaml b/config/rbac/role.yaml index a47705e..d59b600 100644 --- a/config/rbac/role.yaml +++ b/config/rbac/role.yaml @@ -42,6 +42,7 @@ rules: - apigateways - cores - dashboards + - storages verbs: - create - delete @@ -56,6 +57,7 @@ rules: - apigateways/finalizers - cores/finalizers - dashboards/finalizers + - storages/finalizers verbs: - update - apiGroups: @@ -64,6 +66,7 @@ rules: - apigateways/status - cores/status - dashboards/status + - storages/status verbs: - get - patch diff --git a/config/rbac/storage_admin_role.yaml b/config/rbac/storage_admin_role.yaml new file mode 100644 index 0000000..18ad774 --- /dev/null +++ b/config/rbac/storage_admin_role.yaml @@ -0,0 +1,27 @@ +# This rule is not used by the project supabase-operator itself. +# It is provided to allow the cluster admin to help manage permissions for users. +# +# Grants full permissions ('*') over supabase.k8s.icb4dc0.de. +# This role is intended for users authorized to modify roles and bindings within the cluster, +# enabling them to delegate specific permissions to other users or groups as needed. + +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + labels: + app.kubernetes.io/name: supabase-operator + app.kubernetes.io/managed-by: kustomize + name: storage-admin-role +rules: +- apiGroups: + - supabase.k8s.icb4dc0.de + resources: + - storages + verbs: + - '*' +- apiGroups: + - supabase.k8s.icb4dc0.de + resources: + - storages/status + verbs: + - get diff --git a/config/rbac/storage_editor_role.yaml b/config/rbac/storage_editor_role.yaml new file mode 100644 index 0000000..29500f0 --- /dev/null +++ b/config/rbac/storage_editor_role.yaml @@ -0,0 +1,33 @@ +# This rule is not used by the project supabase-operator itself. +# It is provided to allow the cluster admin to help manage permissions for users. +# +# Grants permissions to create, update, and delete resources within the supabase.k8s.icb4dc0.de. +# This role is intended for users who need to manage these resources +# but should not control RBAC or manage permissions for others. + +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + labels: + app.kubernetes.io/name: supabase-operator + app.kubernetes.io/managed-by: kustomize + name: storage-editor-role +rules: +- apiGroups: + - supabase.k8s.icb4dc0.de + resources: + - storages + verbs: + - create + - delete + - get + - list + - patch + - update + - watch +- apiGroups: + - supabase.k8s.icb4dc0.de + resources: + - storages/status + verbs: + - get diff --git a/config/rbac/storage_viewer_role.yaml b/config/rbac/storage_viewer_role.yaml new file mode 100644 index 0000000..aca70f9 --- /dev/null +++ b/config/rbac/storage_viewer_role.yaml @@ -0,0 +1,29 @@ +# This rule is not used by the project supabase-operator itself. +# It is provided to allow the cluster admin to help manage permissions for users. +# +# Grants read-only access to supabase.k8s.icb4dc0.de resources. +# This role is intended for users who need visibility into these resources +# without permissions to modify them. It is ideal for monitoring purposes and limited-access viewing. + +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + labels: + app.kubernetes.io/name: supabase-operator + app.kubernetes.io/managed-by: kustomize + name: storage-viewer-role +rules: +- apiGroups: + - supabase.k8s.icb4dc0.de + resources: + - storages + verbs: + - get + - list + - watch +- apiGroups: + - supabase.k8s.icb4dc0.de + resources: + - storages/status + verbs: + - get diff --git a/config/samples/kustomization.yaml b/config/samples/kustomization.yaml index e32f0fd..74dba7c 100644 --- a/config/samples/kustomization.yaml +++ b/config/samples/kustomization.yaml @@ -8,4 +8,5 @@ resources: - supabase_v1alpha1_core.yaml - supabase_v1alpha1_apigateway.yaml - supabase_v1alpha1_dashboard.yaml + - supabase_v1alpha1_storage.yaml # +kubebuilder:scaffold:manifestskustomizesamples diff --git a/config/samples/supabase_v1alpha1_storage.yaml b/config/samples/supabase_v1alpha1_storage.yaml new file mode 100644 index 0000000..fc5cd56 --- /dev/null +++ b/config/samples/supabase_v1alpha1_storage.yaml @@ -0,0 +1,9 @@ +apiVersion: supabase.k8s.icb4dc0.de/v1alpha1 +kind: Storage +metadata: + labels: + app.kubernetes.io/name: supabase-operator + app.kubernetes.io/managed-by: kustomize + name: storage-sample +spec: + # TODO(user): Add fields here diff --git a/hack/boilerplate.go.txt b/hack/boilerplate.go.txt index bb2d4b9..6ca537d 100644 --- a/hack/boilerplate.go.txt +++ b/hack/boilerplate.go.txt @@ -1,5 +1,5 @@ /* -Copyright 2024 Peter Kurfer. +Copyright 2025 Peter Kurfer. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -12,4 +12,4 @@ 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. -*/ \ No newline at end of file +*/ diff --git a/hack/header.tmpl b/hack/header.tmpl new file mode 100644 index 0000000..2a46de8 --- /dev/null +++ b/hack/header.tmpl @@ -0,0 +1,13 @@ +Copyright {{ YEAR }} {{ AUTHOR }}. + +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. diff --git a/internal/controller/apigateway_controller.go b/internal/controller/apigateway_controller.go index a598687..490b2f9 100644 --- a/internal/controller/apigateway_controller.go +++ b/internal/controller/apigateway_controller.go @@ -1,5 +1,5 @@ /* -Copyright 2024 Peter Kurfer. +Copyright 2025 Peter Kurfer. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/internal/controller/core_db_controller.go b/internal/controller/core_db_controller.go index 050a2d8..440d362 100644 --- a/internal/controller/core_db_controller.go +++ b/internal/controller/core_db_controller.go @@ -1,5 +1,5 @@ /* -Copyright 2024 Peter Kurfer. +Copyright 2025 Peter Kurfer. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/internal/controller/core_gotrue_controller.go b/internal/controller/core_gotrue_controller.go index 8d28278..5d92bd6 100644 --- a/internal/controller/core_gotrue_controller.go +++ b/internal/controller/core_gotrue_controller.go @@ -221,8 +221,8 @@ func (r *CoreAuthReconciler) reconcileAuthService( core.Labels, ) - if _, ok := authService.Labels[meta.SupabaseLabel.EnvoyCluster]; !ok { - authService.Labels[meta.SupabaseLabel.EnvoyCluster] = core.Name + if _, ok := authService.Labels[meta.SupabaseLabel.ApiGatewayTarget]; !ok { + authService.Labels[meta.SupabaseLabel.ApiGatewayTarget] = core.Name } authService.Spec = corev1.ServiceSpec{ diff --git a/internal/controller/core_postgrest_controller.go b/internal/controller/core_postgrest_controller.go index b4deda2..dbc1751 100644 --- a/internal/controller/core_postgrest_controller.go +++ b/internal/controller/core_postgrest_controller.go @@ -228,8 +228,8 @@ func (r *CorePostgrestReconiler) reconcilePostgrestService( core.Labels, ) - if _, ok := postgrestService.Labels[meta.SupabaseLabel.EnvoyCluster]; !ok { - postgrestService.Labels[meta.SupabaseLabel.EnvoyCluster] = core.Name + if _, ok := postgrestService.Labels[meta.SupabaseLabel.ApiGatewayTarget]; !ok { + postgrestService.Labels[meta.SupabaseLabel.ApiGatewayTarget] = "" } postgrestService.Spec = corev1.ServiceSpec{ diff --git a/internal/controller/dashboard_pg-meta_controller.go b/internal/controller/dashboard_pg-meta_controller.go index ef08215..0ca6db3 100644 --- a/internal/controller/dashboard_pg-meta_controller.go +++ b/internal/controller/dashboard_pg-meta_controller.go @@ -196,8 +196,8 @@ func (r *DashboardPGMetaReconciler) reconcilePGMetaService( dashboard.Labels, ) - if _, ok := pgMetaService.Labels[meta.SupabaseLabel.EnvoyCluster]; !ok { - pgMetaService.Labels[meta.SupabaseLabel.EnvoyCluster] = dashboard.Name + if _, ok := pgMetaService.Labels[meta.SupabaseLabel.ApiGatewayTarget]; !ok { + pgMetaService.Labels[meta.SupabaseLabel.ApiGatewayTarget] = "" } pgMetaService.Spec = corev1.ServiceSpec{ diff --git a/internal/controller/dashboard_studio_controller.go b/internal/controller/dashboard_studio_controller.go index 25f1191..097ed38 100644 --- a/internal/controller/dashboard_studio_controller.go +++ b/internal/controller/dashboard_studio_controller.go @@ -218,8 +218,8 @@ func (r *DashboardStudioReconciler) reconcileStudioService( dashboard.Labels, ) - if _, ok := studioService.Labels[meta.SupabaseLabel.EnvoyCluster]; !ok { - studioService.Labels[meta.SupabaseLabel.EnvoyCluster] = dashboard.Name + if _, ok := studioService.Labels[meta.SupabaseLabel.ApiGatewayTarget]; !ok { + studioService.Labels[meta.SupabaseLabel.ApiGatewayTarget] = "" } studioService.Spec = corev1.ServiceSpec{ diff --git a/internal/controller/pwgen.go b/internal/controller/pwgen.go index 6e0cbde..d59f0bc 100644 --- a/internal/controller/pwgen.go +++ b/internal/controller/pwgen.go @@ -1,3 +1,19 @@ +// /* +// Copyright 2025 Peter Kurfer. +// +// 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. +// */ + package controller import ( diff --git a/internal/controller/storage_controller.go b/internal/controller/storage_controller.go new file mode 100644 index 0000000..084af06 --- /dev/null +++ b/internal/controller/storage_controller.go @@ -0,0 +1,63 @@ +/* +Copyright 2025 Peter Kurfer. + +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. +*/ + +package controller + +import ( + "context" + + "k8s.io/apimachinery/pkg/runtime" + ctrl "sigs.k8s.io/controller-runtime" + "sigs.k8s.io/controller-runtime/pkg/client" + "sigs.k8s.io/controller-runtime/pkg/log" + + supabasev1alpha1 "code.icb4dc0.de/prskr/supabase-operator/api/v1alpha1" +) + +// StorageReconciler reconciles a Storage object +type StorageReconciler struct { + client.Client + Scheme *runtime.Scheme +} + +// +kubebuilder:rbac:groups=supabase.k8s.icb4dc0.de,resources=storages,verbs=get;list;watch;create;update;patch;delete +// +kubebuilder:rbac:groups=supabase.k8s.icb4dc0.de,resources=storages/status,verbs=get;update;patch +// +kubebuilder:rbac:groups=supabase.k8s.icb4dc0.de,resources=storages/finalizers,verbs=update + +// Reconcile is part of the main kubernetes reconciliation loop which aims to +// move the current state of the cluster closer to the desired state. +// TODO(user): Modify the Reconcile function to compare the state specified by +// the Storage object against the actual cluster state, and then +// perform operations to make the cluster state reflect the state specified by +// the user. +// +// For more details, check Reconcile and its Result here: +// - https://pkg.go.dev/sigs.k8s.io/controller-runtime@v0.19.4/pkg/reconcile +func (r *StorageReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) { + _ = log.FromContext(ctx) + + // TODO(user): your logic here + + return ctrl.Result{}, nil +} + +// SetupWithManager sets up the controller with the Manager. +func (r *StorageReconciler) SetupWithManager(mgr ctrl.Manager) error { + return ctrl.NewControllerManagedBy(mgr). + For(&supabasev1alpha1.Storage{}). + Named("storage"). + Complete(r) +} diff --git a/internal/controller/storage_controller_test.go b/internal/controller/storage_controller_test.go new file mode 100644 index 0000000..a081e1e --- /dev/null +++ b/internal/controller/storage_controller_test.go @@ -0,0 +1,84 @@ +/* +Copyright 2025 Peter Kurfer. + +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. +*/ + +package controller + +import ( + "context" + + . "github.com/onsi/ginkgo/v2" + . "github.com/onsi/gomega" + "k8s.io/apimachinery/pkg/api/errors" + "k8s.io/apimachinery/pkg/types" + "sigs.k8s.io/controller-runtime/pkg/reconcile" + + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + + supabasev1alpha1 "code.icb4dc0.de/prskr/supabase-operator/api/v1alpha1" +) + +var _ = Describe("Storage Controller", func() { + Context("When reconciling a resource", func() { + const resourceName = "test-resource" + + ctx := context.Background() + + typeNamespacedName := types.NamespacedName{ + Name: resourceName, + Namespace: "default", // TODO(user):Modify as needed + } + storage := &supabasev1alpha1.Storage{} + + BeforeEach(func() { + By("creating the custom resource for the Kind Storage") + err := k8sClient.Get(ctx, typeNamespacedName, storage) + if err != nil && errors.IsNotFound(err) { + resource := &supabasev1alpha1.Storage{ + ObjectMeta: metav1.ObjectMeta{ + Name: resourceName, + Namespace: "default", + }, + // TODO(user): Specify other spec details if needed. + } + Expect(k8sClient.Create(ctx, resource)).To(Succeed()) + } + }) + + AfterEach(func() { + // TODO(user): Cleanup logic after each test, like removing the resource instance. + resource := &supabasev1alpha1.Storage{} + err := k8sClient.Get(ctx, typeNamespacedName, resource) + Expect(err).NotTo(HaveOccurred()) + + By("Cleanup the specific resource instance Storage") + Expect(k8sClient.Delete(ctx, resource)).To(Succeed()) + }) + It("should successfully reconcile the resource", func() { + By("Reconciling the created resource") + controllerReconciler := &StorageReconciler{ + Client: k8sClient, + Scheme: k8sClient.Scheme(), + } + + _, err := controllerReconciler.Reconcile(ctx, reconcile.Request{ + NamespacedName: typeNamespacedName, + }) + Expect(err).NotTo(HaveOccurred()) + // TODO(user): Add more specific assertions depending on your controller's reconciliation logic. + // Example: If you expect a certain status condition after reconciliation, verify it here. + }) + }) +}) diff --git a/internal/controlplane/apigateway_controller.go b/internal/controlplane/apigateway_controller.go new file mode 100644 index 0000000..54cd759 --- /dev/null +++ b/internal/controlplane/apigateway_controller.go @@ -0,0 +1,197 @@ +/* +Copyright 2025 Peter Kurfer. + +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. +*/ + +package controlplane + +import ( + "bytes" + "context" + "crypto/sha256" + "encoding/json" + "fmt" + "strconv" + "strings" + "time" + + cachev3 "github.com/envoyproxy/go-control-plane/pkg/cache/v3" + discoveryv1 "k8s.io/api/discovery/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/types" + ctrl "sigs.k8s.io/controller-runtime" + "sigs.k8s.io/controller-runtime/pkg/builder" + "sigs.k8s.io/controller-runtime/pkg/client" + "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil" + "sigs.k8s.io/controller-runtime/pkg/handler" + "sigs.k8s.io/controller-runtime/pkg/log" + "sigs.k8s.io/controller-runtime/pkg/predicate" + "sigs.k8s.io/controller-runtime/pkg/reconcile" + + supabasev1alpha1 "code.icb4dc0.de/prskr/supabase-operator/api/v1alpha1" + "code.icb4dc0.de/prskr/supabase-operator/internal/meta" +) + +// APIGatewayReconciler reconciles a APIGateway object +type APIGatewayReconciler struct { + client.Client + Scheme *runtime.Scheme + Cache cachev3.SnapshotCache +} + +// Reconcile is part of the main kubernetes reconciliation loop which aims to +// move the current state of the cluster closer to the desired state. +// +// For more details, check Reconcile and its Result here: +// - https://pkg.go.dev/sigs.k8s.io/controller-runtime@v0.19.1/pkg/reconcile +func (r *APIGatewayReconciler) Reconcile(ctx context.Context, req ctrl.Request) (res ctrl.Result, err error) { + var ( + gateway supabasev1alpha1.APIGateway + logger = log.FromContext(ctx) + endpointSliceList discoveryv1.EndpointSliceList + ) + + logger.Info("Reconciling APIGateway") + + if err := r.Get(ctx, req.NamespacedName, &gateway); client.IgnoreNotFound(err) != nil { + logger.Error(err, "unable to fetch Gateway") + return ctrl.Result{}, err + } + + selector, err := metav1.LabelSelectorAsSelector(gateway.Spec.ServiceSelector) + if err != nil { + return ctrl.Result{}, fmt.Errorf("failed to create selector for EndpointSlices: %w", err) + } + + if err := r.List(ctx, &endpointSliceList, client.MatchingLabelsSelector{Selector: selector}); err != nil { + return ctrl.Result{}, err + } + + services := EnvoyServices{ServiceLabelKey: gateway.Spec.ComponentTypeLabel} + services.UpsertEndpointSlices(endpointSliceList.Items...) + + rawServices, err := json.Marshal(services) + if err != nil { + return ctrl.Result{}, fmt.Errorf("failed to prepare config hash: %w", err) + } + + serviceHash := sha256.New().Sum(rawServices) + if bytes.Equal(serviceHash, gateway.Status.Envoy.ResourceHash) { + logger.Info("Resource hash did not change - skipping reconciliation") + return ctrl.Result{}, nil + } + + logger.Info("Updating service targets") + _, err = controllerutil.CreateOrPatch(ctx, r.Client, &gateway, func() error { + gateway.Status.ServiceTargets = services.Targets() + gateway.Status.Envoy.ConfigVersion = strconv.FormatInt(time.Now().UTC().UnixMilli(), 10) + gateway.Status.Envoy.ResourceHash = serviceHash + + return nil + }) + if err != nil { + return ctrl.Result{}, err + } + + instance := fmt.Sprintf("%s:%s", gateway.Spec.Envoy.NodeName, gateway.Namespace) + + logger.Info("Computing Envoy snapshot for current service targets", "version", gateway.Status.Envoy.ConfigVersion) + snapshot, err := services.snapshot(ctx, instance, gateway.Status.Envoy.ConfigVersion) + if err != nil { + return ctrl.Result{}, fmt.Errorf("failed to prepare snapshot: %w", err) + } + + logger.Info("Propagating Envoy snapshot", "version", gateway.Status.Envoy.ConfigVersion) + if err := r.Cache.SetSnapshot(ctx, instance, snapshot); err != nil { + return ctrl.Result{}, fmt.Errorf("failed to propagate snapshot: %w", err) + } + + return ctrl.Result{}, nil +} + +func (r *APIGatewayReconciler) SetupWithManager(mgr ctrl.Manager) error { + gatewayTargetLabelSelector, err := predicate.LabelSelectorPredicate(metav1.LabelSelector{ + MatchExpressions: []metav1.LabelSelectorRequirement{{ + Key: meta.SupabaseLabel.ApiGatewayTarget, + Operator: metav1.LabelSelectorOpExists, + }}, + }) + if err != nil { + return fmt.Errorf("failed to build gateway target predicate: %w", err) + } + + return ctrl.NewControllerManagedBy(mgr). + For(new(supabasev1alpha1.APIGateway)). + Watches( + new(discoveryv1.EndpointSlice), + r.endpointSliceEventHandler(), + builder.WithPredicates(gatewayTargetLabelSelector)). + Complete(r) +} + +// endpointSliceEventHandler - prepares an event handler that checks whether the EndpointSlice has a specific target +// or if it is targeting the only APIGateway in its namespace (default behavior for the operator) +func (r *APIGatewayReconciler) endpointSliceEventHandler() handler.TypedEventHandler[client.Object, reconcile.Request] { + return handler.EnqueueRequestsFromMapFunc(func(ctx context.Context, obj client.Object) []reconcile.Request { + var ( + logger = log.FromContext(ctx) + apiGatewayList supabasev1alpha1.APIGatewayList + ) + + endpointSlice, ok := obj.(*discoveryv1.EndpointSlice) + if !ok { + logger.Info("Cannot map event to reconcile request, because object has unexpected type", "type", fmt.Sprintf("%T", obj)) + return nil + } + + if err := r.Client.List(ctx, &apiGatewayList, client.InNamespace(endpointSlice.Namespace)); err != nil { + logger.Error(err, "failed to list APIGateways to determine reconcile targets") + return nil + } + + target, ok := endpointSlice.Labels[meta.SupabaseLabel.ApiGatewayTarget] + if !ok { + // should not happen, just to be sure + return nil + } + + var reconcileRequests []reconcile.Request + + if target != "" { + for _, gw := range apiGatewayList.Items { + if strings.EqualFold(gw.Spec.Envoy.NodeName, target) { + reconcileRequests = append(reconcileRequests, reconcile.Request{ + NamespacedName: types.NamespacedName{ + Name: gw.Name, + Namespace: gw.Namespace, + }, + }) + } + } + } else { + reconcileRequests = make([]reconcile.Request, 0, len(apiGatewayList.Items)) + for _, gw := range apiGatewayList.Items { + reconcileRequests = append(reconcileRequests, reconcile.Request{ + NamespacedName: types.NamespacedName{ + Name: gw.Name, + Namespace: gw.Namespace, + }, + }) + } + } + + return reconcileRequests + }) +} diff --git a/internal/controlplane/endpoints.go b/internal/controlplane/endpoints.go index 5890c4e..c7149bc 100644 --- a/internal/controlplane/endpoints.go +++ b/internal/controlplane/endpoints.go @@ -1,6 +1,10 @@ package controlplane import ( + "encoding/json" + "fmt" + "slices" + "strings" "time" clusterv3 "github.com/envoyproxy/go-control-plane/envoy/config/cluster/v3" @@ -10,11 +14,28 @@ import ( discoveryv1 "k8s.io/api/discovery/v1" ) +var _ json.Marshaler = (*ServiceCluster)(nil) + type ServiceCluster struct { ServiceEndpoints map[string]Endpoints } -func (c *ServiceCluster) AddOrUpdateEndpoints(eps *discoveryv1.EndpointSlice) { +// MarshalJSON implements json.Marshaler. +func (c *ServiceCluster) MarshalJSON() ([]byte, error) { + tmp := struct { + Endpoints []string `json:"endpoints"` + }{} + + for _, endpoints := range c.ServiceEndpoints { + tmp.Endpoints = append(tmp.Endpoints, endpoints.Targets...) + } + + slices.Sort(tmp.Endpoints) + + return json.Marshal(tmp) +} + +func (c *ServiceCluster) AddOrUpdateEndpoints(eps discoveryv1.EndpointSlice) { if c.ServiceEndpoints == nil { c.ServiceEndpoints = make(map[string]Endpoints) } @@ -22,6 +43,16 @@ func (c *ServiceCluster) AddOrUpdateEndpoints(eps *discoveryv1.EndpointSlice) { c.ServiceEndpoints[eps.Name] = newEndpointsFromSlice(eps) } +func (c ServiceCluster) Targets() []string { + var targets []string + + for _, ep := range c.ServiceEndpoints { + targets = append(targets, ep.Targets...) + } + + return targets +} + func (c ServiceCluster) Cluster(name string, port uint32) *clusterv3.Cluster { return &clusterv3.Cluster{ Name: name, @@ -47,12 +78,13 @@ func (c ServiceCluster) endpoints(port uint32) []*endpointv3.LocalityLbEndpoints return eps } -func newEndpointsFromSlice(eps *discoveryv1.EndpointSlice) Endpoints { +func newEndpointsFromSlice(eps discoveryv1.EndpointSlice) Endpoints { var result Endpoints for _, ep := range eps.Endpoints { if ep.Conditions.Ready != nil && *ep.Conditions.Ready { result.Addresses = append(result.Addresses, ep.Addresses...) + result.Targets = append(result.Targets, strings.ToLower(fmt.Sprintf("%s/%s", ep.TargetRef.Kind, ep.TargetRef.Name))) } } @@ -61,6 +93,7 @@ func newEndpointsFromSlice(eps *discoveryv1.EndpointSlice) Endpoints { type Endpoints struct { Addresses []string + Targets []string } func (e Endpoints) LBEndpoints(port uint32) []*endpointv3.LbEndpoint { diff --git a/internal/controlplane/controller.go b/internal/controlplane/snapshot.go similarity index 54% rename from internal/controlplane/controller.go rename to internal/controlplane/snapshot.go index 272d1e1..004ebd5 100644 --- a/internal/controlplane/controller.go +++ b/internal/controlplane/snapshot.go @@ -1,29 +1,8 @@ -/* -Copyright 2024 Peter Kurfer. - -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. -*/ - package controlplane import ( "context" - "errors" - "fmt" "slices" - "strconv" - "sync" - "time" corev3 "github.com/envoyproxy/go-control-plane/envoy/config/core/v3" listenerv3 "github.com/envoyproxy/go-control-plane/envoy/config/listener/v3" @@ -35,171 +14,64 @@ import ( "github.com/envoyproxy/go-control-plane/pkg/resource/v3" "google.golang.org/protobuf/types/known/anypb" discoveryv1 "k8s.io/api/discovery/v1" - "k8s.io/apimachinery/pkg/labels" - "k8s.io/apimachinery/pkg/selection" - "k8s.io/apimachinery/pkg/watch" - ctrl "sigs.k8s.io/controller-runtime" - "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/log" - "code.icb4dc0.de/prskr/supabase-operator/internal/meta" "code.icb4dc0.de/prskr/supabase-operator/internal/supabase" ) -var ( - ErrUnexpectedObject = errors.New("unexpected object") - ErrNoEnvoyClusterLabel = errors.New("no Envoy cluster label set") - - supabaseServices = []string{ - supabase.ServiceConfig.Postgrest.Name, - supabase.ServiceConfig.Auth.Name, - supabase.ServiceConfig.PGMeta.Name, - } -) - -type EndpointsController struct { - lock sync.Mutex - Client client.WithWatch - Cache cache.SnapshotCache - envoyClusters map[string]*envoyClusterServices +type EnvoyServices struct { + ServiceLabelKey string `json:"-"` + Postgrest *PostgrestCluster `json:"postgrest,omitempty"` + GoTrue *GoTrueCluster `json:"auth,omitempty"` + PGMeta *PGMetaCluster `json:"pgmeta,omitempty"` + Studio *StudioCluster `json:"studio,omitempty"` } -func (c *EndpointsController) Run(ctx context.Context) error { - var ( - logger = ctrl.Log.WithName("endpoints-controller") - endpointSlices discoveryv1.EndpointSliceList - ) - - selector := labels.NewSelector() - - partOfRequirement, err := labels.NewRequirement(meta.WellKnownLabel.PartOf, selection.Equals, []string{"supabase"}) - if err != nil { - return fmt.Errorf("preparing watcher selectors: %w", err) - } - - nameRequirement, err := labels.NewRequirement(meta.WellKnownLabel.Name, selection.In, supabaseServices) - if err != nil { - return fmt.Errorf("preparing watcher selectors: %w", err) - } - - envoyClusterRequirement, err := labels.NewRequirement(meta.SupabaseLabel.EnvoyCluster, selection.Exists, nil) - if err != nil { - return fmt.Errorf("preparing watcher selectors: %w", err) - } - - selector.Add(*partOfRequirement, *nameRequirement, *envoyClusterRequirement) - - watcher, err := c.Client.Watch( - ctx, - &endpointSlices, - client.MatchingLabelsSelector{ - Selector: selector.Add(*partOfRequirement, *nameRequirement, *envoyClusterRequirement), - }, - ) - if err != nil { - return err - } - - defer watcher.Stop() - - for { - select { - case ev, more := <-watcher.ResultChan(): - if !more { - return nil +func (s *EnvoyServices) UpsertEndpointSlices(endpointSlices ...discoveryv1.EndpointSlice) { + for _, eps := range endpointSlices { + switch eps.Labels[s.ServiceLabelKey] { + case supabase.ServiceConfig.Postgrest.Name: + if s.Postgrest == nil { + s.Postgrest = new(PostgrestCluster) } - eventLogger := logger.WithValues("event_type", ev.Type) - switch ev.Type { - case watch.Added, watch.Modified: - eps, ok := ev.Object.(*discoveryv1.EndpointSlice) - if !ok { - logger.Error(fmt.Errorf("%w: %T", ErrUnexpectedObject, ev.Object), "expected EndpointSlice but got a different object type") - continue - } - - if err := c.handleModificationEvent(log.IntoContext(ctx, eventLogger), eps); err != nil { - logger.Error(err, "error occurred during event handling") - } + s.Postgrest.AddOrUpdateEndpoints(eps) + case supabase.ServiceConfig.Auth.Name: + if s.GoTrue == nil { + s.GoTrue = new(GoTrueCluster) } - case <-ctx.Done(): - return ctx.Err() + s.GoTrue.AddOrUpdateEndpoints(eps) + case supabase.ServiceConfig.PGMeta.Name: + if s.PGMeta == nil { + s.PGMeta = new(PGMetaCluster) + } + s.PGMeta.AddOrUpdateEndpoints(eps) } } } -func (c *EndpointsController) handleModificationEvent(ctx context.Context, epSlice *discoveryv1.EndpointSlice) error { - c.lock.Lock() - defer c.lock.Unlock() +func (s EnvoyServices) Targets() map[string][]string { + targets := make(map[string][]string) - var ( - logger = log.FromContext(ctx) - instanceKey string - svc *envoyClusterServices - ) - - logger.Info("Observed endpoint slice", "name", epSlice.Name) - - if c.envoyClusters == nil { - c.envoyClusters = make(map[string]*envoyClusterServices) + if s.Postgrest != nil { + targets[supabase.ServiceConfig.Postgrest.Name] = s.Postgrest.Targets() } - envoyNodeName, ok := epSlice.Labels[meta.SupabaseLabel.EnvoyCluster] - if !ok { - return fmt.Errorf("%w: at object %s", ErrNoEnvoyClusterLabel, epSlice.Name) + if s.GoTrue != nil { + targets[supabase.ServiceConfig.Auth.Name] = s.GoTrue.Targets() } - instanceKey = fmt.Sprintf("%s:%s", envoyNodeName, epSlice.Namespace) - - if svc, ok = c.envoyClusters[instanceKey]; !ok { - svc = new(envoyClusterServices) + if s.PGMeta != nil { + targets[supabase.ServiceConfig.PGMeta.Name] = s.PGMeta.Targets() } - svc.UpsertEndpoints(epSlice) + if s.Studio != nil { + targets[supabase.ServiceConfig.Studio.Name] = s.Studio.Targets() + } - c.envoyClusters[instanceKey] = svc - - return c.updateSnapshot(ctx, instanceKey) + return targets } -func (c *EndpointsController) updateSnapshot(ctx context.Context, instance string) error { - latestVersion := strconv.FormatInt(time.Now().UTC().UnixMilli(), 10) - - snapshot, err := c.envoyClusters[instance].snapshot(instance, latestVersion) - if err != nil { - return err - } - - return c.Cache.SetSnapshot(ctx, instance, snapshot) -} - -type envoyClusterServices struct { - Postgrest *PostgrestCluster - GoTrue *GoTrueCluster - PGMeta *PGMetaCluster - Studio *StudioCluster -} - -func (s *envoyClusterServices) UpsertEndpoints(eps *discoveryv1.EndpointSlice) { - switch eps.Labels[meta.WellKnownLabel.Name] { - case supabase.ServiceConfig.Postgrest.Name: - if s.Postgrest == nil { - s.Postgrest = new(PostgrestCluster) - } - s.Postgrest.AddOrUpdateEndpoints(eps) - case supabase.ServiceConfig.Auth.Name: - if s.GoTrue == nil { - s.GoTrue = new(GoTrueCluster) - } - s.GoTrue.AddOrUpdateEndpoints(eps) - case supabase.ServiceConfig.PGMeta.Name: - if s.PGMeta == nil { - s.PGMeta = new(PGMetaCluster) - } - s.PGMeta.AddOrUpdateEndpoints(eps) - } -} - -func (s *envoyClusterServices) snapshot(instance, version string) (*cache.Snapshot, error) { +func (s *EnvoyServices) snapshot(ctx context.Context, instance, version string) (*cache.Snapshot, error) { const ( apiRouteName = "supabase" studioRouteName = "supabas-studio" @@ -207,6 +79,8 @@ func (s *envoyClusterServices) snapshot(instance, version string) (*cache.Snapsh listenerName = "supabase" ) + logger := log.FromContext(ctx) + apiConnectionManager := &hcm.HttpConnectionManager{ CodecType: hcm.HttpConnectionManager_AUTO, StatPrefix: "http", @@ -327,6 +201,8 @@ func (s *envoyClusterServices) snapshot(instance, version string) (*cache.Snapsh }} if s.Studio != nil { + logger.Info("Adding studio listener") + listeners = append(listeners, &listenerv3.Listener{ Name: "studio", Address: &corev3.Address{ diff --git a/internal/meta/labels.go b/internal/meta/labels.go index b17d753..feda623 100644 --- a/internal/meta/labels.go +++ b/internal/meta/labels.go @@ -39,9 +39,9 @@ var WellKnownLabel = struct { } var SupabaseLabel = struct { - Reload string - EnvoyCluster string + Reload string + ApiGatewayTarget string }{ - Reload: supabasev1alpha1.GroupVersion.Group + "/reload", - EnvoyCluster: supabasev1alpha1.GroupVersion.Group + "/envoy-cluster", + Reload: supabasev1alpha1.GroupVersion.Group + "/reload", + ApiGatewayTarget: supabasev1alpha1.GroupVersion.Group + "/api-gateway-target", } diff --git a/testdata/dotnet-client/supabase-integration.sln b/testdata/dotnet-client/supabase-integration.sln new file mode 100644 index 0000000..f895d3b --- /dev/null +++ b/testdata/dotnet-client/supabase-integration.sln @@ -0,0 +1,27 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.0.31903.59 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "test", "test", "{1A6ACECB-D8D9-4613-B56E-8A4FEB6A78A0}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "supabase-integration.api-test", "test\supabase-integration.api-test\supabase-integration.api-test.csproj", "{8C0E9D7E-5331-4AFB-919A-F00967971025}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {8C0E9D7E-5331-4AFB-919A-F00967971025}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {8C0E9D7E-5331-4AFB-919A-F00967971025}.Debug|Any CPU.Build.0 = Debug|Any CPU + {8C0E9D7E-5331-4AFB-919A-F00967971025}.Release|Any CPU.ActiveCfg = Release|Any CPU + {8C0E9D7E-5331-4AFB-919A-F00967971025}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(NestedProjects) = preSolution + {8C0E9D7E-5331-4AFB-919A-F00967971025} = {1A6ACECB-D8D9-4613-B56E-8A4FEB6A78A0} + EndGlobalSection +EndGlobal diff --git a/testdata/dotnet-client/supabase-integration.sln.DotSettings.user b/testdata/dotnet-client/supabase-integration.sln.DotSettings.user new file mode 100644 index 0000000..6b5966a --- /dev/null +++ b/testdata/dotnet-client/supabase-integration.sln.DotSettings.user @@ -0,0 +1,6 @@ + + <SessionState ContinuousTestingMode="0" IsActive="True" Name="TestListTasks(SupabaseClientFixture)" xmlns="urn:schemas-jetbrains-com:jetbrains-ut-session"> + <TestAncestor> + <TestId>Testing Platform::8C0E9D7E-5331-4AFB-919A-F00967971025::net9.0::ServiceKeyTest</TestId> + </TestAncestor> +</SessionState> \ No newline at end of file diff --git a/testdata/dotnet-client/test/supabase-integration.api-test/ServiceKeyTest.cs b/testdata/dotnet-client/test/supabase-integration.api-test/ServiceKeyTest.cs new file mode 100644 index 0000000..cb47f12 --- /dev/null +++ b/testdata/dotnet-client/test/supabase-integration.api-test/ServiceKeyTest.cs @@ -0,0 +1,27 @@ +using Supabase.Postgrest.Attributes; +using Supabase.Postgrest.Models; + +namespace supabase_integration.api_test; + +public class ServiceKeyTest +{ + [Test] + [ClassDataSource(Shared = SharedType.PerAssembly)] + public async Task TestListTasks(SupabaseClientFixture fixture) + { + var resp = await fixture.ApiClient.Postgrest.Table().Get().ConfigureAwait(false); + + await Assert.That(resp.Models.Count).IsGreaterThan(0); + } +} + +[Table("lists")] +public class TaskList : BaseModel +{ + [PrimaryKey("id")] + public int Id { get; set; } + [Column("user_id")] + public int UserId { get; set; } + [Column("name")] + public string Name { get; set; } +} \ No newline at end of file diff --git a/testdata/dotnet-client/test/supabase-integration.api-test/SupabaseClientFixture.cs b/testdata/dotnet-client/test/supabase-integration.api-test/SupabaseClientFixture.cs new file mode 100644 index 0000000..496aec2 --- /dev/null +++ b/testdata/dotnet-client/test/supabase-integration.api-test/SupabaseClientFixture.cs @@ -0,0 +1,22 @@ +using Supabase; +using TUnit.Core.Interfaces; + +namespace supabase_integration.api_test; + +public class SupabaseClientFixture : IAsyncInitializer +{ + public Task InitializeAsync() + { + ApiClient = new Client( + Environment.GetEnvironmentVariable("SUPBASE_URL") ?? "http://localhost:8000", + Environment.GetEnvironmentVariable("SUPBASE_ACCESS_KEY") ?? throw new ArgumentException("Supabase access key is missing."), + new SupabaseOptions + { + AutoConnectRealtime = false + } + ); + return Task.CompletedTask; + } + + public Client ApiClient { get; private set; } +} \ No newline at end of file diff --git a/testdata/dotnet-client/test/supabase-integration.api-test/obj/Debug/net9.0/.NETCoreApp,Version=v9.0.AssemblyAttributes.cs b/testdata/dotnet-client/test/supabase-integration.api-test/obj/Debug/net9.0/.NETCoreApp,Version=v9.0.AssemblyAttributes.cs new file mode 100644 index 0000000..feda5e9 --- /dev/null +++ b/testdata/dotnet-client/test/supabase-integration.api-test/obj/Debug/net9.0/.NETCoreApp,Version=v9.0.AssemblyAttributes.cs @@ -0,0 +1,4 @@ +// +using System; +using System.Reflection; +[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETCoreApp,Version=v9.0", FrameworkDisplayName = ".NET 9.0")] diff --git a/testdata/dotnet-client/test/supabase-integration.api-test/obj/Debug/net9.0/AutoRegisteredExtensions.cs b/testdata/dotnet-client/test/supabase-integration.api-test/obj/Debug/net9.0/AutoRegisteredExtensions.cs new file mode 100644 index 0000000..9191c60 --- /dev/null +++ b/testdata/dotnet-client/test/supabase-integration.api-test/obj/Debug/net9.0/AutoRegisteredExtensions.cs @@ -0,0 +1,16 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by Microsoft.Testing.Platform.MSBuild +// +//------------------------------------------------------------------------------ + +[global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage] +internal static class SelfRegisteredExtensions +{ + public static void AddSelfRegisteredExtensions(this global::Microsoft.Testing.Platform.Builder.ITestApplicationBuilder builder, string[] args) + { + Microsoft.Testing.Platform.MSBuild.TestingPlatformBuilderHook.AddExtensions(builder, args); + TUnit.Engine.Framework.TestingPlatformBuilderHook.AddExtensions(builder, args); + Microsoft.Testing.Extensions.CodeCoverage.TestingPlatformBuilderHook.AddExtensions(builder, args); + } +} \ No newline at end of file diff --git a/testdata/dotnet-client/test/supabase-integration.api-test/obj/Debug/net9.0/TestPlatformEntryPoint.cs b/testdata/dotnet-client/test/supabase-integration.api-test/obj/Debug/net9.0/TestPlatformEntryPoint.cs new file mode 100644 index 0000000..2147f31 --- /dev/null +++ b/testdata/dotnet-client/test/supabase-integration.api-test/obj/Debug/net9.0/TestPlatformEntryPoint.cs @@ -0,0 +1,19 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by Microsoft.Testing.Platform.MSBuild +// +//------------------------------------------------------------------------------ + +[global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage] +internal sealed class TestingPlatformEntryPoint +{ + public static async global::System.Threading.Tasks.Task Main(string[] args) + { + global::Microsoft.Testing.Platform.Builder.ITestApplicationBuilder builder = await global::Microsoft.Testing.Platform.Builder.TestApplication.CreateBuilderAsync(args); + SelfRegisteredExtensions.AddSelfRegisteredExtensions(builder, args); + using (global::Microsoft.Testing.Platform.Builder.ITestApplication app = await builder.BuildAsync()) + { + return await app.RunAsync(); + } + } +} \ No newline at end of file diff --git a/testdata/dotnet-client/test/supabase-integration.api-test/obj/Debug/net9.0/apphost b/testdata/dotnet-client/test/supabase-integration.api-test/obj/Debug/net9.0/apphost new file mode 100755 index 0000000000000000000000000000000000000000..600a326d073618ade39b20ef1e46ed7ac1e50c4e GIT binary patch literal 124960 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 bh6W4`7#c7%U}(V5fT00H1BM2^gc|raUnQY| literal 0 HcmV?d00001 diff --git a/testdata/dotnet-client/test/supabase-integration.api-test/obj/Debug/net9.0/ref/supabase-integration.api-test.dll b/testdata/dotnet-client/test/supabase-integration.api-test/obj/Debug/net9.0/ref/supabase-integration.api-test.dll new file mode 100644 index 0000000000000000000000000000000000000000..f34f65653d2e649cbc19427db2edd515dc45c370 GIT binary patch literal 9728 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 literal 0 HcmV?d00001 diff --git a/testdata/dotnet-client/test/supabase-integration.api-test/obj/Debug/net9.0/refint/supabase-integration.api-test.dll b/testdata/dotnet-client/test/supabase-integration.api-test/obj/Debug/net9.0/refint/supabase-integration.api-test.dll new file mode 100644 index 0000000000000000000000000000000000000000..f34f65653d2e649cbc19427db2edd515dc45c370 GIT binary patch literal 9728 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 literal 0 HcmV?d00001 diff --git a/testdata/dotnet-client/test/supabase-integration.api-test/obj/Debug/net9.0/supabase-integration.api-test.AssemblyInfo.cs b/testdata/dotnet-client/test/supabase-integration.api-test/obj/Debug/net9.0/supabase-integration.api-test.AssemblyInfo.cs new file mode 100644 index 0000000..1ed9cc1 --- /dev/null +++ b/testdata/dotnet-client/test/supabase-integration.api-test/obj/Debug/net9.0/supabase-integration.api-test.AssemblyInfo.cs @@ -0,0 +1,23 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Reflection.AssemblyCompanyAttribute("supabase-integration.api-test")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+a5c170a47816e50bce4b39b7d7b54764d92acb71")] +[assembly: System.Reflection.AssemblyProductAttribute("supabase-integration.api-test")] +[assembly: System.Reflection.AssemblyTitleAttribute("supabase-integration.api-test")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] +[assembly: System.Reflection.AssemblyMetadata("Microsoft.Testing.Platform.Application", "True")] + +// Generated by the MSBuild WriteCodeFragment class. + diff --git a/testdata/dotnet-client/test/supabase-integration.api-test/obj/Debug/net9.0/supabase-integration.api-test.AssemblyInfoInputs.cache b/testdata/dotnet-client/test/supabase-integration.api-test/obj/Debug/net9.0/supabase-integration.api-test.AssemblyInfoInputs.cache new file mode 100644 index 0000000..103494d --- /dev/null +++ b/testdata/dotnet-client/test/supabase-integration.api-test/obj/Debug/net9.0/supabase-integration.api-test.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +c30ee9d790c053bb091f7b65a0618bb1bd275cc4b6492d6624dc720874d75514 diff --git a/testdata/dotnet-client/test/supabase-integration.api-test/obj/Debug/net9.0/supabase-integration.api-test.GeneratedMSBuildEditorConfig.editorconfig b/testdata/dotnet-client/test/supabase-integration.api-test/obj/Debug/net9.0/supabase-integration.api-test.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..d8f86fd --- /dev/null +++ b/testdata/dotnet-client/test/supabase-integration.api-test/obj/Debug/net9.0/supabase-integration.api-test.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,15 @@ +is_global = true +build_property.TargetFramework = net9.0 +build_property.TargetPlatformMinVersion = +build_property.UsingMicrosoftNETSdkWeb = +build_property.ProjectTypeGuids = +build_property.InvariantGlobalization = +build_property.PlatformNeutralAssembly = +build_property.EnforceExtendedAnalyzerRules = +build_property._SupportedPlatformList = Linux,macOS,Windows +build_property.RootNamespace = supabase_integration.api_test +build_property.ProjectDir = /Users/baez/sources/code.icb4dc0.de/prskr/supabase-operator/testdata/dotnet-client/test/supabase-integration.api-test/ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.EffectiveAnalysisLevelStyle = 9.0 +build_property.EnableCodeStyleSeverity = diff --git a/testdata/dotnet-client/test/supabase-integration.api-test/obj/Debug/net9.0/supabase-integration.api-test.GlobalUsings.g.cs b/testdata/dotnet-client/test/supabase-integration.api-test/obj/Debug/net9.0/supabase-integration.api-test.GlobalUsings.g.cs new file mode 100644 index 0000000..e67468a --- /dev/null +++ b/testdata/dotnet-client/test/supabase-integration.api-test/obj/Debug/net9.0/supabase-integration.api-test.GlobalUsings.g.cs @@ -0,0 +1,12 @@ +// +global using global::System; +global using global::System.Collections.Generic; +global using global::System.IO; +global using global::System.Linq; +global using global::System.Net.Http; +global using global::System.Threading; +global using global::System.Threading.Tasks; +global using global::TUnit.Assertions; +global using global::TUnit.Assertions.Extensions; +global using global::TUnit.Core; +global using static global::TUnit.Core.HookType; diff --git a/testdata/dotnet-client/test/supabase-integration.api-test/obj/Debug/net9.0/supabase-integration.api-test.assets.cache b/testdata/dotnet-client/test/supabase-integration.api-test/obj/Debug/net9.0/supabase-integration.api-test.assets.cache new file mode 100644 index 0000000000000000000000000000000000000000..ddd9f456d64825097d9798f46852cfd47d2c6671 GIT binary patch literal 47515 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 IpIIvTA7!nB)Bpeg literal 0 HcmV?d00001 diff --git a/testdata/dotnet-client/test/supabase-integration.api-test/obj/Debug/net9.0/supabase-integration.api-test.csproj.CoreCompileInputs.cache b/testdata/dotnet-client/test/supabase-integration.api-test/obj/Debug/net9.0/supabase-integration.api-test.csproj.CoreCompileInputs.cache new file mode 100644 index 0000000..80c08f4 --- /dev/null +++ b/testdata/dotnet-client/test/supabase-integration.api-test/obj/Debug/net9.0/supabase-integration.api-test.csproj.CoreCompileInputs.cache @@ -0,0 +1 @@ +18cd98c3087cd64be3c7db21ec9acf602d7e3393abf67ab6c148e18f5288dcac diff --git a/testdata/dotnet-client/test/supabase-integration.api-test/obj/Debug/net9.0/supabase-integration.api-test.csproj.FileListAbsolute.txt b/testdata/dotnet-client/test/supabase-integration.api-test/obj/Debug/net9.0/supabase-integration.api-test.csproj.FileListAbsolute.txt new file mode 100644 index 0000000..3a5ad72 --- /dev/null +++ b/testdata/dotnet-client/test/supabase-integration.api-test/obj/Debug/net9.0/supabase-integration.api-test.csproj.FileListAbsolute.txt @@ -0,0 +1,73 @@ +/Users/baez/sources/code.icb4dc0.de/prskr/supabase-operator/testdata/dotnet-client/test/supabase-integration.api-test/obj/Debug/net9.0/supabase-integration.api-test.csproj.AssemblyReference.cache +/Users/baez/sources/code.icb4dc0.de/prskr/supabase-operator/testdata/dotnet-client/test/supabase-integration.api-test/obj/Debug/net9.0/supabase-integration.api-test.GeneratedMSBuildEditorConfig.editorconfig +/Users/baez/sources/code.icb4dc0.de/prskr/supabase-operator/testdata/dotnet-client/test/supabase-integration.api-test/obj/Debug/net9.0/supabase-integration.api-test.AssemblyInfoInputs.cache +/Users/baez/sources/code.icb4dc0.de/prskr/supabase-operator/testdata/dotnet-client/test/supabase-integration.api-test/obj/Debug/net9.0/supabase-integration.api-test.AssemblyInfo.cs +/Users/baez/sources/code.icb4dc0.de/prskr/supabase-operator/testdata/dotnet-client/test/supabase-integration.api-test/obj/Debug/net9.0/supabase-integration.api-test.csproj.CoreCompileInputs.cache +/Users/baez/sources/code.icb4dc0.de/prskr/supabase-operator/testdata/dotnet-client/test/supabase-integration.api-test/obj/Debug/net9.0/supabase-integration.api-test.gentestingplatformentrypointinputcache.cache +/Users/baez/sources/code.icb4dc0.de/prskr/supabase-operator/testdata/dotnet-client/test/supabase-integration.api-test/obj/Debug/net9.0/supabase-integration.api-test.genautoregisteredextensionsinputcache.cache +/Users/baez/sources/code.icb4dc0.de/prskr/supabase-operator/testdata/dotnet-client/test/supabase-integration.api-test/obj/Debug/net9.0/AutoRegisteredExtensions.cs +/Users/baez/sources/code.icb4dc0.de/prskr/supabase-operator/testdata/dotnet-client/test/supabase-integration.api-test/obj/Debug/net9.0/TestPlatformEntryPoint.cs +/Users/baez/sources/code.icb4dc0.de/prskr/supabase-operator/testdata/dotnet-client/test/supabase-integration.api-test/bin/Debug/net9.0/supabase-integration.api-test +/Users/baez/sources/code.icb4dc0.de/prskr/supabase-operator/testdata/dotnet-client/test/supabase-integration.api-test/bin/Debug/net9.0/supabase-integration.api-test.deps.json +/Users/baez/sources/code.icb4dc0.de/prskr/supabase-operator/testdata/dotnet-client/test/supabase-integration.api-test/bin/Debug/net9.0/supabase-integration.api-test.runtimeconfig.json +/Users/baez/sources/code.icb4dc0.de/prskr/supabase-operator/testdata/dotnet-client/test/supabase-integration.api-test/bin/Debug/net9.0/supabase-integration.api-test.dll +/Users/baez/sources/code.icb4dc0.de/prskr/supabase-operator/testdata/dotnet-client/test/supabase-integration.api-test/bin/Debug/net9.0/supabase-integration.api-test.pdb +/Users/baez/sources/code.icb4dc0.de/prskr/supabase-operator/testdata/dotnet-client/test/supabase-integration.api-test/bin/Debug/net9.0/EnumerableAsyncProcessor.dll +/Users/baez/sources/code.icb4dc0.de/prskr/supabase-operator/testdata/dotnet-client/test/supabase-integration.api-test/bin/Debug/net9.0/Microsoft.Extensions.DependencyInjection.Abstractions.dll +/Users/baez/sources/code.icb4dc0.de/prskr/supabase-operator/testdata/dotnet-client/test/supabase-integration.api-test/bin/Debug/net9.0/Microsoft.Extensions.Logging.Abstractions.dll +/Users/baez/sources/code.icb4dc0.de/prskr/supabase-operator/testdata/dotnet-client/test/supabase-integration.api-test/bin/Debug/net9.0/Microsoft.IdentityModel.Abstractions.dll +/Users/baez/sources/code.icb4dc0.de/prskr/supabase-operator/testdata/dotnet-client/test/supabase-integration.api-test/bin/Debug/net9.0/Microsoft.IdentityModel.JsonWebTokens.dll +/Users/baez/sources/code.icb4dc0.de/prskr/supabase-operator/testdata/dotnet-client/test/supabase-integration.api-test/bin/Debug/net9.0/Microsoft.IdentityModel.Logging.dll +/Users/baez/sources/code.icb4dc0.de/prskr/supabase-operator/testdata/dotnet-client/test/supabase-integration.api-test/bin/Debug/net9.0/Microsoft.IdentityModel.Tokens.dll +/Users/baez/sources/code.icb4dc0.de/prskr/supabase-operator/testdata/dotnet-client/test/supabase-integration.api-test/bin/Debug/net9.0/Microsoft.IO.RecyclableMemoryStream.dll +/Users/baez/sources/code.icb4dc0.de/prskr/supabase-operator/testdata/dotnet-client/test/supabase-integration.api-test/bin/Debug/net9.0/Microsoft.Testing.Extensions.TrxReport.Abstractions.dll +/Users/baez/sources/code.icb4dc0.de/prskr/supabase-operator/testdata/dotnet-client/test/supabase-integration.api-test/bin/Debug/net9.0/Microsoft.Testing.Platform.dll +/Users/baez/sources/code.icb4dc0.de/prskr/supabase-operator/testdata/dotnet-client/test/supabase-integration.api-test/bin/Debug/net9.0/Microsoft.Testing.Platform.MSBuild.dll +/Users/baez/sources/code.icb4dc0.de/prskr/supabase-operator/testdata/dotnet-client/test/supabase-integration.api-test/bin/Debug/net9.0/MimeMapping.dll +/Users/baez/sources/code.icb4dc0.de/prskr/supabase-operator/testdata/dotnet-client/test/supabase-integration.api-test/bin/Debug/net9.0/Newtonsoft.Json.dll +/Users/baez/sources/code.icb4dc0.de/prskr/supabase-operator/testdata/dotnet-client/test/supabase-integration.api-test/bin/Debug/net9.0/Supabase.dll +/Users/baez/sources/code.icb4dc0.de/prskr/supabase-operator/testdata/dotnet-client/test/supabase-integration.api-test/bin/Debug/net9.0/Supabase.Core.dll +/Users/baez/sources/code.icb4dc0.de/prskr/supabase-operator/testdata/dotnet-client/test/supabase-integration.api-test/bin/Debug/net9.0/Supabase.Functions.dll +/Users/baez/sources/code.icb4dc0.de/prskr/supabase-operator/testdata/dotnet-client/test/supabase-integration.api-test/bin/Debug/net9.0/Supabase.Gotrue.dll +/Users/baez/sources/code.icb4dc0.de/prskr/supabase-operator/testdata/dotnet-client/test/supabase-integration.api-test/bin/Debug/net9.0/Supabase.Postgrest.dll +/Users/baez/sources/code.icb4dc0.de/prskr/supabase-operator/testdata/dotnet-client/test/supabase-integration.api-test/bin/Debug/net9.0/Supabase.Realtime.dll +/Users/baez/sources/code.icb4dc0.de/prskr/supabase-operator/testdata/dotnet-client/test/supabase-integration.api-test/bin/Debug/net9.0/Supabase.Storage.dll +/Users/baez/sources/code.icb4dc0.de/prskr/supabase-operator/testdata/dotnet-client/test/supabase-integration.api-test/bin/Debug/net9.0/System.IdentityModel.Tokens.Jwt.dll +/Users/baez/sources/code.icb4dc0.de/prskr/supabase-operator/testdata/dotnet-client/test/supabase-integration.api-test/bin/Debug/net9.0/System.Reactive.dll +/Users/baez/sources/code.icb4dc0.de/prskr/supabase-operator/testdata/dotnet-client/test/supabase-integration.api-test/bin/Debug/net9.0/TUnit.dll +/Users/baez/sources/code.icb4dc0.de/prskr/supabase-operator/testdata/dotnet-client/test/supabase-integration.api-test/bin/Debug/net9.0/TUnit.Assertions.dll +/Users/baez/sources/code.icb4dc0.de/prskr/supabase-operator/testdata/dotnet-client/test/supabase-integration.api-test/bin/Debug/net9.0/TUnit.Core.dll +/Users/baez/sources/code.icb4dc0.de/prskr/supabase-operator/testdata/dotnet-client/test/supabase-integration.api-test/bin/Debug/net9.0/TUnit.Engine.dll +/Users/baez/sources/code.icb4dc0.de/prskr/supabase-operator/testdata/dotnet-client/test/supabase-integration.api-test/bin/Debug/net9.0/Websocket.Client.dll +/Users/baez/sources/code.icb4dc0.de/prskr/supabase-operator/testdata/dotnet-client/test/supabase-integration.api-test/bin/Debug/net9.0/cs/Microsoft.Testing.Platform.resources.dll +/Users/baez/sources/code.icb4dc0.de/prskr/supabase-operator/testdata/dotnet-client/test/supabase-integration.api-test/bin/Debug/net9.0/de/Microsoft.Testing.Platform.resources.dll +/Users/baez/sources/code.icb4dc0.de/prskr/supabase-operator/testdata/dotnet-client/test/supabase-integration.api-test/bin/Debug/net9.0/es/Microsoft.Testing.Platform.resources.dll +/Users/baez/sources/code.icb4dc0.de/prskr/supabase-operator/testdata/dotnet-client/test/supabase-integration.api-test/bin/Debug/net9.0/fr/Microsoft.Testing.Platform.resources.dll +/Users/baez/sources/code.icb4dc0.de/prskr/supabase-operator/testdata/dotnet-client/test/supabase-integration.api-test/bin/Debug/net9.0/it/Microsoft.Testing.Platform.resources.dll +/Users/baez/sources/code.icb4dc0.de/prskr/supabase-operator/testdata/dotnet-client/test/supabase-integration.api-test/bin/Debug/net9.0/ja/Microsoft.Testing.Platform.resources.dll +/Users/baez/sources/code.icb4dc0.de/prskr/supabase-operator/testdata/dotnet-client/test/supabase-integration.api-test/bin/Debug/net9.0/ko/Microsoft.Testing.Platform.resources.dll +/Users/baez/sources/code.icb4dc0.de/prskr/supabase-operator/testdata/dotnet-client/test/supabase-integration.api-test/bin/Debug/net9.0/pl/Microsoft.Testing.Platform.resources.dll +/Users/baez/sources/code.icb4dc0.de/prskr/supabase-operator/testdata/dotnet-client/test/supabase-integration.api-test/bin/Debug/net9.0/pt-BR/Microsoft.Testing.Platform.resources.dll +/Users/baez/sources/code.icb4dc0.de/prskr/supabase-operator/testdata/dotnet-client/test/supabase-integration.api-test/bin/Debug/net9.0/ru/Microsoft.Testing.Platform.resources.dll +/Users/baez/sources/code.icb4dc0.de/prskr/supabase-operator/testdata/dotnet-client/test/supabase-integration.api-test/bin/Debug/net9.0/tr/Microsoft.Testing.Platform.resources.dll +/Users/baez/sources/code.icb4dc0.de/prskr/supabase-operator/testdata/dotnet-client/test/supabase-integration.api-test/bin/Debug/net9.0/zh-Hans/Microsoft.Testing.Platform.resources.dll +/Users/baez/sources/code.icb4dc0.de/prskr/supabase-operator/testdata/dotnet-client/test/supabase-integration.api-test/bin/Debug/net9.0/zh-Hant/Microsoft.Testing.Platform.resources.dll +/Users/baez/sources/code.icb4dc0.de/prskr/supabase-operator/testdata/dotnet-client/test/supabase-integration.api-test/bin/Debug/net9.0/cs/Microsoft.Testing.Platform.MSBuild.resources.dll +/Users/baez/sources/code.icb4dc0.de/prskr/supabase-operator/testdata/dotnet-client/test/supabase-integration.api-test/bin/Debug/net9.0/de/Microsoft.Testing.Platform.MSBuild.resources.dll +/Users/baez/sources/code.icb4dc0.de/prskr/supabase-operator/testdata/dotnet-client/test/supabase-integration.api-test/bin/Debug/net9.0/es/Microsoft.Testing.Platform.MSBuild.resources.dll +/Users/baez/sources/code.icb4dc0.de/prskr/supabase-operator/testdata/dotnet-client/test/supabase-integration.api-test/bin/Debug/net9.0/fr/Microsoft.Testing.Platform.MSBuild.resources.dll +/Users/baez/sources/code.icb4dc0.de/prskr/supabase-operator/testdata/dotnet-client/test/supabase-integration.api-test/bin/Debug/net9.0/it/Microsoft.Testing.Platform.MSBuild.resources.dll +/Users/baez/sources/code.icb4dc0.de/prskr/supabase-operator/testdata/dotnet-client/test/supabase-integration.api-test/bin/Debug/net9.0/ja/Microsoft.Testing.Platform.MSBuild.resources.dll +/Users/baez/sources/code.icb4dc0.de/prskr/supabase-operator/testdata/dotnet-client/test/supabase-integration.api-test/bin/Debug/net9.0/ko/Microsoft.Testing.Platform.MSBuild.resources.dll +/Users/baez/sources/code.icb4dc0.de/prskr/supabase-operator/testdata/dotnet-client/test/supabase-integration.api-test/bin/Debug/net9.0/pl/Microsoft.Testing.Platform.MSBuild.resources.dll +/Users/baez/sources/code.icb4dc0.de/prskr/supabase-operator/testdata/dotnet-client/test/supabase-integration.api-test/bin/Debug/net9.0/pt-BR/Microsoft.Testing.Platform.MSBuild.resources.dll +/Users/baez/sources/code.icb4dc0.de/prskr/supabase-operator/testdata/dotnet-client/test/supabase-integration.api-test/bin/Debug/net9.0/ru/Microsoft.Testing.Platform.MSBuild.resources.dll +/Users/baez/sources/code.icb4dc0.de/prskr/supabase-operator/testdata/dotnet-client/test/supabase-integration.api-test/bin/Debug/net9.0/tr/Microsoft.Testing.Platform.MSBuild.resources.dll +/Users/baez/sources/code.icb4dc0.de/prskr/supabase-operator/testdata/dotnet-client/test/supabase-integration.api-test/bin/Debug/net9.0/zh-Hans/Microsoft.Testing.Platform.MSBuild.resources.dll +/Users/baez/sources/code.icb4dc0.de/prskr/supabase-operator/testdata/dotnet-client/test/supabase-integration.api-test/bin/Debug/net9.0/zh-Hant/Microsoft.Testing.Platform.MSBuild.resources.dll +/Users/baez/sources/code.icb4dc0.de/prskr/supabase-operator/testdata/dotnet-client/test/supabase-integration.api-test/obj/Debug/net9.0/supabase.88E5058B.Up2Date +/Users/baez/sources/code.icb4dc0.de/prskr/supabase-operator/testdata/dotnet-client/test/supabase-integration.api-test/obj/Debug/net9.0/supabase-integration.api-test.dll +/Users/baez/sources/code.icb4dc0.de/prskr/supabase-operator/testdata/dotnet-client/test/supabase-integration.api-test/obj/Debug/net9.0/refint/supabase-integration.api-test.dll +/Users/baez/sources/code.icb4dc0.de/prskr/supabase-operator/testdata/dotnet-client/test/supabase-integration.api-test/obj/Debug/net9.0/supabase-integration.api-test.pdb +/Users/baez/sources/code.icb4dc0.de/prskr/supabase-operator/testdata/dotnet-client/test/supabase-integration.api-test/obj/Debug/net9.0/supabase-integration.api-test.genruntimeconfig.cache +/Users/baez/sources/code.icb4dc0.de/prskr/supabase-operator/testdata/dotnet-client/test/supabase-integration.api-test/obj/Debug/net9.0/ref/supabase-integration.api-test.dll diff --git a/testdata/dotnet-client/test/supabase-integration.api-test/obj/Debug/net9.0/supabase-integration.api-test.dll b/testdata/dotnet-client/test/supabase-integration.api-test/obj/Debug/net9.0/supabase-integration.api-test.dll new file mode 100644 index 0000000000000000000000000000000000000000..ea8a9691eead57466721142b2cf4faf61b77b695 GIT binary patch literal 18432 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 M?mw0Kzifg33F|ELv;Y7A literal 0 HcmV?d00001 diff --git a/testdata/dotnet-client/test/supabase-integration.api-test/obj/Debug/net9.0/supabase-integration.api-test.genautoregisteredextensionsinputcache.cache b/testdata/dotnet-client/test/supabase-integration.api-test/obj/Debug/net9.0/supabase-integration.api-test.genautoregisteredextensionsinputcache.cache new file mode 100644 index 0000000..be5f7c6 --- /dev/null +++ b/testdata/dotnet-client/test/supabase-integration.api-test/obj/Debug/net9.0/supabase-integration.api-test.genautoregisteredextensionsinputcache.cache @@ -0,0 +1 @@ +ac7cea3191876b400be0355099ee75cb19980b90abdf6abdaa74befcf3d99901 diff --git a/testdata/dotnet-client/test/supabase-integration.api-test/obj/Debug/net9.0/supabase-integration.api-test.genruntimeconfig.cache b/testdata/dotnet-client/test/supabase-integration.api-test/obj/Debug/net9.0/supabase-integration.api-test.genruntimeconfig.cache new file mode 100644 index 0000000..9a00829 --- /dev/null +++ b/testdata/dotnet-client/test/supabase-integration.api-test/obj/Debug/net9.0/supabase-integration.api-test.genruntimeconfig.cache @@ -0,0 +1 @@ +24f9af8c04e70f6b6181eaa2f0ed1638767c3450d7387a035086bd4dfd85d781 diff --git a/testdata/dotnet-client/test/supabase-integration.api-test/obj/Debug/net9.0/supabase-integration.api-test.gentestingplatformentrypointinputcache.cache b/testdata/dotnet-client/test/supabase-integration.api-test/obj/Debug/net9.0/supabase-integration.api-test.gentestingplatformentrypointinputcache.cache new file mode 100644 index 0000000..be5f7c6 --- /dev/null +++ b/testdata/dotnet-client/test/supabase-integration.api-test/obj/Debug/net9.0/supabase-integration.api-test.gentestingplatformentrypointinputcache.cache @@ -0,0 +1 @@ +ac7cea3191876b400be0355099ee75cb19980b90abdf6abdaa74befcf3d99901 diff --git a/testdata/dotnet-client/test/supabase-integration.api-test/obj/Debug/net9.0/supabase-integration.api-test.pdb b/testdata/dotnet-client/test/supabase-integration.api-test/obj/Debug/net9.0/supabase-integration.api-test.pdb new file mode 100644 index 0000000000000000000000000000000000000000..4e1bea5a08c57251a283e6349c17c09f185ba3ce GIT binary patch literal 16264 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 YxF`d8I*=s-kNrxIL$x7|b~w2FAC>00?*IS* literal 0 HcmV?d00001 diff --git a/testdata/dotnet-client/test/supabase-integration.api-test/obj/Debug/net9.0/supabase.88E5058B.Up2Date b/testdata/dotnet-client/test/supabase-integration.api-test/obj/Debug/net9.0/supabase.88E5058B.Up2Date new file mode 100644 index 0000000..e69de29 diff --git a/testdata/dotnet-client/test/supabase-integration.api-test/obj/project.assets.json b/testdata/dotnet-client/test/supabase-integration.api-test/obj/project.assets.json new file mode 100644 index 0000000..ebe4b35 --- /dev/null +++ b/testdata/dotnet-client/test/supabase-integration.api-test/obj/project.assets.json @@ -0,0 +1,2176 @@ +{ + "version": 3, + "targets": { + "net9.0": { + "EnumerableAsyncProcessor/2.0.6": { + "type": "package", + "compile": { + "lib/net9.0/EnumerableAsyncProcessor.dll": {} + }, + "runtime": { + "lib/net9.0/EnumerableAsyncProcessor.dll": {} + } + }, + "Microsoft.DiaSymReader/2.0.0": { + "type": "package", + "compile": { + "lib/netstandard2.0/Microsoft.DiaSymReader.dll": { + "related": ".pdb;.xml" + } + }, + "runtime": { + "lib/netstandard2.0/Microsoft.DiaSymReader.dll": { + "related": ".pdb;.xml" + } + } + }, + "Microsoft.Extensions.DependencyInjection.Abstractions/8.0.0": { + "type": "package", + "compile": { + "lib/net8.0/Microsoft.Extensions.DependencyInjection.Abstractions.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/net8.0/Microsoft.Extensions.DependencyInjection.Abstractions.dll": { + "related": ".xml" + } + }, + "build": { + "buildTransitive/net6.0/_._": {} + } + }, + "Microsoft.Extensions.DependencyModel/6.0.1": { + "type": "package", + "dependencies": { + "System.Buffers": "4.5.1", + "System.Memory": "4.5.4", + "System.Runtime.CompilerServices.Unsafe": "6.0.0", + "System.Text.Encodings.Web": "6.0.0", + "System.Text.Json": "6.0.10" + }, + "compile": { + "lib/netstandard2.0/Microsoft.Extensions.DependencyModel.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/netstandard2.0/Microsoft.Extensions.DependencyModel.dll": { + "related": ".xml" + } + } + }, + "Microsoft.Extensions.Logging.Abstractions/8.0.0": { + "type": "package", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0" + }, + "compile": { + "lib/net8.0/Microsoft.Extensions.Logging.Abstractions.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/net8.0/Microsoft.Extensions.Logging.Abstractions.dll": { + "related": ".xml" + } + }, + "build": { + "buildTransitive/net6.0/Microsoft.Extensions.Logging.Abstractions.targets": {} + } + }, + "Microsoft.IdentityModel.Abstractions/7.5.1": { + "type": "package", + "compile": { + "lib/net8.0/Microsoft.IdentityModel.Abstractions.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/net8.0/Microsoft.IdentityModel.Abstractions.dll": { + "related": ".xml" + } + } + }, + "Microsoft.IdentityModel.JsonWebTokens/7.5.1": { + "type": "package", + "dependencies": { + "Microsoft.IdentityModel.Tokens": "7.5.1" + }, + "compile": { + "lib/net8.0/Microsoft.IdentityModel.JsonWebTokens.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/net8.0/Microsoft.IdentityModel.JsonWebTokens.dll": { + "related": ".xml" + } + } + }, + "Microsoft.IdentityModel.Logging/7.5.1": { + "type": "package", + "dependencies": { + "Microsoft.IdentityModel.Abstractions": "7.5.1" + }, + "compile": { + "lib/net8.0/Microsoft.IdentityModel.Logging.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/net8.0/Microsoft.IdentityModel.Logging.dll": { + "related": ".xml" + } + } + }, + "Microsoft.IdentityModel.Tokens/7.5.1": { + "type": "package", + "dependencies": { + "Microsoft.IdentityModel.Logging": "7.5.1" + }, + "compile": { + "lib/net8.0/Microsoft.IdentityModel.Tokens.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/net8.0/Microsoft.IdentityModel.Tokens.dll": { + "related": ".xml" + } + } + }, + "Microsoft.IO.RecyclableMemoryStream/3.0.0": { + "type": "package", + "compile": { + "lib/net6.0/Microsoft.IO.RecyclableMemoryStream.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/net6.0/Microsoft.IO.RecyclableMemoryStream.dll": { + "related": ".xml" + } + } + }, + "Microsoft.Testing.Extensions.CodeCoverage/17.13.1": { + "type": "package", + "dependencies": { + "Microsoft.DiaSymReader": "2.0.0", + "Microsoft.Extensions.DependencyModel": "6.0.1", + "Microsoft.Testing.Platform": "1.4.3", + "Newtonsoft.Json": "13.0.3", + "System.Reflection.Metadata": "8.0.0" + }, + "compile": { + "lib/net6.0/Microsoft.CodeCoverage.Core.dll": {}, + "lib/net6.0/Microsoft.CodeCoverage.Instrumentation.Core.dll": {}, + "lib/net6.0/Microsoft.CodeCoverage.Instrumentation.dll": {}, + "lib/net6.0/Microsoft.CodeCoverage.Interprocess.dll": {}, + "lib/net6.0/Microsoft.Testing.Extensions.CodeCoverage.dll": { + "related": ".pdb" + }, + "lib/net6.0/Microsoft.VisualStudio.CodeCoverage.Shim.dll": {}, + "lib/net6.0/Mono.Cecil.Mdb.dll": {}, + "lib/net6.0/Mono.Cecil.Pdb.dll": {}, + "lib/net6.0/Mono.Cecil.Rocks.dll": {}, + "lib/net6.0/Mono.Cecil.dll": {} + }, + "runtime": { + "lib/net6.0/Microsoft.CodeCoverage.Core.dll": {}, + "lib/net6.0/Microsoft.CodeCoverage.Instrumentation.Core.dll": {}, + "lib/net6.0/Microsoft.CodeCoverage.Instrumentation.dll": {}, + "lib/net6.0/Microsoft.CodeCoverage.Interprocess.dll": {}, + "lib/net6.0/Microsoft.Testing.Extensions.CodeCoverage.dll": { + "related": ".pdb" + }, + "lib/net6.0/Microsoft.VisualStudio.CodeCoverage.Shim.dll": {}, + "lib/net6.0/Mono.Cecil.Mdb.dll": {}, + "lib/net6.0/Mono.Cecil.Pdb.dll": {}, + "lib/net6.0/Mono.Cecil.Rocks.dll": {}, + "lib/net6.0/Mono.Cecil.dll": {} + }, + "resource": { + "lib/net6.0/cs/Microsoft.Testing.Extensions.CodeCoverage.resources.dll": { + "locale": "cs" + }, + "lib/net6.0/de/Microsoft.Testing.Extensions.CodeCoverage.resources.dll": { + "locale": "de" + }, + "lib/net6.0/es/Microsoft.Testing.Extensions.CodeCoverage.resources.dll": { + "locale": "es" + }, + "lib/net6.0/fr/Microsoft.Testing.Extensions.CodeCoverage.resources.dll": { + "locale": "fr" + }, + "lib/net6.0/it/Microsoft.Testing.Extensions.CodeCoverage.resources.dll": { + "locale": "it" + }, + "lib/net6.0/ja/Microsoft.Testing.Extensions.CodeCoverage.resources.dll": { + "locale": "ja" + }, + "lib/net6.0/ko/Microsoft.Testing.Extensions.CodeCoverage.resources.dll": { + "locale": "ko" + }, + "lib/net6.0/pl/Microsoft.Testing.Extensions.CodeCoverage.resources.dll": { + "locale": "pl" + }, + "lib/net6.0/pt-BR/Microsoft.Testing.Extensions.CodeCoverage.resources.dll": { + "locale": "pt-BR" + }, + "lib/net6.0/ru/Microsoft.Testing.Extensions.CodeCoverage.resources.dll": { + "locale": "ru" + }, + "lib/net6.0/tr/Microsoft.Testing.Extensions.CodeCoverage.resources.dll": { + "locale": "tr" + }, + "lib/net6.0/zh-Hans/Microsoft.Testing.Extensions.CodeCoverage.resources.dll": { + "locale": "zh-Hans" + }, + "lib/net6.0/zh-Hant/Microsoft.Testing.Extensions.CodeCoverage.resources.dll": { + "locale": "zh-Hant" + } + }, + "build": { + "buildTransitive/net6.0/Microsoft.Testing.Extensions.CodeCoverage.props": {}, + "buildTransitive/net6.0/Microsoft.Testing.Extensions.CodeCoverage.targets": {} + }, + "buildMultiTargeting": { + "buildMultiTargeting/Microsoft.Testing.Extensions.CodeCoverage.props": {}, + "buildMultiTargeting/Microsoft.Testing.Extensions.CodeCoverage.targets": {} + }, + "runtimeTargets": { + "runtimes/linux-musl-x64/native/Cov_x64.config": { + "assetType": "native", + "rid": "linux-musl-x64" + }, + "runtimes/linux-musl-x64/native/libCoverageInstrumentationMethod.so": { + "assetType": "native", + "rid": "linux-musl-x64" + }, + "runtimes/linux-musl-x64/native/libInstrumentationEngine.so": { + "assetType": "native", + "rid": "linux-musl-x64" + }, + "runtimes/linux-x64/native/Cov_x64.config": { + "assetType": "native", + "rid": "linux-x64" + }, + "runtimes/linux-x64/native/libCoverageInstrumentationMethod.so": { + "assetType": "native", + "rid": "linux-x64" + }, + "runtimes/linux-x64/native/libInstrumentationEngine.so": { + "assetType": "native", + "rid": "linux-x64" + }, + "runtimes/osx-x64/native/Cov_x64.config": { + "assetType": "native", + "rid": "osx-x64" + }, + "runtimes/osx-x64/native/libCoverageInstrumentationMethod.dylib": { + "assetType": "native", + "rid": "osx-x64" + }, + "runtimes/osx-x64/native/libInstrumentationEngine.dylib": { + "assetType": "native", + "rid": "osx-x64" + }, + "runtimes/win-arm64/native/CodeCoverageMessages.dll": { + "assetType": "native", + "rid": "win-arm64" + }, + "runtimes/win-arm64/native/Cov_arm64.config": { + "assetType": "native", + "rid": "win-arm64" + }, + "runtimes/win-arm64/native/Cov_x64.config": { + "assetType": "native", + "rid": "win-arm64" + }, + "runtimes/win-arm64/native/Cov_x86.config": { + "assetType": "native", + "rid": "win-arm64" + }, + "runtimes/win-arm64/native/MicrosoftInstrumentationEngine_arm64.dll": { + "assetType": "native", + "rid": "win-arm64" + }, + "runtimes/win-arm64/native/MicrosoftInstrumentationEngine_x64.dll": { + "assetType": "native", + "rid": "win-arm64" + }, + "runtimes/win-arm64/native/MicrosoftInstrumentationEngine_x86.dll": { + "assetType": "native", + "rid": "win-arm64" + }, + "runtimes/win-arm64/native/covrun32.dll": { + "assetType": "native", + "rid": "win-arm64" + }, + "runtimes/win-arm64/native/covrun64.dll": { + "assetType": "native", + "rid": "win-arm64" + }, + "runtimes/win-arm64/native/covrunarm64.dll": { + "assetType": "native", + "rid": "win-arm64" + }, + "runtimes/win-arm64/native/msdia140.dll": { + "assetType": "native", + "rid": "win-arm64" + }, + "runtimes/win-x64/native/CodeCoverageMessages.dll": { + "assetType": "native", + "rid": "win-x64" + }, + "runtimes/win-x64/native/Cov_arm64.config": { + "assetType": "native", + "rid": "win-x64" + }, + "runtimes/win-x64/native/Cov_x64.config": { + "assetType": "native", + "rid": "win-x64" + }, + "runtimes/win-x64/native/Cov_x86.config": { + "assetType": "native", + "rid": "win-x64" + }, + "runtimes/win-x64/native/MicrosoftInstrumentationEngine_arm64.dll": { + "assetType": "native", + "rid": "win-x64" + }, + "runtimes/win-x64/native/MicrosoftInstrumentationEngine_x64.dll": { + "assetType": "native", + "rid": "win-x64" + }, + "runtimes/win-x64/native/MicrosoftInstrumentationEngine_x86.dll": { + "assetType": "native", + "rid": "win-x64" + }, + "runtimes/win-x64/native/covrun32.dll": { + "assetType": "native", + "rid": "win-x64" + }, + "runtimes/win-x64/native/covrun64.dll": { + "assetType": "native", + "rid": "win-x64" + }, + "runtimes/win-x64/native/covrunarm64.dll": { + "assetType": "native", + "rid": "win-x64" + }, + "runtimes/win-x64/native/msdia140.dll": { + "assetType": "native", + "rid": "win-x64" + }, + "runtimes/win-x86/native/CodeCoverageMessages.dll": { + "assetType": "native", + "rid": "win-x86" + }, + "runtimes/win-x86/native/Cov_arm64.config": { + "assetType": "native", + "rid": "win-x86" + }, + "runtimes/win-x86/native/Cov_x64.config": { + "assetType": "native", + "rid": "win-x86" + }, + "runtimes/win-x86/native/Cov_x86.config": { + "assetType": "native", + "rid": "win-x86" + }, + "runtimes/win-x86/native/MicrosoftInstrumentationEngine_arm64.dll": { + "assetType": "native", + "rid": "win-x86" + }, + "runtimes/win-x86/native/MicrosoftInstrumentationEngine_x64.dll": { + "assetType": "native", + "rid": "win-x86" + }, + "runtimes/win-x86/native/MicrosoftInstrumentationEngine_x86.dll": { + "assetType": "native", + "rid": "win-x86" + }, + "runtimes/win-x86/native/covrun32.dll": { + "assetType": "native", + "rid": "win-x86" + }, + "runtimes/win-x86/native/covrun64.dll": { + "assetType": "native", + "rid": "win-x86" + }, + "runtimes/win-x86/native/covrunarm64.dll": { + "assetType": "native", + "rid": "win-x86" + }, + "runtimes/win-x86/native/msdia140.dll": { + "assetType": "native", + "rid": "win-x86" + } + } + }, + "Microsoft.Testing.Extensions.TrxReport.Abstractions/1.4.3": { + "type": "package", + "dependencies": { + "Microsoft.Testing.Platform": "1.4.3" + }, + "compile": { + "lib/net8.0/Microsoft.Testing.Extensions.TrxReport.Abstractions.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/net8.0/Microsoft.Testing.Extensions.TrxReport.Abstractions.dll": { + "related": ".xml" + } + } + }, + "Microsoft.Testing.Platform/1.4.3": { + "type": "package", + "compile": { + "lib/net8.0/Microsoft.Testing.Platform.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/net8.0/Microsoft.Testing.Platform.dll": { + "related": ".xml" + } + }, + "resource": { + "lib/net8.0/cs/Microsoft.Testing.Platform.resources.dll": { + "locale": "cs" + }, + "lib/net8.0/de/Microsoft.Testing.Platform.resources.dll": { + "locale": "de" + }, + "lib/net8.0/es/Microsoft.Testing.Platform.resources.dll": { + "locale": "es" + }, + "lib/net8.0/fr/Microsoft.Testing.Platform.resources.dll": { + "locale": "fr" + }, + "lib/net8.0/it/Microsoft.Testing.Platform.resources.dll": { + "locale": "it" + }, + "lib/net8.0/ja/Microsoft.Testing.Platform.resources.dll": { + "locale": "ja" + }, + "lib/net8.0/ko/Microsoft.Testing.Platform.resources.dll": { + "locale": "ko" + }, + "lib/net8.0/pl/Microsoft.Testing.Platform.resources.dll": { + "locale": "pl" + }, + "lib/net8.0/pt-BR/Microsoft.Testing.Platform.resources.dll": { + "locale": "pt-BR" + }, + "lib/net8.0/ru/Microsoft.Testing.Platform.resources.dll": { + "locale": "ru" + }, + "lib/net8.0/tr/Microsoft.Testing.Platform.resources.dll": { + "locale": "tr" + }, + "lib/net8.0/zh-Hans/Microsoft.Testing.Platform.resources.dll": { + "locale": "zh-Hans" + }, + "lib/net8.0/zh-Hant/Microsoft.Testing.Platform.resources.dll": { + "locale": "zh-Hant" + } + }, + "build": { + "buildTransitive/net8.0/Microsoft.Testing.Platform.props": {} + }, + "buildMultiTargeting": { + "buildMultiTargeting/Microsoft.Testing.Platform.props": {} + } + }, + "Microsoft.Testing.Platform.MSBuild/1.4.3": { + "type": "package", + "dependencies": { + "Microsoft.Testing.Platform": "1.4.3" + }, + "compile": { + "lib/net8.0/Microsoft.Testing.Platform.MSBuild.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/net8.0/Microsoft.Testing.Platform.MSBuild.dll": { + "related": ".xml" + } + }, + "resource": { + "lib/net8.0/cs/Microsoft.Testing.Platform.MSBuild.resources.dll": { + "locale": "cs" + }, + "lib/net8.0/de/Microsoft.Testing.Platform.MSBuild.resources.dll": { + "locale": "de" + }, + "lib/net8.0/es/Microsoft.Testing.Platform.MSBuild.resources.dll": { + "locale": "es" + }, + "lib/net8.0/fr/Microsoft.Testing.Platform.MSBuild.resources.dll": { + "locale": "fr" + }, + "lib/net8.0/it/Microsoft.Testing.Platform.MSBuild.resources.dll": { + "locale": "it" + }, + "lib/net8.0/ja/Microsoft.Testing.Platform.MSBuild.resources.dll": { + "locale": "ja" + }, + "lib/net8.0/ko/Microsoft.Testing.Platform.MSBuild.resources.dll": { + "locale": "ko" + }, + "lib/net8.0/pl/Microsoft.Testing.Platform.MSBuild.resources.dll": { + "locale": "pl" + }, + "lib/net8.0/pt-BR/Microsoft.Testing.Platform.MSBuild.resources.dll": { + "locale": "pt-BR" + }, + "lib/net8.0/ru/Microsoft.Testing.Platform.MSBuild.resources.dll": { + "locale": "ru" + }, + "lib/net8.0/tr/Microsoft.Testing.Platform.MSBuild.resources.dll": { + "locale": "tr" + }, + "lib/net8.0/zh-Hans/Microsoft.Testing.Platform.MSBuild.resources.dll": { + "locale": "zh-Hans" + }, + "lib/net8.0/zh-Hant/Microsoft.Testing.Platform.MSBuild.resources.dll": { + "locale": "zh-Hant" + } + }, + "build": { + "buildTransitive/net8.0/Microsoft.Testing.Platform.MSBuild.props": {}, + "buildTransitive/net8.0/Microsoft.Testing.Platform.MSBuild.targets": {} + }, + "buildMultiTargeting": { + "buildMultiTargeting/Microsoft.Testing.Platform.MSBuild.props": {}, + "buildMultiTargeting/Microsoft.Testing.Platform.MSBuild.targets": {} + } + }, + "MimeMapping/3.0.1": { + "type": "package", + "compile": { + "lib/netstandard2.0/MimeMapping.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/netstandard2.0/MimeMapping.dll": { + "related": ".xml" + } + } + }, + "Newtonsoft.Json/13.0.3": { + "type": "package", + "compile": { + "lib/net6.0/Newtonsoft.Json.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/net6.0/Newtonsoft.Json.dll": { + "related": ".xml" + } + } + }, + "Supabase/1.1.1": { + "type": "package", + "dependencies": { + "Newtonsoft.Json": "13.0.3", + "Supabase.Core": "1.0.0", + "Supabase.Functions": "2.0.0", + "Supabase.Gotrue": "6.0.3", + "Supabase.Postgrest": "4.0.3", + "Supabase.Realtime": "7.0.2", + "Supabase.Storage": "2.0.2" + }, + "compile": { + "lib/netstandard2.1/Supabase.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/netstandard2.1/Supabase.dll": { + "related": ".xml" + } + } + }, + "Supabase.Core/1.0.0": { + "type": "package", + "compile": { + "lib/netstandard2.0/Supabase.Core.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/netstandard2.0/Supabase.Core.dll": { + "related": ".xml" + } + } + }, + "Supabase.Functions/2.0.0": { + "type": "package", + "dependencies": { + "Newtonsoft.Json": "13.0.3", + "Supabase.Core": "1.0.0" + }, + "compile": { + "lib/netstandard2.0/Supabase.Functions.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/netstandard2.0/Supabase.Functions.dll": { + "related": ".xml" + } + } + }, + "Supabase.Gotrue/6.0.3": { + "type": "package", + "dependencies": { + "Newtonsoft.Json": "13.0.3", + "Supabase.Core": "1.0.0", + "System.IdentityModel.Tokens.Jwt": "7.5.1" + }, + "compile": { + "lib/netstandard2.1/Supabase.Gotrue.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/netstandard2.1/Supabase.Gotrue.dll": { + "related": ".xml" + } + } + }, + "Supabase.Postgrest/4.0.3": { + "type": "package", + "dependencies": { + "Newtonsoft.Json": "13.0.3", + "Supabase.Core": "1.0.0" + }, + "compile": { + "lib/netstandard2.0/Supabase.Postgrest.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/netstandard2.0/Supabase.Postgrest.dll": { + "related": ".xml" + } + } + }, + "Supabase.Realtime/7.0.2": { + "type": "package", + "dependencies": { + "Newtonsoft.Json": "13.0.3", + "Supabase.Core": "1.0.0", + "Supabase.Postgrest": "4.0.3", + "Websocket.Client": "5.1.1" + }, + "compile": { + "lib/netstandard2.1/Supabase.Realtime.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/netstandard2.1/Supabase.Realtime.dll": { + "related": ".xml" + } + } + }, + "Supabase.Storage/2.0.2": { + "type": "package", + "dependencies": { + "MimeMapping": "3.0.1", + "Newtonsoft.Json": "13.0.3", + "Supabase.Core": "1.0.0" + }, + "compile": { + "lib/netstandard2.0/Supabase.Storage.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/netstandard2.0/Supabase.Storage.dll": { + "related": ".xml" + } + } + }, + "System.Buffers/4.5.1": { + "type": "package", + "compile": { + "ref/netcoreapp2.0/_._": {} + }, + "runtime": { + "lib/netcoreapp2.0/_._": {} + } + }, + "System.Collections.Immutable/8.0.0": { + "type": "package", + "compile": { + "lib/net8.0/System.Collections.Immutable.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/net8.0/System.Collections.Immutable.dll": { + "related": ".xml" + } + }, + "build": { + "buildTransitive/net6.0/_._": {} + } + }, + "System.IdentityModel.Tokens.Jwt/7.5.1": { + "type": "package", + "dependencies": { + "Microsoft.IdentityModel.JsonWebTokens": "7.5.1", + "Microsoft.IdentityModel.Tokens": "7.5.1" + }, + "compile": { + "lib/net8.0/System.IdentityModel.Tokens.Jwt.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/net8.0/System.IdentityModel.Tokens.Jwt.dll": { + "related": ".xml" + } + } + }, + "System.Memory/4.5.4": { + "type": "package", + "compile": { + "ref/netcoreapp2.1/_._": {} + }, + "runtime": { + "lib/netcoreapp2.1/_._": {} + } + }, + "System.Reactive/6.0.0": { + "type": "package", + "compile": { + "lib/net6.0/System.Reactive.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/net6.0/System.Reactive.dll": { + "related": ".xml" + } + }, + "build": { + "buildTransitive/net6.0/_._": {} + } + }, + "System.Reflection.Metadata/8.0.0": { + "type": "package", + "dependencies": { + "System.Collections.Immutable": "8.0.0" + }, + "compile": { + "lib/net8.0/System.Reflection.Metadata.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/net8.0/System.Reflection.Metadata.dll": { + "related": ".xml" + } + }, + "build": { + "buildTransitive/net6.0/_._": {} + } + }, + "System.Runtime.CompilerServices.Unsafe/6.0.0": { + "type": "package", + "compile": { + "lib/net6.0/System.Runtime.CompilerServices.Unsafe.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/net6.0/System.Runtime.CompilerServices.Unsafe.dll": { + "related": ".xml" + } + }, + "build": { + "buildTransitive/netcoreapp3.1/_._": {} + } + }, + "System.Text.Encodings.Web/6.0.0": { + "type": "package", + "dependencies": { + "System.Runtime.CompilerServices.Unsafe": "6.0.0" + }, + "compile": { + "lib/net6.0/System.Text.Encodings.Web.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/net6.0/System.Text.Encodings.Web.dll": { + "related": ".xml" + } + }, + "build": { + "buildTransitive/netcoreapp3.1/_._": {} + }, + "runtimeTargets": { + "runtimes/browser/lib/net6.0/System.Text.Encodings.Web.dll": { + "assetType": "runtime", + "rid": "browser" + } + } + }, + "System.Text.Json/6.0.10": { + "type": "package", + "dependencies": { + "System.Runtime.CompilerServices.Unsafe": "6.0.0", + "System.Text.Encodings.Web": "6.0.0" + }, + "compile": { + "lib/net6.0/System.Text.Json.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/net6.0/System.Text.Json.dll": { + "related": ".xml" + } + }, + "build": { + "buildTransitive/netcoreapp3.1/System.Text.Json.targets": {} + } + }, + "System.Threading.Channels/8.0.0": { + "type": "package", + "compile": { + "lib/net8.0/System.Threading.Channels.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/net8.0/System.Threading.Channels.dll": { + "related": ".xml" + } + }, + "build": { + "buildTransitive/net6.0/_._": {} + } + }, + "TUnit/0.6.123": { + "type": "package", + "dependencies": { + "TUnit.Assertions": "0.6.123", + "TUnit.Engine": "0.6.123" + }, + "compile": { + "lib/net9.0/TUnit.dll": {} + }, + "runtime": { + "lib/net9.0/TUnit.dll": {} + } + }, + "TUnit.Assertions/0.6.123": { + "type": "package", + "compile": { + "lib/net9.0/TUnit.Assertions.dll": {} + }, + "runtime": { + "lib/net9.0/TUnit.Assertions.dll": {} + }, + "build": { + "buildTransitive/net9.0/TUnit.Assertions.props": {}, + "buildTransitive/net9.0/TUnit.Assertions.targets": {} + } + }, + "TUnit.Core/0.6.123": { + "type": "package", + "compile": { + "lib/net9.0/TUnit.Core.dll": {} + }, + "runtime": { + "lib/net9.0/TUnit.Core.dll": {} + }, + "build": { + "buildTransitive/net9.0/TUnit.Core.props": {}, + "buildTransitive/net9.0/TUnit.Core.targets": {} + } + }, + "TUnit.Engine/0.6.123": { + "type": "package", + "dependencies": { + "EnumerableAsyncProcessor": "2.0.6", + "Microsoft.Testing.Extensions.TrxReport.Abstractions": "1.4.3", + "Microsoft.Testing.Platform": "1.4.3", + "Microsoft.Testing.Platform.MSBuild": "1.4.3", + "TUnit.Core": "0.6.123" + }, + "compile": { + "lib/net9.0/TUnit.Engine.dll": {} + }, + "runtime": { + "lib/net9.0/TUnit.Engine.dll": {} + }, + "build": { + "buildTransitive/net9.0/TUnit.Engine.props": {} + } + }, + "Websocket.Client/5.1.1": { + "type": "package", + "dependencies": { + "Microsoft.Extensions.Logging.Abstractions": "8.0.0", + "Microsoft.IO.RecyclableMemoryStream": "3.0.0", + "System.Reactive": "6.0.0", + "System.Threading.Channels": "8.0.0" + }, + "compile": { + "lib/net8.0/Websocket.Client.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/net8.0/Websocket.Client.dll": { + "related": ".xml" + } + } + } + } + }, + "libraries": { + "EnumerableAsyncProcessor/2.0.6": { + "sha512": "aBVYAcgpc/SODIXmXbWU2ua0Y03G5NYJL3pDl4Q6Tqjv6579vQCaK0LIwKDtIVVHU9Q26eZzZOT8GVcC1bZAiQ==", + "type": "package", + "path": "enumerableasyncprocessor/2.0.6", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "README.md", + "enumerableasyncprocessor.2.0.6.nupkg.sha512", + "enumerableasyncprocessor.nuspec", + "lib/net6.0/EnumerableAsyncProcessor.dll", + "lib/net8.0/EnumerableAsyncProcessor.dll", + "lib/net9.0/EnumerableAsyncProcessor.dll", + "lib/netstandard2.0/EnumerableAsyncProcessor.dll" + ] + }, + "Microsoft.DiaSymReader/2.0.0": { + "sha512": "QcZrCETsBJqy/vQpFtJc+jSXQ0K5sucQ6NUFbTNVHD4vfZZOwjZ/3sBzczkC4DityhD3AVO/+K/+9ioLs1AgRA==", + "type": "package", + "path": "microsoft.diasymreader/2.0.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "Icon.png", + "lib/netstandard2.0/Microsoft.DiaSymReader.dll", + "lib/netstandard2.0/Microsoft.DiaSymReader.pdb", + "lib/netstandard2.0/Microsoft.DiaSymReader.xml", + "microsoft.diasymreader.2.0.0.nupkg.sha512", + "microsoft.diasymreader.nuspec" + ] + }, + "Microsoft.Extensions.DependencyInjection.Abstractions/8.0.0": { + "sha512": "cjWrLkJXK0rs4zofsK4bSdg+jhDLTaxrkXu4gS6Y7MAlCvRyNNgwY/lJi5RDlQOnSZweHqoyvgvbdvQsRIW+hg==", + "type": "package", + "path": "microsoft.extensions.dependencyinjection.abstractions/8.0.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "Icon.png", + "LICENSE.TXT", + "PACKAGE.md", + "THIRD-PARTY-NOTICES.TXT", + "buildTransitive/net461/Microsoft.Extensions.DependencyInjection.Abstractions.targets", + "buildTransitive/net462/_._", + "buildTransitive/net6.0/_._", + "buildTransitive/netcoreapp2.0/Microsoft.Extensions.DependencyInjection.Abstractions.targets", + "lib/net462/Microsoft.Extensions.DependencyInjection.Abstractions.dll", + "lib/net462/Microsoft.Extensions.DependencyInjection.Abstractions.xml", + "lib/net6.0/Microsoft.Extensions.DependencyInjection.Abstractions.dll", + "lib/net6.0/Microsoft.Extensions.DependencyInjection.Abstractions.xml", + "lib/net7.0/Microsoft.Extensions.DependencyInjection.Abstractions.dll", + "lib/net7.0/Microsoft.Extensions.DependencyInjection.Abstractions.xml", + "lib/net8.0/Microsoft.Extensions.DependencyInjection.Abstractions.dll", + "lib/net8.0/Microsoft.Extensions.DependencyInjection.Abstractions.xml", + "lib/netstandard2.0/Microsoft.Extensions.DependencyInjection.Abstractions.dll", + "lib/netstandard2.0/Microsoft.Extensions.DependencyInjection.Abstractions.xml", + "lib/netstandard2.1/Microsoft.Extensions.DependencyInjection.Abstractions.dll", + "lib/netstandard2.1/Microsoft.Extensions.DependencyInjection.Abstractions.xml", + "microsoft.extensions.dependencyinjection.abstractions.8.0.0.nupkg.sha512", + "microsoft.extensions.dependencyinjection.abstractions.nuspec", + "useSharedDesignerContext.txt" + ] + }, + "Microsoft.Extensions.DependencyModel/6.0.1": { + "sha512": "AdvrtrqZpMgW4tIAQ/8gE1LAM/FjFY8JrFdyiolOf9WLEfN3WuFG1Hje6n0jqaOs3ldZFGWhatJQHJRrIOd++w==", + "type": "package", + "path": "microsoft.extensions.dependencymodel/6.0.1", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "Icon.png", + "LICENSE.TXT", + "THIRD-PARTY-NOTICES.TXT", + "lib/net461/Microsoft.Extensions.DependencyModel.dll", + "lib/net461/Microsoft.Extensions.DependencyModel.xml", + "lib/netstandard2.0/Microsoft.Extensions.DependencyModel.dll", + "lib/netstandard2.0/Microsoft.Extensions.DependencyModel.xml", + "microsoft.extensions.dependencymodel.6.0.1.nupkg.sha512", + "microsoft.extensions.dependencymodel.nuspec", + "useSharedDesignerContext.txt" + ] + }, + "Microsoft.Extensions.Logging.Abstractions/8.0.0": { + "sha512": "arDBqTgFCyS0EvRV7O3MZturChstm50OJ0y9bDJvAcmEPJm0FFpFyjU/JLYyStNGGey081DvnQYlncNX5SJJGA==", + "type": "package", + "path": "microsoft.extensions.logging.abstractions/8.0.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "Icon.png", + "LICENSE.TXT", + "PACKAGE.md", + "THIRD-PARTY-NOTICES.TXT", + "analyzers/dotnet/roslyn3.11/cs/Microsoft.Extensions.Logging.Generators.dll", + "analyzers/dotnet/roslyn3.11/cs/cs/Microsoft.Extensions.Logging.Generators.resources.dll", + "analyzers/dotnet/roslyn3.11/cs/de/Microsoft.Extensions.Logging.Generators.resources.dll", + "analyzers/dotnet/roslyn3.11/cs/es/Microsoft.Extensions.Logging.Generators.resources.dll", + "analyzers/dotnet/roslyn3.11/cs/fr/Microsoft.Extensions.Logging.Generators.resources.dll", + "analyzers/dotnet/roslyn3.11/cs/it/Microsoft.Extensions.Logging.Generators.resources.dll", + "analyzers/dotnet/roslyn3.11/cs/ja/Microsoft.Extensions.Logging.Generators.resources.dll", + "analyzers/dotnet/roslyn3.11/cs/ko/Microsoft.Extensions.Logging.Generators.resources.dll", + "analyzers/dotnet/roslyn3.11/cs/pl/Microsoft.Extensions.Logging.Generators.resources.dll", + "analyzers/dotnet/roslyn3.11/cs/pt-BR/Microsoft.Extensions.Logging.Generators.resources.dll", + "analyzers/dotnet/roslyn3.11/cs/ru/Microsoft.Extensions.Logging.Generators.resources.dll", + "analyzers/dotnet/roslyn3.11/cs/tr/Microsoft.Extensions.Logging.Generators.resources.dll", + "analyzers/dotnet/roslyn3.11/cs/zh-Hans/Microsoft.Extensions.Logging.Generators.resources.dll", + "analyzers/dotnet/roslyn3.11/cs/zh-Hant/Microsoft.Extensions.Logging.Generators.resources.dll", + "analyzers/dotnet/roslyn4.0/cs/Microsoft.Extensions.Logging.Generators.dll", + "analyzers/dotnet/roslyn4.0/cs/cs/Microsoft.Extensions.Logging.Generators.resources.dll", + "analyzers/dotnet/roslyn4.0/cs/de/Microsoft.Extensions.Logging.Generators.resources.dll", + "analyzers/dotnet/roslyn4.0/cs/es/Microsoft.Extensions.Logging.Generators.resources.dll", + "analyzers/dotnet/roslyn4.0/cs/fr/Microsoft.Extensions.Logging.Generators.resources.dll", + "analyzers/dotnet/roslyn4.0/cs/it/Microsoft.Extensions.Logging.Generators.resources.dll", + "analyzers/dotnet/roslyn4.0/cs/ja/Microsoft.Extensions.Logging.Generators.resources.dll", + "analyzers/dotnet/roslyn4.0/cs/ko/Microsoft.Extensions.Logging.Generators.resources.dll", + "analyzers/dotnet/roslyn4.0/cs/pl/Microsoft.Extensions.Logging.Generators.resources.dll", + "analyzers/dotnet/roslyn4.0/cs/pt-BR/Microsoft.Extensions.Logging.Generators.resources.dll", + "analyzers/dotnet/roslyn4.0/cs/ru/Microsoft.Extensions.Logging.Generators.resources.dll", + "analyzers/dotnet/roslyn4.0/cs/tr/Microsoft.Extensions.Logging.Generators.resources.dll", + "analyzers/dotnet/roslyn4.0/cs/zh-Hans/Microsoft.Extensions.Logging.Generators.resources.dll", + "analyzers/dotnet/roslyn4.0/cs/zh-Hant/Microsoft.Extensions.Logging.Generators.resources.dll", + "analyzers/dotnet/roslyn4.4/cs/Microsoft.Extensions.Logging.Generators.dll", + "analyzers/dotnet/roslyn4.4/cs/cs/Microsoft.Extensions.Logging.Generators.resources.dll", + "analyzers/dotnet/roslyn4.4/cs/de/Microsoft.Extensions.Logging.Generators.resources.dll", + "analyzers/dotnet/roslyn4.4/cs/es/Microsoft.Extensions.Logging.Generators.resources.dll", + "analyzers/dotnet/roslyn4.4/cs/fr/Microsoft.Extensions.Logging.Generators.resources.dll", + "analyzers/dotnet/roslyn4.4/cs/it/Microsoft.Extensions.Logging.Generators.resources.dll", + "analyzers/dotnet/roslyn4.4/cs/ja/Microsoft.Extensions.Logging.Generators.resources.dll", + "analyzers/dotnet/roslyn4.4/cs/ko/Microsoft.Extensions.Logging.Generators.resources.dll", + "analyzers/dotnet/roslyn4.4/cs/pl/Microsoft.Extensions.Logging.Generators.resources.dll", + "analyzers/dotnet/roslyn4.4/cs/pt-BR/Microsoft.Extensions.Logging.Generators.resources.dll", + "analyzers/dotnet/roslyn4.4/cs/ru/Microsoft.Extensions.Logging.Generators.resources.dll", + "analyzers/dotnet/roslyn4.4/cs/tr/Microsoft.Extensions.Logging.Generators.resources.dll", + "analyzers/dotnet/roslyn4.4/cs/zh-Hans/Microsoft.Extensions.Logging.Generators.resources.dll", + "analyzers/dotnet/roslyn4.4/cs/zh-Hant/Microsoft.Extensions.Logging.Generators.resources.dll", + "buildTransitive/net461/Microsoft.Extensions.Logging.Abstractions.targets", + "buildTransitive/net462/Microsoft.Extensions.Logging.Abstractions.targets", + "buildTransitive/net6.0/Microsoft.Extensions.Logging.Abstractions.targets", + "buildTransitive/netcoreapp2.0/Microsoft.Extensions.Logging.Abstractions.targets", + "buildTransitive/netstandard2.0/Microsoft.Extensions.Logging.Abstractions.targets", + "lib/net462/Microsoft.Extensions.Logging.Abstractions.dll", + "lib/net462/Microsoft.Extensions.Logging.Abstractions.xml", + "lib/net6.0/Microsoft.Extensions.Logging.Abstractions.dll", + "lib/net6.0/Microsoft.Extensions.Logging.Abstractions.xml", + "lib/net7.0/Microsoft.Extensions.Logging.Abstractions.dll", + "lib/net7.0/Microsoft.Extensions.Logging.Abstractions.xml", + "lib/net8.0/Microsoft.Extensions.Logging.Abstractions.dll", + "lib/net8.0/Microsoft.Extensions.Logging.Abstractions.xml", + "lib/netstandard2.0/Microsoft.Extensions.Logging.Abstractions.dll", + "lib/netstandard2.0/Microsoft.Extensions.Logging.Abstractions.xml", + "microsoft.extensions.logging.abstractions.8.0.0.nupkg.sha512", + "microsoft.extensions.logging.abstractions.nuspec", + "useSharedDesignerContext.txt" + ] + }, + "Microsoft.IdentityModel.Abstractions/7.5.1": { + "sha512": "PT16ZFbPIiMsYv07oy3zOjqUOJ7xutGBkJTOX0+IbNyU6+O6X7aIxjq9EaSSRLWbekRgamgtmfg8Xjw6A6Ua9g==", + "type": "package", + "path": "microsoft.identitymodel.abstractions/7.5.1", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "lib/net461/Microsoft.IdentityModel.Abstractions.dll", + "lib/net461/Microsoft.IdentityModel.Abstractions.xml", + "lib/net462/Microsoft.IdentityModel.Abstractions.dll", + "lib/net462/Microsoft.IdentityModel.Abstractions.xml", + "lib/net472/Microsoft.IdentityModel.Abstractions.dll", + "lib/net472/Microsoft.IdentityModel.Abstractions.xml", + "lib/net6.0/Microsoft.IdentityModel.Abstractions.dll", + "lib/net6.0/Microsoft.IdentityModel.Abstractions.xml", + "lib/net8.0/Microsoft.IdentityModel.Abstractions.dll", + "lib/net8.0/Microsoft.IdentityModel.Abstractions.xml", + "lib/netstandard2.0/Microsoft.IdentityModel.Abstractions.dll", + "lib/netstandard2.0/Microsoft.IdentityModel.Abstractions.xml", + "microsoft.identitymodel.abstractions.7.5.1.nupkg.sha512", + "microsoft.identitymodel.abstractions.nuspec" + ] + }, + "Microsoft.IdentityModel.JsonWebTokens/7.5.1": { + "sha512": "93CGSa8RPdZU8zfvA3nf9NGKUqEnQrE12VzYlMqKh72ddhzusosqLNEUgH/YhFWBLRFOnY1RCgHMV7pR+sAx2w==", + "type": "package", + "path": "microsoft.identitymodel.jsonwebtokens/7.5.1", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "lib/net461/Microsoft.IdentityModel.JsonWebTokens.dll", + "lib/net461/Microsoft.IdentityModel.JsonWebTokens.xml", + "lib/net462/Microsoft.IdentityModel.JsonWebTokens.dll", + "lib/net462/Microsoft.IdentityModel.JsonWebTokens.xml", + "lib/net472/Microsoft.IdentityModel.JsonWebTokens.dll", + "lib/net472/Microsoft.IdentityModel.JsonWebTokens.xml", + "lib/net6.0/Microsoft.IdentityModel.JsonWebTokens.dll", + "lib/net6.0/Microsoft.IdentityModel.JsonWebTokens.xml", + "lib/net8.0/Microsoft.IdentityModel.JsonWebTokens.dll", + "lib/net8.0/Microsoft.IdentityModel.JsonWebTokens.xml", + "lib/netstandard2.0/Microsoft.IdentityModel.JsonWebTokens.dll", + "lib/netstandard2.0/Microsoft.IdentityModel.JsonWebTokens.xml", + "microsoft.identitymodel.jsonwebtokens.7.5.1.nupkg.sha512", + "microsoft.identitymodel.jsonwebtokens.nuspec" + ] + }, + "Microsoft.IdentityModel.Logging/7.5.1": { + "sha512": "PnpAQX20BAiDIPYmWUyQSlEaWD8BLXzHpiDGTCT568Cs0ReOeyzNe401LzCeiv6ilug/KefVeV1CeqtCHTo8dw==", + "type": "package", + "path": "microsoft.identitymodel.logging/7.5.1", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "lib/net461/Microsoft.IdentityModel.Logging.dll", + "lib/net461/Microsoft.IdentityModel.Logging.xml", + "lib/net462/Microsoft.IdentityModel.Logging.dll", + "lib/net462/Microsoft.IdentityModel.Logging.xml", + "lib/net472/Microsoft.IdentityModel.Logging.dll", + "lib/net472/Microsoft.IdentityModel.Logging.xml", + "lib/net6.0/Microsoft.IdentityModel.Logging.dll", + "lib/net6.0/Microsoft.IdentityModel.Logging.xml", + "lib/net8.0/Microsoft.IdentityModel.Logging.dll", + "lib/net8.0/Microsoft.IdentityModel.Logging.xml", + "lib/netstandard2.0/Microsoft.IdentityModel.Logging.dll", + "lib/netstandard2.0/Microsoft.IdentityModel.Logging.xml", + "microsoft.identitymodel.logging.7.5.1.nupkg.sha512", + "microsoft.identitymodel.logging.nuspec" + ] + }, + "Microsoft.IdentityModel.Tokens/7.5.1": { + "sha512": "Q3DKpyFViP84IUlTFKH/zIkswIrmSh2Vd/eFDo4wlOHy4DYxoweZEEw4kDEiKt9VCX6o7SddK3HK2xDYyFpexA==", + "type": "package", + "path": "microsoft.identitymodel.tokens/7.5.1", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "lib/net461/Microsoft.IdentityModel.Tokens.dll", + "lib/net461/Microsoft.IdentityModel.Tokens.xml", + "lib/net462/Microsoft.IdentityModel.Tokens.dll", + "lib/net462/Microsoft.IdentityModel.Tokens.xml", + "lib/net472/Microsoft.IdentityModel.Tokens.dll", + "lib/net472/Microsoft.IdentityModel.Tokens.xml", + "lib/net6.0/Microsoft.IdentityModel.Tokens.dll", + "lib/net6.0/Microsoft.IdentityModel.Tokens.xml", + "lib/net8.0/Microsoft.IdentityModel.Tokens.dll", + "lib/net8.0/Microsoft.IdentityModel.Tokens.xml", + "lib/netstandard2.0/Microsoft.IdentityModel.Tokens.dll", + "lib/netstandard2.0/Microsoft.IdentityModel.Tokens.xml", + "microsoft.identitymodel.tokens.7.5.1.nupkg.sha512", + "microsoft.identitymodel.tokens.nuspec" + ] + }, + "Microsoft.IO.RecyclableMemoryStream/3.0.0": { + "sha512": "irv0HuqoH8Ig5i2fO+8dmDNdFdsrO+DoQcedwIlb810qpZHBNQHZLW7C/AHBQDgLLpw2T96vmMAy/aE4Yj55Sg==", + "type": "package", + "path": "microsoft.io.recyclablememorystream/3.0.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "README.md", + "lib/net6.0/Microsoft.IO.RecyclableMemoryStream.dll", + "lib/net6.0/Microsoft.IO.RecyclableMemoryStream.xml", + "lib/netstandard2.0/Microsoft.IO.RecyclableMemoryStream.dll", + "lib/netstandard2.0/Microsoft.IO.RecyclableMemoryStream.xml", + "lib/netstandard2.1/Microsoft.IO.RecyclableMemoryStream.dll", + "lib/netstandard2.1/Microsoft.IO.RecyclableMemoryStream.xml", + "microsoft.io.recyclablememorystream.3.0.0.nupkg.sha512", + "microsoft.io.recyclablememorystream.nuspec" + ] + }, + "Microsoft.Testing.Extensions.CodeCoverage/17.13.1": { + "sha512": "Ok2HWJdOTzErMqLlWQZ/i2Fw05VWmgh1yhUWFYJAtUmCv6uJSgz/qAiriRgpTjZRWaKbb7HDaGfMgKSNcmaVfw==", + "type": "package", + "path": "microsoft.testing.extensions.codecoverage/17.13.1", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "Icon.png", + "License.txt", + "PACKAGE.md", + "ThirdPartyNotices.txt", + "build/net6.0/Microsoft.Testing.Extensions.CodeCoverage.props", + "build/net6.0/Microsoft.Testing.Extensions.CodeCoverage.targets", + "build/netstandard2.0/Microsoft.Testing.Extensions.CodeCoverage.props", + "build/netstandard2.0/Microsoft.Testing.Extensions.CodeCoverage.targets", + "buildMultiTargeting/Microsoft.Testing.Extensions.CodeCoverage.props", + "buildMultiTargeting/Microsoft.Testing.Extensions.CodeCoverage.targets", + "buildTransitive/net6.0/Microsoft.Testing.Extensions.CodeCoverage.props", + "buildTransitive/net6.0/Microsoft.Testing.Extensions.CodeCoverage.targets", + "buildTransitive/netstandard2.0/Microsoft.Testing.Extensions.CodeCoverage.props", + "buildTransitive/netstandard2.0/Microsoft.Testing.Extensions.CodeCoverage.targets", + "lib/net6.0/Microsoft.CodeCoverage.Core.dll", + "lib/net6.0/Microsoft.CodeCoverage.Instrumentation.Core.dll", + "lib/net6.0/Microsoft.CodeCoverage.Instrumentation.dll", + "lib/net6.0/Microsoft.CodeCoverage.Interprocess.dll", + "lib/net6.0/Microsoft.Testing.Extensions.CodeCoverage.dll", + "lib/net6.0/Microsoft.Testing.Extensions.CodeCoverage.pdb", + "lib/net6.0/Microsoft.VisualStudio.CodeCoverage.Shim.dll", + "lib/net6.0/Mono.Cecil.Mdb.dll", + "lib/net6.0/Mono.Cecil.Pdb.dll", + "lib/net6.0/Mono.Cecil.Rocks.dll", + "lib/net6.0/Mono.Cecil.dll", + "lib/net6.0/cs/Microsoft.Testing.Extensions.CodeCoverage.resources.dll", + "lib/net6.0/de/Microsoft.Testing.Extensions.CodeCoverage.resources.dll", + "lib/net6.0/es/Microsoft.Testing.Extensions.CodeCoverage.resources.dll", + "lib/net6.0/fr/Microsoft.Testing.Extensions.CodeCoverage.resources.dll", + "lib/net6.0/it/Microsoft.Testing.Extensions.CodeCoverage.resources.dll", + "lib/net6.0/ja/Microsoft.Testing.Extensions.CodeCoverage.resources.dll", + "lib/net6.0/ko/Microsoft.Testing.Extensions.CodeCoverage.resources.dll", + "lib/net6.0/pl/Microsoft.Testing.Extensions.CodeCoverage.resources.dll", + "lib/net6.0/pt-BR/Microsoft.Testing.Extensions.CodeCoverage.resources.dll", + "lib/net6.0/ru/Microsoft.Testing.Extensions.CodeCoverage.resources.dll", + "lib/net6.0/tr/Microsoft.Testing.Extensions.CodeCoverage.resources.dll", + "lib/net6.0/zh-Hans/Microsoft.Testing.Extensions.CodeCoverage.resources.dll", + "lib/net6.0/zh-Hant/Microsoft.Testing.Extensions.CodeCoverage.resources.dll", + "lib/netstandard2.0/Microsoft.CodeCoverage.Core.dll", + "lib/netstandard2.0/Microsoft.CodeCoverage.Instrumentation.Core.dll", + "lib/netstandard2.0/Microsoft.CodeCoverage.Instrumentation.dll", + "lib/netstandard2.0/Microsoft.CodeCoverage.Interprocess.dll", + "lib/netstandard2.0/Microsoft.Testing.Extensions.CodeCoverage.dll", + "lib/netstandard2.0/Microsoft.Testing.Extensions.CodeCoverage.pdb", + "lib/netstandard2.0/Microsoft.VisualStudio.CodeCoverage.Shim.dll", + "lib/netstandard2.0/Mono.Cecil.Mdb.dll", + "lib/netstandard2.0/Mono.Cecil.Pdb.dll", + "lib/netstandard2.0/Mono.Cecil.Rocks.dll", + "lib/netstandard2.0/Mono.Cecil.dll", + "lib/netstandard2.0/cs/Microsoft.Testing.Extensions.CodeCoverage.resources.dll", + "lib/netstandard2.0/de/Microsoft.Testing.Extensions.CodeCoverage.resources.dll", + "lib/netstandard2.0/es/Microsoft.Testing.Extensions.CodeCoverage.resources.dll", + "lib/netstandard2.0/fr/Microsoft.Testing.Extensions.CodeCoverage.resources.dll", + "lib/netstandard2.0/it/Microsoft.Testing.Extensions.CodeCoverage.resources.dll", + "lib/netstandard2.0/ja/Microsoft.Testing.Extensions.CodeCoverage.resources.dll", + "lib/netstandard2.0/ko/Microsoft.Testing.Extensions.CodeCoverage.resources.dll", + "lib/netstandard2.0/pl/Microsoft.Testing.Extensions.CodeCoverage.resources.dll", + "lib/netstandard2.0/pt-BR/Microsoft.Testing.Extensions.CodeCoverage.resources.dll", + "lib/netstandard2.0/ru/Microsoft.Testing.Extensions.CodeCoverage.resources.dll", + "lib/netstandard2.0/tr/Microsoft.Testing.Extensions.CodeCoverage.resources.dll", + "lib/netstandard2.0/zh-Hans/Microsoft.Testing.Extensions.CodeCoverage.resources.dll", + "lib/netstandard2.0/zh-Hant/Microsoft.Testing.Extensions.CodeCoverage.resources.dll", + "microsoft.testing.extensions.codecoverage.17.13.1.nupkg.sha512", + "microsoft.testing.extensions.codecoverage.nuspec", + "runtimes/linux-musl-x64/native/Cov_x64.config", + "runtimes/linux-musl-x64/native/libCoverageInstrumentationMethod.so", + "runtimes/linux-musl-x64/native/libInstrumentationEngine.so", + "runtimes/linux-x64/native/Cov_x64.config", + "runtimes/linux-x64/native/libCoverageInstrumentationMethod.so", + "runtimes/linux-x64/native/libInstrumentationEngine.so", + "runtimes/osx-x64/native/Cov_x64.config", + "runtimes/osx-x64/native/libCoverageInstrumentationMethod.dylib", + "runtimes/osx-x64/native/libInstrumentationEngine.dylib", + "runtimes/win-arm64/native/CodeCoverageMessages.dll", + "runtimes/win-arm64/native/Cov_arm64.config", + "runtimes/win-arm64/native/Cov_x64.config", + "runtimes/win-arm64/native/Cov_x86.config", + "runtimes/win-arm64/native/MicrosoftInstrumentationEngine_arm64.dll", + "runtimes/win-arm64/native/MicrosoftInstrumentationEngine_x64.dll", + "runtimes/win-arm64/native/MicrosoftInstrumentationEngine_x86.dll", + "runtimes/win-arm64/native/covrun32.dll", + "runtimes/win-arm64/native/covrun64.dll", + "runtimes/win-arm64/native/covrunarm64.dll", + "runtimes/win-arm64/native/msdia140.dll", + "runtimes/win-x64/native/CodeCoverageMessages.dll", + "runtimes/win-x64/native/Cov_arm64.config", + "runtimes/win-x64/native/Cov_x64.config", + "runtimes/win-x64/native/Cov_x86.config", + "runtimes/win-x64/native/MicrosoftInstrumentationEngine_arm64.dll", + "runtimes/win-x64/native/MicrosoftInstrumentationEngine_x64.dll", + "runtimes/win-x64/native/MicrosoftInstrumentationEngine_x86.dll", + "runtimes/win-x64/native/covrun32.dll", + "runtimes/win-x64/native/covrun64.dll", + "runtimes/win-x64/native/covrunarm64.dll", + "runtimes/win-x64/native/msdia140.dll", + "runtimes/win-x86/native/CodeCoverageMessages.dll", + "runtimes/win-x86/native/Cov_arm64.config", + "runtimes/win-x86/native/Cov_x64.config", + "runtimes/win-x86/native/Cov_x86.config", + "runtimes/win-x86/native/MicrosoftInstrumentationEngine_arm64.dll", + "runtimes/win-x86/native/MicrosoftInstrumentationEngine_x64.dll", + "runtimes/win-x86/native/MicrosoftInstrumentationEngine_x86.dll", + "runtimes/win-x86/native/covrun32.dll", + "runtimes/win-x86/native/covrun64.dll", + "runtimes/win-x86/native/covrunarm64.dll", + "runtimes/win-x86/native/msdia140.dll" + ] + }, + "Microsoft.Testing.Extensions.TrxReport.Abstractions/1.4.3": { + "sha512": "16sWznD6ZMok/zgW+vrO6zerCFMD9N+ey9bi1iV/e9xxsQb4V4y/aW6cY/Y7E9jA7pc+aZ6ffZby43yxQOoYZA==", + "type": "package", + "path": "microsoft.testing.extensions.trxreport.abstractions/1.4.3", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "Icon.png", + "PACKAGE.md", + "lib/net6.0/Microsoft.Testing.Extensions.TrxReport.Abstractions.dll", + "lib/net6.0/Microsoft.Testing.Extensions.TrxReport.Abstractions.xml", + "lib/net7.0/Microsoft.Testing.Extensions.TrxReport.Abstractions.dll", + "lib/net7.0/Microsoft.Testing.Extensions.TrxReport.Abstractions.xml", + "lib/net8.0/Microsoft.Testing.Extensions.TrxReport.Abstractions.dll", + "lib/net8.0/Microsoft.Testing.Extensions.TrxReport.Abstractions.xml", + "lib/netstandard2.0/Microsoft.Testing.Extensions.TrxReport.Abstractions.dll", + "lib/netstandard2.0/Microsoft.Testing.Extensions.TrxReport.Abstractions.xml", + "microsoft.testing.extensions.trxreport.abstractions.1.4.3.nupkg.sha512", + "microsoft.testing.extensions.trxreport.abstractions.nuspec" + ] + }, + "Microsoft.Testing.Platform/1.4.3": { + "sha512": "NedIbwl1T7+ZMeg7gwk0Db8/RFLf0siyVpeTcRMMOle6Xl/ujaYOM4Aduo8rEfVqNj3kcQ7blegpyT3dHi+0PA==", + "type": "package", + "path": "microsoft.testing.platform/1.4.3", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "Icon.png", + "PACKAGE.md", + "build/net6.0/Microsoft.Testing.Platform.props", + "build/net7.0/Microsoft.Testing.Platform.props", + "build/net8.0/Microsoft.Testing.Platform.props", + "build/netstandard2.0/Microsoft.Testing.Platform.props", + "buildMultiTargeting/Microsoft.Testing.Platform.props", + "buildTransitive/net6.0/Microsoft.Testing.Platform.props", + "buildTransitive/net7.0/Microsoft.Testing.Platform.props", + "buildTransitive/net8.0/Microsoft.Testing.Platform.props", + "buildTransitive/netstandard2.0/Microsoft.Testing.Platform.props", + "lib/net6.0/Microsoft.Testing.Platform.dll", + "lib/net6.0/Microsoft.Testing.Platform.xml", + "lib/net6.0/cs/Microsoft.Testing.Platform.resources.dll", + "lib/net6.0/de/Microsoft.Testing.Platform.resources.dll", + "lib/net6.0/es/Microsoft.Testing.Platform.resources.dll", + "lib/net6.0/fr/Microsoft.Testing.Platform.resources.dll", + "lib/net6.0/it/Microsoft.Testing.Platform.resources.dll", + "lib/net6.0/ja/Microsoft.Testing.Platform.resources.dll", + "lib/net6.0/ko/Microsoft.Testing.Platform.resources.dll", + "lib/net6.0/pl/Microsoft.Testing.Platform.resources.dll", + "lib/net6.0/pt-BR/Microsoft.Testing.Platform.resources.dll", + "lib/net6.0/ru/Microsoft.Testing.Platform.resources.dll", + "lib/net6.0/tr/Microsoft.Testing.Platform.resources.dll", + "lib/net6.0/zh-Hans/Microsoft.Testing.Platform.resources.dll", + "lib/net6.0/zh-Hant/Microsoft.Testing.Platform.resources.dll", + "lib/net7.0/Microsoft.Testing.Platform.dll", + "lib/net7.0/Microsoft.Testing.Platform.xml", + "lib/net7.0/cs/Microsoft.Testing.Platform.resources.dll", + "lib/net7.0/de/Microsoft.Testing.Platform.resources.dll", + "lib/net7.0/es/Microsoft.Testing.Platform.resources.dll", + "lib/net7.0/fr/Microsoft.Testing.Platform.resources.dll", + "lib/net7.0/it/Microsoft.Testing.Platform.resources.dll", + "lib/net7.0/ja/Microsoft.Testing.Platform.resources.dll", + "lib/net7.0/ko/Microsoft.Testing.Platform.resources.dll", + "lib/net7.0/pl/Microsoft.Testing.Platform.resources.dll", + "lib/net7.0/pt-BR/Microsoft.Testing.Platform.resources.dll", + "lib/net7.0/ru/Microsoft.Testing.Platform.resources.dll", + "lib/net7.0/tr/Microsoft.Testing.Platform.resources.dll", + "lib/net7.0/zh-Hans/Microsoft.Testing.Platform.resources.dll", + "lib/net7.0/zh-Hant/Microsoft.Testing.Platform.resources.dll", + "lib/net8.0/Microsoft.Testing.Platform.dll", + "lib/net8.0/Microsoft.Testing.Platform.xml", + "lib/net8.0/cs/Microsoft.Testing.Platform.resources.dll", + "lib/net8.0/de/Microsoft.Testing.Platform.resources.dll", + "lib/net8.0/es/Microsoft.Testing.Platform.resources.dll", + "lib/net8.0/fr/Microsoft.Testing.Platform.resources.dll", + "lib/net8.0/it/Microsoft.Testing.Platform.resources.dll", + "lib/net8.0/ja/Microsoft.Testing.Platform.resources.dll", + "lib/net8.0/ko/Microsoft.Testing.Platform.resources.dll", + "lib/net8.0/pl/Microsoft.Testing.Platform.resources.dll", + "lib/net8.0/pt-BR/Microsoft.Testing.Platform.resources.dll", + "lib/net8.0/ru/Microsoft.Testing.Platform.resources.dll", + "lib/net8.0/tr/Microsoft.Testing.Platform.resources.dll", + "lib/net8.0/zh-Hans/Microsoft.Testing.Platform.resources.dll", + "lib/net8.0/zh-Hant/Microsoft.Testing.Platform.resources.dll", + "lib/netstandard2.0/Microsoft.Testing.Platform.dll", + "lib/netstandard2.0/Microsoft.Testing.Platform.xml", + "lib/netstandard2.0/cs/Microsoft.Testing.Platform.resources.dll", + "lib/netstandard2.0/de/Microsoft.Testing.Platform.resources.dll", + "lib/netstandard2.0/es/Microsoft.Testing.Platform.resources.dll", + "lib/netstandard2.0/fr/Microsoft.Testing.Platform.resources.dll", + "lib/netstandard2.0/it/Microsoft.Testing.Platform.resources.dll", + "lib/netstandard2.0/ja/Microsoft.Testing.Platform.resources.dll", + "lib/netstandard2.0/ko/Microsoft.Testing.Platform.resources.dll", + "lib/netstandard2.0/pl/Microsoft.Testing.Platform.resources.dll", + "lib/netstandard2.0/pt-BR/Microsoft.Testing.Platform.resources.dll", + "lib/netstandard2.0/ru/Microsoft.Testing.Platform.resources.dll", + "lib/netstandard2.0/tr/Microsoft.Testing.Platform.resources.dll", + "lib/netstandard2.0/zh-Hans/Microsoft.Testing.Platform.resources.dll", + "lib/netstandard2.0/zh-Hant/Microsoft.Testing.Platform.resources.dll", + "microsoft.testing.platform.1.4.3.nupkg.sha512", + "microsoft.testing.platform.nuspec" + ] + }, + "Microsoft.Testing.Platform.MSBuild/1.4.3": { + "sha512": "1gGqgHtiZ6tZn/6Tby+qlKpNe5Ye/5LnxlSsyl4XMZ4m4V+Cu1K1m+gD1zxoxHIvLjgX8mCnQRK95MGBBFuumw==", + "type": "package", + "path": "microsoft.testing.platform.msbuild/1.4.3", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "Icon.png", + "PACKAGE.md", + "_MSBuildTasks/netstandard2.0/Microsoft.Testing.Platform.MSBuild.dll", + "_MSBuildTasks/netstandard2.0/Microsoft.Testing.Platform.dll", + "build/net6.0/Microsoft.Testing.Platform.MSBuild.props", + "build/net6.0/Microsoft.Testing.Platform.MSBuild.targets", + "build/net7.0/Microsoft.Testing.Platform.MSBuild.props", + "build/net7.0/Microsoft.Testing.Platform.MSBuild.targets", + "build/net8.0/Microsoft.Testing.Platform.MSBuild.props", + "build/net8.0/Microsoft.Testing.Platform.MSBuild.targets", + "build/netstandard2.0/Microsoft.Testing.Platform.MSBuild.props", + "build/netstandard2.0/Microsoft.Testing.Platform.MSBuild.targets", + "buildMultiTargeting/Microsoft.Testing.Platform.MSBuild.VSTest.targets", + "buildMultiTargeting/Microsoft.Testing.Platform.MSBuild.props", + "buildMultiTargeting/Microsoft.Testing.Platform.MSBuild.targets", + "buildTransitive/net6.0/Microsoft.Testing.Platform.MSBuild.props", + "buildTransitive/net6.0/Microsoft.Testing.Platform.MSBuild.targets", + "buildTransitive/net7.0/Microsoft.Testing.Platform.MSBuild.props", + "buildTransitive/net7.0/Microsoft.Testing.Platform.MSBuild.targets", + "buildTransitive/net8.0/Microsoft.Testing.Platform.MSBuild.props", + "buildTransitive/net8.0/Microsoft.Testing.Platform.MSBuild.targets", + "buildTransitive/netstandard2.0/Microsoft.Testing.Platform.MSBuild.props", + "buildTransitive/netstandard2.0/Microsoft.Testing.Platform.MSBuild.targets", + "lib/net6.0/Microsoft.Testing.Platform.MSBuild.dll", + "lib/net6.0/Microsoft.Testing.Platform.MSBuild.xml", + "lib/net6.0/cs/Microsoft.Testing.Platform.MSBuild.resources.dll", + "lib/net6.0/de/Microsoft.Testing.Platform.MSBuild.resources.dll", + "lib/net6.0/es/Microsoft.Testing.Platform.MSBuild.resources.dll", + "lib/net6.0/fr/Microsoft.Testing.Platform.MSBuild.resources.dll", + "lib/net6.0/it/Microsoft.Testing.Platform.MSBuild.resources.dll", + "lib/net6.0/ja/Microsoft.Testing.Platform.MSBuild.resources.dll", + "lib/net6.0/ko/Microsoft.Testing.Platform.MSBuild.resources.dll", + "lib/net6.0/pl/Microsoft.Testing.Platform.MSBuild.resources.dll", + "lib/net6.0/pt-BR/Microsoft.Testing.Platform.MSBuild.resources.dll", + "lib/net6.0/ru/Microsoft.Testing.Platform.MSBuild.resources.dll", + "lib/net6.0/tr/Microsoft.Testing.Platform.MSBuild.resources.dll", + "lib/net6.0/zh-Hans/Microsoft.Testing.Platform.MSBuild.resources.dll", + "lib/net6.0/zh-Hant/Microsoft.Testing.Platform.MSBuild.resources.dll", + "lib/net7.0/Microsoft.Testing.Platform.MSBuild.dll", + "lib/net7.0/Microsoft.Testing.Platform.MSBuild.xml", + "lib/net7.0/cs/Microsoft.Testing.Platform.MSBuild.resources.dll", + "lib/net7.0/de/Microsoft.Testing.Platform.MSBuild.resources.dll", + "lib/net7.0/es/Microsoft.Testing.Platform.MSBuild.resources.dll", + "lib/net7.0/fr/Microsoft.Testing.Platform.MSBuild.resources.dll", + "lib/net7.0/it/Microsoft.Testing.Platform.MSBuild.resources.dll", + "lib/net7.0/ja/Microsoft.Testing.Platform.MSBuild.resources.dll", + "lib/net7.0/ko/Microsoft.Testing.Platform.MSBuild.resources.dll", + "lib/net7.0/pl/Microsoft.Testing.Platform.MSBuild.resources.dll", + "lib/net7.0/pt-BR/Microsoft.Testing.Platform.MSBuild.resources.dll", + "lib/net7.0/ru/Microsoft.Testing.Platform.MSBuild.resources.dll", + "lib/net7.0/tr/Microsoft.Testing.Platform.MSBuild.resources.dll", + "lib/net7.0/zh-Hans/Microsoft.Testing.Platform.MSBuild.resources.dll", + "lib/net7.0/zh-Hant/Microsoft.Testing.Platform.MSBuild.resources.dll", + "lib/net8.0/Microsoft.Testing.Platform.MSBuild.dll", + "lib/net8.0/Microsoft.Testing.Platform.MSBuild.xml", + "lib/net8.0/cs/Microsoft.Testing.Platform.MSBuild.resources.dll", + "lib/net8.0/de/Microsoft.Testing.Platform.MSBuild.resources.dll", + "lib/net8.0/es/Microsoft.Testing.Platform.MSBuild.resources.dll", + "lib/net8.0/fr/Microsoft.Testing.Platform.MSBuild.resources.dll", + "lib/net8.0/it/Microsoft.Testing.Platform.MSBuild.resources.dll", + "lib/net8.0/ja/Microsoft.Testing.Platform.MSBuild.resources.dll", + "lib/net8.0/ko/Microsoft.Testing.Platform.MSBuild.resources.dll", + "lib/net8.0/pl/Microsoft.Testing.Platform.MSBuild.resources.dll", + "lib/net8.0/pt-BR/Microsoft.Testing.Platform.MSBuild.resources.dll", + "lib/net8.0/ru/Microsoft.Testing.Platform.MSBuild.resources.dll", + "lib/net8.0/tr/Microsoft.Testing.Platform.MSBuild.resources.dll", + "lib/net8.0/zh-Hans/Microsoft.Testing.Platform.MSBuild.resources.dll", + "lib/net8.0/zh-Hant/Microsoft.Testing.Platform.MSBuild.resources.dll", + "lib/netstandard2.0/Microsoft.Testing.Platform.MSBuild.dll", + "lib/netstandard2.0/Microsoft.Testing.Platform.MSBuild.xml", + "lib/netstandard2.0/cs/Microsoft.Testing.Platform.MSBuild.resources.dll", + "lib/netstandard2.0/de/Microsoft.Testing.Platform.MSBuild.resources.dll", + "lib/netstandard2.0/es/Microsoft.Testing.Platform.MSBuild.resources.dll", + "lib/netstandard2.0/fr/Microsoft.Testing.Platform.MSBuild.resources.dll", + "lib/netstandard2.0/it/Microsoft.Testing.Platform.MSBuild.resources.dll", + "lib/netstandard2.0/ja/Microsoft.Testing.Platform.MSBuild.resources.dll", + "lib/netstandard2.0/ko/Microsoft.Testing.Platform.MSBuild.resources.dll", + "lib/netstandard2.0/pl/Microsoft.Testing.Platform.MSBuild.resources.dll", + "lib/netstandard2.0/pt-BR/Microsoft.Testing.Platform.MSBuild.resources.dll", + "lib/netstandard2.0/ru/Microsoft.Testing.Platform.MSBuild.resources.dll", + "lib/netstandard2.0/tr/Microsoft.Testing.Platform.MSBuild.resources.dll", + "lib/netstandard2.0/zh-Hans/Microsoft.Testing.Platform.MSBuild.resources.dll", + "lib/netstandard2.0/zh-Hant/Microsoft.Testing.Platform.MSBuild.resources.dll", + "microsoft.testing.platform.msbuild.1.4.3.nupkg.sha512", + "microsoft.testing.platform.msbuild.nuspec" + ] + }, + "MimeMapping/3.0.1": { + "sha512": "lhYcUVnWKaqrboAwi05YLCx3wdluM9Sr1Mv5Emhgc8c8yNVvdiSEnQJMdDvgb4grlYTaOmbnhYaezoeateX95w==", + "type": "package", + "path": "mimemapping/3.0.1", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "README.md", + "lib/net462/MimeMapping.dll", + "lib/net462/MimeMapping.xml", + "lib/netstandard2.0/MimeMapping.dll", + "lib/netstandard2.0/MimeMapping.xml", + "mimemapping.3.0.1.nupkg.sha512", + "mimemapping.nuspec" + ] + }, + "Newtonsoft.Json/13.0.3": { + "sha512": "HrC5BXdl00IP9zeV+0Z848QWPAoCr9P3bDEZguI+gkLcBKAOxix/tLEAAHC+UvDNPv4a2d18lOReHMOagPa+zQ==", + "type": "package", + "path": "newtonsoft.json/13.0.3", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "LICENSE.md", + "README.md", + "lib/net20/Newtonsoft.Json.dll", + "lib/net20/Newtonsoft.Json.xml", + "lib/net35/Newtonsoft.Json.dll", + "lib/net35/Newtonsoft.Json.xml", + "lib/net40/Newtonsoft.Json.dll", + "lib/net40/Newtonsoft.Json.xml", + "lib/net45/Newtonsoft.Json.dll", + "lib/net45/Newtonsoft.Json.xml", + "lib/net6.0/Newtonsoft.Json.dll", + "lib/net6.0/Newtonsoft.Json.xml", + "lib/netstandard1.0/Newtonsoft.Json.dll", + "lib/netstandard1.0/Newtonsoft.Json.xml", + "lib/netstandard1.3/Newtonsoft.Json.dll", + "lib/netstandard1.3/Newtonsoft.Json.xml", + "lib/netstandard2.0/Newtonsoft.Json.dll", + "lib/netstandard2.0/Newtonsoft.Json.xml", + "newtonsoft.json.13.0.3.nupkg.sha512", + "newtonsoft.json.nuspec", + "packageIcon.png" + ] + }, + "Supabase/1.1.1": { + "sha512": "LW9O05IiZBW3YUDT/gndPKvzT3I7PVgx0j87+AdJu7mT42m7oh2nOnjuDR9pU0E9FE2Ke/QGovrH/u5OjGn7lg==", + "type": "package", + "path": "supabase/1.1.1", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "README.md", + "icon.png", + "lib/netstandard2.1/Supabase.dll", + "lib/netstandard2.1/Supabase.xml", + "supabase.1.1.1.nupkg.sha512", + "supabase.nuspec" + ] + }, + "Supabase.Core/1.0.0": { + "sha512": "fJK3Kfq1alw53AGWHBr+dhPu+BUR5dKuBjGhcxrFRVdsFFFWSD5iPIdTYi0CUQDA2b1OjGudYL1xd51yp4hU9Q==", + "type": "package", + "path": "supabase.core/1.0.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "README.md", + "icon.png", + "lib/netstandard2.0/Supabase.Core.dll", + "lib/netstandard2.0/Supabase.Core.xml", + "supabase.core.1.0.0.nupkg.sha512", + "supabase.core.nuspec" + ] + }, + "Supabase.Functions/2.0.0": { + "sha512": "rc6zlo6XFkQw/B9fEgwpXHtmNPrnnHmtc96PTbviBJ9lzqPT/Un/G3V9MltlORtnG2RLkLvvS/t2AXAO8m2SCQ==", + "type": "package", + "path": "supabase.functions/2.0.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "README.md", + "icon.png", + "lib/netstandard2.0/Supabase.Functions.dll", + "lib/netstandard2.0/Supabase.Functions.xml", + "supabase.functions.2.0.0.nupkg.sha512", + "supabase.functions.nuspec" + ] + }, + "Supabase.Gotrue/6.0.3": { + "sha512": "8dkg000ib95bJm0ffDPUrALrefBHrkiqcolNjuUEStF2TeytPbV+OtOUJAMBOqZ2f1nsCY61Ck/7NOmOyGteDw==", + "type": "package", + "path": "supabase.gotrue/6.0.3", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "README.md", + "icon.png", + "lib/netstandard2.1/Supabase.Gotrue.dll", + "lib/netstandard2.1/Supabase.Gotrue.xml", + "supabase.gotrue.6.0.3.nupkg.sha512", + "supabase.gotrue.nuspec" + ] + }, + "Supabase.Postgrest/4.0.3": { + "sha512": "hpDIh+E5bDgZiHMuM6l+RDm9WWlt/T3fXXFQoqzlsrJFesFMNzkK9feVBG5egJyL/OlwmxuLsnPkR7O+bV3Vcw==", + "type": "package", + "path": "supabase.postgrest/4.0.3", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "README.md", + "icon.png", + "lib/netstandard2.0/Supabase.Postgrest.dll", + "lib/netstandard2.0/Supabase.Postgrest.xml", + "supabase.postgrest.4.0.3.nupkg.sha512", + "supabase.postgrest.nuspec" + ] + }, + "Supabase.Realtime/7.0.2": { + "sha512": "9nwlR9RR+uyD63VUaiqAPsd76NaeM6ORAHq7otc4G34RzBtf6aqjPg9IF6d1DGIk78/lJP31+D4NJmQhl3PkJQ==", + "type": "package", + "path": "supabase.realtime/7.0.2", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "README.md", + "icon.png", + "lib/netstandard2.0/Supabase.Realtime.dll", + "lib/netstandard2.0/Supabase.Realtime.xml", + "lib/netstandard2.1/Supabase.Realtime.dll", + "lib/netstandard2.1/Supabase.Realtime.xml", + "supabase.realtime.7.0.2.nupkg.sha512", + "supabase.realtime.nuspec" + ] + }, + "Supabase.Storage/2.0.2": { + "sha512": "YKxgwVgLjxi32ze29FT8aSLifiTVSZSxSyI9taOewp6wuxh+aMIPLKWtGEhFhegLv2iFwGcZ3ybMDkCi6RB7Rw==", + "type": "package", + "path": "supabase.storage/2.0.2", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "README.md", + "icon.png", + "lib/netstandard2.0/Supabase.Storage.dll", + "lib/netstandard2.0/Supabase.Storage.xml", + "supabase.storage.2.0.2.nupkg.sha512", + "supabase.storage.nuspec" + ] + }, + "System.Buffers/4.5.1": { + "sha512": "Rw7ijyl1qqRS0YQD/WycNst8hUUMgrMH4FCn1nNm27M4VxchZ1js3fVjQaANHO5f3sN4isvP4a+Met9Y4YomAg==", + "type": "package", + "path": "system.buffers/4.5.1", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "LICENSE.TXT", + "THIRD-PARTY-NOTICES.TXT", + "lib/net461/System.Buffers.dll", + "lib/net461/System.Buffers.xml", + "lib/netcoreapp2.0/_._", + "lib/netstandard1.1/System.Buffers.dll", + "lib/netstandard1.1/System.Buffers.xml", + "lib/netstandard2.0/System.Buffers.dll", + "lib/netstandard2.0/System.Buffers.xml", + "lib/uap10.0.16299/_._", + "ref/net45/System.Buffers.dll", + "ref/net45/System.Buffers.xml", + "ref/netcoreapp2.0/_._", + "ref/netstandard1.1/System.Buffers.dll", + "ref/netstandard1.1/System.Buffers.xml", + "ref/netstandard2.0/System.Buffers.dll", + "ref/netstandard2.0/System.Buffers.xml", + "ref/uap10.0.16299/_._", + "system.buffers.4.5.1.nupkg.sha512", + "system.buffers.nuspec", + "useSharedDesignerContext.txt", + "version.txt" + ] + }, + "System.Collections.Immutable/8.0.0": { + "sha512": "AurL6Y5BA1WotzlEvVaIDpqzpIPvYnnldxru8oXJU2yFxFUy3+pNXjXd1ymO+RA0rq0+590Q8gaz2l3Sr7fmqg==", + "type": "package", + "path": "system.collections.immutable/8.0.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "Icon.png", + "LICENSE.TXT", + "PACKAGE.md", + "THIRD-PARTY-NOTICES.TXT", + "buildTransitive/net461/System.Collections.Immutable.targets", + "buildTransitive/net462/_._", + "buildTransitive/net6.0/_._", + "buildTransitive/netcoreapp2.0/System.Collections.Immutable.targets", + "lib/net462/System.Collections.Immutable.dll", + "lib/net462/System.Collections.Immutable.xml", + "lib/net6.0/System.Collections.Immutable.dll", + "lib/net6.0/System.Collections.Immutable.xml", + "lib/net7.0/System.Collections.Immutable.dll", + "lib/net7.0/System.Collections.Immutable.xml", + "lib/net8.0/System.Collections.Immutable.dll", + "lib/net8.0/System.Collections.Immutable.xml", + "lib/netstandard2.0/System.Collections.Immutable.dll", + "lib/netstandard2.0/System.Collections.Immutable.xml", + "system.collections.immutable.8.0.0.nupkg.sha512", + "system.collections.immutable.nuspec", + "useSharedDesignerContext.txt" + ] + }, + "System.IdentityModel.Tokens.Jwt/7.5.1": { + "sha512": "UUw+E0R73lZLlXgneYIJQxNs1kfbcxjVzw64JQyiwjqCd4HMpAbjn+xRo86QZT84uHq8/MkqvfH82tgjgPzpuw==", + "type": "package", + "path": "system.identitymodel.tokens.jwt/7.5.1", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "lib/net461/System.IdentityModel.Tokens.Jwt.dll", + "lib/net461/System.IdentityModel.Tokens.Jwt.xml", + "lib/net462/System.IdentityModel.Tokens.Jwt.dll", + "lib/net462/System.IdentityModel.Tokens.Jwt.xml", + "lib/net472/System.IdentityModel.Tokens.Jwt.dll", + "lib/net472/System.IdentityModel.Tokens.Jwt.xml", + "lib/net6.0/System.IdentityModel.Tokens.Jwt.dll", + "lib/net6.0/System.IdentityModel.Tokens.Jwt.xml", + "lib/net8.0/System.IdentityModel.Tokens.Jwt.dll", + "lib/net8.0/System.IdentityModel.Tokens.Jwt.xml", + "lib/netstandard2.0/System.IdentityModel.Tokens.Jwt.dll", + "lib/netstandard2.0/System.IdentityModel.Tokens.Jwt.xml", + "system.identitymodel.tokens.jwt.7.5.1.nupkg.sha512", + "system.identitymodel.tokens.jwt.nuspec" + ] + }, + "System.Memory/4.5.4": { + "sha512": "1MbJTHS1lZ4bS4FmsJjnuGJOu88ZzTT2rLvrhW7Ygic+pC0NWA+3hgAen0HRdsocuQXCkUTdFn9yHJJhsijDXw==", + "type": "package", + "path": "system.memory/4.5.4", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "LICENSE.TXT", + "THIRD-PARTY-NOTICES.TXT", + "lib/net461/System.Memory.dll", + "lib/net461/System.Memory.xml", + "lib/netcoreapp2.1/_._", + "lib/netstandard1.1/System.Memory.dll", + "lib/netstandard1.1/System.Memory.xml", + "lib/netstandard2.0/System.Memory.dll", + "lib/netstandard2.0/System.Memory.xml", + "ref/netcoreapp2.1/_._", + "system.memory.4.5.4.nupkg.sha512", + "system.memory.nuspec", + "useSharedDesignerContext.txt", + "version.txt" + ] + }, + "System.Reactive/6.0.0": { + "sha512": "31kfaW4ZupZzPsI5PVe77VhnvFF55qgma7KZr/E0iFTs6fmdhhG8j0mgEx620iLTey1EynOkEfnyTjtNEpJzGw==", + "type": "package", + "path": "system.reactive/6.0.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "build/net6.0-windows10.0.19041/_._", + "build/net6.0/_._", + "buildTransitive/net6.0-windows10.0.19041/_._", + "buildTransitive/net6.0/_._", + "icon.png", + "lib/net472/System.Reactive.dll", + "lib/net472/System.Reactive.xml", + "lib/net6.0-windows10.0.19041/System.Reactive.dll", + "lib/net6.0-windows10.0.19041/System.Reactive.xml", + "lib/net6.0/System.Reactive.dll", + "lib/net6.0/System.Reactive.xml", + "lib/netstandard2.0/System.Reactive.dll", + "lib/netstandard2.0/System.Reactive.xml", + "lib/uap10.0.18362/System.Reactive.dll", + "lib/uap10.0.18362/System.Reactive.pri", + "lib/uap10.0.18362/System.Reactive.xml", + "readme.md", + "system.reactive.6.0.0.nupkg.sha512", + "system.reactive.nuspec" + ] + }, + "System.Reflection.Metadata/8.0.0": { + "sha512": "ptvgrFh7PvWI8bcVqG5rsA/weWM09EnthFHR5SCnS6IN+P4mj6rE1lBDC4U8HL9/57htKAqy4KQ3bBj84cfYyQ==", + "type": "package", + "path": "system.reflection.metadata/8.0.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "Icon.png", + "LICENSE.TXT", + "PACKAGE.md", + "THIRD-PARTY-NOTICES.TXT", + "buildTransitive/net461/System.Reflection.Metadata.targets", + "buildTransitive/net462/_._", + "buildTransitive/net6.0/_._", + "buildTransitive/netcoreapp2.0/System.Reflection.Metadata.targets", + "lib/net462/System.Reflection.Metadata.dll", + "lib/net462/System.Reflection.Metadata.xml", + "lib/net6.0/System.Reflection.Metadata.dll", + "lib/net6.0/System.Reflection.Metadata.xml", + "lib/net7.0/System.Reflection.Metadata.dll", + "lib/net7.0/System.Reflection.Metadata.xml", + "lib/net8.0/System.Reflection.Metadata.dll", + "lib/net8.0/System.Reflection.Metadata.xml", + "lib/netstandard2.0/System.Reflection.Metadata.dll", + "lib/netstandard2.0/System.Reflection.Metadata.xml", + "system.reflection.metadata.8.0.0.nupkg.sha512", + "system.reflection.metadata.nuspec", + "useSharedDesignerContext.txt" + ] + }, + "System.Runtime.CompilerServices.Unsafe/6.0.0": { + "sha512": "/iUeP3tq1S0XdNNoMz5C9twLSrM/TH+qElHkXWaPvuNOt+99G75NrV0OS2EqHx5wMN7popYjpc8oTjC1y16DLg==", + "type": "package", + "path": "system.runtime.compilerservices.unsafe/6.0.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "Icon.png", + "LICENSE.TXT", + "THIRD-PARTY-NOTICES.TXT", + "buildTransitive/netcoreapp2.0/System.Runtime.CompilerServices.Unsafe.targets", + "buildTransitive/netcoreapp3.1/_._", + "lib/net461/System.Runtime.CompilerServices.Unsafe.dll", + "lib/net461/System.Runtime.CompilerServices.Unsafe.xml", + "lib/net6.0/System.Runtime.CompilerServices.Unsafe.dll", + "lib/net6.0/System.Runtime.CompilerServices.Unsafe.xml", + "lib/netcoreapp3.1/System.Runtime.CompilerServices.Unsafe.dll", + "lib/netcoreapp3.1/System.Runtime.CompilerServices.Unsafe.xml", + "lib/netstandard2.0/System.Runtime.CompilerServices.Unsafe.dll", + "lib/netstandard2.0/System.Runtime.CompilerServices.Unsafe.xml", + "system.runtime.compilerservices.unsafe.6.0.0.nupkg.sha512", + "system.runtime.compilerservices.unsafe.nuspec", + "useSharedDesignerContext.txt" + ] + }, + "System.Text.Encodings.Web/6.0.0": { + "sha512": "Vg8eB5Tawm1IFqj4TVK1czJX89rhFxJo9ELqc/Eiq0eXy13RK00eubyU6TJE6y+GQXjyV5gSfiewDUZjQgSE0w==", + "type": "package", + "path": "system.text.encodings.web/6.0.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "Icon.png", + "LICENSE.TXT", + "THIRD-PARTY-NOTICES.TXT", + "buildTransitive/netcoreapp2.0/System.Text.Encodings.Web.targets", + "buildTransitive/netcoreapp3.1/_._", + "lib/net461/System.Text.Encodings.Web.dll", + "lib/net461/System.Text.Encodings.Web.xml", + "lib/net6.0/System.Text.Encodings.Web.dll", + "lib/net6.0/System.Text.Encodings.Web.xml", + "lib/netcoreapp3.1/System.Text.Encodings.Web.dll", + "lib/netcoreapp3.1/System.Text.Encodings.Web.xml", + "lib/netstandard2.0/System.Text.Encodings.Web.dll", + "lib/netstandard2.0/System.Text.Encodings.Web.xml", + "runtimes/browser/lib/net6.0/System.Text.Encodings.Web.dll", + "runtimes/browser/lib/net6.0/System.Text.Encodings.Web.xml", + "system.text.encodings.web.6.0.0.nupkg.sha512", + "system.text.encodings.web.nuspec", + "useSharedDesignerContext.txt" + ] + }, + "System.Text.Json/6.0.10": { + "sha512": "NSB0kDipxn2ychp88NXWfFRFlmi1bst/xynOutbnpEfRCT9JZkZ7KOmF/I/hNKo2dILiMGnqblm+j1sggdLB9g==", + "type": "package", + "path": "system.text.json/6.0.10", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "Icon.png", + "LICENSE.TXT", + "THIRD-PARTY-NOTICES.TXT", + "analyzers/dotnet/roslyn3.11/cs/System.Text.Json.SourceGeneration.dll", + "analyzers/dotnet/roslyn3.11/cs/cs/System.Text.Json.SourceGeneration.resources.dll", + "analyzers/dotnet/roslyn3.11/cs/de/System.Text.Json.SourceGeneration.resources.dll", + "analyzers/dotnet/roslyn3.11/cs/es/System.Text.Json.SourceGeneration.resources.dll", + "analyzers/dotnet/roslyn3.11/cs/fr/System.Text.Json.SourceGeneration.resources.dll", + "analyzers/dotnet/roslyn3.11/cs/it/System.Text.Json.SourceGeneration.resources.dll", + "analyzers/dotnet/roslyn3.11/cs/ja/System.Text.Json.SourceGeneration.resources.dll", + "analyzers/dotnet/roslyn3.11/cs/ko/System.Text.Json.SourceGeneration.resources.dll", + "analyzers/dotnet/roslyn3.11/cs/pl/System.Text.Json.SourceGeneration.resources.dll", + "analyzers/dotnet/roslyn3.11/cs/pt-BR/System.Text.Json.SourceGeneration.resources.dll", + "analyzers/dotnet/roslyn3.11/cs/ru/System.Text.Json.SourceGeneration.resources.dll", + "analyzers/dotnet/roslyn3.11/cs/tr/System.Text.Json.SourceGeneration.resources.dll", + "analyzers/dotnet/roslyn3.11/cs/zh-Hans/System.Text.Json.SourceGeneration.resources.dll", + "analyzers/dotnet/roslyn3.11/cs/zh-Hant/System.Text.Json.SourceGeneration.resources.dll", + "analyzers/dotnet/roslyn4.0/cs/System.Text.Json.SourceGeneration.dll", + "analyzers/dotnet/roslyn4.0/cs/cs/System.Text.Json.SourceGeneration.resources.dll", + "analyzers/dotnet/roslyn4.0/cs/de/System.Text.Json.SourceGeneration.resources.dll", + "analyzers/dotnet/roslyn4.0/cs/es/System.Text.Json.SourceGeneration.resources.dll", + "analyzers/dotnet/roslyn4.0/cs/fr/System.Text.Json.SourceGeneration.resources.dll", + "analyzers/dotnet/roslyn4.0/cs/it/System.Text.Json.SourceGeneration.resources.dll", + "analyzers/dotnet/roslyn4.0/cs/ja/System.Text.Json.SourceGeneration.resources.dll", + "analyzers/dotnet/roslyn4.0/cs/ko/System.Text.Json.SourceGeneration.resources.dll", + "analyzers/dotnet/roslyn4.0/cs/pl/System.Text.Json.SourceGeneration.resources.dll", + "analyzers/dotnet/roslyn4.0/cs/pt-BR/System.Text.Json.SourceGeneration.resources.dll", + "analyzers/dotnet/roslyn4.0/cs/ru/System.Text.Json.SourceGeneration.resources.dll", + "analyzers/dotnet/roslyn4.0/cs/tr/System.Text.Json.SourceGeneration.resources.dll", + "analyzers/dotnet/roslyn4.0/cs/zh-Hans/System.Text.Json.SourceGeneration.resources.dll", + "analyzers/dotnet/roslyn4.0/cs/zh-Hant/System.Text.Json.SourceGeneration.resources.dll", + "buildTransitive/netcoreapp2.0/System.Text.Json.targets", + "buildTransitive/netcoreapp3.1/System.Text.Json.targets", + "buildTransitive/netstandard2.0/System.Text.Json.targets", + "lib/net461/System.Text.Json.dll", + "lib/net461/System.Text.Json.xml", + "lib/net6.0/System.Text.Json.dll", + "lib/net6.0/System.Text.Json.xml", + "lib/netcoreapp3.1/System.Text.Json.dll", + "lib/netcoreapp3.1/System.Text.Json.xml", + "lib/netstandard2.0/System.Text.Json.dll", + "lib/netstandard2.0/System.Text.Json.xml", + "system.text.json.6.0.10.nupkg.sha512", + "system.text.json.nuspec", + "useSharedDesignerContext.txt" + ] + }, + "System.Threading.Channels/8.0.0": { + "sha512": "CMaFr7v+57RW7uZfZkPExsPB6ljwzhjACWW1gfU35Y56rk72B/Wu+sTqxVmGSk4SFUlPc3cjeKND0zktziyjBA==", + "type": "package", + "path": "system.threading.channels/8.0.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "Icon.png", + "LICENSE.TXT", + "PACKAGE.md", + "THIRD-PARTY-NOTICES.TXT", + "buildTransitive/net461/System.Threading.Channels.targets", + "buildTransitive/net462/_._", + "buildTransitive/net6.0/_._", + "buildTransitive/netcoreapp2.0/System.Threading.Channels.targets", + "lib/net462/System.Threading.Channels.dll", + "lib/net462/System.Threading.Channels.xml", + "lib/net6.0/System.Threading.Channels.dll", + "lib/net6.0/System.Threading.Channels.xml", + "lib/net7.0/System.Threading.Channels.dll", + "lib/net7.0/System.Threading.Channels.xml", + "lib/net8.0/System.Threading.Channels.dll", + "lib/net8.0/System.Threading.Channels.xml", + "lib/netstandard2.0/System.Threading.Channels.dll", + "lib/netstandard2.0/System.Threading.Channels.xml", + "lib/netstandard2.1/System.Threading.Channels.dll", + "lib/netstandard2.1/System.Threading.Channels.xml", + "system.threading.channels.8.0.0.nupkg.sha512", + "system.threading.channels.nuspec", + "useSharedDesignerContext.txt" + ] + }, + "TUnit/0.6.123": { + "sha512": "lbjLd39Yh+GMG4W/OwN2xRAmsm8y1klrKyC3RWB4n+HBoQxl8N/BfXuJ6yuxzMc8FyH9JgI++C+s9PAtSYP6QQ==", + "type": "package", + "path": "tunit/0.6.123", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "README.md", + "lib/net8.0/TUnit.dll", + "lib/net9.0/TUnit.dll", + "lib/netstandard2.0/TUnit.dll", + "logo.png", + "tunit.0.6.123.nupkg.sha512", + "tunit.nuspec" + ] + }, + "TUnit.Assertions/0.6.123": { + "sha512": "mnoA8aNCYDoYRPOHZTleO591D/h3AUKadSs5jKq+eTliJipOTrxvBv33R/DtC649g8k8ANYASp9u5FC0adVEMA==", + "type": "package", + "path": "tunit.assertions/0.6.123", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "README.md", + "analyzers/dotnet/cs/TUnit.Assertions.Analyzers.CodeFixers.dll", + "analyzers/dotnet/cs/TUnit.Assertions.Analyzers.dll", + "build/netstandard2.0/TUnit.Assertions.props", + "build/netstandard2.0/TUnit.Assertions.targets", + "buildTransitive/net8.0/TUnit.Assertions.props", + "buildTransitive/net8.0/TUnit.Assertions.targets", + "buildTransitive/net9.0/TUnit.Assertions.props", + "buildTransitive/net9.0/TUnit.Assertions.targets", + "buildTransitive/netstandard2.0/TUnit.Assertions.props", + "buildTransitive/netstandard2.0/TUnit.Assertions.targets", + "lib/net8.0/TUnit.Assertions.dll", + "lib/net9.0/TUnit.Assertions.dll", + "lib/netstandard2.0/TUnit.Assertions.dll", + "logo.png", + "tunit.assertions.0.6.123.nupkg.sha512", + "tunit.assertions.nuspec" + ] + }, + "TUnit.Core/0.6.123": { + "sha512": "DWrDQalsHscGNGfufUzY99pSJcro40u48QJIiwFufs0aqSvxlWTIREItLkqWZC6kPt8IxyYCdJwSl+AK9u6vhQ==", + "type": "package", + "path": "tunit.core/0.6.123", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "README.md", + "analyzers/dotnet/roslyn4.4/cs/TUnit.Analyzers.dll", + "analyzers/dotnet/roslyn4.4/cs/TUnit.Core.SourceGenerator.dll", + "analyzers/dotnet/roslyn4.7/cs/TUnit.Analyzers.dll", + "analyzers/dotnet/roslyn4.7/cs/TUnit.Core.SourceGenerator.dll", + "build/netstandard2.0/TUnit.Core.props", + "build/netstandard2.0/TUnit.Core.targets", + "buildTransitive/net8.0/TUnit.Core.props", + "buildTransitive/net8.0/TUnit.Core.targets", + "buildTransitive/net9.0/TUnit.Core.props", + "buildTransitive/net9.0/TUnit.Core.targets", + "buildTransitive/netstandard2.0/TUnit.Core.props", + "buildTransitive/netstandard2.0/TUnit.Core.targets", + "lib/net8.0/TUnit.Core.dll", + "lib/net9.0/TUnit.Core.dll", + "lib/netstandard2.0/TUnit.Core.dll", + "logo.png", + "tunit.core.0.6.123.nupkg.sha512", + "tunit.core.nuspec" + ] + }, + "TUnit.Engine/0.6.123": { + "sha512": "p2J1t5/9ORvU2ap4Wde5L7on/Zb2wFTcm5lIFm7axb0iR+P8LZd28O8NRqTLJ97PgMYQ2aIas8da3vvEY1JDsw==", + "type": "package", + "path": "tunit.engine/0.6.123", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "README.md", + "build/netstandard2.0/TUnit.Engine.props", + "buildTransitive/net8.0/TUnit.Engine.props", + "buildTransitive/net9.0/TUnit.Engine.props", + "buildTransitive/netstandard2.0/TUnit.Engine.props", + "lib/net8.0/TUnit.Engine.dll", + "lib/net9.0/TUnit.Engine.dll", + "lib/netstandard2.0/TUnit.Engine.dll", + "logo.png", + "tunit.engine.0.6.123.nupkg.sha512", + "tunit.engine.nuspec" + ] + }, + "Websocket.Client/5.1.1": { + "sha512": "VpQV6b8HRnw6bFFIPTOOMtOxba3/viH9K2U2LdOYNjQ2b2HrLHxjodmJr3nPwyNSrtrRPr1RDwOMJ5qqlPnCVg==", + "type": "package", + "path": "websocket.client/5.1.1", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "README.md", + "icon-modern.png", + "icon.png", + "lib/net6.0/Websocket.Client.dll", + "lib/net6.0/Websocket.Client.xml", + "lib/net7.0/Websocket.Client.dll", + "lib/net7.0/Websocket.Client.xml", + "lib/net8.0/Websocket.Client.dll", + "lib/net8.0/Websocket.Client.xml", + "lib/netstandard2.1/Websocket.Client.dll", + "lib/netstandard2.1/Websocket.Client.xml", + "websocket.client.5.1.1.nupkg.sha512", + "websocket.client.nuspec" + ] + } + }, + "projectFileDependencyGroups": { + "net9.0": [ + "Microsoft.Testing.Extensions.CodeCoverage >= 17.13.1", + "Supabase >= 1.1.1", + "TUnit >= 0.6.123" + ] + }, + "packageFolders": { + "/Users/baez/.nuget/packages/": {} + }, + "project": { + "version": "1.0.0", + "restore": { + "projectUniqueName": "/Users/baez/sources/code.icb4dc0.de/prskr/supabase-operator/testdata/dotnet-client/test/supabase-integration.api-test/supabase-integration.api-test.csproj", + "projectName": "supabase-integration.api-test", + "projectPath": "/Users/baez/sources/code.icb4dc0.de/prskr/supabase-operator/testdata/dotnet-client/test/supabase-integration.api-test/supabase-integration.api-test.csproj", + "packagesPath": "/Users/baez/.nuget/packages/", + "outputPath": "/Users/baez/sources/code.icb4dc0.de/prskr/supabase-operator/testdata/dotnet-client/test/supabase-integration.api-test/obj/", + "projectStyle": "PackageReference", + "configFilePaths": [ + "/Users/baez/.nuget/NuGet/NuGet.Config" + ], + "originalTargetFrameworks": [ + "net9.0" + ], + "sources": { + "https://api.nuget.org/v3/index.json": {} + }, + "frameworks": { + "net9.0": { + "targetAlias": "net9.0", + "projectReferences": {} + } + }, + "warningProperties": { + "warnAsError": [ + "NU1605" + ] + }, + "restoreAuditProperties": { + "enableAudit": "true", + "auditLevel": "low", + "auditMode": "direct" + }, + "SdkAnalysisLevel": "9.0.100" + }, + "frameworks": { + "net9.0": { + "targetAlias": "net9.0", + "dependencies": { + "Microsoft.Testing.Extensions.CodeCoverage": { + "target": "Package", + "version": "[17.13.1, )" + }, + "Supabase": { + "target": "Package", + "version": "[1.1.1, )" + }, + "TUnit": { + "target": "Package", + "version": "[0.6.123, )" + } + }, + "imports": [ + "net461", + "net462", + "net47", + "net471", + "net472", + "net48", + "net481" + ], + "assetTargetFallback": true, + "warn": true, + "frameworkReferences": { + "Microsoft.NETCore.App": { + "privateAssets": "all" + } + }, + "runtimeIdentifierGraphPath": "/usr/local/share/dotnet/sdk/9.0.102/PortableRuntimeIdentifierGraph.json" + } + } + } +} \ No newline at end of file diff --git a/testdata/dotnet-client/test/supabase-integration.api-test/obj/project.nuget.cache b/testdata/dotnet-client/test/supabase-integration.api-test/obj/project.nuget.cache new file mode 100644 index 0000000..6d0faf0 --- /dev/null +++ b/testdata/dotnet-client/test/supabase-integration.api-test/obj/project.nuget.cache @@ -0,0 +1,47 @@ +{ + "version": 2, + "dgSpecHash": "R14E93Erk28=", + "success": true, + "projectFilePath": "/Users/baez/sources/code.icb4dc0.de/prskr/supabase-operator/testdata/dotnet-client/test/supabase-integration.api-test/supabase-integration.api-test.csproj", + "expectedPackageFiles": [ + "/Users/baez/.nuget/packages/enumerableasyncprocessor/2.0.6/enumerableasyncprocessor.2.0.6.nupkg.sha512", + "/Users/baez/.nuget/packages/microsoft.diasymreader/2.0.0/microsoft.diasymreader.2.0.0.nupkg.sha512", + "/Users/baez/.nuget/packages/microsoft.extensions.dependencyinjection.abstractions/8.0.0/microsoft.extensions.dependencyinjection.abstractions.8.0.0.nupkg.sha512", + "/Users/baez/.nuget/packages/microsoft.extensions.dependencymodel/6.0.1/microsoft.extensions.dependencymodel.6.0.1.nupkg.sha512", + "/Users/baez/.nuget/packages/microsoft.extensions.logging.abstractions/8.0.0/microsoft.extensions.logging.abstractions.8.0.0.nupkg.sha512", + "/Users/baez/.nuget/packages/microsoft.identitymodel.abstractions/7.5.1/microsoft.identitymodel.abstractions.7.5.1.nupkg.sha512", + "/Users/baez/.nuget/packages/microsoft.identitymodel.jsonwebtokens/7.5.1/microsoft.identitymodel.jsonwebtokens.7.5.1.nupkg.sha512", + "/Users/baez/.nuget/packages/microsoft.identitymodel.logging/7.5.1/microsoft.identitymodel.logging.7.5.1.nupkg.sha512", + "/Users/baez/.nuget/packages/microsoft.identitymodel.tokens/7.5.1/microsoft.identitymodel.tokens.7.5.1.nupkg.sha512", + "/Users/baez/.nuget/packages/microsoft.io.recyclablememorystream/3.0.0/microsoft.io.recyclablememorystream.3.0.0.nupkg.sha512", + "/Users/baez/.nuget/packages/microsoft.testing.extensions.codecoverage/17.13.1/microsoft.testing.extensions.codecoverage.17.13.1.nupkg.sha512", + "/Users/baez/.nuget/packages/microsoft.testing.extensions.trxreport.abstractions/1.4.3/microsoft.testing.extensions.trxreport.abstractions.1.4.3.nupkg.sha512", + "/Users/baez/.nuget/packages/microsoft.testing.platform/1.4.3/microsoft.testing.platform.1.4.3.nupkg.sha512", + "/Users/baez/.nuget/packages/microsoft.testing.platform.msbuild/1.4.3/microsoft.testing.platform.msbuild.1.4.3.nupkg.sha512", + "/Users/baez/.nuget/packages/mimemapping/3.0.1/mimemapping.3.0.1.nupkg.sha512", + "/Users/baez/.nuget/packages/newtonsoft.json/13.0.3/newtonsoft.json.13.0.3.nupkg.sha512", + "/Users/baez/.nuget/packages/supabase/1.1.1/supabase.1.1.1.nupkg.sha512", + "/Users/baez/.nuget/packages/supabase.core/1.0.0/supabase.core.1.0.0.nupkg.sha512", + "/Users/baez/.nuget/packages/supabase.functions/2.0.0/supabase.functions.2.0.0.nupkg.sha512", + "/Users/baez/.nuget/packages/supabase.gotrue/6.0.3/supabase.gotrue.6.0.3.nupkg.sha512", + "/Users/baez/.nuget/packages/supabase.postgrest/4.0.3/supabase.postgrest.4.0.3.nupkg.sha512", + "/Users/baez/.nuget/packages/supabase.realtime/7.0.2/supabase.realtime.7.0.2.nupkg.sha512", + "/Users/baez/.nuget/packages/supabase.storage/2.0.2/supabase.storage.2.0.2.nupkg.sha512", + "/Users/baez/.nuget/packages/system.buffers/4.5.1/system.buffers.4.5.1.nupkg.sha512", + "/Users/baez/.nuget/packages/system.collections.immutable/8.0.0/system.collections.immutable.8.0.0.nupkg.sha512", + "/Users/baez/.nuget/packages/system.identitymodel.tokens.jwt/7.5.1/system.identitymodel.tokens.jwt.7.5.1.nupkg.sha512", + "/Users/baez/.nuget/packages/system.memory/4.5.4/system.memory.4.5.4.nupkg.sha512", + "/Users/baez/.nuget/packages/system.reactive/6.0.0/system.reactive.6.0.0.nupkg.sha512", + "/Users/baez/.nuget/packages/system.reflection.metadata/8.0.0/system.reflection.metadata.8.0.0.nupkg.sha512", + "/Users/baez/.nuget/packages/system.runtime.compilerservices.unsafe/6.0.0/system.runtime.compilerservices.unsafe.6.0.0.nupkg.sha512", + "/Users/baez/.nuget/packages/system.text.encodings.web/6.0.0/system.text.encodings.web.6.0.0.nupkg.sha512", + "/Users/baez/.nuget/packages/system.text.json/6.0.10/system.text.json.6.0.10.nupkg.sha512", + "/Users/baez/.nuget/packages/system.threading.channels/8.0.0/system.threading.channels.8.0.0.nupkg.sha512", + "/Users/baez/.nuget/packages/tunit/0.6.123/tunit.0.6.123.nupkg.sha512", + "/Users/baez/.nuget/packages/tunit.assertions/0.6.123/tunit.assertions.0.6.123.nupkg.sha512", + "/Users/baez/.nuget/packages/tunit.core/0.6.123/tunit.core.0.6.123.nupkg.sha512", + "/Users/baez/.nuget/packages/tunit.engine/0.6.123/tunit.engine.0.6.123.nupkg.sha512", + "/Users/baez/.nuget/packages/websocket.client/5.1.1/websocket.client.5.1.1.nupkg.sha512" + ], + "logs": [] +} \ No newline at end of file diff --git a/testdata/dotnet-client/test/supabase-integration.api-test/obj/project.packagespec.json b/testdata/dotnet-client/test/supabase-integration.api-test/obj/project.packagespec.json new file mode 100644 index 0000000..f88e0b9 --- /dev/null +++ b/testdata/dotnet-client/test/supabase-integration.api-test/obj/project.packagespec.json @@ -0,0 +1 @@ +"restore":{"projectUniqueName":"/Users/baez/sources/code.icb4dc0.de/prskr/supabase-operator/testdata/dotnet-client/test/supabase-integration.api-test/supabase-integration.api-test.csproj","projectName":"supabase-integration.api-test","projectPath":"/Users/baez/sources/code.icb4dc0.de/prskr/supabase-operator/testdata/dotnet-client/test/supabase-integration.api-test/supabase-integration.api-test.csproj","outputPath":"/Users/baez/sources/code.icb4dc0.de/prskr/supabase-operator/testdata/dotnet-client/test/supabase-integration.api-test/obj/","projectStyle":"PackageReference","originalTargetFrameworks":["net9.0"],"sources":{"https://api.nuget.org/v3/index.json":{}},"frameworks":{"net9.0":{"targetAlias":"net9.0","projectReferences":{}}},"warningProperties":{"warnAsError":["NU1605"]},"restoreAuditProperties":{"enableAudit":"true","auditLevel":"low","auditMode":"direct"},"SdkAnalysisLevel":"9.0.100"}"frameworks":{"net9.0":{"targetAlias":"net9.0","dependencies":{"Microsoft.Testing.Extensions.CodeCoverage":{"target":"Package","version":"[17.13.1, )"},"Supabase":{"target":"Package","version":"[1.1.1, )"},"TUnit":{"target":"Package","version":"[0.6.123, )"}},"imports":["net461","net462","net47","net471","net472","net48","net481"],"assetTargetFallback":true,"warn":true,"frameworkReferences":{"Microsoft.NETCore.App":{"privateAssets":"all"}},"runtimeIdentifierGraphPath":"/usr/local/share/dotnet/sdk/9.0.102/PortableRuntimeIdentifierGraph.json"}} \ No newline at end of file diff --git a/testdata/dotnet-client/test/supabase-integration.api-test/obj/rider.project.model.nuget.info b/testdata/dotnet-client/test/supabase-integration.api-test/obj/rider.project.model.nuget.info new file mode 100644 index 0000000..6f87a25 --- /dev/null +++ b/testdata/dotnet-client/test/supabase-integration.api-test/obj/rider.project.model.nuget.info @@ -0,0 +1 @@ +17372014475364470 \ No newline at end of file diff --git a/testdata/dotnet-client/test/supabase-integration.api-test/obj/rider.project.restore.info b/testdata/dotnet-client/test/supabase-integration.api-test/obj/rider.project.restore.info new file mode 100644 index 0000000..6f87a25 --- /dev/null +++ b/testdata/dotnet-client/test/supabase-integration.api-test/obj/rider.project.restore.info @@ -0,0 +1 @@ +17372014475364470 \ No newline at end of file diff --git a/testdata/dotnet-client/test/supabase-integration.api-test/obj/supabase-integration.api-test.csproj.nuget.dgspec.json b/testdata/dotnet-client/test/supabase-integration.api-test/obj/supabase-integration.api-test.csproj.nuget.dgspec.json new file mode 100644 index 0000000..0eed750 --- /dev/null +++ b/testdata/dotnet-client/test/supabase-integration.api-test/obj/supabase-integration.api-test.csproj.nuget.dgspec.json @@ -0,0 +1,81 @@ +{ + "format": 1, + "restore": { + "/Users/baez/sources/code.icb4dc0.de/prskr/supabase-operator/testdata/dotnet-client/test/supabase-integration.api-test/supabase-integration.api-test.csproj": {} + }, + "projects": { + "/Users/baez/sources/code.icb4dc0.de/prskr/supabase-operator/testdata/dotnet-client/test/supabase-integration.api-test/supabase-integration.api-test.csproj": { + "version": "1.0.0", + "restore": { + "projectUniqueName": "/Users/baez/sources/code.icb4dc0.de/prskr/supabase-operator/testdata/dotnet-client/test/supabase-integration.api-test/supabase-integration.api-test.csproj", + "projectName": "supabase-integration.api-test", + "projectPath": "/Users/baez/sources/code.icb4dc0.de/prskr/supabase-operator/testdata/dotnet-client/test/supabase-integration.api-test/supabase-integration.api-test.csproj", + "packagesPath": "/Users/baez/.nuget/packages/", + "outputPath": "/Users/baez/sources/code.icb4dc0.de/prskr/supabase-operator/testdata/dotnet-client/test/supabase-integration.api-test/obj/", + "projectStyle": "PackageReference", + "configFilePaths": [ + "/Users/baez/.nuget/NuGet/NuGet.Config" + ], + "originalTargetFrameworks": [ + "net9.0" + ], + "sources": { + "https://api.nuget.org/v3/index.json": {} + }, + "frameworks": { + "net9.0": { + "targetAlias": "net9.0", + "projectReferences": {} + } + }, + "warningProperties": { + "warnAsError": [ + "NU1605" + ] + }, + "restoreAuditProperties": { + "enableAudit": "true", + "auditLevel": "low", + "auditMode": "direct" + }, + "SdkAnalysisLevel": "9.0.100" + }, + "frameworks": { + "net9.0": { + "targetAlias": "net9.0", + "dependencies": { + "Microsoft.Testing.Extensions.CodeCoverage": { + "target": "Package", + "version": "[17.13.1, )" + }, + "Supabase": { + "target": "Package", + "version": "[1.1.1, )" + }, + "TUnit": { + "target": "Package", + "version": "[0.6.123, )" + } + }, + "imports": [ + "net461", + "net462", + "net47", + "net471", + "net472", + "net48", + "net481" + ], + "assetTargetFallback": true, + "warn": true, + "frameworkReferences": { + "Microsoft.NETCore.App": { + "privateAssets": "all" + } + }, + "runtimeIdentifierGraphPath": "/usr/local/share/dotnet/sdk/9.0.102/PortableRuntimeIdentifierGraph.json" + } + } + } + } +} \ No newline at end of file diff --git a/testdata/dotnet-client/test/supabase-integration.api-test/obj/supabase-integration.api-test.csproj.nuget.g.props b/testdata/dotnet-client/test/supabase-integration.api-test/obj/supabase-integration.api-test.csproj.nuget.g.props new file mode 100644 index 0000000..768511d --- /dev/null +++ b/testdata/dotnet-client/test/supabase-integration.api-test/obj/supabase-integration.api-test.csproj.nuget.g.props @@ -0,0 +1,23 @@ + + + + True + NuGet + $(MSBuildThisFileDirectory)project.assets.json + /Users/baez/.nuget/packages/ + /Users/baez/.nuget/packages/ + PackageReference + 6.12.2 + + + + + + + + + + + + + \ No newline at end of file diff --git a/testdata/dotnet-client/test/supabase-integration.api-test/obj/supabase-integration.api-test.csproj.nuget.g.targets b/testdata/dotnet-client/test/supabase-integration.api-test/obj/supabase-integration.api-test.csproj.nuget.g.targets new file mode 100644 index 0000000..be31931 --- /dev/null +++ b/testdata/dotnet-client/test/supabase-integration.api-test/obj/supabase-integration.api-test.csproj.nuget.g.targets @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/testdata/dotnet-client/test/supabase-integration.api-test/supabase-integration.api-test.csproj b/testdata/dotnet-client/test/supabase-integration.api-test/supabase-integration.api-test.csproj new file mode 100644 index 0000000..147a306 --- /dev/null +++ b/testdata/dotnet-client/test/supabase-integration.api-test/supabase-integration.api-test.csproj @@ -0,0 +1,22 @@ + + + + net9.0 + Exe + supabase_integration.api_test + enable + enable + false + + + + + + + + + + + + +