From 4fa9de43146e88e9ddf4fc6f64602c58a2dce153 Mon Sep 17 00:00:00 2001 From: Livio Spring Date: Fri, 31 May 2024 15:06:59 +0200 Subject: [PATCH 01/44] fix(oidc): make sure id_token does not contain any info from access token actions (#8053) # Which Problems Are Solved During tests of 2.53.3 we noticed that in cases where the `idTokenRoleAssertion` was disabled, claims set in the preAccessTokenTrigger where also set in the id_token. # How the Problems Are Solved The userinfo of the id_token now uses a correct copy of their own. # Additional Changes None. # Additional Context - relates to #7822 - relates to #8046 --- internal/api/oidc/userinfo.go | 26 +++++++++++++++++--------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/internal/api/oidc/userinfo.go b/internal/api/oidc/userinfo.go index 7d352457bc..415c337c76 100644 --- a/internal/api/oidc/userinfo.go +++ b/internal/api/oidc/userinfo.go @@ -5,6 +5,7 @@ import ( "encoding/base64" "encoding/json" "fmt" + "maps" "net/http" "slices" "strings" @@ -93,7 +94,7 @@ func (s *Server) userInfo( ) func(ctx context.Context, roleAssertion bool, triggerType domain.TriggerType) (_ *oidc.UserInfo, err error) { var ( once sync.Once - userInfo *oidc.UserInfo + rawUserInfo *oidc.UserInfo qu *query.OIDCUserInfo roleAudience, requestedRoles []string ) @@ -107,10 +108,19 @@ func (s *Server) userInfo( if err != nil { return } - userInfo = userInfoToOIDC(qu, userInfoAssertion, scope, s.assetAPIPrefix(ctx)) + rawUserInfo = userInfoToOIDC(qu, userInfoAssertion, scope, s.assetAPIPrefix(ctx)) }) - userInfoWithRoles := assertRoles(projectID, qu, roleAudience, requestedRoles, roleAssertion, userInfo) - return userInfoWithRoles, s.userinfoFlows(ctx, qu, userInfoWithRoles, triggerType) + // copy the userinfo to make sure the assert roles and actions use their own copy (e.g. map) + userInfo := &oidc.UserInfo{ + Subject: rawUserInfo.Subject, + UserInfoProfile: rawUserInfo.UserInfoProfile, + UserInfoEmail: rawUserInfo.UserInfoEmail, + UserInfoPhone: rawUserInfo.UserInfoPhone, + Address: rawUserInfo.Address, + Claims: maps.Clone(rawUserInfo.Claims), + } + assertRoles(projectID, qu, roleAudience, requestedRoles, roleAssertion, userInfo) + return userInfo, s.userinfoFlows(ctx, qu, userInfo, triggerType) } } @@ -191,16 +201,14 @@ func userInfoToOIDC(user *query.OIDCUserInfo, userInfoAssertion bool, scope []st return out } -func assertRoles(projectID string, user *query.OIDCUserInfo, roleAudience, requestedRoles []string, assertion bool, info *oidc.UserInfo) *oidc.UserInfo { +func assertRoles(projectID string, user *query.OIDCUserInfo, roleAudience, requestedRoles []string, assertion bool, info *oidc.UserInfo) { if !assertion { - return info + return } - userInfo := *info // prevent returning obtained grants if none where requested if (projectID != "" && len(requestedRoles) > 0) || len(roleAudience) > 0 { - setUserInfoRoleClaims(&userInfo, newProjectRoles(projectID, user.UserGrants, requestedRoles)) + setUserInfoRoleClaims(info, newProjectRoles(projectID, user.UserGrants, requestedRoles)) } - return &userInfo } func userInfoEmailToOIDC(user *query.User) oidc.UserInfoEmail { From b543404af5660ea862d3a9aaf2b75666b3e09562 Mon Sep 17 00:00:00 2001 From: Elio Bischof Date: Fri, 31 May 2024 19:18:49 +0200 Subject: [PATCH 02/44] docs: fix typo in mirror.mdx (#8056) --- docs/docs/self-hosting/manage/cli/mirror.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/docs/self-hosting/manage/cli/mirror.mdx b/docs/docs/self-hosting/manage/cli/mirror.mdx index 8f96ed93df..1c32dc8741 100644 --- a/docs/docs/self-hosting/manage/cli/mirror.mdx +++ b/docs/docs/self-hosting/manage/cli/mirror.mdx @@ -42,7 +42,7 @@ The following commands setup the database as described above. See [configuration ```bash zitadel init --config /path/to/your/new/config.yaml -zitadel setup --for-init --config /path/to/your/new/config.yaml # make sure to set --tlsMode and masterkey analog to your current deployment +zitadel setup --for-mirror --config /path/to/your/new/config.yaml # make sure to set --tlsMode and masterkey analog to your current deployment zitadel mirror --system --config /path/to/your/mirror/config.yaml # make sure to set --tlsMode and masterkey analog to your current deployment ``` From cedd992ab97a97755c7034528b8e72e3cf621076 Mon Sep 17 00:00:00 2001 From: Elio Bischof Date: Wed, 5 Jun 2024 15:46:48 +0200 Subject: [PATCH 03/44] docs: describe new API concepts (#7975) # Which Problems Are Solved We have not enough internal and external input about our ideas for the new API design. # How the Problems Are Solved We make the concepts easily accessible by publishing them in our docs and making them concise. # Additional Context - Contributes to #6305 - Replaces the PR #7821 which defines protos in more detail Only resources and settings are in the scope of this concept. A possible solution for defining the outscoped methods could for example look like this: ## ZITADELInsights query services for auditing, analytics and data synchronization. - Events - Milestones ## ZITADELOperations - Health - Failed Events - Views - Metrics (version, uptime etc.) --- docs/docs/apis/_v3_action_execution.proto | 123 +++++ docs/docs/apis/_v3_action_search.proto | 111 +++++ docs/docs/apis/_v3_action_service.proto | 554 ++++++++++++++++++++++ docs/docs/apis/_v3_action_target.proto | 94 ++++ docs/docs/apis/_v3_idp.proto | 94 ++++ docs/docs/apis/_v3_idp_gitlab.proto | 59 +++ docs/docs/apis/_v3_idp_search.proto | 47 ++ docs/docs/apis/_v3_idp_service.proto | 325 +++++++++++++ docs/docs/apis/_v3_language.proto | 69 +++ docs/docs/apis/_v3_language_service.proto | 158 ++++++ docs/docs/apis/_v3_object.proto | 33 ++ docs/docs/apis/_v3_resource_object.proto | 155 ++++++ docs/docs/apis/_v3_settings_object.proto | 193 ++++++++ docs/docs/apis/v3.mdx | 337 ++++++++++++- docs/docusaurus.config.js | 2 +- 15 files changed, 2347 insertions(+), 7 deletions(-) create mode 100644 docs/docs/apis/_v3_action_execution.proto create mode 100644 docs/docs/apis/_v3_action_search.proto create mode 100644 docs/docs/apis/_v3_action_service.proto create mode 100644 docs/docs/apis/_v3_action_target.proto create mode 100644 docs/docs/apis/_v3_idp.proto create mode 100644 docs/docs/apis/_v3_idp_gitlab.proto create mode 100644 docs/docs/apis/_v3_idp_search.proto create mode 100644 docs/docs/apis/_v3_idp_service.proto create mode 100644 docs/docs/apis/_v3_language.proto create mode 100644 docs/docs/apis/_v3_language_service.proto create mode 100644 docs/docs/apis/_v3_object.proto create mode 100644 docs/docs/apis/_v3_resource_object.proto create mode 100644 docs/docs/apis/_v3_settings_object.proto diff --git a/docs/docs/apis/_v3_action_execution.proto b/docs/docs/apis/_v3_action_execution.proto new file mode 100644 index 0000000000..dc040a2466 --- /dev/null +++ b/docs/docs/apis/_v3_action_execution.proto @@ -0,0 +1,123 @@ +syntax = "proto3"; + +package zitadel.resources.action.v3alpha; + +import "google/api/annotations.proto"; +import "google/api/field_behavior.proto"; +import "google/protobuf/duration.proto"; +import "google/protobuf/struct.proto"; +import "protoc-gen-openapiv2/options/annotations.proto"; +import "validate/validate.proto"; +import "zitadel/protoc_gen_zitadel/v2/options.proto"; + +import "zitadel/resources/object/v3alpha/object.proto"; + +option go_package = "github.com/zitadel/zitadel/pkg/grpc/resources/action/v3alpha;action"; + +message Execution { + Condition condition = 1; + // Target IDs which are called when the defined conditions trigger. + repeated string targets = 2; + // Included executions with the same condition-types. + repeated string includes = 3; +} + +message GetExecution { + zitadel.resources.object.v3alpha.Details details = 1; + Execution execution = 2; +} + +message Condition { + // Condition-types under which conditions the execution should trigger. Only one is possible. + oneof condition_type { + option (validate.required) = true; + + // Condition-type to execute after a request on the defined API point is received. + RequestExecution request = 1; + // Condition-type to execute before a response on the defined API point is returned. + ResponseExecution response = 2; + // Condition-type to execute when a function is used, replaces actions v1. + string function = 3; + // Condition-type to execute after an event is created in the system. + EventExecution event = 4; + } +} + +message RequestExecution { + // Condition for the request execution. Only one is possible. + oneof condition{ + // GRPC-method as condition. + string method = 1 [ + (validate.rules).string = {min_len: 1, max_len: 1000}, + (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { + min_length: 1, + max_length: 1000, + example: "\"/zitadel.session.v2beta.SessionService/ListSessions\""; + } + ]; + // GRPC-service as condition. + string service = 2 [ + (validate.rules).string = {min_len: 1, max_len: 1000}, + (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { + min_length: 1, + max_length: 1000, + example: "\"zitadel.session.v2beta.SessionService\""; + } + ]; + // All calls to any available services and methods as condition. + bool all = 3; + } +} + +message ResponseExecution { + // Condition for the response execution. Only one is possible. + oneof condition{ + // GRPC-method as condition. + string method = 1 [ + (validate.rules).string = {min_len: 1, max_len: 1000}, + (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { + min_length: 1, + max_length: 1000, + example: "\"/zitadel.session.v2beta.SessionService/ListSessions\""; + } + ]; + // GRPC-service as condition. + string service = 2 [ + (validate.rules).string = {min_len: 1, max_len: 1000}, + (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { + min_length: 1, + max_length: 1000, + example: "\"zitadel.session.v2beta.SessionService\""; + } + ]; + // All calls to any available services and methods as condition. + bool all = 3; + } +} + +message EventExecution{ + // Condition for the event execution. Only one is possible. + oneof condition{ + // Event name as condition. + string event = 1 [ + (validate.rules).string = {min_len: 1, max_len: 1000}, + (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { + min_length: 1, + max_length: 1000, + example: "\"user.human.added\""; + } + ]; + // Event group as condition, all events under this group. + string group = 2 [ + (validate.rules).string = {min_len: 1, max_len: 1000}, + (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { + min_length: 1, + max_length: 1000, + example: "\"user.human\""; + } + ]; + // all events as condition. + bool all = 3; + } +} + diff --git a/docs/docs/apis/_v3_action_search.proto b/docs/docs/apis/_v3_action_search.proto new file mode 100644 index 0000000000..bae01c9061 --- /dev/null +++ b/docs/docs/apis/_v3_action_search.proto @@ -0,0 +1,111 @@ +syntax = "proto3"; + +package zitadel.resources.action.v3alpha; + +option go_package = "github.com/zitadel/zitadel/pkg/grpc/resources/action/v3alpha;action"; + +import "google/api/field_behavior.proto"; +import "protoc-gen-openapiv2/options/annotations.proto"; +import "validate/validate.proto"; + +import "zitadel/resources/object/v3alpha/object.proto"; +import "zitadel/resources/action/v3alpha/execution.proto"; + +message ExecutionSearchFilter { + oneof filter { + option (validate.required) = true; + + InConditionsFilter in_conditions = 1; + ExecutionTypeFilter execution_type = 2; + TargetFilter target = 3; + IncludeFilter include = 4; + } +} + +message InConditionsFilter { + // Defines the conditions to query for. + repeated Condition conditions = 1; +} + +message ExecutionTypeFilter { + // Defines the type to query for. + ExecutionType type = 1; +} + +message TargetFilter { + // Defines the id to query for. + string id = 1 [ + (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { + description: "the id of the targets to include" + example: "\"69629023906488334\""; + } + ]; +} + +message IncludeFilter { + // Defines the include to query for. + string include = 1 [ + (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { + description: "the id of the include" + example: "\"request.zitadel.session.v2beta.SessionService\""; + } + ]; +} + +message TargetSearchFilter { + oneof query { + option (validate.required) = true; + + TargetNameFilter name = 1; + InTargetIDsFilter in_ids = 2; + } +} + +message TargetNameFilter { + // Defines the name of the target to query for. + string name = 1 [ + (validate.rules).string = {max_len: 200}, + (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { + max_length: 200; + example: "\"ip_allow_list\""; + } + ]; + // Defines which text comparison method used for the name query. + zitadel.resources.object.v3alpha.TextFilterMethod method = 2 [ + (validate.rules).enum.defined_only = true, + (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { + description: "defines which text equality method is used"; + } + ]; +} + +message InTargetIDsFilter { + // Defines the ids to query for. + repeated string ids = 1 [ + (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { + description: "the ids of the targets to include" + example: "[\"69629023906488334\",\"69622366012355662\"]"; + } + ]; +} + +enum ExecutionType { + EXECUTION_TYPE_UNSPECIFIED = 0; + EXECUTION_TYPE_REQUEST = 1; + EXECUTION_TYPE_RESPONSE = 2; + EXECUTION_TYPE_EVENT = 3; + EXECUTION_TYPE_FUNCTION = 4; +} + +enum TargetFieldName { + TARGET_FIELD_NAME_UNSPECIFIED = 0; + TARGET_FIELD_NAME_ID = 1; + TARGET_FIELD_NAME_CREATION_DATE = 2; + TARGET_FIELD_NAME_CHANGE_DATE = 3; + TARGET_FIELD_NAME_NAME = 4; + TARGET_FIELD_NAME_TARGET_TYPE = 5; + TARGET_FIELD_NAME_URL = 6; + TARGET_FIELD_NAME_TIMEOUT = 7; + TARGET_FIELD_NAME_ASYNC = 8; + TARGET_FIELD_NAME_INTERRUPT_ON_ERROR = 9; +} diff --git a/docs/docs/apis/_v3_action_service.proto b/docs/docs/apis/_v3_action_service.proto new file mode 100644 index 0000000000..5bb2b658c1 --- /dev/null +++ b/docs/docs/apis/_v3_action_service.proto @@ -0,0 +1,554 @@ +syntax = "proto3"; + +package zitadel.resources.action.v3alpha; + +import "google/api/annotations.proto"; +import "google/api/field_behavior.proto"; +import "google/protobuf/duration.proto"; +import "google/protobuf/struct.proto"; +import "protoc-gen-openapiv2/options/annotations.proto"; +import "validate/validate.proto"; +import "zitadel/protoc_gen_zitadel/v2/options.proto"; + +import "zitadel/resources/action/v3alpha/target.proto"; +import "zitadel/resources/action/v3alpha/execution.proto"; +import "zitadel/resources/action/v3alpha/search.proto"; +import "zitadel/resources/object/v3alpha/object.proto"; + +option go_package = "github.com/zitadel/zitadel/pkg/grpc/resources/action/v3alpha;action"; + +option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_swagger) = { + info: { + title: "Action Service"; + version: "3.0-alpha"; + description: "This API is intended to manage custom executions (previously known as actions) in a ZITADEL instance. It is behind the feature flag \"multitenancy_resources_api\". It will continue breaking as long as it is in alpha state."; + contact:{ + name: "ZITADEL" + url: "https://zitadel.com" + email: "hi@zitadel.com" + } + license: { + name: "Apache 2.0", + url: "https://github.com/zitadel/zitadel/blob/main/LICENSE"; + }; + }; + schemes: HTTPS; + schemes: HTTP; + + consumes: "application/json"; + consumes: "application/grpc"; + + produces: "application/json"; + produces: "application/grpc"; + + consumes: "application/grpc-web+proto"; + produces: "application/grpc-web+proto"; + + host: "$ZITADEL_DOMAIN"; + base_path: "/resources/v3alpha"; + + external_docs: { + description: "Detailed information about ZITADEL", + url: "https://zitadel.com/docs" + } + security_definitions: { + security: { + key: "OAuth2"; + value: { + type: TYPE_OAUTH2; + flow: FLOW_ACCESS_CODE; + authorization_url: "$CUSTOM-DOMAIN/oauth/v2/authorize"; + token_url: "$CUSTOM-DOMAIN/oauth/v2/token"; + scopes: { + scope: { + key: "openid"; + value: "openid"; + } + scope: { + key: "urn:zitadel:iam:org:project:id:zitadel:aud"; + value: "urn:zitadel:iam:org:project:id:zitadel:aud"; + } + } + } + } + } + security: { + security_requirement: { + key: "OAuth2"; + value: { + scope: "openid"; + scope: "urn:zitadel:iam:org:project:id:zitadel:aud"; + } + } + } + responses: { + key: "403"; + value: { + description: "Returned when the user does not have permission to access the resource."; + schema: { + json_schema: { + ref: "#/definitions/rpcStatus"; + } + } + } + } + responses: { + key: "404"; + value: { + description: "Returned when the resource does not exist."; + schema: { + json_schema: { + ref: "#/definitions/rpcStatus"; + } + } + } + } +}; + +service ZITADELActions { + + // Create a target + // + // Create a new target, which can be used in executions. + rpc CreateTarget (CreateTargetRequest) returns (CreateTargetResponse) { + option (google.api.http) = { + post: "/targets" + body: "target" + }; + + option (zitadel.protoc_gen_zitadel.v2.options) = { + auth_option: { + permission: "action.target.write" + } + http_response: { + success_code: 201 + } + }; + + option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation) = { + responses: { + key: "201"; + value: { + description: "Target successfully created"; + schema: { + json_schema: { + ref: "#/definitions/v2CreateTargetResponse"; + } + } + }; + }; + }; + } + + // Patch a target + // + // Patch an existing target. + rpc PatchTarget (PatchTargetRequest) returns (PatchTargetResponse) { + option (google.api.http) = { + patch: "/targets/{id}" + body: "target" + }; + + option (zitadel.protoc_gen_zitadel.v2.options) = { + auth_option: { + permission: "action.target.write" + } + }; + + option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation) = { + responses: { + key: "200"; + value: { + description: "Target successfully updated"; + }; + }; + }; + } + + // Delete a target + // + // Delete an existing target. This will remove it from any configured execution as well. + rpc DeleteTarget (DeleteTargetRequest) returns (DeleteTargetResponse) { + option (google.api.http) = { + delete: "/targets/{id}" + }; + + option (zitadel.protoc_gen_zitadel.v2.options) = { + auth_option: { + permission: "action.target.delete" + } + }; + + option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation) = { + responses: { + key: "200"; + value: { + description: "Target successfully deleted"; + }; + }; + }; + } + + // Target by ID + // + // Returns the target identified by the requested ID. + rpc GetTarget (GetTargetRequest) returns (GetTargetResponse) { + option (google.api.http) = { + get: "/targets/{id}" + }; + + option (zitadel.protoc_gen_zitadel.v2.options) = { + auth_option: { + permission: "action.target.read" + } + }; + + option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation) = { + responses: { + key: "200" + value: { + description: "Target successfully retrieved"; + } + }; + }; + } + + // Search targets + // + // Search all matching targets. By default, we will return all targets of your instance. + // Make sure to include a limit and sorting for pagination. + rpc SearchTargets (SearchTargetsRequest) returns (SearchTargetsResponse) { + option (google.api.http) = { + post: "/targets/_search", + body: "filters" + }; + + option (zitadel.protoc_gen_zitadel.v2.options) = { + auth_option: { + permission: "action.target.read" + } + }; + + option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation) = { + responses: { + key: "200"; + value: { + description: "A list of all targets matching the query"; + }; + }; + responses: { + key: "400"; + value: { + description: "invalid list query"; + schema: { + json_schema: { + ref: "#/definitions/rpcStatus"; + }; + }; + }; + }; + }; + } + + // Put an execution to call a target or include the targets of another execution. + // + // Creates an execution for the given condition if it doesn't exists. + // Otherwise, the existing execution is updated. + rpc PutExecution (PutExecutionRequest) returns (PutExecutionResponse) { + option (google.api.http) = { + post: "/executions" + body: "execution" + }; + + option (zitadel.protoc_gen_zitadel.v2.options) = { + auth_option: { + permission: "action.execution.write" + } + http_response: { + success_code: 201 + } + }; + + option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation) = { + responses: { + key: "201"; + value: { + description: "Execution successfully created"; + schema: { + json_schema: { + ref: "#/definitions/v2CreateExecutionResponse"; + } + } + }; + }; + responses: { + key: "200"; + value: { + description: "Execution successfully updated"; + }; + }; + }; + } + + // Delete an execution + // + // Delete an existing execution. + rpc DeleteExecution (DeleteExecutionRequest) returns (DeleteExecutionResponse) { + option (google.api.http) = { + delete: "/executions/{id}" + }; + + option (zitadel.protoc_gen_zitadel.v2.options) = { + auth_option: { + permission: "action.execution.delete" + } + }; + + option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation) = { + responses: { + key: "200"; + value: { + description: "Execution successfully deleted"; + }; + }; + }; + } + + // Search executions + // + // Search all matching executions. By default, we will return all executions of your instance. + // Depending on the ZITADEL configuration, the number of returned resources is most probably limited. + // To make sure you get deterministic results, sort and paginate by the resources creation dates. + rpc SearchExecutions (SearchExecutionsRequest) returns (SearchExecutionsResponse) { + option (google.api.http) = { + post: "/executions/_search" + body: "filters" + }; + + option (zitadel.protoc_gen_zitadel.v2.options) = { + auth_option: { + permission: "execution.read" + } + }; + + option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation) = { + responses: { + key: "200"; + value: { + description: "A list of all executions matching the query"; + }; + }; + responses: { + key: "400"; + value: { + description: "invalid list query"; + schema: { + json_schema: { + ref: "#/definitions/rpcStatus"; + }; + }; + }; + }; + }; + } + + // List all available functions + // + // List all available functions which can be used as condition for executions. + rpc ListAvailableExecutionFunctions (ListAvailableExecutionFunctionsRequest) returns (ListAvailableExecutionFunctionsResponse) { + option (google.api.http) = { + get: "/executions/functions" + }; + + option (zitadel.protoc_gen_zitadel.v2.options) = { + auth_option: { + permission: "execution.read" + } + }; + + option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation) = { + responses: { + key: "200"; + value: { + description: "List all functions successfully"; + }; + }; + }; + } + // List all available methods + // + // List all available methods which can be used as condition for executions. + rpc ListAvailableExecutionMethods (ListAvailableExecutionMethodsRequest) returns (ListAvailableExecutionMethodsResponse) { + option (google.api.http) = { + get: "/executions/methods" + }; + + option (zitadel.protoc_gen_zitadel.v2.options) = { + auth_option: { + permission: "execution.read" + } + }; + + option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation) = { + responses: { + key: "200"; + value: { + description: "List all methods successfully"; + }; + }; + }; + } + // List all available service + // + // List all available services which can be used as condition for executions. + rpc ListAvailableExecutionServices (ListAvailableExecutionServicesRequest) returns (ListAvailableExecutionServicesResponse) { + option (google.api.http) = { + get: "/executions/services" + }; + + option (zitadel.protoc_gen_zitadel.v2.options) = { + auth_option: { + permission: "execution.read" + } + }; + + option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation) = { + responses: { + key: "200"; + value: { + description: "List all services successfully"; + }; + }; + }; + } +} + +message CreateTargetRequest { + Target target = 2; +} + +message CreateTargetResponse { + zitadel.resources.object.v3alpha.Details details = 2; +} + +message PatchTargetRequest { + string id = 1 [ + (validate.rules).string = {min_len: 1, max_len: 200}, + (google.api.field_behavior) = REQUIRED, + (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { + min_length: 1, + max_length: 200, + example: "\"69629026806489455\""; + } + ]; + PatchTarget target = 2; +} + +message PatchTargetResponse { + zitadel.resources.object.v3alpha.Details details = 1; +} + +message DeleteTargetRequest { + string id = 1 [ + (validate.rules).string = {min_len: 1, max_len: 200}, + (google.api.field_behavior) = REQUIRED, + (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { + min_length: 1, + max_length: 200, + example: "\"69629026806489455\""; + } + ]; +} + +message DeleteTargetResponse { + zitadel.resources.object.v3alpha.Details details = 1; +} + +message SearchTargetsRequest { + // list limitations and ordering. + zitadel.resources.object.v3alpha.ListQuery query = 2; + // the field the result is sorted. + zitadel.resources.action.v3alpha.TargetFieldName sorting_column = 3 [ + (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { + example: "\"FIELD_NAME_SCHEMA_TYPE\"" + } + ]; + // Define the criteria to query for. + repeated zitadel.resources.action.v3alpha.TargetSearchFilter filters = 4; +} + +message SearchTargetsResponse { + zitadel.resources.object.v3alpha.ListDetails details = 1; + zitadel.resources.action.v3alpha.TargetFieldName sorting_column = 2; + repeated zitadel.resources.action.v3alpha.GetTarget result = 3; +} + +message GetTargetRequest { + // unique identifier of the target. + string id = 1 [ + (validate.rules).string = {min_len: 1, max_len: 200}, + (google.api.field_behavior) = REQUIRED, + (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { + min_length: 1, + max_length: 200, + example: "\"69629026806489455\""; + } + ]; +} + +message GetTargetResponse { + zitadel.resources.action.v3alpha.GetTarget target = 1; +} + +message PutExecutionRequest { + Execution execution = 2; +} + +message PutExecutionResponse { + zitadel.resources.object.v3alpha.Details details = 2; +} + +message DeleteExecutionRequest { + string id = 1 [ + (validate.rules).string = {min_len: 1, max_len: 200}, + (google.api.field_behavior) = REQUIRED, + (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { + min_length: 1, + max_length: 200, + example: "\"69629026806489455\""; + } + ]; +} + +message DeleteExecutionResponse { + zitadel.resources.object.v3alpha.Details details = 1; +} + +message SearchExecutionsRequest { + // list limitations and ordering. + zitadel.resources.object.v3alpha.ListQuery query = 1; + // Define the criteria to query for. + repeated zitadel.resources.action.v3alpha.ExecutionSearchFilter filters = 2; +} + +message SearchExecutionsResponse { + zitadel.resources.object.v3alpha.ListDetails details = 1; + repeated zitadel.resources.action.v3alpha.GetExecution result = 2; +} + +message ListAvailableExecutionFunctionsRequest{} +message ListAvailableExecutionFunctionsResponse{ + // All available functions + repeated string functions = 1; +} +message ListAvailableExecutionMethodsRequest{} +message ListAvailableExecutionMethodsResponse{ + // All available methods + repeated string methods = 1; +} + +message ListAvailableExecutionServicesRequest{} +message ListAvailableExecutionServicesResponse{ + // All available services + repeated string services = 1; +} \ No newline at end of file diff --git a/docs/docs/apis/_v3_action_target.proto b/docs/docs/apis/_v3_action_target.proto new file mode 100644 index 0000000000..217301d679 --- /dev/null +++ b/docs/docs/apis/_v3_action_target.proto @@ -0,0 +1,94 @@ +syntax = "proto3"; + +package zitadel.resources.action.v3alpha; + +import "google/api/annotations.proto"; +import "google/api/field_behavior.proto"; +import "google/protobuf/duration.proto"; +import "google/protobuf/struct.proto"; +import "protoc-gen-openapiv2/options/annotations.proto"; +import "validate/validate.proto"; +import "zitadel/protoc_gen_zitadel/v2/options.proto"; + +import "zitadel/resources/object/v3alpha/object.proto"; + +option go_package = "github.com/zitadel/zitadel/pkg/grpc/resources/action/v3alpha;action"; + +message Target { + string name = 1 [ + (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { + example: "\"ip_allow_list\""; + } + ]; + // Defines the target type and how the response of the target is treated. + oneof target_type { + SetRESTWebhook rest_webhook = 4; + SetRESTRequestResponse rest_request_response = 5; + } + // Timeout defines the duration until ZITADEL cancels the execution. + google.protobuf.Duration timeout = 6 [ + (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { + example: "\"10s\""; + } + ]; + oneof execution_type { + // Set the execution to run asynchronously. + bool is_async = 7; + // Define if any error stops the whole execution. By default the process continues as normal. + bool interrupt_on_error = 8; + } +} + +message GetTarget { + zitadel.resources.object.v3alpha.Details details = 1; + Target target = 2; +} + +message PatchTarget { + optional string name = 1 [ + (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { + example: "\"ip_allow_list\""; + } + ]; + // Defines the target type and how the response of the target is treated. + oneof target_type { + SetRESTWebhook rest_webhook = 3; + SetRESTRequestResponse rest_request_response = 4; + } + // Timeout defines the duration until ZITADEL cancels the execution. + optional google.protobuf.Duration timeout = 5 [ + (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { + example: "\"10s\""; + } + ]; + oneof execution_type { + // Set the execution to run asynchronously. + bool is_async = 6; + // Define if any error stops the whole execution. By default the process continues as normal. + bool interrupt_on_error = 7; + } +} + +message SetRESTWebhook { + string url = 1 [ + (validate.rules).string = {min_len: 1, max_len: 1000, uri: true}, + (google.api.field_behavior) = REQUIRED, + (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { + min_length: 1, + max_length: 1000, + example: "\"https://example.com/hooks/ip_check\""; + } + ]; +} + +message SetRESTRequestResponse { + string url = 1 [ + (validate.rules).string = {min_len: 1, max_len: 1000, uri: true}, + (google.api.field_behavior) = REQUIRED, + (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { + min_length: 1, + max_length: 1000, + example: "\"https://example.com/hooks/ip_check\""; + } + ]; +} diff --git a/docs/docs/apis/_v3_idp.proto b/docs/docs/apis/_v3_idp.proto new file mode 100644 index 0000000000..54fb1ede1b --- /dev/null +++ b/docs/docs/apis/_v3_idp.proto @@ -0,0 +1,94 @@ +syntax = "proto3"; + +package zitadel.resources.idp.v3alpha; + +option go_package = "github.com/zitadel/zitadel/pkg/grpc/resources/idp/v3alpha;idp"; + +import "protoc-gen-openapiv2/options/annotations.proto"; +import "validate/validate.proto"; + +import "zitadel/resources/object/v3alpha/object.proto"; + +message IDP { + string name = 1 [ + (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { + example: "\"GitLab\""; + } + ]; + zitadel.resources.object.v3alpha.StatePolicy state_policy = 2; + Options options = 3; +} + +message PatchIDP { + optional string name = 1 [ + (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { + example: "\"GitLab\""; + } + ]; + optional zitadel.resources.object.v3alpha.StatePolicy state_policy = 2; + optional Options options = 3; +} + + +message GetIDP { + zitadel.resources.object.v3alpha.Details details = 1; + optional zitadel.resources.object.v3alpha.Parent parent = 2; + zitadel.resources.object.v3alpha.State state = 3; + ProviderType type = 4; + IDP idp = 5; +} + +enum ProviderType { + PROVIDER_TYPE_UNSPECIFIED = 0; + PROVIDER_TYPE_OIDC = 1; + PROVIDER_TYPE_JWT = 2; + PROVIDER_TYPE_LDAP = 3; + PROVIDER_TYPE_OAUTH = 4; + PROVIDER_TYPE_AZURE_AD = 5; + PROVIDER_TYPE_GITHUB = 6; + PROVIDER_TYPE_GITHUB_ES = 7; + PROVIDER_TYPE_GITLAB = 8; + PROVIDER_TYPE_GITLAB_SELF_HOSTED = 9; + PROVIDER_TYPE_GOOGLE = 10; + PROVIDER_TYPE_APPLE = 11; + PROVIDER_TYPE_SAML = 12; +} + + +enum AutoLinkingOption { + // AUTO_LINKING_OPTION_UNSPECIFIED disables the auto linking prompt. + AUTO_LINKING_OPTION_UNSPECIFIED = 0; + // AUTO_LINKING_OPTION_USERNAME will use the username of the external user to check for a corresponding ZITADEL user. + AUTO_LINKING_OPTION_USERNAME = 1; + // AUTO_LINKING_OPTION_EMAIL will use the email of the external user to check for a corresponding ZITADEL user with the same verified email + // Note that in case multiple users match, no prompt will be shown. + AUTO_LINKING_OPTION_EMAIL = 2; +} + +message Options { + bool is_linking_allowed = 1 [ + (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { + description: "Enable if users should be able to link an existing ZITADEL user with an external account."; + } + ]; + bool is_creation_allowed = 2 [ + (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { + description: "Enable if users should be able to create a new account in ZITADEL when using an external account."; + } + ]; + bool is_auto_creation = 3 [ + (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { + description: "Enable if a new account in ZITADEL should be created automatically when login with an external account."; + } + ]; + bool is_auto_update = 4 [ + (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { + description: "Enable if a the ZITADEL account fields should be updated automatically on each login."; + } + ]; + AutoLinkingOption auto_linking = 5 [ + (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { + description: "Enable if users should get prompted to link an existing ZITADEL user to an external account if the selected attribute matches."; + } + ]; +} diff --git a/docs/docs/apis/_v3_idp_gitlab.proto b/docs/docs/apis/_v3_idp_gitlab.proto new file mode 100644 index 0000000000..9c7ed47a78 --- /dev/null +++ b/docs/docs/apis/_v3_idp_gitlab.proto @@ -0,0 +1,59 @@ +syntax = "proto3"; + +package zitadel.resources.idp.v3alpha; + +option go_package = "github.com/zitadel/zitadel/pkg/grpc/resources/idp/v3alpha;idp"; + +import "protoc-gen-openapiv2/options/annotations.proto"; +import "validate/validate.proto"; + +import "zitadel/resources/object/v3alpha/object.proto"; +import "zitadel/resources/idp/v3alpha/idp.proto"; + +message GetGitLabIDP { + zitadel.resources.object.v3alpha.Details details = 1; + optional zitadel.resources.object.v3alpha.Parent parent = 2; + zitadel.resources.object.v3alpha.State state = 3; + ProviderType type = 4; + GitLabIDP idp = 5; +} + +message GitLabIDP { + IDP idp = 1; + GitLabConfig config = 2; +} + +message PatchGitLabIDP { + optional PatchIDP idp = 1; + optional PatchGitLabConfig config = 2; +} + +message GitLabConfig { + string client_id = 1 [ + (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { + example: "\"client-id\""; + description: "client id of the GitLab application"; + } + ]; + repeated string scopes = 2 [ + (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { + example: "[\"openid\", \"profile\", \"email\"]"; + description: "the scopes requested by ZITADEL during the request to GitLab"; + } + ]; +} + +message PatchGitLabConfig { + optional string client_id = 1 [ + (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { + example: "\"client-id\""; + description: "client id of the GitLab application"; + } + ]; + repeated string scopes = 2 [ + (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { + example: "[\"openid\", \"profile\", \"email\"]"; + description: "the scopes requested by ZITADEL during the request to GitLab"; + } + ]; +} \ No newline at end of file diff --git a/docs/docs/apis/_v3_idp_search.proto b/docs/docs/apis/_v3_idp_search.proto new file mode 100644 index 0000000000..dbc75e2d20 --- /dev/null +++ b/docs/docs/apis/_v3_idp_search.proto @@ -0,0 +1,47 @@ +syntax = "proto3"; + +package zitadel.resources.idp.v3alpha; + +option go_package = "github.com/zitadel/zitadel/pkg/grpc/resources/idp/v3alpha;idp"; + +import "protoc-gen-openapiv2/options/annotations.proto"; +import "validate/validate.proto"; + +import "zitadel/resources/object/v3alpha/object.proto"; + +enum IDPFieldName { + IDP_FIELD_NAME_UNSPECIFIED = 0; + IDP_FIELD_NAME_NAME = 1; +} + +message IDPSearchFilter { + oneof filter { + IDPIDFilter id = 1; + IDPNameFilter name = 2; + resources.object.v3alpha.StateFilter state = 3; + } +} + +message IDPIDFilter { + string id = 1 [ + (validate.rules).string = {max_len: 200}, + (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { + example: "\"69629023906488334\""; + } + ]; +} + +message IDPNameFilter { + string name = 1 [ + (validate.rules).string = {max_len: 200}, + (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { + example: "\"google\""; + } + ]; + zitadel.resources.object.v3alpha.TextFilterMethod method = 2 [ + (validate.rules).enum.defined_only = true, + (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { + description: "defines which text equality method is used"; + } + ]; +} diff --git a/docs/docs/apis/_v3_idp_service.proto b/docs/docs/apis/_v3_idp_service.proto new file mode 100644 index 0000000000..3a33d407e6 --- /dev/null +++ b/docs/docs/apis/_v3_idp_service.proto @@ -0,0 +1,325 @@ +syntax = "proto3"; + +package zitadel.resources.idp.v3alpha; + +import "google/api/annotations.proto"; +import "google/api/field_behavior.proto"; +import "google/protobuf/duration.proto"; +import "google/protobuf/struct.proto"; +import "protoc-gen-openapiv2/options/annotations.proto"; +import "validate/validate.proto"; +import "zitadel/protoc_gen_zitadel/v2/options.proto"; + +import "zitadel/resources/object/v3alpha/object.proto"; +import "zitadel/resources/idp/v3alpha/search.proto"; +import "zitadel/resources/idp/v3alpha/idp.proto"; +import "zitadel/resources/idp/v3alpha/gitlab.proto"; +import "zitadel/object/v3alpha/object.proto"; + +option go_package = "github.com/zitadel/zitadel/pkg/grpc/resources/idp/v3alpha;idp"; + +option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_swagger) = { + info: { + title: "Identity Provider Service"; + version: "3.0-alpha"; + description: "This API is intended to manage identity providers (IDPs). IDPs can be created for specific organizations or for an instance. IDPs created on an instance can be activated (reused) or deactivated in organizations. It is behind the feature flag \"multitenancy_resources_api\". It will continue breaking as long as it is in alpha state."; + contact:{ + name: "ZITADEL" + url: "https://zitadel.com" + email: "hi@zitadel.com" + } + license: { + name: "Apache 2.0", + url: "https://github.com/zitadel/zitadel/blob/main/LICENSE"; + }; + }; + schemes: HTTPS; + schemes: HTTP; + + consumes: "application/json"; + consumes: "application/grpc"; + + produces: "application/json"; + produces: "application/grpc"; + + consumes: "application/grpc-web+proto"; + produces: "application/grpc-web+proto"; + + host: "$ZITADEL_DOMAIN"; + base_path: "/resources/v3alpha"; + + external_docs: { + description: "Detailed information about ZITADEL", + url: "https://zitadel.com/docs" + } + security_definitions: { + security: { + key: "OAuth2"; + value: { + type: TYPE_OAUTH2; + flow: FLOW_ACCESS_CODE; + authorization_url: "$CUSTOM-DOMAIN/oauth/v2/authorize"; + token_url: "$CUSTOM-DOMAIN/oauth/v2/token"; + scopes: { + scope: { + key: "openid"; + value: "openid"; + } + scope: { + key: "urn:zitadel:iam:org:project:id:zitadel:aud"; + value: "urn:zitadel:iam:org:project:id:zitadel:aud"; + } + } + } + } + } + security: { + security_requirement: { + key: "OAuth2"; + value: { + scope: "openid"; + scope: "urn:zitadel:iam:org:project:id:zitadel:aud"; + } + } + } + responses: { + key: "403"; + value: { + description: "Returned when the user does not have permission to access the resource."; + schema: { + json_schema: { + ref: "#/definitions/rpcStatus"; + } + } + } + } + responses: { + key: "404"; + value: { + description: "Returned when the resource does not exist."; + schema: { + json_schema: { + ref: "#/definitions/rpcStatus"; + } + } + } + } +}; + +service ZITADELIdentityProviders { + + // Create a GitLab IDP + rpc CreateGitLabIDP (CreateGitLabIDPRequest) returns (CreateGitLabIDPResponse) { + option (google.api.http) = { + post: "/idps/gitlab" + body: "idp" + }; + + option (zitadel.protoc_gen_zitadel.v2.options) = { + auth_option: { + permission: "idp.write" + } + http_response: { + success_code: 201 + } + }; + + option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation) = { + responses: { + key: "201"; + value: { + description: "GitLabIDP successfully created"; + schema: { + json_schema: { + ref: "#/definitions/v2CreateGitLabIDPResponse"; + } + } + }; + }; + }; + } + + // Patch a GitLab IDP + rpc PatchGitLabIDP (PatchGitLabIDPRequest) returns (PatchGitLabIDPResponse) { + option (google.api.http) = { + patch: "/idps/gitlab/{id}" + body: "idp" + }; + + option (zitadel.protoc_gen_zitadel.v2.options) = { + auth_option: { + permission: "idp.write" + } + }; + + option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation) = { + responses: { + key: "200"; + value: { + description: "GitLabIDP successfully updated"; + }; + }; + }; + } + + // Find a GitLab IDP by ID + rpc GetGitLabIDP (GetGitLabIDPRequest) returns (GetGitLabIDPResponse) { + option (google.api.http) = { + get: "/idps/gitlab/{id}" + }; + + option (zitadel.protoc_gen_zitadel.v2.options) = { + auth_option: { + permission: "idp.read" + } + }; + + option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation) = { + responses: { + key: "200" + value: { + description: "GitLabIDP successfully retrieved"; + } + }; + }; + } + + // Delete an IDP of any type + rpc DeleteIDP (DeleteIDPRequest) returns (DeleteIDPResponse) { + option (google.api.http) = { + delete: "/idps/{id}" + }; + + option (zitadel.protoc_gen_zitadel.v2.options) = { + auth_option: { + permission: "idp.delete" + } + }; + + option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation) = { + responses: { + key: "200"; + value: { + description: "Identity provider successfully deleted"; + }; + }; + }; + } + + // Search IDPs + // + // Search all matching IDPs. By default, all instance-level and organization-level providers of all types are returned. + // Only type-agnostic properties are returned in the response. + // To get the full details of a specific IDP, use the specific types Get method. + // If you search by passing an organization context, the state and the state policy might be different than if you search within the default instance-level context. + // Make sure to include a limit and sorting for pagination. + rpc SearchIDPs (SearchIDPsRequest) returns (SearchIDPsResponse) { + option (google.api.http) = { + post: "/idps/_search", + body: "filters" + }; + + option (zitadel.protoc_gen_zitadel.v2.options) = { + auth_option: { + permission: "idp.read" + } + }; + + option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation) = { + responses: { + key: "200"; + value: { + description: "A list of all IDPs matching the query"; + }; + }; + responses: { + key: "400"; + value: { + description: "invalid list query"; + schema: { + json_schema: { + ref: "#/definitions/rpcStatus"; + }; + }; + }; + }; + }; + } +} + +message CreateGitLabIDPRequest { + optional zitadel.object.v3alpha.RequestContext ctx = 1; + GitLabIDP idp = 2; +} + +message CreateGitLabIDPResponse { + zitadel.resources.object.v3alpha.Details details = 2; +} + +message PatchGitLabIDPRequest { + string id = 1 [ + (validate.rules).string = {min_len: 1, max_len: 200}, + (google.api.field_behavior) = REQUIRED, + (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { + min_length: 1, + max_length: 200, + example: "\"69629026806489455\""; + } + ]; + PatchGitLabIDP idp = 2; +} + +message PatchGitLabIDPResponse { + zitadel.resources.object.v3alpha.Details details = 1; +} + +message DeleteIDPRequest { + string id = 1 [ + (validate.rules).string = {min_len: 1, max_len: 200}, + (google.api.field_behavior) = REQUIRED, + (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { + min_length: 1, + max_length: 200, + example: "\"69629026806489455\""; + } + ]; +} + +message DeleteIDPResponse { + zitadel.resources.object.v3alpha.Details details = 1; +} + +message SearchIDPsRequest { + optional zitadel.object.v3alpha.RequestContext ctx = 1; + // list limitations and ordering. + zitadel.resources.object.v3alpha.ListQuery query = 2; + // the field the result is sorted. + zitadel.resources.idp.v3alpha.IDPFieldName sorting_column = 3 [ + (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { + example: "\"FIELD_NAME_SCHEMA_TYPE\"" + } + ]; + repeated zitadel.resources.idp.v3alpha.IDPSearchFilter filters = 4; +} + +message SearchIDPsResponse { + zitadel.resources.object.v3alpha.ListDetails details = 1; + zitadel.resources.idp.v3alpha.IDPFieldName sorting_column = 2; + repeated zitadel.resources.idp.v3alpha.GetIDP result = 3; +} + +message GetGitLabIDPRequest { + string id = 1 [ + (validate.rules).string = {min_len: 1, max_len: 200}, + (google.api.field_behavior) = REQUIRED, + (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { + min_length: 1, + max_length: 200, + example: "\"69629026806489455\""; + } + ]; +} + +message GetGitLabIDPResponse { + zitadel.resources.idp.v3alpha.GetGitLabIDP idp = 1; +} diff --git a/docs/docs/apis/_v3_language.proto b/docs/docs/apis/_v3_language.proto new file mode 100644 index 0000000000..269bb4b0a0 --- /dev/null +++ b/docs/docs/apis/_v3_language.proto @@ -0,0 +1,69 @@ +syntax = "proto3"; + +package zitadel.settings.language.v3alpha; +option go_package = "github.com/zitadel/zitadel/pkg/grpc/settings/language/v3alpha;language"; + +import "validate/validate.proto"; +import "protoc-gen-openapiv2/options/annotations.proto"; + +import "zitadel/settings/object/v3alpha/object.proto"; +import "zitadel/object/v3alpha/object.proto"; + +message SetLanguageSettings { + optional zitadel.settings.object.v3alpha.Language default_language = 1 [ + (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { + description: "default language for the current context" + example: "\"en\"" + } + ]; + optional SetLanguages restricted_languages = 2 [ + (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { + description: "To these languages, message texts and default login UI labels are translated to. Also, the discovery endpoint only lists these languages." + example: "[\"en\", \"de\"]" + } + ]; +} + +message ResolvedLanguageSettings { + zitadel.settings.object.v3alpha.ResolvedString default_language = 1 [ + (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { + description: "default language for the current context" + example: "\"en\"" + } + ]; + ResolvedLanguages restricted_languages = 2 [ + (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { + description: "To these languages, message texts and default login UI labels are translated to. Also, the discovery endpoint only lists these languages." + example: "[\"en\", \"de\"]" + } + ]; + ResolvedLanguages supported_languages = 3 [ + (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { + description: "These languages are supported by the system. For simplicity, the field is of type ResolvedLanguages, even though the list is immutable and the owner is always of OWNER_TYPE_SYSTEM." + example: "[\"en\", \"de\", \"it\"]" + } + ]; +} + +message SetLanguages { + repeated zitadel.settings.object.v3alpha.Language languages = 1 [ + (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { + description: "List of languages to set" + example: "[\"en\", \"de\"]" + } + ]; +} + +message ResolvedLanguages { + repeated zitadel.settings.object.v3alpha.Language value = 1[ + (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { + description: "List of languages" + example: "[\"en\", \"de\"]" + } + ]; + optional zitadel.object.v3alpha.Owner owner = 2 [ + (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { + description: "If the value is inherited, the value is inherited from this owner."; + } + ]; +} diff --git a/docs/docs/apis/_v3_language_service.proto b/docs/docs/apis/_v3_language_service.proto new file mode 100644 index 0000000000..f282aa2f9b --- /dev/null +++ b/docs/docs/apis/_v3_language_service.proto @@ -0,0 +1,158 @@ +syntax = "proto3"; + +package zitadel.settings.language.v3alpha; +option go_package = "github.com/zitadel/zitadel/pkg/grpc/settings/language/v3alpha;language"; + +import "google/api/annotations.proto"; +import "protoc-gen-openapiv2/options/annotations.proto"; + +import "zitadel/object/v3alpha/object.proto"; +import "zitadel/settings/object/v3alpha/object.proto"; +import "zitadel/settings/language/v3alpha/language.proto"; +import "zitadel/protoc_gen_zitadel/v2/options.proto"; + +option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_swagger) = { + info: { + title: "Language Settings Service"; + version: "3.0-alpha"; + description: "Language Service is intended to manage languages for ZITADEL. Enable the feature flag \"multitenancy_settings\" in order to activate it. Languages are settings, and are therefore inherited through the context hierarchy system -> instance -> org. It will continue breaking as long as it is in alpha state."; + contact:{ + name: "ZITADEL" + url: "https://zitadel.com" + email: "hi@zitadel.com" + } + license: { + name: "Apache 2.0", + url: "https://github.com/zitadel/zitadel/blob/main/LICENSE"; + }; + }; + schemes: HTTPS; + schemes: HTTP; + + consumes: "application/json"; + consumes: "application/grpc"; + consumes: "application/grpc-web+proto"; + + produces: "application/json"; + produces: "application/grpc"; + produces: "application/grpc-web+proto"; + + host: "$ZITADEL_DOMAIN"; + base_path: "/settings/v3alpha"; + + external_docs: { + description: "Detailed information about ZITADEL", + url: "https://zitadel.com/docs" + } + security_definitions: { + security: { + key: "OAuth2"; + value: { + type: TYPE_OAUTH2; + flow: FLOW_ACCESS_CODE; + authorization_url: "$ZITADEL_DOMAIN/oauth/v2/authorize"; + token_url: "$ZITADEL_DOMAIN/oauth/v2/token"; + scopes: { + scope: { + key: "openid"; + value: "openid"; + } + scope: { + key: "urn:zitadel:iam:org:project:id:zitadel:aud"; + value: "urn:zitadel:iam:org:project:id:zitadel:aud"; + } + } + } + } + } + security: { + security_requirement: { + key: "OAuth2"; + value: { + scope: "openid"; + scope: "urn:zitadel:iam:org:project:id:zitadel:aud"; + } + } + } + responses: { + key: "403"; + value: { + description: "Returned when the user does not have permission to access the settings in the given context."; + schema: { + json_schema: { + ref: "#/definitions/rpcStatus"; + } + } + } + } +}; + +// ZITADELLanguageSettings is intended to manage languages for ZITADEL. +// Enable the feature flag \"multitenancy_settings\" in order to activate it. +// Languages are settings, and are therefore inherited through the context hierarchy system -> instance -> org. +service ZITADELLanguageSettings { + rpc SetLanguages (SetLanguageSettingsRequest) returns (SetLanguageSettingsResponse) { + option (google.api.http) = { + patch: "/languages" + body: "settings" + }; + + option (zitadel.protoc_gen_zitadel.v2.options) = { + auth_option: { + permission: "authenticated" + } + }; + + option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation) = { + summary: "Set languages for a given context"; + description: "Configure and set languages for a given context. Only fields present in the request are set or unset." + responses: { + key: "200" + value: { + description: "OK"; + } + }; + }; + }; + + rpc ResolveLanguages (ResolveLanguageSettingsRequest) returns (ResolveLanguageSettingsResponse) { + option (google.api.http) = { + get: "/languages" + }; + + option (zitadel.protoc_gen_zitadel.v2.options) = { + auth_option: { + permission: "authenticated" + } + }; + + option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation) = { + summary: "Get the languages in the given context"; + description: "Returns all configured and inherited languages for the given context." + responses: { + key: "200" + value: { + description: "OK"; + } + }; + }; + }; +} + +message SetLanguageSettingsRequest{ + optional zitadel.object.v3alpha.RequestContext ctx = 1; + SetLanguageSettings settings = 2; +} + +message SetLanguageSettingsResponse{ + zitadel.settings.object.v3alpha.Details details = 1; +} + +message ResolveLanguageSettingsRequest{ + optional zitadel.object.v3alpha.RequestContext ctx = 1; +} + +message ResolveLanguageSettingsResponse{ + zitadel.settings.object.v3alpha.Details details = 1; + ResolvedLanguageSettings settings = 2; +} diff --git a/docs/docs/apis/_v3_object.proto b/docs/docs/apis/_v3_object.proto new file mode 100644 index 0000000000..dc018c4ee7 --- /dev/null +++ b/docs/docs/apis/_v3_object.proto @@ -0,0 +1,33 @@ +syntax = "proto3"; + +package zitadel.object.v3alpha; + +option go_package = "github.com/zitadel/zitadel/pkg/grpc/object/v3alpha;object"; + +import "google/protobuf/timestamp.proto"; +import "protoc-gen-openapiv2/options/annotations.proto"; +import "validate/validate.proto"; + +message RequestContext { + // By default, the request context is set to the instance discovered by the domain from the requests host header. + oneof owner { + bool system = 1 [(validate.rules).bool = {const: true}]; // TODO: move the source of truth from the defaults.yaml into the database + string instance_id = 2; + string instance_domain = 3; + string org_id = 4; + string org_domain = 5; + } +} + +enum OwnerType { + OWNER_TYPE_UNSPECIFIED = 0; + OWNER_TYPE_SYSTEM = 1; // TODO: move the source of truth from the defaults.yaml into the database + OWNER_TYPE_INSTANCE = 2; + OWNER_TYPE_ORG = 3; +} + +message Owner { + OwnerType type = 1; + string id = 2; +} + diff --git a/docs/docs/apis/_v3_resource_object.proto b/docs/docs/apis/_v3_resource_object.proto new file mode 100644 index 0000000000..7bd5e60a9b --- /dev/null +++ b/docs/docs/apis/_v3_resource_object.proto @@ -0,0 +1,155 @@ +syntax = "proto3"; + +package zitadel.resources.object.v3alpha; + +option go_package = "github.com/zitadel/zitadel/pkg/grpc/resources/object/v3alpha;object"; + +import "google/api/field_behavior.proto"; +import "google/protobuf/timestamp.proto"; +import "protoc-gen-openapiv2/options/annotations.proto"; +import "validate/validate.proto"; + +import "zitadel/object/v3alpha/object.proto"; + +message Organization { + oneof org { + string org_id = 1; + string org_domain = 2; + } +} + +message Details { + string id = 1 [ + (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { + example: "\"69629012906488334\""; + } + ]; + + //sequence represents the order of events. It's always counting + // + // on read: the sequence of the last event reduced by the projection + // + // on manipulation: the timestamp of the event(s) added by the manipulation + uint64 sequence = 2 [ + (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { + example: "\"2\""; + } + ]; + //change_date is the timestamp when the object was changed + // + // on read: the timestamp of the last event reduced by the projection + // + // on manipulation: the timestamp of the event(s) added by the manipulation + google.protobuf.Timestamp change_date = 3; + //resource_owner represents the context an object belongs to + zitadel.object.v3alpha.Owner resource_owner = 4 [ + (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { + example: "\"69629023906488334\""; + } + ]; +} + +enum State { + EFFECTIVE_STATE_UNSPECIFIED = 0; + EFFECTIVE_STATE_ACTIVE = 1; + EFFECTIVE_STATE_INACTIVE = 2; +} + +enum StatePolicy { + STATE_POLICY_UNSPECIFIED = 0; + STATE_POLICY_ACTIVATE = 1; + STATE_POLICY_DEACTIVATE = 2; + STATE_POLICY_INHERIT = 3; +} + +message StateFilter { + // Defines the state to query for. + resources.object.v3alpha.State state = 1 [ + (validate.rules).enum.defined_only = true, + (google.api.field_behavior) = REQUIRED, + (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { + example: "\"STATE_ACTIVE\"" + } + ]; +} + +message Parent { + zitadel.object.v3alpha.Owner parent = 1; + State state = 2; +} + +message ListQuery { + option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_schema) = { + json_schema: { + title: "General List Query" + description: "Object unspecific list filters like offset, limit and asc/desc." + } + }; + uint64 offset = 1 [ + (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { + example: "\"0\""; + } + ]; + uint32 limit = 2 [ + (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { + example: "100"; + description: "Maximum amount of events returned. The default is 100, the maximum is 1000. If the limit exceeds the maximum, ZITADEL throws an error."; + } + ]; + bool asc = 3 [ + (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { + description: "default is descending" + } + ]; +} + +message ListDetails { + uint32 applied_limit = 1 [ + (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { + example: "100"; + } + ]; + bool end_of_list = 2 [ + (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { + example: "true"; + } + ]; + uint64 total_result = 3 [ + (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { + example: "\"2\""; + } + ]; + uint64 processed_sequence = 4 [ + (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { + example: "\"267831\""; + } + ]; + google.protobuf.Timestamp timestamp = 5 [ + (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { + description: "the last time the projection got updated" + } + ]; +} + +enum TextFilterMethod { + TEXT_FILTER_METHOD_EQUALS = 0; + TEXT_FILTER_METHOD_EQUALS_IGNORE_CASE = 1; + TEXT_FILTER_METHOD_STARTS_WITH = 2; + TEXT_FILTER_METHOD_STARTS_WITH_IGNORE_CASE = 3; + TEXT_FILTER_METHOD_CONTAINS = 4; + TEXT_FILTER_METHOD_CONTAINS_IGNORE_CASE = 5; + TEXT_FILTER_METHOD_ENDS_WITH = 6; + TEXT_FILTER_METHOD_ENDS_WITH_IGNORE_CASE = 7; +} + +enum ListFilterMethod { + LIST_FILTER_METHOD_IN = 0; +} + +enum TimestampFilterMethod { + TIMESTAMP_Filter_METHOD_EQUALS = 0; + TIMESTAMP_Filter_METHOD_GREATER = 1; + TIMESTAMP_Filter_METHOD_GREATER_OR_EQUALS = 2; + TIMESTAMP_Filter_METHOD_LESS = 3; + TIMESTAMP_Filter_METHOD_LESS_OR_EQUALS = 4; +} \ No newline at end of file diff --git a/docs/docs/apis/_v3_settings_object.proto b/docs/docs/apis/_v3_settings_object.proto new file mode 100644 index 0000000000..5a1fab69a8 --- /dev/null +++ b/docs/docs/apis/_v3_settings_object.proto @@ -0,0 +1,193 @@ +syntax = "proto3"; + +package zitadel.settings.object.v3alpha; + +option go_package = "github.com/zitadel/zitadel/pkg/grpc/settings/object/v3alpha;object"; + +import "google/protobuf/timestamp.proto"; +import "protoc-gen-openapiv2/options/annotations.proto"; +import "validate/validate.proto"; +import "google/protobuf/duration.proto"; + +import "zitadel/object/v3alpha/object.proto"; + +message Details { + //sequence represents the order of events. It's always counting + // + // on read: the sequence of the last event reduced by the projection + // + // on manipulation: the timestamp of the event(s) added by the manipulation + uint64 sequence = 1 [ + (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { + example: "\"2\""; + } + ]; + //change_date is the timestamp when the object was changed + // + // on read: the timestamp of the last event reduced by the projection + // + // on manipulation: the timestamp of the event(s) added by the manipulation + google.protobuf.Timestamp change_date = 2; + //resource_owner represents the context an object belongs to + zitadel.object.v3alpha.Owner owner = 3 [ + (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { + example: "\"69629023906488334\""; + } + ]; +} + + +message ResolvedBool { + bool value = 1 [ + (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { + example: "false"; + description: "The resolved value is valid for the given context. Either the value was explicitly set for the given context or it is inherited from a higher-level context."; + } + ]; + optional zitadel.object.v3alpha.Owner owner = 2 [ + (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { + description: "If the value is inherited, the value is inherited from this owner."; + } + ]; +} + +message SetBool { + oneof value { + bool set = 1; + bool reset = 2 [(validate.rules).bool = { + const: true + }]; + } +} + +message ResolvedString { + string value = 1 [ + (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { + example: "\"a resolved string\""; + description: "The resolved value is valid for the given context. Either the value was explicitly set for the given context or it is inherited from a higher-level context."; + } + ]; + optional zitadel.object.v3alpha.Owner owner = 2 [ + (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { + description: "If the value is inherited, the value is inherited from this owner."; + } + ]; +} + +message SetString { + oneof value { + string set = 1 [ + (validate.rules).string = { + max_len: 256 + } + ]; + bool reset = 2 [(validate.rules).bool = { + const: true + }]; + } +} + +message SetStringLong { + oneof value { + string set = 1 [ + (validate.rules).string = { + max_len: 2048 + } + ]; + bool reset = 2 [(validate.rules).bool = { + const: true + }]; + } +} + + +message SetStringShort { + oneof value { + string set = 1 [ + (validate.rules).string = { + max_len: 64 + } + ]; + bool reset = 2 [(validate.rules).bool = { + const: true + }]; + } +} + +message Language { + string key = 1 [(validate.rules).string = {pattern: "^[a-z]{2}$"}]; +} + +message ResolvedStrings { + repeated string value = 1[ + (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { + example: "[\"a\", \"resolved\", \"list\", \"of\", \"strings\"]"; + description: "The resolved value is valid for the given context. Either the value was explicitly set for the given context or it is inherited from a higher-level context."; + } + ]; + optional zitadel.object.v3alpha.Owner owner = 2 [ + (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { + description: "If the value is inherited, the value is inherited from this owner."; + } + ]; +} + +message SetStrings { + oneof value { + SetStringsValue set = 1; + bool reset = 2 [(validate.rules).bool = { + const: true + }]; + } +} + +message SetStringsValue { + repeated string value = 1; +} + +message ResolvedUInt64 { + uint64 value = 1 [ + (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { + example: "1000"; + description: "The resolved value is valid for the given context. Either the value was explicitly set for the given context or it is inherited from a higher-level context."; + } + ]; + optional zitadel.object.v3alpha.Owner owner = 2 [ + (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { + description: "If the value is inherited, the value is inherited from this owner."; + } + ]; +} + +message SetUInt64 { + oneof value { + uint64 set = 1; + bool reset = 2 [(validate.rules).bool = { + const: true + }]; + } +} + + +message ResolvedDuration { + google.protobuf.Duration value = 1 [ + (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { + example: "\"5s\""; + description: "The resolved value is valid for the given context. Either the value was explicitly set for the given context or it is inherited from a higher-level context."; + } + ]; + optional zitadel.object.v3alpha.Owner owner = 2 [ + (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { + description: "If the value is inherited, the value is inherited from this owner."; + } + ]; +} + +message SetDuration { + oneof value { + google.protobuf.Duration set = 1; + bool reset = 2 [(validate.rules).bool = { + const: true + }]; + } +} diff --git a/docs/docs/apis/v3.mdx b/docs/docs/apis/v3.mdx index aa3b328e45..ba6a1fa596 100644 --- a/docs/docs/apis/v3.mdx +++ b/docs/docs/apis/v3.mdx @@ -3,13 +3,338 @@ title: APIs V3 (Preview) --- import DocCardList from '@theme/DocCardList'; +import CodeBlock from '@theme/CodeBlock'; +import ActionServiceProto from '!!raw-loader!./_v3_action_service.proto' +import ActionExecutionProto from '!!raw-loader!./_v3_action_execution.proto' +import ActionTargetProto from '!!raw-loader!./_v3_action_target.proto' +import ActionSearchProto from '!!raw-loader!./_v3_action_search.proto' +import IDPServiceProto from '!!raw-loader!./_v3_idp_service.proto' +import IDPProto from '!!raw-loader!./_v3_idp.proto' +import IDPSearchProto from '!!raw-loader!./_v3_idp_search.proto' +import IDPGitLabProto from '!!raw-loader!./_v3_idp_gitlab.proto' +import LanguageServiceProto from '!!raw-loader!./_v3_language_service.proto' +import LanguageProto from '!!raw-loader!./_v3_language.proto' +import ObjectProto from '!!raw-loader!./_v3_object.proto' +import ResourceObjectProto from '!!raw-loader!./_v3_resource_object.proto' +import SettingsObjectProto from '!!raw-loader!./_v3_settings_object.proto' -APIs (V3) organize access by resources (users, settings, etc.), unlike context-specific V1 APIs. -This simplifies finding the right API, especially for multi-organization resources. -V3 also offers more flexibility over the V2 API in these points: -- User schema definition for custom user management. -- Behavior customization (API call manipulation, webhooks). +The APIs described in this section are currently either in *Preview* stage or not implemented, yet. +Before using these APIs, pleases consider the [API release policy below](#api-release-policy) -**Note**: V3 is currently in [Preview](/support/software-release-cycles-support#preview) and not yet generally available (breaking changes possible). Check individual services for availability. +## We Appreciate your Help + +We invite you to... +- ... share your thoughts about the concepts [by opening discussions on GitHub](https://github.com/zitadel/zitadel/discussions/new/choose). +- ... try the implementations and provide feedback [by filing issues on GitHub](https://github.com/zitadel/zitadel/issues/new/choose). + +## The Ideas behind the New V3 APIs + +The current ZITADEL *GA* APIs are structured around contexts like System, Admin, Management, and Auth. +This structure leads to duplicate methods and makes it hard to find the right API for the right task. +Especially interacting with resources from multiple organizations is cumbersome. +Also, the APIs evolved over time, which lead to inconsistencies and a lack of flexibility in development. + +We address these issues with the following new API categories: + +- [Standard Resources](#standard-resources) +- [Reusable Resources](#reusable-resources) +- [Settings](#settings) + +The designs for the new API categories aim for the following improvements: + +### Service Structure + +Instead of structuring the API methods around contexts, new APIs are structured around resources and settings. +This means, eventually, we deprecate the old System-, Admin-, Management- and AuthAPIs in favor of User-, Action-, Language-, FeatureAPIs and so on. +This change makes it easier to find the right API for the right task, especially for multi-organization resources. +Also, it allows for faster development and independent versioning of the APIs. + +### Multitenancy Management and Consistency + +To improve managing and reusing resources and settings in multitenancy scenarios, we define some rules for the new APIs: + +- Single properties from instance settings are overridable (patchable) in organizations. +- Some settings support user-defined custom properties that are also overridable in organizations. +- Improved experience with reusing resources in multiple organizations and instances. +- Resources are searchable over all organizations with a single call by default. + +### HTTP and gRPC Consistency + +To make the APIs more consistent and easier to use, we follow the same patterns in all Proto files. +- Patching is favored over updating resources and settings. +- HTTP calls are mapped so that query parameters can be used as much as possible. We avoid the annotation `body: "*"`. +- For search performance, we enforce query limits. + +## Standard Resources + +Standard resources exist in exactly one context. +For example, a user is always assigned to exactly one organization. +Or one SMS provider is always assigned to exactly one instance. + +Standard resource methods behave like this: + +- Search request results can be scoped to a RequestContext. +- Search request results only contain results for which the requesting user has the necessary read permissions. +- Search requests are limited to 100 by default. The limit can be increased by the caller up to 1000 by default. +- Resource configurations are partially updatable. With HTTP, this is done via PATCH requests. If no changes were made, the response is successful. +- Status changes or other actions on resources with side effects are done via POST requests. Their HTTP path ends with the underscore prefixed action name. For example `POST /resources/users/{id}/_unlock`. + +For a full proto example, have a look at the [ZITADELActions service](#zitadelactions). + +## Reusable Resources + +Reusable resources are like standard resources but can be reused in multiple contexts. +For example, an external identity provider can be defined once on the instance. +Each organization within this instance can then choose to use this identity provider or not. + +Additionally to the methods described for standard resources, reusable have the following capabilities: + +Reusable resources have the same behavior as standard resources with the following additions: + +- Reusable resources can be created in a given context level (system, instance, org). +- For requests, that require a resource ID, no request context is needed. +- Reusable resources are available in child contexts, even if their state is *inactive*. +- The child context can control if an inherited resource should be active or inactive for itself using a state policy. +- In child contexts, the state policy of a reused resource is *inherit* by default and can be changed to *activate*, *deactivate* or back to *inherit*. +- In child contexts, a reused resources configuration is read-only. +- Child contexts can read at least the following properties of reused resources: + - ID + - name + - description + - state + - the state policy in the child context + - sequence + - last changed date + - parent context + - state in the immediate parent context. +- By default, search queries for reused resources return all resources from the given contexts, all inherited resources and all resources defined in all children contexts. + +Typically, a new resource is first designed and implemented as a non-reusable resource. +If the community sees a benefit in reusing the resource in multiple contexts, reusability is added to the resource. + +For a full proto example, have a look at the [ZITADELIdentityProviders service](#zitadelidentityproviders). + +## Resource Services + +All resource services by default support the following CRUD operations [as described above](#standard-resources-behavior). + +- Create +- Read (get, search) +- Patch (partially update, success on no changes) +- Delete + +### ZITADELActions + +- Standard CRUD methods for Targets +- Standard CRUD methods for Executions except the PutExecution method replaces the CreateExecution and PatchExecution methods + +Additional to the standard CRUD methods: + +- ListAvailableExecutionServices +- ListAvailableExecutionMethods +- ListAvailableExecutionFunctions + +
action_service.proto + {ActionServiceProto} +
+ +
action_target.proto + {ActionTargetProto} +
+ +
action_execution.proto + {ActionExecutionProto} +
+ +
action_query.proto + {ActionSearchProto} +
+ +### ZITADELUsers + +Standard CRUD methods + +### ZITADELUserSchemas + +Standard CRUD methods + +### ZITADELIdentityProviders + +- Standard CRUD and methods for all IDPs +- Resources have additional properties for reusability capabilities. + +
idp_service.proto + {IDPServiceProto} +
+ +
idp.proto + {IDPProto} +
+ +
idp_search.proto + {IDPSearchProto} +
+ +
idp_gitlab.proto + {IDPGitLabProto} +
+ +
object.proto + {ObjectProto} +
+ +
resource_object.proto + {ResourceObjectProto} +
+ +### ZITADELInstances + +Additional to the standard CRUD methods: + +- Limit (partial update of block and audit log retention) +- BulkLimit (partial update of block and audit log retention for multiple instances) + +### ZITADELOrganizations + +Additional to the standard CRUD methods: + +- SetAsInstanceDefault +- GetInstanceDefault + +### ZITADELDomains + +Additional to the standard CRUD methods: + +- SetAsPrimary +- Validate + +### ZITADELSessions + +Standard CRUD methods + +### ZITADELProjects + +Standard CRUD methods + +### ZITADELApps + +Standard CRUD methods + +### ZITADELMemberships + +The given context defines the organization, instance or system where the membership is created. +The context and the user ID together are unique. + +Additional to the standard CRUD methods: + +- ListAvailableRoles (context-aware) + +### ZITADELGrants + +- Standard CRUD methods for project grants +- Standard CRUD methods for user grants +- Standard CRUD methods for roles + +### ZITADELSMTPProviders + +Standard CRUD methods + +### ZITADELSMSProviders + +Standard CRUD methods + +## Settings + +Settings have no identity (ID) and are always context-aware. +They also don't have a state like active or inactive. +They only have properties that can be set and queried. +These properties are inherited to from parent-contexts (instance) to child-contexts (organization). + +Settings behave like this: + +- Setting and retrieving settings is always context-aware. By default, the context is the instance discovered by the requests *Host* header. +- All settings properties can be partially overridden in child-contexts. +- All settings properties can be partially reset in child-contexts, so their values default to the parent contexts property values. +- All settings properties returned by queries contain the value and if it is inherited, the context where it is inherited from. + +For a full proto example, have a look at the [ZITADELLanguageSettings service](#zitadellanguagesettings). + +## Settings Services + +### ZITADELLanguageSettings + +Default language, restricted languages, supported languages + +
language_service.proto + {LanguageServiceProto} +
+ +
language.proto + {LanguageProto} +
+ +
object.proto + {ObjectProto} +
+ +
settings_object.proto + {SettingsObjectProto} +
+ +### ZITADELTextSettings + +Key-value pairs for localized login texts, previously known as login texts + +### ZITADELBrandingSettings + +Predefined branding settings and custom key-value pairs, previously known as label policy or branding settings + +### ZITADELLoginSettings + +Previously known as login policy + +### ZITADELLockoutSettings + +Previously known as lockout policy + +### ZITADELPasswordSettings + +Previously known as password complexity policy + +### ZITADELHelpSettings + +Previously known as legal and support settings or privacy policy + +### ZITADELDomainSettings + +Previously known as domain policy + +### ZITADELFeatureSettings + +Feature toggles + +Also contains disallow public org registrations on system and instance level. + +### ZITADELTemplatesSettings + +HTML and text templates for fully customizable emails and sms + +### ZITADELSecretSettings + +Replaces secret generators + +## API Release Policy + +- Defined but not yet implemented APIs are subject to change without further notice. +- Once an API definition is implemented, it is released as *Preview* and is available for testing. +- When a *Preview* API is tested enough so the concepts are proven to work, a new *Beta* API is released. +- When an API is feature-complete and stable enough, a new *GA* (General Availability) API is released. +- In all stages, changes to already implemented APIs are done in a backwards-compatible way, if possible. +- When we release a new stage for an API, we deprecate the previous stage and keep it available for a smooth transition. + +## Preview APIs + +These APIs are ready for testing and feedback. +Beware, they don't yet follow all the rules defined above. \ No newline at end of file diff --git a/docs/docusaurus.config.js b/docs/docusaurus.config.js index 9ccd4ae0f0..bc021a48dc 100644 --- a/docs/docusaurus.config.js +++ b/docs/docusaurus.config.js @@ -186,7 +186,7 @@ module.exports = { selector: "div#", }, prism: { - additionalLanguages: ["csharp", "dart", "groovy", "regex", "java", "php", "python"], + additionalLanguages: ["csharp", "dart", "groovy", "regex", "java", "php", "python", "protobuf"], }, colorMode: { defaultMode: "dark", From d10f3e0918fac478bb2e4228826bebfe90730949 Mon Sep 17 00:00:00 2001 From: Silvan Date: Thu, 6 Jun 2024 12:16:36 +0200 Subject: [PATCH 04/44] docs(office-hours): add new resource api (#8077) Added new info for next office hours --- MEETING_SCHEDULE.md | 36 +++++++++++++++++++++++++++++++++++- 1 file changed, 35 insertions(+), 1 deletion(-) diff --git a/MEETING_SCHEDULE.md b/MEETING_SCHEDULE.md index 04dd4ff849..e13d2c6deb 100644 --- a/MEETING_SCHEDULE.md +++ b/MEETING_SCHEDULE.md @@ -3,6 +3,40 @@ Dear community! We're excited to announce bi-weekly office hours. +## #2 New Resources and Settings APIs + +**Shape the future of ZITADEL Let's redesign the API for a better developer experience!** + +Dear community, + +Following the great success of our first office hours, we're back for round two! This time, we're focusing on YOU and how we can build the best possible ZITADEL API together. + +We've been working on some ideas for the API, and we're excited to share them with you during the session. But more importantly, we want to hear YOUR thoughts! What does your dream ZITADEL API look like? What improvements would make your development life easier? + +Join the open discussion next Wednesday in the office hours voice channel on Discord. We're ready for your honest feedback and fresh perspectives that help us shape the future of ZITADEL! + +**What to expect**: + +* **Our Suggestions**: @eliobischof will walk you through the improvement suggestions. +* **Open Discussion**: Get your questions answered directly by the ZITADEL team, describe your pain points and drop your thoughts in an +open discussion. + +**Details**: + +* **Target Audience**: Developers and IT Ops personnel using ZITADEL +* **Topic**: API Redesign and Q&A +* **When**: Wednesday 12th of June 12 pm PST / 3 pm EST / 9 pm CEST +* **Duration**: about 1 hour +* **Platform**: ZITADEL Discord Server (Join us here: https://zitadel.com/office-hours?event=1248016231936692274 ) + +**In the meantime**: + +KUDOS, if you already [have a look at our proposal](https://zitadel.com/docs/apis/v3) before the start of the event. Share any inputs in the chat of the [office hours channel](https://zitadel.com/office-hours) on our Discord server. + +We look forward to seeing you there! + +P.S. Spread the word! Share this announcement with your fellow ZITADEL users who might be interested 📢 + ## #1 Dive Deep into Actions v2 The first office hour is dedicated to exploring the [new Actions v2 feature](https://zitadel.com/docs/concepts/features/actions_v2). @@ -26,4 +60,4 @@ Feel free to share any questions you already have about Actions v2 in the chat o We look forward to seeing you there! -P.S. Spread the word! Share this announcement with your fellow ZITADEL users who might be interested. \ No newline at end of file +P.S. Spread the word! Share this announcement with your fellow ZITADEL users who might be interested. From 9b16c61038dedecf46cbd62dd8815879a68de743 Mon Sep 17 00:00:00 2001 From: Elio Bischof Date: Thu, 6 Jun 2024 13:30:16 +0200 Subject: [PATCH 05/44] docs: link office hours (#8079) --- docs/docs/apis/v3.mdx | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/docs/apis/v3.mdx b/docs/docs/apis/v3.mdx index ba6a1fa596..b5ac50c3b9 100644 --- a/docs/docs/apis/v3.mdx +++ b/docs/docs/apis/v3.mdx @@ -24,6 +24,7 @@ Before using these APIs, pleases consider the [API release policy below](#api-re ## We Appreciate your Help We invite you to... +- ... join [the next office hours](https://zitadel.com/office-hours?event=1248016231936692274) and discuss the new API with us in person. - ... share your thoughts about the concepts [by opening discussions on GitHub](https://github.com/zitadel/zitadel/discussions/new/choose). - ... try the implementations and provide feedback [by filing issues on GitHub](https://github.com/zitadel/zitadel/issues/new/choose). From 26c7d95c882295a012dbdd2963b13dbad6272527 Mon Sep 17 00:00:00 2001 From: Livio Spring Date: Fri, 7 Jun 2024 09:30:04 +0200 Subject: [PATCH 06/44] fix: potential panics in login and return proper http 405 (#8065) # Which Problems Are Solved We identified some parts in the code, which could panic with a nil pointer when accessed without auth request. Additionally, if a GRPC method was called with an unmapped HTTP method, e.g. POST instead of GET a 501 instead of a 405 was returned. # How the Problems Are Solved - Additional checks for existing authRequest - custom http status code mapper for gateway # Additional Changes None. # Additional Context - noted internally in OPS --- internal/api/grpc/server/gateway.go | 20 +++++++++++++++++++ .../api/ui/login/init_password_handler.go | 4 +++- internal/api/ui/login/login_handler.go | 2 +- internal/api/ui/login/mail_verify_handler.go | 5 +++-- .../passwordless_registration_handler.go | 4 ++-- 5 files changed, 29 insertions(+), 6 deletions(-) diff --git a/internal/api/grpc/server/gateway.go b/internal/api/grpc/server/gateway.go index 6a3ac94bad..327865bd6c 100644 --- a/internal/api/grpc/server/gateway.go +++ b/internal/api/grpc/server/gateway.go @@ -10,9 +10,11 @@ import ( "github.com/grpc-ecosystem/grpc-gateway/v2/runtime" "github.com/zitadel/logging" "google.golang.org/grpc" + "google.golang.org/grpc/codes" "google.golang.org/grpc/credentials" "google.golang.org/grpc/credentials/insecure" healthpb "google.golang.org/grpc/health/grpc_health_v1" + "google.golang.org/grpc/status" "google.golang.org/protobuf/encoding/protojson" "google.golang.org/protobuf/proto" @@ -36,6 +38,23 @@ var ( }, } + httpErrorHandler = runtime.RoutingErrorHandlerFunc( + func(ctx context.Context, mux *runtime.ServeMux, marshaler runtime.Marshaler, w http.ResponseWriter, r *http.Request, httpStatus int) { + if httpStatus != http.StatusMethodNotAllowed { + runtime.DefaultRoutingErrorHandler(ctx, mux, marshaler, w, r, httpStatus) + return + } + + // Use HTTPStatusError to customize the DefaultHTTPErrorHandler status code + err := &runtime.HTTPStatusError{ + HTTPStatus: httpStatus, + Err: status.Error(codes.Unimplemented, http.StatusText(httpStatus)), + } + + runtime.DefaultHTTPErrorHandler(ctx, mux, marshaler, w, r, err) + }, + ) + serveMuxOptions = []runtime.ServeMuxOption{ runtime.WithMarshalerOption(jsonMarshaler.ContentType(nil), jsonMarshaler), runtime.WithMarshalerOption(mimeWildcard, jsonMarshaler), @@ -43,6 +62,7 @@ var ( runtime.WithIncomingHeaderMatcher(headerMatcher), runtime.WithOutgoingHeaderMatcher(runtime.DefaultHeaderMatcher), runtime.WithForwardResponseOption(responseForwarder), + runtime.WithRoutingErrorHandler(httpErrorHandler), } headerMatcher = runtime.HeaderMatcherFunc( diff --git a/internal/api/ui/login/init_password_handler.go b/internal/api/ui/login/init_password_handler.go index d57d1f83ff..91a197ef64 100644 --- a/internal/api/ui/login/init_password_handler.go +++ b/internal/api/ui/login/init_password_handler.go @@ -91,16 +91,18 @@ func (l *Login) checkPWCode(w http.ResponseWriter, r *http.Request, authReq *dom func (l *Login) resendPasswordSet(w http.ResponseWriter, r *http.Request, authReq *domain.AuthRequest, data *initPasswordFormData) { userOrg := data.OrgID userID := data.UserID + var authReqID string if authReq != nil { userOrg = authReq.UserOrgID userID = authReq.UserID + authReqID = authReq.ID } passwordCodeGenerator, err := l.query.InitEncryptionGenerator(r.Context(), domain.SecretGeneratorTypePasswordResetCode, l.userCodeAlg) if err != nil { l.renderInitPassword(w, r, authReq, userID, "", err) return } - _, err = l.command.RequestSetPassword(setContext(r.Context(), userOrg), userID, userOrg, domain.NotificationTypeEmail, passwordCodeGenerator, authReq.ID) + _, err = l.command.RequestSetPassword(setContext(r.Context(), userOrg), userID, userOrg, domain.NotificationTypeEmail, passwordCodeGenerator, authReqID) l.renderInitPassword(w, r, authReq, userID, "", err) } diff --git a/internal/api/ui/login/login_handler.go b/internal/api/ui/login/login_handler.go index ae21d84d87..059048eecb 100644 --- a/internal/api/ui/login/login_handler.go +++ b/internal/api/ui/login/login_handler.go @@ -69,7 +69,7 @@ func (l *Login) handleLoginNameCheck(w http.ResponseWriter, r *http.Request) { return } if data.Register { - if authReq.LoginPolicy != nil && authReq.LoginPolicy.AllowExternalIDP && authReq.AllowedExternalIDPs != nil && len(authReq.AllowedExternalIDPs) > 0 { + if authReq != nil && authReq.LoginPolicy != nil && authReq.LoginPolicy.AllowExternalIDP && authReq.AllowedExternalIDPs != nil && len(authReq.AllowedExternalIDPs) > 0 { l.handleRegisterOption(w, r) return } diff --git a/internal/api/ui/login/mail_verify_handler.go b/internal/api/ui/login/mail_verify_handler.go index 327b8a1182..aa14969008 100644 --- a/internal/api/ui/login/mail_verify_handler.go +++ b/internal/api/ui/login/mail_verify_handler.go @@ -58,16 +58,17 @@ func (l *Login) handleMailVerificationCheck(w http.ResponseWriter, r *http.Reque l.checkMailCode(w, r, authReq, data.UserID, data.Code) return } - userOrg := "" + var userOrg, authReqID string if authReq != nil { userOrg = authReq.UserOrgID + authReqID = authReq.ID } emailCodeGenerator, err := l.query.InitEncryptionGenerator(r.Context(), domain.SecretGeneratorTypeVerifyEmailCode, l.userCodeAlg) if err != nil { l.checkMailCode(w, r, authReq, data.UserID, data.Code) return } - _, err = l.command.CreateHumanEmailVerificationCode(setContext(r.Context(), userOrg), data.UserID, userOrg, emailCodeGenerator, authReq.ID) + _, err = l.command.CreateHumanEmailVerificationCode(setContext(r.Context(), userOrg), data.UserID, userOrg, emailCodeGenerator, authReqID) l.renderMailVerification(w, r, authReq, data.UserID, err) } diff --git a/internal/api/ui/login/passwordless_registration_handler.go b/internal/api/ui/login/passwordless_registration_handler.go index 0346374cee..976a9277b2 100644 --- a/internal/api/ui/login/passwordless_registration_handler.go +++ b/internal/api/ui/login/passwordless_registration_handler.go @@ -114,11 +114,11 @@ func (l *Login) renderPasswordlessRegistration(w http.ResponseWriter, r *http.Re } if authReq == nil { policy, err := l.query.ActiveLabelPolicyByOrg(r.Context(), orgID, false) - logging.Log("HANDL-XjWKE").OnError(err).Error("unable to get active label policy") + logging.OnError(err).Error("unable to get active label policy") data.LabelPolicy = labelPolicyToDomain(policy) if err == nil { texts, err := l.authRepo.GetLoginText(r.Context(), orgID) - logging.Log("LOGIN-HJK4t").OnError(err).Warn("could not get custom texts") + logging.OnError(err).Warn("could not get custom texts") l.addLoginTranslations(translator, texts) } } From 7d852ad0dfdb7fe98486c31faaf001f4a25b56fa Mon Sep 17 00:00:00 2001 From: Silvan Date: Mon, 10 Jun 2024 11:46:28 +0200 Subject: [PATCH 07/44] fix: read correct defaults (#8090) # Which Problems Are Solved Corrects reading of default configuration, despite reading all default configs only required defaults are read. # How the Problems Are Solved Reading the defualt config of the `mirror`-command was moved to a pre-run step of the command instead of doing it during initialization of the executable. # Additional Context - Closes https://github.com/zitadel/zitadel/issues/8059 - https://discord.com/channels/927474939156643850/1248594307267559535 --- cmd/mirror/mirror.go | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/cmd/mirror/mirror.go b/cmd/mirror/mirror.go index 3e4902ca7d..69e830658a 100644 --- a/cmd/mirror/mirror.go +++ b/cmd/mirror/mirror.go @@ -34,6 +34,10 @@ Order of execution: 3. mirror event store tables 4. recompute projections 5. verify`, + PersistentPreRun: func(cmd *cobra.Command, args []string) { + err := viper.MergeConfig(bytes.NewBuffer(defaultConfig)) + logging.OnError(err).Fatal("unable to read default config") + }, Run: func(cmd *cobra.Command, args []string) { config := mustNewMigrationConfig(viper.GetViper()) projectionConfig := mustNewProjectionsConfig(viper.GetViper()) @@ -59,9 +63,6 @@ Order of execution: The flag should be provided if you want to execute the mirror command multiple times so that the static data are also mirrored to prevent inconsistent states.`) migrateProjectionsFlags(cmd) - err := viper.MergeConfig(bytes.NewBuffer(defaultConfig)) - logging.OnError(err).Fatal("unable to read default config") - cmd.AddCommand( eventstoreCmd(), systemCmd(), From b055d1d9e67587eacce8e34649085bcd3268a055 Mon Sep 17 00:00:00 2001 From: Elio Bischof Date: Mon, 10 Jun 2024 12:49:30 +0200 Subject: [PATCH 08/44] feat(init): configurable existing postgres db (#8045) # Which Problems Are Solved The init job fails if no database called *postgres* or *defaultdb* for cockroach respectively exists. # How the Problems Are Solved The value is now configurable, for example by env variable *ZITADEL_DATABASE_POSTGRES_ADMIN_EXISTINGDATABASE* # Additional Context - Closes #5810 --- cmd/defaults.yaml | 8 ++++++++ internal/database/cockroach/crdb.go | 12 ++++++++++-- internal/database/postgres/pg.go | 16 +++++++++++++--- 3 files changed, 31 insertions(+), 5 deletions(-) diff --git a/cmd/defaults.yaml b/cmd/defaults.yaml index ae6b815037..bb09354b99 100644 --- a/cmd/defaults.yaml +++ b/cmd/defaults.yaml @@ -120,6 +120,10 @@ Database: Cert: "" # ZITADEL_DATABASE_COCKROACH_USER_SSL_CERT Key: "" # ZITADEL_DATABASE_COCKROACH_USER_SSL_KEY Admin: + # By default, ExistingDatabase is not specified in the connection string + # If the connection resolves to a database that is not existing in your system, configure an existing one here + # It is used in zitadel init to connect to cockroach and create a dedicated database for ZITADEL. + ExistingDatabase: # ZITADEL_DATABASE_COCKROACH_ADMIN_EXISTINGDATABASE Username: root # ZITADEL_DATABASE_COCKROACH_ADMIN_USERNAME Password: "" # ZITADEL_DATABASE_COCKROACH_ADMIN_PASSWORD SSL: @@ -147,6 +151,10 @@ Database: Cert: # ZITADEL_DATABASE_POSTGRES_USER_SSL_CERT Key: # ZITADEL_DATABASE_POSTGRES_USER_SSL_KEY Admin: + # The default ExistingDatabase is postgres + # If your db system doesn't have a database named postgres, configure an existing database here + # It is used in zitadel init to connect to postgres and create a dedicated database for ZITADEL. + ExistingDatabase: # ZITADEL_DATABASE_POSTGRES_ADMIN_EXISTINGDATABASE Username: # ZITADEL_DATABASE_POSTGRES_ADMIN_USERNAME Password: # ZITADEL_DATABASE_POSTGRES_ADMIN_PASSWORD SSL: diff --git a/internal/database/cockroach/crdb.go b/internal/database/cockroach/crdb.go index 3d72e3904c..58ef8694e6 100644 --- a/internal/database/cockroach/crdb.go +++ b/internal/database/cockroach/crdb.go @@ -34,7 +34,7 @@ type Config struct { MaxConnLifetime time.Duration MaxConnIdleTime time.Duration User User - Admin User + Admin AdminUser // Additional options to be appended as options= // The value will be taken as is. Multiple options are space separated. Options string @@ -114,6 +114,12 @@ type User struct { SSL SSL } +type AdminUser struct { + // ExistingDatabase is the database to connect to before the ZITADEL database exists + ExistingDatabase string + User `mapstructure:",squash"` +} + type SSL struct { // type of connection security Mode string @@ -147,7 +153,7 @@ func (c *Config) checkSSL(user User) { func (c Config) String(useAdmin bool, appName string) string { user := c.User if useAdmin { - user = c.Admin + user = c.Admin.User } c.checkSSL(user) fields := []string{ @@ -163,6 +169,8 @@ func (c Config) String(useAdmin bool, appName string) string { } if !useAdmin { fields = append(fields, "dbname="+c.Database) + } else if c.Admin.ExistingDatabase != "" { + fields = append(fields, "dbname="+c.Admin.ExistingDatabase) } if user.Password != "" { fields = append(fields, "password="+user.Password) diff --git a/internal/database/postgres/pg.go b/internal/database/postgres/pg.go index 8f70da0703..daf41b603c 100644 --- a/internal/database/postgres/pg.go +++ b/internal/database/postgres/pg.go @@ -35,7 +35,7 @@ type Config struct { MaxConnLifetime time.Duration MaxConnIdleTime time.Duration User User - Admin User + Admin AdminUser // Additional options to be appended as options= // The value will be taken as is. Multiple options are space separated. Options string @@ -115,6 +115,12 @@ type User struct { SSL SSL } +type AdminUser struct { + // ExistingDatabase is the database to connect to before the ZITADEL database exists + ExistingDatabase string + User `mapstructure:",squash"` +} + type SSL struct { // type of connection security Mode string @@ -148,7 +154,7 @@ func (s *Config) checkSSL(user User) { func (c Config) String(useAdmin bool, appName string) string { user := c.User if useAdmin { - user = c.Admin + user = c.Admin.User } c.checkSSL(user) fields := []string{ @@ -167,7 +173,11 @@ func (c Config) String(useAdmin bool, appName string) string { if !useAdmin { fields = append(fields, "dbname="+c.Database) } else { - fields = append(fields, "dbname=postgres") + defaultDB := c.Admin.ExistingDatabase + if defaultDB == "" { + defaultDB = "postgres" + } + fields = append(fields, "dbname="+defaultDB) } if user.SSL.Mode != sslDisabledMode { if user.SSL.RootCert != "" { From b42a3ad309104c05e4e1be4fa028ba8e6ab11d6f Mon Sep 17 00:00:00 2001 From: mffap Date: Tue, 11 Jun 2024 13:01:10 +0200 Subject: [PATCH 09/44] docs(manage): update terraform provider (#8102) # Which Problems Are Solved Terraform provider docs without introcution and "here" links were hard to search for. # How the Problems Are Solved Updated docs page # Additional Changes changed the slug for more clarity and added a redirect --- docs/docs/guides/manage/terraform-provider.md | 37 +++++++++++++++++++ docs/docs/guides/manage/terraform/basics.md | 28 -------------- docs/docs/self-hosting/deploy/compose.mdx | 2 +- docs/docs/self-hosting/deploy/linux.mdx | 2 +- docs/docs/self-hosting/deploy/macos.mdx | 2 +- docs/docs/self-hosting/manage/production.md | 2 +- docs/sidebars.js | 6 +-- docs/vercel.json | 1 + 8 files changed, 43 insertions(+), 37 deletions(-) create mode 100644 docs/docs/guides/manage/terraform-provider.md delete mode 100644 docs/docs/guides/manage/terraform/basics.md diff --git a/docs/docs/guides/manage/terraform-provider.md b/docs/docs/guides/manage/terraform-provider.md new file mode 100644 index 0000000000..75f18d46f1 --- /dev/null +++ b/docs/docs/guides/manage/terraform-provider.md @@ -0,0 +1,37 @@ +--- +title: ZITADEL Terraform Provider +sidebar_label: Terraform Provider +--- + +The [ZITADEL Terraform Provider](https://registry.terraform.io/providers/zitadel/zitadel/latest/docs) is a tool that allows you to manage ZITADEL resources through Terraform. +In other words, it lets you define and provision infrastructure for ZITADEL using Terraform configuration files. + +This Terraform provider acts as a bridge, allowing you to manage various aspects of your ZITADEL instance directly through the [ZITADEL API](/docs/apis/introduction), using Terraform's declarative configuration language. +It can be used to create, update, and delete ZITADEL resources, as well as to manage the relationships between those resources. + +## Before you start + +Make sure you create the following resources in ZITADEL and have [Terraform installed](https://learn.hashicorp.com/tutorials/terraform/install-cli): + +- [A ZITADEL Instance](../start/quickstart) +- [A service user](/docs/guides/integrate/service-users/authenticate-service-users) with [enough authorization](/docs/guides/manage/console/managers) to manage the desired resources + +## Manage ZITADEL resources through terraform + +The full documentation and examples are available on the [Terraform registry](https://registry.terraform.io/providers/zitadel/zitadel/latest/docs). + +To provide a small guide to where to start: + +1. Create a folder where all the terraform files reside. +2. Configure the provider to use the right domain, port and token, with for example a `main.tf`file [as shown in the example](https://registry.terraform.io/providers/zitadel/zitadel/latest/docs). +3. Add a `zitadel_org` resource to the `main.tf` file, to create and manage a new organization in the instance, [as shown in the example](https://registry.terraform.io/providers/zitadel/zitadel/latest/docs/resources/org). +4. Add any resources to the organization in the `main.tf` file, [as example a human user](https://registry.terraform.io/providers/zitadel/zitadel/latest/docs/resources/human_user). +5. (Optional) Use Terraform in the directory with the command `terraform plan`, to see which resources would be created and how. +6. Apply the changes and start managing your resources with terraform with `terraform apply`. +7. (Optional) Delete your created resources with `terraform destroy` to clean-up. + +## References + +- [Deploy ZITADEL in your infrastructure](/docs/self-hosting/deploy/overview) +- [ZITADEL CLI](/docs/self-hosting/manage/cli/overview) +- [Configuration Options in ZITADEL](/docs/self-hosting/manage/configure) diff --git a/docs/docs/guides/manage/terraform/basics.md b/docs/docs/guides/manage/terraform/basics.md deleted file mode 100644 index d4678efe79..0000000000 --- a/docs/docs/guides/manage/terraform/basics.md +++ /dev/null @@ -1,28 +0,0 @@ ---- -title: ZITADEL Terraform Provider -sidebar_label: Terraform Provider ---- - -It covers how to: - -- Manage ZITADEL resources through the ZITADEL Terraform provider - -Prerequisites: - -- A ZITADEL Instance, if not present follow [this guide](../../start/quickstart) -- A user with enough authorization to manage the desired resources, if not present follow [this guide](/docs/guides/integrate/service-users/authenticate-service-users) -- Installed Terraform, if not present follow [this guide](https://learn.hashicorp.com/tutorials/terraform/install-cli) - -## Manage ZITADEL resources through terraform - -The full documentation and examples are available [here](https://registry.terraform.io/providers/zitadel/zitadel/latest/docs). - -To provide a small guide to where to start: - -1. Create a folder where all the terraform files reside. -2. Configure the provider to use the right domain, port and token, with for example a `main.tf`file [as shown in the example](https://registry.terraform.io/providers/zitadel/zitadel/latest/docs). -3. Add a `zitadel_org` resource to the `main.tf` file, to create and manage a new organization in the instance, [as shown in the example](https://registry.terraform.io/providers/zitadel/zitadel/latest/docs/resources/org). -4. Add any resources to the organization in the `main.tf` file, [as example a human user](https://registry.terraform.io/providers/zitadel/zitadel/latest/docs/resources/human_user). -5. (Optional) Use Terraform in the directory with the command `terraform plan`, to see which resources would be created and how. -6. Apply the changes and start managing your resources with terraform with `terraform apply`. -7. (Optional) Delete your created resources with `terraform destroy` to clean-up. diff --git a/docs/docs/self-hosting/deploy/compose.mdx b/docs/docs/self-hosting/deploy/compose.mdx index 9b3f4f9777..525637d5c5 100644 --- a/docs/docs/self-hosting/deploy/compose.mdx +++ b/docs/docs/self-hosting/deploy/compose.mdx @@ -56,7 +56,7 @@ docker compose up --detach mv ./machinekey/zitadel-admin-sa.json $HOME/zitadel-admin-sa.json ``` -This key can be used to provision resources with for example [Terraform](/docs/guides/manage/terraform/basics.md). +This key can be used to provision resources with for example [Terraform](/docs/guides/manage/terraform-provider). diff --git a/docs/docs/self-hosting/deploy/linux.mdx b/docs/docs/self-hosting/deploy/linux.mdx index b12204eb4c..9b6e7a4fec 100644 --- a/docs/docs/self-hosting/deploy/linux.mdx +++ b/docs/docs/self-hosting/deploy/linux.mdx @@ -59,7 +59,7 @@ ZITADEL_DATABASE_POSTGRES_HOST=localhost ZITADEL_DATABASE_POSTGRES_PORT=5432 ZIT mv /tmp/zitadel-admin-sa.json $HOME/zitadel-admin-sa.json ``` -This key can be used to provision resources with for example [Terraform](/docs/guides/manage/terraform/basics.md). +This key can be used to provision resources with for example [Terraform](/docs/guides/manage/terraform-provider). diff --git a/docs/docs/self-hosting/deploy/macos.mdx b/docs/docs/self-hosting/deploy/macos.mdx index 423293d291..3f0ef01bd3 100644 --- a/docs/docs/self-hosting/deploy/macos.mdx +++ b/docs/docs/self-hosting/deploy/macos.mdx @@ -61,7 +61,7 @@ ZITADEL_DATABASE_POSTGRES_HOST=localhost ZITADEL_DATABASE_POSTGRES_PORT=5432 ZIT mv /tmp/zitadel-admin-sa.json $HOME/zitadel-admin-sa.json ``` -This key can be used to provision resources with for example [Terraform](/docs/guides/manage/terraform/basics.md). +This key can be used to provision resources with for example [Terraform](/docs/guides/manage/terraform-provider). diff --git a/docs/docs/self-hosting/manage/production.md b/docs/docs/self-hosting/manage/production.md index b516b2548e..51c6a787a3 100644 --- a/docs/docs/self-hosting/manage/production.md +++ b/docs/docs/self-hosting/manage/production.md @@ -207,7 +207,7 @@ DefaultInstance: - If you don't want to use the DefaultInstance configuration for the first instance that ZITADEL automatically creates for you during the [setup phase](/self-hosting/manage/configure#database-initialization), you can provide a FirstInstance YAML section using the --steps argument. - Learn how to configure ZITADEL via the [Console user interface](/guides/manage/console/overview). - Probably, you also want to [apply your custom branding](/guides/manage/customize/branding), [hook into certain events](/guides/manage/customize/behavior), [customize texts](/guides/manage/customize/texts) or [add metadata to your users](/guides/manage/customize/user-metadata). -- If you want to automatically create ZITADEL resources, you can use the [ZITADEL Terraform Provider](/guides/manage/terraform/basics). +- If you want to automatically create ZITADEL resources, you can use the [ZITADEL Terraform Provider](/guides/manage/terraform-provider). ## Limits and Quotas diff --git a/docs/sidebars.js b/docs/sidebars.js index d142431638..39f3d314d0 100644 --- a/docs/sidebars.js +++ b/docs/sidebars.js @@ -154,11 +154,6 @@ module.exports = { "guides/manage/customize/restrictions", ], }, - { - type: "category", - label: "Terraform", - items: ["guides/manage/terraform/basics"], - }, { type: "category", label: "Users", @@ -168,6 +163,7 @@ module.exports = { "guides/manage/customize/user-schema", ], }, + "guides/manage/terraform-provider" ], }, { diff --git a/docs/vercel.json b/docs/vercel.json index df08ad33ab..a36082eceb 100644 --- a/docs/vercel.json +++ b/docs/vercel.json @@ -39,6 +39,7 @@ { "source": "/docs/guides/integrate/event-api", "destination": "/docs/guides/integrate/zitadel-apis/event-api", "permanent": true }, { "source": "/docs/examples/call-zitadel-api/go", "destination": "/docs/guides/integrate/zitadel-apis/example-zitadel-api-with-go", "permanent": true }, { "source": "/docs/examples/call-zitadel-api/dot-net", "destination": "/docs/guides/integrate/zitadel-apis/example-zitadel-api-with-dot-net", "permanent": true }, + { "source": "/docs/guides/manage/terraform/basics", "destination": "/docs/guides/manage/terraform-provider", "permanent": true }, { "source": "/docs/guides/integrate/identity-providers", "destination": "/docs/guides/integrate/identity-providers/introduction", "permanent": true } ] } From b6c10c4c83ce05c5de10e9193503327eef3c2a88 Mon Sep 17 00:00:00 2001 From: Livio Spring Date: Wed, 12 Jun 2024 06:49:14 +0200 Subject: [PATCH 10/44] fix: consider oidc session events for authN milestones (#8089) # Which Problems Are Solved After migrating the access token events in #7822, milestones based on authentication, resp. theses events would not be reached. # How the Problems Are Solved Additionally use the `oidc_session.Added` event to check for `milestone.AuthenticationSucceededOnInstance` and `milestone.AuthenticationSucceededOnApplication`. # Additional Changes None. # Additional Context - relates to #7822 - noticed internally --- ...ion_allow_public_org_registrations_test.go | 2 +- ...ions_integration_allowed_languages_test.go | 2 +- .../grpc/system/instance_integration_test.go | 2 +- ...mits_integration_auditlogretention_test.go | 2 +- .../system/limits_integration_block_test.go | 2 +- .../quotas_enabled/quota_integration_test.go | 4 +- internal/integration/client.go | 15 ++- internal/integration/oidc.go | 11 +- .../handlers/quota_notifier_test.go | 4 +- .../telemetry_pusher_integration_test.go | 120 +++++++++++++++--- internal/query/projection/milestones.go | 44 +++++++ internal/query/projection/milestones_test.go | 38 ++++++ 12 files changed, 213 insertions(+), 33 deletions(-) diff --git a/internal/api/grpc/admin/restrictions_integration_allow_public_org_registrations_test.go b/internal/api/grpc/admin/restrictions_integration_allow_public_org_registrations_test.go index 30250e772a..5b29de19bb 100644 --- a/internal/api/grpc/admin/restrictions_integration_allow_public_org_registrations_test.go +++ b/internal/api/grpc/admin/restrictions_integration_allow_public_org_registrations_test.go @@ -22,7 +22,7 @@ import ( func TestServer_Restrictions_DisallowPublicOrgRegistration(t *testing.T) { ctx, cancel := context.WithTimeout(context.Background(), time.Minute) defer cancel() - domain, _, iamOwnerCtx := Tester.UseIsolatedInstance(t, ctx, SystemCTX) + domain, _, _, iamOwnerCtx := Tester.UseIsolatedInstance(t, ctx, SystemCTX) regOrgUrl, err := url.Parse("http://" + domain + ":8080/ui/login/register/org") require.NoError(t, err) // The CSRF cookie must be sent with every request. diff --git a/internal/api/grpc/admin/restrictions_integration_allowed_languages_test.go b/internal/api/grpc/admin/restrictions_integration_allowed_languages_test.go index 277375f525..3e00978676 100644 --- a/internal/api/grpc/admin/restrictions_integration_allowed_languages_test.go +++ b/internal/api/grpc/admin/restrictions_integration_allowed_languages_test.go @@ -33,7 +33,7 @@ func TestServer_Restrictions_AllowedLanguages(t *testing.T) { unsupportedLanguage = language.Afrikaans ) - domain, _, iamOwnerCtx := Tester.UseIsolatedInstance(t, ctx, SystemCTX) + domain, _, _, iamOwnerCtx := Tester.UseIsolatedInstance(t, ctx, SystemCTX) t.Run("assumed defaults are correct", func(tt *testing.T) { tt.Run("languages are not restricted by default", func(ttt *testing.T) { restrictions, err := Tester.Client.Admin.GetRestrictions(iamOwnerCtx, &admin.GetRestrictionsRequest{}) diff --git a/internal/api/grpc/system/instance_integration_test.go b/internal/api/grpc/system/instance_integration_test.go index b4a6cea227..50d1dda50b 100644 --- a/internal/api/grpc/system/instance_integration_test.go +++ b/internal/api/grpc/system/instance_integration_test.go @@ -14,7 +14,7 @@ import ( ) func TestServer_ListInstances(t *testing.T) { - domain, instanceID, _ := Tester.UseIsolatedInstance(t, CTX, SystemCTX) + domain, instanceID, _, _ := Tester.UseIsolatedInstance(t, CTX, SystemCTX) tests := []struct { name string diff --git a/internal/api/grpc/system/limits_integration_auditlogretention_test.go b/internal/api/grpc/system/limits_integration_auditlogretention_test.go index 55ac76e998..b31ee818bf 100644 --- a/internal/api/grpc/system/limits_integration_auditlogretention_test.go +++ b/internal/api/grpc/system/limits_integration_auditlogretention_test.go @@ -21,7 +21,7 @@ import ( ) func TestServer_Limits_AuditLogRetention(t *testing.T) { - _, instanceID, iamOwnerCtx := Tester.UseIsolatedInstance(t, CTX, SystemCTX) + _, instanceID, _, iamOwnerCtx := Tester.UseIsolatedInstance(t, CTX, SystemCTX) userID, projectID, appID, projectGrantID := seedObjects(iamOwnerCtx, t) beforeTime := time.Now() farPast := timestamppb.New(beforeTime.Add(-10 * time.Hour).UTC()) diff --git a/internal/api/grpc/system/limits_integration_block_test.go b/internal/api/grpc/system/limits_integration_block_test.go index f007dd46c4..68426dd05e 100644 --- a/internal/api/grpc/system/limits_integration_block_test.go +++ b/internal/api/grpc/system/limits_integration_block_test.go @@ -27,7 +27,7 @@ import ( ) func TestServer_Limits_Block(t *testing.T) { - domain, instanceID, iamOwnerCtx := Tester.UseIsolatedInstance(t, CTX, SystemCTX) + domain, instanceID, _, iamOwnerCtx := Tester.UseIsolatedInstance(t, CTX, SystemCTX) tests := []*test{ publicAPIBlockingTest(domain), { diff --git a/internal/api/grpc/system/quotas_enabled/quota_integration_test.go b/internal/api/grpc/system/quotas_enabled/quota_integration_test.go index a6bd30707f..225b4a2daa 100644 --- a/internal/api/grpc/system/quotas_enabled/quota_integration_test.go +++ b/internal/api/grpc/system/quotas_enabled/quota_integration_test.go @@ -66,7 +66,7 @@ func TestServer_QuotaNotification_Limit(t *testing.T) { } func TestServer_QuotaNotification_NoLimit(t *testing.T) { - _, instanceID, IAMOwnerCTX := Tester.UseIsolatedInstance(t, CTX, SystemCTX) + _, instanceID, _, IAMOwnerCTX := Tester.UseIsolatedInstance(t, CTX, SystemCTX) amount := 10 percent := 50 percentAmount := amount * percent / 100 @@ -148,7 +148,7 @@ func awaitNotification(t *testing.T, bodies chan []byte, unit quota.Unit, percen } func TestServer_AddAndRemoveQuota(t *testing.T) { - _, instanceID, _ := Tester.UseIsolatedInstance(t, CTX, SystemCTX) + _, instanceID, _, _ := Tester.UseIsolatedInstance(t, CTX, SystemCTX) got, err := Tester.Client.System.SetQuota(SystemCTX, &system.SetQuotaRequest{ InstanceId: instanceID, diff --git a/internal/integration/client.go b/internal/integration/client.go index 72f50e9988..4b400bfb39 100644 --- a/internal/integration/client.go +++ b/internal/integration/client.go @@ -76,7 +76,7 @@ func newClient(cc *grpc.ClientConn) Client { } } -func (t *Tester) UseIsolatedInstance(tt *testing.T, iamOwnerCtx, systemCtx context.Context) (primaryDomain, instanceId string, authenticatedIamOwnerCtx context.Context) { +func (t *Tester) UseIsolatedInstance(tt *testing.T, iamOwnerCtx, systemCtx context.Context) (primaryDomain, instanceId, adminID string, authenticatedIamOwnerCtx context.Context) { primaryDomain = RandString(5) + ".integration.localhost" instance, err := t.Client.System.CreateInstance(systemCtx, &system.CreateInstanceRequest{ InstanceName: "testinstance", @@ -89,20 +89,23 @@ func (t *Tester) UseIsolatedInstance(tt *testing.T, iamOwnerCtx, systemCtx conte }, }, }) - if err != nil { - panic(err) - } + require.NoError(tt, err) t.createClientConn(iamOwnerCtx, fmt.Sprintf("%s:%d", primaryDomain, t.Config.Port)) instanceId = instance.GetInstanceId() + owner, err := t.Queries.GetUserByLoginName(authz.WithInstanceID(iamOwnerCtx, instanceId), true, "owner@"+primaryDomain) + require.NoError(tt, err) t.Users.Set(instanceId, IAMOwner, &User{ + User: owner, Token: instance.GetPat(), }) newCtx := t.WithInstanceAuthorization(iamOwnerCtx, IAMOwner, instanceId) + var adminUser *mgmt.ImportHumanUserResponse // the following serves two purposes: // 1. it ensures that the instance is ready to be used // 2. it enables a normal login with the default admin user credentials require.EventuallyWithT(tt, func(collectT *assert.CollectT) { - _, importErr := t.Client.Mgmt.ImportHumanUser(newCtx, &mgmt.ImportHumanUserRequest{ + var importErr error + adminUser, importErr = t.Client.Mgmt.ImportHumanUser(newCtx, &mgmt.ImportHumanUserRequest{ UserName: "zitadel-admin@zitadel.localhost", Email: &mgmt.ImportHumanUserRequest_Email{ Email: "zitadel-admin@zitadel.localhost", @@ -117,7 +120,7 @@ func (t *Tester) UseIsolatedInstance(tt *testing.T, iamOwnerCtx, systemCtx conte }) assert.NoError(collectT, importErr) }, 2*time.Minute, 100*time.Millisecond, "instance not ready") - return primaryDomain, instanceId, newCtx + return primaryDomain, instanceId, adminUser.GetUserId(), newCtx } func (s *Tester) CreateHumanUser(ctx context.Context) *user.AddHumanUserResponse { diff --git a/internal/integration/oidc.go b/internal/integration/oidc.go index 2d7d6a105e..3e90cb6856 100644 --- a/internal/integration/oidc.go +++ b/internal/integration/oidc.go @@ -151,7 +151,10 @@ func (s *Tester) CreateAPIClientBasic(ctx context.Context, projectID string) (*m const CodeVerifier = "codeVerifier" func (s *Tester) CreateOIDCAuthRequest(ctx context.Context, clientID, loginClient, redirectURI string, scope ...string) (authRequestID string, err error) { - provider, err := s.CreateRelyingParty(ctx, clientID, redirectURI, scope...) + return s.CreateOIDCAuthRequestWithDomain(ctx, s.Config.ExternalDomain, clientID, loginClient, redirectURI, scope...) +} +func (s *Tester) CreateOIDCAuthRequestWithDomain(ctx context.Context, domain, clientID, loginClient, redirectURI string, scope ...string) (authRequestID string, err error) { + provider, err := s.CreateRelyingPartyForDomain(ctx, domain, clientID, redirectURI, scope...) if err != nil { return "", err } @@ -212,11 +215,15 @@ func (s *Tester) OIDCIssuer() string { } func (s *Tester) CreateRelyingParty(ctx context.Context, clientID, redirectURI string, scope ...string) (rp.RelyingParty, error) { + return s.CreateRelyingPartyForDomain(ctx, s.Config.ExternalDomain, clientID, redirectURI, scope...) +} + +func (s *Tester) CreateRelyingPartyForDomain(ctx context.Context, domain, clientID, redirectURI string, scope ...string) (rp.RelyingParty, error) { if len(scope) == 0 { scope = []string{oidc.ScopeOpenID} } loginClient := &http.Client{Transport: &loginRoundTripper{http.DefaultTransport}} - return rp.NewRelyingPartyOIDC(ctx, s.OIDCIssuer(), clientID, "", redirectURI, scope, rp.WithHTTPClient(loginClient)) + return rp.NewRelyingPartyOIDC(ctx, http_util.BuildHTTP(domain, s.Config.Port, s.Config.ExternalSecure), clientID, "", redirectURI, scope, rp.WithHTTPClient(loginClient)) } type loginRoundTripper struct { diff --git a/internal/notification/handlers/quota_notifier_test.go b/internal/notification/handlers/quota_notifier_test.go index 72991019da..14de4e369c 100644 --- a/internal/notification/handlers/quota_notifier_test.go +++ b/internal/notification/handlers/quota_notifier_test.go @@ -21,7 +21,7 @@ import ( ) func TestServer_QuotaNotification_Limit(t *testing.T) { - _, instanceID, iamOwnerCtx := Tester.UseIsolatedInstance(t, CTX, SystemCTX) + _, instanceID, _, iamOwnerCtx := Tester.UseIsolatedInstance(t, CTX, SystemCTX) amount := 10 percent := 50 percentAmount := amount * percent / 100 @@ -67,7 +67,7 @@ func TestServer_QuotaNotification_Limit(t *testing.T) { } func TestServer_QuotaNotification_NoLimit(t *testing.T) { - _, instanceID, iamOwnerCtx := Tester.UseIsolatedInstance(t, CTX, SystemCTX) + _, instanceID, _, iamOwnerCtx := Tester.UseIsolatedInstance(t, CTX, SystemCTX) amount := 10 percent := 50 percentAmount := amount * percent / 100 diff --git a/internal/notification/handlers/telemetry_pusher_integration_test.go b/internal/notification/handlers/telemetry_pusher_integration_test.go index 9520253ade..b84f02fa79 100644 --- a/internal/notification/handlers/telemetry_pusher_integration_test.go +++ b/internal/notification/handlers/telemetry_pusher_integration_test.go @@ -4,38 +4,126 @@ package handlers_test import ( "bytes" + "context" "encoding/json" + "net/url" "testing" "time" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "github.com/zitadel/oidc/v3/pkg/client/rp" + "github.com/zitadel/oidc/v3/pkg/oidc" + + "github.com/zitadel/zitadel/internal/integration" + "github.com/zitadel/zitadel/pkg/grpc/app" "github.com/zitadel/zitadel/pkg/grpc/management" + "github.com/zitadel/zitadel/pkg/grpc/object" + oidc_v2 "github.com/zitadel/zitadel/pkg/grpc/oidc/v2beta" + "github.com/zitadel/zitadel/pkg/grpc/project" "github.com/zitadel/zitadel/pkg/grpc/system" ) func TestServer_TelemetryPushMilestones(t *testing.T) { - primaryDomain, instanceID, iamOwnerCtx := Tester.UseIsolatedInstance(t, CTX, SystemCTX) + primaryDomain, instanceID, adminID, iamOwnerCtx := Tester.UseIsolatedInstance(t, CTX, SystemCTX) t.Log("testing against instance with primary domain", primaryDomain) awaitMilestone(t, Tester.MilestoneChan, primaryDomain, "InstanceCreated") - project, err := Tester.Client.Mgmt.AddProject(iamOwnerCtx, &management.AddProjectRequest{Name: "integration"}) - if err != nil { - t.Fatal(err) - } + + projectAdded, err := Tester.Client.Mgmt.AddProject(iamOwnerCtx, &management.AddProjectRequest{Name: "integration"}) + require.NoError(t, err) awaitMilestone(t, Tester.MilestoneChan, primaryDomain, "ProjectCreated") - if _, err = Tester.Client.Mgmt.AddOIDCApp(iamOwnerCtx, &management.AddOIDCAppRequest{ - ProjectId: project.GetId(), - Name: "integration", - }); err != nil { - t.Fatal(err) - } + + redirectURI := "http://localhost:8888" + application, err := Tester.Client.Mgmt.AddOIDCApp(iamOwnerCtx, &management.AddOIDCAppRequest{ + ProjectId: projectAdded.GetId(), + Name: "integration", + RedirectUris: []string{redirectURI}, + ResponseTypes: []app.OIDCResponseType{app.OIDCResponseType_OIDC_RESPONSE_TYPE_CODE}, + GrantTypes: []app.OIDCGrantType{app.OIDCGrantType_OIDC_GRANT_TYPE_AUTHORIZATION_CODE}, + AppType: app.OIDCAppType_OIDC_APP_TYPE_WEB, + AuthMethodType: app.OIDCAuthMethodType_OIDC_AUTH_METHOD_TYPE_NONE, + DevMode: true, + AccessTokenType: app.OIDCTokenType_OIDC_TOKEN_TYPE_JWT, + }) + require.NoError(t, err) awaitMilestone(t, Tester.MilestoneChan, primaryDomain, "ApplicationCreated") - // TODO: trigger and await milestone AuthenticationSucceededOnInstance - // TODO: trigger and await milestone AuthenticationSucceededOnApplication - if _, err = Tester.Client.System.RemoveInstance(SystemCTX, &system.RemoveInstanceRequest{InstanceId: instanceID}); err != nil { - t.Fatal(err) - } + + // create the session to be used for the authN of the clients + sessionID, sessionToken, _, _ := Tester.CreatePasswordSession(t, iamOwnerCtx, adminID, "Password1!") + + console := consoleOIDCConfig(iamOwnerCtx, t) + loginToClient(iamOwnerCtx, t, primaryDomain, console.GetClientId(), instanceID, console.GetRedirectUris()[0], sessionID, sessionToken) + awaitMilestone(t, Tester.MilestoneChan, primaryDomain, "AuthenticationSucceededOnInstance") + + // make sure the client has been projected + require.EventuallyWithT(t, func(collectT *assert.CollectT) { + _, err := Tester.Client.Mgmt.GetAppByID(iamOwnerCtx, &management.GetAppByIDRequest{ + ProjectId: projectAdded.GetId(), + AppId: application.GetAppId(), + }) + assert.NoError(collectT, err) + }, 1*time.Minute, 100*time.Millisecond, "app not found") + loginToClient(iamOwnerCtx, t, primaryDomain, application.GetClientId(), instanceID, redirectURI, sessionID, sessionToken) + awaitMilestone(t, Tester.MilestoneChan, primaryDomain, "AuthenticationSucceededOnApplication") + + _, err = Tester.Client.System.RemoveInstance(SystemCTX, &system.RemoveInstanceRequest{InstanceId: instanceID}) + require.NoError(t, err) awaitMilestone(t, Tester.MilestoneChan, primaryDomain, "InstanceDeleted") } +func loginToClient(iamOwnerCtx context.Context, t *testing.T, primaryDomain, clientID, instanceID, redirectURI, sessionID, sessionToken string) { + authRequestID, err := Tester.CreateOIDCAuthRequestWithDomain(iamOwnerCtx, primaryDomain, clientID, Tester.Users.Get(instanceID, integration.IAMOwner).ID, redirectURI, "openid") + require.NoError(t, err) + callback, err := Tester.Client.OIDCv2.CreateCallback(iamOwnerCtx, &oidc_v2.CreateCallbackRequest{ + AuthRequestId: authRequestID, + CallbackKind: &oidc_v2.CreateCallbackRequest_Session{Session: &oidc_v2.Session{ + SessionId: sessionID, + SessionToken: sessionToken, + }}, + }) + require.NoError(t, err) + provider, err := Tester.CreateRelyingPartyForDomain(iamOwnerCtx, primaryDomain, clientID, redirectURI) + require.NoError(t, err) + callbackURL, err := url.Parse(callback.GetCallbackUrl()) + require.NoError(t, err) + code := callbackURL.Query().Get("code") + _, err = rp.CodeExchange[*oidc.IDTokenClaims](iamOwnerCtx, code, provider, rp.WithCodeVerifier(integration.CodeVerifier)) + require.NoError(t, err) +} + +func consoleOIDCConfig(iamOwnerCtx context.Context, t *testing.T) *app.OIDCConfig { + projects, err := Tester.Client.Mgmt.ListProjects(iamOwnerCtx, &management.ListProjectsRequest{ + Queries: []*project.ProjectQuery{ + { + Query: &project.ProjectQuery_NameQuery{ + NameQuery: &project.ProjectNameQuery{ + Name: "ZITADEL", + Method: object.TextQueryMethod_TEXT_QUERY_METHOD_EQUALS, + }, + }, + }, + }, + }) + require.NoError(t, err) + require.Len(t, projects.GetResult(), 1) + apps, err := Tester.Client.Mgmt.ListApps(iamOwnerCtx, &management.ListAppsRequest{ + ProjectId: projects.GetResult()[0].GetId(), + Queries: []*app.AppQuery{ + { + Query: &app.AppQuery_NameQuery{ + NameQuery: &app.AppNameQuery{ + Name: "Console", + Method: object.TextQueryMethod_TEXT_QUERY_METHOD_EQUALS, + }, + }, + }, + }, + }) + require.NoError(t, err) + require.Len(t, apps.GetResult(), 1) + return apps.GetResult()[0].GetOidcConfig() +} + func awaitMilestone(t *testing.T, bodies chan []byte, primaryDomain, expectMilestoneType string) { for { select { diff --git a/internal/query/projection/milestones.go b/internal/query/projection/milestones.go index 0ac5e81842..7c344001b3 100644 --- a/internal/query/projection/milestones.go +++ b/internal/query/projection/milestones.go @@ -10,6 +10,7 @@ import ( "github.com/zitadel/zitadel/internal/eventstore/handler/v2" "github.com/zitadel/zitadel/internal/repository/instance" "github.com/zitadel/zitadel/internal/repository/milestone" + "github.com/zitadel/zitadel/internal/repository/oidcsession" "github.com/zitadel/zitadel/internal/repository/project" "github.com/zitadel/zitadel/internal/repository/user" ) @@ -104,6 +105,15 @@ func (p *milestoneProjection) Reducers() []handler.AggregateReducer { }, }, }, + { + Aggregate: oidcsession.AggregateType, + EventReducers: []handler.EventReducer{ + { + Event: oidcsession.AddedType, + Reduce: p.reduceOIDCSessionAdded, + }, + }, + }, { Aggregate: milestone.AggregateType, EventReducers: []handler.EventReducer{ @@ -217,6 +227,40 @@ func (p *milestoneProjection) reduceUserTokenAdded(event eventstore.Event) (*han return handler.NewMultiStatement(e, statements...), nil } +func (p *milestoneProjection) reduceOIDCSessionAdded(event eventstore.Event) (*handler.Statement, error) { + e, err := assertEvent[*oidcsession.AddedEvent](event) + if err != nil { + return nil, err + } + statements := []func(eventstore.Event) handler.Exec{ + handler.AddUpdateStatement( + []handler.Column{ + handler.NewCol(MilestoneColumnReachedDate, event.CreatedAt()), + }, + []handler.Condition{ + handler.NewCond(MilestoneColumnInstanceID, event.Aggregate().InstanceID), + handler.NewCond(MilestoneColumnType, milestone.AuthenticationSucceededOnInstance), + handler.NewIsNullCond(MilestoneColumnReachedDate), + }, + ), + } + // We ignore authentications without app, for example JWT profile or PAT + if e.ClientID != "" { + statements = append(statements, handler.AddUpdateStatement( + []handler.Column{ + handler.NewCol(MilestoneColumnReachedDate, event.CreatedAt()), + }, + []handler.Condition{ + handler.NewCond(MilestoneColumnInstanceID, event.Aggregate().InstanceID), + handler.NewCond(MilestoneColumnType, milestone.AuthenticationSucceededOnApplication), + handler.Not(handler.NewTextArrayContainsCond(MilestoneColumnIgnoreClientIDs, e.ClientID)), + handler.NewIsNullCond(MilestoneColumnReachedDate), + }, + )) + } + return handler.NewMultiStatement(e, statements...), nil +} + func (p *milestoneProjection) reduceInstanceRemoved(event eventstore.Event) (*handler.Statement, error) { if _, err := assertEvent[*instance.InstanceRemovedEvent](event); err != nil { return nil, err diff --git a/internal/query/projection/milestones_test.go b/internal/query/projection/milestones_test.go index 884c7e27de..f9eb4d40d1 100644 --- a/internal/query/projection/milestones_test.go +++ b/internal/query/projection/milestones_test.go @@ -9,6 +9,7 @@ import ( "github.com/zitadel/zitadel/internal/eventstore/handler/v2" "github.com/zitadel/zitadel/internal/repository/instance" "github.com/zitadel/zitadel/internal/repository/milestone" + "github.com/zitadel/zitadel/internal/repository/oidcsession" "github.com/zitadel/zitadel/internal/repository/project" "github.com/zitadel/zitadel/internal/repository/user" "github.com/zitadel/zitadel/internal/zerrors" @@ -294,6 +295,43 @@ func TestMilestonesProjection_reduces(t *testing.T) { }, }, }, + { + name: "reduceOIDCSessionAdded", + args: args{ + event: getEvent(timedTestEvent( + oidcsession.AddedType, + oidcsession.AggregateType, + []byte(`{"clientID": "client-id"}`), + now, + ), eventstore.GenericEventMapper[oidcsession.AddedEvent]), + }, + reduce: (&milestoneProjection{}).reduceOIDCSessionAdded, + want: wantReduce{ + aggregateType: eventstore.AggregateType("oidc_session"), + sequence: 15, + executer: &testExecuter{ + executions: []execution{ + { + expectedStmt: "UPDATE projections.milestones SET reached_date = $1 WHERE (instance_id = $2) AND (type = $3) AND (reached_date IS NULL)", + expectedArgs: []interface{}{ + now, + "instance-id", + milestone.AuthenticationSucceededOnInstance, + }, + }, + { + expectedStmt: "UPDATE projections.milestones SET reached_date = $1 WHERE (instance_id = $2) AND (type = $3) AND (NOT (ignore_client_ids @> $4)) AND (reached_date IS NULL)", + expectedArgs: []interface{}{ + now, + "instance-id", + milestone.AuthenticationSucceededOnApplication, + database.TextArray[string]{"client-id"}, + }, + }, + }, + }, + }, + }, { name: "reduceInstanceRemoved", args: args{ From 448f8f2c116d474a5a3e486eda5bbde380ac9890 Mon Sep 17 00:00:00 2001 From: Livio Spring Date: Wed, 12 Jun 2024 08:42:50 +0200 Subject: [PATCH 11/44] fix(oauth2): correctly return an error on client_credentials and jwt_profile (#8092) # Which Problems Are Solved When an error occurred during the oidc session creation from client_credentials or jwt_profile, the error was ignored. # How the Problems Are Solved Return the error. # Additional Changes None. # Additional Context - relates to #7822 - noticed internally - backport to 2.53.x --- internal/api/oidc/token_client_credentials.go | 3 +++ internal/api/oidc/token_jwt_profile.go | 3 +++ 2 files changed, 6 insertions(+) diff --git a/internal/api/oidc/token_client_credentials.go b/internal/api/oidc/token_client_credentials.go index 4b3bf20acd..5d19e398a6 100644 --- a/internal/api/oidc/token_client_credentials.go +++ b/internal/api/oidc/token_client_credentials.go @@ -46,6 +46,9 @@ func (s *Server) ClientCredentialsExchange(ctx context.Context, r *op.ClientRequ nil, false, ) + if err != nil { + return nil, err + } return response(s.accessTokenResponseFromSession(ctx, client, session, "", "", false, true, false, false)) } diff --git a/internal/api/oidc/token_jwt_profile.go b/internal/api/oidc/token_jwt_profile.go index fc0c31a6eb..399fa5302e 100644 --- a/internal/api/oidc/token_jwt_profile.go +++ b/internal/api/oidc/token_jwt_profile.go @@ -54,6 +54,9 @@ func (s *Server) JWTProfile(ctx context.Context, r *op.Request[oidc.JWTProfileGr nil, false, ) + if err != nil { + return nil, err + } return response(s.accessTokenResponseFromSession(ctx, client, session, "", "", false, true, false, false)) } From 931a6c7ccef71f8626ff8285d360d98a17e720b1 Mon Sep 17 00:00:00 2001 From: Livio Spring Date: Wed, 12 Jun 2024 11:11:36 +0200 Subject: [PATCH 12/44] perf(authZ): improve oidc session check (#8091) # Which Problems Are Solved Access token checks make sure that there have not been any termination events (user locked, deactivated, signed out, ...) in the meantime. This events were filtered based on the creation date of the last session event, which might cause latency issues in the database. # How the Problems Are Solved - Changed the query to use `position` instead of `created_at`. - removed `AwaitOpenTransactions` # Additional Changes Added the `position` field to the `ReadModel`. # Additional Context - relates to #8088 - part of #7639 - backport to 2.53.x --- internal/eventstore/read_model.go | 2 ++ internal/query/access_token.go | 19 ++++++++----------- 2 files changed, 10 insertions(+), 11 deletions(-) diff --git a/internal/eventstore/read_model.go b/internal/eventstore/read_model.go index 10c84358e5..d2c755cc3a 100644 --- a/internal/eventstore/read_model.go +++ b/internal/eventstore/read_model.go @@ -13,6 +13,7 @@ type ReadModel struct { Events []Event `json:"-"` ResourceOwner string `json:"-"` InstanceID string `json:"-"` + Position float64 `json:"-"` } // AppendEvents adds all the events to the read model. @@ -43,6 +44,7 @@ func (rm *ReadModel) Reduce() error { } rm.ChangeDate = rm.Events[len(rm.Events)-1].CreatedAt() rm.ProcessedSequence = rm.Events[len(rm.Events)-1].Sequence() + rm.Position = rm.Events[len(rm.Events)-1].Position() // all events processed and not needed anymore rm.Events = rm.Events[0:0] return nil diff --git a/internal/query/access_token.go b/internal/query/access_token.go index 40d9b1700a..a777a6afc7 100644 --- a/internal/query/access_token.go +++ b/internal/query/access_token.go @@ -17,7 +17,7 @@ import ( ) type OIDCSessionAccessTokenReadModel struct { - eventstore.WriteModel + eventstore.ReadModel UserID string SessionID string @@ -39,7 +39,7 @@ type OIDCSessionAccessTokenReadModel struct { func newOIDCSessionAccessTokenReadModel(id string) *OIDCSessionAccessTokenReadModel { return &OIDCSessionAccessTokenReadModel{ - WriteModel: eventstore.WriteModel{ + ReadModel: eventstore.ReadModel{ AggregateID: id, }, } @@ -57,13 +57,11 @@ func (wm *OIDCSessionAccessTokenReadModel) Reduce() error { wm.reduceTokenRevoked(event) } } - return wm.WriteModel.Reduce() + return wm.ReadModel.Reduce() } func (wm *OIDCSessionAccessTokenReadModel) Query() *eventstore.SearchQueryBuilder { return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent). - AwaitOpenTransactions(). - AllowTimeTravel(). AddQuery(). AggregateTypes(oidcsession.AggregateType). AggregateIDs(wm.AggregateID). @@ -120,7 +118,7 @@ func (q *Queries) ActiveAccessTokenByToken(ctx context.Context, token string) (m if !model.AccessTokenExpiration.After(time.Now()) { return nil, zerrors.ThrowPermissionDenied(nil, "QUERY-SAF3rf", "Errors.OIDCSession.Token.Expired") } - if err = q.checkSessionNotTerminatedAfter(ctx, model.SessionID, model.UserID, model.AccessTokenCreation, model.UserAgent.GetFingerprintID()); err != nil { + if err = q.checkSessionNotTerminatedAfter(ctx, model.SessionID, model.UserID, model.Position, model.UserAgent.GetFingerprintID()); err != nil { return nil, err } return model, nil @@ -142,13 +140,13 @@ func (q *Queries) accessTokenByOIDCSessionAndTokenID(ctx context.Context, oidcSe // checkSessionNotTerminatedAfter checks if a [session.TerminateType] event (or user events leading to a session termination) // occurred after a certain time and will return an error if so. -func (q *Queries) checkSessionNotTerminatedAfter(ctx context.Context, sessionID, userID string, creation time.Time, fingerprintID string) (err error) { +func (q *Queries) checkSessionNotTerminatedAfter(ctx context.Context, sessionID, userID string, position float64, fingerprintID string) (err error) { ctx, span := tracing.NewSpan(ctx) defer func() { span.EndWithError(err) }() model := &sessionTerminatedModel{ sessionID: sessionID, - creation: creation, + position: position, userID: userID, fingerPrintID: fingerprintID, } @@ -164,7 +162,7 @@ func (q *Queries) checkSessionNotTerminatedAfter(ctx context.Context, sessionID, } type sessionTerminatedModel struct { - creation time.Time + position float64 sessionID string userID string fingerPrintID string @@ -184,8 +182,7 @@ func (s *sessionTerminatedModel) AppendEvents(events ...eventstore.Event) { func (s *sessionTerminatedModel) Query() *eventstore.SearchQueryBuilder { query := eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent). - AwaitOpenTransactions(). - CreationDateAfter(s.creation). + PositionAfter(s.position). AddQuery(). AggregateTypes(session.AggregateType). AggregateIDs(s.sessionID). From 1d13d41139eed8d5ecb4b1b106e8d2cd8752d695 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joakim=20Lod=C3=A9n?= Date: Wed, 12 Jun 2024 12:18:48 +0200 Subject: [PATCH 13/44] fix: remove duplicate otel span processors (#8104) --- internal/telemetry/tracing/otel/open_telemetry.go | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/internal/telemetry/tracing/otel/open_telemetry.go b/internal/telemetry/tracing/otel/open_telemetry.go index 9bffe230e8..4a3f137859 100644 --- a/internal/telemetry/tracing/otel/open_telemetry.go +++ b/internal/telemetry/tracing/otel/open_telemetry.go @@ -23,11 +23,10 @@ func NewTracer(sampler sdk_trace.Sampler, exporter sdk_trace.SpanExporter) (*Tra if err != nil { return nil, err } - spanProcessor := sdk_trace.NewBatchSpanProcessor(exporter) + tp := sdk_trace.NewTracerProvider( sdk_trace.WithSampler(sampler), sdk_trace.WithBatcher(exporter), - sdk_trace.WithSpanProcessor(spanProcessor), sdk_trace.WithResource(resource), ) From f4d32d98d3a08d95f60495a2f6195172cad16974 Mon Sep 17 00:00:00 2001 From: Andy Pilate Date: Wed, 12 Jun 2024 13:14:14 +0200 Subject: [PATCH 14/44] docs: typo in oauth2-proxy.md (#8098) # Which Problems Are Solved This PR fixes a typo in the documentation # How the Problems Are Solved N/A # Additional Changes N/A # Additional Context N/A Co-authored-by: Fabi --- docs/docs/examples/identity-proxy/oauth2-proxy.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/docs/examples/identity-proxy/oauth2-proxy.md b/docs/docs/examples/identity-proxy/oauth2-proxy.md index e63f91230e..60de436e94 100644 --- a/docs/docs/examples/identity-proxy/oauth2-proxy.md +++ b/docs/docs/examples/identity-proxy/oauth2-proxy.md @@ -32,7 +32,7 @@ Continue and Create the application. After successful app creation a popup will appear showing you your clientID as well as a secret. Copy your client ID and Secrets as it will be needed in the next step. -> Note: You will be able to regenerate the secret at a later time if you loose it. +> Note: You will be able to regenerate the secret at a later time if you lose it. ## OAuth 2.0 Proxy Setup From fb95f4a8a21476944d8af107a06c2ce434ce92b1 Mon Sep 17 00:00:00 2001 From: Livio Spring Date: Wed, 12 Jun 2024 13:53:56 +0200 Subject: [PATCH 15/44] fix(oidc): only return `state` in access token response for implicit flow (#8108) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit # Which Problems Are Solved Introduced with #7822 the access token response incorrectly returned the `state` parameter. # How the Problems Are Solved The `state` will only be returned for access token responses in an implicit_flow. # Additional Changes None. # Additional Context - relates to #7822 - relates to https://github.com/zitadel/oidc/issues/446#issuecomment-2144999644 - backport to 2.53.x --------- Co-authored-by: Tim Möhlmann --- .../api/oidc/auth_request_integration_test.go | 3 +++ internal/api/oidc/token_code.go | 19 +++++++++---------- 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/internal/api/oidc/auth_request_integration_test.go b/internal/api/oidc/auth_request_integration_test.go index e2e6ae2f7b..630b20bc09 100644 --- a/internal/api/oidc/auth_request_integration_test.go +++ b/internal/api/oidc/auth_request_integration_test.go @@ -528,6 +528,9 @@ func assertTokens(t *testing.T, tokens *oidc.Tokens[*oidc.IDTokenClaims], requir } else { assert.Empty(t, tokens.RefreshToken) } + // since we test implicit flow directly, we can check that any token response must not + // return a `state` in the response + assert.Empty(t, tokens.Extra("state")) } func assertIDTokenClaims(t *testing.T, claims *oidc.IDTokenClaims, userID string, arm []string, sessionStart, sessionChange time.Time, sessionID string) { diff --git a/internal/api/oidc/token_code.go b/internal/api/oidc/token_code.go index b7ccd1d22f..2e47c55641 100644 --- a/internal/api/oidc/token_code.go +++ b/internal/api/oidc/token_code.go @@ -34,41 +34,40 @@ func (s *Server) CodeExchange(ctx context.Context, r *op.ClientRequest[oidc.Acce var ( session *command.OIDCSession - state string ) if strings.HasPrefix(plainCode, command.IDPrefixV2) { - session, state, err = s.command.CreateOIDCSessionFromAuthRequest( + session, _, err = s.command.CreateOIDCSessionFromAuthRequest( setContextUserSystem(ctx), plainCode, codeExchangeComplianceChecker(client, r.Data), slices.Contains(client.GrantTypes(), oidc.GrantTypeRefreshToken), ) } else { - session, state, err = s.codeExchangeV1(ctx, client, r.Data, r.Data.Code) + session, err = s.codeExchangeV1(ctx, client, r.Data, r.Data.Code) } if err != nil { return nil, err } - return response(s.accessTokenResponseFromSession(ctx, client, session, state, client.client.ProjectID, client.client.ProjectRoleAssertion, client.client.AccessTokenRoleAssertion, client.client.IDTokenRoleAssertion, client.client.IDTokenUserinfoAssertion)) + return response(s.accessTokenResponseFromSession(ctx, client, session, "", client.client.ProjectID, client.client.ProjectRoleAssertion, client.client.AccessTokenRoleAssertion, client.client.IDTokenRoleAssertion, client.client.IDTokenUserinfoAssertion)) } // codeExchangeV1 creates a v2 token from a v1 auth request. -func (s *Server) codeExchangeV1(ctx context.Context, client *Client, req *oidc.AccessTokenRequest, code string) (session *command.OIDCSession, state string, err error) { +func (s *Server) codeExchangeV1(ctx context.Context, client *Client, req *oidc.AccessTokenRequest, code string) (session *command.OIDCSession, err error) { ctx, span := tracing.NewSpan(ctx) defer func() { span.EndWithError(err) }() authReq, err := s.getAuthRequestV1ByCode(ctx, code) if err != nil { - return nil, "", err + return nil, err } if challenge := authReq.GetCodeChallenge(); challenge != nil || client.AuthMethod() == oidc.AuthMethodNone { if err = op.AuthorizeCodeChallenge(req.CodeVerifier, challenge); err != nil { - return nil, "", err + return nil, err } } if req.RedirectURI != authReq.GetRedirectURI() { - return nil, "", oidc.ErrInvalidGrant().WithDescription("redirect_uri does not correspond") + return nil, oidc.ErrInvalidGrant().WithDescription("redirect_uri does not correspond") } scope := authReq.GetScopes() @@ -88,9 +87,9 @@ func (s *Server) codeExchangeV1(ctx context.Context, client *Client, req *oidc.A slices.Contains(scope, oidc.ScopeOfflineAccess), ) if err != nil { - return nil, "", err + return nil, err } - return session, authReq.TransferState, s.repo.DeleteAuthRequest(ctx, authReq.ID) + return session, s.repo.DeleteAuthRequest(ctx, authReq.ID) } // getAuthRequestV1ByCode finds the v1 auth request by code. From fb2b1610f9ada78cdfe4b2aed4129c96658ff27e Mon Sep 17 00:00:00 2001 From: Livio Spring Date: Wed, 12 Jun 2024 14:24:17 +0200 Subject: [PATCH 16/44] fix(oidc): remove MFA requirement on ZITADEL API based on user auth methods (#8069) # Which Problems Are Solved Request to the ZITADEL API currently require multi factor authentication if the user has set up any second factor. However, the login UI will only prompt the user to check factors that are allowed by the login policy. This can lead to situations, where the user has set up a factor (e.g. some OTP) which was not allowed by the policy, therefore will not have to verify the factor, the ZITADEL API however will require the check since the user has set it up. # How the Problems Are Solved The requirement for multi factor authentication based on the user's authentication methods is removed when accessing the ZITADEL APIs. Those requests will only require MFA in case the login policy does so because of `requireMFA` or `requireMFAForLocalUsers`. # Additional Changes None. # Additional Context - a customer reached out to support - discussed internally - relates #7822 - backport to 2.53.x --- .../session/v2/session_integration_test.go | 9 ---- internal/api/oidc/oidc_integration_test.go | 31 ------------- .../eventstore/token_verifier.go | 4 +- internal/query/user_auth_method.go | 46 ------------------- internal/query/user_auth_method_test.go | 37 ++------------- 5 files changed, 5 insertions(+), 122 deletions(-) diff --git a/internal/api/grpc/session/v2/session_integration_test.go b/internal/api/grpc/session/v2/session_integration_test.go index c6fd1b5d42..92d3b0baf7 100644 --- a/internal/api/grpc/session/v2/session_integration_test.go +++ b/internal/api/grpc/session/v2/session_integration_test.go @@ -949,15 +949,6 @@ func Test_ZITADEL_API_missing_authentication(t *testing.T) { require.Nil(t, sessionResp) } -func Test_ZITADEL_API_missing_mfa(t *testing.T) { - id, token, _, _ := Tester.CreatePasswordSession(t, CTX, User.GetUserId(), integration.UserPassword) - - ctx := Tester.WithAuthorizationToken(context.Background(), token) - sessionResp, err := Tester.Client.SessionV2.GetSession(ctx, &session.GetSessionRequest{SessionId: id}) - require.Error(t, err) - require.Nil(t, sessionResp) -} - func Test_ZITADEL_API_success(t *testing.T) { id, token, _, _ := Tester.CreateVerifiedWebAuthNSession(t, CTX, User.GetUserId()) diff --git a/internal/api/oidc/oidc_integration_test.go b/internal/api/oidc/oidc_integration_test.go index 6df8daa132..0baeb53363 100644 --- a/internal/api/oidc/oidc_integration_test.go +++ b/internal/api/oidc/oidc_integration_test.go @@ -120,37 +120,6 @@ func Test_ZITADEL_API_missing_authentication(t *testing.T) { require.Nil(t, myUserResp) } -func Test_ZITADEL_API_missing_mfa_2fa_setup(t *testing.T) { - clientID, _ := createClient(t) - userResp := Tester.CreateHumanUser(CTX) - Tester.SetUserPassword(CTX, userResp.GetUserId(), integration.UserPassword, false) - Tester.RegisterUserU2F(CTX, userResp.GetUserId()) - authRequestID := createAuthRequest(t, clientID, redirectURI, oidc.ScopeOpenID, zitadelAudienceScope) - sessionID, sessionToken, startTime, changeTime := Tester.CreatePasswordSession(t, CTXLOGIN, userResp.GetUserId(), integration.UserPassword) - linkResp, err := Tester.Client.OIDCv2.CreateCallback(CTXLOGIN, &oidc_pb.CreateCallbackRequest{ - AuthRequestId: authRequestID, - CallbackKind: &oidc_pb.CreateCallbackRequest_Session{ - Session: &oidc_pb.Session{ - SessionId: sessionID, - SessionToken: sessionToken, - }, - }, - }) - require.NoError(t, err) - - // code exchange - code := assertCodeResponse(t, linkResp.GetCallbackUrl()) - tokens, err := exchangeTokens(t, clientID, code, redirectURI) - require.NoError(t, err) - assertIDTokenClaims(t, tokens.IDTokenClaims, userResp.GetUserId(), armPassword, startTime, changeTime, sessionID) - - ctx := metadata.AppendToOutgoingContext(context.Background(), "Authorization", fmt.Sprintf("%s %s", tokens.TokenType, tokens.AccessToken)) - - myUserResp, err := Tester.Client.Auth.GetMyUser(ctx, &auth.GetMyUserRequest{}) - require.Error(t, err) - require.Nil(t, myUserResp) -} - func Test_ZITADEL_API_missing_mfa_policy(t *testing.T) { clientID, _ := createClient(t) org := Tester.CreateOrganization(CTXIAM, fmt.Sprintf("ZITADEL_API_MISSING_MFA_%d", time.Now().UnixNano()), fmt.Sprintf("%d@mouse.com", time.Now().UnixNano())) diff --git a/internal/authz/repository/eventsourcing/eventstore/token_verifier.go b/internal/authz/repository/eventsourcing/eventstore/token_verifier.go index 603146f511..4d8823913d 100644 --- a/internal/authz/repository/eventsourcing/eventstore/token_verifier.go +++ b/internal/authz/repository/eventsourcing/eventstore/token_verifier.go @@ -190,8 +190,8 @@ func (repo *TokenVerifierRepo) checkAuthentication(ctx context.Context, authMeth if domain.RequiresMFA( requirements.ForceMFA, requirements.ForceMFALocalOnly, - !hasIDPAuthentication(authMethods)) || - domain.Has2FA(requirements.AuthMethods) { + !hasIDPAuthentication(authMethods), + ) { return zerrors.ThrowPermissionDenied(nil, "AUTHZ-Kl3p0", "mfa required") } return nil diff --git a/internal/query/user_auth_method.go b/internal/query/user_auth_method.go index a350d75360..f1e2721bab 100644 --- a/internal/query/user_auth_method.go +++ b/internal/query/user_auth_method.go @@ -11,7 +11,6 @@ import ( "github.com/zitadel/zitadel/internal/api/authz" "github.com/zitadel/zitadel/internal/api/call" - "github.com/zitadel/zitadel/internal/database" "github.com/zitadel/zitadel/internal/domain" "github.com/zitadel/zitadel/internal/query/projection" "github.com/zitadel/zitadel/internal/telemetry/tracing" @@ -180,7 +179,6 @@ func (q *Queries) ListActiveUserAuthMethodTypes(ctx context.Context, userID stri type UserAuthMethodRequirements struct { UserType domain.UserType - AuthMethods []domain.UserAuthMethodType ForceMFA bool ForceMFALocalOnly bool } @@ -422,30 +420,11 @@ func prepareUserAuthMethodTypesRequiredQuery(ctx context.Context, db prepareData if err != nil { return sq.SelectBuilder{}, nil } - authMethodsQuery, authMethodsArgs, err := prepareAggAuthMethodsQuery() - if err != nil { - return sq.SelectBuilder{}, nil - } - idpsQuery, err := prepareAuthMethodsIDPsQuery() - if err != nil { - return sq.SelectBuilder{}, nil - } return sq.Select( - NotifyPasswordSetCol.identifier(), - authMethodTypeTypes.identifier(), - userIDPsCountCount.identifier(), UserTypeCol.identifier(), forceMFAForce.identifier(), forceMFAForceLocalOnly.identifier()). From(userTable.identifier()). - LeftJoin(join(NotifyUserIDCol, UserIDCol)). - LeftJoin("("+authMethodsQuery+") AS "+authMethodTypeTable.alias+" ON "+ - authMethodTypeUserID.identifier()+" = "+UserIDCol.identifier()+" AND "+ - authMethodTypeInstanceID.identifier()+" = "+UserInstanceIDCol.identifier(), - authMethodsArgs...). - LeftJoin("(" + idpsQuery + ") AS " + userIDPsCountTable.alias + " ON " + - userIDPsCountUserID.identifier() + " = " + UserIDCol.identifier() + " AND " + - userIDPsCountInstanceID.identifier() + " = " + UserInstanceIDCol.identifier()). LeftJoin("(" + loginPolicyQuery + ") AS " + forceMFATable.alias + " ON " + "(" + forceMFAOrgID.identifier() + " = " + UserInstanceIDCol.identifier() + " OR " + forceMFAOrgID.identifier() + " = " + UserResourceOwnerCol.identifier() + ") AND " + forceMFAInstanceID.identifier() + " = " + UserInstanceIDCol.identifier()). @@ -453,16 +432,10 @@ func prepareUserAuthMethodTypesRequiredQuery(ctx context.Context, db prepareData Limit(1). PlaceholderFormat(sq.Dollar), func(row *sql.Row) (*UserAuthMethodRequirements, error) { - var passwordSet sql.NullBool - var authMethodTypes database.NumberArray[domain.UserAuthMethodType] - var idp sql.NullInt64 var userType sql.NullInt32 var forceMFA sql.NullBool var forceMFALocalOnly sql.NullBool err := row.Scan( - &passwordSet, - &authMethodTypes, - &idp, &userType, &forceMFA, &forceMFALocalOnly, @@ -473,16 +446,8 @@ func prepareUserAuthMethodTypesRequiredQuery(ctx context.Context, db prepareData } return nil, zerrors.ThrowInternal(err, "QUERY-Sf3rt", "Errors.Internal") } - if passwordSet.Valid && passwordSet.Bool { - authMethodTypes = append(authMethodTypes, domain.UserAuthMethodTypePassword) - } - if idp.Valid && idp.Int64 > 0 { - authMethodTypes = append(authMethodTypes, domain.UserAuthMethodTypeIDP) - } - return &UserAuthMethodRequirements{ UserType: domain.UserType(userType.Int32), - AuthMethods: authMethodTypes, ForceMFA: forceMFA.Bool, ForceMFALocalOnly: forceMFALocalOnly.Bool, }, nil @@ -513,17 +478,6 @@ func prepareAuthMethodQuery() (string, []interface{}, error) { ToSql() } -func prepareAggAuthMethodsQuery() (string, []interface{}, error) { - return sq.Select( - "array_agg(DISTINCT("+authMethodTypeType.identifier()+")) as method_types", - authMethodTypeUserID.identifier(), - authMethodTypeInstanceID.identifier()). - From(authMethodTypeTable.identifier()). - Where(sq.Eq{authMethodTypeState.identifier(): domain.MFAStateReady}). - GroupBy(authMethodTypeInstanceID.identifier(), authMethodTypeUserID.identifier()). - ToSql() -} - func prepareAuthMethodsForceMFAQuery() (string, error) { loginPolicyQuery, _, err := sq.Select( forceMFAForce.identifier(), diff --git a/internal/query/user_auth_method_test.go b/internal/query/user_auth_method_test.go index 698667d990..b75e6fd461 100644 --- a/internal/query/user_auth_method_test.go +++ b/internal/query/user_auth_method_test.go @@ -11,7 +11,6 @@ import ( sq "github.com/Masterminds/squirrel" - "github.com/zitadel/zitadel/internal/database" "github.com/zitadel/zitadel/internal/domain" "github.com/zitadel/zitadel/internal/zerrors" ) @@ -58,29 +57,16 @@ var ( "method_type", "idps_count", } - prepareAuthMethodTypesRequiredStmt = `SELECT projections.users12_notifications.password_set,` + - ` auth_method_types.method_types,` + - ` user_idps_count.count,` + - ` projections.users12.type,` + + prepareAuthMethodTypesRequiredStmt = `SELECT projections.users12.type,` + ` auth_methods_force_mfa.force_mfa,` + ` auth_methods_force_mfa.force_mfa_local_only` + ` FROM projections.users12` + - ` LEFT JOIN projections.users12_notifications ON projections.users12.id = projections.users12_notifications.user_id AND projections.users12.instance_id = projections.users12_notifications.instance_id` + - ` LEFT JOIN (SELECT array_agg(DISTINCT(auth_method_types.method_type)) as method_types, auth_method_types.user_id, auth_method_types.instance_id FROM projections.user_auth_methods4 AS auth_method_types` + - ` WHERE auth_method_types.state = $1 GROUP BY auth_method_types.instance_id, auth_method_types.user_id) AS auth_method_types` + - ` ON auth_method_types.user_id = projections.users12.id AND auth_method_types.instance_id = projections.users12.instance_id` + - ` LEFT JOIN (SELECT user_idps_count.user_id, user_idps_count.instance_id, COUNT(user_idps_count.user_id) AS count FROM projections.idp_user_links3 AS user_idps_count` + - ` GROUP BY user_idps_count.user_id, user_idps_count.instance_id) AS user_idps_count` + - ` ON user_idps_count.user_id = projections.users12.id AND user_idps_count.instance_id = projections.users12.instance_id` + ` LEFT JOIN (SELECT auth_methods_force_mfa.force_mfa, auth_methods_force_mfa.force_mfa_local_only, auth_methods_force_mfa.instance_id, auth_methods_force_mfa.aggregate_id, auth_methods_force_mfa.is_default FROM projections.login_policies5 AS auth_methods_force_mfa) AS auth_methods_force_mfa` + ` ON (auth_methods_force_mfa.aggregate_id = projections.users12.instance_id OR auth_methods_force_mfa.aggregate_id = projections.users12.resource_owner) AND auth_methods_force_mfa.instance_id = projections.users12.instance_id` + ` ORDER BY auth_methods_force_mfa.is_default LIMIT 1 ` prepareAuthMethodTypesRequiredCols = []string{ - "password_set", "type", - "method_types", - "idps_count", "force_mfa", "force_mfa_local_only", } @@ -356,9 +342,6 @@ func Test_UserAuthMethodPrepares(t *testing.T) { prepareAuthMethodTypesRequiredCols, [][]driver.Value{ { - true, - database.NumberArray[domain.UserAuthMethodType]{domain.UserAuthMethodTypePasswordless}, - 1, domain.UserTypeHuman, true, true, @@ -367,12 +350,7 @@ func Test_UserAuthMethodPrepares(t *testing.T) { ), }, object: &UserAuthMethodRequirements{ - UserType: domain.UserTypeHuman, - AuthMethods: []domain.UserAuthMethodType{ - domain.UserAuthMethodTypePasswordless, - domain.UserAuthMethodTypePassword, - domain.UserAuthMethodTypeIDP, - }, + UserType: domain.UserTypeHuman, ForceMFA: true, ForceMFALocalOnly: true, }, @@ -391,9 +369,6 @@ func Test_UserAuthMethodPrepares(t *testing.T) { prepareAuthMethodTypesRequiredCols, [][]driver.Value{ { - true, - database.NumberArray[domain.UserAuthMethodType]{domain.UserAuthMethodTypePasswordless, domain.UserAuthMethodTypeTOTP}, - 1, domain.UserTypeHuman, true, true, @@ -403,13 +378,7 @@ func Test_UserAuthMethodPrepares(t *testing.T) { }, object: &UserAuthMethodRequirements{ - UserType: domain.UserTypeHuman, - AuthMethods: []domain.UserAuthMethodType{ - domain.UserAuthMethodTypePasswordless, - domain.UserAuthMethodTypeTOTP, - domain.UserAuthMethodTypePassword, - domain.UserAuthMethodTypeIDP, - }, + UserType: domain.UserTypeHuman, ForceMFA: true, ForceMFALocalOnly: true, }, From 206d94718338f430b93324ef6105a73326fee0a2 Mon Sep 17 00:00:00 2001 From: Livio Spring Date: Wed, 12 Jun 2024 15:13:20 +0200 Subject: [PATCH 17/44] docs(api): add missing x-zitadel-orgid header to IdP request (#8113) # Which Problems Are Solved Some management requests did not state that the `x-zitadel-orgid` can / needs to be sent as part of the request. # How the Problems Are Solved Added it as paart of the swagger / openAPI documentation. # Additional Changes None. # Additional Context - noted by a customer --- proto/zitadel/management.proto | 232 +++++++++++++++++++++++++++++++++ 1 file changed, 232 insertions(+) diff --git a/proto/zitadel/management.proto b/proto/zitadel/management.proto index 560b37a09d..15fde6851b 100644 --- a/proto/zitadel/management.proto +++ b/proto/zitadel/management.proto @@ -6803,6 +6803,14 @@ service ManagementService { tags: "Identity Providers"; summary: "List Identity Providers"; description: ""; + parameters: { + headers: { + name: "x-zitadel-orgid"; + description: "The default is always the organization of the requesting user. If you like to get/set a result of another organization include the header. Make sure the user has permission to access the requested data."; + type: STRING, + required: false; + }; + }; }; } @@ -6820,6 +6828,14 @@ service ManagementService { tags: "Identity Providers"; summary: "Get Identity Provider By ID"; description: ""; + parameters: { + headers: { + name: "x-zitadel-orgid"; + description: "The default is always the organization of the requesting user. If you like to get/set a result of another organization include the header. Make sure the user has permission to access the requested data."; + type: STRING, + required: false; + }; + }; }; } @@ -6838,6 +6854,14 @@ service ManagementService { tags: "Identity Providers"; summary: "Add Generic OAuth Identity Provider"; description: ""; + parameters: { + headers: { + name: "x-zitadel-orgid"; + description: "The default is always the organization of the requesting user. If you like to get/set a result of another organization include the header. Make sure the user has permission to access the requested data."; + type: STRING, + required: false; + }; + }; }; } @@ -6856,6 +6880,14 @@ service ManagementService { tags: "Identity Providers"; summary: "Update Generic OAuth Identity Provider"; description: ""; + parameters: { + headers: { + name: "x-zitadel-orgid"; + description: "The default is always the organization of the requesting user. If you like to get/set a result of another organization include the header. Make sure the user has permission to access the requested data."; + type: STRING, + required: false; + }; + }; }; } @@ -6874,6 +6906,14 @@ service ManagementService { tags: "Identity Providers"; summary: "Add Generic OIDC Identity Provider"; description: ""; + parameters: { + headers: { + name: "x-zitadel-orgid"; + description: "The default is always the organization of the requesting user. If you like to get/set a result of another organization include the header. Make sure the user has permission to access the requested data."; + type: STRING, + required: false; + }; + }; }; } @@ -6892,6 +6932,14 @@ service ManagementService { tags: "Identity Providers"; summary: "Update Generic OIDC Identity Provider"; description: ""; + parameters: { + headers: { + name: "x-zitadel-orgid"; + description: "The default is always the organization of the requesting user. If you like to get/set a result of another organization include the header. Make sure the user has permission to access the requested data."; + type: STRING, + required: false; + }; + }; }; } @@ -6910,6 +6958,14 @@ service ManagementService { tags: "Identity Providers"; summary: "Migrate Generic OIDC Identity Provider"; description: ""; + parameters: { + headers: { + name: "x-zitadel-orgid"; + description: "The default is always the organization of the requesting user. If you like to get/set a result of another organization include the header. Make sure the user has permission to access the requested data."; + type: STRING, + required: false; + }; + }; }; } @@ -6928,6 +6984,14 @@ service ManagementService { tags: "Identity Providers"; summary: "Add JWT Identity Provider"; description: ""; + parameters: { + headers: { + name: "x-zitadel-orgid"; + description: "The default is always the organization of the requesting user. If you like to get/set a result of another organization include the header. Make sure the user has permission to access the requested data."; + type: STRING, + required: false; + }; + }; }; } @@ -6946,6 +7010,14 @@ service ManagementService { tags: "Identity Providers"; summary: "Update JWT Identity Provider"; description: ""; + parameters: { + headers: { + name: "x-zitadel-orgid"; + description: "The default is always the organization of the requesting user. If you like to get/set a result of another organization include the header. Make sure the user has permission to access the requested data."; + type: STRING, + required: false; + }; + }; }; } @@ -6964,6 +7036,14 @@ service ManagementService { tags: "Identity Providers"; summary: "Add Azure AD Identity Provider"; description: ""; + parameters: { + headers: { + name: "x-zitadel-orgid"; + description: "The default is always the organization of the requesting user. If you like to get/set a result of another organization include the header. Make sure the user has permission to access the requested data."; + type: STRING, + required: false; + }; + }; }; } @@ -6982,6 +7062,14 @@ service ManagementService { tags: "Identity Providers"; summary: "Update Azure AD Identity Provider"; description: ""; + parameters: { + headers: { + name: "x-zitadel-orgid"; + description: "The default is always the organization of the requesting user. If you like to get/set a result of another organization include the header. Make sure the user has permission to access the requested data."; + type: STRING, + required: false; + }; + }; }; } @@ -7000,6 +7088,14 @@ service ManagementService { tags: "Identity Providers"; summary: "Add GitHub Identity Provider"; description: ""; + parameters: { + headers: { + name: "x-zitadel-orgid"; + description: "The default is always the organization of the requesting user. If you like to get/set a result of another organization include the header. Make sure the user has permission to access the requested data."; + type: STRING, + required: false; + }; + }; }; } @@ -7018,6 +7114,14 @@ service ManagementService { tags: "Identity Providers"; summary: "Update GitHub Identity Provider"; description: ""; + parameters: { + headers: { + name: "x-zitadel-orgid"; + description: "The default is always the organization of the requesting user. If you like to get/set a result of another organization include the header. Make sure the user has permission to access the requested data."; + type: STRING, + required: false; + }; + }; }; } @@ -7036,6 +7140,14 @@ service ManagementService { tags: "Identity Providers"; summary: "Add GitHub Enterprise Identity Provider"; description: ""; + parameters: { + headers: { + name: "x-zitadel-orgid"; + description: "The default is always the organization of the requesting user. If you like to get/set a result of another organization include the header. Make sure the user has permission to access the requested data."; + type: STRING, + required: false; + }; + }; }; } @@ -7054,6 +7166,14 @@ service ManagementService { tags: "Identity Providers"; summary: "Update GitHub Enterprise Identity Provider"; description: ""; + parameters: { + headers: { + name: "x-zitadel-orgid"; + description: "The default is always the organization of the requesting user. If you like to get/set a result of another organization include the header. Make sure the user has permission to access the requested data."; + type: STRING, + required: false; + }; + }; }; } @@ -7072,6 +7192,14 @@ service ManagementService { tags: "Identity Providers"; summary: "Add GitLab Identity Provider"; description: ""; + parameters: { + headers: { + name: "x-zitadel-orgid"; + description: "The default is always the organization of the requesting user. If you like to get/set a result of another organization include the header. Make sure the user has permission to access the requested data."; + type: STRING, + required: false; + }; + }; }; } @@ -7090,6 +7218,14 @@ service ManagementService { tags: "Identity Providers"; summary: "Update GitLab Identity Provider"; description: ""; + parameters: { + headers: { + name: "x-zitadel-orgid"; + description: "The default is always the organization of the requesting user. If you like to get/set a result of another organization include the header. Make sure the user has permission to access the requested data."; + type: STRING, + required: false; + }; + }; }; } @@ -7108,6 +7244,14 @@ service ManagementService { tags: "Identity Providers"; summary: "Add GitLab Selfhosted Identity Provider"; description: ""; + parameters: { + headers: { + name: "x-zitadel-orgid"; + description: "The default is always the organization of the requesting user. If you like to get/set a result of another organization include the header. Make sure the user has permission to access the requested data."; + type: STRING, + required: false; + }; + }; }; } @@ -7126,6 +7270,14 @@ service ManagementService { tags: "Identity Providers"; summary: "Update GitLab Selfhosted Identity Provider"; description: ""; + parameters: { + headers: { + name: "x-zitadel-orgid"; + description: "The default is always the organization of the requesting user. If you like to get/set a result of another organization include the header. Make sure the user has permission to access the requested data."; + type: STRING, + required: false; + }; + }; }; } @@ -7144,6 +7296,14 @@ service ManagementService { tags: "Identity Providers"; summary: "Add Google Identity Provider"; description: ""; + parameters: { + headers: { + name: "x-zitadel-orgid"; + description: "The default is always the organization of the requesting user. If you like to get/set a result of another organization include the header. Make sure the user has permission to access the requested data."; + type: STRING, + required: false; + }; + }; }; } @@ -7162,6 +7322,14 @@ service ManagementService { tags: "Identity Providers"; summary: "Update Google Identity Provider"; description: ""; + parameters: { + headers: { + name: "x-zitadel-orgid"; + description: "The default is always the organization of the requesting user. If you like to get/set a result of another organization include the header. Make sure the user has permission to access the requested data."; + type: STRING, + required: false; + }; + }; }; } @@ -7180,6 +7348,14 @@ service ManagementService { tags: "Identity Providers"; summary: "Add LDAP Identity Provider"; description: ""; + parameters: { + headers: { + name: "x-zitadel-orgid"; + description: "The default is always the organization of the requesting user. If you like to get/set a result of another organization include the header. Make sure the user has permission to access the requested data."; + type: STRING, + required: false; + }; + }; }; } @@ -7198,6 +7374,14 @@ service ManagementService { tags: "Identity Providers"; summary: "Update LDAP Identity Provider"; description: ""; + parameters: { + headers: { + name: "x-zitadel-orgid"; + description: "The default is always the organization of the requesting user. If you like to get/set a result of another organization include the header. Make sure the user has permission to access the requested data."; + type: STRING, + required: false; + }; + }; }; } @@ -7216,6 +7400,14 @@ service ManagementService { tags: "Identity Providers"; summary: "Add Apple Identity Provider"; description: ""; + parameters: { + headers: { + name: "x-zitadel-orgid"; + description: "The default is always the organization of the requesting user. If you like to get/set a result of another organization include the header. Make sure the user has permission to access the requested data."; + type: STRING, + required: false; + }; + }; }; } @@ -7234,6 +7426,14 @@ service ManagementService { tags: "Identity Providers"; summary: "Update Apple Identity Provider"; description: ""; + parameters: { + headers: { + name: "x-zitadel-orgid"; + description: "The default is always the organization of the requesting user. If you like to get/set a result of another organization include the header. Make sure the user has permission to access the requested data."; + type: STRING, + required: false; + }; + }; }; } @@ -7252,6 +7452,14 @@ service ManagementService { tags: "Identity Providers"; summary: "Add SAML Identity Provider"; description: ""; + parameters: { + headers: { + name: "x-zitadel-orgid"; + description: "The default is always the organization of the requesting user. If you like to get/set a result of another organization include the header. Make sure the user has permission to access the requested data."; + type: STRING, + required: false; + }; + }; }; } @@ -7270,6 +7478,14 @@ service ManagementService { tags: "Identity Providers"; summary: "Update SAML Identity Provider"; description: ""; + parameters: { + headers: { + name: "x-zitadel-orgid"; + description: "The default is always the organization of the requesting user. If you like to get/set a result of another organization include the header. Make sure the user has permission to access the requested data."; + type: STRING, + required: false; + }; + }; }; } @@ -7288,6 +7504,14 @@ service ManagementService { tags: "Identity Providers"; summary: "Regenerate SAML Identity Provider Certificate"; description: ""; + parameters: { + headers: { + name: "x-zitadel-orgid"; + description: "The default is always the organization of the requesting user. If you like to get/set a result of another organization include the header. Make sure the user has permission to access the requested data."; + type: STRING, + required: false; + }; + }; }; } @@ -7306,6 +7530,14 @@ service ManagementService { tags: "Identity Providers"; summary: "Delete Identity Provider"; description: ""; + parameters: { + headers: { + name: "x-zitadel-orgid"; + description: "The default is always the organization of the requesting user. If you like to get/set a result of another organization include the header. Make sure the user has permission to access the requested data."; + type: STRING, + required: false; + }; + }; }; } From 1374f17c8de7403c13ee998b8b2c421cf79b2bd2 Mon Sep 17 00:00:00 2001 From: Yxnt Date: Thu, 13 Jun 2024 15:05:59 +0800 Subject: [PATCH 18/44] fix(login): ldap login page js file not found (#8101) # Which Problems Are Solved * fix ldap login page js file not found ![image](https://github.com/zitadel/zitadel/assets/10323352/47640ae9-3aa2-4a62-aa95-e23750cb8eb7) Signed-off-by: Yxnt Co-authored-by: Livio Spring --- internal/api/ui/login/static/templates/ldap_login.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/internal/api/ui/login/static/templates/ldap_login.html b/internal/api/ui/login/static/templates/ldap_login.html index 850bf27e57..1f91f14051 100644 --- a/internal/api/ui/login/static/templates/ldap_login.html +++ b/internal/api/ui/login/static/templates/ldap_login.html @@ -34,7 +34,7 @@ - - + + {{template "main-bottom" .}} \ No newline at end of file From c9e352033e6e6560846e036df82116bb94fe9994 Mon Sep 17 00:00:00 2001 From: Florian Forster Date: Thu, 13 Jun 2024 10:07:39 +0200 Subject: [PATCH 19/44] chore(docs): use gh action to build docs (#8097) # Which Problems Are Solved This allows us to build multiple docs in parallel and only runs when docs/proto are changed. # Additional Changes - [ ] Change "required" in GitHub from Vercel to the docs flow --------- Co-authored-by: Livio Spring --- .github/workflows/docsusaurus.yml | 88 +++++++++++++++++++++++++++++++ .gitignore | 3 +- docs/.gitignore | 1 + docs/Dockerfile | 13 ----- docs/babel.config.js | 2 +- docs/nginx.conf | 56 -------------------- docs/vercel.json | 3 ++ docs/yarn.lock | 16 ++++-- 8 files changed, 107 insertions(+), 75 deletions(-) create mode 100644 .github/workflows/docsusaurus.yml delete mode 100644 docs/Dockerfile delete mode 100644 docs/nginx.conf diff --git a/.github/workflows/docsusaurus.yml b/.github/workflows/docsusaurus.yml new file mode 100644 index 0000000000..66ec3b1e4e --- /dev/null +++ b/.github/workflows/docsusaurus.yml @@ -0,0 +1,88 @@ +name: Docs +env: + VERCEL_ORG_ID: ${{ secrets.VERCEL_ORG_ID }} + VERCEL_PROJECT_ID: ${{ secrets.VERCEL_PROJECT_ID }} +on: + pull_request: + push: + branches: + - main +jobs: + Deploy: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: dorny/paths-filter@v3 + id: filter + with: + filters: | + src: + - 'docs/**' + - 'proto/**' + - '.github/workflows/docsusaurus.yml' + - uses: actions/setup-node@v4 + with: + node-version: 20 + cache: 'yarn' + cache-dependency-path: docs/yarn.lock + - name: Install Vercel CLI + run: yarn global add vercel + - name: Install Dependencies + if: steps.filter.outputs.src == 'true' + run: yarn install --frozen-lockfile + working-directory: ./docs + - uses: actions/cache@v4 + if: steps.filter.outputs.src == 'true' + with: + path: | + ${{ github.workspace }}/docs/.docusaurus + ${{ github.workspace }}/docs/node_modules/.cache + key: | + ${{ runner.os }}-docusaurus-${{ hashFiles('**/package-lock.json', '**/npm-shrinkwrap.json', '**/yarn.lock', '**/pnpm-lock.yaml') }}-${{ hashFiles('**.[jt]s', '**.[jt]sx') }} + restore-keys: | + ${{ runner.os }}-docusaurus-${{ hashFiles('**/package-lock.json', '**/npm-shrinkwrap.json', '**/yarn.lock', '**/pnpm-lock.yaml') }} + ${{ runner.os }}-docusaurus-${{ hashFiles('docs/yarn.lock') }} + - name: Prepare Preview Environment + if: ${{ github.ref != 'refs/heads/main' && steps.filter.outputs.src == 'true' }} + run: vercel pull --yes --environment=preview --token=${{ secrets.VERCEL_TOKEN }} + - name: Perpare Production Environment + if: ${{ github.ref == 'refs/heads/main' && steps.filter.outputs.src == 'true' }} + run: vercel pull --yes --environment=production --token=${{ secrets.VERCEL_TOKEN }} + - name: Build Project Artifacts + env: + NODE_OPTIONS: "--max_old_space_size=8192" + if: steps.filter.outputs.src == 'true' + run: vercel build --token=${{ secrets.VERCEL_TOKEN }} + - name: Deploy Preview + if: ${{ github.ref != 'refs/heads/main' && steps.filter.outputs.src == 'true' }} + run: | + vercel deploy --prebuilt --archive=tgz --token=${{ secrets.VERCEL_TOKEN }} + echo "deploymentUrl=$(cat deployment-url.txt)" >> $GITHUB_OUTPUT + - name: Deploy Production + if: ${{ github.ref == 'refs/heads/main' && steps.filter.outputs.src == 'true'}} + run: | + vercel deploy --prebuilt --archive=tgz --prod --token=${{ secrets.VERCEL_TOKEN }} + - name: Get Preview URL + if: ${{ github.ref != 'refs/heads/main' && steps.filter.outputs.src == 'true' }} + id: myRequest + uses: fjogeleit/http-request-action@v1 + with: + url: 'https://api.vercel.com/v6/deployments?teamId=${{ secrets.VERCEL_ORG_ID }}&app=docs' + method: 'GET' + customHeaders: '{"Authorization": "Bearer ${{ secrets.VERCEL_TOKEN }}"}' + - uses: cloudposse/github-action-jq@main + if: ${{ github.ref != 'refs/heads/main' && steps.filter.outputs.src == 'true' }} + id: current + with: + compact: true + raw-output: true + input: ${{ steps.myRequest.outputs.response }} + script: |- + .deployments[] | select(.meta.githubCommitSha == "${{ github.sha }}") | .url + - uses: mshick/add-pr-comment@v2 + if: ${{ github.ref != 'refs/heads/main' && steps.filter.outputs.src == 'true' }} + with: + message: | + Your build has completed! + + [Preview deployment](https://${{ steps.current.outputs.output }}) diff --git a/.gitignore b/.gitignore index 9ccc455b50..4a8a762ef0 100644 --- a/.gitignore +++ b/.gitignore @@ -85,4 +85,5 @@ go.work.sum load-test/node_modules load-test/yarn-error.log -load-test/dist \ No newline at end of file +load-test/dist +.vercel diff --git a/docs/.gitignore b/docs/.gitignore index dd1b12666a..bd99d98c6f 100644 --- a/docs/.gitignore +++ b/docs/.gitignore @@ -26,3 +26,4 @@ package-lock.json npm-debug.log* yarn-debug.log* yarn-error.log* +.vercel diff --git a/docs/Dockerfile b/docs/Dockerfile deleted file mode 100644 index c7d70a964f..0000000000 --- a/docs/Dockerfile +++ /dev/null @@ -1,13 +0,0 @@ -## Angular lint workspace and production build -FROM node:18 as builder -WORKDIR /docs -COPY docs/package.json docs/yarn.lock ./ -RUN yarn install --frozen-lockfile -COPY docs . -COPY proto /proto -RUN yarn build - -## Final image for serving -FROM nginx as final -COPY docs/nginx.conf /etc/nginx/nginx.conf -COPY --from=builder /docs/build /usr/share/nginx/html diff --git a/docs/babel.config.js b/docs/babel.config.js index 3e44aa2aec..279a0ff91c 100644 --- a/docs/babel.config.js +++ b/docs/babel.config.js @@ -1,4 +1,4 @@ module.exports = { presets: [require.resolve("@docusaurus/core/lib/babel/preset")], - compact: true + compact: auto }; diff --git a/docs/nginx.conf b/docs/nginx.conf deleted file mode 100644 index 7b64550084..0000000000 --- a/docs/nginx.conf +++ /dev/null @@ -1,56 +0,0 @@ -events { - worker_connections 1024; ## Default: 1024 -} - -http { - - include /etc/nginx/mime.types; - - server { - - listen 8080; - - location / { - return 301 /docs; - } - - location /docs { - alias /usr/share/nginx/html; - index /docs/index.html; - try_files $uri $uri/ /docs/index.html?q=$query_string; - } - - location = /docs/proxy/js/script.js { - proxy_pass https://plausible.io/js/script.js; - proxy_set_header Host plausible.io; - } - - location = /docs/proxy/api/event { - proxy_pass https://plausible.io/api/event; - proxy_set_header Host plausible.io; - proxy_buffering on; - proxy_http_version 1.1; - - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; - proxy_set_header X-Forwarded-Host $host; - } - } - - ## enable gzip compression - gzip on; - gzip_vary on; - gzip_min_length 256; - gzip_proxied any; - - gzip_types - ## text/html is always compressed : https://nginx.org/en/docs/http/ngx_http_gzip_module.html - text/plain - text/css - text/javascript - application/javascript - application/x-javascript - application/xml - application/json - application/ld+json; -} diff --git a/docs/vercel.json b/docs/vercel.json index a36082eceb..d28b5d23ff 100644 --- a/docs/vercel.json +++ b/docs/vercel.json @@ -1,4 +1,7 @@ { + "github": { + "enabled": false + }, "cleanUrls": true, "rewrites": [ { diff --git a/docs/yarn.lock b/docs/yarn.lock index a42d5b908f..106b1b1132 100644 --- a/docs/yarn.lock +++ b/docs/yarn.lock @@ -2145,7 +2145,7 @@ "@docusaurus/theme-search-algolia" "2.2.0" "@docusaurus/types" "2.2.0" -"@docusaurus/react-loadable@5.5.2", "react-loadable@npm:@docusaurus/react-loadable@5.5.2": +"@docusaurus/react-loadable@5.5.2": version "5.5.2" resolved "https://registry.npmjs.org/@docusaurus/react-loadable/-/react-loadable-5.5.2.tgz" integrity sha512-A3dYjdBGuy0IGT+wyLIGIKLRE+sAk1iNk0f1HjNDysO7u8lhL4N3VEm+FAubmJbAztn94F7MxBTPmnixbiyFdQ== @@ -3894,9 +3894,9 @@ caniuse-api@^3.0.0: lodash.uniq "^4.5.0" caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001464, caniuse-lite@^1.0.30001517: - version "1.0.30001538" - resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001538.tgz" - integrity sha512-HWJnhnID+0YMtGlzcp3T9drmBJUVDchPJ08tpUGFLs9CYlwWPH2uLgpHn8fND5pCgXVtnGS3H4QR9XLMHVNkHw== + version "1.0.30001632" + resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001632.tgz" + integrity sha512-udx3o7yHJfUxMLkGohMlVHCvFvWmirKh9JAH/d7WOLPetlH+LTL5cocMZ0t7oZx/mdlOWXti97xLZWc8uURRHg== ccount@^1.0.0: version "1.1.0" @@ -8546,6 +8546,14 @@ react-loadable-ssr-addon-v5-slorber@^1.0.1: dependencies: "@babel/runtime" "^7.10.3" +"react-loadable@npm:@docusaurus/react-loadable@5.5.2": + version "5.5.2" + resolved "https://registry.npmjs.org/@docusaurus/react-loadable/-/react-loadable-5.5.2.tgz" + integrity sha512-A3dYjdBGuy0IGT+wyLIGIKLRE+sAk1iNk0f1HjNDysO7u8lhL4N3VEm+FAubmJbAztn94F7MxBTPmnixbiyFdQ== + dependencies: + "@types/react" "*" + prop-types "^15.6.2" + react-magic-dropzone@^1.0.1: version "1.0.1" resolved "https://registry.npmjs.org/react-magic-dropzone/-/react-magic-dropzone-1.0.1.tgz" From f6a50db96c381b765ebf2ed83165ed3959945102 Mon Sep 17 00:00:00 2001 From: Florian Forster Date: Thu, 13 Jun 2024 10:47:10 +0200 Subject: [PATCH 20/44] chore(docs): fix prod build for vercel (#8121) # Fix Fixes a problem on main --- .github/workflows/docsusaurus.yml | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/.github/workflows/docsusaurus.yml b/.github/workflows/docsusaurus.yml index 66ec3b1e4e..ec20843e07 100644 --- a/.github/workflows/docsusaurus.yml +++ b/.github/workflows/docsusaurus.yml @@ -48,11 +48,16 @@ jobs: - name: Perpare Production Environment if: ${{ github.ref == 'refs/heads/main' && steps.filter.outputs.src == 'true' }} run: vercel pull --yes --environment=production --token=${{ secrets.VERCEL_TOKEN }} - - name: Build Project Artifacts + - name: Build Preview + if: ${{ github.ref != 'refs/heads/main' && steps.filter.outputs.src == 'true' }} env: NODE_OPTIONS: "--max_old_space_size=8192" - if: steps.filter.outputs.src == 'true' run: vercel build --token=${{ secrets.VERCEL_TOKEN }} + - name: Build Production + if: ${{ github.ref == 'refs/heads/main' && steps.filter.outputs.src == 'true' }} + env: + NODE_OPTIONS: "--max_old_space_size=8192" + run: vercel build --prod --token=${{ secrets.VERCEL_TOKEN }} - name: Deploy Preview if: ${{ github.ref != 'refs/heads/main' && steps.filter.outputs.src == 'true' }} run: | From 81cc7c62cbe0c256261de2d2576410e2c3a2c3be Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim=20M=C3=B6hlmann?= Date: Thu, 13 Jun 2024 11:32:27 +0200 Subject: [PATCH 21/44] fix(oidc): upgrade zitadel/oidc to allow scope without openid (#8109) # Which Problems Are Solved Drop the requirement of the `openid` scope in all auth and token request types. # How the Problems Are Solved This change upgrades the oidc package to include https://github.com/zitadel/oidc/pull/613. # Additional Changes - Fix a typo in a go doc string - upgrade otel modules to match the version from oidc. # Additional Context - https://github.com/zitadel/zitadel/pull/7822 started doing scope validation for machine user authentication on the token endpoint. - https://github.com/zitadel/zitadel/discussions/8068 reports breakage of machine authentication without `openid` scope. - Merge after https://github.com/zitadel/oidc/pull/613 is released. --- go.mod | 59 +++++++------- go.sum | 121 ++++++++++++++-------------- internal/api/oidc/token_exchange.go | 2 +- 3 files changed, 90 insertions(+), 92 deletions(-) diff --git a/go.mod b/go.mod index 9d0da91cba..1f5bcc264e 100644 --- a/go.mod +++ b/go.mod @@ -22,7 +22,7 @@ require ( github.com/envoyproxy/protoc-gen-validate v1.0.4 github.com/fatih/color v1.16.0 github.com/gabriel-vasile/mimetype v1.4.3 - github.com/go-jose/go-jose/v4 v4.0.1 + github.com/go-jose/go-jose/v4 v4.0.2 github.com/go-ldap/ldap/v3 v3.4.7 github.com/go-webauthn/webauthn v0.10.2 github.com/gorilla/csrf v1.7.2 @@ -31,7 +31,7 @@ require ( github.com/gorilla/securecookie v1.1.2 github.com/grpc-ecosystem/go-grpc-middleware v1.4.0 github.com/grpc-ecosystem/grpc-gateway v1.16.0 - github.com/grpc-ecosystem/grpc-gateway/v2 v2.19.1 + github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0 github.com/h2non/gock v1.2.0 github.com/hashicorp/golang-lru/v2 v2.0.7 github.com/improbable-eng/grpc-web v0.15.0 @@ -58,31 +58,31 @@ require ( github.com/superseriousbusiness/exifremove v0.0.0-20210330092427-6acd27eac203 github.com/ttacon/libphonenumber v1.2.1 github.com/zitadel/logging v0.6.0 - github.com/zitadel/oidc/v3 v3.23.2 + github.com/zitadel/oidc/v3 v3.25.0 github.com/zitadel/passwap v0.5.0 github.com/zitadel/saml v0.1.3 github.com/zitadel/schema v1.3.0 - go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.51.0 - go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.51.0 - go.opentelemetry.io/otel v1.26.0 - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.26.0 - go.opentelemetry.io/otel/exporters/prometheus v0.48.0 - go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.26.0 - go.opentelemetry.io/otel/metric v1.26.0 - go.opentelemetry.io/otel/sdk v1.26.0 - go.opentelemetry.io/otel/sdk/metric v1.26.0 - go.opentelemetry.io/otel/trace v1.26.0 + go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.52.0 + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.52.0 + go.opentelemetry.io/otel v1.27.0 + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.27.0 + go.opentelemetry.io/otel/exporters/prometheus v0.49.0 + go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.27.0 + go.opentelemetry.io/otel/metric v1.27.0 + go.opentelemetry.io/otel/sdk v1.27.0 + go.opentelemetry.io/otel/sdk/metric v1.27.0 + go.opentelemetry.io/otel/trace v1.27.0 go.uber.org/mock v0.4.0 - golang.org/x/crypto v0.22.0 + golang.org/x/crypto v0.24.0 golang.org/x/exp v0.0.0-20240409090435-93d18d7e34b8 - golang.org/x/net v0.24.0 - golang.org/x/oauth2 v0.19.0 + golang.org/x/net v0.26.0 + golang.org/x/oauth2 v0.21.0 golang.org/x/sync v0.7.0 - golang.org/x/text v0.14.0 + golang.org/x/text v0.16.0 google.golang.org/api v0.172.0 - google.golang.org/genproto/googleapis/api v0.0.0-20240429193739-8cf5692501f6 - google.golang.org/grpc v1.63.2 - google.golang.org/protobuf v1.34.0 + google.golang.org/genproto/googleapis/api v0.0.0-20240610135401-a8a62080eff3 + google.golang.org/grpc v1.64.0 + google.golang.org/protobuf v1.34.2 sigs.k8s.io/yaml v1.4.0 ) @@ -91,7 +91,7 @@ require ( github.com/bmatcuk/doublestar/v4 v4.6.1 // indirect github.com/crewjam/httperr v0.2.0 // indirect github.com/go-chi/chi/v5 v5.0.12 // indirect - github.com/go-logr/logr v1.4.1 // indirect + github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/go-sql-driver/mysql v1.7.1 // indirect github.com/go-webauthn/x v0.1.9 // indirect @@ -116,13 +116,12 @@ require ( go.uber.org/multierr v1.11.0 // indirect golang.org/x/time v0.5.0 // indirect google.golang.org/genproto v0.0.0-20240412170617-26222e5d3d56 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240429193739-8cf5692501f6 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240610135401-a8a62080eff3 // indirect ) require ( cloud.google.com/go v0.112.2 // indirect - cloud.google.com/go/compute v1.25.1 // indirect - cloud.google.com/go/compute/metadata v0.2.3 // indirect + cloud.google.com/go/compute/metadata v0.3.0 // indirect cloud.google.com/go/iam v1.1.7 // indirect cloud.google.com/go/trace v1.10.6 // indirect github.com/Azure/go-ntlmssp v0.0.0-20221128193559-754e69321358 // indirect @@ -181,10 +180,10 @@ require ( github.com/muesli/clusters v0.0.0-20200529215643-2700303c1762 // indirect github.com/muesli/kmeans v0.3.1 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect - github.com/prometheus/client_golang v1.19.0 + github.com/prometheus/client_golang v1.19.1 github.com/prometheus/client_model v0.6.1 // indirect - github.com/prometheus/common v0.53.0 // indirect - github.com/prometheus/procfs v0.14.0 // indirect + github.com/prometheus/common v0.54.0 // indirect + github.com/prometheus/procfs v0.15.1 // indirect github.com/rs/xid v1.5.0 // indirect github.com/russellhaering/goxmldsig v1.4.0 // indirect github.com/sirupsen/logrus v1.9.3 @@ -196,9 +195,9 @@ require ( github.com/x448/float16 v0.8.4 // indirect github.com/xrash/smetrics v0.0.0-20240312152122-5f08fbb34913 // indirect go.opencensus.io v0.24.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.26.0 // indirect - go.opentelemetry.io/proto/otlp v1.2.0 // indirect - golang.org/x/sys v0.19.0 + go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.27.0 // indirect + go.opentelemetry.io/proto/otlp v1.3.1 // indirect + golang.org/x/sys v0.21.0 gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect diff --git a/go.sum b/go.sum index dd1521bb3f..1ec896708a 100644 --- a/go.sum +++ b/go.sum @@ -2,10 +2,8 @@ cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMT cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.112.2 h1:ZaGT6LiG7dBzi6zNOvVZwacaXlmf3lRqnC4DQzqyRQw= cloud.google.com/go v0.112.2/go.mod h1:iEqjp//KquGIJV/m+Pk3xecgKNhV+ry+vVTsy4TbDms= -cloud.google.com/go/compute v1.25.1 h1:ZRpHJedLtTpKgr3RV1Fx23NuaAEN1Zfx9hw1u4aJdjU= -cloud.google.com/go/compute v1.25.1/go.mod h1:oopOIR53ly6viBYxaDhBfJwzUAxf1zE//uf3IB011ls= -cloud.google.com/go/compute/metadata v0.2.3 h1:mg4jlk7mCAj6xXp9UJ4fjI9VUI5rubuGBW5aJ7UnBMY= -cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= +cloud.google.com/go/compute/metadata v0.3.0 h1:Tz+eQXMEqDIKRsmY3cHTL6FVaynIjX2QxYC4trgAKZc= +cloud.google.com/go/compute/metadata v0.3.0/go.mod h1:zFmK7XCadkQkj6TtorcaGlCW1hT1fIilQDwofLpJ20k= cloud.google.com/go/iam v1.1.7 h1:z4VHOhwKLF/+UYXAJDFwGtNF0b6gjsW1Pk9Ml0U/IoM= cloud.google.com/go/iam v1.1.7/go.mod h1:J4PMPg8TtyurAUvSmPj8FF3EDgY1SPRZxcUGrn7WXGA= cloud.google.com/go/logging v1.9.0 h1:iEIOXFO9EmSiTjDmfpbRjOxECO7R8C7b8IXUGOj7xZw= @@ -214,8 +212,8 @@ github.com/go-errors/errors v1.1.1/go.mod h1:psDX2osz5VnTOnFWbDeWwS7yejl+uV3FEWE github.com/go-errors/errors v1.5.1 h1:ZwEMSLRCapFLflTpT7NKaAc7ukJ8ZPEjzlxt8rPN8bk= github.com/go-errors/errors v1.5.1/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-jose/go-jose/v4 v4.0.1 h1:QVEPDE3OluqXBQZDcnNvQrInro2h0e4eqNbnZSWqS6U= -github.com/go-jose/go-jose/v4 v4.0.1/go.mod h1:WVf9LFMHh/QVrmqrOfqun0C45tMe3RoiKJMPvgWwLfY= +github.com/go-jose/go-jose/v4 v4.0.2 h1:R3l3kkBds16bO7ZFAEEcofK0MkrAJt3jlJznWZG0nvk= +github.com/go-jose/go-jose/v4 v4.0.2/go.mod h1:WVf9LFMHh/QVrmqrOfqun0C45tMe3RoiKJMPvgWwLfY= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.10.0/go.mod h1:xUsJbQ/Fp4kEt7AFgCuvyX4a71u8h9jB8tj/ORgOZ7o= @@ -226,8 +224,8 @@ github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9 github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= -github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= @@ -357,8 +355,8 @@ github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgf github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo= github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.19.1 h1:/c3QmbOGMGTOumP2iT/rCwB7b0QDGLKzqOmktBjT+Is= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.19.1/go.mod h1:5SN9VR2LTsRFsrEC6FHgRbTWrTHu6tqPeKxEQv15giM= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0 h1:bkypFPDjIYGfCYD5mRBvpqxfYX1YCS1PXdKYWi8FsN0= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0/go.mod h1:P+Lt/0by1T8bfcF3z737NnSbmxQAppXMRziHUxPOC8k= github.com/h2non/filetype v1.1.1/go.mod h1:319b3zT68BvV+WRj7cwy856M2ehB3HqNOt6sy1HndBY= github.com/h2non/filetype v1.1.3 h1:FKkx9QbD7HR/zjK1Ia5XiBsq9zdLi5Kf3zGyFTAFkGg= github.com/h2non/filetype v1.1.3/go.mod h1:319b3zT68BvV+WRj7cwy856M2ehB3HqNOt6sy1HndBY= @@ -603,8 +601,8 @@ github.com/prometheus/client_golang v0.9.3-0.20190127221311-3c4408c8b829/go.mod github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= github.com/prometheus/client_golang v1.3.0/go.mod h1:hJaj2vgQTGQmVCsAACORcieXFeDPbaTKGT+JTgUa3og= github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= -github.com/prometheus/client_golang v1.19.0 h1:ygXvpU1AoN1MhdzckN+PyD9QJOSD4x7kmXYlnfbA6JU= -github.com/prometheus/client_golang v1.19.0/go.mod h1:ZRM9uEAypZakd+q/x7+gmsvXdURP+DABIEIjnmDdp+k= +github.com/prometheus/client_golang v1.19.1 h1:wZWJDwK+NameRJuPGDhlnFgx8e8HN3XHQeLaYJFJBOE= +github.com/prometheus/client_golang v1.19.1/go.mod h1:mP78NwGzrVks5S2H6ab8+ZZGJLZUq1hoULYBAYBw1Ho= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= @@ -618,16 +616,16 @@ github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y8 github.com/prometheus/common v0.7.0/go.mod h1:DjGbpBbp5NYNiECxcL/VnbXCCaQpKd3tt26CguLLsqA= github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= github.com/prometheus/common v0.15.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16Clt/msog/s= -github.com/prometheus/common v0.53.0 h1:U2pL9w9nmJwJDa4qqLQ3ZaePJ6ZTwt7cMD3AG3+aLCE= -github.com/prometheus/common v0.53.0/go.mod h1:BrxBKv3FWBIGXw89Mg1AeBq7FSyRzXWI3l3e7W3RN5U= +github.com/prometheus/common v0.54.0 h1:ZlZy0BgJhTwVZUn7dLOkwCZHUkrAqd3WYtcFCWnM1D8= +github.com/prometheus/common v0.54.0/go.mod h1:/TQgMJP5CuVYveyT7n/0Ix8yLNNXy9yRSkhnLTHPDIQ= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/procfs v0.3.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= -github.com/prometheus/procfs v0.14.0 h1:Lw4VdGGoKEZilJsayHf0B+9YgLGREba2C6xr+Fdfq6s= -github.com/prometheus/procfs v0.14.0/go.mod h1:XL+Iwz8k8ZabyZfMFHPiilCniixqQarAy5Mu67pHlNQ= +github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc= +github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk= github.com/rakyll/statik v0.1.7 h1:OF3QCZUuyPxuGEP7B4ypUa7sB/iHtqOTDYZXGM8KOdQ= github.com/rakyll/statik v0.1.7/go.mod h1:AlZONWzMtEnMs7W4e/1LURLiI49pIMmp6V9Unghqrcc= github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= @@ -636,8 +634,8 @@ github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6L github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6poM+XZ2dLUbcbE= -github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= -github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= +github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= +github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= github.com/rs/cors v1.11.0 h1:0B9GE/r9Bc2UxRMMtymBkHTenPkHDv0CW4Y98GBY+po= github.com/rs/cors v1.11.0/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= @@ -731,8 +729,8 @@ github.com/zenazn/goji v1.0.1 h1:4lbD8Mx2h7IvloP7r2C0D6ltZP6Ufip8Hn0wmSK5LR8= github.com/zenazn/goji v1.0.1/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q= github.com/zitadel/logging v0.6.0 h1:t5Nnt//r+m2ZhhoTmoPX+c96pbMarqJvW1Vq6xFTank= github.com/zitadel/logging v0.6.0/go.mod h1:Y4CyAXHpl3Mig6JOszcV5Rqqsojj+3n7y2F591Mp/ow= -github.com/zitadel/oidc/v3 v3.23.2 h1:vRUM6SKudr6WR/lqxue4cvCbgR+IdEJGVBklucKKXgk= -github.com/zitadel/oidc/v3 v3.23.2/go.mod h1:9snlhm3W/GNURqxtchjL1AAuClWRZ2NTkn9sLs1WYfM= +github.com/zitadel/oidc/v3 v3.25.0 h1:DosOUc31IPM9ZtKaT58+0iNicwDFTFk5Ctt7mgYtsA8= +github.com/zitadel/oidc/v3 v3.25.0/go.mod h1:UDwD+PRFbUBzabyPd9JORrakty3/wec7VpKZYi9Ahh0= github.com/zitadel/passwap v0.5.0 h1:kFMoRyo0GnxtOz7j9+r/CsRwSCjHGRaAKoUe69NwPvs= github.com/zitadel/passwap v0.5.0/go.mod h1:uqY7D3jqdTFcKsW0Q3Pcv5qDMmSHpVTzUZewUKC1KZA= github.com/zitadel/saml v0.1.3 h1:LI4DOCVyyU1qKPkzs3vrGcA5J3H4pH3+CL9zr9ShkpM= @@ -746,30 +744,30 @@ go.opencensus.io v0.20.2/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.51.0 h1:A3SayB3rNyt+1S6qpI9mHPkeHTZbD7XILEqWnYZb2l0= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.51.0/go.mod h1:27iA5uvhuRNmalO+iEUdVn5ZMj2qy10Mm+XRIpRmyuU= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.51.0 h1:Xs2Ncz0gNihqu9iosIZ5SkBbWo5T8JhhLJFMQL1qmLI= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.51.0/go.mod h1:vy+2G/6NvVMpwGX/NyLqcC41fxepnuKHk16E6IZUcJc= -go.opentelemetry.io/otel v1.26.0 h1:LQwgL5s/1W7YiiRwxf03QGnWLb2HW4pLiAhaA5cZXBs= -go.opentelemetry.io/otel v1.26.0/go.mod h1:UmLkJHUAidDval2EICqBMbnAd0/m2vmpf/dAM+fvFs4= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.26.0 h1:1u/AyyOqAWzy+SkPxDpahCNZParHV8Vid1RnI2clyDE= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.26.0/go.mod h1:z46paqbJ9l7c9fIPCXTqTGwhQZ5XoTIsfeFYWboizjs= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.26.0 h1:Waw9Wfpo/IXzOI8bCB7DIk+0JZcqqsyn1JFnAc+iam8= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.26.0/go.mod h1:wnJIG4fOqyynOnnQF/eQb4/16VlX2EJAHhHgqIqWfAo= -go.opentelemetry.io/otel/exporters/prometheus v0.48.0 h1:sBQe3VNGUjY9IKWQC6z2lNqa5iGbDSxhs60ABwK4y0s= -go.opentelemetry.io/otel/exporters/prometheus v0.48.0/go.mod h1:DtrbMzoZWwQHyrQmCfLam5DZbnmorsGbOtTbYHycU5o= -go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.26.0 h1:0W5o9SzoR15ocYHEQfvfipzcNog1lBxOLfnex91Hk6s= -go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.26.0/go.mod h1:zVZ8nz+VSggWmnh6tTsJqXQ7rU4xLwRtna1M4x5jq58= -go.opentelemetry.io/otel/metric v1.26.0 h1:7S39CLuY5Jgg9CrnA9HHiEjGMF/X2VHvoXGgSllRz30= -go.opentelemetry.io/otel/metric v1.26.0/go.mod h1:SY+rHOI4cEawI9a7N1A4nIg/nTQXe1ccCNWYOJUrpX4= -go.opentelemetry.io/otel/sdk v1.26.0 h1:Y7bumHf5tAiDlRYFmGqetNcLaVUZmh4iYfmGxtmz7F8= -go.opentelemetry.io/otel/sdk v1.26.0/go.mod h1:0p8MXpqLeJ0pzcszQQN4F0S5FVjBLgypeGSngLsmirs= -go.opentelemetry.io/otel/sdk/metric v1.26.0 h1:cWSks5tfriHPdWFnl+qpX3P681aAYqlZHcAyHw5aU9Y= -go.opentelemetry.io/otel/sdk/metric v1.26.0/go.mod h1:ClMFFknnThJCksebJwz7KIyEDHO+nTB6gK8obLy8RyE= -go.opentelemetry.io/otel/trace v1.26.0 h1:1ieeAUb4y0TE26jUFrCIXKpTuVK7uJGN9/Z/2LP5sQA= -go.opentelemetry.io/otel/trace v1.26.0/go.mod h1:4iDxvGDQuUkHve82hJJ8UqrwswHYsZuWCBllGV2U2y0= -go.opentelemetry.io/proto/otlp v1.2.0 h1:pVeZGk7nXDC9O2hncA6nHldxEjm6LByfA2aN8IOkz94= -go.opentelemetry.io/proto/otlp v1.2.0/go.mod h1:gGpR8txAl5M03pDhMC79G6SdqNV26naRm/KDsgaHD8A= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.52.0 h1:vS1Ao/R55RNV4O7TA2Qopok8yN+X0LIP6RVWLFkprck= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.52.0/go.mod h1:BMsdeOxN04K0L5FNUBfjFdvwWGNe/rkmSwH4Aelu/X0= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.52.0 h1:9l89oX4ba9kHbBol3Xin3leYJ+252h0zszDtBwyKe2A= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.52.0/go.mod h1:XLZfZboOJWHNKUv7eH0inh0E9VV6eWDFB/9yJyTLPp0= +go.opentelemetry.io/otel v1.27.0 h1:9BZoF3yMK/O1AafMiQTVu0YDj5Ea4hPhxCs7sGva+cg= +go.opentelemetry.io/otel v1.27.0/go.mod h1:DMpAK8fzYRzs+bi3rS5REupisuqTheUlSZJ1WnZaPAQ= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.27.0 h1:R9DE4kQ4k+YtfLI2ULwX82VtNQ2J8yZmA7ZIF/D+7Mc= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.27.0/go.mod h1:OQFyQVrDlbe+R7xrEyDr/2Wr67Ol0hRUgsfA+V5A95s= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.27.0 h1:qFffATk0X+HD+f1Z8lswGiOQYKHRlzfmdJm0wEaVrFA= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.27.0/go.mod h1:MOiCmryaYtc+V0Ei+Tx9o5S1ZjA7kzLucuVuyzBZloQ= +go.opentelemetry.io/otel/exporters/prometheus v0.49.0 h1:Er5I1g/YhfYv9Affk9nJLfH/+qCCVVg1f2R9AbJfqDQ= +go.opentelemetry.io/otel/exporters/prometheus v0.49.0/go.mod h1:KfQ1wpjf3zsHjzP149P4LyAwWRupc6c7t1ZJ9eXpKQM= +go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.27.0 h1:/0YaXu3755A/cFbtXp+21lkXgI0QE5avTWA2HjU9/WE= +go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.27.0/go.mod h1:m7SFxp0/7IxmJPLIY3JhOcU9CoFzDaCPL6xxQIxhA+o= +go.opentelemetry.io/otel/metric v1.27.0 h1:hvj3vdEKyeCi4YaYfNjv2NUje8FqKqUY8IlF0FxV/ik= +go.opentelemetry.io/otel/metric v1.27.0/go.mod h1:mVFgmRlhljgBiuk/MP/oKylr4hs85GZAylncepAX/ak= +go.opentelemetry.io/otel/sdk v1.27.0 h1:mlk+/Y1gLPLn84U4tI8d3GNJmGT/eXe3ZuOXN9kTWmI= +go.opentelemetry.io/otel/sdk v1.27.0/go.mod h1:Ha9vbLwJE6W86YstIywK2xFfPjbWlCuwPtMkKdz/Y4A= +go.opentelemetry.io/otel/sdk/metric v1.27.0 h1:5uGNOlpXi+Hbo/DRoI31BSb1v+OGcpv2NemcCrOL8gI= +go.opentelemetry.io/otel/sdk/metric v1.27.0/go.mod h1:we7jJVrYN2kh3mVBlswtPU22K0SA+769l93J6bsyvqw= +go.opentelemetry.io/otel/trace v1.27.0 h1:IqYb813p7cmbHk0a5y6pD5JPakbVfftRXABGt5/Rscw= +go.opentelemetry.io/otel/trace v1.27.0/go.mod h1:6RiD1hkAprV4/q+yd2ln1HG9GoPx39SuvvstaLBl+l4= +go.opentelemetry.io/proto/otlp v1.3.1 h1:TrMUixzpM0yuc/znrFTP9MMRh8trP93mkCiDVeXrui0= +go.opentelemetry.io/proto/otlp v1.3.1/go.mod h1:0X1WI4de4ZsLrrJNLAQbFeLCm3T7yBkR0XqQ7niQU+8= go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= @@ -801,8 +799,8 @@ golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5y golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58= golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= -golang.org/x/crypto v0.22.0 h1:g1v0xeRhjcugydODzvb3mEM9SQ0HGp9s/nh3COQ/C30= -golang.org/x/crypto v0.22.0/go.mod h1:vr6Su+7cTlO45qkww3VDJlzDn0ctJvRgYbC2NvXHt+M= +golang.org/x/crypto v0.24.0 h1:mnl8DM0o513X8fdIkmyFE/5hTYxbwYOjDS/+rK6qpRI= +golang.org/x/crypto v0.24.0/go.mod h1:Z1PMYSOR5nyMcyAVAIQSKCDwalqy85Aqn1x3Ws4L5DM= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20200331195152-e8c3332aa8e5/go.mod h1:4M0jN8W1tt0AVLNr8HDosyJCDCDuyL9N9+3m7wDWgKw= @@ -863,13 +861,13 @@ golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= golang.org/x/net v0.22.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= -golang.org/x/net v0.24.0 h1:1PcaxkF854Fu3+lvBIx5SYn9wRlBzzcnHZSiaFFAb0w= -golang.org/x/net v0.24.0/go.mod h1:2Q7sJY5mzlzWjKtYUEXSlBWCdyaioyXzRB2RtU8KVE8= +golang.org/x/net v0.26.0 h1:soB7SVo0PWrY4vPW/+ay0jKDNScG2X9wFeYlXIvJsOQ= +golang.org/x/net v0.26.0/go.mod h1:5YKkiSynbBIh3p6iOc/vibscux0x38BZDkn8sCUPxHE= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.19.0 h1:9+E/EZBCbTLNrbN35fHv/a/d/mOBatymz1zbtQrXpIg= -golang.org/x/oauth2 v0.19.0/go.mod h1:vYi7skDa1x015PmRRYZ7+s1cWyPgrPiSYRe4rnsexc8= +golang.org/x/oauth2 v0.21.0 h1:tsimM75w1tF/uws5rbeHzIWxEqElMehnc+iW793zsZs= +golang.org/x/oauth2 v0.21.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -924,8 +922,8 @@ golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.19.0 h1:q5f1RH2jigJ1MoAWp2KTp3gm5zAGFUTarQZ5U386+4o= -golang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.21.0 h1:rF+pYz3DAGSQAxAu1CbC7catZg4ebC4UIeIhKxBZvws= +golang.org/x/sys v0.21.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= @@ -941,8 +939,9 @@ golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.16.0 h1:a94ExnEXNtEwYLGJSIUxnWoxoRz/ZcCsV63ROupILh4= +golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI= golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk= @@ -991,10 +990,10 @@ google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEY google.golang.org/genproto v0.0.0-20210126160654-44e461bb6506/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20240412170617-26222e5d3d56 h1:LlcUFJ4BLmJVS4Kly+WCK7LQqcevmycHj88EPgyhNx8= google.golang.org/genproto v0.0.0-20240412170617-26222e5d3d56/go.mod h1:n1CaIKYMIlxFt1zJE/1kU40YpSL0drGMbl0Idum1VSs= -google.golang.org/genproto/googleapis/api v0.0.0-20240429193739-8cf5692501f6 h1:DTJM0R8LECCgFeUwApvcEJHz85HLagW8uRENYxHh1ww= -google.golang.org/genproto/googleapis/api v0.0.0-20240429193739-8cf5692501f6/go.mod h1:10yRODfgim2/T8csjQsMPgZOMvtytXKTDRzH6HRGzRw= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240429193739-8cf5692501f6 h1:DujSIu+2tC9Ht0aPNA7jgj23Iq8Ewi5sgkQ++wdvonE= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240429193739-8cf5692501f6/go.mod h1:WtryC6hu0hhx87FDGxWCDptyssuo68sk10vYjF+T9fY= +google.golang.org/genproto/googleapis/api v0.0.0-20240610135401-a8a62080eff3 h1:QW9+G6Fir4VcRXVH8x3LilNAb6cxBGLa6+GM4hRwexE= +google.golang.org/genproto/googleapis/api v0.0.0-20240610135401-a8a62080eff3/go.mod h1:kdrSS/OiLkPrNUpzD4aHgCq2rVuC/YRxok32HXZ4vRE= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240610135401-a8a62080eff3 h1:9Xyg6I9IWQZhRVfCWjKK+l6kI0jHcPesVlMnT//aHNo= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240610135401-a8a62080eff3/go.mod h1:EfXuqaE1J41VCDicxHzUDm+8rk+7ZdXzHV0IhO/I6s0= google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.0/go.mod h1:chYK+tFQF0nDUGJgXMSgLCQk3phJEuONr2DCgLDdAQM= @@ -1010,8 +1009,8 @@ google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3Iji google.golang.org/grpc v1.32.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= -google.golang.org/grpc v1.63.2 h1:MUeiw1B2maTVZthpU5xvASfTh3LDbxHd6IJ6QQVU+xM= -google.golang.org/grpc v1.63.2/go.mod h1:WAX/8DgncnokcFUldAxq7GeB5DXHDbMF+lLvDomNkRA= +google.golang.org/grpc v1.64.0 h1:KH3VH9y/MgNQg1dE7b3XfVK0GsPSIzJwdF617gUSbvY= +google.golang.org/grpc v1.64.0/go.mod h1:oxjF8E3FBnjp+/gVFYdWacaLDx9na1aqy9oovLpxQYg= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= @@ -1022,8 +1021,8 @@ google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2 google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= -google.golang.org/protobuf v1.34.0 h1:Qo/qEd2RZPCf2nKuorzksSknv0d3ERwp1vFG38gSmH4= -google.golang.org/protobuf v1.34.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg= +google.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= diff --git a/internal/api/oidc/token_exchange.go b/internal/api/oidc/token_exchange.go index bd19e565cc..c29b7eb80b 100644 --- a/internal/api/oidc/token_exchange.go +++ b/internal/api/oidc/token_exchange.go @@ -176,7 +176,7 @@ func (s *Server) jwtProfileUserCheck(ctx context.Context, resourceOwner *string, } func validateTokenExchangeScopes(client *Client, requestedScopes, subjectScopes, actorScopes []string) ([]string, error) { - // Scope always has 1 empty string is the space delimited array was an empty string. + // Scope always has 1 empty string if the space delimited array was an empty string. scopes := slices.DeleteFunc(requestedScopes, func(s string) bool { return s == "" }) From 3fabe5a2f96cf2f3cf9faddd10f673a665ae67c6 Mon Sep 17 00:00:00 2001 From: Elio Bischof Date: Thu, 13 Jun 2024 14:58:30 +0200 Subject: [PATCH 22/44] docs: link discussion (#8126) # Which Problems Are Solved If users create discussions about the new API on their own, it could become hard to keep the overview. # How the Problems Are Solved We invite to participate in a single dedicated discussion. # Additional Changes Removes the link to the office hours event, as it took place already. --- docs/docs/apis/v3.mdx | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/docs/docs/apis/v3.mdx b/docs/docs/apis/v3.mdx index b5ac50c3b9..839750fc47 100644 --- a/docs/docs/apis/v3.mdx +++ b/docs/docs/apis/v3.mdx @@ -24,8 +24,7 @@ Before using these APIs, pleases consider the [API release policy below](#api-re ## We Appreciate your Help We invite you to... -- ... join [the next office hours](https://zitadel.com/office-hours?event=1248016231936692274) and discuss the new API with us in person. -- ... share your thoughts about the concepts [by opening discussions on GitHub](https://github.com/zitadel/zitadel/discussions/new/choose). +- ... [discuss the concept with the ZITADEL community on GitHub](https://github.com/zitadel/zitadel/discussions/8125). - ... try the implementations and provide feedback [by filing issues on GitHub](https://github.com/zitadel/zitadel/issues/new/choose). ## The Ideas behind the New V3 APIs From 120ed0af73046eb42af6358f5a319802d416ee16 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim=20M=C3=B6hlmann?= Date: Fri, 14 Jun 2024 10:00:43 +0200 Subject: [PATCH 23/44] feat(oidc): organization roles scope (#8120) # Which Problems Are Solved An admin / application might want to be able to reduce the amount of roles returned in the token, for example if a user is granted to many organizations or for specific cases where the application want to narrow down the access for that token to a specific organization or multiple. This can now be achieved by providing a scope with the id of the organization, resp. multiple scopes for every organization, which should be included. ``` urn:zitadel:iam:org:roles:id:{orgID} ``` **Note:** the new scope does not work when Introspection / Userinfo are set to legacy mode. # How the Problems Are Solved The user info query now has two variants: 1. Variant that returns all organization authorization grants if the new scope wasn't provided for backward compatibility. 2. Variant that filters the organizations based on the IDs passed in one or more of the above scopes and returns only those authorization grants. The query is defined as a `text/template` and both variants are rendered once in package `init()`. # Additional Changes - In the integration tests `assertProjectRoleClaims` now also checks the org IDs in the roles. # Additional Context - Closes #7996 --- docs/docs/apis/openidoauth/scopes.md | 5 +- internal/api/oidc/client_converter.go | 3 + internal/api/oidc/userinfo.go | 3 +- .../api/oidc/userinfo_integration_test.go | 128 ++++++++++++++++-- internal/domain/request.go | 1 + internal/domain/token.go | 11 ++ internal/domain/token_test.go | 45 ++++++ internal/query/userinfo.go | 41 +++++- internal/query/userinfo_by_id.sql | 3 + internal/query/userinfo_test.go | 120 ++++++++++++++-- 10 files changed, 335 insertions(+), 25 deletions(-) create mode 100644 internal/domain/token_test.go diff --git a/docs/docs/apis/openidoauth/scopes.md b/docs/docs/apis/openidoauth/scopes.md index e948e84fcc..1cd01a2a7a 100644 --- a/docs/docs/apis/openidoauth/scopes.md +++ b/docs/docs/apis/openidoauth/scopes.md @@ -24,14 +24,17 @@ ZITADEL supports the usage of scopes as way of requesting information from the I In addition to the standard compliant scopes we utilize the following scopes. | Scopes | Example | Description | -|:--------------------------------------------------|:-------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| :------------------------------------------------ | :----------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `urn:zitadel:iam:org:project:role:{rolekey}` | `urn:zitadel:iam:org:project:role:user` | By using this scope a client can request the claim `urn:zitadel:iam:org:project:roles` to be asserted when possible. As an alternative approach you can enable all roles to be asserted from the [project](/guides/manage/console/roles#authorizations) a client belongs to. | | `urn:zitadel:iam:org:projects:roles` | `urn:zitadel:iam:org:projects:roles` | By using this scope a client can request the claim `urn:zitadel:iam:org:project:{projectid}:roles` to be asserted for each requested project. All projects of the token audience, requested by the `urn:zitadel:iam:org:project:id:{projectid}:aud` scopes will be used. | | `urn:zitadel:iam:org:id:{id}` | `urn:zitadel:iam:org:id:178204173316174381` | When requesting this scope **ZITADEL** will enforce that the user is a member of the selected organization. If the organization does not exist a failure is displayed. It will assert the `urn:zitadel:iam:user:resourceowner` claims. | | `urn:zitadel:iam:org:domain:primary:{domainname}` | `urn:zitadel:iam:org:domain:primary:acme.ch` | When requesting this scope **ZITADEL** will enforce that the user is a member of the selected organization and the username is suffixed by the provided domain. If the organization does not exist a failure is displayed | | `urn:zitadel:iam:role:{rolename}` | | | +| `urn:zitadel:iam:org:roles:id:{orgID}` | `urn:zitadel:iam:org:roles:id:178204173316174381` | This scope can be used one or more times to limit the granted organization IDs in the returned roles. Unknown organization IDs are ignored. When this scope is not used, all granted organizations are returned inside the roles.[^1] | | `urn:zitadel:iam:org:project:id:{projectid}:aud` | `urn:zitadel:iam:org:project:id:69234237810729019:aud` | By adding this scope, the requested projectid will be added to the audience of the access token | | `urn:zitadel:iam:org:project:id:zitadel:aud` | `urn:zitadel:iam:org:project:id:zitadel:aud` | By adding this scope, the ZITADEL project ID will be added to the audience of the access token | | `urn:zitadel:iam:user:metadata` | `urn:zitadel:iam:user:metadata` | By adding this scope, the metadata of the user will be included in the token. The values are base64 encoded. | | `urn:zitadel:iam:user:resourceowner` | `urn:zitadel:iam:user:resourceowner` | By adding this scope, the resourceowner (id, name, primary_domain) of the user will be included in the token. | | `urn:zitadel:iam:org:idp:id:{idp_id}` | `urn:zitadel:iam:org:idp:id:76625965177954913` | By adding this scope the user will directly be redirected to the identity provider to authenticate. Make sure you also send the primary domain scope if a custom login policy is configured. Otherwise the system will not be able to identify the identity provider. | + +[^1]: `urn:zitadel:iam:org:roles:id:{orgID}` is not supported when the `oidcLegacyIntrospection` [feature flag](/docs/apis/resources/feature_service_v2/feature-service-set-instance-features) is enabled. diff --git a/internal/api/oidc/client_converter.go b/internal/api/oidc/client_converter.go index f5e53312d0..1a9d86afb6 100644 --- a/internal/api/oidc/client_converter.go +++ b/internal/api/oidc/client_converter.go @@ -242,6 +242,9 @@ func isScopeAllowed(scope string, allowedScopes ...string) bool { if strings.HasPrefix(scope, domain.SelectIDPScope) { return true } + if strings.HasPrefix(scope, domain.OrgRoleIDScope) { + return true + } if scope == ScopeUserMetaData { return true } diff --git a/internal/api/oidc/userinfo.go b/internal/api/oidc/userinfo.go index 415c337c76..eb38c96b20 100644 --- a/internal/api/oidc/userinfo.go +++ b/internal/api/oidc/userinfo.go @@ -104,7 +104,8 @@ func (s *Server) userInfo( defer func() { span.EndWithError(err) }() roleAudience, requestedRoles = prepareRoles(ctx, scope, projectID, projectRoleAssertion, currentProjectOnly) - qu, err = s.query.GetOIDCUserInfo(ctx, userID, roleAudience) + roleOrgIDs := domain.RoleOrgIDsFromScope(scope) + qu, err = s.query.GetOIDCUserInfo(ctx, userID, roleAudience, roleOrgIDs...) if err != nil { return } diff --git a/internal/api/oidc/userinfo_integration_test.go b/internal/api/oidc/userinfo_integration_test.go index 7f39ed38ba..350b2267d3 100644 --- a/internal/api/oidc/userinfo_integration_test.go +++ b/internal/api/oidc/userinfo_integration_test.go @@ -13,6 +13,7 @@ import ( "github.com/zitadel/oidc/v3/pkg/client/rp" "github.com/zitadel/oidc/v3/pkg/oidc" "golang.org/x/oauth2" + "google.golang.org/grpc/metadata" oidc_api "github.com/zitadel/zitadel/internal/api/oidc" "github.com/zitadel/zitadel/internal/domain" @@ -143,7 +144,7 @@ func testServer_UserInfo(t *testing.T) { assertions: []func(*testing.T, *oidc.UserInfo){ assertUserinfo, func(t *testing.T, ui *oidc.UserInfo) { - assertProjectRoleClaims(t, projectID, ui.Claims, true, roleFoo, roleBar) + assertProjectRoleClaims(t, projectID, ui.Claims, true, []string{roleFoo, roleBar}, []string{Tester.Organisation.ID}) }, }, }, @@ -156,7 +157,7 @@ func testServer_UserInfo(t *testing.T) { assertions: []func(*testing.T, *oidc.UserInfo){ assertUserinfo, func(t *testing.T, ui *oidc.UserInfo) { - assertProjectRoleClaims(t, projectID, ui.Claims, true, roleFoo) + assertProjectRoleClaims(t, projectID, ui.Claims, true, []string{roleFoo}, []string{Tester.Organisation.ID}) }, }, }, @@ -170,7 +171,7 @@ func testServer_UserInfo(t *testing.T) { assertions: []func(*testing.T, *oidc.UserInfo){ assertUserinfo, func(t *testing.T, ui *oidc.UserInfo) { - assertProjectRoleClaims(t, projectID, ui.Claims, true, roleFoo) + assertProjectRoleClaims(t, projectID, ui.Claims, true, []string{roleFoo}, []string{Tester.Organisation.ID}) }, }, }, @@ -221,6 +222,76 @@ func testServer_UserInfo(t *testing.T) { } } +// TestServer_UserInfo_OrgIDRoles tests the [domain.OrgRoleIDScope] functionality +// it is a separate test because it is not supported in legacy mode. +func TestServer_UserInfo_OrgIDRoles(t *testing.T) { + const ( + roleFoo = "foo" + roleBar = "bar" + ) + clientID, projectID := createClient(t) + addProjectRolesGrants(t, User.GetUserId(), projectID, roleFoo, roleBar) + grantedOrgID := addProjectOrgGrant(t, User.GetUserId(), projectID, roleFoo, roleBar) + + _, err := Tester.Client.Mgmt.UpdateProject(CTX, &management.UpdateProjectRequest{ + Id: projectID, + Name: fmt.Sprintf("project-%d", time.Now().UnixNano()), + ProjectRoleAssertion: true, + }) + require.NoError(t, err) + resp, err := Tester.Client.Mgmt.GetProjectByID(CTX, &management.GetProjectByIDRequest{Id: projectID}) + require.NoError(t, err) + require.True(t, resp.GetProject().GetProjectRoleAssertion(), "project role assertion") + + tests := []struct { + name string + scope []string + wantRoleOrgIDs []string + }{ + { + name: "default returns all role orgs", + scope: []string{ + oidc.ScopeOpenID, oidc.ScopeOfflineAccess, + }, + wantRoleOrgIDs: []string{Tester.Organisation.ID, grantedOrgID}, + }, + { + name: "only granted org", + scope: []string{ + oidc.ScopeOpenID, oidc.ScopeOfflineAccess, + domain.OrgRoleIDScope + grantedOrgID}, + wantRoleOrgIDs: []string{grantedOrgID}, + }, + { + name: "only own org", + scope: []string{ + oidc.ScopeOpenID, oidc.ScopeOfflineAccess, + domain.OrgRoleIDScope + Tester.Organisation.ID, + }, + wantRoleOrgIDs: []string{Tester.Organisation.ID}, + }, + { + name: "request both orgs", + scope: []string{ + oidc.ScopeOpenID, oidc.ScopeOfflineAccess, + domain.OrgRoleIDScope + Tester.Organisation.ID, + domain.OrgRoleIDScope + grantedOrgID, + }, + wantRoleOrgIDs: []string{Tester.Organisation.ID, grantedOrgID}, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + tokens := getTokens(t, clientID, tt.scope) + provider, err := Tester.CreateRelyingParty(CTX, clientID, redirectURI) + require.NoError(t, err) + userinfo, err := rp.Userinfo[*oidc.UserInfo](CTX, tokens.AccessToken, tokens.TokenType, tokens.IDTokenClaims.Subject, provider) + require.NoError(t, err) + assertProjectRoleClaims(t, projectID, userinfo.Claims, true, []string{roleFoo, roleBar}, tt.wantRoleOrgIDs) + }) + } +} + // https://github.com/zitadel/zitadel/issues/6662 func TestServer_UserInfo_Issue6662(t *testing.T) { const ( @@ -247,7 +318,7 @@ func TestServer_UserInfo_Issue6662(t *testing.T) { userinfo, err := rp.Userinfo[*oidc.UserInfo](CTX, tokens.AccessToken, tokens.TokenType, user.GetUserId(), provider) require.NoError(t, err) - assertProjectRoleClaims(t, projectID, userinfo.Claims, false, roleFoo) + assertProjectRoleClaims(t, projectID, userinfo.Claims, false, []string{roleFoo}, []string{Tester.Organisation.ID}) } func addProjectRolesGrants(t *testing.T, userID, projectID string, roles ...string) { @@ -272,6 +343,28 @@ func addProjectRolesGrants(t *testing.T, userID, projectID string, roles ...stri require.NoError(t, err) } +// addProjectOrgGrant adds a new organization which will be granted on the projectID with the specified roles. +// The userID will be granted in the new organization to the project with the same roles. +func addProjectOrgGrant(t *testing.T, userID, projectID string, roles ...string) (grantedOrgID string) { + grantedOrg := Tester.CreateOrganization(CTXIAM, fmt.Sprintf("ZITADEL_GRANTED_%d", time.Now().UnixNano()), fmt.Sprintf("%d@mouse.com", time.Now().UnixNano())) + projectGrant, err := Tester.Client.Mgmt.AddProjectGrant(CTX, &management.AddProjectGrantRequest{ + ProjectId: projectID, + GrantedOrgId: grantedOrg.GetOrganizationId(), + RoleKeys: roles, + }) + require.NoError(t, err) + + ctxOrg := metadata.AppendToOutgoingContext(CTXIAM, "x-zitadel-orgid", grantedOrg.GetOrganizationId()) + _, err = Tester.Client.Mgmt.AddUserGrant(ctxOrg, &management.AddUserGrantRequest{ + UserId: userID, + ProjectId: projectID, + ProjectGrantId: projectGrant.GetGrantId(), + RoleKeys: roles, + }) + require.NoError(t, err) + return grantedOrg.GetOrganizationId() +} + func getTokens(t *testing.T, clientID string, scope []string) *oidc.Tokens[*oidc.IDTokenClaims] { authRequestID := createAuthRequest(t, clientID, redirectURI, scope...) sessionID, sessionToken, startTime, changeTime := Tester.CreateVerifiedWebAuthNSession(t, CTXLOGIN, User.GetUserId()) @@ -316,19 +409,36 @@ func assertNoReservedScopes(t *testing.T, claims map[string]any) { } } -func assertProjectRoleClaims(t *testing.T, projectID string, claims map[string]any, claimProjectRole bool, roles ...string) { +// assertProjectRoleClaims asserts the projectRoles in the claims. +// By default it searches for the [oidc_api.ClaimProjectRolesFormat] claim with a project ID, +// and optionally for the [oidc_api.ClaimProjectRoles] claim if claimProjectRole is true. +// Each claim should contain the roles expected by wantRoles and +// each role should contain the org IDs expected by wantRoleOrgIDs. +// +// In the claim map, each project role claim is expected to be a map of multiple roles and +// each role is expected to be a map of multiple Org IDs to Org Domains. +func assertProjectRoleClaims(t *testing.T, projectID string, claims map[string]any, claimProjectRole bool, wantRoles, wantRoleOrgIDs []string) { t.Helper() projectRoleClaims := []string{fmt.Sprintf(oidc_api.ClaimProjectRolesFormat, projectID)} if claimProjectRole { projectRoleClaims = append(projectRoleClaims, oidc_api.ClaimProjectRoles) } for _, claim := range projectRoleClaims { - roleMap, ok := claims[claim].(map[string]any) + roleMap, ok := claims[claim].(map[string]any) // map of multiple roles require.Truef(t, ok, "claim %s not found or wrong type %T", claim, claims[claim]) - for _, roleKey := range roles { - role, ok := roleMap[roleKey].(map[string]any) + + gotRoles := make([]string, 0, len(roleMap)) + for roleKey := range roleMap { + role, ok := roleMap[roleKey].(map[string]any) // map of multiple org IDs to org domains require.Truef(t, ok, "role %s not found or wrong type %T", roleKey, roleMap[roleKey]) - assert.Equal(t, role[Tester.Organisation.ID], Tester.Organisation.Domain, "org domain in role") + gotRoles = append(gotRoles, roleKey) + + gotRoleOrgIDs := make([]string, 0, len(role)) + for orgID := range role { + gotRoleOrgIDs = append(gotRoleOrgIDs, orgID) + } + assert.ElementsMatch(t, wantRoleOrgIDs, gotRoleOrgIDs) } + assert.ElementsMatch(t, wantRoles, gotRoles) } } diff --git a/internal/domain/request.go b/internal/domain/request.go index 351ddd4e5f..5cf4846999 100644 --- a/internal/domain/request.go +++ b/internal/domain/request.go @@ -3,6 +3,7 @@ package domain const ( OrgDomainPrimaryScope = "urn:zitadel:iam:org:domain:primary:" OrgIDScope = "urn:zitadel:iam:org:id:" + OrgRoleIDScope = "urn:zitadel:iam:org:roles:id:" OrgDomainPrimaryClaim = "urn:zitadel:iam:org:domain:primary" OrgIDClaim = "urn:zitadel:iam:org:id" ProjectIDScope = "urn:zitadel:iam:org:project:id:" diff --git a/internal/domain/token.go b/internal/domain/token.go index 83937554c0..369c78df74 100644 --- a/internal/domain/token.go +++ b/internal/domain/token.go @@ -21,6 +21,17 @@ func AddAudScopeToAudience(ctx context.Context, audience, scopes []string) []str return audience } +// RoleOrgIDsFromScope parses orgIDs from [OrgRoleIDScope] prefixed scopes. +func RoleOrgIDsFromScope(scopes []string) (orgIDs []string) { + for _, scope := range scopes { + orgID, found := strings.CutPrefix(scope, OrgRoleIDScope) + if found { + orgIDs = append(orgIDs, orgID) + } + } + return orgIDs +} + func addProjectID(audience []string, projectID string) []string { for _, a := range audience { if a == projectID { diff --git a/internal/domain/token_test.go b/internal/domain/token_test.go new file mode 100644 index 0000000000..3e58ff0d67 --- /dev/null +++ b/internal/domain/token_test.go @@ -0,0 +1,45 @@ +package domain + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestRoleOrgIDsFromScope(t *testing.T) { + type args struct { + scopes []string + } + tests := []struct { + name string + args args + want []string + }{ + { + name: "nil", + args: args{nil}, + want: nil, + }, + { + name: "unrelated scope", + args: args{[]string{"foo", "bar"}}, + want: nil, + }, + { + name: "orgID role scope", + args: args{[]string{OrgRoleIDScope + "123"}}, + want: []string{"123"}, + }, + { + name: "mixed scope", + args: args{[]string{"foo", OrgRoleIDScope + "123"}}, + want: []string{"123"}, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got := RoleOrgIDsFromScope(tt.args.scopes) + assert.Equal(t, tt.want, got) + }) + } +} diff --git a/internal/query/userinfo.go b/internal/query/userinfo.go index 3231817511..0e749f09b3 100644 --- a/internal/query/userinfo.go +++ b/internal/query/userinfo.go @@ -5,7 +5,9 @@ import ( "database/sql" _ "embed" "errors" + "strings" "sync" + "text/template" "github.com/zitadel/zitadel/internal/api/authz" "github.com/zitadel/zitadel/internal/database" @@ -35,16 +37,43 @@ func TriggerOIDCUserInfoProjections(ctx context.Context) { triggerBatch(ctx, oidcUserInfoTriggerHandlers()...) } -//go:embed userinfo_by_id.sql -var oidcUserInfoQuery string +var ( + //go:embed userinfo_by_id.sql + oidcUserInfoQueryTmpl string + oidcUserInfoQuery string + oidcUserInfoWithRoleOrgIDsQuery string +) -func (q *Queries) GetOIDCUserInfo(ctx context.Context, userID string, roleAudience []string) (_ *OIDCUserInfo, err error) { +// build the two variants of the userInfo query +func init() { + tmpl := template.Must(template.New("oidcUserInfoQuery").Parse(oidcUserInfoQueryTmpl)) + var buf strings.Builder + if err := tmpl.Execute(&buf, false); err != nil { + panic(err) + } + oidcUserInfoQuery = buf.String() + buf.Reset() + + if err := tmpl.Execute(&buf, true); err != nil { + panic(err) + } + oidcUserInfoWithRoleOrgIDsQuery = buf.String() + buf.Reset() +} + +func (q *Queries) GetOIDCUserInfo(ctx context.Context, userID string, roleAudience []string, roleOrgIDs ...string) (userInfo *OIDCUserInfo, err error) { ctx, span := tracing.NewSpan(ctx) defer func() { span.EndWithError(err) }() - userInfo, err := database.QueryJSONObject[OIDCUserInfo](ctx, q.client, oidcUserInfoQuery, - userID, authz.GetInstance(ctx).InstanceID(), database.TextArray[string](roleAudience), - ) + if len(roleOrgIDs) > 0 { + userInfo, err = database.QueryJSONObject[OIDCUserInfo](ctx, q.client, oidcUserInfoWithRoleOrgIDsQuery, + userID, authz.GetInstance(ctx).InstanceID(), database.TextArray[string](roleAudience), database.TextArray[string](roleOrgIDs), + ) + } else { + userInfo, err = database.QueryJSONObject[OIDCUserInfo](ctx, q.client, oidcUserInfoQuery, + userID, authz.GetInstance(ctx).InstanceID(), database.TextArray[string](roleAudience), + ) + } if errors.Is(err, sql.ErrNoRows) { return nil, zerrors.ThrowNotFound(err, "QUERY-Eey2a", "Errors.User.NotFound") } diff --git a/internal/query/userinfo_by_id.sql b/internal/query/userinfo_by_id.sql index 95e6ad90c7..21c5175974 100644 --- a/internal/query/userinfo_by_id.sql +++ b/internal/query/userinfo_by_id.sql @@ -38,6 +38,9 @@ user_grants as ( where user_id = $1 and instance_id = $2 and project_id = any($3) + {{ if . -}} + and resource_owner = any($4) + {{- end }} ), -- filter all orgs we are interested in. orgs as ( diff --git a/internal/query/userinfo_test.go b/internal/query/userinfo_test.go index 29d94d0baf..6ded7b4eed 100644 --- a/internal/query/userinfo_test.go +++ b/internal/query/userinfo_test.go @@ -48,10 +48,10 @@ var ( ) func TestQueries_GetOIDCUserInfo(t *testing.T) { - expQuery := regexp.QuoteMeta(oidcUserInfoQuery) type args struct { userID string roleAudience []string + roleOrgIDs []string } tests := []struct { name string @@ -65,7 +65,7 @@ func TestQueries_GetOIDCUserInfo(t *testing.T) { args: args{ userID: "231965491734773762", }, - mock: mockQueryErr(expQuery, sql.ErrConnDone, "231965491734773762", "instanceID", database.TextArray[string](nil)), + mock: mockQueryErr(regexp.QuoteMeta(oidcUserInfoQuery), sql.ErrConnDone, "231965491734773762", "instanceID", database.TextArray[string](nil)), wantErr: sql.ErrConnDone, }, { @@ -73,7 +73,7 @@ func TestQueries_GetOIDCUserInfo(t *testing.T) { args: args{ userID: "231965491734773762", }, - mock: mockQuery(expQuery, []string{"json_build_object"}, []driver.Value{testdataUserInfoNotFound}, "231965491734773762", "instanceID", database.TextArray[string](nil)), + mock: mockQuery(regexp.QuoteMeta(oidcUserInfoQuery), []string{"json_build_object"}, []driver.Value{testdataUserInfoNotFound}, "231965491734773762", "instanceID", database.TextArray[string](nil)), wantErr: zerrors.ThrowNotFound(nil, "QUERY-ahs4S", "Errors.User.NotFound"), }, { @@ -81,7 +81,7 @@ func TestQueries_GetOIDCUserInfo(t *testing.T) { args: args{ userID: "231965491734773762", }, - mock: mockQuery(expQuery, []string{"json_build_object"}, []driver.Value{testdataUserInfoHumanNoMD}, "231965491734773762", "instanceID", database.TextArray[string](nil)), + mock: mockQuery(regexp.QuoteMeta(oidcUserInfoQuery), []string{"json_build_object"}, []driver.Value{testdataUserInfoHumanNoMD}, "231965491734773762", "instanceID", database.TextArray[string](nil)), want: &OIDCUserInfo{ User: &User{ ID: "231965491734773762", @@ -120,7 +120,7 @@ func TestQueries_GetOIDCUserInfo(t *testing.T) { args: args{ userID: "231965491734773762", }, - mock: mockQuery(expQuery, []string{"json_build_object"}, []driver.Value{testdataUserInfoHuman}, "231965491734773762", "instanceID", database.TextArray[string](nil)), + mock: mockQuery(regexp.QuoteMeta(oidcUserInfoQuery), []string{"json_build_object"}, []driver.Value{testdataUserInfoHuman}, "231965491734773762", "instanceID", database.TextArray[string](nil)), want: &OIDCUserInfo{ User: &User{ ID: "231965491734773762", @@ -177,7 +177,7 @@ func TestQueries_GetOIDCUserInfo(t *testing.T) { userID: "231965491734773762", roleAudience: []string{"236645808328409090", "240762134579904514"}, }, - mock: mockQuery(expQuery, + mock: mockQuery(regexp.QuoteMeta(oidcUserInfoQuery), []string{"json_build_object"}, []driver.Value{testdataUserInfoHumanGrants}, "231965491734773762", "instanceID", database.TextArray[string]{"236645808328409090", "240762134579904514"}, @@ -272,12 +272,116 @@ func TestQueries_GetOIDCUserInfo(t *testing.T) { }, }, }, + { + name: "human with metadata and grants, role orgIDs", + args: args{ + userID: "231965491734773762", + roleAudience: []string{"236645808328409090", "240762134579904514"}, + roleOrgIDs: []string{"231848297847848962"}, + }, + mock: mockQuery(regexp.QuoteMeta(oidcUserInfoWithRoleOrgIDsQuery), + []string{"json_build_object"}, + []driver.Value{testdataUserInfoHumanGrants}, + "231965491734773762", "instanceID", + database.TextArray[string]{"236645808328409090", "240762134579904514"}, + database.TextArray[string]{"231848297847848962"}, + ), + want: &OIDCUserInfo{ + User: &User{ + ID: "231965491734773762", + CreationDate: time.Date(2023, time.September, 15, 6, 10, 7, 434142000, timeLocation), + ChangeDate: time.Date(2023, time.November, 14, 13, 27, 2, 72318000, timeLocation), + Sequence: 1148, + State: 1, + ResourceOwner: "231848297847848962", + Username: "tim+tesmail@zitadel.com", + PreferredLoginName: "tim+tesmail@zitadel.com@demo.localhost", + Human: &Human{ + FirstName: "Tim", + LastName: "Mohlmann", + NickName: "muhlemmer", + DisplayName: "Tim Mohlmann", + AvatarKey: "", + PreferredLanguage: language.English, + Gender: domain.GenderMale, + Email: "tim+tesmail@zitadel.com", + IsEmailVerified: true, + Phone: "+40123456789", + IsPhoneVerified: false, + }, + Machine: nil, + }, + Org: &UserInfoOrg{ + ID: "231848297847848962", + Name: "demo", + PrimaryDomain: "demo.localhost", + }, + Metadata: []UserMetadata{ + { + CreationDate: time.Date(2023, time.November, 14, 13, 26, 3, 553702000, timeLocation), + ChangeDate: time.Date(2023, time.November, 14, 13, 26, 3, 553702000, timeLocation), + Sequence: 1147, + ResourceOwner: "231848297847848962", + Key: "bar", + Value: []byte("foo"), + }, + { + CreationDate: time.Date(2023, time.November, 14, 13, 25, 57, 171368000, timeLocation), + ChangeDate: time.Date(2023, time.November, 14, 13, 25, 57, 171368000, timeLocation), + Sequence: 1146, + ResourceOwner: "231848297847848962", + Key: "foo", + Value: []byte("bar"), + }, + }, + UserGrants: []UserGrant{ + { + ID: "240749256523120642", + GrantID: "", + State: 1, + CreationDate: time.Date(2023, time.November, 14, 20, 28, 59, 168208000, timeLocation), + ChangeDate: time.Date(2023, time.November, 14, 20, 50, 58, 822391000, timeLocation), + Sequence: 2, + UserID: "231965491734773762", + Roles: []string{ + "role1", + "role2", + }, + ResourceOwner: "231848297847848962", + ProjectID: "236645808328409090", + OrgName: "demo", + OrgPrimaryDomain: "demo.localhost", + ProjectName: "tests", + UserResourceOwner: "231848297847848962", + }, + { + ID: "240762315572510722", + GrantID: "", + State: 1, + CreationDate: time.Date(2023, time.November, 14, 22, 38, 42, 967317000, timeLocation), + ChangeDate: time.Date(2023, time.November, 14, 22, 38, 42, 967317000, timeLocation), + Sequence: 1, + UserID: "231965491734773762", + Roles: []string{ + "role3", + "role4", + }, + ResourceOwner: "231848297847848962", + ProjectID: "240762134579904514", + OrgName: "demo", + OrgPrimaryDomain: "demo.localhost", + ProjectName: "tests2", + UserResourceOwner: "231848297847848962", + }, + }, + }, + }, { name: "machine with metadata", args: args{ userID: "240707570677841922", }, - mock: mockQuery(expQuery, []string{"json_build_object"}, []driver.Value{testdataUserInfoMachine}, "240707570677841922", "instanceID", database.TextArray[string](nil)), + mock: mockQuery(regexp.QuoteMeta(oidcUserInfoQuery), []string{"json_build_object"}, []driver.Value{testdataUserInfoMachine}, "240707570677841922", "instanceID", database.TextArray[string](nil)), want: &OIDCUserInfo{ User: &User{ ID: "240707570677841922", @@ -331,7 +435,7 @@ func TestQueries_GetOIDCUserInfo(t *testing.T) { } ctx := authz.NewMockContext("instanceID", "orgID", "loginClient") - got, err := q.GetOIDCUserInfo(ctx, tt.args.userID, tt.args.roleAudience) + got, err := q.GetOIDCUserInfo(ctx, tt.args.userID, tt.args.roleAudience, tt.args.roleOrgIDs...) require.ErrorIs(t, err, tt.wantErr) assert.Equal(t, tt.want, got) }) From a00044998636d96989cac777f1dc42d6845680bb Mon Sep 17 00:00:00 2001 From: Fabi Date: Fri, 14 Jun 2024 11:45:24 +0200 Subject: [PATCH 24/44] docs: add list of files that need an extension for new language contribution (#8114) Add a list of files to the contribution guidelines for a new language, which also need an extension. # Which Problems Are Solved At the moment we state where a contributor needs to add new translation files, but then some lists are missing and the language is not shown to end users. # How the Problems Are Solved Add contribution guidelines Co-authored-by: Livio Spring --- CONTRIBUTING.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 9c18c920a4..f193706eb7 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -398,6 +398,13 @@ ZITADEL loads translations from four files: You may edit the texts in these files or create a new file for additional language support. Make sure you set the locale (ISO 639-1 code) as the name of the new language file. Please make sure that the languages within the files remain in their own language, e.g. German must always be `Deutsch. +If you have added support for a new language, please also ensure that it is added in the list of languages in all the other language files. + +You also have to add some changes to the following files: +- [Register Local File](./console/src/app/app.module.ts) +- [Add Supported Language](./console/src/app/utils/language.ts) +- [Customized Text Docs](./docs/docs/guides/manage/customize/texts.md) +- [Add language option](./internal/api/ui/login/static/templates/external_not_found_option.html) ## Want to start ZITADEL? From cc00ee89ffd3806873d64431039223d8dfb2c8ca Mon Sep 17 00:00:00 2001 From: Fabi Date: Fri, 14 Jun 2024 14:27:33 +0200 Subject: [PATCH 25/44] docs: link user register to metadata for custom fields (#8117) # Which Problems Are Solved an admin wants to know how to register a new user with some custom fields # How the Problems Are Solved We already had examples about user metadata and onboard new users, but the link between those and how to use it was missing. # Additional Context Replace this example with links to related issues, discussions, discord threads, or other sources with more context. Use the Closing #issue syntax for issues that are resolved with this PR. - Closes #7951 --------- Co-authored-by: Livio Spring --- docs/docs/guides/integrate/login-ui/username-password.mdx | 7 +++++++ docs/docs/guides/integrate/onboarding/end-users.mdx | 7 +++++-- docs/docs/guides/manage/customize/user-metadata.md | 5 +++++ 3 files changed, 17 insertions(+), 2 deletions(-) diff --git a/docs/docs/guides/integrate/login-ui/username-password.mdx b/docs/docs/guides/integrate/login-ui/username-password.mdx index 1be65bebce..5c9ab54cdd 100644 --- a/docs/docs/guides/integrate/login-ui/username-password.mdx +++ b/docs/docs/guides/integrate/login-ui/username-password.mdx @@ -12,6 +12,13 @@ sidebar_label: Username and Password First, we create a new user with a username and password. In the example below we add a user with profile data, a verified email address, and a password. [Create User Documentation](/apis/resources/user_service/user-service-add-human-user) +### Custom Fields + +If you have custom fields you like to add to your users that are not provided by ZITADEL, you can add them to the metadata. +Metadata are key value pairs you can use for additional user data. +These fields can also be included in the token of the user, so you have access to it all the time. +Read more about the metadata [here](/docs/guides/manage/customize/user-metadata) + ### Request ```bash diff --git a/docs/docs/guides/integrate/onboarding/end-users.mdx b/docs/docs/guides/integrate/onboarding/end-users.mdx index 274c2f7eaa..f1cf726ab4 100644 --- a/docs/docs/guides/integrate/onboarding/end-users.mdx +++ b/docs/docs/guides/integrate/onboarding/end-users.mdx @@ -102,7 +102,7 @@ Please follow the configuration guides for the needed providers: [Let Users Logi import OrgLoginDescription from "./_org_login_description.mdx"; - + ### Build your own registration form @@ -117,8 +117,11 @@ We do have a guide series on how to build your own login ui, which also includes You can find all the guides here: [Build your own login UI](/docs/guides/integrate/login-ui) -The create user request also allows you to add metadata (key, value) to the user. +#### Custom fields + +The [create user request](/docs/apis/resources/user_service/user-service-add-human-user) also allows you to add [metadata](/docs/guides/manage/customize/user-metadata) (key, value) to the user. This gives you the possibility to collect additional data from your users during the registration process and store it directly to the user in ZITADEL. +Those metadata can also directly be included in the [token](/docs/guides/manage/customize/user-metadata#use-tokens-to-get-user-metadata) of the user. We recommend storing business relevant data in the database of your application, and only authentication and authorization relevant data in ZITADEL to follow the separation of concern pattern. #### Registration with Organization External Identity Provider diff --git a/docs/docs/guides/manage/customize/user-metadata.md b/docs/docs/guides/manage/customize/user-metadata.md index fc4a1f9b74..b109134fea 100644 --- a/docs/docs/guides/manage/customize/user-metadata.md +++ b/docs/docs/guides/manage/customize/user-metadata.md @@ -219,6 +219,11 @@ An example response for your search looks like this: } ``` +## Register user with custom metadata + +When you build your own registration UI you have the possibility to have custom fields and add them to the metadata of your user. +Learn everything about how to build your own registration UI [here](/docs/guides/integrate/onboarding/end-users#build-your-own-registration-form). + ## Manage user metadata through the management API The previous methods allowed you to retrieve metadata only for the `sub` in the access token. From 21ffe4f693c19ccc65ca3357409b5f494e76b6d3 Mon Sep 17 00:00:00 2001 From: Florian Forster Date: Fri, 14 Jun 2024 15:50:36 +0200 Subject: [PATCH 26/44] chore(docs): fix ci (#8135) # Fixing Fork Previews This PR tries to fix the upload of the docs preview to vercel which was not working due to the not available secret. --- .github/workflows/build.yml | 7 +++++++ .github/workflows/docsusaurus.yml | 23 +++++++++++++++-------- 2 files changed, 22 insertions(+), 8 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index a8f673c2e8..faf6181ac3 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -20,6 +20,13 @@ permissions: pull-requests: write jobs: + docs: + uses: ./.github/workflows/docsusaurus.yml + secrets: + VERCEL_TOKEN: ${{ secrets.VERCEL_TOKEN }} + VERCEL_ORG_ID: ${{ secrets.VERCEL_ORG_ID }} + VERCEL_PROJECT_ID: ${{ secrets.VERCEL_PROJECT_ID }} + core: uses: ./.github/workflows/core.yml with: diff --git a/.github/workflows/docsusaurus.yml b/.github/workflows/docsusaurus.yml index ec20843e07..9752b0b670 100644 --- a/.github/workflows/docsusaurus.yml +++ b/.github/workflows/docsusaurus.yml @@ -1,15 +1,22 @@ name: Docs -env: - VERCEL_ORG_ID: ${{ secrets.VERCEL_ORG_ID }} - VERCEL_PROJECT_ID: ${{ secrets.VERCEL_PROJECT_ID }} -on: - pull_request: - push: - branches: - - main +on: + workflow_call: + secrets: + VERCEL_TOKEN: + description: 'Vercel API Token' + required: true + VERCEL_ORG_ID: + description: 'Vercel Org/Team ID' + required: true + VERCEL_PROJECT_ID: + description: 'Vercel Project ID' + required: true jobs: Deploy: runs-on: ubuntu-latest + env: + VERCEL_ORG_ID: ${{ secrets.VERCEL_ORG_ID }} + VERCEL_PROJECT_ID: ${{ secrets.VERCEL_PROJECT_ID }} steps: - uses: actions/checkout@v4 - uses: dorny/paths-filter@v3 From cf72bd6192ef811ad971d948a34870b336cf7596 Mon Sep 17 00:00:00 2001 From: Florian Forster Date: Fri, 14 Jun 2024 16:50:58 +0200 Subject: [PATCH 27/44] chore(docs): use vercel ci again because GH secret problem on forks (#8142) # Fallback to Vercel CI Since we cannot share the vercel_token on forks we cannot deploy by vercel CLI. This PR reverts to the last working state by using vercel CI. I will look into a fix with an npm script or a turbo config to ignore builds on folder changes. --- .github/workflows/build.yml | 7 --- .github/workflows/docsusaurus.yml | 100 ------------------------------ docs/vercel.json | 2 +- 3 files changed, 1 insertion(+), 108 deletions(-) delete mode 100644 .github/workflows/docsusaurus.yml diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index faf6181ac3..a8f673c2e8 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -20,13 +20,6 @@ permissions: pull-requests: write jobs: - docs: - uses: ./.github/workflows/docsusaurus.yml - secrets: - VERCEL_TOKEN: ${{ secrets.VERCEL_TOKEN }} - VERCEL_ORG_ID: ${{ secrets.VERCEL_ORG_ID }} - VERCEL_PROJECT_ID: ${{ secrets.VERCEL_PROJECT_ID }} - core: uses: ./.github/workflows/core.yml with: diff --git a/.github/workflows/docsusaurus.yml b/.github/workflows/docsusaurus.yml deleted file mode 100644 index 9752b0b670..0000000000 --- a/.github/workflows/docsusaurus.yml +++ /dev/null @@ -1,100 +0,0 @@ -name: Docs -on: - workflow_call: - secrets: - VERCEL_TOKEN: - description: 'Vercel API Token' - required: true - VERCEL_ORG_ID: - description: 'Vercel Org/Team ID' - required: true - VERCEL_PROJECT_ID: - description: 'Vercel Project ID' - required: true -jobs: - Deploy: - runs-on: ubuntu-latest - env: - VERCEL_ORG_ID: ${{ secrets.VERCEL_ORG_ID }} - VERCEL_PROJECT_ID: ${{ secrets.VERCEL_PROJECT_ID }} - steps: - - uses: actions/checkout@v4 - - uses: dorny/paths-filter@v3 - id: filter - with: - filters: | - src: - - 'docs/**' - - 'proto/**' - - '.github/workflows/docsusaurus.yml' - - uses: actions/setup-node@v4 - with: - node-version: 20 - cache: 'yarn' - cache-dependency-path: docs/yarn.lock - - name: Install Vercel CLI - run: yarn global add vercel - - name: Install Dependencies - if: steps.filter.outputs.src == 'true' - run: yarn install --frozen-lockfile - working-directory: ./docs - - uses: actions/cache@v4 - if: steps.filter.outputs.src == 'true' - with: - path: | - ${{ github.workspace }}/docs/.docusaurus - ${{ github.workspace }}/docs/node_modules/.cache - key: | - ${{ runner.os }}-docusaurus-${{ hashFiles('**/package-lock.json', '**/npm-shrinkwrap.json', '**/yarn.lock', '**/pnpm-lock.yaml') }}-${{ hashFiles('**.[jt]s', '**.[jt]sx') }} - restore-keys: | - ${{ runner.os }}-docusaurus-${{ hashFiles('**/package-lock.json', '**/npm-shrinkwrap.json', '**/yarn.lock', '**/pnpm-lock.yaml') }} - ${{ runner.os }}-docusaurus-${{ hashFiles('docs/yarn.lock') }} - - name: Prepare Preview Environment - if: ${{ github.ref != 'refs/heads/main' && steps.filter.outputs.src == 'true' }} - run: vercel pull --yes --environment=preview --token=${{ secrets.VERCEL_TOKEN }} - - name: Perpare Production Environment - if: ${{ github.ref == 'refs/heads/main' && steps.filter.outputs.src == 'true' }} - run: vercel pull --yes --environment=production --token=${{ secrets.VERCEL_TOKEN }} - - name: Build Preview - if: ${{ github.ref != 'refs/heads/main' && steps.filter.outputs.src == 'true' }} - env: - NODE_OPTIONS: "--max_old_space_size=8192" - run: vercel build --token=${{ secrets.VERCEL_TOKEN }} - - name: Build Production - if: ${{ github.ref == 'refs/heads/main' && steps.filter.outputs.src == 'true' }} - env: - NODE_OPTIONS: "--max_old_space_size=8192" - run: vercel build --prod --token=${{ secrets.VERCEL_TOKEN }} - - name: Deploy Preview - if: ${{ github.ref != 'refs/heads/main' && steps.filter.outputs.src == 'true' }} - run: | - vercel deploy --prebuilt --archive=tgz --token=${{ secrets.VERCEL_TOKEN }} - echo "deploymentUrl=$(cat deployment-url.txt)" >> $GITHUB_OUTPUT - - name: Deploy Production - if: ${{ github.ref == 'refs/heads/main' && steps.filter.outputs.src == 'true'}} - run: | - vercel deploy --prebuilt --archive=tgz --prod --token=${{ secrets.VERCEL_TOKEN }} - - name: Get Preview URL - if: ${{ github.ref != 'refs/heads/main' && steps.filter.outputs.src == 'true' }} - id: myRequest - uses: fjogeleit/http-request-action@v1 - with: - url: 'https://api.vercel.com/v6/deployments?teamId=${{ secrets.VERCEL_ORG_ID }}&app=docs' - method: 'GET' - customHeaders: '{"Authorization": "Bearer ${{ secrets.VERCEL_TOKEN }}"}' - - uses: cloudposse/github-action-jq@main - if: ${{ github.ref != 'refs/heads/main' && steps.filter.outputs.src == 'true' }} - id: current - with: - compact: true - raw-output: true - input: ${{ steps.myRequest.outputs.response }} - script: |- - .deployments[] | select(.meta.githubCommitSha == "${{ github.sha }}") | .url - - uses: mshick/add-pr-comment@v2 - if: ${{ github.ref != 'refs/heads/main' && steps.filter.outputs.src == 'true' }} - with: - message: | - Your build has completed! - - [Preview deployment](https://${{ steps.current.outputs.output }}) diff --git a/docs/vercel.json b/docs/vercel.json index d28b5d23ff..809a72beca 100644 --- a/docs/vercel.json +++ b/docs/vercel.json @@ -1,6 +1,6 @@ { "github": { - "enabled": false + "enabled": true }, "cleanUrls": true, "rewrites": [ From 8b4531c28dd3fc99670c57dd7f4ecda49612bfb8 Mon Sep 17 00:00:00 2001 From: Silvan Date: Sat, 15 Jun 2024 15:12:21 +0200 Subject: [PATCH 28/44] fix(v2): correct eventstore query (#8124) # Which Problems Are Solved Postgres versions < 16 require an alias for subqueries. The query executed in the new eventstore didn't add this alias. # How the Problems Are Solved Added the alias to the subquery --- internal/v2/eventstore/postgres/query.go | 2 +- internal/v2/eventstore/postgres/query_test.go | 18 +++++++++--------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/internal/v2/eventstore/postgres/query.go b/internal/v2/eventstore/postgres/query.go index 3545bfb2b6..0819f9bc1a 100644 --- a/internal/v2/eventstore/postgres/query.go +++ b/internal/v2/eventstore/postgres/query.go @@ -86,7 +86,7 @@ func writeQuery(stmt *database.Statement, query *eventstore.Query) { stmt.WriteString(" FROM (") writeFilters(stmt, query.Filters()) - stmt.WriteRune(')') + stmt.WriteString(") sub") writePagination(stmt, query.Pagination()) } diff --git a/internal/v2/eventstore/postgres/query_test.go b/internal/v2/eventstore/postgres/query_test.go index f73d7341f2..56f506ac50 100644 --- a/internal/v2/eventstore/postgres/query_test.go +++ b/internal/v2/eventstore/postgres/query_test.go @@ -673,7 +673,7 @@ func Test_writeQuery(t *testing.T) { ), }, want: wantQuery{ - query: `SELECT created_at, event_type, "sequence", "position", in_tx_order, payload, creator, "owner", instance_id, aggregate_type, aggregate_id, revision FROM ((SELECT created_at, event_type, "sequence", "position", in_tx_order, payload, creator, "owner", instance_id, aggregate_type, aggregate_id, revision FROM eventstore.events2 WHERE instance_id = $1 ORDER BY position, in_tx_order)) ORDER BY position, in_tx_order`, + query: `SELECT created_at, event_type, "sequence", "position", in_tx_order, payload, creator, "owner", instance_id, aggregate_type, aggregate_id, revision FROM ((SELECT created_at, event_type, "sequence", "position", in_tx_order, payload, creator, "owner", instance_id, aggregate_type, aggregate_id, revision FROM eventstore.events2 WHERE instance_id = $1 ORDER BY position, in_tx_order)) sub ORDER BY position, in_tx_order`, args: []any{"i1"}, }, }, @@ -694,7 +694,7 @@ func Test_writeQuery(t *testing.T) { ), }, want: wantQuery{ - query: `SELECT created_at, event_type, "sequence", "position", in_tx_order, payload, creator, "owner", instance_id, aggregate_type, aggregate_id, revision FROM ((SELECT created_at, event_type, "sequence", "position", in_tx_order, payload, creator, "owner", instance_id, aggregate_type, aggregate_id, revision FROM eventstore.events2 WHERE instance_id = $1 AND (aggregate_type = $2 AND aggregate_id = ANY($3)) ORDER BY position, in_tx_order)) ORDER BY position, in_tx_order`, + query: `SELECT created_at, event_type, "sequence", "position", in_tx_order, payload, creator, "owner", instance_id, aggregate_type, aggregate_id, revision FROM ((SELECT created_at, event_type, "sequence", "position", in_tx_order, payload, creator, "owner", instance_id, aggregate_type, aggregate_id, revision FROM eventstore.events2 WHERE instance_id = $1 AND (aggregate_type = $2 AND aggregate_id = ANY($3)) ORDER BY position, in_tx_order)) sub ORDER BY position, in_tx_order`, args: []any{"i1", "user", []string{"a", "b"}}, }, }, @@ -723,7 +723,7 @@ func Test_writeQuery(t *testing.T) { ), }, want: wantQuery{ - query: `SELECT created_at, event_type, "sequence", "position", in_tx_order, payload, creator, "owner", instance_id, aggregate_type, aggregate_id, revision FROM ((SELECT created_at, event_type, "sequence", "position", in_tx_order, payload, creator, "owner", instance_id, aggregate_type, aggregate_id, revision FROM eventstore.events2 WHERE instance_id = $1 AND (aggregate_type = $2 AND aggregate_id = ANY($3)) ORDER BY position, in_tx_order) UNION ALL (SELECT created_at, event_type, "sequence", "position", in_tx_order, payload, creator, "owner", instance_id, aggregate_type, aggregate_id, revision FROM eventstore.events2 WHERE instance_id = $4 AND (aggregate_type = $5 AND event_type = $6) ORDER BY position, in_tx_order)) ORDER BY position, in_tx_order`, + query: `SELECT created_at, event_type, "sequence", "position", in_tx_order, payload, creator, "owner", instance_id, aggregate_type, aggregate_id, revision FROM ((SELECT created_at, event_type, "sequence", "position", in_tx_order, payload, creator, "owner", instance_id, aggregate_type, aggregate_id, revision FROM eventstore.events2 WHERE instance_id = $1 AND (aggregate_type = $2 AND aggregate_id = ANY($3)) ORDER BY position, in_tx_order) UNION ALL (SELECT created_at, event_type, "sequence", "position", in_tx_order, payload, creator, "owner", instance_id, aggregate_type, aggregate_id, revision FROM eventstore.events2 WHERE instance_id = $4 AND (aggregate_type = $5 AND event_type = $6) ORDER BY position, in_tx_order)) sub ORDER BY position, in_tx_order`, args: []any{"i1", "user", []string{"a", "b"}, "i1", "org", "org.added"}, }, }, @@ -760,7 +760,7 @@ func Test_writeQueryUse_examples(t *testing.T) { ), }, want: wantQuery{ - query: `SELECT created_at, event_type, "sequence", "position", in_tx_order, payload, creator, "owner", instance_id, aggregate_type, aggregate_id, revision FROM ((SELECT created_at, event_type, "sequence", "position", in_tx_order, payload, creator, "owner", instance_id, aggregate_type, aggregate_id, revision FROM eventstore.events2 WHERE instance_id = $1 AND aggregate_type = $2 ORDER BY position, in_tx_order)) ORDER BY position, in_tx_order`, + query: `SELECT created_at, event_type, "sequence", "position", in_tx_order, payload, creator, "owner", instance_id, aggregate_type, aggregate_id, revision FROM ((SELECT created_at, event_type, "sequence", "position", in_tx_order, payload, creator, "owner", instance_id, aggregate_type, aggregate_id, revision FROM eventstore.events2 WHERE instance_id = $1 AND aggregate_type = $2 ORDER BY position, in_tx_order)) sub ORDER BY position, in_tx_order`, args: []any{ "instance", "aggregate", @@ -782,7 +782,7 @@ func Test_writeQueryUse_examples(t *testing.T) { ), }, want: wantQuery{ - query: `SELECT created_at, event_type, "sequence", "position", in_tx_order, payload, creator, "owner", instance_id, aggregate_type, aggregate_id, revision FROM ((SELECT created_at, event_type, "sequence", "position", in_tx_order, payload, creator, "owner", instance_id, aggregate_type, aggregate_id, revision FROM eventstore.events2 WHERE instance_id = $1 AND aggregate_type = $2 ORDER BY position DESC, in_tx_order DESC)) ORDER BY position DESC, in_tx_order DESC`, + query: `SELECT created_at, event_type, "sequence", "position", in_tx_order, payload, creator, "owner", instance_id, aggregate_type, aggregate_id, revision FROM ((SELECT created_at, event_type, "sequence", "position", in_tx_order, payload, creator, "owner", instance_id, aggregate_type, aggregate_id, revision FROM eventstore.events2 WHERE instance_id = $1 AND aggregate_type = $2 ORDER BY position DESC, in_tx_order DESC)) sub ORDER BY position DESC, in_tx_order DESC`, args: []any{ "instance", "aggregate", @@ -807,7 +807,7 @@ func Test_writeQueryUse_examples(t *testing.T) { ), }, want: wantQuery{ - query: `SELECT created_at, event_type, "sequence", "position", in_tx_order, payload, creator, "owner", instance_id, aggregate_type, aggregate_id, revision FROM ((SELECT created_at, event_type, "sequence", "position", in_tx_order, payload, creator, "owner", instance_id, aggregate_type, aggregate_id, revision FROM eventstore.events2 WHERE instance_id = $1 AND aggregate_type = $2 ORDER BY position, in_tx_order) UNION ALL (SELECT created_at, event_type, "sequence", "position", in_tx_order, payload, creator, "owner", instance_id, aggregate_type, aggregate_id, revision FROM eventstore.events2 WHERE instance_id = $3 AND (aggregate_type = $4 OR aggregate_type = $5) ORDER BY position, in_tx_order)) ORDER BY position, in_tx_order`, + query: `SELECT created_at, event_type, "sequence", "position", in_tx_order, payload, creator, "owner", instance_id, aggregate_type, aggregate_id, revision FROM ((SELECT created_at, event_type, "sequence", "position", in_tx_order, payload, creator, "owner", instance_id, aggregate_type, aggregate_id, revision FROM eventstore.events2 WHERE instance_id = $1 AND aggregate_type = $2 ORDER BY position, in_tx_order) UNION ALL (SELECT created_at, event_type, "sequence", "position", in_tx_order, payload, creator, "owner", instance_id, aggregate_type, aggregate_id, revision FROM eventstore.events2 WHERE instance_id = $3 AND (aggregate_type = $4 OR aggregate_type = $5) ORDER BY position, in_tx_order)) sub ORDER BY position, in_tx_order`, args: []any{ "instance", "agg1", @@ -835,7 +835,7 @@ func Test_writeQueryUse_examples(t *testing.T) { ), }, want: wantQuery{ - query: `SELECT created_at, event_type, "sequence", "position", in_tx_order, payload, creator, "owner", instance_id, aggregate_type, aggregate_id, revision FROM ((SELECT created_at, event_type, "sequence", "position", in_tx_order, payload, creator, "owner", instance_id, aggregate_type, aggregate_id, revision FROM eventstore.events2 WHERE instance_id = $1 AND (aggregate_type = $2 AND aggregate_id = $3) ORDER BY position, in_tx_order) UNION ALL (SELECT created_at, event_type, "sequence", "position", in_tx_order, payload, creator, "owner", instance_id, aggregate_type, aggregate_id, revision FROM eventstore.events2 WHERE instance_id = $4 AND ((aggregate_type = $5 AND aggregate_id = $6) OR aggregate_type = $7) ORDER BY position, in_tx_order)) ORDER BY position, in_tx_order`, + query: `SELECT created_at, event_type, "sequence", "position", in_tx_order, payload, creator, "owner", instance_id, aggregate_type, aggregate_id, revision FROM ((SELECT created_at, event_type, "sequence", "position", in_tx_order, payload, creator, "owner", instance_id, aggregate_type, aggregate_id, revision FROM eventstore.events2 WHERE instance_id = $1 AND (aggregate_type = $2 AND aggregate_id = $3) ORDER BY position, in_tx_order) UNION ALL (SELECT created_at, event_type, "sequence", "position", in_tx_order, payload, creator, "owner", instance_id, aggregate_type, aggregate_id, revision FROM eventstore.events2 WHERE instance_id = $4 AND ((aggregate_type = $5 AND aggregate_id = $6) OR aggregate_type = $7) ORDER BY position, in_tx_order)) sub ORDER BY position, in_tx_order`, args: []any{ "instance", "agg1", @@ -870,7 +870,7 @@ func Test_writeQueryUse_examples(t *testing.T) { ), }, want: wantQuery{ - query: `SELECT created_at, event_type, "sequence", "position", in_tx_order, payload, creator, "owner", instance_id, aggregate_type, aggregate_id, revision FROM ((SELECT created_at, event_type, "sequence", "position", in_tx_order, payload, creator, "owner", instance_id, aggregate_type, aggregate_id, revision FROM eventstore.events2 WHERE instance_id = $1 AND ((aggregate_type = $2 AND aggregate_id = ANY($3)) OR (aggregate_type = $4 AND aggregate_id = $5) OR (aggregate_type = $6 AND aggregate_id = $7)) ORDER BY position, in_tx_order)) ORDER BY position, in_tx_order`, + query: `SELECT created_at, event_type, "sequence", "position", in_tx_order, payload, creator, "owner", instance_id, aggregate_type, aggregate_id, revision FROM ((SELECT created_at, event_type, "sequence", "position", in_tx_order, payload, creator, "owner", instance_id, aggregate_type, aggregate_id, revision FROM eventstore.events2 WHERE instance_id = $1 AND ((aggregate_type = $2 AND aggregate_id = ANY($3)) OR (aggregate_type = $4 AND aggregate_id = $5) OR (aggregate_type = $6 AND aggregate_id = $7)) ORDER BY position, in_tx_order)) sub ORDER BY position, in_tx_order`, args: []any{ "instance", "agg1", @@ -1037,7 +1037,7 @@ func Test_writeQueryUse_examples(t *testing.T) { ), }, want: wantQuery{ - query: `SELECT created_at, event_type, "sequence", "position", in_tx_order, payload, creator, "owner", instance_id, aggregate_type, aggregate_id, revision FROM ((SELECT created_at, event_type, "sequence", "position", in_tx_order, payload, creator, "owner", instance_id, aggregate_type, aggregate_id, revision FROM eventstore.events2 WHERE instance_id = $1 AND (aggregate_type = $2 AND event_type = $3) ORDER BY position, in_tx_order LIMIT $4) UNION ALL (SELECT created_at, event_type, "sequence", "position", in_tx_order, payload, creator, "owner", instance_id, aggregate_type, aggregate_id, revision FROM eventstore.events2 WHERE instance_id = $5 AND (aggregate_type = $6 AND event_type = $7) ORDER BY position, in_tx_order LIMIT $8) UNION ALL (SELECT created_at, event_type, "sequence", "position", in_tx_order, payload, creator, "owner", instance_id, aggregate_type, aggregate_id, revision FROM eventstore.events2 WHERE instance_id = $9 AND (aggregate_type = $10 AND (event_type = $11 AND NOT(creator = ANY($12)))) ORDER BY position, in_tx_order LIMIT $13) UNION ALL (SELECT created_at, event_type, "sequence", "position", in_tx_order, payload, creator, "owner", instance_id, aggregate_type, aggregate_id, revision FROM eventstore.events2 WHERE instance_id = $14 AND (aggregate_type = $15 AND (event_type = $16 AND NOT(creator = ANY($17)))) ORDER BY position, in_tx_order LIMIT $18) UNION ALL (SELECT created_at, event_type, "sequence", "position", in_tx_order, payload, creator, "owner", instance_id, aggregate_type, aggregate_id, revision FROM eventstore.events2 WHERE instance_id = $19 AND (aggregate_type = $20 AND (event_type = $21 AND NOT(creator = ANY($22)))) ORDER BY position, in_tx_order LIMIT $23) UNION ALL (SELECT created_at, event_type, "sequence", "position", in_tx_order, payload, creator, "owner", instance_id, aggregate_type, aggregate_id, revision FROM eventstore.events2 WHERE instance_id = $24 AND (aggregate_type = $25 AND event_type = $26) AND ((position = $27 AND in_tx_order > $28) OR position > $29) ORDER BY position, in_tx_order) UNION ALL (SELECT created_at, event_type, "sequence", "position", in_tx_order, payload, creator, "owner", instance_id, aggregate_type, aggregate_id, revision FROM eventstore.events2 WHERE instance_id = $30 AND ((aggregate_type = $31 AND event_type = ANY($32)) OR (aggregate_type = $33 AND event_type = ANY($34))) ORDER BY position, in_tx_order LIMIT $35) UNION ALL (SELECT created_at, event_type, "sequence", "position", in_tx_order, payload, creator, "owner", instance_id, aggregate_type, aggregate_id, revision FROM eventstore.events2 WHERE instance_id = $36 AND ((aggregate_type = $37 AND event_type = $38) OR (aggregate_type = $39 AND event_type = $40)) ORDER BY position, in_tx_order LIMIT $41) UNION ALL (SELECT created_at, event_type, "sequence", "position", in_tx_order, payload, creator, "owner", instance_id, aggregate_type, aggregate_id, revision FROM eventstore.events2 WHERE instance_id = $42 AND (aggregate_type = $43 AND (event_type = $44 AND NOT(creator = ANY($45)))) ORDER BY position, in_tx_order LIMIT $46)) ORDER BY position, in_tx_order`, + query: `SELECT created_at, event_type, "sequence", "position", in_tx_order, payload, creator, "owner", instance_id, aggregate_type, aggregate_id, revision FROM ((SELECT created_at, event_type, "sequence", "position", in_tx_order, payload, creator, "owner", instance_id, aggregate_type, aggregate_id, revision FROM eventstore.events2 WHERE instance_id = $1 AND (aggregate_type = $2 AND event_type = $3) ORDER BY position, in_tx_order LIMIT $4) UNION ALL (SELECT created_at, event_type, "sequence", "position", in_tx_order, payload, creator, "owner", instance_id, aggregate_type, aggregate_id, revision FROM eventstore.events2 WHERE instance_id = $5 AND (aggregate_type = $6 AND event_type = $7) ORDER BY position, in_tx_order LIMIT $8) UNION ALL (SELECT created_at, event_type, "sequence", "position", in_tx_order, payload, creator, "owner", instance_id, aggregate_type, aggregate_id, revision FROM eventstore.events2 WHERE instance_id = $9 AND (aggregate_type = $10 AND (event_type = $11 AND NOT(creator = ANY($12)))) ORDER BY position, in_tx_order LIMIT $13) UNION ALL (SELECT created_at, event_type, "sequence", "position", in_tx_order, payload, creator, "owner", instance_id, aggregate_type, aggregate_id, revision FROM eventstore.events2 WHERE instance_id = $14 AND (aggregate_type = $15 AND (event_type = $16 AND NOT(creator = ANY($17)))) ORDER BY position, in_tx_order LIMIT $18) UNION ALL (SELECT created_at, event_type, "sequence", "position", in_tx_order, payload, creator, "owner", instance_id, aggregate_type, aggregate_id, revision FROM eventstore.events2 WHERE instance_id = $19 AND (aggregate_type = $20 AND (event_type = $21 AND NOT(creator = ANY($22)))) ORDER BY position, in_tx_order LIMIT $23) UNION ALL (SELECT created_at, event_type, "sequence", "position", in_tx_order, payload, creator, "owner", instance_id, aggregate_type, aggregate_id, revision FROM eventstore.events2 WHERE instance_id = $24 AND (aggregate_type = $25 AND event_type = $26) AND ((position = $27 AND in_tx_order > $28) OR position > $29) ORDER BY position, in_tx_order) UNION ALL (SELECT created_at, event_type, "sequence", "position", in_tx_order, payload, creator, "owner", instance_id, aggregate_type, aggregate_id, revision FROM eventstore.events2 WHERE instance_id = $30 AND ((aggregate_type = $31 AND event_type = ANY($32)) OR (aggregate_type = $33 AND event_type = ANY($34))) ORDER BY position, in_tx_order LIMIT $35) UNION ALL (SELECT created_at, event_type, "sequence", "position", in_tx_order, payload, creator, "owner", instance_id, aggregate_type, aggregate_id, revision FROM eventstore.events2 WHERE instance_id = $36 AND ((aggregate_type = $37 AND event_type = $38) OR (aggregate_type = $39 AND event_type = $40)) ORDER BY position, in_tx_order LIMIT $41) UNION ALL (SELECT created_at, event_type, "sequence", "position", in_tx_order, payload, creator, "owner", instance_id, aggregate_type, aggregate_id, revision FROM eventstore.events2 WHERE instance_id = $42 AND (aggregate_type = $43 AND (event_type = $44 AND NOT(creator = ANY($45)))) ORDER BY position, in_tx_order LIMIT $46)) sub ORDER BY position, in_tx_order`, args: []any{ "instance", "instance", From 18222008b6071f0254082f524c75a40ce4dde168 Mon Sep 17 00:00:00 2001 From: Jesper We Date: Sat, 15 Jun 2024 15:45:19 +0200 Subject: [PATCH 29/44] feat: Contribute i18n swedish language (#8105) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit # Which Problems Are Solved - Swedish speakers cannot use their beautiful native language ;-) # How the Problems Are Solved - Contributes Swedish language for Login, Console, common texts and Emails # Additional Changes - none # Additional Context - The PR currently provides all translation files according to https://github.com/zitadel/zitadel/blob/main/CONTRIBUTING.md#contribute-internationalization. --------- Co-authored-by: Tim Möhlmann Co-authored-by: Livio Spring --- console/src/app/app.module.ts | 3 + console/src/app/utils/language.ts | 4 +- console/src/assets/i18n/bg.json | 9 +- console/src/assets/i18n/cs.json | 9 +- console/src/assets/i18n/de.json | 9 +- console/src/assets/i18n/en.json | 9 +- console/src/assets/i18n/es.json | 9 +- console/src/assets/i18n/fr.json | 9 +- console/src/assets/i18n/it.json | 9 +- console/src/assets/i18n/ja.json | 9 +- console/src/assets/i18n/mk.json | 9 +- console/src/assets/i18n/nl.json | 9 +- console/src/assets/i18n/pl.json | 9 +- console/src/assets/i18n/pt.json | 9 +- console/src/assets/i18n/ru.json | 9 +- console/src/assets/i18n/sv.json | 2645 +++++++++++++++++ console/src/assets/i18n/zh.json | 9 +- docs/docs/guides/manage/customize/texts.md | 1 + internal/api/ui/login/static/i18n/bg.yaml | 3 + internal/api/ui/login/static/i18n/cs.yaml | 3 + internal/api/ui/login/static/i18n/de.yaml | 3 + internal/api/ui/login/static/i18n/en.yaml | 3 + internal/api/ui/login/static/i18n/es.yaml | 3 + internal/api/ui/login/static/i18n/fr.yaml | 3 + internal/api/ui/login/static/i18n/it.yaml | 3 + internal/api/ui/login/static/i18n/ja.yaml | 3 + internal/api/ui/login/static/i18n/mk.yaml | 3 + internal/api/ui/login/static/i18n/nl.yaml | 3 + internal/api/ui/login/static/i18n/pl.yaml | 3 + internal/api/ui/login/static/i18n/pt.yaml | 3 + internal/api/ui/login/static/i18n/ru.yaml | 3 + internal/api/ui/login/static/i18n/sv.yaml | 501 ++++ internal/api/ui/login/static/i18n/zh.yaml | 3 + .../templates/external_not_found_option.html | 4 +- internal/notification/static/i18n/sv.yaml | 61 + internal/static/i18n/sv.yaml | 1343 +++++++++ 36 files changed, 4685 insertions(+), 45 deletions(-) create mode 100644 console/src/assets/i18n/sv.json create mode 100644 internal/api/ui/login/static/i18n/sv.yaml create mode 100644 internal/notification/static/i18n/sv.yaml create mode 100644 internal/static/i18n/sv.yaml diff --git a/console/src/app/app.module.ts b/console/src/app/app.module.ts index 4796d7acb8..51e1fb744d 100644 --- a/console/src/app/app.module.ts +++ b/console/src/app/app.module.ts @@ -14,6 +14,7 @@ import localePt from '@angular/common/locales/pt'; import localeZh from '@angular/common/locales/zh'; import localeRu from '@angular/common/locales/ru'; import localeNl from '@angular/common/locales/nl'; +import localeSv from '@angular/common/locales/sv'; import { APP_INITIALIZER, NgModule } from '@angular/core'; import { MatNativeDateModule } from '@angular/material/core'; import { MatDialogModule } from '@angular/material/dialog'; @@ -99,6 +100,8 @@ registerLocaleData(localeCs); i18nIsoCountries.registerLocale(require('i18n-iso-countries/langs/cs.json')); registerLocaleData(localeNl); i18nIsoCountries.registerLocale(require('i18n-iso-countries/langs/nl.json')); +registerLocaleData(localeSv); +i18nIsoCountries.registerLocale(require('i18n-iso-countries/langs/sv.json')); export class WebpackTranslateLoader implements TranslateLoader { getTranslation(lang: string): Observable { diff --git a/console/src/app/utils/language.ts b/console/src/app/utils/language.ts index 41fea300c6..1177716434 100644 --- a/console/src/app/utils/language.ts +++ b/console/src/app/utils/language.ts @@ -1,3 +1,3 @@ -export const supportedLanguages = ['de', 'en', 'es', 'fr', 'it', 'ja', 'pl', 'zh', 'bg', 'pt', 'mk', 'cs', 'ru', 'nl']; -export const supportedLanguagesRegexp: RegExp = /de|en|es|fr|it|ja|pl|zh|bg|pt|mk|cs|ru|nl/; +export const supportedLanguages = ['de', 'en', 'es', 'fr', 'it', 'ja', 'pl', 'zh', 'bg', 'pt', 'mk', 'cs', 'ru', 'nl', 'sv']; +export const supportedLanguagesRegexp: RegExp = /de|en|es|fr|it|ja|pl|zh|bg|pt|mk|cs|ru|nl|sv/; export const fallbackLanguage: string = 'en'; diff --git a/console/src/assets/i18n/bg.json b/console/src/assets/i18n/bg.json index 4a1131920a..6589d79ff0 100644 --- a/console/src/assets/i18n/bg.json +++ b/console/src/assets/i18n/bg.json @@ -1373,7 +1373,8 @@ "mk": "Македонски", "cs": "Čeština", "ru": "Русский", - "nl": "Nederlands" + "nl": "Nederlands", + "sv": "Svenska" } }, "SMTP": { @@ -1602,7 +1603,8 @@ "mk": "Македонски", "cs": "Čeština", "ru": "Русский", - "nl": "Nederlands" + "nl": "Nederlands", + "sv": "Svenska" }, "KEYS": { "emailVerificationDoneText": "Проверката на имейл е извършена", @@ -2531,7 +2533,8 @@ "mk": "Македонски", "cs": "Čeština", "ru": "Русский", - "nl": "Nederlands" + "nl": "Nederlands", + "sv": "Svenska" }, "MEMBER": { "ADD": "Добавяне на мениджър", diff --git a/console/src/assets/i18n/cs.json b/console/src/assets/i18n/cs.json index f7b098c098..e72ef21840 100644 --- a/console/src/assets/i18n/cs.json +++ b/console/src/assets/i18n/cs.json @@ -1380,7 +1380,8 @@ "mk": "Македонски", "cs": "Čeština", "ru": "Русский", - "nl": "Nederlands" + "nl": "Nederlands", + "sv": "Svenska" } }, "SMTP": { @@ -1609,7 +1610,8 @@ "mk": "Македонски", "cs": "Čeština", "ru": "Русский", - "nl": "Nederlands" + "nl": "Nederlands", + "sv": "Svenska" }, "KEYS": { "emailVerificationDoneText": "Ověření e-mailu dokončeno", @@ -2550,7 +2552,8 @@ "mk": "Македонски", "cs": "Čeština", "ru": "Русский", - "nl": "Nederlands" + "nl": "Nederlands", + "sv": "Svenska" }, "MEMBER": { "ADD": "Přidat manažera", diff --git a/console/src/assets/i18n/de.json b/console/src/assets/i18n/de.json index 4c595773c4..8b5f09929d 100644 --- a/console/src/assets/i18n/de.json +++ b/console/src/assets/i18n/de.json @@ -1379,7 +1379,8 @@ "mk": "Македонски", "cs": "Čeština", "ru": "Русский", - "nl": "Nederlands" + "nl": "Nederlands", + "sv": "Svenska" } }, "SMTP": { @@ -1608,7 +1609,8 @@ "mk": "Македонски", "cs": "Čeština", "ru": "Русский", - "nl": "Nederlands" + "nl": "Nederlands", + "sv": "Svenska" }, "KEYS": { "emailVerificationDoneText": "Email Verification erfolgreich", @@ -2540,7 +2542,8 @@ "mk": "Македонски", "cs": "Čeština", "ru": "Русский", - "nl": "Nederlands" + "nl": "Nederlands", + "sv": "Svenska" }, "MEMBER": { "ADD": "Manager hinzufügen", diff --git a/console/src/assets/i18n/en.json b/console/src/assets/i18n/en.json index 8a50cae2cf..70a4bc63c8 100644 --- a/console/src/assets/i18n/en.json +++ b/console/src/assets/i18n/en.json @@ -1380,7 +1380,8 @@ "mk": "Македонски", "cs": "Čeština", "ru": "Русский", - "nl": "Nederlands" + "nl": "Nederlands", + "sv": "Svenska" } }, "SMTP": { @@ -1609,7 +1610,8 @@ "mk": "Македонски", "cs": "Čeština", "ru": "Русский", - "nl": "Nederlands" + "nl": "Nederlands", + "sv": "Svenska" }, "KEYS": { "emailVerificationDoneText": "Email verification done", @@ -2562,7 +2564,8 @@ "mk": "Македонски", "cs": "Čeština", "ru": "Русский", - "nl": "Nederlands" + "nl": "Nederlands", + "sv": "Svenska" }, "MEMBER": { "ADD": "Add a Manager", diff --git a/console/src/assets/i18n/es.json b/console/src/assets/i18n/es.json index d535f44252..6c6f1b1dbb 100644 --- a/console/src/assets/i18n/es.json +++ b/console/src/assets/i18n/es.json @@ -1381,7 +1381,8 @@ "mk": "Македонски", "cs": "Čeština", "ru": "Русский", - "nl": "Nederlands" + "nl": "Nederlands", + "sv": "Svenska" } }, "SMTP": { @@ -1610,7 +1611,8 @@ "mk": "Македонски", "cs": "Čeština", "ru": "Русский", - "nl": "Nederlands" + "nl": "Nederlands", + "sv": "Svenska" }, "KEYS": { "emailVerificationDoneText": "Verificación de email realizada", @@ -2538,7 +2540,8 @@ "mk": "Македонски", "cs": "Čeština", "ru": "Русский", - "nl": "Nederlands" + "nl": "Nederlands", + "sv": "Svenska" }, "MEMBER": { "ADD": "Añadir un Mánager", diff --git a/console/src/assets/i18n/fr.json b/console/src/assets/i18n/fr.json index 110f0589d3..c2104d9016 100644 --- a/console/src/assets/i18n/fr.json +++ b/console/src/assets/i18n/fr.json @@ -1379,7 +1379,8 @@ "mk": "Македонски", "cs": "Čeština", "ru": "Русский", - "nl": "Nederlands" + "nl": "Nederlands", + "sv": "Svenska" } }, "SMTP": { @@ -1608,7 +1609,8 @@ "mk": "Македонски", "cs": "Čeština", "ru": "Русский", - "nl": "Nederlands" + "nl": "Nederlands", + "sv": "Svenska" }, "KEYS": { "emailVerificationDoneText": "Vérification de l'e-mail effectuée", @@ -2541,7 +2543,8 @@ "mk": "Македонски", "cs": "Čeština", "ru": "Русский", - "nl": "Nederlands" + "nl": "Nederlands", + "sv": "Svenska" }, "MEMBER": { "ADD": "Ajouter un responsable", diff --git a/console/src/assets/i18n/it.json b/console/src/assets/i18n/it.json index 258635148e..2a1003db6b 100644 --- a/console/src/assets/i18n/it.json +++ b/console/src/assets/i18n/it.json @@ -1379,7 +1379,8 @@ "mk": "Македонски", "cs": "Čeština", "ru": "Русский", - "nl": "Nederlands" + "nl": "Nederlands", + "sv": "Svenska" } }, "SMTP": { @@ -1608,7 +1609,8 @@ "mk": "Македонски", "cs": "Čeština", "ru": "Русский", - "nl": "Nederlands" + "nl": "Nederlands", + "sv": "Svenska" }, "KEYS": { "emailVerificationDoneText": "Verifica dell'e-mail terminata con successo.", @@ -2541,7 +2543,8 @@ "mk": "Македонски", "cs": "Čeština", "ru": "Русский", - "nl": "Nederlands" + "nl": "Nederlands", + "sv": "Svenska" }, "MEMBER": { "ADD": "Aggiungi un manager", diff --git a/console/src/assets/i18n/ja.json b/console/src/assets/i18n/ja.json index 30f1f8485c..d435a53372 100644 --- a/console/src/assets/i18n/ja.json +++ b/console/src/assets/i18n/ja.json @@ -1380,7 +1380,8 @@ "mk": "Македонски", "cs": "Čeština", "ru": "Русский", - "nl": "Nederlands" + "nl": "Nederlands", + "sv": "Svenska" } }, "SMTP": { @@ -1605,7 +1606,8 @@ "mk": "Македонски", "cs": "Čeština", "ru": "Русский", - "nl": "Nederlands" + "nl": "Nederlands", + "sv": "Svenska" }, "KEYS": { "emailVerificationDoneText": "メール認証が完了しました", @@ -2533,7 +2535,8 @@ "mk": "Македонски", "cs": "Čeština", "ru": "Русский", - "nl": "Nederlands" + "nl": "Nederlands", + "sv": "Svenska" }, "MEMBER": { "ADD": "マネージャーを追加する", diff --git a/console/src/assets/i18n/mk.json b/console/src/assets/i18n/mk.json index 55f52bc24b..d337590bce 100644 --- a/console/src/assets/i18n/mk.json +++ b/console/src/assets/i18n/mk.json @@ -1381,7 +1381,8 @@ "mk": "Македонски", "cs": "Čeština", "ru": "Русский", - "nl": "Nederlands" + "nl": "Nederlands", + "sv": "Svenska" } }, "SMTP": { @@ -1610,7 +1611,8 @@ "mk": "Македонски", "cs": "Čeština", "ru": "Русский", - "nl": "Nederlands" + "nl": "Nederlands", + "sv": "Svenska" }, "KEYS": { "emailVerificationDoneText": "Е-поштата е верифицирана", @@ -2538,7 +2540,8 @@ "mk": "Македонски", "cs": "Čeština", "ru": "Русский", - "nl": "Nederlands" + "nl": "Nederlands", + "sv": "Svenska" }, "MEMBER": { "ADD": "Додај Менаџер", diff --git a/console/src/assets/i18n/nl.json b/console/src/assets/i18n/nl.json index c2526c848d..8937aa236f 100644 --- a/console/src/assets/i18n/nl.json +++ b/console/src/assets/i18n/nl.json @@ -1380,7 +1380,8 @@ "mk": "Македонски", "cs": "Čeština", "ru": "Русский", - "nl": "Nederlands" + "nl": "Nederlands", + "sv": "Svenska" } }, "SMTP": { @@ -1609,7 +1610,8 @@ "mk": "Македонски", "cs": "Čeština", "ru": "Русский", - "nl": "Nederlands" + "nl": "Nederlands", + "sv": "Svenska" }, "KEYS": { "emailVerificationDoneText": "E-mail verificatie voltooid", @@ -2559,7 +2561,8 @@ "mk": "Македонски", "cs": "Čeština", "ru": "Русский", - "nl": "Nederlands" + "nl": "Nederlands", + "sv": "Svenska" }, "MEMBER": { "ADD": "Voeg een Manager toe", diff --git a/console/src/assets/i18n/pl.json b/console/src/assets/i18n/pl.json index 65e13ce71f..db0ed46d66 100644 --- a/console/src/assets/i18n/pl.json +++ b/console/src/assets/i18n/pl.json @@ -1379,7 +1379,8 @@ "mk": "Македонски", "cs": "Čeština", "ru": "Русский", - "nl": "Nederlands" + "nl": "Nederlands", + "sv": "Svenska" } }, "SMTP": { @@ -1608,7 +1609,8 @@ "mk": "Македонски", "cs": "Čeština", "ru": "Русский", - "nl": "Nederlands" + "nl": "Nederlands", + "sv": "Svenska" }, "KEYS": { "emailVerificationDoneText": "Weryfikacja adresu e-mail zakończona", @@ -2541,7 +2543,8 @@ "mk": "Македонски", "cs": "Čeština", "ru": "Русский", - "nl": "Nederlands" + "nl": "Nederlands", + "sv": "Svenska" }, "MEMBER": { "ADD": "Dodaj managera", diff --git a/console/src/assets/i18n/pt.json b/console/src/assets/i18n/pt.json index aee0da5a02..744f6008b0 100644 --- a/console/src/assets/i18n/pt.json +++ b/console/src/assets/i18n/pt.json @@ -1381,7 +1381,8 @@ "mk": "Македонски", "cs": "Čeština", "ru": "Русский", - "nl": "Nederlands" + "nl": "Nederlands", + "sv": "Svenska" } }, "SMTP": { @@ -1610,7 +1611,8 @@ "mk": "Македонски", "cs": "Čeština", "ru": "Русский", - "nl": "Nederlands" + "nl": "Nederlands", + "sv": "Svenska" }, "KEYS": { "emailVerificationDoneText": "Verificação de email concluída", @@ -2536,7 +2538,8 @@ "mk": "Македонски", "cs": "Čeština", "ru": "Русский", - "nl": "Nederlands" + "nl": "Nederlands", + "sv": "Svenska" }, "MEMBER": { "ADD": "Adicionar um Gerente", diff --git a/console/src/assets/i18n/ru.json b/console/src/assets/i18n/ru.json index 294039adc9..4e7a7b3e23 100644 --- a/console/src/assets/i18n/ru.json +++ b/console/src/assets/i18n/ru.json @@ -1423,7 +1423,8 @@ "pt": "Portuguese", "mk": "Македонски", "ru": "Русский", - "nl": "Nederlands" + "nl": "Nederlands", + "sv": "Svenska" } }, "SMTP": { @@ -1664,7 +1665,8 @@ "mk": "Македонски", "cs": "Čeština", "ru": "Русский", - "nl": "Nederlands" + "nl": "Nederlands", + "sv": "Svenska" }, "LOCALE": "Код языка", "LOCALES": { @@ -2649,7 +2651,8 @@ "pt": "Portuguese", "mk": "Македонски", "ru": "Русский", - "nl": "Nederlands" + "nl": "Nederlands", + "sv": "Svenska" }, "MEMBER": { "ADD": "Добавить менеджера", diff --git a/console/src/assets/i18n/sv.json b/console/src/assets/i18n/sv.json new file mode 100644 index 0000000000..5c57447b03 --- /dev/null +++ b/console/src/assets/i18n/sv.json @@ -0,0 +1,2645 @@ +{ + "APP_NAME": "ZITADEL", + "DESCRIPTIONS": { + "METADATA_TITLE": "Metadata", + "HOME": { + "TITLE": "Kom igång med ZITADEL", + "NEXT": { + "TITLE": "Dina nästa steg", + "DESCRIPTION": "Slutför följande steg för att säkra din applikation.", + "CREATE_PROJECT": { + "TITLE": "Skapa ett projekt", + "DESCRIPTION": "Lägg till ett projekt och definiera dess roller och behörigheter." + } + }, + "MORE_SHORTCUTS": { + "GET_STARTED": { + "TITLE": "Kom igång", + "DESCRIPTION": "Följ snabbstartsguiden steg för steg och börja bygga omedelbart." + }, + "DOCS": { + "TITLE": "Dokumentation", + "DESCRIPTION": "Utforska ZITADELs kunskapsbas för att bekanta dig med kärnkoncept och idéer. Lär dig hur ZITADEL fungerar och hur du använder det." + }, + "EXAMPLES": { + "TITLE": "Exempel och mjukvaruutvecklingskit", + "DESCRIPTION": "Bläddra bland våra exempel och SDKs för att använda ZITADEL tillsammans med dina favoritprogrammeringsspråk och verktyg." + } + } + }, + "ORG": { + "TITLE": "Organisation", + "DESCRIPTION": "En organisation är värd för användare, projekt med appar, identitetsleverantörer och inställningar som företagsbranding. Vill du dela inställningar över flera organisationer? Konfigurera standardinställningar.", + "METADATA": "Lägg till anpassade attribut till organisationen som dess plats eller en identifierare i ett annat system. Du kan använda denna information i dina åtgärder." + }, + "PROJECTS": { + "TITLE": "Projekt", + "DESCRIPTION": "Ett projekt är värd för en eller flera applikationer som du kan använda för att autentisera dina användare. Du kan också auktorisera dina användare med projekt. För att tillåta användare från andra organisationer att logga in på dina applikationer, ge dem åtkomst till ditt projekt.

Om du inte kan hitta ett projekt, kontakta projektets ägare eller någon med motsvarande rättigheter för att få åtkomst.", + "OWNED": { + "TITLE": "Ägda projekt", + "DESCRIPTION": "Detta är de projekt du äger. Du kan hantera dessa projekts inställningar, behörigheter och applikationer." + }, + "GRANTED": { + "TITLE": "Beviljade projekt", + "DESCRIPTION": "Detta är de projekt som andra organisationer har beviljat dig. Med beviljade projekt kan du ge dina användare åtkomst till andra organisationers applikationer." + } + }, + "USERS": { + "TITLE": "Användare", + "DESCRIPTION": "En användare är en människa eller en maskin som kan få åtkomst till dina applikationer.", + "HUMANS": { + "TITLE": "Användare", + "DESCRIPTION": "Användare autentiserar interaktivt i en webbläsarsession med en inloggningsprompt.", + "METADATA": "Lägg till anpassade attribut till användaren som avdelningen. Du kan använda denna information i dina åtgärder." + }, + "MACHINES": { + "TITLE": "Tjänsteanvändare", + "DESCRIPTION": "Tjänsteanvändare autentiserar icke-interaktivt med en JWT-bärare token signerad med en privat nyckel. De kan också använda en personlig åtkomsttoken.", + "METADATA": "Lägg till anpassade attribut till användaren som autentiseringssystemet. Du kan använda denna information i dina åtgärder." + }, + "SELF": { + "METADATA": "Lägg till anpassade attribut till din användare som din avdelning. Du kan använda denna information i din organisations åtgärder." + } + }, + "AUTHORIZATIONS": { + "TITLE": "Behörigheter", + "DESCRIPTION": "Behörigheter definierar en användares åtkomsträttigheter till ett projekt. Du kan ge en användare åtkomst till ett projekt och definiera användarens roller inom det projektet." + }, + "ACTIONS": { + "TITLE": "Åtgärder", + "DESCRIPTION": "Kör anpassad kod på händelser som inträffar när dina användare autentiserar sig på ZITADEL. Automatisera dina processer, berika dina användares metadata och deras tokens eller meddela externa system.", + "SCRIPTS": { + "TITLE": "Skript", + "DESCRIPTION": "Skriv din JavaScript-kod en gång och trigga den i flera flöden." + }, + "FLOWS": { + "TITLE": "Flöden", + "DESCRIPTION": "Välj ett autentiseringsflöde och trigga din åtgärd vid en specifik händelse inom detta flöde." + } + }, + "SETTINGS": { + "INSTANCE": { + "TITLE": "Instansinställningar", + "DESCRIPTION": "Instansinställningarna är standardinställningarna för alla organisationer. Med rätt behörigheter kan vissa av dem åsidosättas i organisationsinställningarna." + }, + "ORG": { + "TITLE": "Organisationsinställningar", + "DESCRIPTION": "Anpassa inställningarna för din organisation." + }, + "FEATURES": { + "TITLE": "Funktionsinställningar", + "DESCRIPTION": "Lås upp funktioner för din instans." + }, + "IDPS": { + "TITLE": "Identitetsleverantörer", + "DESCRIPTION": "Skapa och aktivera externa identitetsleverantörer. Välj en välkänd leverantör eller konfigurera någon annan OIDC-, OAuth- eller SAML-kompatibel leverantör efter eget val. Du kan till och med använda dina befintliga JWT-tokens som federerade identiteter genom att konfigurera en JWT-identitetsleverantör.", + "NEXT": "Vad nu?", + "SAML": { + "TITLE": "Konfigurera din SAML-identitetsleverantör", + "DESCRIPTION": "ZITADEL är konfigurerad. Nu behöver din SAML-identitetsleverantör lite konfiguration. De flesta leverantörer tillåter dig att bara ladda upp hela ZITADEL-metadata XML. Andra leverantörer ber dig att endast tillhandahålla några specifika URL:er, som till exempel enhets-ID (metadata URL), Assertion Consumer Service (ACS) URL eller Single Logout URL." + }, + "CALLBACK": { + "TITLE": "Konfigurera din {{ provider }} identitetsleverantör", + "DESCRIPTION": "Innan du kan konfigurera ZITADEL, skicka denna URL till din identitetsleverantör för att möjliggöra webbläsarens omdirigering tillbaka till ZITADEL efter autentisering." + }, + "JWT": { + "TITLE": "Använd JWTs som federerade identiteter", + "DESCRIPTION": "JWT-identitetsleverantören gör det möjligt för dig att använda dina befintliga JWT-tokens som federerade identiteter. Denna funktion är praktisk om du redan har en utgivare för JWTs. Med en JWT IdP kan du använda dessa JWTs för att skapa och uppdatera användare i ZITADEL direkt." + }, + "LDAP": { + "TITLE": "Konfigurera ZITADEL för att ansluta till din LDAP-identitetsleverantör", + "DESCRIPTION": "Tillhandahåll anslutningsdetaljerna till din LDAP-server och konfigurera mappningen av dina LDAP-attribut till ZITADEL-attribut." + }, + "AUTOFILL": { + "TITLE": "Autofyll användardata", + "DESCRIPTION": "Använd en åtgärd för att förbättra dina användares upplevelse. Du kan förifylla ZITADELs registreringsformulär med värden från identitetsleverantören." + }, + "ACTIVATE": { + "TITLE": "Aktivera IdP", + "DESCRIPTION": "Din IdP är inte aktiv än. Aktivera den för att tillåta dina användare att logga in." + } + }, + "PW_COMPLEXITY": { + "TITLE": "Lösenordskomplexitet", + "DESCRIPTION": "Säkerställ att dina användare använder starka lösenord genom att definiera komplexitetsregler." + }, + "BRANDING": { + "TITLE": "Branding", + "DESCRIPTION": "Anpassa utseendet och känslan av ditt inloggningsformulär. Kom ihåg att tillämpa din konfiguration när du är klar." + }, + "PRIVACY_POLICY": { + "TITLE": "Externa länkar", + "DESCRIPTION": "Guida dina användare till anpassade externa resurser som visas på inloggningssidan. Användare måste acceptera användarvillkoren och integritetspolicyn innan de kan registrera sig. Ändra länken till din dokumentation eller ställ in en tom sträng för att dölja dokumentationsknappen från konsolen. Lägg till en anpassad extern länk och en anpassad text för den länken i konsolen, eller ställ in dem tomma för att dölja den knappen." + }, + "SMTP_PROVIDER": { + "TITLE": "SMTP-inställningar", + "DESCRIPTION": "Konfigurera din SMTP-server för att använda en domän för avsändaradressen som dina användare känner till och litar på." + }, + "SMS_PROVIDER": { + "TITLE": "SMS-inställningar", + "DESCRIPTION": "För att låsa upp alla ZITADEL-funktioner, konfigurera Twilio för att skicka SMS-meddelanden till dina användare." + }, + "IAM_EVENTS": { + "TITLE": "Händelser", + "DESCRIPTION": "Denna sida visar alla tillståndsändringar i din instans så långt tillbaka som din instans revisionsspårgräns. Filtrera listan efter tidsintervall för felsökningsändamål eller filtrera den efter en aggregering för revisionsändamål." + }, + "IAM_FAILED_EVENTS": { + "TITLE": "Misslyckade händelser", + "DESCRIPTION": "Denna sida visar alla misslyckade händelser i din instans. Om ZITADEL inte beter sig som du förväntar dig, kontrollera alltid denna lista först." + }, + "IAM_VIEWS": { + "TITLE": "Vy", + "DESCRIPTION": "Denna sida visar alla dina databasvyer och när de behandlade sin senaste händelse. Om du saknar data, kontrollera om vyn är uppdaterad." + }, + "LANGUAGES": { + "TITLE": "Språk", + "DESCRIPTION": "Begränsa de språk som inloggningsformuläret och meddelandena översätts till. Om du vill inaktivera några av språken, dra dem till sektionen Ej tillåtna språk. Du kan ange ett tillåtet språk som standardspråk. Om en användares föredragna språk inte är tillåtet, används standardspråket." + }, + "SECRET_GENERATORS": { + "TITLE": "Hemlighetsgeneratorer", + "DESCRIPTION": "Definiera dina hemligheters komplexitet och livslängd. Högre komplexitet och livslängd förbättrar säkerheten, lägre komplexitet och livslängd förbättrar dekrypteringsprestandan." + }, + "SECURITY": { + "TITLE": "Säkerhetsinställningar", + "DESCRIPTION": "Aktivera ZITADEL-funktioner som kan ha säkerhetspåverkan. Du bör verkligen veta vad du gör innan du ändrar dessa inställningar." + }, + "OIDC": { + "TITLE": "OpenID Connect-inställningar", + "DESCRIPTION": "Konfigurera dina OIDC-tokeners livslängd. Använd kortare livslängd för att öka dina användares säkerhet, använd längre livslängd för att öka dina användares bekvämlighet.", + "LABEL_HOURS": "Maximal livslängd i timmar", + "LABEL_DAYS": "Maximal livslängd i dagar", + "ACCESS_TOKEN": { + "TITLE": "Åtkomsttoken", + "DESCRIPTION": "Åtkomsttoken används för att autentisera en användare. Det är en kortlivad token som används för att få åtkomst till användarens data. Använd en kort livslängd för att minimera risken för obehörig åtkomst. Åtkomsttoken kan automatiskt förnyas med en förnyelsetoken." + }, + "ID_TOKEN": { + "TITLE": "ID-token", + "DESCRIPTION": "ID-token är en JSON Web Token (JWT) som innehåller påståenden om användaren. ID-tokenens livslängd bör inte överstiga åtkomsttokenens livslängd." + }, + "REFRESH_TOKEN": { + "TITLE": "Förnyelsetoken", + "DESCRIPTION": "Förnyelsetoken används för att erhålla en ny åtkomsttoken. Det är en långlivad token som används för att förnya åtkomsttokenen. En användare måste manuellt återautentisera när förnyelsetokenen går ut." + }, + "REFRESH_TOKEN_IDLE": { + "TITLE": "Inaktiv förnyelsetoken", + "DESCRIPTION": "Den inaktiva förnyelsetokenens livslängd är den maximala tiden en förnyelsetoken kan vara oanvänd." + } + }, + "MESSAGE_TEXTS": { + "TITLE": "Meddelandetexter", + "DESCRIPTION": "Anpassa texterna i dina notifikationsmail eller SMS-meddelanden. Om du vill inaktivera några av språken, begränsa dem i dina instansers språkinställningar.", + "TYPE_DESCRIPTIONS": { + "DC": "När du hävdar en domän för din organisation, kommer användare som inte använder denna domän i sitt inloggningsnamn att uppmanas att ändra sitt inloggningsnamn för att matcha den hävdade domänen.", + "INIT": "När en användare skapas, kommer de att få ett mail med en länk för att ställa in sitt lösenord.", + "PC": "När en användare ändrar sitt lösenord, kommer de att få en notifikation om ändringen om du har aktiverat detta i notifikationsinställningarna.", + "PL": "När en användare lägger till en lösenordsfri autentiseringsmetod, måste de aktivera den genom att klicka på en länk i ett mail.", + "PR": "När en användare återställer sitt lösenord, kommer de att få ett mail med en länk för att ställa in ett nytt lösenord.", + "VE": "När en användare ändrar sin e-postadress, kommer de att få ett mail med en länk för att verifiera den nya adressen.", + "VP": "När en användare ändrar sitt telefonnummer, kommer de att få ett SMS med en kod för att verifiera det nya numret.", + "VEO": "När en användare lägger till en engångslösenord via e-postmetod, måste de aktivera den genom att ange en kod som skickas till deras e-postadress.", + "VSO": "När en användare lägger till en engångslösenord via SMS-metod, måste de aktivera den genom att ange en kod som skickas till deras telefonnummer." + } + }, + "LOGIN_TEXTS": { + "TITLE": "Inloggningsgränssnittstexter", + "DESCRIPTION": "Anpassa texterna i ditt inloggningsformulär. Om en text är tom, visar platshållaren standardvärdet. Om du vill inaktivera några av språken, begränsa dem i dina instansers språkinställningar." + }, + "DOMAINS": { + "TITLE": "Domäninställningar", + "DESCRIPTION": "Definiera begränsningar för dina domäner och konfigurera dina inloggningsnamnsmönster.", + "REQUIRE_VERIFICATION": { + "TITLE": "Kräv att anpassade domäner verifieras", + "DESCRIPTION": "Om detta är aktiverat, måste organisationsdomäner verifieras innan de kan användas för domänupptäckt eller användarnamnssuffixering." + }, + "LOGIN_NAME_PATTERN": { + "TITLE": "Inloggningsnamnsmönster", + "DESCRIPTION": "Kontrollera mönstret för dina användares inloggningsnamn. ZITADEL väljer din användares organisation så snart de anger sitt inloggningsnamn. Därför måste inloggningsnamnen vara unika över alla organisationer. Om du har användare som har ett konto i flera domäner, kan du säkerställa unikhet genom att suffixera dina inloggningsnamn med organisationsdomänen." + }, + "DOMAIN_VERIFICATION": { + "TITLE": "Domänverifiering", + "DESCRIPTION": "Tillåt endast din organisation att använda de domäner de faktiskt kontrollerar. Om aktiverat, verifieras organisationsdomäner periodiskt genom DNS- eller HTTP-utmaning innan de kan användas. Detta är en säkerhetsfunktion för att förhindra domänkapning." + }, + "SMTP_SENDER_ADDRESS": { + "TITLE": "SMTP-avsändaradress", + "DESCRIPTION": "Tillåt endast en SMTP-avsändaradress om den matchar en av dina instansdomäner." + } + }, + "LOGIN": { + "LIFETIMES": { + "TITLE": "Inloggningstider", + "DESCRIPTION": "Förstärk din säkerhet genom att minska några inloggningsrelaterade maximala livslängder.", + "LABEL": "Maximal livslängd i timmar", + "PW_CHECK": { + "TITLE": "Lösenordskontroll", + "DESCRIPTION": "Dina användare måste ändra sina lösenord under dessa perioder." + }, + "EXT_LOGIN_CHECK": { + "TITLE": "Extern inloggningskontroll", + "DESCRIPTION": "Dina användare omdirigeras till sina externa identitetsleverantörer under dessa perioder." + }, + "MULTI_FACTOR_INIT": { + "TITLE": "Multifaktor initieringskontroll", + "DESCRIPTION": "Dina användare kommer att uppmanas att ställa in en andra faktor eller en tvåfaktor under dessa perioder, om de inte redan har gjort det. En livslängd på 0 inaktiverar denna prompt." + }, + "SECOND_FACTOR_CHECK": { + "TITLE": "Andra faktorkontroll", + "DESCRIPTION": "Dina användare måste återvalidera sin andra faktor under dessa perioder." + }, + "MULTI_FACTOR_CHECK": { + "TITLE": "Tvåfaktorkontroll", + "DESCRIPTION": "Dina användare måste återvalidera sin tvåfaktor under dessa perioder." + } + }, + "FORM": { + "TITLE": "Inloggningsformulär", + "DESCRIPTION": "Anpassa inloggningsformuläret.", + "USERNAME_PASSWORD_ALLOWED": { + "TITLE": "Användarnamn och lösenord tillåtet", + "DESCRIPTION": "Tillåt dina användare att logga in med sitt användarnamn och lösenord. Om detta är inaktiverat, kan dina användare endast logga in med lösenordsfri autentisering eller med en extern identitetsleverantör." + }, + "USER_REGISTRATION_ALLOWED": { + "TITLE": "Användarregistrering tillåten", + "DESCRIPTION": "Tillåt anonyma användare att skapa ett konto." + }, + "ORG_REGISTRATION_ALLOWED": { + "TITLE": "Organisationsregistrering tillåten", + "DESCRIPTION": "Tillåt anonyma användare att skapa en organisation." + }, + "EXTERNAL_LOGIN_ALLOWED": { + "TITLE": "Extern inloggning tillåten", + "DESCRIPTION": "Tillåt dina användare att logga in med en extern identitetsleverantör istället för att använda ZITADEL-användaren för att logga in." + }, + "HIDE_PASSWORD_RESET": { + "TITLE": "Lösenordsåterställning dold", + "DESCRIPTION": "Tillåt inte dina användare att återställa sitt lösenord." + }, + "DOMAIN_DISCOVERY_ALLOWED": { + "TITLE": "Domänupptäckt tillåten", + "DESCRIPTION": "Hitta dina användares organisationer beroende på deras inloggningsnamns domän, till exempel deras e-postadress." + }, + "IGNORE_UNKNOWN_USERNAMES": { + "TITLE": "Ignorera okända användarnamn", + "DESCRIPTION": "Om detta är aktiverat, kommer inloggningsformuläret inte att visa ett felmeddelande om användarnamnet är okänt. Detta hjälper till att förhindra användarnamnsgissning." + }, + "DISABLE_EMAIL_LOGIN": { + "TITLE": "Inaktivera e-postinloggning", + "DESCRIPTION": "Om detta är aktiverat, kan dina användare inte använda sina e-postadresser för att logga in. Observera att om du inaktiverar detta, måste dina användares e-postadresser vara unika över alla organisationer för att kunna logga in." + }, + "DISABLE_PHONE_LOGIN": { + "TITLE": "Inaktivera telefoninloggning", + "DESCRIPTION": "Om detta är aktiverat, kan dina användare inte använda sina telefonnummer för att logga in. Observera att om du inaktiverar detta, måste dina användares telefonnummer vara unika över alla organisationer för att kunna logga in." + } + } + } + } + }, + "PAGINATOR": { + "PREVIOUS": "Föregående", + "NEXT": "Nästa", + "COUNT": "Totalt antal resultat", + "MORE": "Mer" + }, + "FOOTER": { + "LINKS": { + "CONTACT": "Kontakt", + "TOS": "Användarvillkor", + "PP": "Integritetspolicy" + }, + "THEME": { + "DARK": "Mörk", + "LIGHT": "Ljus" + } + }, + "HOME": { + "WELCOME": "Kom igång med ZITADEL", + "DISCLAIMER": "ZITADEL behandlar dina data konfidentiellt och säkert.", + "DISCLAIMERLINK": "Mer information", + "DOCUMENTATION": { + "DESCRIPTION": "Kom igång med ZITADEL snabbt." + }, + "GETSTARTED": { + "DESCRIPTION": "Kom igång med ZITADEL snabbt." + }, + "QUICKSTARTS": { + "LABEL": "Första Steg", + "DESCRIPTION": "Kom igång med ZITADEL snabbt." + }, + "SHORTCUTS": { + "SHORTCUTS": "Genvägar", + "SETTINGS": "Tillgängliga genvägar", + "PROJECTS": "Projekt", + "REORDER": "Håll och dra plattan för att flytta den", + "ADD": "Håll och dra en platta för att lägga till" + } + }, + "ONBOARDING": { + "DESCRIPTION": "Dina nästa steg", + "MOREDESCRIPTION": "fler genvägar", + "COMPLETED": "slutförd", + "DISMISS": "Nej tack, jag är ett proffs.", + "CARD": { + "TITLE": "Få din ZITADEL att fungera", + "DESCRIPTION": "Denna checklista hjälper dig att ställa in din instans och guidar dig genom de mest väsentliga stegen" + }, + "MILESTONES": { + "instance.policy.label.added": { + "title": "Ställ in ditt varumärke", + "description": "Definiera färg och form på din inloggning och ladda upp din logotyp och ikoner.", + "action": "Ställ in varumärke" + }, + "instance.smtp.config.added": { + "title": "Ställ in dina SMTP-inställningar", + "description": "Ställ in dina egna e-postserverinställningar.", + "action": "Ställ in SMTP" + }, + "PROJECT_CREATED": { + "title": "Skapa ett projekt", + "description": "Lägg till ett projekt och definiera dess roller och behörigheter.", + "action": "Skapa projekt" + }, + "APPLICATION_CREATED": { + "title": "Registrera din app", + "description": "Registrera din webb-, native-, API- eller SAML-applikation och ställ in ett autentiseringsflöde.", + "action": "Registrera app" + }, + "AUTHENTICATION_SUCCEEDED_ON_APPLICATION": { + "title": "Logga in på din app", + "description": "Integrera din applikation med ZITADEL för autentisering och testa det genom att logga in med din administratörsanvändare.", + "action": "Logga in" + }, + "user.human.added": { + "title": "Lägg till användare", + "description": "Lägg till dina applikationsanvändare", + "action": "Lägg till användare" + }, + "user.grant.added": { + "title": "Bevilja användare", + "description": "Tillåt användare att få tillgång till din applikation och ställ in deras roll.", + "action": "Bevilja användare" + } + } + }, + "MENU": { + "INSTANCE": "Standardinställningar", + "DASHBOARD": "Hem", + "PERSONAL_INFO": "Personlig Information", + "DOCUMENTATION": "Dokumentation", + "INSTANCEOVERVIEW": "Instans", + "ORGS": "Organisationer", + "VIEWS": "Vy", + "EVENTS": "Händelser", + "FAILEDEVENTS": "Misslyckade Händelser", + "ORGANIZATION": "Organisation", + "PROJECT": "Projekt", + "PROJECTOVERVIEW": "Översikt", + "PROJECTGRANTS": "Beviljanden", + "ROLES": "Roller", + "GRANTEDPROJECT": "Beviljade Projekt", + "HUMANUSERS": "Användare", + "MACHINEUSERS": "Tjänsteanvändare", + "LOGOUT": "Logga ut alla användare", + "NEWORG": "Ny Organisation", + "IAMADMIN": "Du är en IAM-administratör. Observera att du har utökade behörigheter.", + "SHOWORGS": "Visa Alla Organisationer", + "GRANTS": "Behörigheter", + "ACTIONS": "Åtgärder", + "PRIVACY": "Integritet", + "TOS": "Användarvillkor", + "OPENSHORTCUTSTOOLTIP": "Skriv ? för att visa tangentbordsgenvägar", + "SETTINGS": "Inställningar", + "CUSTOMERPORTAL": "Kundportal" + }, + "QUICKSTART": { + "TITLE": "Integrera ZITADEL i din applikation", + "DESCRIPTION": "Integrera ZITADEL i din applikation eller använd ett av våra exempel för att komma igång på några minuter.", + "BTN_START": "Skapa Applikation", + "BTN_LEARNMORE": "Läs Mer", + "CREATEPROJECTFORAPP": "Skapa Projekt {{value}}", + "SELECT_FRAMEWORK": "Välj Ramverk", + "FRAMEWORK": "Ramverk", + "FRAMEWORK_OTHER": "Annat (OIDC, SAML, API)", + "ALMOSTDONE": "Du är nästan klar.", + "REVIEWCONFIGURATION": "Granska Konfiguration", + "REVIEWCONFIGURATION_DESCRIPTION": "Vi har skapat en grundläggande konfiguration för {{value}} applikationer. Du kan anpassa denna konfiguration efter dina behov efter skapandet.", + "REDIRECTS": "Konfigurera omdirigeringar", + "DEVMODEWARN": "Utvecklingsläge är aktiverat som standard. Du kan uppdatera värden för produktion senare.", + "GUIDE": "Guide", + "BROWSEEXAMPLES": "Bläddra bland Exempel och SDKs", + "DUPLICATEAPPRENAME": "En app med samma namn finns redan. Vänligen välj ett annat namn.", + "DIALOG": { + "CHANGE": { + "TITLE": "Byt Ramverk", + "DESCRIPTION": "Välj ett av de tillgängliga ramverken för snabb inställning av din applikation." + } + } + }, + "ACTIONS": { + "ACTIONS": "Åtgärder", + "FILTER": "Filter", + "RENAME": "Byt namn", + "SET": "Sätt", + "COPY": "Kopiera till urklipp", + "COPIED": "Kopierat till urklipp.", + "RESET": "Återställ", + "RESETDEFAULT": "Återställ till standard", + "RESETTO": "Återställ till: ", + "RESETCURRENT": "Återställ till nuvarande", + "SHOW": "Visa", + "HIDE": "Dölj", + "SAVE": "Spara", + "SAVENOW": "Spara nu", + "NEW": "Ny", + "ADD": "Lägg till", + "CREATE": "Skapa", + "CONTINUE": "Fortsätt", + "CONTINUEWITH": "Fortsätt med {{value}}", + "BACK": "Tillbaka", + "CLOSE": "Stäng", + "CLEAR": "Rensa", + "CANCEL": "Avbryt", + "INFO": "Info", + "OK": "OK", + "SELECT": "Välj", + "VIEW": "Visa", + "SELECTIONDELETE": "Radera val", + "DELETE": "Radera", + "REMOVE": "Ta bort", + "VERIFY": "Verifiera", + "FINISH": "Avsluta", + "FINISHED": "Stäng", + "CHANGE": "Ändra", + "REACTIVATE": "Återaktivera", + "ACTIVATE": "Aktivera", + "DEACTIVATE": "Inaktivera", + "REFRESH": "Uppdatera", + "LOGIN": "Logga in", + "EDIT": "Redigera", + "PIN": "Fäst / Lossa", + "CONFIGURE": "Konfigurera", + "SEND": "Skicka", + "NEWVALUE": "Nytt värde", + "RESTORE": "Återställ", + "CONTINUEWITHOUTSAVE": "Fortsätt utan att spara", + "OF": "av", + "PREVIOUS": "Föregående", + "NEXT": "Nästa", + "MORE": "mer", + "STEP": "Steg", + "SETUP": "Inställning", + "UNSAVEDCHANGES": "Osparade ändringar", + "UNSAVED": { + "DIALOG": { + "DESCRIPTION": "Är du säker på att du vill förkasta denna nya åtgärd? Din åtgärd kommer att gå förlorad", + "CANCEL": "Avbryt", + "DISCARD": "Förkasta" + } + }, + "TABLE": { + "SHOWUSER": "Visa användare {{value}}" + }, + "DOWNLOAD": "Ladda ner" + }, + "MEMBERROLES": { + "IAM_OWNER": "Har kontroll över hela instansen, inklusive alla organisationer", + "IAM_OWNER_VIEWER": "Har behörighet att granska hela instansen, inklusive alla organisationer", + "IAM_ORG_MANAGER": "Har behörighet att skapa och hantera organisationer", + "IAM_USER_MANAGER": "Har behörighet att skapa och hantera användare", + "IAM_ADMIN_IMPERSONATOR": "Har behörighet att imitera administratörer och slutanvändare från alla organisationer", + "IAM_END_USER_IMPERSONATOR": "Har behörighet att imitera slutanvändare från alla organisationer", + "ORG_OWNER": "Har behörighet över hela organisationen", + "ORG_USER_MANAGER": "Har behörighet att skapa och hantera användare i organisationen", + "ORG_OWNER_VIEWER": "Har behörighet att granska hela organisationen", + "ORG_USER_PERMISSION_EDITOR": "Har behörighet att hantera användarbehörigheter", + "ORG_PROJECT_PERMISSION_EDITOR": "Har behörighet att hantera projektbehörigheter", + "ORG_PROJECT_CREATOR": "Har behörighet att skapa egna projekt och underliggande inställningar", + "ORG_ADMIN_IMPERSONATOR": "Har behörighet att imitera administratörer och slutanvändare från organisationen", + "ORG_END_USER_IMPERSONATOR": "Har behörighet att imitera slutanvändare från organisationen", + "PROJECT_OWNER": "Har behörighet över hela projektet", + "PROJECT_OWNER_VIEWER": "Har behörighet att granska hela projektet", + "PROJECT_OWNER_GLOBAL": "Har behörighet över hela projektet", + "PROJECT_OWNER_VIEWER_GLOBAL": "Har behörighet att granska hela projektet", + "PROJECT_GRANT_OWNER": "Har behörighet att hantera projektbidraget", + "PROJECT_GRANT_OWNER_VIEWER": "Har behörighet att granska projektbidraget" + }, + "OVERLAYS": { + "ORGSWITCHER": { + "TEXT": "Alla organisationsinställningar och tabeller i konsolen baseras på en vald organisation. Klicka på denna knapp för att byta organisation eller skapa en ny." + }, + "INSTANCE": { + "TEXT": "Klicka här för att komma till instansinställningarna. Observera att du bara har tillgång till denna knapp om du har utökade behörigheter." + }, + "PROFILE": { + "TEXT": "Här kan du växla mellan dina användarkonton och hantera dina sessioner och din profil." + }, + "NAV": { + "TEXT": "Denna navigering ändras baserat på din valda organisation ovan eller din instans" + }, + "CONTEXTCHANGED": { + "TEXT": "Organisationskontexten har ändrats." + }, + "SWITCHEDTOINSTANCE": { + "TEXT": "Vyn har just ändrats till instans!" + } + }, + "FILTER": { + "TITLE": "Filter", + "STATE": "Status", + "DISPLAYNAME": "Användarens visningsnamn", + "EMAIL": "E-post", + "USERNAME": "Användarnamn", + "ORGNAME": "Organisationsnamn", + "PRIMARYDOMAIN": "Primär domän", + "PROJECTNAME": "Projektnamn", + "RESOURCEOWNER": "Resursägare", + "METHODS": { + "5": "innehåller", + "7": "slutar med", + "1": "är lika med" + } + }, + "KEYBOARDSHORTCUTS": { + "TITLE": "Tangentbordsgenvägar", + "UNDERORGCONTEXT": "Inom organisationssidor", + "SIDEWIDE": "Webbplatsomfattande genvägar", + "SHORTCUTS": { + "HOME": "Gå till Hem", + "INSTANCE": "Gå till Instans", + "ORG": "Gå till Organisation", + "ORGSETTINGS": "Gå till Organisationsinställningar", + "ORGSWITCHER": "Byt Organisation", + "ME": "Gå till egen profil", + "PROJECTS": "Gå till Projekt", + "USERS": "Gå till Användare", + "USERGRANTS": "Gå till Auktorisationer", + "ACTIONS": "Gå till Åtgärder och Flöden", + "DOMAINS": "Gå till Domäner" + } + }, + "RESOURCEID": "Resurs-ID", + "NAME": "Namn", + "VERSION": "Version", + "TABLE": { + "NOROWS": "Ingen data" + }, + "ERRORS": { + "REQUIRED": "Vänligen fyll i detta fält.", + "ATLEASTONE": "Ange minst ett värde.", + "TOKENINVALID": { + "TITLE": "Din auktoriseringstoken har gått ut.", + "DESCRIPTION": "Klicka på knappen nedan för att logga in igen." + }, + "EXHAUSTED": { + "TITLE": "Din instans är blockerad.", + "DESCRIPTION": "Be din ZITADEL-instansadministratör att uppdatera prenumerationen." + }, + "INVALID_FORMAT": "Formateringen är ogiltig.", + "NOTANEMAIL": "Det angivna värdet är inte en e-postadress.", + "MINLENGTH": "Måste vara minst {{requiredLength}} tecken lång.", + "MAXLENGTH": "Måste vara mindre än {{requiredLength}} tecken.", + "UPPERCASEMISSING": "Måste innehålla en versal.", + "LOWERCASEMISSING": "Måste innehålla en gemen.", + "SYMBOLERROR": "Måste innehålla en symbol eller ett skiljetecken.", + "NUMBERERROR": "Måste innehålla en siffra.", + "PWNOTEQUAL": "De angivna lösenorden matchar inte.", + "PHONE": "Telefonnumret måste börja med +." + }, + "USER": { + "SETTINGS": { + "TITLE": "Inställningar", + "GENERAL": "Allmänt", + "IDP": "Identitetsleverantörer", + "SECURITY": "Lösenord och Säkerhet", + "KEYS": "Nycklar", + "PAT": "Personliga Åtkomsttoken", + "USERGRANTS": "Auktorisationer", + "MEMBERSHIPS": "Medlemskap", + "METADATA": "Metadata" + }, + "TITLE": "Personlig Information", + "DESCRIPTION": "Hantera din information och säkerhetsinställningar.", + "PAGES": { + "TITLE": "Användare", + "DETAIL": "Detalj", + "CREATE": "Skapa", + "MY": "Min Information", + "LOGINNAMES": "Inloggningsnamn", + "LOGINMETHODS": "Inloggningsmetoder", + "LOGINNAMESDESC": "Detta är dina inloggningsnamn:", + "NOUSER": "Ingen associerad användare.", + "REACTIVATE": "Återaktivera", + "DEACTIVATE": "Inaktivera", + "FILTER": "Filter", + "STATE": "Status", + "DELETE": "Radera Användare", + "UNLOCK": "Lås Upp Användare", + "GENERATESECRET": "Generera Klienthemlighet", + "REMOVESECRET": "Ta Bort Klienthemlighet", + "LOCKEDDESCRIPTION": "Denna användare har blivit låst på grund av att ha överskridit maximalt antal inloggningsförsök och måste låsas upp för att kunna användas igen.", + "DELETEACCOUNT": "Radera Konto", + "DELETEACCOUNT_DESC": "Om du utför denna åtgärd kommer du att loggas ut och inte längre ha tillgång till ditt konto. Denna åtgärd är inte reversibel, så fortsätt med försiktighet.", + "DELETEACCOUNT_BTN": "Radera Konto", + "DELETEACCOUNT_SUCCESS": "Konto raderat framgångsrikt!" + }, + "DETAILS": { + "DATECREATED": "Skapad", + "DATECHANGED": "Ändrad" + }, + "DIALOG": { + "DELETE_TITLE": "Radera Användare", + "DELETE_SELF_TITLE": "Radera Konto", + "DELETE_DESCRIPTION": "Du är på väg att permanent radera en användare. Är du säker?", + "DELETE_SELF_DESCRIPTION": "Du är på väg att permanent radera ditt personliga konto. Detta kommer att logga ut dig och radera din användare. Denna åtgärd kan inte ångras!", + "DELETE_AUTH_DESCRIPTION": "Du är på väg att permanent radera ditt personliga konto. Är du säker?", + "TYPEUSERNAME": "Skriv '{{value}}' för att bekräfta och radera användaren.", + "USERNAME": "Inloggningsnamn", + "DELETE_BTN": "Radera permanent" + }, + "SENDEMAILDIALOG": { + "TITLE": "Skicka E-postmeddelande", + "DESCRIPTION": "Klicka på knappen nedan för att skicka en notifikation till den aktuella e-postadressen eller ändra e-postadressen i fältet.", + "NEWEMAIL": "Ny e-postadress" + }, + "SECRETDIALOG": { + "CLIENTSECRET": "Klienthemlighet", + "CLIENTSECRET_DESCRIPTION": "Förvara din klienthemlighet på en säker plats eftersom den kommer att försvinna när dialogrutan stängs." + }, + "TABLE": { + "DEACTIVATE": "Inaktivera", + "ACTIVATE": "Aktivera", + "CHANGEDATE": "Senast Ändrad", + "CREATIONDATE": "Skapad Den", + "FILTER": { + "0": "Filtrera efter Visningsnamn", + "1": "Filtrera efter Användarnamn", + "2": "Filtrera efter Visningsnamn", + "3": "Filtrera efter Användarnamn", + "4": "Filtrera efter E-post", + "5": "Filtrera efter Visningsnamn", + "10": "Filtrera efter organisationsnamn", + "12": "Filtrera efter projektnamn" + }, + "EMPTY": "Inga poster" + }, + "PASSWORDLESS": { + "SEND": "Skicka registreringslänk", + "TABLETYPE": "Typ", + "TABLESTATE": "Status", + "NAME": "Namn", + "EMPTY": "Ingen enhet inställd", + "TITLE": "lösenordsfri autentisering", + "DESCRIPTION": "Lägg till WebAuthn-baserade autentiseringsmetoder för att logga in på ZITADEL lösenordsfrit.", + "MANAGE_DESCRIPTION": "Hantera användarnas andra faktormetoder.", + "U2F": "Lägg till metod", + "U2F_DIALOG_TITLE": "Verifiera autentiserare", + "U2F_DIALOG_DESCRIPTION": "Ange ett namn för din använda lösenordsfria inloggning", + "U2F_SUCCESS": "lösenordsfri autentisering skapad framgångsrikt!", + "U2F_ERROR": "Ett fel inträffade under inställningen!", + "U2F_NAME": "Autentiserarens namn", + "TYPE": { + "0": "Ingen MFA definierad", + "1": "Engångslösenord (OTP)", + "2": "Fingeravtryck, säkerhetsnycklar, Face ID och andra" + }, + "STATE": { + "0": "Ingen status", + "1": "Inte redo", + "2": "Redo", + "3": "Raderad" + }, + "DIALOG": { + "DELETE_TITLE": "Ta bort lösenordsfri autentiseringsmetod", + "DELETE_DESCRIPTION": "Du håller på att ta bort en lösenordsfri autentiseringsmetod. Är du säker?", + "ADD_TITLE": "lösenordsfri autentisering", + "ADD_DESCRIPTION": "Välj ett av de tillgängliga alternativen för att skapa en lösenordsfri autentiseringsmetod.", + "SEND_DESCRIPTION": "Skicka en registreringslänk till din e-postadress.", + "SEND": "Skicka registreringslänk", + "SENT": "E-postmeddelandet skickades framgångsrikt. Kontrollera din inkorg för att fortsätta med inställningen.", + "QRCODE_DESCRIPTION": "Generera QR-kod för skanning med en annan enhet.", + "QRCODE": "Generera QR-kod", + "QRCODE_SCAN": "Skanna denna QR-kod för att fortsätta med inställningen på din enhet.", + "NEW_DESCRIPTION": "Använd denna enhet för att ställa in lösenordsfrit.", + "NEW": "Lägg till ny" + } + }, + "MFA": { + "TABLETYPE": "Typ", + "TABLESTATE": "Status", + "NAME": "Namn", + "EMPTY": "Inga ytterligare faktorer", + "TITLE": "Tvåfaktorautentisering", + "DESCRIPTION": "Lägg till en andra faktor för att säkerställa optimal säkerhet för ditt konto.", + "MANAGE_DESCRIPTION": "Hantera användarnas andra faktormetoder.", + "ADD": "Lägg till faktor", + "OTP": "Autentiseringsapp för TOTP (Tidsbaserat engångslösenord)", + "OTP_DIALOG_TITLE": "Lägg till OTP", + "OTP_DIALOG_DESCRIPTION": "Skanna QR-koden med en autentiseringsapp och ange koden nedan för att verifiera och aktivera OTP-metoden.", + "U2F": "Fingeravtryck, säkerhetsnycklar, Face ID och andra", + "U2F_DIALOG_TITLE": "Verifiera faktor", + "U2F_DIALOG_DESCRIPTION": "Ange ett namn för din använda universella tvåfaktor.", + "U2F_SUCCESS": "Faktor tillagd framgångsrikt!", + "U2F_ERROR": "Ett fel inträffade under inställningen!", + "U2F_NAME": "Autentiserarens namn", + "OTPSMS": "OTP (Engångslösenord) med SMS", + "OTPEMAIL": "OTP (Engångslösenord) med e-post", + "SETUPOTPSMSDESCRIPTION": "Vill du ställa in detta telefonnummer som OTP (Engångslösenord) andra faktor?", + "OTPSMSSUCCESS": "OTP-faktor inställd med framgång.", + "OTPSMSPHONEMUSTBEVERIFIED": "Din telefon måste verifieras för att använda denna metod.", + "OTPEMAILSUCCESS": "OTP-faktor inställd med framgång.", + "TYPE": { + "0": "Ingen MFA definierad", + "1": "Engångslösenord (OTP)", + "2": "Fingeravtryck, säkerhetsnycklar, Face ID och andra" + }, + "STATE": { + "0": "Ingen status", + "1": "Inte redo", + "2": "Redo", + "3": "Raderad" + }, + "DIALOG": { + "MFA_DELETE_TITLE": "Ta bort andra faktorn", + "MFA_DELETE_DESCRIPTION": "Du håller på att ta bort en andra faktor. Är du säker?", + "ADD_MFA_TITLE": "Lägg till andra faktorn", + "ADD_MFA_DESCRIPTION": "Välj ett av följande alternativ." + } + }, + "EXTERNALIDP": { + "TITLE": "Externa identitetsleverantörer", + "DESC": "", + "IDPCONFIGID": "IDP-konfigurations-ID", + "IDPNAME": "IDP-namn", + "USERDISPLAYNAME": "Externt namn", + "EXTERNALUSERID": "Extern användar-ID", + "EMPTY": "Ingen extern IDP hittades", + "DIALOG": { + "DELETE_TITLE": "Ta bort IDP", + "DELETE_DESCRIPTION": "Du håller på att ta bort en identitetsleverantör från en användare. Vill du verkligen fortsätta?" + } + }, + "CREATE": { + "TITLE": "Skapa en ny användare", + "DESCRIPTION": "Vänligen ange nödvändig information.", + "NAMEANDEMAILSECTION": "Namn och e-post", + "GENDERLANGSECTION": "Kön och språk", + "PHONESECTION": "Telefonnummer", + "PASSWORDSECTION": "Initialt lösenord", + "ADDRESSANDPHONESECTION": "Telefonnummer", + "INITMAILDESCRIPTION": "Om båda alternativen är valda kommer inget e-postmeddelande för initialisering att skickas. Om endast ett av alternativen är valt kommer ett e-postmeddelande för att tillhandahålla/verifiera uppgifterna att skickas." + }, + "CODEDIALOG": { + "TITLE": "Verifiera telefonnummer", + "DESCRIPTION": "Ange koden du fick via textmeddelande för att verifiera ditt telefonnummer.", + "CODE": "Kod" + }, + "DATA": { + "STATE": "Status", + "STATE0": "Okänd", + "STATE1": "Aktiv", + "STATE2": "Inaktiv", + "STATE3": "Raderad", + "STATE4": "Låst", + "STATE5": "Avstängd", + "STATE6": "Initial" + }, + "PROFILE": { + "TITLE": "Profil", + "EMAIL": "E-post", + "PHONE": "Telefonnummer", + "PHONE_HINT": "Använd + symbolen följt av landskoden, eller välj landet från rullgardinsmenyn och ange sedan telefonnumret", + "USERNAME": "Användarnamn", + "CHANGEUSERNAME": "ändra", + "CHANGEUSERNAME_TITLE": "Ändra användarnamn", + "CHANGEUSERNAME_DESC": "Ange det nya namnet i fältet nedan.", + "FIRSTNAME": "Förnamn", + "LASTNAME": "Efternamn", + "NICKNAME": "Smeknamn", + "DISPLAYNAME": "Visningsnamn", + "PREFERREDLOGINNAME": "Föredraget inloggningsnamn", + "PREFERRED_LANGUAGE": "Språk", + "GENDER": "Kön", + "PASSWORD": "Lösenord", + "AVATAR": { + "UPLOADTITLE": "Ladda upp din profilbild", + "UPLOADBTN": "Välj fil", + "UPLOAD": "Ladda upp", + "CURRENT": "Nuvarande bild", + "PREVIEW": "Förhandsgranska", + "DELETESUCCESS": "Raderad framgångsrikt!", + "CROPPERERROR": "Ett fel inträffade vid uppladdning av din fil. Försök med ett annat format och storlek om nödvändigt." + }, + "COUNTRY": "Land" + }, + "MACHINE": { + "TITLE": "Användardetaljer för tjänst", + "USERNAME": "Användarnamn", + "NAME": "Namn", + "DESCRIPTION": "Beskrivning", + "KEYSTITLE": "Nycklar", + "KEYSDESC": "Definiera dina nycklar och lägg till ett valfritt utgångsdatum.", + "TOKENSTITLE": "Personliga åtkomsttoken", + "TOKENSDESC": "Personliga åtkomsttoken fungerar som vanliga OAuth-åtkomsttoken.", + "ID": "Nyckel-ID", + "TYPE": "Typ", + "EXPIRATIONDATE": "Utgångsdatum", + "CHOOSEDATEAFTER": "Ange ett giltigt utgångsdatum efter", + "CHOOSEEXPIRY": "Välj ett utgångsdatum", + "CREATIONDATE": "Skapelsedatum", + "KEYDETAILS": "Nyckeldetaljer", + "ACCESSTOKENTYPE": "Åtkomsttokentyp", + "ACCESSTOKENTYPES": { + "0": "Bearer", + "1": "JWT" + }, + "ADD": { + "TITLE": "Lägg till nyckel", + "DESCRIPTION": "Välj din nyckeltyp och välj ett valfritt utgångsdatum." + }, + "ADDED": { + "TITLE": "Nyckeln skapades", + "DESCRIPTION": "Ladda ner nyckeln eftersom den inte kommer att vara synlig efter att du stänger denna dialog!" + }, + "KEYTYPES": { + "1": "JSON" + }, + "DIALOG": { + "DELETE_KEY": { + "TITLE": "Radera nyckel", + "DESCRIPTION": "Vill du radera den valda nyckeln? Detta kan inte ångras." + } + } + }, + "PASSWORD": { + "TITLE": "Lösenord", + "LABEL": "Ett säkert lösenord hjälper till att skydda kontot", + "DESCRIPTION": "Ange det nya lösenordet enligt policyn nedan.", + "OLD": "Nuvarande lösenord", + "NEW": "Nytt lösenord", + "CONFIRM": "Bekräfta nytt lösenord", + "NEWINITIAL": "Lösenord", + "CONFIRMINITIAL": "Bekräfta lösenord", + "RESET": "Återställ nuvarande lösenord", + "SET": "Ange nytt lösenord", + "RESENDNOTIFICATION": "Skicka länk för återställning av lösenord", + "REQUIRED": "Några obligatoriska fält saknas.", + "MINLENGTHERROR": "Måste vara minst {{value}} tecken långt.", + "MAXLENGTHERROR": "Måste vara mindre än {{value}} tecken." + }, + "ID": "ID", + "EMAIL": "E-post", + "PHONE": "Telefonnummer", + "PHONEEMPTY": "Inget telefonnummer definierat", + "PHONEVERIFIED": "Telefonnummer verifierat.", + "EMAILVERIFIED": "E-post verifierad", + "NOTVERIFIED": "inte verifierad", + "PREFERRED_LOGINNAME": "Föredraget inloggningsnamn", + "ISINITIAL": "Användaren är ännu inte aktiv.", + "LOGINMETHODS": { + "TITLE": "Kontaktinformation", + "DESCRIPTION": "Den angivna informationen används för att skicka viktig information, som e-post för återställning av lösenord, till dig.", + "EMAIL": { + "TITLE": "E-post", + "VALID": "validerad", + "ISVERIFIED": "E-post verifierad", + "ISVERIFIEDDESC": "Om e-posten anges som verifierad kommer ingen e-postverifieringsbegäran att göras.", + "RESEND": "Skicka verifierings-e-post igen", + "EDITTITLE": "Ändra e-post", + "EDITDESC": "Ange den nya e-posten i fältet nedan." + }, + "PHONE": { + "TITLE": "Telefon", + "VALID": "validerad", + "RESEND": "Skicka verifierings-sms igen", + "EDITTITLE": "Ändra nummer", + "EDITVALUE": "Telefonnummer", + "EDITDESC": "Ange det nya telefonnumret i fältet nedan.", + "DELETETITLE": "Radera telefonnummer", + "DELETEDESC": "Vill du verkligen radera telefonnumret", + "OTPSMSREMOVALWARNING": "Detta konto använder detta telefonnummer som andra faktor. Du kommer inte att kunna använda det efter att du fortsätter." + }, + "RESENDCODE": "Skicka kod igen", + "ENTERCODE": "Verifiera", + "ENTERCODE_DESC": "Verifiera kod" + }, + "GRANTS": { + "TITLE": "Användarbehörigheter", + "DESCRIPTION": "Ge denna användare åtkomst till vissa projekt", + "CREATE": { + "TITLE": "Skapa användarbehörighet", + "DESCRIPTION": "Sök efter organisationen, projektet och motsvarande projektroller." + }, + "PROJECTNAME": "Projektnamn", + "PROJECT-OWNED": "Projekt", + "PROJECT-GRANTED": "Beviljat projekt", + "FILTER": { + "0": "filtrera för användare", + "1": "filtrera för domän", + "2": "filtrera för projektnamn", + "3": "filtrera för rollnamn" + } + }, + "STATE": { + "0": "Okänd", + "1": "Aktiv", + "2": "Inaktiv", + "3": "Raderad", + "4": "Låst", + "5": "Suspenderad", + "6": "Initial" + }, + "SEARCH": { + "ADDITIONAL": "Inloggningsnamn (nuvarande organisation)", + "ADDITIONAL-EXTERNAL": "Inloggningsnamn (extern organisation)" + }, + "TARGET": { + "SELF": "Om du vill ge en användare från en annan organisation", + "EXTERNAL": "För att ge en användare från din organisation", + "CLICKHERE": "klicka här" + }, + "SIGNEDOUT": "Du är utloggad. Klicka på knappen \"Logga in\" för att logga in igen.", + "SIGNEDOUT_BTN": "Logga in", + "EDITACCOUNT": "Redigera konto", + "ADDACCOUNT": "Logga in med ett annat konto", + "RESENDINITIALEMAIL": "Skicka aktiveringsmail igen", + "RESENDEMAILNOTIFICATION": "Skicka e-postmeddelande igen", + "TOAST": { + "CREATED": "Användare skapad framgångsrikt.", + "SAVED": "Profil sparad framgångsrikt.", + "USERNAMECHANGED": "Användarnamn ändrat.", + "EMAILSAVED": "E-post sparad framgångsrikt.", + "INITEMAILSENT": "Initieringsmail skickat.", + "PHONESAVED": "Telefon sparad framgångsrikt.", + "PHONEREMOVED": "Telefon har tagits bort.", + "PHONEVERIFIED": "Telefon verifierad framgångsrikt.", + "PHONEVERIFICATIONSENT": "Telefonverifieringskod skickad.", + "EMAILVERIFICATIONSENT": "E-postverifieringskod skickad.", + "OTPREMOVED": "OTP borttagen.", + "U2FREMOVED": "Faktor borttagen.", + "PASSWORDLESSREMOVED": "lösenordsfri borttagen.", + "INITIALPASSWORDSET": "Initialt lösenord satt.", + "PASSWORDNOTIFICATIONSENT": "Lösenordsändringsmeddelande skickat.", + "PASSWORDCHANGED": "Lösenord ändrat framgångsrikt.", + "REACTIVATED": "Användare reaktiverad.", + "DEACTIVATED": "Användare deaktiverad.", + "SELECTEDREACTIVATED": "Valda användare reaktiverade.", + "SELECTEDDEACTIVATED": "Valda användare deaktiverade.", + "SELECTEDKEYSDELETED": "Valda nycklar raderade.", + "KEYADDED": "Nyckel tillagd!", + "MACHINEADDED": "Serviceanvändare skapad!", + "DELETED": "Användare raderad framgångsrikt!", + "UNLOCKED": "Användare upplåst framgångsrikt!", + "PASSWORDLESSREGISTRATIONSENT": "Registreringslänk skickad framgångsrikt.", + "SECRETGENERATED": "Hemlighet genererad framgångsrikt!", + "SECRETREMOVED": "Hemlighet borttagen framgångsrikt!" + }, + "MEMBERSHIPS": { + "TITLE": "ZITADEL Manager Roller", + "DESCRIPTION": "Detta är alla medlemsbeviljanden för användaren. Du kan också ändra dem på organisations-, projekt- eller IAM-detaljsidor.", + "ORGCONTEXT": "Du ser alla organisationer och projekt som är relaterade till den för närvarande valda organisationen.", + "USERCONTEXT": "Du ser alla organisationer och projekt som du är auktoriserad till. Inklusive andra organisationer.", + "CREATIONDATE": "Skapelsedatum", + "CHANGEDATE": "Senast ändrad", + "DISPLAYNAME": "Visningsnamn", + "REMOVE": "Ta bort", + "TYPE": "Typ", + "ORGID": "Organisations-ID", + "UPDATED": "Medlemskapet uppdaterades.", + "NOPERMISSIONTOEDIT": "Du saknar de nödvändiga behörigheterna för att redigera roller!", + "TYPES": { + "UNKNOWN": "Okänd", + "ORG": "Organisation", + "PROJECT": "Projekt", + "GRANTEDPROJECT": "Beviljat projekt" + } + }, + "PERSONALACCESSTOKEN": { + "ID": "ID", + "TOKEN": "Token", + "ADD": { + "TITLE": "Generera ny personlig åtkomsttoken", + "DESCRIPTION": "Definiera en anpassad utgångstid för token.", + "CHOOSEEXPIRY": "Välj ett utgångsdatum", + "CHOOSEDATEAFTER": "Ange ett giltigt utgångsdatum efter" + }, + "ADDED": { + "TITLE": "Personlig åtkomsttoken", + "DESCRIPTION": "Se till att kopiera din personliga åtkomsttoken. Du kommer inte att kunna se den igen!" + }, + "DELETE": { + "TITLE": "Radera token", + "DESCRIPTION": "Du är på väg att radera den personliga åtkomsttoken. Är du säker?" + }, + "DELETED": "Token raderad med framgång." + } + }, + "METADATA": { + "TITLE": "Metadata", + "KEY": "Nyckel", + "VALUE": "Värde", + "ADD": "Ny post", + "SAVE": "Spara", + "EMPTY": "Ingen metadata", + "SETSUCCESS": "Element sparat framgångsrikt", + "REMOVESUCCESS": "Element raderat framgångsrikt" + }, + "FLOWS": { + "ID": "ID", + "NAME": "Namn", + "STATE": "Status", + "STATES": { + "0": "ingen status", + "1": "inaktiv", + "2": "aktiv" + }, + "ADDTRIGGER": "Lägg till trigger", + "FLOWCHANGED": "Flödet ändrades framgångsrikt", + "FLOWCLEARED": "Flödet återställdes framgångsrikt", + "TIMEOUT": "Timeout", + "TIMEOUTINSEC": "Timeout i sekunder", + "ALLOWEDTOFAIL": "Tillåtet att misslyckas", + "ALLOWEDTOFAILWARN": { + "TITLE": "Varning", + "DESCRIPTION": "Om du inaktiverar denna inställning kan det leda till att användare i din organisation inte kan logga in. Dessutom kommer du inte längre att kunna komma åt konsolen för att inaktivera åtgärden. Vi rekommenderar att skapa en administratörsanvändare i en separat organisation eller testa skript först i en utvecklingsmiljö eller en utvecklingsorganisation." + }, + "SCRIPT": "Skript", + "FLOWTYPE": "Flödestyp", + "TRIGGERTYPE": "Triggertyp", + "ACTIONS": "Åtgärder", + "ACTIONSMAX": "Baserat på din nivå har du tillgängligt ett begränsat antal åtgärder ({{value}}). Se till att inaktivera de du inte behöver eller överväg att uppgradera din nivå.", + "DIALOG": { + "ADD": { + "TITLE": "Skapa en åtgärd" + }, + "UPDATE": { + "TITLE": "Uppdatera åtgärd" + }, + "DELETEACTION": { + "TITLE": "Radera åtgärd?", + "DESCRIPTION": "Du är på väg att radera en åtgärd. Detta kan inte ångras. Är du säker?", + "DELETE_SUCCESS": "Åtgärd raderad framgångsrikt." + }, + "CLEAR": { + "TITLE": "Rensa flöde?", + "DESCRIPTION": "Du är på väg att återställa flödet tillsammans med dess triggers och åtgärder. Denna ändring kan inte återställas. Är du säker?" + }, + "REMOVEACTIONSLIST": { + "TITLE": "Radera valda åtgärder?", + "DESCRIPTION": "Är du säker på att du vill radera de valda åtgärderna från flödet?" + } + }, + "TOAST": { + "ACTIONSSET": "Åtgärder sparade", + "ACTIONREACTIVATED": "Åtgärder återaktiverade med framgång", + "ACTIONDEACTIVATED": "Åtgärder avaktiverade med framgång" + } + }, + "IAM": { + "POLICIES": { + "TITLE": "Systempolicyer och åtkomstinställningar", + "DESCRIPTION": "Hantera dina globala policyer och åtkomstinställningar." + }, + "EVENTSTORE": { + "TITLE": "IAM Lagringsadministration", + "DESCRIPTION": "Hantera dina ZITADEL-vyer och misslyckade händelser." + }, + "MEMBER": { + "TITLE": "Administratörer", + "DESCRIPTION": "Dessa administratörer får göra ändringar i din instans." + }, + "PAGES": { + "STATE": "Status", + "DOMAINLIST": "Anpassade domäner" + }, + "STATE": { + "0": "Ospecificerad", + "1": "Skapar", + "2": "Kör", + "3": "Stoppar", + "4": "Stoppad" + }, + "VIEWS": { + "VIEWNAME": "Namn", + "DATABASE": "Databas", + "SEQUENCE": "Sekvens", + "EVENTTIMESTAMP": "Tidsstämpel", + "LASTSPOOL": "Senaste lyckade spolningen", + "ACTIONS": "Åtgärder", + "CLEAR": "Rensa", + "CLEARED": "Vyn rensades framgångsrikt!", + "DIALOG": { + "VIEW_CLEAR_TITLE": "Rensa vy", + "VIEW_CLEAR_DESCRIPTION": "Du håller på att rensa en vy. Att rensa en vy skapar en process under vilken data eventuellt inte är tillgänglig för slutanvändare. Är du verkligen säker?" + } + }, + "FAILEDEVENTS": { + "VIEWNAME": "Namn", + "DATABASE": "Databas", + "FAILEDSEQUENCE": "Misslyckad sekvens", + "FAILURECOUNT": "Antal misslyckanden", + "LASTFAILED": "Senast misslyckad vid", + "ERRORMESSAGE": "Felmeddelande", + "ACTIONS": "Åtgärder", + "DELETE": "Ta bort", + "DELETESUCCESS": "Misslyckade händelser borttagna." + }, + "EVENTS": { + "EDITOR": "Redaktör", + "EDITORID": "Redaktör ID", + "AGGREGATE": "Aggregera", + "AGGREGATEID": "Aggregerings-ID", + "AGGREGATETYPE": "Aggregeringstyp", + "RESOURCEOWNER": "Resursägare", + "SEQUENCE": "Sekvens", + "CREATIONDATE": "Skapad vid", + "TYPE": "Typ", + "PAYLOAD": "Payload", + "FILTERS": { + "BTN": "Filter", + "USER": { + "IDLABEL": "ID", + "CHECKBOX": "Filtrera efter redaktör" + }, + "AGGREGATE": { + "TYPELABEL": "Aggregeringstyp", + "IDLABEL": "ID", + "CHECKBOX": "Filtrera efter aggregering" + }, + "TYPE": { + "TYPELABEL": "Typ", + "CHECKBOX": "Filtrera efter typ" + }, + "RESOURCEOWNER": { + "LABEL": "ID", + "CHECKBOX": "Filtrera efter resursägare" + }, + "SEQUENCE": { + "LABEL": "Sekvens", + "CHECKBOX": "Filtrera efter sekvens" + }, + "SORT": "Sortera", + "ASC": "Stigande", + "DESC": "Fallande", + "CREATIONDATE": { + "RADIO_FROM": "Från", + "RADIO_RANGE": "Intervall", + "LABEL_SINCE": "Sedan", + "LABEL_UNTIL": "Till" + }, + "OTHER": "annan", + "OTHERS": "andra" + }, + "DIALOG": { + "TITLE": "Händelsedetalj" + } + }, + "TOAST": { + "MEMBERREMOVED": "Administratör borttagen.", + "MEMBERSADDED": "Administratörer tillagda.", + "MEMBERADDED": "Administratör tillagd.", + "MEMBERCHANGED": "Administratör ändrad.", + "ROLEREMOVED": "Roll borttagen.", + "ROLECHANGED": "Roll ändrad.", + "REACTIVATED": "Återaktiverad", + "DEACTIVATED": "Avaktiverad" + } + }, + "ORG": { + "PAGES": { + "NAME": "Namn", + "ID": "ID", + "CREATIONDATE": "Skapelsedatum", + "DATECHANGED": "Ändrad", + "FILTER": "Filter", + "FILTERPLACEHOLDER": "Filtrera efter namn", + "LIST": "Organisationer", + "LISTDESCRIPTION": "Välj en organisation.", + "ACTIVE": "Aktiv", + "CREATE": "Skapa organisation", + "DEACTIVATE": "Inaktivera organisation", + "REACTIVATE": "Återaktivera organisation", + "NOPERMISSION": "Du har inte behörighet att komma åt organisationsinställningar.", + "USERSELFACCOUNT": "Använd ditt personliga konto som organisationsägare", + "ORGDETAIL_TITLE": "Ange namnet och domänen för din nya organisation.", + "ORGDETAIL_TITLE_WITHOUT_DOMAIN": "Ange namnet på din nya organisation.", + "ORGDETAILUSER_TITLE": "Konfigurera organisationsägare", + "DELETE": "Radera organisation", + "DEFAULTLABEL": "Standard", + "SETASDEFAULT": "Ange som standardorganisation", + "DEFAULTORGSET": "Standardorganisation ändrad framgångsrikt", + "RENAME": { + "ACTION": "Byt namn", + "TITLE": "Byt namn på organisation", + "DESCRIPTION": "Ange det nya namnet för din organisation", + "BTN": "Byt namn" + }, + "ORGDOMAIN": { + "TITLE": "Verifiera ägarskap av {{value}}", + "VERIFICATION": "Vi erbjuder dig två metoder för att manuellt validera din domän:", + "VERIFICATION_HTML": "- HTTP. Värd en tillfällig verifieringsfil på din webbplats", + "VERIFICATION_DNS": "- DNS. Skapa en TXT-post i DNS", + "VERIFICATION_DNS_DESC": "Om du hanterar {{ value }} och har tillgång till dina DNS-poster, kan du skapa en ny TXT-post med följande värden:", + "VERIFICATION_DNS_HOST_LABEL": "Värd:", + "VERIFICATION_DNS_CHALLENGE_LABEL": "Använd denna kod för värdet av TXT-posten:", + "VERIFICATION_HTTP_DESC": "Om du har tillgång till din webbhotell, ladda helt enkelt ner verifieringsfilen och ladda upp den på den angivna URL:en", + "VERIFICATION_HTTP_URL_LABEL": "Förväntad URL:", + "VERIFICATION_HTTP_FILE_LABEL": "Verifieringsfil:", + "VERIFICATION_SKIP": "Du kan hoppa över verifieringen för nu och fortsätta skapa din organisation, men för att använda din domän måste detta steg slutföras!", + "VERIFICATION_VALIDATION_DESC": "Radera inte verifieringskoden, eftersom ZITADEL kommer att kontrollera ägarskapet av din domän från tid till annan.", + "VERIFICATION_NEWTOKEN_TITLE": "Begär ny token", + "VERIFICATION_VALIDATION_ONGOING": "Metoden {{ value }} har valts för att verifiera din domän. Klicka på knappen för att utlösa en verifieringskontroll eller återställa verifieringsprocessen.", + "VERIFICATION_SUCCESSFUL": "Domän verifierad framgångsrikt!", + "RESETMETHOD": "Återställ verifieringsmetod" + }, + "DOWNLOAD_FILE": "Ladda ner fil", + "SELECTORGTOOLTIP": "Välj denna organisation.", + "PRIMARYDOMAIN": "Primär domän", + "STATE": "Status", + "USEPASSWORD": "Ange initialt lösenord", + "USEPASSWORDDESC": "Användaren behöver inte ange lösenordet under initialiseringen." + }, + "LIST": { + "TITLE": "Organisationer", + "DESCRIPTION": "Dessa är organisationerna på din instans" + }, + "DOMAINS": { + "NEW": "Lägg till domän", + "TITLE": "Verifierade domäner", + "DESCRIPTION": "Konfigurera dina organisationsdomäner. Denna domän kan användas för domänupptäckt och användarnamnssuffix.", + "SETPRIMARY": "Ange som primär", + "DELETE": { + "TITLE": "Radera domän", + "DESCRIPTION": "Du är på väg att radera en av dina domäner." + }, + "ADD": { + "TITLE": "Lägg till domän", + "DESCRIPTION": "Du är på väg att lägga till en domän för din organisation. Efter en framgångsrik process kan domänen användas för domänupptäckt och som suffix för dina användare." + } + }, + "STATE": { + "0": "Inte definierad", + "1": "Aktiv", + "2": "Inaktiverad" + }, + "MEMBER": { + "TITLE": "Organisationsadministratörer", + "DESCRIPTION": "Definiera användarna som kan ändra dina organisationsinställningar." + }, + "TOAST": { + "UPDATED": "Organisationen uppdaterad framgångsrikt.", + "DEACTIVATED": "Organisation inaktiverad.", + "REACTIVATED": "Organisation återaktiverad.", + "DOMAINADDED": "Domän tillagd.", + "DOMAINREMOVED": "Domän borttagen.", + "MEMBERADDED": "administratör tillagd.", + "MEMBERREMOVED": "administratör borttagen.", + "MEMBERCHANGED": "administratör ändrad.", + "SETPRIMARY": "Primär domän inställd.", + "DELETED": "Organisation raderad framgångsrikt", + "DEFAULTORGNOTFOUND": "Standardorganisationen hittades inte", + "ORG_WAS_DELETED": "Organisationen har raderats." + }, + "DIALOG": { + "DEACTIVATE": { + "TITLE": "Inaktivera organisation", + "DESCRIPTION": "Du är på väg att inaktivera din organisation. Användare kommer inte att kunna logga in efteråt. Är du säker på att du vill fortsätta?" + }, + "REACTIVATE": { + "TITLE": "Återaktivera organisation", + "DESCRIPTION": "Du är på väg att återaktivera din organisation. Användare kommer att kunna logga in igen. Är du säker på att du vill fortsätta?" + }, + "DELETE": { + "TITLE": "Radera organisation", + "DESCRIPTION": "Du är på väg att radera din organisation. Detta initierar en process där all organisationsrelaterad data kommer att raderas. Du kan inte ångra denna åtgärd för tillfället.", + "TYPENAME": "Skriv '{{value}}' för att radera din organisation.", + "ORGNAME": "Namn", + "BTN": "Radera" + } + } + }, + "SETTINGS": { + "INSTANCE": { + "TITLE": "Instansinställningar", + "DESCRIPTION": "Dessa inställningar kommer att gälla för alla dina organisationer om de inte har åsidosatts." + }, + "LIST": { + "ORGS": "Organisationer", + "FEATURESETTINGS": "Funktioner", + "LANGUAGES": "Språk", + "LOGIN": "Inloggningsbeteende och säkerhet", + "LOCKOUT": "Låsning", + "COMPLEXITY": "Lösenordskomplexitet", + "NOTIFICATIONS": "Meddelanden", + "SMTP_PROVIDER": "SMTP-leverantör", + "SMS_PROVIDER": "SMS/Telefonleverantör", + "NOTIFICATIONS_DESC": "SMTP- och SMS-inställningar", + "MESSAGETEXTS": "Meddelandetexter", + "IDP": "Identitetsleverantörer", + "VERIFIED_DOMAINS": "Verifierade domäner", + "DOMAIN": "Domäninställningar", + "LOGINTEXTS": "Inloggningsgränssnittstexter", + "BRANDING": "Varumärke", + "PRIVACYPOLICY": "Externa länkar", + "OIDC": "OIDC-token livstid och utgång", + "SECRETS": "Hemlighetsgenerator", + "SECURITY": "Säkerhetsinställningar", + "EVENTS": "Händelser", + "FAILEDEVENTS": "Misslyckade händelser", + "VIEWS": "Vy" + }, + "GROUPS": { + "GENERAL": "Allmän information", + "NOTIFICATIONS": "Aviseringar", + "LOGIN": "Inloggning och åtkomst", + "DOMAIN": "Domän", + "TEXTS": "Texter och språk", + "APPEARANCE": "Utseende", + "OTHER": "Övrigt", + "STORAGE": "Lagring" + } + }, + "SETTING": { + "LANGUAGES": { + "DEFAULT": "Standardspråk", + "ALLOWED": "Tillåtna språk", + "NOT_ALLOWED": "Ej tillåtna språk", + "ALLOW_ALL": "Tillåt alla", + "DISALLOW_ALL": "Tillåt inga", + "SETASDEFAULT": "Ange som standardspråk", + "DEFAULT_SAVED": "Standardspråk sparat", + "ALLOWED_SAVED": "Tillåtna språk sparade", + "OPTIONS": { + "de": "Deutsch", + "en": "English", + "es": "Español", + "fr": "Français", + "it": "Italiano", + "ja": "日本語", + "pl": "Polski", + "zh": "简体中文", + "bg": "Български", + "pt": "Portuguese", + "mk": "Македонски", + "cs": "Čeština", + "ru": "Русский", + "nl": "Nederlands", + "sv": "Svenska" + } + }, + "SMTP": { + "TITLE": "SMTP-leverantör", + "DESCRIPTION": "Beskrivning", + "SENDERADDRESS": "Avsändarens e-postadress", + "SENDERNAME": "Avsändarens namn", + "REPLYTOADDRESS": "Svarsadress", + "HOSTANDPORT": "Värd och port", + "USER": "Användare", + "PASSWORD": "Lösenord", + "SETPASSWORD": "Ange SMTP-lösenord", + "PASSWORDSET": "SMTP-lösenordet har angetts framgångsrikt.", + "TLS": "Transport Layer Security (TLS)", + "SAVED": "Sparat framgångsrikt!", + "NOCHANGES": "Inga ändringar!", + "REQUIREDWARN": "För att skicka aviseringar från din domän måste du ange dina SMTP-uppgifter." + }, + "SMS": { + "PROVIDERS": "Leverantörer", + "PROVIDER": "SMS-leverantör", + "ADDPROVIDER": "Lägg till SMS-leverantör", + "ADDPROVIDERDESCRIPTION": "Välj en av de tillgängliga leverantörerna och ange de nödvändiga uppgifterna.", + "REMOVEPROVIDER": "Ta bort leverantör", + "REMOVEPROVIDER_DESC": "Du håller på att ta bort en leverantörskonfiguration. Vill du fortsätta?", + "SMSPROVIDERSTATE": { + "0": "Ospecificerad", + "1": "Aktiv", + "2": "Inaktiv" + }, + "ACTIVATED": "Leverantör aktiverad.", + "DEACTIVATED": "Leverantör inaktiverad.", + "TWILIO": { + "SID": "Sid", + "TOKEN": "Token", + "SENDERNUMBER": "Avsändarnummer", + "ADDED": "Twilio tillagd framgångsrikt.", + "UPDATED": "Twilio uppdaterad framgångsrikt.", + "REMOVED": "Twilio borttagen", + "CHANGETOKEN": "Ändra token", + "SETTOKEN": "Ange token", + "TOKENSET": "Token har angetts framgångsrikt." + } + }, + "SECRETS": { + "TYPES": "Hemlighetstyper", + "TYPE": { + "1": "Initieringsmail", + "2": "E-postverifiering", + "3": "Telefonverifiering", + "4": "Återställning av lösenord", + "5": "lösenordsfri initiering", + "6": "App-hemlighet", + "7": "Engångslösenord (OTP) - SMS", + "8": "Engångslösenord (OTP) - E-post" + }, + "ADDGENERATOR": "Definiera hemlighetsgenerator", + "GENERATORTYPE": "Typ", + "EXPIRY": "Utgång (i timmar)", + "INCLUDEDIGITS": "Inkludera siffror", + "INCLUDESYMBOLS": "Inkludera symboler", + "INCLUDELOWERLETTERS": "Inkludera små bokstäver", + "INCLUDEUPPERLETTERS": "Inkludera stora bokstäver", + "LENGTH": "Längd", + "UPDATED": "Inställningar uppdaterade." + }, + "SECURITY": { + "IFRAMETITLE": "iFrame", + "IFRAMEDESCRIPTION": "Denna inställning ställer in CSP för att tillåta inramning från en uppsättning tillåtna domäner. Observera att genom att aktivera användningen av iFrames, riskerar du att tillåta clickjacking.", + "IFRAMEENABLED": "Tillåt iFrame", + "ALLOWEDORIGINS": "Tillåtna URL:er", + "IMPERSONATIONTITLE": "Impersonation", + "IMPERSONATIONENABLED": "Tillåt impersonation", + "IMPERSONATIONDESCRIPTION": "Denna inställning tillåter användning av impersonation i princip. Observera att impersonatorn också behöver de lämpliga `*_IMPERSONATOR`-rollerna tilldelade." + }, + "FEATURES": { + "LOGINDEFAULTORG": "Standardorganisation för inloggning", + "LOGINDEFAULTORG_DESCRIPTION": "Inloggningsgränssnittet kommer att använda inställningarna för standardorganisationen (och inte från instansen) om ingen organisationskontext är inställd", + "OIDCLEGACYINTROSPECTION": "OIDC Legacy introspection", + "OIDCLEGACYINTROSPECTION_DESCRIPTION": "Vi har nyligen omarbetat introspektionsändpunkten av prestandaskäl. Denna funktion kan användas för att återgå till den äldre implementationen om oväntade buggar uppstår.", + "OIDCTOKENEXCHANGE": "OIDC Token Exchange", + "OIDCTOKENEXCHANGE_DESCRIPTION": "Aktivera den experimentella urn:ietf:params:oauth:grant-type:token-exchange grant-typen för OIDC-tokenändpunkten. Tokenutbyte kan användas för att begära tokens med en mindre omfattning eller impersonera andra användare. Se säkerhetspolicyn för att tillåta impersonation på en instans.", + "OIDCTRIGGERINTROSPECTIONPROJECTIONS": "OIDC Trigger introspection Projections", + "OIDCTRIGGERINTROSPECTIONPROJECTIONS_DESCRIPTION": "Aktivera projektionstriggers under en introspektionsbegäran. Detta kan fungera som en lösning om det finns märkbara konsistensproblem i introspektionssvaret men kan påverka prestandan. Vi planerar att ta bort triggers för introspektionsbegäranden i framtiden.", + "USERSCHEMA": "Användarschema", + "USERSCHEMA_DESCRIPTION": "Användarscheman tillåter att hantera datascheman för användare. Om flaggan är aktiverad kommer du att kunna använda det nya API:et och dess funktioner.", + "ACTIONS": "Åtgärder", + "ACTIONS_DESCRIPTION": "Åtgärder v2 tillåter att hantera dataexekveringar och mål. Om flaggan är aktiverad kommer du att kunna använda det nya API:et och dess funktioner.", + "STATES": { + "INHERITED": "Ärv", + "ENABLED": "Aktiverad", + "DISABLED": "Inaktiverad" + }, + "INHERITED_DESCRIPTION": "Detta ställer in värdet till systemets standardvärde.", + "RESET": "Återställ allt till arv" + }, + "DIALOG": { + "RESET": { + "DEFAULTTITLE": "Återställ inställning", + "DEFAULTDESCRIPTION": "Du håller på att återställa dina inställningar till standardkonfigurationen för din instans. Är du säker på att du vill fortsätta?", + "LOGINPOLICY_DESCRIPTION": "Varning: Om du fortsätter kommer inställningarna för identitetsleverantören också att återställas till instansinställningen." + } + } + }, + "POLICY": { + "APPLIEDTO": "Tillämpad på", + "PWD_COMPLEXITY": { + "TITLE": "Lösenordskomplexitet", + "DESCRIPTION": "Säkerställer att alla inställda lösenord motsvarar ett specifikt mönster", + "SYMBOLANDNUMBERERROR": "Måste bestå av en siffra och en symbol/tecken.", + "SYMBOLERROR": "Måste inkludera en symbol/tecken.", + "NUMBERERROR": "Måste inkludera en siffra.", + "PATTERNERROR": "Lösenordet uppfyller inte det nödvändiga mönstret." + }, + "NOTIFICATION": { + "TITLE": "Meddelande", + "DESCRIPTION": "Bestämmer vid vilka ändringar meddelanden kommer att skickas.", + "PASSWORDCHANGE": "Lösenordsändring" + }, + "PRIVATELABELING": { + "DESCRIPTION": "Ge inloggningen din personliga stil och ändra dess beteende.", + "PREVIEW_DESCRIPTION": "Ändringar av policyn kommer automatiskt att distribueras till förhandsgranskningsmiljön.", + "BTN": "Välj fil", + "ACTIVATEPREVIEW": "Tillämpa konfiguration", + "DARK": "Mörkt läge", + "LIGHT": "Ljust läge", + "CHANGEVIEW": "Ändra vy", + "ACTIVATED": "Policyändringar är nu LIVE", + "THEME": "Tema", + "COLORS": "Färger", + "FONT": "Typsnitt", + "ADVANCEDBEHAVIOR": "Avancerat beteende", + "DROP": "Släpp bild här eller", + "RELEASE": "Släpp", + "DROPFONT": "Släpp typsnittsfil här", + "RELEASEFONT": "Släpp", + "USEOFLOGO": "Din logotyp kommer att användas i inloggningen samt i e-postmeddelanden, medan ikonen används för mindre UI-element som i organisationsväxlaren i konsolen", + "MAXSIZE": "Den maximala storleken är begränsad till 524kB", + "EMAILNOSVG": "SVG-filformatet stöds inte i e-postmeddelanden. Ladda därför upp din logotyp i PNG eller annat stöds format.", + "MAXSIZEEXCEEDED": "Maximal storlek på 524kB överskriden.", + "NOSVGSUPPORTED": "SVG stöds inte!", + "FONTINLOGINONLY": "Typsnittet visas för närvarande endast i inloggningsgränssnittet.", + "BACKGROUNDCOLOR": "Bakgrundsfärg", + "PRIMARYCOLOR": "Primär färg", + "WARNCOLOR": "Varningsfärg", + "FONTCOLOR": "Typsnittsfärg", + "VIEWS": { + "PREVIEW": "Förhandsgranskning", + "CURRENT": "Nuvarande konfiguration" + }, + "PREVIEW": { + "TITLE": "Inloggning", + "SECOND": "logga in med ditt ZITADEL-konto.", + "ERROR": "Användaren kunde inte hittas!", + "PRIMARYBUTTON": "nästa", + "SECONDARYBUTTON": "registrera" + }, + "THEMEMODE": { + "THEME_MODE_AUTO": "Automatiskt läge", + "THEME_MODE_LIGHT": "Endast ljust läge", + "THEME_MODE_DARK": "Endast mörkt läge" + } + }, + "PWD_AGE": { + "TITLE": "Lösenordsåldrande", + "DESCRIPTION": "Du kan ställa in en policy för lösenordsåldrande. Denna policy avger en varning efter den specifika åldringstiden har passerat." + }, + "PWD_LOCKOUT": { + "TITLE": "Låsning av lösenordspolicy", + "DESCRIPTION": "Ställ in ett maximalt antal lösenordsförsök, efter vilket konton kommer att blockeras." + }, + "PRIVATELABELING_POLICY": { + "TITLE": "Branding", + "BTN": "Välj fil", + "DESCRIPTION": "Anpassa utseendet på inloggningen", + "ACTIVATEPREVIEW": "Aktivera konfiguration" + }, + "LOGIN_POLICY": { + "TITLE": "Inloggningsinställningar", + "DESCRIPTION": "Definiera hur användare kan autentiseras och konfigurera identitetsleverantörer", + "DESCRIPTIONCREATEADMIN": "Användare kan välja från de tillgängliga identitetsleverantörerna nedan.", + "DESCRIPTIONCREATEMGMT": "Användare kan välja från de tillgängliga identitetsleverantörerna nedan. Observera: Du kan använda systeminställda leverantörer samt leverantörer som endast är inställda för din organisation.", + "LIFETIME_INVALID": "Formuläret innehåller ogiltiga värden.", + "SAVED": "Sparat framgångsrikt!", + "PROVIDER_ADDED": "Identitetsleverantör aktiverad." + }, + "PRIVACY_POLICY": { + "DESCRIPTION": "Ställ in din integritetspolicy och länkar till användarvillkor", + "TOSLINK": "Länk till användarvillkor", + "POLICYLINK": "Länk till integritetspolicy", + "HELPLINK": "Länk till hjälp", + "SUPPORTEMAIL": "Support-e-post", + "DOCSLINK": "Dokumentationslänk (Konsol)", + "CUSTOMLINK": "Anpassad länk (Konsol)", + "CUSTOMLINKTEXT": "Anpassad länktext (Konsol)", + "SAVED": "Sparat framgångsrikt!", + "RESET_TITLE": "Återställ standardvärden", + "RESET_DESCRIPTION": "Du håller på att återställa standardlänkarna för användarvillkor och integritetspolicy. Vill du verkligen fortsätta?" + }, + "LOGIN_TEXTS": { + "TITLE": "Inloggningsgränssnittstexter", + "DESCRIPTION": "Definiera dina texter för inloggningsgränssnitten. Om texter är tomma kommer standardvärdet som visas som platshållare att användas.", + "DESCRIPTION_SHORT": "Definiera dina texter för inloggningsgränssnitten.", + "NEWERVERSIONEXISTS": "Nyare version finns", + "CURRENTDATE": "Nuvarande konfiguration", + "CHANGEDATE": "Nyare version från", + "KEYNAME": "Inloggningsskärm / Gränssnitt", + "RESET_TITLE": "Återställ standardvärden", + "RESET_DESCRIPTION": "Du håller på att återställa alla standardvärden. Alla ändringar du har gjort kommer att raderas permanent. Vill du verkligen fortsätta?", + "UNSAVED_TITLE": "Fortsätt utan att spara?", + "UNSAVED_DESCRIPTION": "Du har gjort ändringar utan att spara. Vill du spara nu?", + "ACTIVE_LANGUAGE_NOT_ALLOWED": "Du har valt ett språk som inte är tillåtet. Du kan fortsätta att ändra texterna. Men om du vill att dina användare faktiskt ska kunna använda detta språk, ändra dina instansers begränsningar.", + "LANGUAGES_NOT_ALLOWED": "Inte tillåtet:", + "LANGUAGE": "Språk", + "LANGUAGES": { + "de": "Deutsch", + "en": "English", + "es": "Español", + "fr": "Français", + "it": "Italiano", + "ja": "日本語", + "pl": "Polski", + "zh": "简体中文", + "bg": "Български", + "pt": "Portuguese", + "mk": "Македонски", + "cs": "Čeština", + "ru": "Русский", + "nl": "Nederlands", + "sv": "Svenska" + }, + "KEYS": { + "emailVerificationDoneText": "E-postverifiering klar", + "emailVerificationText": "E-postverifiering", + "externalUserNotFoundText": "Extern användare hittades inte", + "footerText": "Sidfot", + "initMfaDoneText": "Initiera MFA klar", + "initMfaOtpText": "Initiera MFA", + "initMfaPromptText": "Initiera MFA-prompt", + "initMfaU2fText": "Initiera Universal Second Factor", + "initPasswordDoneText": "Initiera lösenord klart", + "initPasswordText": "Initiera lösenord", + "initializeDoneText": "Initiera användare klart", + "initializeUserText": "Initiera användare", + "linkingUserPromptText": "Länka användarprompt", + "linkingUserDoneText": "Länka användare klart", + "loginText": "Inloggning", + "logoutText": "Utloggning", + "mfaProvidersText": "MFA-leverantörer", + "passwordChangeDoneText": "Lösenordsändring klar", + "passwordChangeText": "Lösenordsändring", + "passwordResetDoneText": "Lösenordsåterställning klar", + "passwordText": "Lösenord", + "registrationOptionText": "Registreringsalternativ", + "registrationOrgText": "Registrera organisation", + "registrationUserText": "Registrera användare", + "selectAccountText": "Välj konto", + "successLoginText": "Inloggning lyckades", + "usernameChangeDoneText": "Användarnamnsändring klar", + "usernameChangeText": "Användarnamnsändring", + "verifyMfaOtpText": "Verifiera OTP", + "verifyMfaU2fText": "Verifiera Universal Second Factor", + "passwordlessPromptText": "lösenordsfri Prompt", + "passwordlessRegistrationDoneText": "lösenordsfri Registrering Klar", + "passwordlessRegistrationText": "lösenordsfri Registrering", + "passwordlessText": "lösenordsfri", + "externalRegistrationUserOverviewText": "Extern Registrering Användaröversikt" + } + }, + "MESSAGE_TEXTS": { + "TYPE": "Notifikation", + "TYPES": { + "INIT": "Initialisering", + "VE": "Verifiera E-post", + "VP": "Verifiera Telefon", + "VSO": "Verifiera SMS OTP", + "VEO": "Verifiera E-post OTP", + "PR": "Återställ Lösenord", + "DC": "Domänkrav", + "PL": "lösenordsfri", + "PC": "Lösenordsändring" + }, + "CHIPS": { + "firstname": "Förnamn", + "lastname": "Efternamn", + "code": "Kod", + "preferredLoginName": "Föredraget Inloggningsnamn", + "displayName": "Visningsnamn", + "nickName": "Smeknamn", + "loginnames": "Inloggningsnamn", + "domain": "Domän", + "lastEmail": "Senaste e-post", + "lastPhone": "Senaste telefon", + "verifiedEmail": "Verifierad e-post", + "verifiedPhone": "Verifierad telefon", + "changedate": "Ändringsdatum", + "username": "Användarnamn", + "tempUsername": "Tillfälligt användarnamn", + "otp": "Engångslösenord", + "verifyUrl": "Verifiera Engångslösenord URL" + }, + "TOAST": { + "UPDATED": "Anpassade Texter sparade." + } + }, + "DEFAULTLABEL": "De nuvarande inställningarna motsvarar standarden för din instans.", + "BTN_INSTALL": "Installera", + "BTN_EDIT": "Ändra", + "DATA": { + "DESCRIPTION": "Beskrivning", + "MINLENGTH": "måste ha en minsta längd", + "HASNUMBER": "måste inkludera en siffra", + "HASSYMBOL": "måste inkludera en symbol", + "HASLOWERCASE": "måste inkludera en gemen bokstav", + "HASUPPERCASE": "måste inkludera en versal bokstav", + "SHOWLOCKOUTFAILURES": "visa låsning misslyckanden", + "MAXPASSWORDATTEMPTS": "Maximalt antal lösenordsförsök", + "MAXOTPATTEMPTS": "Maximalt antal OTP-försök", + "EXPIREWARNDAYS": "Utgångsvarning efter dag", + "MAXAGEDAYS": "Max ålder i dagar", + "USERLOGINMUSTBEDOMAIN": "Lägg till organisationsdomän som suffix till inloggningsnamn", + "USERLOGINMUSTBEDOMAIN_DESCRIPTION": "Om du aktiverar denna inställning kommer alla inloggningsnamn att ha organisationsdomänen som suffix. Om denna inställning är inaktiverad måste du säkerställa att användarnamn är unika över alla organisationer.", + "VALIDATEORGDOMAINS": "Organisationsdomänverifiering krävs (DNS eller HTTP-utmaning)", + "SMTPSENDERADDRESSMATCHESINSTANCEDOMAIN": "SMTP Avsändaradress matchar Instansdomän", + "ALLOWUSERNAMEPASSWORD_DESC": "Den konventionella inloggningen med användarnamn och lösenord är tillåten.", + "ALLOWEXTERNALIDP_DESC": "Inloggning är tillåten för de underliggande identitetsleverantörerna", + "ALLOWREGISTER_DESC": "Om alternativet är valt visas ett ytterligare steg för att registrera en användare i inloggningen.", + "FORCEMFA": "Tvinga MFA", + "FORCEMFALOCALONLY": "Tvinga MFA för lokalt autentiserade användare", + "FORCEMFALOCALONLY_DESC": "Om alternativet är valt måste lokalt autentiserade användare konfigurera en andra faktor för inloggning.", + "HIDEPASSWORDRESET_DESC": "Om alternativet är valt kan användaren inte återställa sitt lösenord i inloggningsprocessen.", + "HIDELOGINNAMESUFFIX": "Dölj inloggningsnamn suffix", + "HIDELOGINNAMESUFFIX_DESC": "Döljer inloggningsnamn suffix i inloggningsgränssnittet", + "IGNOREUNKNOWNUSERNAMES_DESC": "Om alternativet är valt kommer lösenordsskärmen att visas i inloggningsprocessen även om användaren inte hittades. Felet vid lösenordskontrollen kommer inte att avslöja om användarnamnet eller lösenordet var fel.", + "ALLOWDOMAINDISCOVERY_DESC": "Om alternativet är valt kommer suffixet (@domain.com) av ett okänt användarnamn som anges på inloggningsskärmen att matchas mot organisationsdomänerna och omdirigeras till registreringen av den organisationen vid framgång.", + "DEFAULTREDIRECTURI": "Standard omdirigerings-URI", + "DEFAULTREDIRECTURI_DESC": "Definierar vart användaren kommer att omdirigeras om inloggningen har startat utan en appkontext (t.ex. från e-post)", + "ERRORMSGPOPUP": "Visa fel i dialog", + "DISABLEWATERMARK": "Dölj Vattenstämpel", + "DISABLEWATERMARK_DESC": "Dölj Powered by ZITADEL vattenstämpel i inloggningsgränssnittet" + }, + "RESET": "Återställ till instansstandard", + "CREATECUSTOM": "Skapa Anpassad Policy", + "TOAST": { + "SET": "Policy inställd framgångsrikt!", + "RESETSUCCESS": "Policy återställd framgångsrikt!", + "UPLOADSUCCESS": "Uppladdad framgångsrikt!", + "DELETESUCCESS": "Raderad framgångsrikt!", + "UPLOADFAILED": "Uppladdning misslyckades!" + } + }, + "ORG_DETAIL": { + "TITLE": "Organisation", + "DESCRIPTION": "Här kan du redigera konfigurationen av din organisation och hantera medlemmarna.", + "DETAIL": { + "TITLE": "Detalj", + "NAME": "Namn", + "DOMAIN": "Domän", + "STATE": { + "0": "Inte definierad", + "1": "Aktiv", + "2": "Inaktiv" + } + }, + "MEMBER": { + "TITLE": "Medlemmar", + "USERNAME": "Användarnamn", + "DISPLAYNAME": "Visningsnamn", + "LOGINNAME": "Inloggningsnamn", + "EMAIL": "E-post", + "ROLES": "Roller", + "ADD": "Lägg till medlem", + "ADDDESCRIPTION": "Ange namnen på de användare som ska läggas till." + }, + "TABLE": { + "TOTAL": "Totalt antal poster", + "SELECTION": "Valda element", + "DEACTIVATE": "Inaktivera användare", + "ACTIVATE": "Aktivera användare", + "DELETE": "Radera användare", + "CLEAR": "Rensa val" + } + }, + "PROJECT": { + "PAGES": { + "TITLE": "Projekt", + "DESCRIPTION": "Här kan du definiera applikationer, hantera roller och ge andra organisationer tillgång till ditt projekt.", + "DELETE": "Radera Projekt", + "DETAIL": "Detalj", + "CREATE": "Skapa Projekt", + "CREATE_DESC": "Ange ditt projekts namn.", + "ROLE": "Roll", + "NOITEMS": "Inga projekt", + "ZITADELPROJECT": "Detta tillhör ZITADEL-projektet. Observera: Om du gör ändringar kan ZITADEL inte fungera som avsett.", + "TYPE": { + "OWNED": "Ägda Projekt", + "OWNED_SINGULAR": "Ägt Projekt", + "GRANTED_SINGULAR": "Beviljat Projekt" + }, + "PRIVATELABEL": { + "TITLE": "Varumärkesinställning", + "0": { + "TITLE": "Ospecificerad", + "DESC": "Så snart användaren identifieras kommer varumärket för den identifierade användarens organisation att visas, innan systemets standard visas." + }, + "1": { + "TITLE": "Använd projektinställning", + "DESC": "Varumärket för organisationen som äger projektet kommer att visas" + }, + "2": { + "TITLE": "Använd användarorganisationens inställning", + "DESC": "Varumärket för projektets organisation kommer att visas, men så snart användaren identifieras kommer inställningen för den identifierade användarens organisation att visas." + }, + "DIALOG": { + "TITLE": "Varumärkesinställning", + "DESCRIPTION": "Välj beteendet för inloggningen när du använder projektet." + } + }, + "PINNED": "Fäst", + "ALL": "Alla", + "CREATEDON": "Skapad den", + "LASTMODIFIED": "Senast ändrad den", + "ADDNEW": "Skapa Nytt Projekt", + "DIALOG": { + "REACTIVATE": { + "TITLE": "Återaktivera Projekt", + "DESCRIPTION": "Vill du verkligen återaktivera ditt projekt?" + }, + "DEACTIVATE": { + "TITLE": "Inaktivera Projekt", + "DESCRIPTION": "Vill du verkligen inaktivera ditt projekt?" + }, + "DELETE": { + "TITLE": "Radera Projekt", + "DESCRIPTION": "Vill du verkligen radera ditt projekt?", + "TYPENAME": "Skriv namnet på projektet för att radera det permanent." + } + } + }, + "SETTINGS": { + "TITLE": "Inställningar", + "DESCRIPTION": "" + }, + "STATE": { + "TITLE": "Status", + "0": "Ej definierad", + "1": "Aktiv", + "2": "Inaktiv" + }, + "TYPE": { + "TITLE": "Typ", + "0": "Okänd typ", + "1": "Ägd", + "2": "Beviljad" + }, + "NAME": "Namn", + "NAMEDIALOG": { + "TITLE": "Byt Namn på Projekt", + "DESCRIPTION": "Ange det nya namnet för ditt projekt", + "NAME": "Nytt Namn" + }, + "MEMBER": { + "TITLE": "administratörer", + "TITLEDESC": "administratörer kan göra ändringar i detta projekt baserat på deras roll.", + "DESCRIPTION": "Dessa administratörer kan kanske redigera ditt projekt.", + "USERNAME": "Användarnamn", + "DISPLAYNAME": "Visningsnamn", + "LOGINNAME": "Inloggningsnamn", + "EMAIL": "E-post", + "ROLES": "Roller", + "USERID": "Användar-ID" + }, + "GRANT": { + "EMPTY": "Ingen beviljad organisation.", + "TITLE": "Projektbeviljanden", + "DESCRIPTION": "Tillåt en annan organisation att använda ditt projekt.", + "EDITTITLE": "Redigera roller", + "CREATE": { + "TITLE": "Skapa Organisationsbeviljande", + "SEL_USERS": "Välj de användare du vill ge tillgång", + "SEL_PROJECT": "Sök efter ett projekt", + "SEL_ROLES": "Välj de roller du vill lägga till i beviljandet", + "SEL_USER": "Välj användare", + "SEL_ORG": "Sök en organisation", + "SEL_ORG_DESC": "Sök organisationen att bevilja.", + "ORG_DESCRIPTION": "Du håller på att bevilja en användare för organisationen {{name}}.", + "ORG_DESCRIPTION_DESC": "Byt kontext i rubriken ovan för att bevilja en användare för en annan organisation.", + "SEL_ORG_FORMFIELD": "Organisation", + "FOR_ORG": "Beviljandet skapas för:" + }, + "DETAIL": { + "TITLE": "Projektbeviljande", + "DESC": "Du kan välja vilka roller som kan användas av den specificerade organisationen och välja administratörer", + "MEMBERTITLE": "administratörer", + "MEMBERDESC": "Dessa är administratörerna för den beviljade organisationen. Lägg till användare här som ska få tillgång att redigera projektets data.", + "PROJECTNAME": "Projektnamn", + "GRANTEDORG": "Beviljad Organisation", + "RESOURCEOWNER": "Resursägare" + }, + "STATE": "Status", + "STATES": { + "1": "Aktiv", + "2": "Inaktiv" + }, + "ALL": "Alla", + "SHOWDETAIL": "Visa Detaljer", + "USER": "Användare", + "MEMBERS": "administratörer", + "ORG": "Organisation", + "PROJECTNAME": "Projektnamn", + "GRANTEDORG": "Beviljad Organisation", + "GRANTEDORGDOMAIN": "Domän", + "RESOURCEOWNER": "Resursägare", + "GRANTEDORGNAME": "Organisationsnamn", + "GRANTID": "Beviljande-ID", + "CREATIONDATE": "Skapelsedatum", + "CHANGEDATE": "Senast ändrad", + "DATES": "Datum", + "ROLENAMESLIST": "Roller", + "NOROLES": "Inga roller", + "TYPE": "Typ", + "TOAST": { + "PROJECTGRANTUSERGRANTADDED": "Projektbeviljande skapat.", + "PROJECTGRANTADDED": "Projektbeviljande skapat.", + "PROJECTGRANTCHANGED": "Projektbeviljande ändrat.", + "PROJECTGRANTMEMBERADDED": "Beviljandeadministratör tillagd.", + "PROJECTGRANTMEMBERCHANGED": "Beviljandeadministratör ändrad.", + "PROJECTGRANTMEMBERREMOVED": "Beviljandeadministratör borttagen.", + "PROJECTGRANTUPDATED": "Projektbeviljande uppdaterat" + }, + "DIALOG": { + "DELETE_TITLE": "Radera projektbeviljande", + "DELETE_DESCRIPTION": "Du håller på att radera ett projektbeviljande. Är du säker?" + }, + "ROLES": "Projektroller" + }, + "APP": { + "TITLE": "Applikationer", + "NAME": "Namn", + "NAMEREQUIRED": "Ett namn krävs." + }, + "ROLE": { + "EMPTY": "Ingen roll har skapats ännu.", + "ADDNEWLINE": "Lägg till ytterligare roll", + "KEY": "Nyckel", + "TITLE": "Roller", + "DESCRIPTION": "Definiera några roller som kan användas för att skapa projektbidrag.", + "NAME": "Namn", + "DISPLAY_NAME": "Visningsnamn", + "GROUP": "Grupp", + "ACTIONS": "Åtgärder", + "ADDTITLE": "Skapa roll", + "ADDDESCRIPTION": "Ange data för den nya rollen.", + "EDITTITLE": "Redigera roll", + "EDITDESCRIPTION": "Ange de nya uppgifterna för rollen.", + "DELETE": "Ta bort roll", + "CREATIONDATE": "Skapad", + "CHANGEDATE": "Senast ändrad", + "SELECTGROUPTOOLTIP": "Välj alla roller i gruppen {{group}}.", + "OPTIONS": "Alternativ", + "ASSERTION": "Bekräfta roller vid autentisering", + "ASSERTION_DESCRIPTION": "Rollinformation skickas från Userinfo-endpoint och beroende på dina applikationsinställningar i tokens och andra typer.", + "CHECK": "Kontrollera auktorisering vid autentisering", + "CHECK_DESCRIPTION": "Om inställt, tillåts användare endast autentisera om någon roll är tilldelad deras konto.", + "DIALOG": { + "DELETE_TITLE": "Ta bort roll", + "DELETE_DESCRIPTION": "Du håller på att ta bort en projektroll. Är du säker?" + } + }, + "HAS_PROJECT": "Kontrollera projekt vid autentisering", + "HAS_PROJECT_DESCRIPTION": "Det kontrolleras om användarens organisation har detta projekt. Om inte, kan användaren inte autentiseras.", + "TABLE": { + "TOTAL": "Totalt antal poster:", + "SELECTION": "Valda element", + "DEACTIVATE": "Inaktivera projekt", + "ACTIVATE": "Aktivera projekt", + "DELETE": "Ta bort projekt", + "ORGNAME": "Organisationsnamn", + "ORGDOMAIN": "Organisationsdomän", + "STATE": "Status", + "TYPE": "Typ", + "CREATIONDATE": "Skapad den", + "CHANGEDATE": "Senast ändrad", + "RESOURCEOWNER": "Ägare", + "SHOWTABLE": "Visa tabell", + "SHOWGRID": "Visa rutnät", + "EMPTY": "Inget projekt hittades" + }, + "TOAST": { + "MEMBERREMOVED": "administratör borttagen.", + "MEMBERSADDED": "administratörer tillagda.", + "MEMBERADDED": "administratör tillagd.", + "MEMBERCHANGED": "administratör ändrad.", + "ROLESCREATED": "Roller skapade.", + "ROLEREMOVED": "Roll borttagen.", + "ROLECHANGED": "Roll ändrad.", + "REACTIVATED": "Återaktiverad.", + "DEACTIVATED": "Inaktiverad.", + "CREATED": "Projekt skapat.", + "UPDATED": "Projekt ändrat.", + "GRANTUPDATED": "Bidrag ändrat.", + "DELETED": "Projekt borttaget." + } + }, + "ROLES": { + "DIALOG": { + "DELETE_TITLE": "Ta bort roll", + "DELETE_DESCRIPTION": "Du håller på att ta bort en roll. Är du säker?" + } + }, + "NEXTSTEPS": { + "TITLE": "Nästa steg" + }, + "IDP": { + "LIST": { + "ACTIVETITLE": "Aktiva identitetsleverantörer" + }, + "CREATE": { + "TITLE": "Lägg till leverantör", + "DESCRIPTION": "Välj en eller flera av följande leverantörer.", + "STEPPERTITLE": "Skapa leverantör", + "OIDC": { + "TITLE": "OIDC-leverantör", + "DESCRIPTION": "Ange de nödvändiga uppgifterna för din OIDC-leverantör." + }, + "OAUTH": { + "TITLE": "OAuth-leverantör", + "DESCRIPTION": "Ange de nödvändiga uppgifterna för din OAuth-leverantör." + }, + "JWT": { + "TITLE": "JWT-leverantör", + "DESCRIPTION": "Ange de nödvändiga uppgifterna för din JWT-leverantör." + }, + "GOOGLE": { + "TITLE": "Google-leverantör", + "DESCRIPTION": "Ange uppgifterna för din Google-identitetsleverantör" + }, + "GITLAB": { + "TITLE": "Gitlab-leverantör", + "DESCRIPTION": "Ange uppgifterna för din Gitlab-identitetsleverantör" + }, + "GITLABSELFHOSTED": { + "TITLE": "Gitlab självhostad leverantör", + "DESCRIPTION": "Ange uppgifterna för din självhostade Gitlab-identitetsleverantör" + }, + "GITHUBES": { + "TITLE": "GitHub Enterprise Server-leverantör", + "DESCRIPTION": "Ange uppgifterna för din GitHub Enterprise Server-identitetsleverantör" + }, + "GITHUB": { + "TITLE": "Github-leverantör", + "DESCRIPTION": "Ange uppgifterna för din Github-identitetsleverantör" + }, + "AZUREAD": { + "TITLE": "Microsoft-leverantör", + "DESCRIPTION": "Ange uppgifterna för din Microsoft-identitetsleverantör" + }, + "LDAP": { + "TITLE": "Active Directory / LDAP", + "DESCRIPTION": "Ange uppgifterna för din LDAP-leverantör" + }, + "APPLE": { + "TITLE": "Logga in med Apple", + "DESCRIPTION": "Ange uppgifterna för din Apple-leverantör" + }, + "SAML": { + "TITLE": "Logga in med SAML SP", + "DESCRIPTION": "Ange uppgifterna för din SAML-leverantör" + } + }, + "DETAIL": { + "TITLE": "Identitetsleverantör", + "DESCRIPTION": "Uppdatera din leverantörskonfiguration", + "DATECREATED": "Skapad", + "DATECHANGED": "Ändrad" + }, + "OPTIONS": { + "ISAUTOCREATION": "Automatisk skapelse", + "ISAUTOCREATION_DESC": "Om valt, skapas ett konto om det inte redan finns.", + "ISAUTOUPDATE": "Automatisk uppdatering", + "ISAUTOUPDATE_DESC": "Om valt, uppdateras konton vid återautentisering.", + "ISCREATIONALLOWED": "Kontoskapande tillåtet", + "ISCREATIONALLOWED_DESC": "Avgör om konton kan skapas.", + "ISLINKINGALLOWED": "Kontolänkning tillåten", + "ISLINKINGALLOWED_DESC": "Avgör om en identitet kan länkas till ett befintligt konto.", + "AUTOLINKING_DESC": "Avgör om en identitet kommer att uppmanas att länkas till ett befintligt konto.", + "AUTOLINKINGTYPE": { + "0": "Inaktiverad", + "1": "Kontrollera befintligt användarnamn", + "2": "Kontrollera befintlig e-post" + } + }, + "OWNERTYPES": { + "0": "okänd", + "1": "Instans", + "2": "Organisation" + }, + "STATES": { + "1": "aktiv", + "2": "inaktiv" + }, + "AZUREADTENANTTYPES": { + "3": "Hyresgäst-ID", + "0": "Allmän", + "1": "Organisationer", + "2": "Konsumenter" + }, + "AZUREADTENANTTYPE": "Hyresgästtyp", + "AZUREADTENANTID": "Hyresgäst-ID", + "EMAILVERIFIED": "E-post verifierad", + "NAMEHINT": "Om specificerat kommer det att visas i inloggningsgränssnittet.", + "OPTIONAL": "valfritt", + "LDAPATTRIBUTES": "LDAP-attribut", + "UPDATEBINDPASSWORD": "uppdatera Bind-lösenord", + "UPDATECLIENTSECRET": "uppdatera klienthemlighet", + "ADD": "Lägg till identitetsleverantör", + "TYPE": "Typ", + "OWNER": "Ägare", + "ID": "ID", + "NAME": "Namn", + "AUTHORIZATIONENDPOINT": "Auktoriseringsslutpunkt", + "TOKENENDPOINT": "Token-slutpunkt", + "USERENDPOINT": "Användarslutpunkt", + "IDATTRIBUTE": "ID-attribut", + "AVAILABILITY": "Tillgänglighet", + "AVAILABLE": "tillgänglig", + "AVAILABLEBUTINACTIVE": "tillgänglig men inaktiv", + "SETAVAILABLE": "sätt som tillgänglig", + "SETUNAVAILABLE": "sätt som inte tillgänglig", + "CONFIG": "Konfiguration", + "STATE": "Status", + "ISSUER": "Utfärdare", + "SCOPESLIST": "Scopes-lista", + "CLIENTID": "Klient-ID", + "CLIENTSECRET": "Klienthemlighet", + "LDAPCONNECTION": "Anslutning", + "LDAPUSERBINDING": "Användarbindning", + "BASEDN": "BaseDn", + "BINDDN": "BindDn", + "BINDPASSWORD": "Bind-lösenord", + "SERVERS": "Servrar", + "STARTTLS": "Start TLS", + "TIMEOUT": "Timeout i sekunder", + "USERBASE": "Användarbas", + "USERFILTERS": "Användarfilter", + "USEROBJECTCLASSES": "Användarobjektklasser", + "REQUIRED": "krävs", + "LDAPIDATTRIBUTE": "ID-attribut", + "AVATARURLATTRIBUTE": "Avatar-URL-attribut", + "DISPLAYNAMEATTRIBUTE": "Visningsnamn-attribut", + "EMAILATTRIBUTEATTRIBUTE": "E-post-attribut", + "EMAILVERIFIEDATTRIBUTE": "E-post verifierad-attribut", + "FIRSTNAMEATTRIBUTE": "Förnamn-attribut", + "LASTNAMEATTRIBUTE": "Efternamn-attribut", + "NICKNAMEATTRIBUTE": "Smeknamn-attribut", + "PHONEATTRIBUTE": "Telefon-attribut", + "PHONEVERIFIEDATTRIBUTE": "Telefon verifierad-attribut", + "PREFERREDLANGUAGEATTRIBUTE": "Föredraget språk-attribut", + "PREFERREDUSERNAMEATTRIBUTE": "Föredraget användarnamn-attribut", + "PROFILEATTRIBUTE": "Profil-attribut", + "IDPDISPLAYNAMMAPPING": "IDP Visningsnamn-mappning", + "USERNAMEMAPPING": "Användarnamn-mappning", + "DATES": "Datum", + "CREATIONDATE": "Skapad den", + "CHANGEDATE": "Senast ändrad", + "DEACTIVATE": "Inaktivera", + "ACTIVATE": "Aktivera", + "DELETE": "Radera", + "DELETE_TITLE": "Radera IDP", + "DELETE_DESCRIPTION": "Du håller på att radera en identitetsleverantör. De resulterande ändringarna är oåterkalleliga. Vill du verkligen göra detta?", + "REMOVE_WARN_TITLE": "Ta bort IDP", + "REMOVE_WARN_DESCRIPTION": "Du håller på att ta bort en identitetsleverantör. Detta kommer att ta bort valet av den tillgängliga IDP för dina användare och redan registrerade användare kommer inte att kunna logga in igen. Är du säker på att fortsätta?", + "DELETE_SELECTION_TITLE": "Radera IDP", + "DELETE_SELECTION_DESCRIPTION": "Du håller på att radera en identitetsleverantör. De resulterande ändringarna är oåterkalleliga. Vill du verkligen göra detta?", + "EMPTY": "Ingen IDP tillgänglig", + "OIDC": { + "GENERAL": "Allmän information", + "TITLE": "OIDC-konfiguration", + "DESCRIPTION": "Ange data för OIDC-identitetsleverantören." + }, + "JWT": { + "TITLE": "JWT-konfiguration", + "DESCRIPTION": "Ange data för JWT-identitetsleverantören.", + "HEADERNAME": "Header-namn", + "JWTENDPOINT": "JWT-slutpunkt", + "JWTKEYSENDPOINT": "JWT-nycklar slutpunkt" + }, + "APPLE": { + "TEAMID": "Team-ID", + "KEYID": "Nyckel-ID", + "PRIVATEKEY": "Privat nyckel", + "UPDATEPRIVATEKEY": "Uppdatera privat nyckel", + "UPLOADPRIVATEKEY": "Ladda upp privat nyckel", + "KEYMAXSIZEEXCEEDED": "Maximal storlek på 5kB överskriden." + }, + "SAML": { + "METADATAXML": "Metadata Xml", + "METADATAURL": "Metadata-URL", + "BINDING": "Bindning", + "SIGNEDREQUEST": "Signerad begäran", + "NAMEIDFORMAT": "NameID-format", + "TRANSIENTMAPPINGATTRIBUTENAME": "Anpassat mappningsattributnamn", + "TRANSIENTMAPPINGATTRIBUTENAME_DESC": "Alternativt attributnamn för att mappa användaren om `nameid-format` som returneras är `transient`, t.ex. `http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress`" + }, + "TOAST": { + "SAVED": "Sparat framgångsrikt.", + "REACTIVATED": "IDP återaktiverad.", + "DEACTIVATED": "IDP inaktiverad.", + "SELECTEDREACTIVATED": "Valda IDP:er återaktiverade.", + "SELECTEDDEACTIVATED": "Valda IDP:er inaktiverade.", + "SELECTEDKEYSDELETED": "Valda IDP:er raderade.", + "DELETED": "IDP borttagen framgångsrikt!", + "ADDED": "Tillagd framgångsrikt.", + "REMOVED": "Borttagen framgångsrikt." + }, + "ISIDTOKENMAPPING": "Mappa från ID-token", + "ISIDTOKENMAPPING_DESC": "Om valt, mappas leverantörsinformation från ID-token, inte från användarinfo-slutpunkten." + }, + "MFA": { + "LIST": { + "MULTIFACTORTITLE": "lösenordsfri", + "MULTIFACTORDESCRIPTION": "Definiera dina tvåfaktorer för din lösenordsfria autentisering här.", + "SECONDFACTORTITLE": "Tvåfaktorautentisering", + "SECONDFACTORDESCRIPTION": "Definiera ytterligare möjliga faktorer med vilka du kan säkra din lösenordsautentisering." + }, + "CREATE": { + "TITLE": "Ny faktor", + "DESCRIPTION": "Välj din nya faktortyp." + }, + "DELETE": { + "TITLE": "Radera faktor", + "DESCRIPTION": "Du håller på att radera en faktor från inloggningsinställningarna. Är du säker?" + }, + "TOAST": { + "ADDED": "Tillagd framgångsrikt.", + "SAVED": "Sparat framgångsrikt.", + "DELETED": "Borttagen framgångsrikt" + }, + "TYPE": "Typ", + "MULTIFACTORTYPES": { + "0": "Okänd", + "1": "Fingeravtryck, säkerhetsnycklar, Face ID och andra" + }, + "SECONDFACTORTYPES": { + "0": "Okänd", + "1": "Engångslösenord via autentiseringsapp (TOTP)", + "2": "Fingeravtryck, säkerhetsnycklar, Face ID och andra", + "3": "Engångslösenord via e-post (E-post OTP)", + "4": "Engångslösenord via SMS (SMS OTP)" + } + }, + "LOGINPOLICY": { + "CREATE": { + "TITLE": "Inloggningsinställningar", + "DESCRIPTION": "Definiera hur dina användare kan autentiseras på din organisation." + }, + "IDPS": "Identitetsleverantörer", + "ADDIDP": { + "TITLE": "Lägg till identitetsleverantör", + "DESCRIPTION": "Du kan välja fördefinierade eller egen skapade leverantörer för autentisering.", + "SELECTIDPS": "Identitetsleverantörer" + }, + "PASSWORDLESS": "lösenordsfri inloggning", + "PASSWORDLESSTYPE": { + "0": "Inte tillåtet", + "1": "Tillåtet" + } + }, + "SMTP": { + "LIST": { + "TITLE": "SMTP-leverantör", + "DESCRIPTION": "Dessa är SMTP-leverantörerna för din ZITADEL-instans. Aktivera den du vill använda för att skicka meddelanden till dina användare.", + "EMPTY": "Ingen SMTP-leverantör tillgänglig", + "ACTIVATED": "Aktiverad", + "ACTIVATE": "Aktivera leverantör", + "DEACTIVATE": "Inaktivera leverantör", + "TYPE": "Typ", + "DIALOG": { + "ACTIVATED": "SMTP-konfigurationen har aktiverats", + "ACTIVATE_WARN_TITLE": "Aktivera SMTP-konfiguration", + "ACTIVATE_WARN_DESCRIPTION": "Du håller på att aktivera en SMTP-konfiguration. Först kommer vi att inaktivera den nuvarande aktiva leverantören och sedan aktivera denna konfiguration. Är du säker?", + "DEACTIVATE_WARN_TITLE": "Inaktivera SMTP-konfiguration", + "DEACTIVATE_WARN_DESCRIPTION": "Du håller på att inaktivera en SMTP-konfiguration. Är du säker?", + "DEACTIVATED": "SMTP-konfigurationen har inaktiverats", + "DELETE_TITLE": "Radera SMTP-konfiguration", + "DELETE_DESCRIPTION": "Du håller på att radera en konfiguration. Bekräfta denna åtgärd genom att skriva avsändarnamnet", + "DELETED": "SMTP-konfigurationen har raderats", + "SENDER": "Skriv {{value}}, för att radera denna SMTP-konfiguration." + } + }, + "CREATE": { + "TITLE": "Lägg till SMTP-leverantör", + "DESCRIPTION": "Välj en eller flera av följande leverantörer.", + "STEPS": { + "TITLE": "Lägg till {{ value }} SMTP-leverantör", + "CREATE_DESC_TITLE": "Ange dina {{ value }} SMTP-inställningar steg för steg", + "CURRENT_DESC_TITLE": "Dessa är dina SMTP-inställningar", + "PROVIDER_SETTINGS": "SMTP-leverantörsinställningar", + "SENDER_SETTINGS": "Avsändarinställningar", + "TEST_SETTINGS": "Testa SMTP-inställningar", + "NEXT_STEPS": "Nästa steg", + "ACTIVATE": { + "TITLE": "Aktivera din SMTP-leverantör", + "DESCRIPTION": "ZITADEL kan inte använda denna SMTP-leverantör för att skicka meddelanden förrän du aktiverar den. Om du aktiverar denna leverantör kommer alla andra aktiva leverantörer nu att inaktiveras." + }, + "DEACTIVATE": { + "TITLE": "Inaktivera din SMTP-leverantör", + "DESCRIPTION": "Om du inaktiverar denna SMTP-leverantör kan ZITADEL inte använda den för att skicka meddelanden förrän du aktiverar den igen." + } + } + }, + "DETAIL": { + "TITLE": "SMTP-leverantörsinställningar" + }, + "EMPTY": "Ingen SMTP-leverantör tillgänglig", + "STEPS": { + "SENDGRID": {} + } + }, + "APP": { + "LIST": "Applikationer", + "COMPLIANCE": "OIDC-efterlevnad", + "URLS": "URL:er", + "CONFIGURATION": "Konfiguration", + "TOKEN": "Token-inställningar", + "PAGES": { + "TITLE": "Applikation", + "ID": "ID", + "DESCRIPTION": "Här kan du redigera dina applikationsdata och dess konfiguration.", + "CREATE": "Skapa applikation", + "CREATE_SELECT_PROJECT": "Välj ditt projekt först", + "CREATE_NEW_PROJECT": "eller ange namnet för ditt nya projekt", + "CREATE_DESC_TITLE": "Ange dina applikationsdetaljer steg för steg", + "CREATE_DESC_SUB": "En rekommenderad konfiguration kommer att genereras automatiskt.", + "STATE": "Status", + "DATECREATED": "Skapad", + "DATECHANGED": "Ändrad", + "URLS": "URL:er", + "DELETE": "Ta bort app", + "JUMPTOPROJECT": "För att konfigurera roller, behörigheter och mer, navigera till projektet.", + "DETAIL": { + "TITLE": "Detalj", + "STATE": { + "0": "Ej definierad", + "1": "Aktiv", + "2": "Inaktiv" + } + }, + "DIALOG": { + "CONFIG": { + "TITLE": "Ändra OIDC-konfiguration" + }, + "DELETE": { + "TITLE": "Ta bort app", + "DESCRIPTION": "Vill du verkligen ta bort denna applikation?" + } + }, + "NEXTSTEPS": { + "TITLE": "Nästa steg", + "0": { + "TITLE": "Lägg till roller", + "DESC": "Ange dina projektroller" + }, + "1": { + "TITLE": "Lägg till användare", + "DESC": "Lägg till nya användare i din organisation" + }, + "2": { + "TITLE": "Hjälp & Support", + "DESC": "Läs vår dokumentation om att skapa applikationer eller kontakta vår support" + } + } + }, + "NAMEDIALOG": { + "TITLE": "Byt namn på app", + "DESCRIPTION": "Ange det nya namnet för din app", + "NAME": "Nytt namn" + }, + "NAME": "Namn", + "TYPE": "Applikationstyp", + "AUTHMETHOD": "Autentiseringsmetod", + "AUTHMETHODSECTION": "Autentiseringsmetod", + "GRANT": "Beviljningstyper", + "ADDITIONALORIGINS": "Ytterligare ursprung", + "ADDITIONALORIGINSDESC": "Om du vill lägga till ytterligare ursprung till din app som inte används som omdirigering kan du göra det här.", + "ORIGINS": "Ursprung", + "NOTANORIGIN": "Det angivna värdet är inte ett ursprung", + "PROSWITCH": "Jag är ett proffs. Hoppa över denna guide.", + "NAMEANDTYPESECTION": "Namn och typ", + "TITLEFIRST": "Applikationens namn", + "TYPETITLE": "Applikationstyp", + "OIDC": { + "WELLKNOWN": "Ytterligare länkar kan hämtas från upptäcktsändpunkten.", + "INFO": { + "ISSUER": "Utfärdare", + "CLIENTID": "Klient-ID" + }, + "CURRENT": "Nuvarande konfiguration", + "TOKENSECTIONTITLE": "AuthToken-alternativ", + "REDIRECTSECTIONTITLE": "Omdirigeringsinställningar", + "REDIRECTTITLE": "Ange de URI:er där inloggningen kommer att omdirigera till.", + "POSTREDIRECTTITLE": "Detta är omdirigerings-URI:n efter utloggning.", + "REDIRECTDESCRIPTIONWEB": "Omdirigerings-URI:er måste börja med https://. http:// är endast giltigt med aktiverat utvecklingsläge.", + "REDIRECTDESCRIPTIONNATIVE": "Omdirigerings-URI:er måste börja med ditt eget protokoll, http://127.0.0.1, http://[::1] eller http://localhost.", + "REDIRECTNOTVALID": "Denna omdirigerings-URI är inte giltig.", + "COMMAORENTERSEPERATION": "separera med ↵", + "TYPEREQUIRED": "Typen är obligatorisk.", + "TITLE": "OIDC-konfiguration", + "CLIENTID": "Klient-ID", + "CLIENTSECRET": "Klienthemlighet", + "CLIENTSECRET_NOSECRET": "Med ditt valda autentiseringsflöde krävs ingen hemlighet och är därför inte tillgänglig.", + "CLIENTSECRET_DESCRIPTION": "Förvara din klienthemlighet på en säker plats eftersom den kommer att försvinna när dialogen stängs.", + "REGENERATESECRET": "Återskapa klienthemlighet", + "DEVMODE": "Utvecklingsläge", + "DEVMODE_ENABLED": "Aktiverad", + "DEVMODE_DISABLED": "Inaktiverad", + "DEVMODEDESC": "Observera: Med utvecklingsläge aktiverat kommer omdirigerings-URI:er inte att valideras.", + "SKIPNATIVEAPPSUCCESSPAGE": "Hoppa över inloggningsframgångssida", + "SKIPNATIVEAPPSUCCESSPAGE_DESCRIPTION": "Hoppa över framgångssidan efter en inloggning för denna inhemska app.", + "REDIRECT": "Omdirigerings-URI:er", + "REDIRECTSECTION": "Omdirigerings-URI:er", + "POSTLOGOUTREDIRECT": "Post Logout-URI:er", + "RESPONSESECTION": "Svarstyper", + "GRANTSECTION": "Beviljningstyper", + "GRANTTITLE": "Välj dina beviljningstyper. Obs: Implicit är endast tillgänglig för webbläsarbaserade applikationer.", + "APPTYPE": { + "0": "Webb", + "1": "Användaragent", + "2": "Inhemsk" + }, + "RESPONSETYPE": "Svarstyper", + "RESPONSE": { + "0": "Kod", + "1": "ID-token", + "2": "Token-ID-token" + }, + "REFRESHTOKEN": "Uppdateringstoken", + "GRANTTYPE": "Beviljningstyper", + "GRANT": { + "0": "Auktoriseringskod", + "1": "Implicit", + "2": "Uppdateringstoken", + "3": "Enhetskod", + "4": "Tokenutbyte" + }, + "AUTHMETHOD": { + "0": "Grundläggande", + "1": "Post", + "2": "Ingen", + "3": "Privat nyckel JWT" + }, + "TOKENTYPE": "Auth Token-typ", + "TOKENTYPE0": "Bärare-token", + "TOKENTYPE1": "JWT", + "UNSECUREREDIRECT": "Jag hoppas verkligen att du vet vad du gör.", + "OVERVIEWSECTION": "Översikt", + "OVERVIEWTITLE": "Du är nu klar. Granska din konfiguration.", + "ACCESSTOKENROLEASSERTION": "Lägg till användarroller till åtkomsttoken", + "ACCESSTOKENROLEASSERTION_DESCRIPTION": "Om valt, läggs de begärda rollerna för den autentiserade användaren till åtkomsttoken.", + "IDTOKENROLEASSERTION": "Användarroller i ID-token", + "IDTOKENROLEASSERTION_DESCRIPTION": "Om valt, läggs de begärda rollerna för den autentiserade användaren till ID-token.", + "IDTOKENUSERINFOASSERTION": "Användarinformation i ID-token", + "IDTOKENUSERINFOASSERTION_DESCRIPTION": "Möjliggör för klienter att hämta profil, e-post, telefon och adressanspråk från ID-token.", + "CLOCKSKEW": "Möjliggör för klienter att hantera klockförskjutning av OP och klient. Varaktigheten (0-5s) kommer att läggas till exp-anspråket och dras av från iats, auth_time och nbf.", + "RECOMMENDED": "rekommenderad", + "NOTRECOMMENDED": "inte rekommenderad", + "SELECTION": { + "APPTYPE": { + "WEB": { + "TITLE": "Webb", + "DESCRIPTION": "Vanliga webbapplikationer som .net, PHP, Node.js, Java, etc." + }, + "NATIVE": { + "TITLE": "Inhemsk", + "DESCRIPTION": "Mobilappar, skrivbord, smarta enheter, etc." + }, + "USERAGENT": { + "TITLE": "Användaragent", + "DESCRIPTION": "Single Page Applications (SPA) och i allmänhet alla JS-ramverk som körs i webbläsare" + } + } + } + }, + "API": { + "INFO": { + "CLIENTID": "Klient-ID" + }, + "REGENERATESECRET": "Återskapa klienthemlighet", + "SELECTION": { + "TITLE": "API", + "DESCRIPTION": "API:er i allmänhet" + }, + "AUTHMETHOD": { + "0": "Grundläggande", + "1": "Privat nyckel JWT" + } + }, + "SAML": { + "SELECTION": { + "TITLE": "SAML", + "DESCRIPTION": "SAML-applikationer" + }, + "CONFIGSECTION": "SAML-konfiguration", + "CHOOSEMETADATASOURCE": "Tillhandahåll din SAML-konfiguration med hjälp av ett av följande alternativ:", + "METADATAOPT1": "Alternativ 1. Ange URL:en där metadatafilen finns", + "METADATAOPT2": "Alternativ 2. Ladda upp en fil som innehåller din metadata-XML", + "METADATAOPT3": "Alternativ 3. Skapa en minimal metadatafil på språng genom att ange ENTITYID och ACS-URL", + "UPLOAD": "Ladda upp XML-fil", + "METADATA": "Metadata", + "METADATAFROMFILE": "Metadata från fil", + "CERTIFICATE": "SAML-certifikat", + "DOWNLOADCERT": "Ladda ner SAML-certifikat", + "CREATEMETADATA": "Skapa metadata", + "ENTITYID": "Enhets-ID", + "ACSURL": "ACS-slutpunkt-URL" + }, + "AUTHMETHODS": { + "CODE": { + "TITLE": "Kod", + "DESCRIPTION": "Byt ut auktoriseringskoden mot token" + }, + "PKCE": { + "TITLE": "PKCE", + "DESCRIPTION": "Använd en slumpmässig hash istället för en statisk klienthemlighet för ökad säkerhet" + }, + "POST": { + "TITLE": "POST", + "DESCRIPTION": "Skicka client_id och client_secret som en del av formuläret" + }, + "PK_JWT": { + "TITLE": "Privat Nyckel JWT", + "DESCRIPTION": "Använd en privat nyckel för att auktorisera din applikation" + }, + "BASIC": { + "TITLE": "Grundläggande", + "DESCRIPTION": "Autentisering med användarnamn och lösenord" + }, + "IMPLICIT": { + "TITLE": "Implicit", + "DESCRIPTION": "Få token direkt från auktoriseringsändpunkten" + }, + "DEVICECODE": { + "TITLE": "Enhetskod", + "DESCRIPTION": "Auktorisera enheten på en dator eller smartphone." + }, + "CUSTOM": { + "TITLE": "Anpassad", + "DESCRIPTION": "Din inställning motsvarar ingen annan alternativ." + } + }, + "TOAST": { + "REACTIVATED": "Applikation återaktiverad.", + "DEACTIVATED": "Applikation avaktiverad.", + "OIDCUPDATED": "App uppdaterad.", + "APIUPDATED": "App uppdaterad", + "UPDATED": "App uppdaterad.", + "CREATED": "App skapad.", + "CLIENTSECRETREGENERATED": "Klienthemlighet genererad.", + "DELETED": "App raderad.", + "CONFIGCHANGED": "Ändringar upptäckta!" + } + }, + "GENDERS": { + "0": "Okänd", + "1": "Kvinna", + "2": "Man", + "3": "Annat" + }, + "LANGUAGES": { + "de": "Deutsch", + "en": "English", + "es": "Español", + "fr": "Français", + "it": "Italiano", + "ja": "日本語", + "pl": "Polski", + "zh": "简体中文", + "bg": "Български", + "pt": "Português", + "mk": "Македонски", + "cs": "Čeština", + "ru": "Русский", + "nl": "Nederlands", + "sv": "Svenska" + }, + "MEMBER": { + "ADD": "Lägg till en administratör", + "CREATIONTYPE": "Skapandetyp", + "CREATIONTYPES": { + "3": "IAM", + "2": "Organisation", + "0": "Eget Projekt", + "1": "Beviljat Projekt", + "4": "Projekt" + }, + "EDITROLE": "Redigera roller", + "EDITFOR": "Redigera roller för användaren: {{value}}", + "DIALOG": { + "DELETE_TITLE": "Ta bort administratör", + "DELETE_DESCRIPTION": "Du håller på att ta bort en administratör. Är du säker?" + }, + "SHOWDETAILS": "Klicka för att visa detaljer." + }, + "ROLESLABEL": "Roller", + "GRANTS": { + "TITLE": "Auktoriseringar", + "DESC": "Dessa är alla auktoriseringar på din organisation.", + "DELETE": "Radera auktorisering", + "EMPTY": "Ingen auktorisering hittades", + "ADD": "Skapa auktorisering", + "ADD_BTN": "Ny", + "PROJECT": { + "TITLE": "Auktorisering", + "DESCRIPTION": "Definiera auktoriseringar för det specificerade projektet. Observera att du bara kan se poster för projekt och användare som du har behörighet för." + }, + "USER": { + "TITLE": "Auktorisering", + "DESCRIPTION": "Definiera auktoriseringar för den specificerade användaren. Observera att du bara kan se poster för projekt och användare som du har behörighet för." + }, + "CREATE": { + "TITLE": "Skapa auktorisering", + "DESCRIPTION": "Sök efter organisationen, projektet och de motsvarande rollerna." + }, + "EDIT": { + "TITLE": "Ändra auktorisering" + }, + "DETAIL": { + "TITLE": "Auktoriseringsdetalj", + "DESCRIPTION": "Här kan du se alla detaljer om auktoriseringen." + }, + "TOAST": { + "UPDATED": "Auktorisering uppdaterad.", + "REMOVED": "Auktorisering borttagen", + "BULKREMOVED": "Auktoriseringar borttagna.", + "CANTSHOWINFO": "Du kan inte besöka denna användares profil eftersom du inte är medlem i organisationen där denna användare tillhör" + }, + "DIALOG": { + "DELETE_TITLE": "Radera auktorisering", + "DELETE_DESCRIPTION": "Du håller på att radera en auktorisering. Vill du fortsätta?", + "BULK_DELETE_TITLE": "Radera auktoriseringar", + "BULK_DELETE_DESCRIPTION": "Du håller på att radera flera auktoriseringar. Vill du fortsätta?" + } + }, + "CHANGES": { + "LISTTITLE": "Senaste ändringar", + "BOTTOM": "Du har nått slutet av listan.", + "LOADMORE": "Ladda mer", + "ORG": { + "TITLE": "Aktivitet", + "DESCRIPTION": "Här kan du se de senaste händelserna som har genererat en organisationsförändring." + }, + "PROJECT": { + "TITLE": "Aktivitet", + "DESCRIPTION": "Här kan du se de senaste händelserna som har genererat en projektförändring." + }, + "USER": { + "TITLE": "Aktivitet", + "DESCRIPTION": "Här kan du se de senaste händelserna som har genererat en användarförändring." + } + } +} diff --git a/console/src/assets/i18n/zh.json b/console/src/assets/i18n/zh.json index c8b2baa0a1..7a40fd8fba 100644 --- a/console/src/assets/i18n/zh.json +++ b/console/src/assets/i18n/zh.json @@ -1379,7 +1379,8 @@ "mk": "Македонски", "cs": "Čeština", "ru": "Русский", - "nl": "Nederlands" + "nl": "Nederlands", + "sv": "Svenska" } }, "SMTP": { @@ -1607,7 +1608,8 @@ "mk": "Македонски", "cs": "Čeština", "ru": "Русский", - "nl": "Nederlands" + "nl": "Nederlands", + "sv": "Svenska" }, "KEYS": { "emailVerificationDoneText": "电子邮件验证完成", @@ -2540,7 +2542,8 @@ "mk": "Македонски", "cs": "Čeština", "ru": "Русский", - "nl": "Nederlands" + "nl": "Nederlands", + "sv": "Svenska" }, "MEMBER": { "ADD": "添加管理者", diff --git a/docs/docs/guides/manage/customize/texts.md b/docs/docs/guides/manage/customize/texts.md index 6d70490e15..7af98f5e18 100644 --- a/docs/docs/guides/manage/customize/texts.md +++ b/docs/docs/guides/manage/customize/texts.md @@ -48,6 +48,7 @@ ZITADEL is available in the following languages - Czech (cs) - Russian (ru) - Dutch (nl) +- Swedish (sv) A language is displayed based on your agent's language header. If a users language header doesn't match any of the supported or [restricted](#restrict-languages) languages, the instances default language will be used. diff --git a/internal/api/ui/login/static/i18n/bg.yaml b/internal/api/ui/login/static/i18n/bg.yaml index 61ef709f69..5b600eabb2 100644 --- a/internal/api/ui/login/static/i18n/bg.yaml +++ b/internal/api/ui/login/static/i18n/bg.yaml @@ -248,6 +248,7 @@ RegistrationUser: Czech: Čeština Russian: Русский Dutch: Nederlands + Swedish: Svenska GenderLabel: Пол Female: Женски пол Male: Мъжки @@ -286,6 +287,7 @@ ExternalRegistrationUserOverview: Czech: Čeština Russian: Русский Dutch: Nederlands + Swedish: Svenska TosAndPrivacyLabel: Правила и условия TosConfirm: Приемам TosLinkText: TOS @@ -353,6 +355,7 @@ ExternalNotFound: Czech: Čeština Russian: Русский Dutch: Nederlands + Swedish: Svenska DeviceAuth: Title: Упълномощаване на устройството UserCode: diff --git a/internal/api/ui/login/static/i18n/cs.yaml b/internal/api/ui/login/static/i18n/cs.yaml index 52e88e526b..095bc2efae 100644 --- a/internal/api/ui/login/static/i18n/cs.yaml +++ b/internal/api/ui/login/static/i18n/cs.yaml @@ -251,6 +251,7 @@ RegistrationUser: Czech: Čeština Russian: Русский Dutch: Nederlands + Swedish: Svenska GenderLabel: Pohlaví Female: Žena Male: Muž @@ -290,6 +291,7 @@ ExternalRegistrationUserOverview: Czech: Čeština Russian: Русский Dutch: Nederlands + Swedish: Svenska TosAndPrivacyLabel: Obchodní podmínky TosConfirm: Souhlasím s TosLinkText: obchodními podmínkami @@ -363,6 +365,7 @@ ExternalNotFound: Czech: Čeština Russian: Русский Dutch: Nederlands + Swedish: Svenska DeviceAuth: Title: Autorizace zařízení UserCode: diff --git a/internal/api/ui/login/static/i18n/de.yaml b/internal/api/ui/login/static/i18n/de.yaml index 4022abfa74..fd9904bda8 100644 --- a/internal/api/ui/login/static/i18n/de.yaml +++ b/internal/api/ui/login/static/i18n/de.yaml @@ -250,6 +250,7 @@ RegistrationUser: Czech: Čeština Russian: Русский Dutch: Nederlands + Swedish: Svenska GenderLabel: Geschlecht Female: weiblich Male: männlich @@ -289,6 +290,7 @@ ExternalRegistrationUserOverview: Czech: Čeština Russian: Русский Dutch: Nederlands + Swedish: Svenska TosAndPrivacyLabel: Allgemeine Geschäftsbedingungen und Datenschutz TosConfirm: Ich akzeptiere die TosLinkText: AGB @@ -362,6 +364,7 @@ ExternalNotFound: Czech: Čeština Russian: Русский Dutch: Nederlands + Swedish: Svenska DeviceAuth: Title: Gerätezulassung UserCode: diff --git a/internal/api/ui/login/static/i18n/en.yaml b/internal/api/ui/login/static/i18n/en.yaml index b3f6cd4793..64b15e2985 100644 --- a/internal/api/ui/login/static/i18n/en.yaml +++ b/internal/api/ui/login/static/i18n/en.yaml @@ -251,6 +251,7 @@ RegistrationUser: Czech: Čeština Russian: Русский Dutch: Nederlands + Swedish: Svenska GenderLabel: Gender Female: Female Male: Male @@ -290,6 +291,7 @@ ExternalRegistrationUserOverview: Czech: Čeština Russian: Русский Dutch: Nederlands + Swedish: Svenska TosAndPrivacyLabel: Terms and conditions TosConfirm: I accept the TosLinkText: TOS @@ -363,6 +365,7 @@ ExternalNotFound: Czech: Čeština Russian: Русский Dutch: Nederlands + Swedish: Svenska DeviceAuth: Title: Device Authorization UserCode: diff --git a/internal/api/ui/login/static/i18n/es.yaml b/internal/api/ui/login/static/i18n/es.yaml index 29336ab5a2..9463c1ef3c 100644 --- a/internal/api/ui/login/static/i18n/es.yaml +++ b/internal/api/ui/login/static/i18n/es.yaml @@ -251,6 +251,7 @@ RegistrationUser: Czech: Čeština Russian: Русский Dutch: Nederlands + Swedish: Svenska GenderLabel: Género Female: Mujer Male: Hombre @@ -290,6 +291,7 @@ ExternalRegistrationUserOverview: Czech: Čeština Russian: Русский Dutch: Nederlands + Swedish: Svenska TosAndPrivacyLabel: Términos y condiciones TosConfirm: Acepto los TosLinkText: TDS @@ -363,6 +365,7 @@ ExternalNotFound: Czech: Čeština Russian: Русский Dutch: Nederlands + Swedish: Svenska Footer: PoweredBy: Powered By diff --git a/internal/api/ui/login/static/i18n/fr.yaml b/internal/api/ui/login/static/i18n/fr.yaml index 69cd70518a..11a3c5baf8 100644 --- a/internal/api/ui/login/static/i18n/fr.yaml +++ b/internal/api/ui/login/static/i18n/fr.yaml @@ -251,6 +251,7 @@ RegistrationUser: Czech: Čeština Russian: Русский Dutch: Nederlands + Swedish: Svenska GenderLabel: Genre Female: Femme Male: Homme @@ -290,6 +291,7 @@ ExternalRegistrationUserOverview: Czech: Čeština Russian: Русский Dutch: Nederlands + Swedish: Svenska TosAndPrivacyLabel: Termes et conditions TosConfirm: J'accepte les TosLinkText: TOS @@ -363,6 +365,7 @@ ExternalNotFound: Czech: Čeština Russian: Русский Dutch: Nederlands + Swedish: Svenska DeviceAuth: Title: Autorisation de l'appareil diff --git a/internal/api/ui/login/static/i18n/it.yaml b/internal/api/ui/login/static/i18n/it.yaml index 8b969e6c6f..dd5e47406f 100644 --- a/internal/api/ui/login/static/i18n/it.yaml +++ b/internal/api/ui/login/static/i18n/it.yaml @@ -251,6 +251,7 @@ RegistrationUser: Czech: Čeština Russian: Русский Dutch: Nederlands + Swedish: Svenska GenderLabel: Genere Female: Femminile Male: Maschile @@ -290,6 +291,7 @@ ExternalRegistrationUserOverview: Czech: Čeština Russian: Русский Dutch: Nederlands + Swedish: Svenska TosAndPrivacyLabel: Termini di servizio TosConfirm: Accetto i TosLinkText: Termini di servizio @@ -363,6 +365,7 @@ ExternalNotFound: Czech: Čeština Russian: Русский Dutch: Nederlands + Swedish: Svenska DeviceAuth: Title: Autorizzazione del dispositivo diff --git a/internal/api/ui/login/static/i18n/ja.yaml b/internal/api/ui/login/static/i18n/ja.yaml index da55ccb523..ce5db4e3bf 100644 --- a/internal/api/ui/login/static/i18n/ja.yaml +++ b/internal/api/ui/login/static/i18n/ja.yaml @@ -243,6 +243,7 @@ RegistrationUser: Czech: Čeština Russian: Русский Dutch: Nederlands + Swedish: Svenska GenderLabel: 性別 Female: 女性 Male: 男性 @@ -282,6 +283,7 @@ ExternalRegistrationUserOverview: Czech: Čeština Russian: Русский Dutch: Nederlands + Swedish: Svenska TosAndPrivacyLabel: 利用規約 TosConfirm: 私は利用規約を承諾します。 TosLinkText: TOS @@ -355,6 +357,7 @@ ExternalNotFound: Czech: Čeština Russian: Русский Dutch: Nederlands + Swedish: Svenska DeviceAuth: Title: デバイス認証 diff --git a/internal/api/ui/login/static/i18n/mk.yaml b/internal/api/ui/login/static/i18n/mk.yaml index c05af2b691..10d094c113 100644 --- a/internal/api/ui/login/static/i18n/mk.yaml +++ b/internal/api/ui/login/static/i18n/mk.yaml @@ -251,6 +251,7 @@ RegistrationUser: Czech: Čeština Russian: Русский Dutch: Nederlands + Swedish: Svenska GenderLabel: Пол Female: Женски Male: Машки @@ -290,6 +291,7 @@ ExternalRegistrationUserOverview: Czech: Čeština Russian: Русский Dutch: Nederlands + Swedish: Svenska TosAndPrivacyLabel: Правила и услови TosConfirm: Се согласувам со TosLinkText: правилата за користење @@ -363,6 +365,7 @@ ExternalNotFound: Czech: Čeština Russian: Русский Dutch: Nederlands + Swedish: Svenska DeviceAuth: Title: Овластување преку уред diff --git a/internal/api/ui/login/static/i18n/nl.yaml b/internal/api/ui/login/static/i18n/nl.yaml index 5b76ee4179..dde35daf7e 100644 --- a/internal/api/ui/login/static/i18n/nl.yaml +++ b/internal/api/ui/login/static/i18n/nl.yaml @@ -251,6 +251,7 @@ RegistrationUser: Czech: Čeština Russian: Русский Dutch: Nederlands + Swedish: Svenska GenderLabel: Geslacht Female: Vrouw Male: Man @@ -290,6 +291,7 @@ ExternalRegistrationUserOverview: Czech: Čeština Russian: Русский Nederlands: Nederlands + Swedish: Svenska TosAndPrivacyLabel: Algemene voorwaarden TosConfirm: Ik accepteer de TosLinkText: AV @@ -363,6 +365,7 @@ ExternalNotFound: Czech: Čeština Russian: Русский Dutch: Nederlands + Swedish: Svenska DeviceAuth: Title: Apparaat Autorisatie UserCode: diff --git a/internal/api/ui/login/static/i18n/pl.yaml b/internal/api/ui/login/static/i18n/pl.yaml index 3f9def93a2..fae5c1710b 100644 --- a/internal/api/ui/login/static/i18n/pl.yaml +++ b/internal/api/ui/login/static/i18n/pl.yaml @@ -251,6 +251,7 @@ RegistrationUser: Czech: Čeština Russian: Русский Dutch: Nederlands + Swedish: Svenska GenderLabel: Płeć Female: Kobieta Male: Mężczyzna @@ -290,6 +291,7 @@ ExternalRegistrationUserOverview: Czech: Čeština Russian: Русский Dutch: Nederlands + Swedish: Svenska TosAndPrivacyLabel: Warunki i zasady TosConfirm: Akceptuję TosLinkText: Warunki korzystania @@ -363,6 +365,7 @@ ExternalNotFound: Czech: Čeština Russian: Русский Dutch: Nederlands + Swedish: Svenska DeviceAuth: Title: Autoryzacja urządzenia diff --git a/internal/api/ui/login/static/i18n/pt.yaml b/internal/api/ui/login/static/i18n/pt.yaml index 99aff3a8c3..41f943b1cd 100644 --- a/internal/api/ui/login/static/i18n/pt.yaml +++ b/internal/api/ui/login/static/i18n/pt.yaml @@ -247,6 +247,7 @@ RegistrationUser: Czech: Čeština Russian: Русский Dutch: Nederlands + Swedish: Svenska GenderLabel: Gênero Female: Feminino Male: Masculino @@ -286,6 +287,7 @@ ExternalRegistrationUserOverview: Czech: Čeština Russian: Русский Dutch: Nederlands + Swedish: Svenska TosAndPrivacyLabel: Termos e condições TosConfirm: Eu aceito os TosLinkText: termos de serviço @@ -359,6 +361,7 @@ ExternalNotFound: Czech: Čeština Russian: Русский Dutch: Nederlands + Swedish: Svenska DeviceAuth: Title: Autorização de dispositivo diff --git a/internal/api/ui/login/static/i18n/ru.yaml b/internal/api/ui/login/static/i18n/ru.yaml index cd756cbdd8..258c5baf95 100644 --- a/internal/api/ui/login/static/i18n/ru.yaml +++ b/internal/api/ui/login/static/i18n/ru.yaml @@ -250,6 +250,7 @@ RegistrationUser: Czech: Čeština Russian: Русский Dutch: Nederlands + Swedish: Svenska GenderLabel: Пол Female: Женский Male: Мужской @@ -289,6 +290,7 @@ ExternalRegistrationUserOverview: Czech: Čeština Russian: Русский Dutch: Nederlands + Swedish: Svenska TosAndPrivacyLabel: Условия использования TosConfirm: Я согласен с TosLinkText: Пользовательским соглашением @@ -362,6 +364,7 @@ ExternalNotFound: Czech: Čeština Russian: Русский Dutch: Nederlands + Swedish: Svenska DeviceAuth: Title: Авторизация устройства diff --git a/internal/api/ui/login/static/i18n/sv.yaml b/internal/api/ui/login/static/i18n/sv.yaml new file mode 100644 index 0000000000..1514be228c --- /dev/null +++ b/internal/api/ui/login/static/i18n/sv.yaml @@ -0,0 +1,501 @@ +Login: + Title: Välkommen! + Description: Logga in med dina användaruppgifter + TitleLinking: Koppla ihop inloggningskonto + DescriptionLinking: Ange dina användaruppgifter för att länka med ett befintligt konto + LoginNameLabel: Login-namn + UsernamePlaceHolder: Användarnamn + LoginnamePlaceHolder: namn@domain.com + ExternalUserDescription: Använd ett externt konto + MustBeMemberOfOrg: Användaren måste finnas i organisationen {{.OrgName}}. + RegisterButtonText: Skapa nytt konto + NextButtonText: Fortsätt + +LDAP: + Title: Logga in + Description: Ange dina användaruppgifter. + LoginNameLabel: Login-namn + PasswordLabel: Lösenord + NextButtonText: Fortsätt + +SelectAccount: + Title: Välj konto + Description: Använd befintligt konto + TitleLinking: Välj konto som ska kopplas ihop + DescriptionLinking: Välj det konto som ska kopplas ihop med det extrerna kontot + OtherUser: Välj ett annat konto + SessionState0: aktivt + SessionState1: Utloggad + MustBeMemberOfOrg: Användaren måste finnas i organisationen {{.OrgName}}. + +Lösenord: + Title: Lösenord + Description: Ange dina användaruppgifter. + PasswordLabel: Lösenord + MinLength: Måste vara minst + MinLengthp2: tecken långt. + MaxLength: Får inte vara längre än 70 tecken. + HasUppercase: Måste innehålla minst en stor bokstav. + HasLowercase: Måste innehålla minst en liten bokstav. + HasNumber: Måste innehålla minst en siffra. + HasSymbol: Måste innehålla minst ett specialtecken. + Confirmation: Lösenorden stämmer. + ResetLinkText: Återställ lösenord + BackButtonText: Tillbaka + NextButtonText: Fortsätt + +UsernameChange: + Title: Ändra användarnamn + Description: Ange ditt nya användarnamn + UsernameLabel: Användarnamn + CancelButtonText: Avbryt + NextButtonText: Fortsätt + +UsernameChangeDone: + Title: Användarnamn ändrat + Description: Ditt användarnamn har ändrats. + NextButtonText: Fortsätt + +InitPassword: + Title: Ange lösenord + Description: Vi har skickat en kod som du behöver ange i fältet nedan innan du kan ändra ditt lösenord. + CodeLabel: Kod + NewPasswordLabel: Nytt lösenord + NewPasswordConfirmLabel: Bekräfta lösenord + ResendButtonText: Skicka en ny kod + NextButtonText: Fortsätt + +InitPasswordDone: + Title: Lösenord ändrat + Description: Lösenordet har ändrats + NextButtonText: Fortsätt + CancelButtonText: Avbryt + +InitUser: + Title: Aktivera ditt användarkonto + Description: Bekräfta din e-postadress genom att fylla i koden från meddelandet vi skickat i fältet nedan. + CodeLabel: Kod + NewPasswordLabel: Nytt lösenord + NewPasswordConfirm: Bekräfta lösenord + NextButtonText: Fortsätt + ResendButtonText: Skicka en ny kod + +InitUserDone: + Title: Aktiverat användarkonto + Description: E-postadressen är bekräftad och lösenordet har sparats. + NextButtonText: Fortsätt + CancelButtonText: Avbryt + +InitMFAPrompt: + Title: tvåfaktorinställningar + Description: 2-factor-identifiering ökar säkerheten för ditt konto. Enbart du som har tillgång till enheten kan logga in. + Provider0: Mobil App (T ex Google/Microsoft Authenticator, Authy) + Provider1: Din fysiska mobil/laptop (T ex FaceID, Windows Hello, Fingeravtryck) + Provider3: Engångslösenord på SMS + Provider4: Engångslösenord på E-Post + NextButtonText: Fortsätt + SkipButtonText: Använd inte 2-faktor + +InitMFAOTP: + Title: Tvåfaktor verifiering + Description: Bekräfta med en andra faktor. Ladda ned en autentiserings-app (T ex Google/Microsoft Authenticator, Authy) om du inte redan har en. + OTPDescription: Skanna koden med din autentiserings-app (T ex Google/Microsoft Authenticator, Authy). Eller kopiera nyckeln och fyll i den genererade säkerhetskoden här nedan. + SecretLabel: Nyckel + CodeLabel: Säkerhetskod + NextButtonText: Fortsätt + CancelButtonText: Avbryt + +InitMFAOTPSMS: + Title: Tvåfaktor verifiering + DescriptionPhone: Verifiera med en andra faktor. Ange ditt mobilnummer. + DescriptionCode: Verifiera med en andra faktor. Ange koden du fått på SMS för att bekräfta ditt mobilnr. + PhoneLabel: Mobilnr + CodeLabel: Kod + EditButtonText: Ändra + ResendButtonText: Skicka på nytt + NextButtonText: Fortsätt + +InitMFAU2F: + Title: Lägg till säkerhetsnyckel + Description: Säkerhetsnycklar kan genereras från din mobil, via Bluetooth eller från en enhet som kopplas till din dators USB-port. + TokenNameLabel: Namnge enheten som skapar säkerhetsnycklar + NotSupported: Din webbläsare har inte stöd för WebAuthN-standarden. Kontrollera att du har den senaste versionen, eller byt till en webbläsare med stöd (t ex Chrome, Safari, Firefox) + RegisterTokenButtonText: Lägg till säkerhetsnyckel + ErrorRetry: Försök igen. Skapa en ny kod eller pröva ett annat sätt. + +InitMFADone: + Title: Tvåfaktor verifiering klar + Description: Bra jobbat. Ditt konto är nu skyddat med Tvåfaktor-verifiering. Din andra faktor kommer behövas vid varje inloggning. + NextButtonText: Fortsätt + CancelButtonText: Avbryt + +MFAProvider: + Provider0: Mobil App (T ex Google/Microsoft Authenticator, Authy) + Provider1: Din fysiska mobil/laptop (T ex FaceID, Windows Hello, Fingeravtryck) + Provider3: Engångslösenord på SMS + Provider4: Engångslösenord på E-Post + ChooseOther: eller välj ett annat alternativ + +VerifyMFAOTP: + Title: Verifiera tvåfaktor + Description: Verifiera med kod från din Tvåfaktor-enhet + CodeLabel: Kod + NextButtonText: Fortsätt + +VerifyOTP: + Title: Verifiera tvåfaktor + Description: Verifiera med kod från din Tvåfaktor-enhet + CodeLabel: Kod + ResendButtonText: Skicka ny kod + NextButtonText: Fortsätt + +VerifyMFAU2F: + Title: Verifiera tvåfaktor + Description: Verifiera med kod från din Tvåfaktor-enhet (t ex FaceID, Windows Hello, Fingeravtryck) + NotSupported: Din webbläsare har inte stöd för WebAuthN-standarden. Kontrollera att du har den senaste versionen, eller byt till en webbläsare med stöd (t ex Chrome, Safari, Firefox) + ErrorRetry: Försök igen, gör en ny förfrågan eller välj en annan metod. + ValidateTokenButtonText: Verifiera tvåfaktor + +Passwordless: + Title: Lösenordsfri inloggning + Description: Logga in med hjälp av din mobil/laptop (med t ex FaceID, Windows Hello, Fingeravtryck) + NotSupported: Din webbläsare har inte stöd för WebAuthN-standarden. Kontrollera att du har den senaste versionen, eller byt till en webbläsare med stöd (t ex Chrome, Safari, Firefox) + ErrorRetry: Försök igen. Skapa en ny kod eller pröva ett annat sätt. + LoginWithPwButtonText: Logga in med lösenord + ValidateTokenButtonText: Lösenordsfri inloggning + +PasswordlessPrompt: + Title: Lösenordsfri inloggning + Description: Vill du konfigurera lösenordsfri inloggning med hjälp av din mobil/laptop? (via t exFaceID, Windows Hello eller Fingeravtryck) + DescriptionInit: You need to set up passwordless login. Use the link you were given to register your device. + PasswordlessButtonText: Go passwordless + NextButtonText: Fortsätt + SkipButtonText: Skip + +PasswordlessRegistration: + Title: Konfigurera lösenordsfri inloggning + Description: Välj ett beskrivande namn för din inloggningsenhet och klicka sen på 'Konfigurera lösenordsfritt'-knappen nedan + TokenNameLabel: Namn på enheten + NotSupported: Din webbläsare har inte stöd för WebAuthN-standarden. Kontrollera att du har den senaste versionen, eller byt till en webbläsare med stöd (t ex Chrome, Safari, Firefox) + RegisterTokenButtonText: Konfigurera lösenordsfritt + ErrorRetry: Försök igen. Skapa en ny kod eller pröva ett annat sätt. + +PasswordlessRegistrationDone: + Title: Lösenordsfri inloggning klar + Description: Inloggningsenhet för lösenordsfri inloggning har sparats. + DescriptionClose: Du kan stänga det här webbläsarförnstret. + NextButtonText: Fortsätt + CancelButtonText: Avbryt + +PasswordChange: + Title: Ändra lösenord + Description: Ändra diit lösenord. Ange både ditt gamla och det nya lösenordet. + OldPasswordLabel: Gammalt lösenord + NewPasswordLabel: Nytt lösenord + NewPasswordConfirmLabel: Nytt lösenord igen + CancelButtonText: Avbryt + NextButtonText: Fortsätt + Footer: Fotnot + +PasswordChangeDone: + Title: Ändra lösenord + Description: Ditt lösenord har ändrats. + NextButtonText: Fortsätt + +PasswordResetDone: + Title: Länk för att återställa Lösenord har skickats. + Description: Kontrollera din inkorg för e-post för vidare instruktioner om hur du återställer ditt lösenord. + NextButtonText: Fortsätt + +EmailVerification: + Title: E-postverifiering + Description: Vi har skickat ett e-postmeddelande med en kod som du behöver ange i fältet nedan. + CodeLabel: Kod + NextButtonText: Fortsätt + ResendButtonText: Skicka en ny kod + +EmailVerificationDone: + Title: E-postverifiering + Description: Din e-postadress har bekräftats. + NextButtonText: Fortsätt + CancelButtonText: Avbryt + LoginButtonText: Logga in + +RegisterOption: + Title: Registrera användarkonto + Description: Hur vill du registrera dig? + RegisterUsernamePasswordButtonText: Med användarnamn och lösenord + ExternalLoginDescription: Med ett extern användarkonto + LoginButtonText: Logga in + +RegistrationUser: + Title: Registrering + Description: Ange din användarinformation. Din e-postadress kommer att fungera som användarnamn. + DescriptionOrgRegister: Ange din användarinformation. + EmailLabel: E-post + UsernameLabel: Användarnamn + FirstnameLabel: Förnamn + LastnameLabel: Efternamn + LanguageLabel: Språk + German: Deutsch + English: English + Italian: Italiano + French: Français + Chinese: 简体中文 + Polish: Polski + Japanese: 日本語 + Spanish: Español + Bulgarian: Български + Portuguese: Português + Macedonian: Македонски + Czech: Čeština + Russian: Русский + Dutch: Nederlands + Swedish: Svenska + GenderLabel: Kön + Female: Man + Male: Kvinna + Diverse: Ickebinär + PasswordLabel: Lösenord + PasswordConfirmLabel: Lösenord igen + TosAndPrivacyLabel: Användarvillkor + TosConfirm: Jag accepterar + TosLinkText: Användarvillkoren + PrivacyConfirm: Jag accepterar + PrivacyLinkText: personuppgiftspolicyn + ExternalLogin: eller registrera dig med ett extern användarkonto + BackButtonText: Logga in + NextButtonText: Fortsätt + +ExternalRegistrationUserOverview: + Title: Registrering via externt konto + Description: Vi har fyllt i den information som fanns från det exrna kontot. Du kan komplettera eler ändra den här. + EmailLabel: E-post + UsernameLabel: Användarnamn + FirstnameLabel: Förnamn + LastnameLabel: Efternamn + NicknameLabel: Tilltalsnamn + PhoneLabel: Mobilnummer + LanguageLabel: språk + German: Deutsch + English: English + Italian: Italiano + French: Français + Chinese: 简体中文 + Polish: Polski + Japanese: 日本語 + Spanish: Español + Bulgarian: Български + Portuguese: Português + Macedonian: Македонски + Czech: Čeština + Russian: Русский + Dutch: Nederlands + Swedish: Svenska + TosAndPrivacyLabel: Användarvillkor + TosConfirm: Jag accepterar + TosLinkText: Användarvillkoren + PrivacyConfirm: Jag accepterar + PrivacyLinkText: personuppgiftspolicyn + ExternalLogin: or register with an external user + BackButtonText: Tillbaka + NextButtonText: Spara + +RegistrationOrg: + Title: Registrering av organisation + Description: Ange din organisation-data + OrgNameLabel: Namn på organisation + EmailLabel: E-post + UsernameLabel: Användarnamn + FirstnameLabel: Förnamn + LastnameLabel: Efternamn + PasswordLabel: Lösenord + PasswordConfirmLabel: Lösenord igen + TosAndPrivacyLabel: Användarvillkor + TosConfirm: Jag accepterar + TosLinkText: Användarvillkoren + PrivacyConfirm: Jag accepterar + PrivacyLinkText: personuppgiftspolicyn + SaveButtonText: Skapa organisation + +LoginSuccess: + Title: Inloggad + AutoRedirectDescription: Du kommer automatiskt skickas vidare till tjänsten. Om inget händer kan du klicka på länken nedan. Sedan kan du stänga det här fönstret. + RedirectedDescription: Du kan stänga det här fönstret nu. + NextButtonText: Fortsätt + +LogoutDone: + Title: Utloggad + Description: Du har nu loggats ut. + LoginButtonText: Logga in igen + +LinkingUserPrompt: + Title: Det finns redan ett konto + Description: "Vill du koppla ihop din inloggning med det befintliga kontot:" + LinkButtonText: Koppla ihop + OtherButtonText: Andra åtgärder + +LinkingUsersDone: + Title: Kopplar ihop användare + Description: Användarkontot kopplat. + CancelButtonText: Avbryt + NextButtonText: Fortsätt + +ExternalNotFound: + Title: Det finns inget konto + Description: Du kan registrera ett nytt konto eller koppla ihop det här kontot med ett befintligt. + LinkButtonText: Koppla ihop + AutoRegisterButtonText: Registrera nytt + TosConfirm: Jag accepterar + TosLinkText: Användarvillkoren + PrivacyConfirm: Jag accepterar + PrivacyLinkText: personuppgiftspolicyn + SaveButtonText: Skapa organisation + German: Deutsch + English: English + Italian: Italiano + French: Français + Chinese: 简体中文 + Polish: Polski + Japanese: 日本語 + Spanish: Español + Bulgarian: Български + Portuguese: Português + Macedonian: Македонски + Czech: Čeština + Russian: Русский + Dutch: Nederlands + Swedish: Svenska +DeviceAuth: + Title: Tillgång från hårdvaruenhet + UserCode: + Label: Användarkod + Description: Ange den användarkod som visas på enheten. + ButtonNext: Fortsätt + Action: + Description: Tillgång för hårdvaruenhet. + GrantDevice: Du kommer ge tillgång för hårdvaruenhet + AccessToScopes: till följande scopes + Button: + Allow: Tillåt + Deny: Neka + Done: + Description: Klart. + Approved: Hårdvaruenheten har nu tillgång. Fortsätt på enheten. + Denied: Hårdvaruenheten nekades tillgång. Du kan fortsätta på enheten. + +Footer: + PoweredBy: Bygger på + Tos: Användarvillkor + PrivacyPolicy: Personuppgiftspolicy + Help: Hjälp + SupportEmail: Kundsupport E-post + +SignIn: Logga in med {{.Provider}} + +Errors: + Internal: Ett internt fel inträffade + AuthRequest: + NotFound: Kan inte hitta authrequest + UserAgentNotCorresponding: User Agent stämmer inte överens + UserAgentNotFound: User Agent ID hittades inte + TokenNotFound: Token hittades inte + RequestTypeNotSupported: Request av en typ som inte stöds + MissingParameters: Obligatorisk parameter saknas + User: + NotFound: Användaren hittades inte + AlreadyExists: Användaren finns redan + Inactive: Användaren är inaktiverad + NotFoundOnOrg: Användaren finns inte i den valda organisationen + NotAllowedOrg: Användaren är inte medlem i den valda organisationen + NotMatchingUserID: Användaren och den användare som anges i authrequest stämmer inte överens + UserIDMissing: UserID är inte angett + Invalid: Felaktiga userdata + DomainNotAllowedAsUsername: Domänen är reserverad och kan inte användas + NotAllowedToLink: Användaren har inte rätt att kopplas ihop med ett externt konto + Profile: + NotFound: Profilen finns inte + NotChanged: Profilen har inte ändrats + Empty: Profilen saknar innehåll + FirstNameEmpty: Förnamnet i profilen är tomt + LastNameEmpty: Efternamnet i profilen är tomt + IDMissing: Profile ID saknas + E-Post: + NotFound: E-Post finns inte + Invalid: E-Post är felaktig + AlreadyVerified: E-Posten är redan bekräftad + NotChanged: E-Posten oförändrad + Empty: E-Post tomt + IDMissing: E-Post ID saknas + Phone: + NotFound: Mobilnr finns inte + Invalid: Mobilnr är ogiltigt + AlreadyVerified: Mobilnr är redan bekräftad + Empty: Mobilnr tomt + NotChanged: Mobilnr oförändrat + Address: + NotFound: Adress saknas + NotChanged: Adress oförändrad + Användarnamn: + AlreadyExists: Användarnamnet finns redan + Reserved: Användarnamnet är upptaget + Empty: Användarnamnet är tomt + Lösenord: + ConfirmationWrong: Lösenorden stämmer inte överens + Empty: Lösenordet är tomt + Invalid: Lösenordet är ogiltigt + InvalidAndLocked: Lösenordet är ogiltigt och användaren är spärrad. Ta kontakt med systemansvarig. + NotChanged: Ditt nya lösenord kan inte vara samma som ditt gamla lösenord + UsernameOrPassword: + Invalid: Användarnamn eller lösenord har felaktigt format + PasswordComplexityPolicy: + NotFound: Lösenordspolicy saknas + MinLength: Lösenordet är för kort + HasLower: Lösenordet måste innehålla små bokstäver + HasUpper: Lösenordet måste innehålla stora bokstäver + HasNumber: Lösenordet måste innehålla en siffra + HasSymbol: Lösenordet måste innehålla ett specialtecken + Code: + Expired: Koden är för gammal + Invalid: Koden är felaktig + Empty: Koden är tom + CryptoCodeNil: Cryptokoden är tom + NotFound: Koden hittades inte + GeneratorAlgNotSupported: Genereringsalgoritmen stöds inte + EmailVerify: + UserIDEmpty: UserID är tom + ExternalData: + CouldNotRead: Externa data kunde inte läsas rätt + MFA: + NoProviders: Det finns inga MFA-leverantörer tillgängliga + OTP: + AlreadyReady: Tvåfaktor OTP (OneTimePassword) är redan konfigurerat + NotExisting: Tvåfaktor OTP (OneTimePassword) finns inte + InvalidCode: Ogiltig kod + NotReady: Tvåfaktor OTP (OneTimePassword) är inte redo + Locked: Användaren är spärrad + SomethingWentWrong: Någonting gick fel + NotActive: Användaren är inaktiv + ExternalIDP: + IDPTypeNotImplemented: IdP-typen är inte implementerad + NotAllowed: Den externa konto-leverantören tillåts inte + IDPConfigIDEmpty: Identity Provider ID är tomt + ExternalUserIDEmpty: External User ID är tomt + UserDisplayNameEmpty: User Display Name är tomt + NoExternalUserData: Det kom ingen användarinformation från det externa kontot + CreationNotAllowed: Det är inte tillåtet att skapa nya konton från den här externa leverantören + LinkingNotAllowed: Det är inte tillåtet att koppla ihop konton från den här externa leverantören + GrantRequired: Det går inte att logga in just nu. Användarkontot har inte tillgång till någonting i tjänsten. Ta kontakt med systemansvarig. + ProjectRequired: Det går inte att logga in just nu. Användarkontots organisation har inte tillgång till tjänsten. Ta kontakt med systemansvarig. + IdentityProvider: + InvalidConfig: Identity Provider-konfigurationen är felaktig + IAM: + LockoutPolicy: + NotExisting: Lockout Policy saknas + Org: + LoginPolicy: + RegistrationNotAllowed: Registrering är inte tillåten + DeviceAuth: + NotExisting: Användarkoden finns inte + +optional: (frivilligt) diff --git a/internal/api/ui/login/static/i18n/zh.yaml b/internal/api/ui/login/static/i18n/zh.yaml index 85230efe0f..325af2789e 100644 --- a/internal/api/ui/login/static/i18n/zh.yaml +++ b/internal/api/ui/login/static/i18n/zh.yaml @@ -251,6 +251,7 @@ RegistrationUser: Czech: Čeština Russian: Русский Dutch: Nederlands + Swedish: Svenska GenderLabel: 性别 Female: 女性 Male: 男性 @@ -290,6 +291,7 @@ ExternalRegistrationUserOverview: Czech: Čeština Russian: Русский Dutch: Nederlands + Swedish: Svenska TosAndPrivacyLabel: 条款和条款 TosConfirm: 我接受 TosLinkText: 服务条款 @@ -363,6 +365,7 @@ ExternalNotFound: Czech: Čeština Russian: Русский Dutch: Nederlands + Swedish: Svenska DeviceAuth: Title: 设备授权 UserCode: diff --git a/internal/api/ui/login/static/templates/external_not_found_option.html b/internal/api/ui/login/static/templates/external_not_found_option.html index d0d50d8d4a..a0fc17c9a7 100644 --- a/internal/api/ui/login/static/templates/external_not_found_option.html +++ b/internal/api/ui/login/static/templates/external_not_found_option.html @@ -90,7 +90,9 @@ - + diff --git a/internal/notification/static/i18n/sv.yaml b/internal/notification/static/i18n/sv.yaml new file mode 100644 index 0000000000..4788644c79 --- /dev/null +++ b/internal/notification/static/i18n/sv.yaml @@ -0,0 +1,61 @@ +InitCode: + Title: Verifiera användare + PreHeader: Verifiera användare + Subject: Verifiera användare + Greeting: Hej {{.DisplayName}}, + Text: Din användare har skapats. Använd användarnamnet {{.PreferredLoginName}} för att logga in. Klicka på knappen nedan för att genomföra verifieringsprocessen. (Kod {{.Code}}) Om du inte begärt det här meddelande, vänligen ignorera det. + ButtonText: Slutför verifiering +PasswordReset: + Title: Återställ lösenord + PreHeader: Återställ lösenord + Subject: Återställ lösenord + Greeting: Hej {{.DisplayName}}, + Text: Vi har mottagit en begäran om att återställa lösenordet. Använd knappen nedan för att återställa ditt lösenord. (Kod {{.Code}}) Om du inte begärt det här meddelande, vänligen ignorera det. + ButtonText: Återställ lösenord +VerifyEmail: + Title: Verifiera e-post + PreHeader: Verifiera e-post + Subject: Verifiera e-post + Greeting: Hej {{.DisplayName}}, + Text: En ny e-postadress har lagts till. Använd knappen nedan för att verifiera din e-post. (Kod {{.Code}}) Om du inte lagt till en ny e-postadress, vänligen ignorera detta mail. + ButtonText: Verifiera e-post +VerifyPhone: + Title: Verifiera telefon + PreHeader: Verifiera telefon + Subject: Verifiera telefon + Greeting: Hej {{.DisplayName}}, + Text: Ett nytt mobilnummer har lagts till. Använd följande kod för att verifiera det {{.Code}} + ButtonText: Verifiera telefon +VerifyEmailOTP: + Title: Verifiera engångslösenord + PreHeader: Verifiera engångslösenord + Subject: Verifiera engångslösenord + Greeting: Hej {{.DisplayName}}, + Text: Använd engångslösenordet {{.OTP}} för att autentisera inom de närmaste fem minuterna eller klicka på "Autentisera"-knappen. + ButtonText: Autentisera +VerifySMSOTP: + Text: >- + {{.OTP}} är ditt engångslösenord för {{ .Domain }}. Använd det inom {{.Expiry}}. + + @{{.Domain}} #{{.OTP}} +DomainClaimed: + Title: Domän har blivit tagen i anspråk + PreHeader: Ändra e-post / användarnamn + Subject: Domän har blivit tagen i anspråk + Greeting: Hej {{.DisplayName}}, + Text: Domänen {{.Domain}} har blivit tagen i anspråk av en organisation. Din nuvarande användare {{.Username}} är inte en del av denna organisation. Därför måste du ändra din e-post när du loggar in. Vi har skapat ett tillfälligt användarnamn ({{.TempUsername}}) för denna inloggning. + ButtonText: Logga in +PasswordlessRegistration: + Title: Lägg till lösenordsfri inloggning + PreHeader: Lägg till lösenordsfri inloggning + Subject: Lägg till lösenordsfri inloggning + Greeting: Hej {{.DisplayName}}, + Text: Vi har mottagit en begäran om att lägga till en token för lösenordsfri inloggning. Använd knappen nedan för att lägga till din token eller enhet för lösenordsfri inloggning. + ButtonText: Lägg till lösenordsfri inloggning +PasswordChange: + Title: Användarens lösenord har ändrats + PreHeader: Ändra lösenord + Subject: Användarens lösenord har ändrats + Greeting: Hej {{.DisplayName}}, + Text: Lösenordet för din användare har ändrats. Om denna ändring inte gjordes av dig, vänligen återställ ditt lösenord omedelbart. + ButtonText: Logga in diff --git a/internal/static/i18n/sv.yaml b/internal/static/i18n/sv.yaml new file mode 100644 index 0000000000..a96638ffde --- /dev/null +++ b/internal/static/i18n/sv.yaml @@ -0,0 +1,1343 @@ +Errors: + Internal: Ett internt fel inträffade + NoChangesFound: Inga ändringar + OriginNotAllowed: Denna "Origin" är inte tillåten + IDMissing: ID saknas + ResourceOwnerMissing: Organisation för resursägare saknas + RemoveFailed: Kunde inte tas bort + ProjectionName: + Invalid: Ogiltigt projektnamn + Assets: + EmptyKey: Resursnyckel är tom + Store: + NotInitialized: Resurslagring inte initierad + NotConfigured: Resurslagring inte konfigurerad + Bucket: + Internal: Internt fel vid skapande av bucket + AlreadyExists: Bucket finns redan + CreateFailed: Bucket skapades inte + ListFailed: Buckets kunde inte läsas + RemoveFailed: Bucket raderades inte + SetPublicFailed: Kunde inte ställa om bucket till offentlig + Object: + PutFailed: Objektet skapades inte + GetFailed: Objektet kunde inte läsas + NotFound: Objektet kunde inte hittas + PresignedTokenFailed: Signerat token kunde inte skapas + ListFailed: Objektlistan kunde inte läsas + RemoveFailed: Objektet kunde inte tas bort + Limit: + ExceedsDefault: Gränsen överskrider standardgräns + Limits: + NotFound: Gränser saknas + NoneSpecified: Inga gränser specificerade + Instance: + Blocked: Instansen är blockerad + Restrictions: + NoneSpecified: Inga restriktioner specificerade + DefaultLanguageMustBeAllowed: Standardspråket måste vara tillåtet + Language: + NotParsed: Kunde inte tolka språk + NotSupported: språket stöds inte + NotAllowed: språket är inte tillåtet + Undefined: språket är odefinierat + Duplicate: Språket har dubbletter + OIDCSettings: + NotFound: OIDC-konfiguration hittades inte + AlreadyExists: OIDC-konfiguration finns redan + SecretGenerator: + AlreadyExists: Hemlig kod-generator finns redan + TypeMissing: Typ av Hemlig kod-generator saknas + NotFound: Hemlig kod-generator hittades inte + SMSConfig: + NotFound: SMS-konfiguration hittades inte + AlreadyActive: SMS-konfiguration redan aktiv + AlreadyDeactivated: SMS-konfiguration redan avaktiverad + SMTPConfig: + NotFound: SMTP-konfiguration hittades inte + AlreadyExists: SMTP-konfiguration finns redan + AlreadyDeactivated: SMTP-konfiguration redan avaktiverad + SenderAdressNotCustomDomain: Avsändaradressen måste sättas som kundanpassad domän på instansen. + Notification: + NoDomain: Ingen domän hittades för meddelandet + User: + NotFound: Användaren kunde inte hittas + AlreadyExists: Användaren finns redan + NotFoundOnOrg: Användaren kunde inte hittas på vald organisation + NotAllowedOrg: Användaren är inte medlem i den nödvändiga organisationen + UserIDMissing: Användar-ID saknas + UserIDWrong: Begärd användare är inte samma som autentiserad användare + DomainPolicyNil: Organisationspolicy är tom + EmailAsUsernameNotAllowed: E-post är inte tillåtet som användarnamn + Invalid: Användardata är ogiltiga + DomainNotAllowedAsUsername: Domänen är redan reserverad och kan inte användas + AlreadyInactive: Användaren redan inaktiv + NotInactive: Användaren är inte inaktiv + CantDeactivateInitial: Användare med status 'Initial' kan endast raderas, inte avaktiveras + ShouldBeActiveOrInitial: Användaren är inte aktiv eller initial + AlreadyInitialised: Användaren är redan initialiserad + NotInitialised: Användaren är ännu inte initialiserad + NotLocked: Användaren är inte låst + NoChanges: Inga ändringar hittades + InitCodeNotFound: Initieringskod hittades inte + UsernameNotChanged: Användarnamn ändrades inte + InvalidURLTemplate: URL-mallen är felaktig + Profile: + NotFound: Profil hittades inte + NotChanged: Profil ändrades inte + Empty: Profil är tom + FirstNameEmpty: Förnamn i profil är tom + LastNameEmpty: Efternamn i profil är tom + IDMissing: Profil-ID saknas + Email: + NotFound: E-post hittades inte + Invalid: E-post är ogiltig + AlreadyVerified: E-post är redan verifierad + NotChanged: E-post ändrades inte + Empty: E-post är tom + IDMissing: E-post-ID saknas + Phone: + NotFound: Mobilnr hittades inte + Invalid: Mobilnr är ogiltig + AlreadyVerified: Mobilnr redan verifierad + Empty: Mobilnr är tom + NotChanged: Mobilnr ändrades inte + Address: + NotFound: Adress hittades inte + NotChanged: Adress ändrades inte + Machine: + Key: + NotFound: Maskinnyckel hittades inte + AlreadyExisting: Maskinnyckel finns redan + Invalid: Publik nyckel är inte en giltig publik RSA-nyckel i PKIX-format med PEM-enkodering + Secret: + NotExisting: Hemlig kod finns inte + Invalid: Hemlig kod är ogiltig + CouldNotGenerate: Hemlig kod kunde inte genereras + PAT: + NotFound: Personlig åtkomst-token hittades inte + NotHuman: Användaren måste vara en person + NotMachine: Användaren måste vara en maskin + WrongType: Inte tillåtet för denna användartyp + NotAllowedToLink: Användare får inte länka med extern inloggningsleverantör + Username: + AlreadyExists: Användarnamn redan taget + Reserved: Användarnamn är redan taget + Empty: Användarnamn är tomt + Code: + Empty: Kod är tom + NotFound: Kod hittades inte + Expired: Kod har gått ut + GeneratorAlgNotSupported: Generatoralgoritmen stöds inte + Invalid: Koden är ogiltig + Password: + NotFound: Lösenord hittades inte + Empty: Lösenord är tomt + Invalid: Lösenord är ogiltigt + NotSet: Användare har inte ställt in ett lösenord + NotChanged: Nytt lösenord kan inte vara samma som ditt nuvarande lösenord + NotSupported: Lösenordshash-kodning stöds inte. Kolla https://zitadel.com/docs/concepts/architecture/secrets#hashed-secrets + PasswordComplexityPolicy: + NotFound: Lösenordspolicy hittades inte + MinLength: Lösenordet är för kort + MinLengthNotAllowed: Angiven minimilängd är inte tillåten + HasLower: Lösenord måste innehålla små bokstäver + HasUpper: Lösenord måste innehålla stora bokstäver + HasNumber: Lösenord måste innehålla siffror + HasSymbol: Lösenord måste innehålla symbol + ExternalIDP: + Invalid: Extern IdP ogiltig + IDPConfigNotExisting: IdP-leverantör ogiltig för denna organisation + NotAllowed: Extern IdP inte tillåten + MinimumExternalIDPNeeded: Minst en IdP måste läggas till + AlreadyExists: Extern IdP redan tagen + NotFound: Extern IdP hittades inte + LoginFailed: Inloggning hos extern IdP misslyckades + MFA: + OTP: + AlreadyReady: Tvåfaktor OTP (OneTimePassword) är redan inställd + NotExisting: Tvåfaktor OTP (OneTimePassword) finns inte + NotReady: Tvåfaktor OTP (OneTimePassword) är inte redo + InvalidCode: Ogiltig kod + U2F: + NotExisting: U2F finns inte + Passwordless: + NotExisting: Lösenordsfri finns inte + WebAuthN: + NotFound: WebAuthN-token kunde inte hittas + BeginRegisterFailed: WebAuthN-registrering misslyckades + MarshalError: Fel vid serialisering av data + ErrorOnParseCredential: Fel vid tolkning av autentiseringsdata + CreateCredentialFailed: Fel vid skapande av autentisering + BeginLoginFailed: WebAuthN-inloggning misslyckades + ValidateLoginFailed: Fel vid validering av inloggningsuppgifter + CloneWarning: Autentisering kan vara klonad + RefreshToken: + Invalid: Uppdateringstoken är ogiltigt + NotFound: Uppdateringstoken hittades inte + Instance: + NotFound: Instans hittades inte + AlreadyExists: Instans finns redan + NotChanged: Instans ändrades inte + Org: + AlreadyExists: Organisationens namn är redan taget + Invalid: Organisationen är ogiltigt + AlreadyDeactivated: Organisation är redan avaktiverad + AlreadyActive: Organisationen är redan aktiv + Empty: Organisationen är tom + NotFound: Organisationen hittades inte + NotChanged: Organisationen ändrades inte + DefaultOrgNotDeletable: Standardorganisationen får inte raderas + ZitadelOrgNotDeletable: Organisationen med ZITADEL-projekt får inte raderas + InvalidDomain: Ogiltig domän + DomainMissing: Domän saknas + DomainNotOnOrg: Domänen finns inte på organisationen + DomainNotVerified: Domänen är inte verifierad + DomainAlreadyVerified: Domänen är redan verifierad + DomainVerificationTypeInvalid: Domänverifieringstypen är ogiltig + DomainVerificationMissing: Domänverifiering har inte påbörjats + DomainVerificationFailed: Domänverifiering misslyckades + DomainVerificationTXTNotFound: TXT-posten _zitadel-challenge hittades inte för din domän. Kontrollera att du har lagt till den på din DNS-server eller vänta tills den nya posten har spridits + DomainVerificationTXTNoMatch: TXT-posten _zitadel-challenge har hittats för din domän men den innehåller inte rätt token-text. Kontrollera att du har lagt till rätt token på din DNS-server eller vänta tills den nya posten har spridits + DomainVerificationHTTPNotFound: Filen som innehåller utmaningen hittades inte på den förväntade URL:en. Kontrollera att du har laddat upp filen på rätt plats med läsbehörigheter + DomainVerificationHTTPNoMatch: Filen som innehåller utmaningen har hittats på den förväntade URL:en men den innehåller inte rätt token-text. Kontrollera dess innehåll + DomainVerificationTimeout: Det uppstod en timeout vid förfrågan till DNS-servern + PrimaryDomainNotDeletable: Primär domän får inte raderas + DomainNotFound: Domän hittades inte + MemberIDMissing: Medlems-ID saknas + MemberNotFound: Organisationsmedlem hittades inte + InvalidMember: Organisationsmedlem är ogiltig + UserIDMissing: Användar-ID saknas + PolicyAlreadyExists: Policyn finns redan + PolicyNotExisting: Policyn finns inte + IdpInvalid: IDP-konfigurationen är ogiltig + IdpNotExisting: IDP-konfigurationen finns inte + OIDCConfigInvalid: OIDC IDP-konfigurationen är ogiltig + IdpIsNotOIDC: IDP-konfigurationen är inte av typen OIDC + Domain: + AlreadyExists: Domänen finns redan + InvalidCharacter: Endast alfanumeriska tecken, . och - är tillåtna för en domän + EmptyString: Ogiltiga icke-numeriska och alfabetiska tecken ersattes med tomma utrymmen och den resulterande domänen är en tom sträng + IDP: + InvalidSearchQuery: Ogiltig sökfråga + ClientIDMissing: ClientID saknas + TeamIDMissing: TeamID saknas + KeyIDMissing: KeyID saknas + PrivateKeyMissing: Privat nyckel saknas + LoginPolicy: + NotFound: Inloggningspolicyn hittades inte + Invalid: Inloggningspolicyn är ogiltig + RedirectURIInvalid: Standard-Redirect URI är ogiltig + NotExisting: Inloggningspolicyn finns inte + AlreadyExists: Inloggningspolicyn finns redan + IdpProviderAlreadyExisting: Identitetsleverantör finns redan + IdpProviderNotExisting: Identitetsleverantör finns inte + RegistrationNotAllowed: Registrering är inte tillåten + UsernamePasswordNotAllowed: Inloggning med användarnamn/lösenord är inte tillåten + MFA: + AlreadyExists: Tvåfaktor finns redan + NotExisting: Tvåfaktor finns inte + Unspecified: Tvåfaktor är ogiltig + MailTemplate: + NotFound: Standard e-postmall hittades inte + NotChanged: Standard e-postmall har inte ändrats + AlreadyExists: Standard e-postmall finns redan + Invalid: Standard e-postmall är ogiltig + CustomMessageText: + NotFound: Standardmeddelandetext hittades inte + NotChanged: Standardmeddelandetext har inte ändrats + AlreadyExists: Standardmeddelandetext finns redan + Invalid: Standardmeddelandetext är ogiltig + PasswordComplexityPolicy: + NotFound: Lösenordskomplexitetspolicy hittades inte + Empty: Lösenordskomplexitetspolicy är tom + NotExisting: Lösenordskomplexitetspolicy finns inte + AlreadyExists: Lösenordskomplexitetspolicy finns redan + PasswordLockoutPolicy: + NotFound: Lösenordslåsningpolicy hittades inte + Empty: Lösenordslåsningpolicy är tom + NotExisting: Lösenordslåsningpolicy finns inte + AlreadyExists: Lösenordslåsningpolicy finns redan + PasswordAgePolicy: + NotFound: Lösenordsålderpolicy hittades inte + Empty: Lösenordsålderpolicy är tom + NotExisting: Lösenordsålderpolicy finns inte + AlreadyExists: Lösenordsålderpolicy finns redan + OrgIAMPolicy: + Empty: Org IAM-policy är tom + NotExisting: Org IAM-policy finns inte + AlreadyExists: Org IAM-policy finns redan + NotificationPolicy: + NotFound: Notifikationspolicy hittades inte + NotChanged: Notifikationspolicy har inte ändrats + AlreadyExists: Notifikationspolicy finns redan + LabelPolicy: + NotFound: Privat etikettpolicy hittades inte + NotChanged: Privat etikettpolicy har inte ändrats + Project: + ProjectIDMissing: Projekt-ID saknas + AlreadyExists: Projekt finns redan på organisationen + OrgNotExisting: Organisationen finns inte + UserNotExisting: Användaren finns inte + CouldNotGenerateClientSecret: Kunde inte generera klienthemlighet + Invalid: Projektet är ogiltigt + NotActive: Projektet är inte aktivt + NotInactive: Projektet är inte inaktiverat + NotFound: Projektet hittades inte + UserIDMissing: Användar-ID saknas + Member: + NotFound: Projektmedlem hittades inte + Invalid: Projektmedlem är ogiltig + AlreadyExists: Projektmedlem finns redan + NotExisting: Projektmedlem finns inte + MinimumOneRoleNeeded: Minst en roll måste läggas till + Role: + AlreadyExists: Rollen finns redan + Invalid: Rollen är ogiltig + NotExisting: Rollen finns inte + IDMissing: ID saknas + App: + AlreadyExists: Tjänsten finns redan + NotFound: Tjänsten hittades inte + Invalid: Tjänsten är ogiltig + NotExisting: Tjänsten finns inte + NotActive: Tjänsten är inte aktiv + NotInactive: Tjänsten är inte inaktiv + OIDCConfigInvalid: OIDC-konfigurationen är ogiltig + APIConfigInvalid: API-konfigurationen är ogiltig + SAMLConfigInvalid: SAML-konfigurationen är ogiltig + IsNotOIDC: Tjänsten är inte av typen OIDC + IsNotAPI: Tjänsten är inte av typen API + IsNotSAML: Tjänsten är inte av typen SAML + SAMLMetadataMissing: SAML-metadata saknas + SAMLMetadataFormat: SAML-metadataformatfel + SAMLEntityIDAlreadyExisting: SAML EntityID finns redan + OIDCAuthMethodNoSecret: Vald OIDC-autentiseringsmetod kräver ingen hemlighet + APIAuthMethodNoSecret: Vald API-autentiseringsmetod kräver ingen hemlighet + AuthMethodNoPrivateKeyJWT: Vald autentiseringsmetod kräver ingen nyckel + ClientSecretInvalid: Klienthemlighet är ogiltig + Key: + AlreadyExisting: Tjänstenyckel finns redan + NotFound: Tjänstenyckel + RequiredFieldsMissing: Några obligatoriska fält saknas + Grant: + AlreadyExists: Projektets medgivande finns redan + NotFound: Projektets medgivanden hittades inte + Invalid: Projektets medgivande är ogiltigt + NotExisting: Projektets medgivanden existerar inte + HasNotExistingRole: En roll existerar inte i projektet + NotActive: Projektets medgivande är inte aktivt + NotInactive: Projektets medgivande är inte inaktivt + IAM: + NotFound: Instansen hittades inte. Se till att du har rätt domän. Kolla https://zitadel.com/docs/apis/introduction#domains + Member: + RolesNotChanged: Roller har inte ändrats + MemberInvalid: Medlemmen är ogiltig + MemberAlreadyExisting: Medlemmen finns redan + MemberNotExisting: Medlemmen existerar inte + IDMissing: Id saknas + IAMProjectIDMissing: IAM-projekt-id saknas + IamProjectAlreadySet: IAM-projekt-id har redan satts + IdpInvalid: IDP-konfigurationen är ogiltig + IdpNotExisting: IDP-konfigurationen existerar inte + OIDCConfigInvalid: OIDC IDP-konfigurationen är ogiltig + IdpIsNotOIDC: IDP-konfigurationen är inte av typen oidc + LoginPolicyInvalid: Inloggningspolicyn är ogiltig + LoginPolicyNotExisting: Inloggningspolicyn existerar inte + IdpProviderInvalid: Identitetsleverantören är ogiltig + LoginPolicy: + NotFound: Standardinloggningspolicyn hittades inte + NotChanged: Standardinloggningspolicyn har inte ändrats + NotExisting: Standardinloggningspolicyn existerar inte + AlreadyExists: Standardinloggningspolicyn finns redan + RedirectURIInvalid: Standardomdirigerings-URI är ogiltig + MFA: + AlreadyExists: Tvåfaktor finns redan + NotExisting: Tvåfaktor existerar inte + Unspecified: Tvåfaktor är ogiltig + IDP: + AlreadyExists: Identitetsleverantören finns redan + NotExisting: Identitetsleverantören existerar inte + Invalid: Identitetsleverantören är ogiltig + IDPConfig: + AlreadyExists: Identitetsleverantörskonfigurationen finns redan + NotInactive: Identitetsleverantörskonfigurationen är inte inaktiv + NotActive: Identitetsleverantörskonfigurationen är inte aktiv + LabelPolicy: + NotFound: Standardprivat etikettpolicy hittades inte + NotChanged: Standardprivat etikettpolicy har inte ändrats + MailTemplate: + NotFound: Standardmailmall hittades inte + NotChanged: Standardmailmall har inte ändrats + AlreadyExists: Standardmailmall finns redan + Invalid: Standardmailmall är ogiltig + CustomMessageText: + NotFound: Standardmeddelandetext hittades inte + NotChanged: Standardmeddelandetext har inte ändrats + AlreadyExists: Standardmeddelandetext finns redan + Invalid: Standardmeddelandetext är ogiltig + PasswordComplexityPolicy: + NotFound: Standardlösenordskomplexitetspolicy hittades inte + NotExisting: Standardlösenordskomplexitetspolicy existerar inte + AlreadyExists: Standardlösenordskomplexitetspolicy finns redan + Empty: Standardlösenordskomplexitetspolicy är tom + NotChanged: Standardlösenordskomplexitetspolicy har inte ändrats + PasswordAgePolicy: + NotFound: Standardlösenordsålderpolicy hittades inte + NotExisting: Standardlösenordsålderpolicy existerar inte + AlreadyExists: Standardlösenordsålderpolicy finns redan + Empty: Standardlösenordsålderpolicy är tom + NotChanged: Standardlösenordsålderpolicy har inte ändrats + PasswordLockoutPolicy: + NotFound: Standardlösenordslåspolicy hittades inte + NotExisting: Standardlösenordslåspolicy existerar inte + AlreadyExists: Standardlösenordslåspolicy finns redan + Empty: Standardlösenordslåspolicy är tom + NotChanged: Standardlösenordslåspolicy har inte ändrats + DomainPolicy: + NotFound: Org IAM-policy hittades inte + Empty: Org IAM-policy är tom + NotExisting: Org IAM-policy existerar inte + AlreadyExists: Org IAM-policy finns redan + NotChanged: Org IAM-policy har inte ändrats + NotificationPolicy: + NotFound: Standardnotifikationspolicy hittades inte + NotChanged: Standardnotifikationspolicy har inte ändrats + AlreadyExists: Standardnotifikationspolicy finns redan + Policy: + AlreadyExists: Policyn finns redan + Label: + Invalid: + PrimaryColor: Primärfärgen är inte ett giltigt Hex-färgvärde + BackgroundColor: Bakgrundsfärgen är inte ett giltigt Hex-färgvärde + WarnColor: Varningsfärgen är inte ett giltigt Hex-färgvärde + FontColor: Teckensnittsfärgen är inte ett giltigt Hex-färgvärde + PrimaryColorDark: Primärfärgen (mörkt läge) är inte ett giltigt Hex-färgvärde + BackgroundColorDark: Bakgrundsfärgen (mörkt läge) är inte ett giltigt Hex-färgvärde + WarnColorDark: Varningsfärgen (mörkt läge) är inte ett giltigt Hex-färgvärde + FontColorDark: Teckensnittsfärgen (mörkt läge) är inte ett giltigt Hex-färgvärde + UserGrant: + AlreadyExists: Användarbeviljandet finns redan + NotFound: Användarbeviljandet hittades inte + Invalid: Användarbeviljandet är ogiltigt + NotChanged: Användarbeviljandet har inte ändrats + IDMissing: Id saknas + NotActive: Användarbeviljandet är inte aktivt + NotInactive: Användarbeviljandet är inte inaktivt + NoPermissionForProject: Användaren har inga behörigheter i detta projekt + RoleKeyNotFound: Rollen hittades inte + Member: + AlreadyExists: Medlemmen finns redan + IDPConfig: + AlreadyExists: IDP-konfiguration med detta namn finns redan + NotExisting: Identitetsleverantörskonfigurationen existerar inte + Changes: + NotFound: Ingen historik hittades + AuditRetention: Historiken är utanför revisionsloggens lagringstid + Token: + NotFound: Token hittades inte + Invalid: Token är ogiltig + UserSession: + NotFound: Användarsessionen hittades inte + Key: + NotFound: Nyckeln hittades inte + ExpireBeforeNow: Utgångsdatumet är i det förflutna + Login: + LoginPolicy: + MFA: + ForceAndNotConfigured: Tvåfaktor är konfigurerad som obligatorisk, men inga möjliga leverantörer är konfigurerade. Vänligen kontakta din systemadministratör. + Step: + Started: + AlreadyExists: Steget startat finns redan + Done: + AlreadyExists: Steget klart finns redan + CustomText: + AlreadyExists: Anpassad text finns redan + Invalid: Anpassad text är ogiltig + NotFound: Anpassad text hittades inte + TranslationFile: + ReadError: Fel vid läsning av översättningsfil + MergeError: Översättningsfilen kunde inte slås samman med anpassade översättningar + NotFound: Översättningsfilen existerar inte + Metadata: + NotFound: Metadata hittades inte + NoData: Metadatalistan är tom + Invalid: Metadata är ogiltig + KeyNotExisting: En eller flera nycklar existerar inte + Action: + Invalid: Åtgärden är ogiltig + NotFound: Åtgärden hittades inte + NotActive: Åtgärden är inte aktiv + NotInactive: Åtgärden är inte inaktiv + MaxAllowed: Inga ytterligare aktiva åtgärder tillåtna + NotEnabled: Funktionen "Åtgärd" är inte aktiverad + Flow: + FlowTypeMissing: FlowType saknas + Empty: Flödet är redan tomt + WrongTriggerType: TriggerType är ogiltig + NoChanges: Inga ändringar + ActionIDsNotExist: ActionIDs existerar inte + Query: + CloseRows: SQL-satsen kunde inte avslutas + SQLStatement: SQL-satsen kunde inte skapas + InvalidRequest: Begäran är ogiltig + TooManyNestingLevels: För många nivåer av frågenästning (Max 20) + Quota: + AlreadyExists: Kvota finns redan för denna enhet + NotFound: Kvota hittades inte för denna enhet + Invalid: + CallURL: Kvotens anrops-URL är ogiltig + Percent: Kvotprocenten är lägre än 1 + Unimplemented: Kvoter är inte implementerade för denna enhet + Amount: Kvotmängden är lägre än 1 + ResetInterval: Kvotens återställningsintervall är kortare än en minut + Noop: En obegränsad kvot utan notifikationer har ingen effekt + Access: + Exhausted: Kvoten för autentiserade begäranden är uttömd + Execution: + Exhausted: Kvoten för exekveringssekunder är uttömd + LogStore: + Access: + StorageFailed: Lagring av åtkomstlogg till databasen misslyckades + ScanFailed: Frågan om användningen av autentiserade förfrågningar misslyckades + Execution: + StorageFailed: Lagring av åtgärdslogg till databasen misslyckades + ScanFailed: Frågan om användning av exekveringstid misslyckades + Session: + NotExisting: Sessionen existerar inte + Terminated: Sessionen är redan avslutad + Expired: Sessionen har gått ut + PositiveLifetime: Sessionens livstid får inte vara mindre än 0 + Token: + Invalid: Sessionstoken är ogiltig + WebAuthN: + NoChallenge: Session utan WebAuthN-utmaning + Intent: + IDPMissing: IDP-ID saknas i begäran + IDPInvalid: IDP är ogiltig för begäran + ResponseInvalid: IDP-svar är ogiltigt + MissingSingleMappingAttribute: IDP-svar innehåller inte mappningsattributet eller har mer än ett värde + SuccessURLMissing: Framgångs-URL saknas i begäran + FailureURLMissing: Misslyckande-URL saknas i begäran + StateMissing: State-parameter saknas i begäran + NotStarted: Avsikten har inte startat eller har redan avslutats + NotSucceeded: Avsikten har inte lyckats + TokenCreationFailed: Token-skapande misslyckades + InvalidToken: Avsiktstoken är ogiltig + OtherUser: Avsikten är avsedd för en annan användare + AuthRequest: + AlreadyExists: Autentiseringsbegäran finns redan + NotExisting: Autentiseringsbegäran existerar inte + WrongLoginClient: Autentiseringsbegäran skapad av annan inloggningsklient + OIDCSession: + RefreshTokenInvalid: Uppdateringstoken är ogiltig + Token: + Invalid: Token är ogiltig + Expired: Token har gått ut + InvalidClient: Token utfärdades inte för denna klient + Feature: + NotExisting: Funktionen existerar inte + TypeNotSupported: Funktionstypen stöds inte + InvalidValue: Ogiltigt värde för denna funktion + Target: + Invalid: Målet är ogiltigt + NoTimeout: Målet har ingen timeout + InvalidURL: Målet har en ogiltig URL + NotFound: Målet hittades inte + Execution: + ConditionInvalid: Exekveringsvillkoret är ogiltigt + Invalid: Exekveringen är ogiltig + NotFound: Exekveringen hittades inte + IncludeNotFound: Inkluderingen hittades inte + NoTargets: Inga mål definierade + UserSchema: + NotEnabled: Funktionen "Användarschema" är inte aktiverad + Type: + Missing: Användarschematyp saknas + AlreadyExists: Användarschematyp finns redan + Authenticator: + Invalid: Ogiltig autentiseringstyp + NotActive: Användarschema inte aktivt + NotInactive: Användarschema inte inaktivt + NotExists: Användarschema existerar inte + TokenExchange: + FeatureDisabled: Token Exchange-funktionen är inaktiverad för din instans. https://zitadel.com/docs/apis/resources/feature_service_v2/feature-service-set-instance-features + Token: + Missing: Token saknas + Invalid: Token är ogiltig + TypeMissing: Tokentyp saknas + TypeNotAllowed: Tokentyp är inte tillåten + TypeNotSupported: Tokentyp stöds inte + NotForAPI: Imitationstoken tillåts inte för API + Impersonation: + PolicyDisabled: Imitation är inaktiverad i instansens säkerhetspolicy + +AggregateTypes: + action: Åtgärd + instance: Instans + key_pair: Nyckelpar + org: Organisation + project: Projekt + user: Användare + usergrant: Användarbehörighet + quota: Kvot + feature: Funktion + target: Mål + execution: Exekvering + user_schema: Användarschema + auth_request: Autentiseringsbegäran + device_auth: Enhetsautentisering + idpintent: IDP-avsikt + limits: Begränsningar + milestone: Milstolpe + oidc_session: OIDC-session + restrictions: Restriktioner + system: System + session: Session + +EventTypes: + execution: + set: Exekvering satt + removed: Exekvering borttagen + target: + added: Mål skapat + changed: Mål ändrat + removed: Mål borttaget + user: + added: Användare tillagd + selfregistered: Användare registrerade sig själv + initialization: + code: + added: Initialiseringskod genererad + sent: Initialiseringskod skickad + check: + succeeded: Initialiseringskontroll lyckades + failed: Initialiseringskontroll misslyckades + token: + added: Åtkomsttoken skapad + v2.added: Åtkomsttoken skapad + removed: Åtkomsttoken borttagen + impersonated: Användare imiterad + username: + reserved: Användarnamn reserverat + released: Användarnamn släppt + changed: Användarnamn ändrat + email: + reserved: E-postadress reserverad + released: E-postadress släppt + changed: E-postadress ändrad + verified: E-postadress verifierad + verification: + failed: E-postverifiering misslyckades + code: + added: E-postverifieringskod genererad + sent: E-postverifieringskod skickad + machine: + added: Teknisk användare tillagd + changed: Teknisk användare ändrad + key: + added: Nyckel tillagd + removed: Nyckel borttagen + secret: + set: Hemlighet satt + updated: Hemlighetshash uppdaterad + removed: Hemlighet borttagen + check: + succeeded: Hemlighetskontroll lyckades + failed: Hemlighetskontroll misslyckades + human: + added: Person tillagd + selfregistered: Person registrerade sig själv + avatar: + added: Avatar tillagd + removed: Avatar borttagen + initialization: + code: + added: Initialiseringskod genererad + sent: Initialiseringskod skickad + check: + succeeded: Initialiseringskontroll lyckades + failed: Initialiseringskontroll misslyckades + username: + reserved: Användarnamn reserverat + released: Användarnamn släppt + email: + changed: E-postadress ändrad + verified: E-postadress verifierad + verification: + failed: E-postverifiering misslyckades + code: + added: E-postverifieringskod genererad + sent: E-postverifieringskod skickad + password: + changed: Lösenord ändrat + code: + added: Lösenordskod genererad + sent: Lösenordskod skickad + check: + succeeded: Lösenordskontroll lyckades + failed: Lösenordskontroll misslyckades + change: + sent: Lösenordsändring skickad + hash: + updated: Lösenordshash uppdaterad + externallogin: + check: + succeeded: Extern inloggning lyckades + externalidp: + added: Extern IDP tillagd + removed: Extern IDP borttagen + cascade: + removed: Extern IDP kaskadborttagen + id: + migrated: Externt användar-ID för IDP migrerades + phone: + changed: Mobilnummer ändrat + verified: Mobilnummer verifierat + verification: + failed: Mobilnummerverifiering misslyckades + code: + added: Mobilnummerkod genererad + sent: Mobilnummerkod skickad + removed: Mobilnummer borttaget + profile: + changed: Användarprofil ändrad + address: + changed: Användaradress ändrad + mfa: + otp: + added: Tvåfaktor OTP tillagd + verified: Tvåfaktor OTP verifierad + removed: Tvåfaktor OTP borttagen + check: + succeeded: Tvåfaktor OTP-kontroll lyckades + failed: Tvåfaktor OTP-kontroll misslyckades + sms: + added: Tvåfaktor OTP SMS tillagd + removed: Tvåfaktor OTP SMS borttagen + code: + added: Tvåfaktor OTP SMS-kod tillagd + sent: Tvåfaktor OTP SMS-kod skickad + check: + succeeded: Tvåfaktor OTP SMS-kontroll lyckades + failed: Tvåfaktor OTP SMS-kontroll misslyckades + email: + added: Tvåfaktor OTP E-post tillagd + removed: Tvåfaktor OTP E-post borttagen + code: + added: Tvåfaktor OTP E-postkod tillagd + sent: Tvåfaktor OTP E-postkod skickad + check: + succeeded: Tvåfaktor OTP E-postkontroll lyckades + failed: Tvåfaktor OTP E-postkontroll misslyckades + u2f: + token: + added: Tvåfaktor U2F-token tillagd + verified: Tvåfaktor U2F-token verifierad + removed: Tvåfaktor U2F-token borttagen + begin: + login: Tvåfaktor U2F-kontroll startad + check: + succeeded: Tvåfaktor U2F-kontroll lyckades + failed: Tvåfaktor U2F-kontroll misslyckades + signcount: + changed: Kontrollsumman för Tvåfaktor U2F-token har ändrats + init: + skipped: Tvåfaktorinitialisering hoppades över + passwordless: + token: + added: Token för lösenordsfri inloggning tillagd + verified: Token för lösenordsfri inloggning verifierad + removed: Token för lösenordsfri inloggning borttagen + begin: + login: lösenordsfri inloggningskontroll startad + check: + succeeded: lösenordsfri inloggningskontroll lyckades + failed: lösenordsfri inloggningskontroll misslyckades + signcount: + changed: Kontrollsumman för lösenordsfri inloggningstoken har ändrats + initialization: + code: + added: Kod för lösenordsfri initialisering tillagd + sent: Kod för lösenordsfri initialisering skickad + requested: Kod för lösenordsfri initialisering begärd + check: + succeeded: Kontroll av kod för lösenordsfri initialisering lyckades + failed: Kontroll av kod för lösenordsfri initialisering misslyckades + signed: + out: Användare utloggad + refresh: + token: + added: Uppdateringstoken skapad + renewed: Uppdateringstoken förnyad + removed: Uppdateringstoken borttagen + locked: Användare låst + unlocked: Användare upplåst + deactivated: Användare avaktiverad + reactivated: Användare återaktiverad + removed: Användare borttagen + password: + changed: Lösenord ändrat + code: + added: Lösenordskod genererad + sent: Lösenordskod skickad + check: + succeeded: Lösenordskontroll lyckades + failed: Lösenordskontroll misslyckades + phone: + changed: Mobilnummer ändrat + verified: Mobilnummer verifierat + verification: + failed: Verifiering av Mobilnummer misslyckades + code: + added: Mobilnummerkod genererad + sent: Mobilnummerkod skickad + + profile: + changed: Användarprofil ändrad + address: + changed: Användaradress ändrad + mfa: + otp: + added: Tvåfaktor OTP tillagd + verified: Tvåfaktor OTP verifierad + removed: Tvåfaktor OTP borttagen + check: + succeeded: Tvåfaktor OTP-kontroll lyckades + failed: Tvåfaktor OTP-kontroll misslyckades + init: + skipped: Hoppade över Tvåfaktor OTP-initialisering + init: + skipped: Hoppade över tvåfaktorinitialisering + signed: + out: Användare utloggad + grant: + added: Auktorisering tillagd + changed: Auktorisering ändrad + removed: Auktorisering borttagen + deactivated: Auktorisering avaktiverad + reactivated: Auktorisering återaktiverad + reserved: Auktorisering reserverad + released: Auktorisering släppt + cascade: + removed: Auktorisering borttagen + changed: Auktorisering ändrad + metadata: + set: Användarmetadata inställd + removed: Användarmetadata borttagen + removed.all: All användarmetadata borttagen + domain: + claimed: Domän anspråkad + claimed.sent: Meddelande om anspråkad domän skickad + pat: + added: Personlig åtkomsttoken tillagd + removed: Personlig åtkomsttoken borttagen + org: + added: Organisation tillagd + changed: Organisation ändrad + deactivated: Organisation avaktiverad + reactivated: Organisation återaktiverad + removed: Organisation borttagen + domain: + added: Domän tillagd + verification: + added: Domänverifiering tillagd + failed: Domänverifiering misslyckades + verified: Domän verifierad + removed: Domän borttagen + primary: + set: Primär domän inställd + reserved: Domän reserverad + released: Domän släppt + name: + reserved: Organisationsnamn reserverat + released: Organisationsnamn släppt + member: + added: Organisationsmedlem tillagd + changed: Organisationsmedlem ändrad + removed: Organisationsmedlem borttagen + cascade: + removed: Organisationsmedlem kaskadborttagen + iam: + policy: + added: Systempolicy tillagd + changed: Systempolicy ändrad + removed: Systempolicy borttagen + idp: + config: + added: IDP-konfiguration tillagd + changed: IDP-konfiguration ändrad + removed: IDP-konfiguration borttagen + deactivated: IDP-konfiguration avaktiverad + reactivated: IDP-konfiguration återaktiverad + oidc: + config: + added: OIDC IDP-konfiguration tillagd + changed: OIDC IDP-konfiguration ändrad + saml: + config: + added: SAML IDP-konfiguration tillagd + changed: SAML IDP-konfiguration ändrad + jwt: + config: + added: JWT IDP-konfiguration tillagd + changed: JWT IDP-konfiguration ändrad + customtext: + set: Anpassad text inställd + removed: Anpassad text borttagen + template: + removed: Anpassad textmall borttagen + policy: + login: + added: Inloggningspolicy tillagd + changed: Inloggningspolicy ändrad + removed: Inloggningspolicy borttagen + idpprovider: + added: Identitetsleverantör tillagd till inloggningspolicy + removed: Identitetsleverantör borttagen från inloggningspolicy + cascade: + removed: Identitetsleverantör kaskadborttagen från inloggningspolicy + secondfactor: + added: Andra faktorn tillagd till inloggningspolicy + removed: Andra faktorn borttagen från inloggningspolicy + multifactor: + added: Tvåfaktor tillagd till inloggningspolicy + removed: Tvåfaktor borttagen från inloggningspolicy + password: + complexity: + added: Lösenordskomplexitetspolicy tillagd + changed: Lösenordskomplexitetspolicy ändrad + removed: Lösenordskomplexitetspolicy borttagen + age: + added: Lösenordsålderpolicy tillagd + changed: Lösenordsålderpolicy ändrad + removed: Lösenordsålderpolicy borttagen + lockout: + added: Lösenordslåsningpolicy tillagd + changed: Lösenordslåsningpolicy ändrad + removed: Lösenordslåsningpolicy borttagen + label: + added: Etikettpolicy tillagd + changed: Etikettpolicy ändrad + activated: Etikettpolicy aktiverad + removed: Etikettpolicy borttagen + logo: + added: Logotyp tillagd till etikettpolicy + removed: Logotyp borttagen från etikettpolicy + dark: + added: Logotyp (mörkt läge) tillagd till etikettpolicy + removed: Logotyp (mörkt läge) borttagen från etikettpolicy + icon: + added: Ikon tillagd till etikettpolicy + removed: Ikon borttagen från etikettpolicy + dark: + added: Ikon (mörkt läge) tillagd till etikettpolicy + removed: Ikon (mörkt läge) borttagen från etikettpolicy + font: + added: Teckensnitt tillagt till etikettpolicy + removed: Teckensnitt borttaget från etikettpolicy + assets: + removed: Tillgångar borttagna från etikettpolicy + privacy: + added: Integritetspolicy och TOS tillagd + changed: Integritetspolicy och TOS ändrad + removed: Integritetspolicy och TOS borttagen + domain: + added: Domänpolicy tillagd + changed: Domänpolicy ändrad + removed: Domänpolicy borttagen + lockout: + added: Låsningpolicy tillagd + changed: Låsningpolicy ändrad + removed: Låsningpolicy borttagen + notification: + added: Notifikationspolicy tillagd + changed: Notifikationspolicy ändrad + removed: Notifikationspolicy borttagen + flow: + trigger_actions: + set: Åtgärd inställd + cascade: + removed: Åtgärder kaskadborttagna + removed: Åtgärder borttagna + cleared: Flöde rensat + mail: + template: + added: E-postmall tillagd + changed: E-postmall ändrad + removed: E-postmall borttagen + text: + added: E-posttext + changed: E-posttext ändrad + removed: E-posttext borttagen + metadata: + removed: Metadata borttagen + removed.all: All metadata borttagen + set: Metadata satt + project: + added: Projekt tillagt + changed: Projekt ändrat + deactivated: Projekt avaktiverat + reactivated: Projekt återaktiverat + removed: Projekt borttaget + member: + added: Projektmedlem tillagd + changed: Projektmedlem ändrad + removed: Projektmedlem borttagen + cascade: + removed: Projektmedlem kaskad borttagen + role: + added: Projektroll tillagd + changed: Projektroll ändrad + removed: Projektroll borttagen + grant: + added: Administrationsåtkomst tillagd + changed: Administrationsåtkomst ändrad + removed: Administrationsåtkomst borttagen + deactivated: Administrationsåtkomst avaktiverad + reactivated: Administrationsåtkomst återaktiverad + cascade: + changed: Administrationsåtkomst ändrad + member: + added: Administrationsåtkomstmedlem tillagd + changed: Administrationsåtkomstmedlem ändrad + removed: Administrationsåtkomstmedlem borttagen + cascade: + removed: Administrationsåtkomst kaskad borttagen + application: + added: Applikation tillagd + changed: Applikation ändrad + removed: Applikation borttagen + deactivated: Applikation avaktiverad + reactivated: Applikation återaktiverad + oidc: + secret: + check: + succeeded: OIDC Client Secret-kontroll lyckades + failed: OIDC Client Secret-kontroll misslyckades + key: + added: OIDC App-nyckel tillagd + removed: OIDC App-nyckel borttagen + api: + secret: + check: + succeeded: API-hemlighetskontroll lyckades + failed: API-hemlighetskontroll misslyckades + key: + added: Applikationsnyckel tillagd + removed: Applikationsnyckel borttagen + config: + saml: + added: SAML-konfiguration tillagd + changed: SAML-konfiguration ändrad + oidc: + added: OIDC-konfiguration tillagd + changed: OIDC-konfiguration ändrad + secret: + changed: OIDC-hemlighet ändrad + updated: OIDC-hemlighet hash uppdaterad + api: + added: API-konfiguration tillagd + changed: API-konfiguration ändrad + secret: + changed: API-hemlighet ändrad + updated: API-hemlighet hash uppdaterad + policy: + password: + complexity: + added: Lösenordskomplexitetspolicy tillagd + changed: Lösenordskomplexitetspolicy ändrad + age: + added: Lösenordsålderpolicy tillagd + changed: Lösenordsålderpolicy ändrad + lockout: + added: Lösenordslåsningpolicy tillagd + changed: Lösenordslåsningpolicy ändrad + iam: + setup: + started: ZITADEL-setup startad + done: ZITADEL-setup klar + global: + org: + set: Global org satt + project: + iam: + set: ZITADEL-projekt satt + member: + added: ZITADEL-medlem tillagd + changed: ZITADEL-medlem ändrad + removed: ZITADEL-medlem borttagen + cascade: + removed: ZITADEL-medlem kaskad borttagen + idp: + config: + added: IDP-konfiguration tillagd + changed: IDP-konfiguration ändrad + removed: IDP-konfiguration borttagen + deactivated: IDP-konfiguration avaktiverad + reactivated: IDP-konfiguration återaktiverad + oidc: + config: + added: OIDC IDP-konfiguration tillagd + changed: OIDC IDP-konfiguration ändrad + saml: + config: + added: SAML IDP-konfiguration tillagd + changed: SAML IDP-konfiguration ändrad + jwt: + config: + added: JWT-konfiguration till identitetsleverantör tillagd + changed: JWT-konfiguration från identitetsleverantör borttagen + customtext: + set: Text satt + removed: Text borttagen + policy: + login: + added: Standardinloggningspolicy tillagd + changed: Standardinloggningspolicy ändrad + idpprovider: + added: Identitetsleverantör tillagd till standardinloggningspolicy + removed: Identitetsleverantör borttagen från standardinloggningspolicy + label: + added: Etikettpolicy tillagd + changed: Etikettpolicy ändrad + activated: Etikettpolicy aktiverad + logo: + added: Logotyp tillagd till etikettpolicy + removed: Logotyp borttagen från etikettpolicy + dark: + added: Logotyp (mörkt läge) tillagd till etikettpolicy + removed: Logotyp (mörkt läge) borttagen från etikettpolicy + icon: + added: Ikon tillagd till etikettpolicy + removed: Ikon borttagen från etikettpolicy + dark: + added: Ikon (mörkt läge) tillagd till etikettpolicy + removed: Ikon (mörkt läge) borttagen från etikettpolicy + font: + added: Teckensnitt tillagt till etikettpolicy + removed: Teckensnitt borttaget från etikettpolicy + assets: + removed: Tillgångar borttagna från etikettpolicy + default: + language: + set: Standardspråk satt + oidc: + settings: + added: OIDC-konfiguration tillagd + changed: OIDC-konfiguration ändrad + removed: OIDC-konfiguration borttagen + secret: + generator: + added: Hemlig kod-generator tillagd + changed: Hemlig kod-generator ändrad + removed: Hemlig kod-generator borttagen + smtp: + config: + added: SMTP-konfiguration tillagd + changed: SMTP-konfiguration ändrad + activated: SMTP-konfiguration aktiverad + deactivated: SMTP-konfiguration avaktiverad + removed: SMTP-konfiguration borttagen + password: + changed: SMTP-konfigurationshemlighet ändrad + sms: + config: + twilio: + added: Twilio SMS-leverantör tillagd + changed: Twilio SMS-leverantör ändrad + token: + changed: Twilio SMS-leverantörstoken ändrad + removed: Twilio SMS-leverantör borttagen + activated: Twilio SMS-leverantör aktiverad + deactivated: Twilio SMS-leverantör avaktiverad + key_pair: + added: Nyckelpar tillagt + certificate: + added: Certifikat tillagt + action: + added: Åtgärd tillagd + changed: Åtgärd ändrad + deactivated: Åtgärd avaktiverad + reactivated: Åtgärd återaktiverad + removed: Åtgärd borttagen + instance: + added: Instans tillagd + changed: Instans ändrad + customtext: + removed: Anpassad text borttagen + set: Anpassad text inställd + template: + removed: Mall för anpassad text borttagen + default: + language: + set: Standardspråk inställt + org: + set: Standardorganisation inställd + domain: + added: Domän tillagd + primary: + set: Primär domän inställd + removed: Domän borttagen + iam: + console: + set: ZITADEL-konsolapplikation inställd + project: + set: ZITADEL-projekt inställt + mail: + template: + added: E-postmall tillagd + changed: E-postmall ändrad + text: + added: E-posttext tillagd + changed: E-posttext ändrad + member: + added: Instansmedlem tillagd + changed: Instansmedlem ändrad + removed: Instansmedlem borttagen + cascade: + removed: Instansmedlem kaskadborttagen + notification: + provider: + debug: + fileadded: Fildebuggningsleverantör tillagd + filechanged: Fildebuggningsleverantör ändrad + fileremoved: Fildebuggningsleverantör borttagen + logadded: Loggdebuggningsleverantör tillagd + logchanged: Loggdebuggningsleverantör ändrad + logremoved: Loggdebuggningsleverantör borttagen + oidc: + settings: + added: OIDC-inställningar tillagda + changed: OIDC-inställningar ändrade + policy: + domain: + added: Domänpolicy tillagd + changed: Domänpolicy ändrad + label: + activated: Etikettpolicy aktiverad + added: Etikettpolicy tillagd + assets: + removed: Tillgång från etikettpolicy borttagen + changed: Etikettpolicy ändrad + font: + added: Teckensnitt tillagt i etikettpolicy + removed: Teckensnitt borttaget från etikettpolicy + icon: + added: Ikon tillagd i etikettpolicy + removed: Ikon borttagen från etikettpolicy + dark: + added: Ikon tillagd i mörk etikettpolicy + removed: Ikon borttagen från mörk etikettpolicy + logo: + added: Logotyp tillagd i etikettpolicy + removed: Logotyp borttagen från etikettpolicy + dark: + added: Logotyp tillagd i mörk etikettpolicy + removed: Logotyp borttagen från mörk etikettpolicy + lockout: + added: Låsningpolicy tillagd + changed: Låsningpolicy ändrad + login: + added: Inloggningspolicy tillagd + changed: Inloggningspolicy ändrad + idpprovider: + added: Identitetsleverantör tillagd i inloggningspolicy + cascade: + removed: Identitetsleverantör kaskadborttagen från inloggningspolicy + removed: Identitetsleverantör borttagen från inloggningspolicy + multifactor: + added: Tvåfaktor tillagd i inloggningspolicy + removed: Tvåfaktor borttagen från inloggningspolicy + secondfactor: + added: Andra faktorn tillagd i inloggningspolicy + removed: Andra faktorn borttagen från inloggningspolicy + password: + age: + added: Lösenordsålderpolicy tillagd + changed: Lösenordsålderpolicy ändrad + complexity: + added: Lösenordskomplexitetspolicy tillagd + changed: Lösenordskomplexitetspolicy ändrad + privacy: + added: Integritetspolicy tillagd + changed: Integritetspolicy ändrad + security: + set: Säkerhetspolicy inställd + + removed: Instans borttagen + secret: + generator: + added: Hemlig kod-generator tillagd + changed: Hemlig kod-generator ändrad + removed: Hemlig kod-generator borttagen + sms: + configtwilio: + activated: Twilio SMS-konfiguration aktiverad + added: Twilio SMS-konfiguration tillagd + changed: Twilio SMS-konfiguration ändrad + deactivated: Twilio SMS-konfiguration avaktiverad + removed: Twilio SMS-konfiguration borttagen + token: + changed: Token för Twilio SMS-konfiguration ändrad + smtp: + config: + added: SMTP-konfiguration tillagd + changed: SMTP-konfiguration ändrad + activated: SMTP-konfiguration aktiverad + deactivated: SMTP-konfiguration avaktiverad + password: + changed: Lösenord för SMTP-konfiguration ändrat + removed: SMTP-konfiguration borttagen + user_schema: + created: Användarschema skapat + updated: Användarschema uppdaterat + deactivated: Användarschema avaktiverat + reactivated: Användarschema återaktiverat + deleted: Användarschema borttaget + +Application: + OIDC: + UnsupportedVersion: Din OIDC-version stöds inte + V1: + NotCompliant: Din konfiguration är inte kompatibel och skiljer sig från OIDC 1.0-standarden. + NoRedirectUris: Minst en omdirigerings-URI måste registreras. + NotAllCombinationsAreAllowed: Konfigurationen är kompatibel, men inte alla möjliga kombinationer är tillåtna. + Code: + RedirectUris: + HttpOnlyForWeb: Beviljningstyp kod tillåter endast http-omdirigerings-URI:er för apptyp web. + CustomOnlyForNative: Beviljningstyp kod tillåter endast anpassade omdirigerings-URI:er för apptyp native (t.ex. appname://) + Implicit: + RedirectUris: + CustomNotAllowed: Beviljningstyp implicit tillåter inte anpassade omdirigerings-URI:er + HttpNotAllowed: Beviljningstyp implicit tillåter inte http-omdirigerings-URI:er + HttpLocalhostOnlyForNative: Http://localhost omdirigerings-URI är endast tillåten för inbyggda applikationer. + Native: + AuthMethodType: + NotNone: Inbyggda applikationer bör ha authmethodtype none. + RedirectUris: + MustBeHttpLocalhost: Omdirigerings-URI:er måste börja med ditt eget protokoll, http://127.0.0.1, http://[::1] eller http://localhost. + UserAgent: + AuthMethodType: + NotNone: Användaragentapp bör ha authmethodtype none. + GrantType: + Refresh: + NoAuthCode: Uppdateringstoken tillåts endast i kombination med auktoriseringskod. + +Action: + Flow: + Type: + Unspecified: Ospecificerad + ExternalAuthentication: Extern autentisering + CustomiseToken: Komplettera token + InternalAuthentication: Intern autentisering + CustomizeSAMLResponse: Komplettera SAMLResponse + TriggerType: + Unspecified: Ospecificerad + PostAuthentication: Efter autentisering + PreCreation: Före skapande + PostCreation: Efter skapande + PreUserinfoCreation: Före skapande av användarinformation + PreAccessTokenCreation: Före skapande av åtkomsttoken + PreSAMLResponseCreation: Före skapande av SAMLResponse + From ca69ba41ee51d1e07251ee2d04717f4d06c1bbe6 Mon Sep 17 00:00:00 2001 From: Nico Schett <52858351+schettn@users.noreply.github.com> Date: Mon, 17 Jun 2024 09:37:07 +0200 Subject: [PATCH 30/44] docs: add pylon framework to examples (#8115) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit # Which Problems Are Solved - Lack of documentation on integrating the Pylon framework with ZITADEL # How the Problems Are Solved - Adds examples to the ZITADEL documentation on how to integrate with the Pylon framework. - Provides clear, step-by-step instructions and code snippets for seamless integration. # Additional Changes - Updates some formatting related issues. This includes changes to trailing semicolons and array newlines in two or three instances without significantly altering the previous formatting. 5b23416a8c898b9ac561bbca14a6ad72fdbeffdd # Additional Context Add the pylon framework to the ZITADEL documentation examples as previously discussed with @fforootd. - [Pylon](https://github.com/getcronit/pylon) - [Pylon Documentation](https://pylon.cronit.io) --------- Co-authored-by: Tim Möhlmann --- docs/docs/examples/imports/_setup_pylon.mdx | 1 + docs/docs/examples/secure-api/pylon.mdx | 304 ++++++++++++++++++++ docs/frameworks.json | 6 + docs/sidebars.js | 38 +-- docs/static/img/tech/pylon.svg | 1 + 5 files changed, 332 insertions(+), 18 deletions(-) create mode 100644 docs/docs/examples/imports/_setup_pylon.mdx create mode 100644 docs/docs/examples/secure-api/pylon.mdx create mode 100644 docs/static/img/tech/pylon.svg diff --git a/docs/docs/examples/imports/_setup_pylon.mdx b/docs/docs/examples/imports/_setup_pylon.mdx new file mode 100644 index 0000000000..e68dad2c3c --- /dev/null +++ b/docs/docs/examples/imports/_setup_pylon.mdx @@ -0,0 +1 @@ +You have to install Pylon as described in [their documentation](https://pylon.cronit.io/docs/installation/). diff --git a/docs/docs/examples/secure-api/pylon.mdx b/docs/docs/examples/secure-api/pylon.mdx new file mode 100644 index 0000000000..a607d12cd8 --- /dev/null +++ b/docs/docs/examples/secure-api/pylon.mdx @@ -0,0 +1,304 @@ +--- +title: ZITADEL with Pylon +sidebar_label: Pylon +--- + +import AppJWT from "../imports/_app_jwt.mdx"; +import ServiceuserJWT from "../imports/_serviceuser_jwt.mdx"; +import ServiceuserRole from "../imports/_serviceuser_role.mdx"; +import SetupPylon from "../imports/_setup_pylon.mdx"; + +This integration guide demonstrates the recommended way to incorporate ZITADEL into your Pylon service. +It explains how to check the token validity in the API and how to check for permissions. + +By the end of this guide, your application will have three different endpoint which are public, private(valid token) and private-scoped(valid token with specific role). + +## ZITADEL setup + +Before we can start building our application, we have to do a few configuration steps in ZITADEL Console. + +### Create application + + + +### Create Serviceuser + + + +### Give Serviceuser an authorization + + + +### Prerequisites + +At the end you should have the following for the API: + +- Issuer, something like `https://example.zitadel.cloud` or `http://localhost:8080` +- `.json`-key-file for the API, from the application +- ID of the project + +And the following from the Serviceuser: + +- `.json`-key-file from the serviceuser + +## Setup new Pylon service + +### Setup Pylon + + + +### Creating a new project + +To create a new Pylon project, run the following command: + +```bash +pylon new my-pylon-project +``` + +This will create a new directory called `my-pylon-project` with a basic Pylon project structure. + +### Project structure + +Pylon projects are structured as follows: + +``` +my-pylon-project/ +├── .pylon/ +├── src/ +│ ├── index.ts +├── package.json +├── tsconfig.json +``` + +- `.pylon/`: Contains the production build of your project. +- `src/`: Contains the source code of your project. +- `src/index.ts`: The entry point of your Pylon service. +- `package.json`: The npm package configuration file. +- `tsconfig.json`: The TypeScript configuration file. + +### Basic example + +Here's an example of a basic Pylon service: + +```ts +import { defineService } from "@getcronit/pylon"; + +export default defineService({ + Query: { + sum: (a: number, b: number) => a + b, + }, + Mutation: { + divide: (a: number, b: number) => a / b, + }, +}); +``` + +## Secure the API + +### Add ZITADEL info to the service + +1. Create a `.env` file in the root folder of your project and add the following configuration: + +```bash +AUTH_ISSUER='URL to the zitadel instance' +AUTH_PROJECT_ID='ID of the project' +``` + +It should look something like this: + +```bash +AUTH_ISSUER='https://example.zitadel.cloud' +AUTH_PROJECT_ID='250719519163548112' +``` + +2. Copy the `.json`-key-file that you downloaded from the ZITADEL Console into the root folder of your project and rename it to `key.json`. + +### Auth + +Pylon provides a auth module and a decorator to check the validity of the token and the permissions. + +- `auth.initialize()`: Initializes the authentication middleware. +- `auth.require()` : Middleware to check if the token is valid. +- `auth.require({roles: ['role']})`: Middleware to check if the token is valid and has the specified roles. +- `requireAuth()`: Decorator to check if the token is valid. +- `requireAuth({roles: ['role']})`: Decorator to check if the token is valid and has the specified roles. + +### Build the Pylon service + +Now we will create a new Pylon service with the following endpoints: + +- `/api/public`: Public endpoint +- `/api/private`: Private endpoint +- `/api/private-scoped`: Private endpoint with specific role +- `/graphql`: GraphQL endpoint + - Query: `me`: Private endpoint that returns the current user and the messages if the role is `read:messages` + - Query: `info`: Public endpoint + +### Create the service + +The following code demonstrates how to create a Pylon service with the required endpoints, it must be added to the `src/index.ts` file of your project: + +```ts +import { + defineService, + PylonAPI, + auth, + requireAuth, + getContext, + ServiceError, +} from "@getcronit/pylon"; + +class User { + id: string; + name: string; + #messages: string[]; + + constructor(id: string, name: string, messages: string[]) { + this.id = id; + this.name = name; + this.#messages = messages; + } + + @requireAuth({ roles: ["read:messages"] }) + async messages() { + return this.#messages; + } + + static users: User[] = []; + + @requireAuth() + static async me() { + const ctx = getContext(); + const id = ctx.get("auth")!.sub; + + const user = User.users.find((user) => user.id === id); + + if (!user) { + throw new ServiceError("User not found", { + statusCode: 404, + code: "USER_NOT_FOUND", + }); + } + + return user; + } + + @requireAuth() + static async create() { + const ctx = getContext(); + + const auth = ctx.get("auth")!; + + // Check if the user already exists + + if (User.users.find((user) => user.id === auth.sub)) { + throw new ServiceError("User already exists", { + statusCode: 400, + code: "USER_ALREADY_EXISTS", + }); + } + + const user = new User(auth.sub, auth.username || "unknown", [ + "Welcome to Pylon with ZITADEL!", + ]); + + User.users.push(user); + + return user; + } +} + +export default defineService({ + Query: { + me: User.me, + info: () => "Public Data", + }, + Mutation: { + createUser: User.create, + }, +}); + +export const configureApp: PylonAPI["configureApp"] = (app) => { + // Initialize the authentication middleware + app.use("*", auth.initialize()); + + // Automatically try to create a user for each request for demonstration purposes + app.use(async (_, next) => { + try { + await User.create(); + } catch { + // Ignore errors + // Fail silently if the user already exists + } + + await next(); + }); + + app.get("/api/info", (c) => { + return new Response("Public Data"); + }); + + // The `auth.require()` middleware is optional here, as the `User.me` method already checks for it. + app.get("/api/me", auth.require(), async (c) => { + const user = await User.me(); + + return c.json(user); + }); + + // A role check for `read:messages` is not required here, as the `user.messages` method already checks for it. + app.get("/api/me/messages", auth.require(), async (c) => { + const user = await User.me(); + + // This will throw an error if the user does not have the `read:messages` role + return c.json(await user.messages()); + }); +}; +``` + +### Call the API + +To call the API you need an access token, which is then verified by ZITADEL. +Please follow [this guide here](/docs/guides/integrate/token-introspection/private-key-jwt#get-an-access-token), ignoring the first step as we already have the `.json`-key-file from the serviceaccount. + +:::info +You can also create a PAT for the serviceuser and use it to test the API. For this, follow [this guide](/docs/guides/integrate/service-users/personal-access-token#create-a-service-user-with-a-pat). +::: + +Optionally set the token as an environment variable: + +``` +export TOKEN='MtjHodGy4zxKylDOhg6kW90WeEQs2q...' +``` + +Now you have to start the Pylon service: + +```bash +bun run develop +``` + +With the access token, you can then do the following calls: + +1. GraphQL: + +``` +curl -H "Authorization: Bearer $TOKEN" -G http://localhost:3000/graphql --data-urlencode 'query={ info }' +curl -H "Authorization: Bearer $TOKEN" -G http://localhost:3000/graphql --data-urlencode 'query={ me { id name } }' +curl -H "Authorization: Bearer $TOKEN" -G http://localhost:3000/graphql --data-urlencode 'query={ me { id name messages } }' + +``` + +You can also visit the GraphQL playground at `http://localhost:3000/graphql` and execute the queries there. + +2. Routes: + +``` +curl -H "Authorization: Bearer $TOKEN" -X GET http://localhost:3000/api/info +curl -H "Authorization: Bearer $TOKEN" -X GET http://localhost:3000/api/me +curl -H "Authorization: Bearer $TOKEN" -X GET http://localhost:3000/api/me/messages +``` + +## Completion + +Congratulations! You have successfully integrated your Pylon with ZITADEL! + +If you get stuck, consider checking out their [documentation](https://pylon.cronit.io/). If you face issues, contact Pylon or raise an issue on [GitHub](https://github.com/getcronit/pylon/issues). diff --git a/docs/frameworks.json b/docs/frameworks.json index 0bf3e9d012..97afa11d47 100644 --- a/docs/frameworks.json +++ b/docs/frameworks.json @@ -111,5 +111,11 @@ "imgSrcDark": "/docs/img/tech/rustlight.svg", "docsLink": "https://github.com/smartive/zitadel-rust", "external": true + }, + { + "title": "Pylon", + "imgSrcDark": "/docs/img/tech/pylon.svg", + "docsLink": "https://github.com/getcronit/pylon", + "external": true } ] diff --git a/docs/sidebars.js b/docs/sidebars.js index 39f3d314d0..965a5d7a8c 100644 --- a/docs/sidebars.js +++ b/docs/sidebars.js @@ -38,6 +38,7 @@ module.exports = { "examples/secure-api/python-django", "examples/secure-api/python-flask", "examples/secure-api/nodejs-nestjs", + "examples/secure-api/pylon", { type: "link", label: ".Net", @@ -100,6 +101,11 @@ module.exports = { label: "Rust", href: "https://github.com/smartive/zitadel-rust", }, + { + type: "link", + label: "Pylon", + href: "https://github.com/getcronit/pylon", + }, ], }, { @@ -163,7 +169,7 @@ module.exports = { "guides/manage/customize/user-schema", ], }, - "guides/manage/terraform-provider" + "guides/manage/terraform-provider", ], }, { @@ -280,7 +286,7 @@ module.exports = { label: "Service Users", link: { type: "doc", - id: "guides/integrate/service-users/authenticate-service-users" + id: "guides/integrate/service-users/authenticate-service-users", }, collapsed: true, items: [ @@ -323,7 +329,10 @@ module.exports = { { type: "category", label: "Login users with SSO", - link: { type: "doc", id: "guides/integrate/identity-providers/introduction" }, + link: { + type: "doc", + id: "guides/integrate/identity-providers/introduction", + }, collapsed: true, items: [ "guides/integrate/identity-providers/google", @@ -349,7 +358,7 @@ module.exports = { label: "ZITADEL APIs", link: { type: "doc", - id: "guides/integrate/zitadel-apis/access-zitadel-apis" + id: "guides/integrate/zitadel-apis/access-zitadel-apis", }, collapsed: true, items: [ @@ -478,9 +487,8 @@ module.exports = { { type: "autogenerated", dirName: "concepts/structure", - } - ] - + }, + ], }, { type: "category", @@ -490,9 +498,8 @@ module.exports = { { type: "autogenerated", dirName: "concepts/features", - } - ] - + }, + ], }, { type: "autogenerated", @@ -807,10 +814,7 @@ module.exports = { type: "category", label: "Actions V2", collapsed: false, - items: [ - "apis/actionsv2/introduction", - "apis/actionsv2/execution-local", - ], + items: ["apis/actionsv2/introduction", "apis/actionsv2/execution-local"], }, { type: "doc", @@ -883,11 +887,9 @@ module.exports = { collapsed: false, link: { type: "doc", - id: "self-hosting/manage/cli/overview" + id: "self-hosting/manage/cli/overview", }, - items: [ - "self-hosting/manage/cli/mirror" - ], + items: ["self-hosting/manage/cli/mirror"], }, ], }, diff --git a/docs/static/img/tech/pylon.svg b/docs/static/img/tech/pylon.svg new file mode 100644 index 0000000000..e62fa6e281 --- /dev/null +++ b/docs/static/img/tech/pylon.svg @@ -0,0 +1 @@ + \ No newline at end of file From 85d7536d4410879037f2cd132ca8f8149f518800 Mon Sep 17 00:00:00 2001 From: Livio Spring Date: Mon, 17 Jun 2024 11:09:00 +0200 Subject: [PATCH 31/44] fix(oauth): ensure client error is prioritized over token error (#8133) # Which Problems Are Solved Introduced with #6909, the authentication check (API client) and the token verification on the introspection endpoint where parallelized to improve performance. Only the first error would be considered and returned (and the second completely ignored). This could lead to situations where both the client authentication and token verification failed and the response would result in a 200 OK with `active: false`. # How the Problems Are Solved - The client authentication check error will always be prioritized. - An error in the token check will no longer terminate the client authentication check. # Additional Changes None. # Additional Context - reported in Discord: https://discord.com/channels/927474939156643850/1242770807105781760 --- internal/api/oidc/client_integration_test.go | 9 ++++++++ internal/api/oidc/introspect.go | 23 ++++++++++---------- 2 files changed, 21 insertions(+), 11 deletions(-) diff --git a/internal/api/oidc/client_integration_test.go b/internal/api/oidc/client_integration_test.go index 21d54a59dc..65cc9309d5 100644 --- a/internal/api/oidc/client_integration_test.go +++ b/internal/api/oidc/client_integration_test.go @@ -140,6 +140,15 @@ func TestServer_Introspect(t *testing.T) { } } +func TestServer_Introspect_invalid_auth_invalid_token(t *testing.T) { + // ensure that when an invalid authentication and token is sent, the authentication error is returned + // https://github.com/zitadel/zitadel/pull/8133 + resourceServer, err := Tester.CreateResourceServerClientCredentials(CTX, "xxxxx", "xxxxx") + require.NoError(t, err) + _, err = rs.Introspect[*oidc.IntrospectionResponse](context.Background(), resourceServer, "xxxxx") + require.Error(t, err) +} + func assertIntrospection( t *testing.T, introspection *oidc.IntrospectionResponse, diff --git a/internal/api/oidc/introspect.go b/internal/api/oidc/introspect.go index b0881b6d65..99602393c5 100644 --- a/internal/api/oidc/introspect.go +++ b/internal/api/oidc/introspect.go @@ -54,19 +54,20 @@ func (s *Server) Introspect(ctx context.Context, r *op.Request[op.IntrospectionR select { case client = <-clientChan: resErr = client.err + if resErr != nil { + // we prioritize the client error over the token error + err = resErr + cancel() + } case token = <-tokenChan: resErr = token.err - } - - if resErr == nil { - continue - } - cancel() - - // we only care for the first error that occurred, - // as the next error is most probably a context error. - if err == nil { - err = resErr + if resErr == nil { + continue + } + // we prioritize the client error over the token error + if err == nil { + err = resErr + } } } From 1aa8c49e41da0f1f34cfecd80b444c3ed8b64088 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim=20M=C3=B6hlmann?= Date: Mon, 17 Jun 2024 12:50:12 +0300 Subject: [PATCH 32/44] fix(oidc): store requested response_mode (#8145) # Which Problems Are Solved Zitadel never stored or returned the requested `response_mode` in oidc Auth Requests. This caused the oidc library to fallback to the default based on the response_type. # How the Problems Are Solved - Store the `response_mode` in the Auth request repo - Store the `response_mode` in the Auth request v2 events - Return the `resonse_mode` from the Auth Request v1 and v2 `ResponseMode()` methods. (Was hard-coded to an empty string) # Additional Changes - Populate the `response_modes_supported` to the oidc Discovery Configuration. When it was empty, the standard specifies the default of `query` and `fragment`. However, our oidc library also supports `form_post` and by this fix, zitadel now also supports this. # Additional Context - Closes #6586 - Reported https://discord.com/channels/927474939156643850/1151508313717084220 --------- Co-authored-by: Livio Spring --- docs/docs/apis/openidoauth/endpoints.mdx | 16 ++++ internal/api/oidc/auth_request.go | 1 + internal/api/oidc/auth_request_converter.go | 25 ++++- .../api/oidc/auth_request_converter_test.go | 96 +++++++++++++++++++ .../api/oidc/auth_request_converter_v2.go | 2 +- internal/api/oidc/server.go | 39 ++++---- internal/api/oidc/server_test.go | 2 +- internal/command/auth_request.go | 3 + internal/command/auth_request_model.go | 2 + internal/command/auth_request_test.go | 17 ++++ internal/command/oidc_session_test.go | 4 + internal/domain/application_oidc.go | 10 ++ internal/domain/oidcresponsemode_enumer.go | 86 +++++++++++++++++ internal/domain/request.go | 1 + .../repository/authrequest/auth_request.go | 3 + 15 files changed, 287 insertions(+), 20 deletions(-) create mode 100644 internal/api/oidc/auth_request_converter_test.go create mode 100644 internal/domain/oidcresponsemode_enumer.go diff --git a/docs/docs/apis/openidoauth/endpoints.mdx b/docs/docs/apis/openidoauth/endpoints.mdx index d5828ac6f9..10b6709f19 100644 --- a/docs/docs/apis/openidoauth/endpoints.mdx +++ b/docs/docs/apis/openidoauth/endpoints.mdx @@ -104,6 +104,22 @@ no additional parameters required | prompt | If the Auth Server prompts the user for (re)authentication.
no prompt: the user will have to choose a session if more than one session exists
`none`: user must be authenticated without interaction, an error is returned otherwise
`login`: user must reauthenticate / provide a user name
`select_account`: user is prompted to select one of the existing sessions or create a new one
`create`: the registration form will be displayed to the user directly | | state | Opaque value used to maintain state between the request and the callback. Used for Cross-Site Request Forgery (CSRF) mitigation as well, therefore highly **recommended**. | | ui_locales | Spaces delimited list of preferred locales for the login UI, e.g. `de-CH de en`. If none is provided or matches the possible locales provided by the login UI, the `accept-language` header of the browser will be taken into account. | +| response_mode | The mechanism to be used for returning parameters to the application. See [response modes](#response-modes) for valid values. Invalid values are ignored. | + +#### Response modes + +ZITADEL supports the following `response_mode` values. When no response mode is requested, the response mode is choosen based on the configured Response Type of the application. +As per [OpenID Connect Core 1.0, Section 3.1.2.1](https://openid.net/specs/openid-connect-core-1_0.html#AuthRequest): + +> The use of this parameter is NOT RECOMMENDED when the Response Mode that would be requested is the default mode specified for the Response Type. + +| Response Mode | Description | +| ------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| query | Encode the returned parameters in the URL query string. This is the default when the Response type is `code`, for example [Web applications](/docs/guides/manage/console/applications#web). | +| fragment | Encode the returned parameters in the URL fragment. This is the default when the Response Type is `id_token`, for example implicit [User Agent apps](/docs/guides/manage/console/applications#user-agent). This mode will not work for server-side applications, because fragments are never sent by the browser to the server. | +| form_post[^1] | ZITADEL serves a small JavaScript to the browser which will send the returned parameters to the `redirect_uri` using HTTP POST. This mode only works for server-side applications and user agents which support / allow JavaScript. | + +[^1]: Implements [OAuth 2.0 Form Post Response Mode](https://openid.net/specs/oauth-v2-form-post-response-mode-1_0.html) ### Successful code response diff --git a/internal/api/oidc/auth_request.go b/internal/api/oidc/auth_request.go index 5d23a8bd98..5053f7c1af 100644 --- a/internal/api/oidc/auth_request.go +++ b/internal/api/oidc/auth_request.go @@ -75,6 +75,7 @@ func (o *OPStorage) createAuthRequestLoginClient(ctx context.Context, req *oidc. Audience: audience, NeedRefreshToken: slices.Contains(scope, oidc.ScopeOfflineAccess), ResponseType: ResponseTypeToBusiness(req.ResponseType), + ResponseMode: ResponseModeToBusiness(req.ResponseMode), CodeChallenge: CodeChallengeToBusiness(req.CodeChallenge, req.CodeChallengeMethod), Prompt: PromptToBusiness(req.Prompt), UILocales: UILocalesToBusiness(req.UILocales), diff --git a/internal/api/oidc/auth_request_converter.go b/internal/api/oidc/auth_request_converter.go index 9a1aee2aa4..cd52cdbe58 100644 --- a/internal/api/oidc/auth_request_converter.go +++ b/internal/api/oidc/auth_request_converter.go @@ -6,6 +6,7 @@ import ( "strings" "time" + "github.com/zitadel/logging" "github.com/zitadel/oidc/v3/pkg/oidc" "github.com/zitadel/oidc/v3/pkg/op" "golang.org/x/text/language" @@ -75,7 +76,7 @@ func (a *AuthRequest) GetResponseType() oidc.ResponseType { } func (a *AuthRequest) GetResponseMode() oidc.ResponseMode { - return "" + return ResponseModeToOIDC(a.oidc().ResponseMode) } func (a *AuthRequest) GetScopes() []string { @@ -121,6 +122,7 @@ func CreateAuthRequestToBusiness(ctx context.Context, authReq *oidc.AuthRequest, Request: &domain.AuthRequestOIDC{ Scopes: authReq.Scopes, ResponseType: ResponseTypeToBusiness(authReq.ResponseType), + ResponseMode: ResponseModeToBusiness(authReq.ResponseMode), Nonce: authReq.Nonce, CodeChallenge: CodeChallengeToBusiness(authReq.CodeChallenge, authReq.CodeChallengeMethod), }, @@ -232,6 +234,27 @@ func ResponseTypeToOIDC(responseType domain.OIDCResponseType) oidc.ResponseType } } +// ResponseModeToBusiness returns the OIDCResponseMode enum value from the domain package. +// An empty or invalid value defaults to unspecified. +func ResponseModeToBusiness(responseMode oidc.ResponseMode) domain.OIDCResponseMode { + if responseMode == "" { + return domain.OIDCResponseModeUnspecified + } + out, err := domain.OIDCResponseModeString(string(responseMode)) + logging.OnError(err).Debugln("invalid oidc response_mode, using default") + return out +} + +// ResponseModeToOIDC return the oidc string representation of the enum value from the domain package. +// When responseMode is `0 - unspecified`, an empty string is returned. +// This allows the oidc package to pick the appropriate response mode based on the response type. +func ResponseModeToOIDC(responseMode domain.OIDCResponseMode) oidc.ResponseMode { + if responseMode == domain.OIDCResponseModeUnspecified || !responseMode.IsAOIDCResponseMode() { + return "" + } + return oidc.ResponseMode(responseMode.String()) +} + func CodeChallengeToBusiness(challenge string, method oidc.CodeChallengeMethod) *domain.OIDCCodeChallenge { if challenge == "" { return nil diff --git a/internal/api/oidc/auth_request_converter_test.go b/internal/api/oidc/auth_request_converter_test.go new file mode 100644 index 0000000000..b35d519661 --- /dev/null +++ b/internal/api/oidc/auth_request_converter_test.go @@ -0,0 +1,96 @@ +package oidc + +import ( + "testing" + + "github.com/stretchr/testify/assert" + "github.com/zitadel/oidc/v3/pkg/oidc" + + "github.com/zitadel/zitadel/internal/domain" +) + +func TestResponseModeToBusiness(t *testing.T) { + type args struct { + responseMode oidc.ResponseMode + } + tests := []struct { + name string + args args + want domain.OIDCResponseMode + }{ + { + name: "empty", + args: args{""}, + want: domain.OIDCResponseModeUnspecified, + }, + { + name: "invalid", + args: args{"foo"}, + want: domain.OIDCResponseModeUnspecified, + }, + { + name: "query", + args: args{oidc.ResponseModeQuery}, + want: domain.OIDCResponseModeQuery, + }, + { + name: "fragment", + args: args{oidc.ResponseModeFragment}, + want: domain.OIDCResponseModeFragment, + }, + { + name: "post_form", + args: args{oidc.ResponseModeFormPost}, + want: domain.OIDCResponseModeFormPost, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got := ResponseModeToBusiness(tt.args.responseMode) + assert.Equal(t, tt.want, got) + }) + } +} + +func TestResponseModeToOIDC(t *testing.T) { + type args struct { + responseMode domain.OIDCResponseMode + } + tests := []struct { + name string + args args + want oidc.ResponseMode + }{ + { + name: "unspecified", + args: args{domain.OIDCResponseModeUnspecified}, + want: "", + }, + { + name: "invalid", + args: args{99}, + want: "", + }, + { + name: "query", + args: args{domain.OIDCResponseModeQuery}, + want: oidc.ResponseModeQuery, + }, + { + name: "fragment", + args: args{domain.OIDCResponseModeFragment}, + want: oidc.ResponseModeFragment, + }, + { + name: "form_post", + args: args{domain.OIDCResponseModeFormPost}, + want: oidc.ResponseModeFormPost, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got := ResponseModeToOIDC(tt.args.responseMode) + assert.Equal(t, tt.want, got) + }) + } +} diff --git a/internal/api/oidc/auth_request_converter_v2.go b/internal/api/oidc/auth_request_converter_v2.go index 3a35b01578..cfd516caff 100644 --- a/internal/api/oidc/auth_request_converter_v2.go +++ b/internal/api/oidc/auth_request_converter_v2.go @@ -53,7 +53,7 @@ func (a *AuthRequestV2) GetResponseType() oidc.ResponseType { } func (a *AuthRequestV2) GetResponseMode() oidc.ResponseMode { - return "" + return ResponseModeToOIDC(a.ResponseMode) } func (a *AuthRequestV2) GetScopes() []string { diff --git a/internal/api/oidc/server.go b/internal/api/oidc/server.go index f461996ef2..b0a062b74d 100644 --- a/internal/api/oidc/server.go +++ b/internal/api/oidc/server.go @@ -173,23 +173,28 @@ func (s *Server) EndSession(ctx context.Context, r *op.Request[oidc.EndSessionRe func (s *Server) createDiscoveryConfig(ctx context.Context, supportedUILocales oidc.Locales) *oidc.DiscoveryConfiguration { issuer := op.IssuerFromContext(ctx) return &oidc.DiscoveryConfiguration{ - Issuer: issuer, - AuthorizationEndpoint: s.Endpoints().Authorization.Absolute(issuer), - TokenEndpoint: s.Endpoints().Token.Absolute(issuer), - IntrospectionEndpoint: s.Endpoints().Introspection.Absolute(issuer), - UserinfoEndpoint: s.Endpoints().Userinfo.Absolute(issuer), - RevocationEndpoint: s.Endpoints().Revocation.Absolute(issuer), - EndSessionEndpoint: s.Endpoints().EndSession.Absolute(issuer), - JwksURI: s.Endpoints().JwksURI.Absolute(issuer), - DeviceAuthorizationEndpoint: s.Endpoints().DeviceAuthorization.Absolute(issuer), - ScopesSupported: op.Scopes(s.Provider()), - ResponseTypesSupported: op.ResponseTypes(s.Provider()), - GrantTypesSupported: op.GrantTypes(s.Provider()), - SubjectTypesSupported: op.SubjectTypes(s.Provider()), - IDTokenSigningAlgValuesSupported: []string{s.signingKeyAlgorithm}, - RequestObjectSigningAlgValuesSupported: op.RequestObjectSigAlgorithms(s.Provider()), - TokenEndpointAuthMethodsSupported: op.AuthMethodsTokenEndpoint(s.Provider()), - TokenEndpointAuthSigningAlgValuesSupported: op.TokenSigAlgorithms(s.Provider()), + Issuer: issuer, + AuthorizationEndpoint: s.Endpoints().Authorization.Absolute(issuer), + TokenEndpoint: s.Endpoints().Token.Absolute(issuer), + IntrospectionEndpoint: s.Endpoints().Introspection.Absolute(issuer), + UserinfoEndpoint: s.Endpoints().Userinfo.Absolute(issuer), + RevocationEndpoint: s.Endpoints().Revocation.Absolute(issuer), + EndSessionEndpoint: s.Endpoints().EndSession.Absolute(issuer), + JwksURI: s.Endpoints().JwksURI.Absolute(issuer), + DeviceAuthorizationEndpoint: s.Endpoints().DeviceAuthorization.Absolute(issuer), + ScopesSupported: op.Scopes(s.Provider()), + ResponseTypesSupported: op.ResponseTypes(s.Provider()), + ResponseModesSupported: []string{ + string(oidc.ResponseModeQuery), + string(oidc.ResponseModeFragment), + string(oidc.ResponseModeFormPost), + }, + GrantTypesSupported: op.GrantTypes(s.Provider()), + SubjectTypesSupported: op.SubjectTypes(s.Provider()), + IDTokenSigningAlgValuesSupported: []string{s.signingKeyAlgorithm}, + RequestObjectSigningAlgValuesSupported: op.RequestObjectSigAlgorithms(s.Provider()), + TokenEndpointAuthMethodsSupported: op.AuthMethodsTokenEndpoint(s.Provider()), + TokenEndpointAuthSigningAlgValuesSupported: op.TokenSigAlgorithms(s.Provider()), IntrospectionEndpointAuthSigningAlgValuesSupported: op.IntrospectionSigAlgorithms(s.Provider()), IntrospectionEndpointAuthMethodsSupported: op.AuthMethodsIntrospectionEndpoint(s.Provider()), RevocationEndpointAuthSigningAlgValuesSupported: op.RevocationSigAlgorithms(s.Provider()), diff --git a/internal/api/oidc/server_test.go b/internal/api/oidc/server_test.go index c42c11d195..19404933ba 100644 --- a/internal/api/oidc/server_test.go +++ b/internal/api/oidc/server_test.go @@ -73,7 +73,7 @@ func TestServer_createDiscoveryConfig(t *testing.T) { RegistrationEndpoint: "", ScopesSupported: []string{oidc.ScopeOpenID, oidc.ScopeProfile, oidc.ScopeEmail, oidc.ScopePhone, oidc.ScopeAddress, oidc.ScopeOfflineAccess}, ResponseTypesSupported: []string{string(oidc.ResponseTypeCode), string(oidc.ResponseTypeIDTokenOnly), string(oidc.ResponseTypeIDToken)}, - ResponseModesSupported: nil, + ResponseModesSupported: []string{string(oidc.ResponseModeQuery), string(oidc.ResponseModeFragment), string(oidc.ResponseModeFormPost)}, GrantTypesSupported: []oidc.GrantType{oidc.GrantTypeCode, oidc.GrantTypeImplicit, oidc.GrantTypeRefreshToken, oidc.GrantTypeBearer}, ACRValuesSupported: nil, SubjectTypesSupported: []string{"public"}, diff --git a/internal/command/auth_request.go b/internal/command/auth_request.go index 2acf08bf4f..efd57da240 100644 --- a/internal/command/auth_request.go +++ b/internal/command/auth_request.go @@ -21,6 +21,7 @@ type AuthRequest struct { Scope []string Audience []string ResponseType domain.OIDCResponseType + ResponseMode domain.OIDCResponseMode CodeChallenge *domain.OIDCCodeChallenge Prompt []domain.Prompt UILocales []string @@ -64,6 +65,7 @@ func (c *Commands) AddAuthRequest(ctx context.Context, authRequest *AuthRequest) authRequest.Scope, authRequest.Audience, authRequest.ResponseType, + authRequest.ResponseMode, authRequest.CodeChallenge, authRequest.Prompt, authRequest.UILocales, @@ -162,6 +164,7 @@ func authRequestWriteModelToCurrentAuthRequest(writeModel *AuthRequestWriteModel Scope: writeModel.Scope, Audience: writeModel.Audience, ResponseType: writeModel.ResponseType, + ResponseMode: writeModel.ResponseMode, CodeChallenge: writeModel.CodeChallenge, Prompt: writeModel.Prompt, UILocales: writeModel.UILocales, diff --git a/internal/command/auth_request_model.go b/internal/command/auth_request_model.go index 6390eb7235..a6766d1979 100644 --- a/internal/command/auth_request_model.go +++ b/internal/command/auth_request_model.go @@ -23,6 +23,7 @@ type AuthRequestWriteModel struct { Scope []string Audience []string ResponseType domain.OIDCResponseType + ResponseMode domain.OIDCResponseMode CodeChallenge *domain.OIDCCodeChallenge Prompt []domain.Prompt UILocales []string @@ -58,6 +59,7 @@ func (m *AuthRequestWriteModel) Reduce() error { m.Scope = e.Scope m.Audience = e.Audience m.ResponseType = e.ResponseType + m.ResponseMode = e.ResponseMode m.CodeChallenge = e.CodeChallenge m.Prompt = e.Prompt m.UILocales = e.UILocales diff --git a/internal/command/auth_request_test.go b/internal/command/auth_request_test.go index 92b90e3e24..a3e1db3a28 100644 --- a/internal/command/auth_request_test.go +++ b/internal/command/auth_request_test.go @@ -54,6 +54,7 @@ func TestCommands_AddAuthRequest(t *testing.T) { []string{"openid"}, []string{"audience"}, domain.OIDCResponseTypeCode, + domain.OIDCResponseModeQuery, nil, nil, nil, @@ -89,6 +90,7 @@ func TestCommands_AddAuthRequest(t *testing.T) { []string{"openid"}, []string{"audience"}, domain.OIDCResponseTypeCode, + domain.OIDCResponseModeQuery, &domain.OIDCCodeChallenge{ Challenge: "challenge", Method: domain.CodeChallengeMethodS256, @@ -115,6 +117,7 @@ func TestCommands_AddAuthRequest(t *testing.T) { Scope: []string{"openid"}, Audience: []string{"audience"}, ResponseType: domain.OIDCResponseTypeCode, + ResponseMode: domain.OIDCResponseModeQuery, CodeChallenge: &domain.OIDCCodeChallenge{ Challenge: "challenge", Method: domain.CodeChallengeMethodS256, @@ -137,6 +140,7 @@ func TestCommands_AddAuthRequest(t *testing.T) { Scope: []string{"openid"}, Audience: []string{"audience"}, ResponseType: domain.OIDCResponseTypeCode, + ResponseMode: domain.OIDCResponseModeQuery, CodeChallenge: &domain.OIDCCodeChallenge{ Challenge: "challenge", Method: domain.CodeChallengeMethodS256, @@ -220,6 +224,7 @@ func TestCommands_LinkSessionToAuthRequest(t *testing.T) { []string{"openid"}, []string{"audience"}, domain.OIDCResponseTypeCode, + domain.OIDCResponseModeQuery, nil, nil, nil, @@ -261,6 +266,7 @@ func TestCommands_LinkSessionToAuthRequest(t *testing.T) { []string{"openid"}, []string{"audience"}, domain.OIDCResponseTypeCode, + domain.OIDCResponseModeQuery, nil, nil, nil, @@ -300,6 +306,7 @@ func TestCommands_LinkSessionToAuthRequest(t *testing.T) { []string{"openid"}, []string{"audience"}, domain.OIDCResponseTypeCode, + domain.OIDCResponseModeQuery, nil, nil, nil, @@ -338,6 +345,7 @@ func TestCommands_LinkSessionToAuthRequest(t *testing.T) { []string{"openid"}, []string{"audience"}, domain.OIDCResponseTypeCode, + domain.OIDCResponseModeQuery, nil, nil, nil, @@ -399,6 +407,7 @@ func TestCommands_LinkSessionToAuthRequest(t *testing.T) { []string{"openid"}, []string{"audience"}, domain.OIDCResponseTypeCode, + domain.OIDCResponseModeQuery, nil, nil, nil, @@ -449,6 +458,7 @@ func TestCommands_LinkSessionToAuthRequest(t *testing.T) { []string{"openid"}, []string{"audience"}, domain.OIDCResponseTypeCode, + domain.OIDCResponseModeQuery, nil, nil, nil, @@ -513,6 +523,7 @@ func TestCommands_LinkSessionToAuthRequest(t *testing.T) { Scope: []string{"openid"}, Audience: []string{"audience"}, ResponseType: domain.OIDCResponseTypeCode, + ResponseMode: domain.OIDCResponseModeQuery, }, SessionID: "sessionID", UserID: "userID", @@ -535,6 +546,7 @@ func TestCommands_LinkSessionToAuthRequest(t *testing.T) { []string{"openid"}, []string{"audience"}, domain.OIDCResponseTypeCode, + domain.OIDCResponseModeQuery, nil, nil, nil, @@ -600,6 +612,7 @@ func TestCommands_LinkSessionToAuthRequest(t *testing.T) { Scope: []string{"openid"}, Audience: []string{"audience"}, ResponseType: domain.OIDCResponseTypeCode, + ResponseMode: domain.OIDCResponseModeQuery, }, SessionID: "sessionID", UserID: "userID", @@ -678,6 +691,7 @@ func TestCommands_FailAuthRequest(t *testing.T) { []string{"openid"}, []string{"audience"}, domain.OIDCResponseTypeCode, + domain.OIDCResponseModeQuery, nil, nil, nil, @@ -712,6 +726,7 @@ func TestCommands_FailAuthRequest(t *testing.T) { Scope: []string{"openid"}, Audience: []string{"audience"}, ResponseType: domain.OIDCResponseTypeCode, + ResponseMode: domain.OIDCResponseModeQuery, }, }, }, @@ -773,6 +788,7 @@ func TestCommands_AddAuthRequestCode(t *testing.T) { []string{"openid"}, []string{"audience"}, domain.OIDCResponseTypeCode, + domain.OIDCResponseModeQuery, &domain.OIDCCodeChallenge{ Challenge: "challenge", Method: domain.CodeChallengeMethodS256, @@ -810,6 +826,7 @@ func TestCommands_AddAuthRequestCode(t *testing.T) { []string{"openid"}, []string{"audience"}, domain.OIDCResponseTypeCode, + domain.OIDCResponseModeQuery, &domain.OIDCCodeChallenge{ Challenge: "challenge", Method: domain.CodeChallengeMethodS256, diff --git a/internal/command/oidc_session_test.go b/internal/command/oidc_session_test.go index bbaff1df6b..483528b95c 100644 --- a/internal/command/oidc_session_test.go +++ b/internal/command/oidc_session_test.go @@ -124,6 +124,7 @@ func TestCommands_CreateOIDCSessionFromAuthRequest(t *testing.T) { []string{"openid", "offline_access"}, []string{"audience"}, domain.OIDCResponseTypeCode, + domain.OIDCResponseModeQuery, &domain.OIDCCodeChallenge{ Challenge: "challenge", Method: domain.CodeChallengeMethodS256, @@ -167,6 +168,7 @@ func TestCommands_CreateOIDCSessionFromAuthRequest(t *testing.T) { []string{"openid", "offline_access"}, []string{"audience"}, domain.OIDCResponseTypeCode, + domain.OIDCResponseModeQuery, &domain.OIDCCodeChallenge{ Challenge: "challenge", Method: domain.CodeChallengeMethodS256, @@ -218,6 +220,7 @@ func TestCommands_CreateOIDCSessionFromAuthRequest(t *testing.T) { []string{"openid", "offline_access"}, []string{"audience"}, domain.OIDCResponseTypeCode, + domain.OIDCResponseModeQuery, &domain.OIDCCodeChallenge{ Challenge: "challenge", Method: domain.CodeChallengeMethodS256, @@ -336,6 +339,7 @@ func TestCommands_CreateOIDCSessionFromAuthRequest(t *testing.T) { []string{"openid"}, []string{"audience"}, domain.OIDCResponseTypeIDToken, + domain.OIDCResponseModeQuery, &domain.OIDCCodeChallenge{ Challenge: "challenge", Method: domain.CodeChallengeMethodS256, diff --git a/internal/domain/application_oidc.go b/internal/domain/application_oidc.go index 9fe526d684..5fe7b1f698 100644 --- a/internal/domain/application_oidc.go +++ b/internal/domain/application_oidc.go @@ -83,6 +83,16 @@ const ( OIDCResponseTypeIDTokenToken ) +//go:generate enumer -type OIDCResponseMode -transform snake -trimprefix OIDCResponseMode +type OIDCResponseMode int + +const ( + OIDCResponseModeUnspecified OIDCResponseMode = iota + OIDCResponseModeQuery + OIDCResponseModeFragment + OIDCResponseModeFormPost +) + type OIDCGrantType int32 const ( diff --git a/internal/domain/oidcresponsemode_enumer.go b/internal/domain/oidcresponsemode_enumer.go new file mode 100644 index 0000000000..c1faab6ce5 --- /dev/null +++ b/internal/domain/oidcresponsemode_enumer.go @@ -0,0 +1,86 @@ +// Code generated by "enumer -type OIDCResponseMode -transform snake -trimprefix OIDCResponseMode"; DO NOT EDIT. + +package domain + +import ( + "fmt" + "strings" +) + +const _OIDCResponseModeName = "unspecifiedqueryfragmentform_post" + +var _OIDCResponseModeIndex = [...]uint8{0, 11, 16, 24, 33} + +const _OIDCResponseModeLowerName = "unspecifiedqueryfragmentform_post" + +func (i OIDCResponseMode) String() string { + if i < 0 || i >= OIDCResponseMode(len(_OIDCResponseModeIndex)-1) { + return fmt.Sprintf("OIDCResponseMode(%d)", i) + } + return _OIDCResponseModeName[_OIDCResponseModeIndex[i]:_OIDCResponseModeIndex[i+1]] +} + +// An "invalid array index" compiler error signifies that the constant values have changed. +// Re-run the stringer command to generate them again. +func _OIDCResponseModeNoOp() { + var x [1]struct{} + _ = x[OIDCResponseModeUnspecified-(0)] + _ = x[OIDCResponseModeQuery-(1)] + _ = x[OIDCResponseModeFragment-(2)] + _ = x[OIDCResponseModeFormPost-(3)] +} + +var _OIDCResponseModeValues = []OIDCResponseMode{OIDCResponseModeUnspecified, OIDCResponseModeQuery, OIDCResponseModeFragment, OIDCResponseModeFormPost} + +var _OIDCResponseModeNameToValueMap = map[string]OIDCResponseMode{ + _OIDCResponseModeName[0:11]: OIDCResponseModeUnspecified, + _OIDCResponseModeLowerName[0:11]: OIDCResponseModeUnspecified, + _OIDCResponseModeName[11:16]: OIDCResponseModeQuery, + _OIDCResponseModeLowerName[11:16]: OIDCResponseModeQuery, + _OIDCResponseModeName[16:24]: OIDCResponseModeFragment, + _OIDCResponseModeLowerName[16:24]: OIDCResponseModeFragment, + _OIDCResponseModeName[24:33]: OIDCResponseModeFormPost, + _OIDCResponseModeLowerName[24:33]: OIDCResponseModeFormPost, +} + +var _OIDCResponseModeNames = []string{ + _OIDCResponseModeName[0:11], + _OIDCResponseModeName[11:16], + _OIDCResponseModeName[16:24], + _OIDCResponseModeName[24:33], +} + +// OIDCResponseModeString retrieves an enum value from the enum constants string name. +// Throws an error if the param is not part of the enum. +func OIDCResponseModeString(s string) (OIDCResponseMode, error) { + if val, ok := _OIDCResponseModeNameToValueMap[s]; ok { + return val, nil + } + + if val, ok := _OIDCResponseModeNameToValueMap[strings.ToLower(s)]; ok { + return val, nil + } + return 0, fmt.Errorf("%s does not belong to OIDCResponseMode values", s) +} + +// OIDCResponseModeValues returns all values of the enum +func OIDCResponseModeValues() []OIDCResponseMode { + return _OIDCResponseModeValues +} + +// OIDCResponseModeStrings returns a slice of all String values of the enum +func OIDCResponseModeStrings() []string { + strs := make([]string, len(_OIDCResponseModeNames)) + copy(strs, _OIDCResponseModeNames) + return strs +} + +// IsAOIDCResponseMode returns "true" if the value is listed in the enum definition. "false" otherwise +func (i OIDCResponseMode) IsAOIDCResponseMode() bool { + for _, v := range _OIDCResponseModeValues { + if i == v { + return true + } + } + return false +} diff --git a/internal/domain/request.go b/internal/domain/request.go index 5cf4846999..7c2c57436a 100644 --- a/internal/domain/request.go +++ b/internal/domain/request.go @@ -29,6 +29,7 @@ const ( type AuthRequestOIDC struct { Scopes []string ResponseType OIDCResponseType + ResponseMode OIDCResponseMode Nonce string CodeChallenge *OIDCCodeChallenge } diff --git a/internal/repository/authrequest/auth_request.go b/internal/repository/authrequest/auth_request.go index 0492c541f8..99f034333b 100644 --- a/internal/repository/authrequest/auth_request.go +++ b/internal/repository/authrequest/auth_request.go @@ -30,6 +30,7 @@ type AddedEvent struct { Scope []string `json:"scope,omitempty"` Audience []string `json:"audience,omitempty"` ResponseType domain.OIDCResponseType `json:"response_type,omitempty"` + ResponseMode domain.OIDCResponseMode `json:"response_mode,omitempty"` CodeChallenge *domain.OIDCCodeChallenge `json:"code_challenge,omitempty"` Prompt []domain.Prompt `json:"prompt,omitempty"` UILocales []string `json:"ui_locales,omitempty"` @@ -57,6 +58,7 @@ func NewAddedEvent(ctx context.Context, scope, audience []string, responseType domain.OIDCResponseType, + responseMode domain.OIDCResponseMode, codeChallenge *domain.OIDCCodeChallenge, prompt []domain.Prompt, uiLocales []string, @@ -79,6 +81,7 @@ func NewAddedEvent(ctx context.Context, Scope: scope, Audience: audience, ResponseType: responseType, + ResponseMode: responseMode, CodeChallenge: codeChallenge, Prompt: prompt, UILocales: uiLocales, From 8daaf3d1999f0a7252078d213b9684f0fec31f90 Mon Sep 17 00:00:00 2001 From: Miguel Cabrerizo <30386061+doncicuto@users.noreply.github.com> Date: Mon, 17 Jun 2024 12:34:12 +0200 Subject: [PATCH 33/44] fix: mdc dialog styles not being applied to secret generator module (#8141) # Which Problems Are Solved - Styles from the material design component dialog are not being applied (no padding, wrong theme colors for titles...) # How the Problems Are Solved - The MatDialogModule has been added to secret-generator.module.ts so the styles are applied Here's a video showing the fix in action: https://github.com/doncicuto/zitadel/assets/30386061/32567e58-b7d6-48da-8369-b48e23828a5c # Additional Context - Closes #8085 Co-authored-by: Fabi --- .../policies/secret-generator/secret-generator.module.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/console/src/app/modules/policies/secret-generator/secret-generator.module.ts b/console/src/app/modules/policies/secret-generator/secret-generator.module.ts index 525ef47cf3..9c61492f62 100644 --- a/console/src/app/modules/policies/secret-generator/secret-generator.module.ts +++ b/console/src/app/modules/policies/secret-generator/secret-generator.module.ts @@ -8,7 +8,7 @@ import { MatSelectModule } from '@angular/material/select'; import { MatSlideToggleModule } from '@angular/material/slide-toggle'; import { TranslateModule } from '@ngx-translate/core'; import { HasRolePipeModule } from 'src/app/pipes/has-role-pipe/has-role-pipe.module'; - +import { MatDialogModule } from '@angular/material/dialog'; import { CardModule } from '../../card/card.module'; import { FormFieldModule } from '../../form-field/form-field.module'; import { InputModule } from '../../input/input.module'; @@ -31,6 +31,7 @@ import { SecretGeneratorComponent } from './secret-generator.component'; MatProgressSpinnerModule, MatSelectModule, TranslateModule, + MatDialogModule, ], exports: [SecretGeneratorComponent, DialogAddSecretGeneratorComponent], }) From a873d960d17b56b941c6e65b0e964b47a00f5fd1 Mon Sep 17 00:00:00 2001 From: Miguel Cabrerizo <30386061+doncicuto@users.noreply.github.com> Date: Mon, 17 Jun 2024 13:31:11 +0200 Subject: [PATCH 34/44] fix: show "Default settings" for small screens < 600px (#8144) # Which Problems Are Solved - For devices with screen width lower than 600 px the "Default Settings" button is not shown unless you put the device in landscape mode # How the Problems Are Solved - I've modified the styles so this button is always displayed (I've tested up to 350 px devices) but for devices width lower than 375px the font size will be x-small. Thanks to the cog icon and the smaller text if seems to work fine Here are two screenshots for a 400 px device: ![Captura desde 2024-06-14 18-31-52](https://github.com/zitadel/zitadel/assets/30386061/1734dc77-312b-4c93-baa7-8d5e90ad68f3) and a 360 px device: ![Captura desde 2024-06-14 18-32-45](https://github.com/zitadel/zitadel/assets/30386061/37876f26-e097-47af-bf06-b4cc67fcbfb8) # Additional Context - Closes #7574 --- .../src/app/modules/header/header.component.scss | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/console/src/app/modules/header/header.component.scss b/console/src/app/modules/header/header.component.scss index 04a9e53d2e..219e7d2e75 100644 --- a/console/src/app/modules/header/header.component.scss +++ b/console/src/app/modules/header/header.component.scss @@ -248,12 +248,16 @@ display: none; } - @media only screen and (min-width: 600px) { - display: inline; + display: inline; - i { - margin-right: -0.5rem; - margin-left: 0.25rem; + i { + margin-right: -0.5rem; + margin-left: 0.25rem; + } + + @media only screen and (max-width: 375px) { + .iam-label { + font-size: x-small; } } } From efcb41398dd096e4835a5e3a55925cb909473e8d Mon Sep 17 00:00:00 2001 From: Daniel Moisa Date: Mon, 17 Jun 2024 14:54:43 +0300 Subject: [PATCH 35/44] fix(8076): last name chip on text messages (#8147) # Which Problems Are Solved fix {{.Lastname}} chip on test message settings # How the Problems Are Solved {{.LastName}} should appear in the text field # Additional Changes No additional changes # Additional Context - Closes #8076 Co-authored-by: Daniel Moisa Co-authored-by: Fabi --- .../message-texts/message-texts.component.ts | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/console/src/app/modules/policies/message-texts/message-texts.component.ts b/console/src/app/modules/policies/message-texts/message-texts.component.ts index d71d5e346e..3daeb76be2 100644 --- a/console/src/app/modules/policies/message-texts/message-texts.component.ts +++ b/console/src/app/modules/policies/message-texts/message-texts.component.ts @@ -406,7 +406,7 @@ export class MessageTextsComponent implements OnInit, OnDestroy { { key: 'POLICY.MESSAGE_TEXTS.CHIPS.tempUsername', value: '{{.TempUsername}}' }, { key: 'POLICY.MESSAGE_TEXTS.CHIPS.username', value: '{{.UserName}}' }, { key: 'POLICY.MESSAGE_TEXTS.CHIPS.firstname', value: '{{.FirstName}}' }, - { key: 'POLICY.MESSAGE_TEXTS.CHIPS.lastname', value: '{{.Lastname}}' }, + { key: 'POLICY.MESSAGE_TEXTS.CHIPS.lastname', value: '{{.LastName}}' }, { key: 'POLICY.MESSAGE_TEXTS.CHIPS.nickName', value: '{{.NickName}}' }, { key: 'POLICY.MESSAGE_TEXTS.CHIPS.displayName', value: '{{.DisplayName}}' }, { key: 'POLICY.MESSAGE_TEXTS.CHIPS.lastEmail', value: '{{.LastEmail}}' }, @@ -421,7 +421,7 @@ export class MessageTextsComponent implements OnInit, OnDestroy { { key: 'POLICY.MESSAGE_TEXTS.CHIPS.preferredLoginName', value: '{{.PreferredLoginName}}' }, { key: 'POLICY.MESSAGE_TEXTS.CHIPS.username', value: '{{.UserName}}' }, { key: 'POLICY.MESSAGE_TEXTS.CHIPS.firstname', value: '{{.FirstName}}' }, - { key: 'POLICY.MESSAGE_TEXTS.CHIPS.lastname', value: '{{.Lastname}}' }, + { key: 'POLICY.MESSAGE_TEXTS.CHIPS.lastname', value: '{{.LastName}}' }, { key: 'POLICY.MESSAGE_TEXTS.CHIPS.nickName', value: '{{.NickName}}' }, { key: 'POLICY.MESSAGE_TEXTS.CHIPS.displayName', value: '{{.DisplayName}}' }, { key: 'POLICY.MESSAGE_TEXTS.CHIPS.lastEmail', value: '{{.LastEmail}}' }, @@ -436,7 +436,7 @@ export class MessageTextsComponent implements OnInit, OnDestroy { { key: 'POLICY.MESSAGE_TEXTS.CHIPS.preferredLoginName', value: '{{.PreferredLoginName}}' }, { key: 'POLICY.MESSAGE_TEXTS.CHIPS.username', value: '{{.UserName}}' }, { key: 'POLICY.MESSAGE_TEXTS.CHIPS.firstname', value: '{{.FirstName}}' }, - { key: 'POLICY.MESSAGE_TEXTS.CHIPS.lastname', value: '{{.Lastname}}' }, + { key: 'POLICY.MESSAGE_TEXTS.CHIPS.lastname', value: '{{.LastName}}' }, { key: 'POLICY.MESSAGE_TEXTS.CHIPS.nickName', value: '{{.NickName}}' }, { key: 'POLICY.MESSAGE_TEXTS.CHIPS.displayName', value: '{{.DisplayName}}' }, { key: 'POLICY.MESSAGE_TEXTS.CHIPS.lastEmail', value: '{{.LastEmail}}' }, @@ -451,7 +451,7 @@ export class MessageTextsComponent implements OnInit, OnDestroy { { key: 'POLICY.MESSAGE_TEXTS.CHIPS.preferredLoginName', value: '{{.PreferredLoginName}}' }, { key: 'POLICY.MESSAGE_TEXTS.CHIPS.username', value: '{{.UserName}}' }, { key: 'POLICY.MESSAGE_TEXTS.CHIPS.firstname', value: '{{.FirstName}}' }, - { key: 'POLICY.MESSAGE_TEXTS.CHIPS.lastname', value: '{{.Lastname}}' }, + { key: 'POLICY.MESSAGE_TEXTS.CHIPS.lastname', value: '{{.LastName}}' }, { key: 'POLICY.MESSAGE_TEXTS.CHIPS.nickName', value: '{{.NickName}}' }, { key: 'POLICY.MESSAGE_TEXTS.CHIPS.displayName', value: '{{.DisplayName}}' }, { key: 'POLICY.MESSAGE_TEXTS.CHIPS.lastEmail', value: '{{.LastEmail}}' }, @@ -466,7 +466,7 @@ export class MessageTextsComponent implements OnInit, OnDestroy { { key: 'POLICY.MESSAGE_TEXTS.CHIPS.preferredLoginName', value: '{{.PreferredLoginName}}' }, { key: 'POLICY.MESSAGE_TEXTS.CHIPS.username', value: '{{.UserName}}' }, { key: 'POLICY.MESSAGE_TEXTS.CHIPS.firstname', value: '{{.FirstName}}' }, - { key: 'POLICY.MESSAGE_TEXTS.CHIPS.lastname', value: '{{.Lastname}}' }, + { key: 'POLICY.MESSAGE_TEXTS.CHIPS.lastname', value: '{{.LastName}}' }, { key: 'POLICY.MESSAGE_TEXTS.CHIPS.nickName', value: '{{.NickName}}' }, { key: 'POLICY.MESSAGE_TEXTS.CHIPS.displayName', value: '{{.DisplayName}}' }, { key: 'POLICY.MESSAGE_TEXTS.CHIPS.lastEmail', value: '{{.LastEmail}}' }, @@ -482,7 +482,7 @@ export class MessageTextsComponent implements OnInit, OnDestroy { { key: 'POLICY.MESSAGE_TEXTS.CHIPS.preferredLoginName', value: '{{.PreferredLoginName}}' }, { key: 'POLICY.MESSAGE_TEXTS.CHIPS.username', value: '{{.UserName}}' }, { key: 'POLICY.MESSAGE_TEXTS.CHIPS.firstname', value: '{{.FirstName}}' }, - { key: 'POLICY.MESSAGE_TEXTS.CHIPS.lastname', value: '{{.Lastname}}' }, + { key: 'POLICY.MESSAGE_TEXTS.CHIPS.lastname', value: '{{.LastName}}' }, { key: 'POLICY.MESSAGE_TEXTS.CHIPS.nickName', value: '{{.NickName}}' }, { key: 'POLICY.MESSAGE_TEXTS.CHIPS.displayName', value: '{{.DisplayName}}' }, { key: 'POLICY.MESSAGE_TEXTS.CHIPS.lastEmail', value: '{{.LastEmail}}' }, @@ -498,7 +498,7 @@ export class MessageTextsComponent implements OnInit, OnDestroy { { key: 'POLICY.MESSAGE_TEXTS.CHIPS.preferredLoginName', value: '{{.PreferredLoginName}}' }, { key: 'POLICY.MESSAGE_TEXTS.CHIPS.username', value: '{{.UserName}}' }, { key: 'POLICY.MESSAGE_TEXTS.CHIPS.firstname', value: '{{.FirstName}}' }, - { key: 'POLICY.MESSAGE_TEXTS.CHIPS.lastname', value: '{{.Lastname}}' }, + { key: 'POLICY.MESSAGE_TEXTS.CHIPS.lastname', value: '{{.LastName}}' }, { key: 'POLICY.MESSAGE_TEXTS.CHIPS.nickName', value: '{{.NickName}}' }, { key: 'POLICY.MESSAGE_TEXTS.CHIPS.displayName', value: '{{.DisplayName}}' }, { key: 'POLICY.MESSAGE_TEXTS.CHIPS.lastEmail', value: '{{.LastEmail}}' }, @@ -512,7 +512,7 @@ export class MessageTextsComponent implements OnInit, OnDestroy { { key: 'POLICY.MESSAGE_TEXTS.CHIPS.preferredLoginName', value: '{{.PreferredLoginName}}' }, { key: 'POLICY.MESSAGE_TEXTS.CHIPS.username', value: '{{.UserName}}' }, { key: 'POLICY.MESSAGE_TEXTS.CHIPS.firstname', value: '{{.FirstName}}' }, - { key: 'POLICY.MESSAGE_TEXTS.CHIPS.lastname', value: '{{.Lastname}}' }, + { key: 'POLICY.MESSAGE_TEXTS.CHIPS.lastname', value: '{{.LastName}}' }, { key: 'POLICY.MESSAGE_TEXTS.CHIPS.nickName', value: '{{.NickName}}' }, { key: 'POLICY.MESSAGE_TEXTS.CHIPS.displayName', value: '{{.DisplayName}}' }, { key: 'POLICY.MESSAGE_TEXTS.CHIPS.lastEmail', value: '{{.LastEmail}}' }, @@ -526,7 +526,7 @@ export class MessageTextsComponent implements OnInit, OnDestroy { { key: 'POLICY.MESSAGE_TEXTS.CHIPS.preferredLoginName', value: '{{.PreferredLoginName}}' }, { key: 'POLICY.MESSAGE_TEXTS.CHIPS.username', value: '{{.UserName}}' }, { key: 'POLICY.MESSAGE_TEXTS.CHIPS.firstname', value: '{{.FirstName}}' }, - { key: 'POLICY.MESSAGE_TEXTS.CHIPS.lastname', value: '{{.Lastname}}' }, + { key: 'POLICY.MESSAGE_TEXTS.CHIPS.lastname', value: '{{.LastName}}' }, { key: 'POLICY.MESSAGE_TEXTS.CHIPS.nickName', value: '{{.NickName}}' }, { key: 'POLICY.MESSAGE_TEXTS.CHIPS.displayName', value: '{{.DisplayName}}' }, { key: 'POLICY.MESSAGE_TEXTS.CHIPS.lastEmail', value: '{{.LastEmail}}' }, From 7576f09de628331ec97fd67c3ca8dfcad69fb5b2 Mon Sep 17 00:00:00 2001 From: Miguel Cabrerizo <30386061+doncicuto@users.noreply.github.com> Date: Mon, 17 Jun 2024 14:19:19 +0200 Subject: [PATCH 36/44] fix: pat token overflow in dialog (#8131) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit # Which Problems Are Solved @mffap reported in issue #8084 that there was an oferflow error when the PAT token was displayed which made copying it almost impossible # How the Problems Are Solved It seems there was an issue with the token text not wrapping well as the token is a long word. Sometimes the token was displayed well but it was only because the token contains hyphens that made the text go into a new line but if no hyphen was there there was an overflow issue. I've used a new class for the token to be displayed and used the css properties explained in [mdn](https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_text/Wrapping_breaking_text) ``` overflow-wrap: break-word; word-break: break-all; ``` Here's a video showing the fix in action: https://github.com/zitadel/zitadel/assets/30386061/096de18d-4424-46b8-a287-cce6539c2053 # Additional Context - Closes #8084 Co-authored-by: Tim Möhlmann --- .../show-token-dialog/show-token-dialog.component.html | 2 +- .../show-token-dialog/show-token-dialog.component.scss | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/console/src/app/modules/show-token-dialog/show-token-dialog.component.html b/console/src/app/modules/show-token-dialog/show-token-dialog.component.html index 3748c59d66..8b5992c91a 100644 --- a/console/src/app/modules/show-token-dialog/show-token-dialog.component.html +++ b/console/src/app/modules/show-token-dialog/show-token-dialog.component.html @@ -25,7 +25,7 @@ - {{ tokenResponse.token }} + {{ tokenResponse.token }} diff --git a/console/src/app/modules/show-token-dialog/show-token-dialog.component.scss b/console/src/app/modules/show-token-dialog/show-token-dialog.component.scss index 1dc60536ee..27c0cb1c7b 100644 --- a/console/src/app/modules/show-token-dialog/show-token-dialog.component.scss +++ b/console/src/app/modules/show-token-dialog/show-token-dialog.component.scss @@ -40,6 +40,11 @@ display: flex; align-items: center; + .token { + overflow-wrap: break-word; + word-break: break-all; + } + .ctc { margin-right: 1rem; } From 04fc59f538a6d879af09db8e36a85a17b5d15d28 Mon Sep 17 00:00:00 2001 From: Stefan Benz <46600784+stebenz@users.noreply.github.com> Date: Mon, 17 Jun 2024 14:47:38 +0200 Subject: [PATCH 37/44] fix: empty custom text changes push no events (#8054) # Which Problems Are Solved If there is no custom text given, the call ends in an internal error as no events have to be pushed. # How the Problems Are Solved If no events have to be pushed, no trying to push an empty list of events. # Additional Changes No additional changes. # Additional Context Closes #6954 --- internal/command/instance_custom_login_text.go | 3 +++ internal/command/instance_custom_login_text_test.go | 1 - internal/command/instance_custom_message_text.go | 3 +++ internal/command/instance_custom_message_text_test.go | 1 - internal/command/org_custom_login_text.go | 3 +++ internal/command/org_custom_login_text_test.go | 1 - internal/command/org_custom_message_text.go | 3 +++ internal/command/org_custom_message_text_test.go | 1 - 8 files changed, 12 insertions(+), 4 deletions(-) diff --git a/internal/command/instance_custom_login_text.go b/internal/command/instance_custom_login_text.go index ca86a48290..a132b2d20a 100644 --- a/internal/command/instance_custom_login_text.go +++ b/internal/command/instance_custom_login_text.go @@ -21,6 +21,9 @@ func (c *Commands) SetCustomInstanceLoginText(ctx context.Context, loginText *do if err != nil { return nil, err } + if len(events) == 0 { + return writeModelToObjectDetails(&existingMailText.WriteModel), nil + } pushedEvents, err := c.eventstore.Push(ctx, events...) if err != nil { return nil, err diff --git a/internal/command/instance_custom_login_text_test.go b/internal/command/instance_custom_login_text_test.go index abdaf7307d..57efbf43d7 100644 --- a/internal/command/instance_custom_login_text_test.go +++ b/internal/command/instance_custom_login_text_test.go @@ -38,7 +38,6 @@ func TestCommandSide_SetCustomIAMLoginText(t *testing.T) { eventstore: eventstoreExpect( t, expectFilter(), - expectPush(), ), }, args: args{ diff --git a/internal/command/instance_custom_message_text.go b/internal/command/instance_custom_message_text.go index 03c073e4d3..f8b4ed3178 100644 --- a/internal/command/instance_custom_message_text.go +++ b/internal/command/instance_custom_message_text.go @@ -21,6 +21,9 @@ func (c *Commands) SetDefaultMessageText(ctx context.Context, instanceID string, if err != nil { return nil, err } + if len(events) == 0 { + return writeModelToObjectDetails(&existingMessageText.WriteModel), nil + } pushedEvents, err := c.eventstore.Push(ctx, events...) if err != nil { return nil, err diff --git a/internal/command/instance_custom_message_text_test.go b/internal/command/instance_custom_message_text_test.go index edb330c6a3..76f463ae02 100644 --- a/internal/command/instance_custom_message_text_test.go +++ b/internal/command/instance_custom_message_text_test.go @@ -54,7 +54,6 @@ func TestCommandSide_SetDefaultMessageText(t *testing.T) { eventstore: eventstoreExpect( t, expectFilter(), - expectPush(), ), }, args: args{ diff --git a/internal/command/org_custom_login_text.go b/internal/command/org_custom_login_text.go index b3d52c669a..1f906972bf 100644 --- a/internal/command/org_custom_login_text.go +++ b/internal/command/org_custom_login_text.go @@ -23,6 +23,9 @@ func (c *Commands) SetOrgLoginText(ctx context.Context, resourceOwner string, lo if err != nil { return nil, err } + if len(events) == 0 { + return writeModelToObjectDetails(&existingLoginText.WriteModel), nil + } pushedEvents, err := c.eventstore.Push(ctx, events...) if err != nil { return nil, err diff --git a/internal/command/org_custom_login_text_test.go b/internal/command/org_custom_login_text_test.go index 0411a533a4..81f7c308d3 100644 --- a/internal/command/org_custom_login_text_test.go +++ b/internal/command/org_custom_login_text_test.go @@ -56,7 +56,6 @@ func TestCommandSide_SetCustomOrgLoginText(t *testing.T) { eventstore: eventstoreExpect( t, expectFilter(), - expectPush(), ), }, args: args{ diff --git a/internal/command/org_custom_message_text.go b/internal/command/org_custom_message_text.go index cd9fc2da9c..266b502090 100644 --- a/internal/command/org_custom_message_text.go +++ b/internal/command/org_custom_message_text.go @@ -23,6 +23,9 @@ func (c *Commands) SetOrgMessageText(ctx context.Context, resourceOwner string, if err != nil { return nil, err } + if len(events) == 0 { + return writeModelToObjectDetails(&existingMessageText.WriteModel), nil + } pushedEvents, err := c.eventstore.Push(ctx, events...) if err != nil { return nil, err diff --git a/internal/command/org_custom_message_text_test.go b/internal/command/org_custom_message_text_test.go index 424a887794..ffa8d87aed 100644 --- a/internal/command/org_custom_message_text_test.go +++ b/internal/command/org_custom_message_text_test.go @@ -67,7 +67,6 @@ func TestCommandSide_SetCustomMessageText(t *testing.T) { eventstore: eventstoreExpect( t, expectFilter(), - expectPush(), ), }, args: args{ From 65f787cc02c3c8e2303d84e7f71641fa53e70dd4 Mon Sep 17 00:00:00 2001 From: Silvan Date: Tue, 18 Jun 2024 10:29:02 +0200 Subject: [PATCH 38/44] docs: add developing with dev containers (#8095) # Which Problems Are Solved Describes how to develop ZITADEL using dev containers. # Additional Changes Sets default env variables for using postgres as database in the dev container. --- .devcontainer/docker-compose.yml | 12 ++++++- CONTRIBUTING.md | 14 ++++++++ .../docs/self-hosting/deploy/devcontainer.mdx | 33 +++++++++++++++++++ docs/sidebars.js | 1 + 4 files changed, 59 insertions(+), 1 deletion(-) create mode 100644 docs/docs/self-hosting/deploy/devcontainer.mdx diff --git a/.devcontainer/docker-compose.yml b/.devcontainer/docker-compose.yml index c7f273a49e..fd92959d3f 100644 --- a/.devcontainer/docker-compose.yml +++ b/.devcontainer/docker-compose.yml @@ -7,7 +7,17 @@ services: - /var/run/docker.sock:/var/run/docker.sock network_mode: service:db command: sleep infinity - + environment: + - 'ZITADEL_DATABASE_POSTGRES_HOST=db' + - 'ZITADEL_DATABASE_POSTGRES_PORT=5432' + - 'ZITADEL_DATABASE_POSTGRES_DATABASE=zitadel' + - 'ZITADEL_DATABASE_POSTGRES_USER_USERNAME=zitadel' + - 'ZITADEL_DATABASE_POSTGRES_USER_PASSWORD=zitadel' + - 'ZITADEL_DATABASE_POSTGRES_USER_SSL_MODE=disable' + - 'ZITADEL_DATABASE_POSTGRES_ADMIN_USERNAME=postgres' + - 'ZITADEL_DATABASE_POSTGRES_ADMIN_PASSWORD=postgres' + - 'ZITADEL_DATABASE_POSTGRES_ADMIN_SSL_MODE=disable' + - 'ZITADEL_EXTERNALSECURE=false' db: image: postgres:latest restart: unless-stopped diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index f193706eb7..4d58908786 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -141,6 +141,20 @@ Replace "policeman" with "police officer," "manpower" with "workforce," and "bus Ableist language includes words or phrases such as crazy, insane, blind to or blind eye to, cripple, dumb, and others. Choose alternative words depending on the context. +### Developing ZITADEL with Dev Containers + +Follow the instructions provided by your code editor/IDE to initiate the development container. This typically involves opening the "Command Palette" or similar functionality and searching for commands related to "Dev Containers" or "Remote Containers". The quick start guide for VS Code can found [here](https://code.visualstudio.com/docs/devcontainers/containers#_quick-start-open-an-existing-folder-in-a-container) + +When you are connected to the container run the following commands to start ZITADEL. + +```bash +make compile && ./zitadel start-from-init --masterkey MasterkeyNeedsToHave32Characters --tlsMode disabled +``` + +ZITADEL serves traffic as soon as you can see the following log line: + +`INFO[0001] server is listening on [::]:8080` + ### Backend/login By executing the commands from this section, you run everything you need to develop the ZITADEL backend locally. diff --git a/docs/docs/self-hosting/deploy/devcontainer.mdx b/docs/docs/self-hosting/deploy/devcontainer.mdx new file mode 100644 index 0000000000..fd15207fff --- /dev/null +++ b/docs/docs/self-hosting/deploy/devcontainer.mdx @@ -0,0 +1,33 @@ +--- +title: Developing ZITADEL with Dev Containers +sidebar_label: Dev Containers +--- + +Dev containers provide a convenient way to set up a development environment for ZITADEL with all the necessary dependencies pre-configured. This allows you to start contributing or working on ZITADEL locally with minimal setup. + +## Prerequisites + +- Docker installed on your machine. You can find installation instructions for Docker on their official website: https://docs.docker.com/engine/install/ +- A code editor or IDE with remote container development capabilities (optional, but recommended). [Visual Studio Code](https://code.visualstudio.com) with the [Remote Containers extension](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers) is a popular option. + +## Setting Up Dev Container + + +ZITADEL provides a `.devcontainer` folder that configures the development environment within a container. Here's how to get started: + +1. Clone the ZITADEL repository from GitHub: +```bash +git clone https://github.com/zitadel/zitadel.git +``` +2. Navigate to the project directory: +```bash +cd zitadel +``` +3. Open the project in your code editor or IDE (if using one with remote container support). +4. Follow the instructions provided by your code editor/IDE to initiate the development container. This typically involves opening the "Command Palette" or similar functionality and searching for commands related to "Dev Containers" or "Remote Containers". The quick start guide for VS Code can found [here](https://code.visualstudio.com/docs/devcontainers/containers#_quick-start-open-an-existing-folder-in-a-container) + +**Note**: The first time you run this command, it might take some time to download the container image. + +## Using Dev Container + +Once the container is running, you will have a development environment set up with all the necessary dependencies pre-installed. You can then follow the instructions in the ZITADEL [contribution guide](https://github.com/zitadel/zitadel/blob/main/CONTRIBUTING.md#developing-zitadel-with-dev-containers) to build and run ZITADEL, or develop the ZITADEL console application. diff --git a/docs/sidebars.js b/docs/sidebars.js index 965a5d7a8c..a1e00d5fc2 100644 --- a/docs/sidebars.js +++ b/docs/sidebars.js @@ -843,6 +843,7 @@ module.exports = { "self-hosting/deploy/linux", "self-hosting/deploy/macos", "self-hosting/deploy/compose", + "self-hosting/deploy/devcontainer", "self-hosting/deploy/knative", "self-hosting/deploy/kubernetes", "self-hosting/deploy/loadbalancing-example/loadbalancing-example", From fb8cd18f93e55e7ffa6612f1452b100fd7e8a01e Mon Sep 17 00:00:00 2001 From: Livio Spring Date: Tue, 18 Jun 2024 13:27:44 +0200 Subject: [PATCH 39/44] feat: password age policy (#8132) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit # Which Problems Are Solved Some organizations / customers have the requirement, that there users regularly need to change their password. ZITADEL already had the possibility to manage a `password age policy` ( thought the API) with the maximum amount of days a password should be valid, resp. days after with the user should be warned of the upcoming expiration. The policy could not be managed though the Console UI and was not checked in the Login UI. # How the Problems Are Solved - The policy can be managed in the Console UI's settings sections on an instance and organization level. - During an authentication in the Login UI, if a policy is set with an expiry (>0) and the user's last password change exceeds the amount of days set, the user will be prompted to change their password. - The prompt message of the Login UI can be customized in the Custom Login Texts though the Console and API on the instance and each organization. - The information when the user last changed their password is returned in the Auth, Management and User V2 API. - The policy can be retrieved in the settings service as `password expiry settings`. # Additional Changes None. # Additional Context - closes #8081 --------- Co-authored-by: Tim Möhlmann --- cmd/setup/25.go | 2 +- cmd/setup/25.sql | 4 +- .../modules/policies/login-texts/helper.ts | 1 + .../password-age-policy-routing.module.ts | 20 ++ .../password-age-policy.component.html | 50 ++++ .../password-age-policy.component.scss | 37 +++ .../password-age-policy.component.spec.ts | 24 ++ .../password-age-policy.component.ts | 178 +++++++++++ .../password-age-policy.module.ts | 46 +++ .../settings-list.component.html | 3 + .../settings-list/settings-list.module.ts | 2 + .../src/app/modules/settings-list/settings.ts | 10 + .../app/pages/instance/instance.component.ts | 2 + .../org-settings/org-settings.component.ts | 2 + console/src/assets/i18n/bg.json | 9 +- console/src/assets/i18n/cs.json | 9 +- console/src/assets/i18n/de.json | 3 +- console/src/assets/i18n/en.json | 9 +- console/src/assets/i18n/es.json | 9 +- console/src/assets/i18n/fr.json | 9 +- console/src/assets/i18n/it.json | 9 +- console/src/assets/i18n/ja.json | 9 +- console/src/assets/i18n/mk.json | 9 +- console/src/assets/i18n/nl.json | 9 +- console/src/assets/i18n/pl.json | 9 +- console/src/assets/i18n/pt.json | 7 +- console/src/assets/i18n/ru.json | 7 +- console/src/assets/i18n/sv.json | 9 +- console/src/assets/i18n/zh.json | 7 +- internal/api/grpc/settings/v2/settings.go | 17 +- .../grpc/settings/v2/settings_converter.go | 10 +- .../settings/v2/settings_converter_test.go | 25 +- internal/api/grpc/text/custom_text.go | 2 + internal/api/grpc/user/converter.go | 7 + internal/api/grpc/user/v2/query.go | 6 + .../grpc/user/v2/query_integration_test.go | 47 +-- .../api/ui/login/change_password_handler.go | 10 + internal/api/ui/login/renderer.go | 1 + internal/api/ui/login/static/i18n/bg.yaml | 1 + internal/api/ui/login/static/i18n/cs.yaml | 1 + internal/api/ui/login/static/i18n/de.yaml | 1 + internal/api/ui/login/static/i18n/en.yaml | 1 + internal/api/ui/login/static/i18n/es.yaml | 1 + internal/api/ui/login/static/i18n/fr.yaml | 1 + internal/api/ui/login/static/i18n/it.yaml | 1 + internal/api/ui/login/static/i18n/ja.yaml | 1 + internal/api/ui/login/static/i18n/mk.yaml | 1 + internal/api/ui/login/static/i18n/nl.yaml | 1 + internal/api/ui/login/static/i18n/pl.yaml | 1 + internal/api/ui/login/static/i18n/pt.yaml | 1 + internal/api/ui/login/static/i18n/ru.yaml | 1 + internal/api/ui/login/static/i18n/sv.yaml | 3 +- internal/api/ui/login/static/i18n/zh.yaml | 1 + .../static/templates/change_password.html | 4 + .../eventsourcing/eventstore/auth_request.go | 49 +++- .../eventstore/auth_request_test.go | 86 +++++- .../repository/eventsourcing/repository.go | 1 + internal/command/custom_login_text.go | 4 + internal/command/custom_login_text_model.go | 9 + .../instance_custom_login_text_test.go | 29 ++ .../command/org_custom_login_text_test.go | 28 ++ internal/domain/auth_request.go | 1 + internal/domain/custom_login_text.go | 2 + internal/domain/next_step.go | 4 +- internal/integration/client.go | 6 +- internal/query/custom_text.go | 3 + internal/query/iam_member_test.go | 26 +- internal/query/org_member_test.go | 32 +- internal/query/project_grant_member_test.go | 32 +- internal/query/project_member_test.go | 32 +- internal/query/projection/user.go | 13 +- internal/query/projection/user_test.go | 216 +++++++------- internal/query/sessions_test.go | 12 +- internal/query/user.go | 13 + internal/query/user_auth_method_test.go | 16 +- internal/query/user_by_id.sql | 7 +- internal/query/user_by_login_name.sql | 7 +- internal/query/user_grant_test.go | 44 +-- internal/query/user_notify_by_id.sql | 6 +- internal/query/user_notify_by_login_name.sql | 6 +- internal/query/user_test.go | 277 +++++++++--------- internal/query/userinfo_by_id.sql | 6 +- internal/user/repository/view/user_by_id.sql | 6 +- .../repository/view/user_session_by_id.sql | 4 +- .../view/user_sessions_by_user_agent.sql | 4 +- proto/zitadel/admin.proto | 20 +- proto/zitadel/management.proto | 19 +- proto/zitadel/policy.proto | 11 +- .../settings/v2beta/password_settings.proto | 17 ++ .../settings/v2beta/settings_service.proto | 33 +++ proto/zitadel/text.proto | 1 + proto/zitadel/user.proto | 2 + proto/zitadel/user/v2beta/user.proto | 3 + 93 files changed, 1250 insertions(+), 487 deletions(-) create mode 100644 console/src/app/modules/policies/password-age-policy/password-age-policy-routing.module.ts create mode 100644 console/src/app/modules/policies/password-age-policy/password-age-policy.component.html create mode 100644 console/src/app/modules/policies/password-age-policy/password-age-policy.component.scss create mode 100644 console/src/app/modules/policies/password-age-policy/password-age-policy.component.spec.ts create mode 100644 console/src/app/modules/policies/password-age-policy/password-age-policy.component.ts create mode 100644 console/src/app/modules/policies/password-age-policy/password-age-policy.module.ts diff --git a/cmd/setup/25.go b/cmd/setup/25.go index 28444ef3a8..c2cd4258d3 100644 --- a/cmd/setup/25.go +++ b/cmd/setup/25.go @@ -23,5 +23,5 @@ func (mig *User11AddLowerFieldsToVerifiedEmail) Execute(ctx context.Context, _ e } func (mig *User11AddLowerFieldsToVerifiedEmail) String() string { - return "25_user12_add_lower_fields_to_verified_email" + return "25_user13_add_lower_fields_to_verified_email" } diff --git a/cmd/setup/25.sql b/cmd/setup/25.sql index 8450865bb2..8a9ee06e03 100644 --- a/cmd/setup/25.sql +++ b/cmd/setup/25.sql @@ -1,2 +1,2 @@ -ALTER TABLE IF EXISTS projections.users12_notifications ADD COLUMN IF NOT EXISTS verified_email_lower TEXT GENERATED ALWAYS AS (lower(verified_email)) STORED; -CREATE INDEX IF NOT EXISTS users12_notifications_email_search ON projections.users12_notifications (instance_id, verified_email_lower); +ALTER TABLE IF EXISTS projections.users13_notifications ADD COLUMN IF NOT EXISTS verified_email_lower TEXT GENERATED ALWAYS AS (lower(verified_email)) STORED; +CREATE INDEX IF NOT EXISTS users13_notifications_email_search ON projections.users13_notifications (instance_id, verified_email_lower); diff --git a/console/src/app/modules/policies/login-texts/helper.ts b/console/src/app/modules/policies/login-texts/helper.ts index 3cd24ceb48..355b267061 100644 --- a/console/src/app/modules/policies/login-texts/helper.ts +++ b/console/src/app/modules/policies/login-texts/helper.ts @@ -188,6 +188,7 @@ export function mapRequestValues(map: Partial, req: Req): Req { const r17 = new PasswordChangeScreenText(); r17.setDescription(map.passwordChangeText?.description ?? ''); + r17.setExpiredDescription(map.passwordChangeText?.expiredDescription ?? ''); r17.setNextButtonText(map.passwordChangeText?.nextButtonText ?? ''); r17.setTitle(map.passwordChangeText?.title ?? ''); r17.setNewPasswordLabel(map.passwordChangeText?.newPasswordLabel ?? ''); diff --git a/console/src/app/modules/policies/password-age-policy/password-age-policy-routing.module.ts b/console/src/app/modules/policies/password-age-policy/password-age-policy-routing.module.ts new file mode 100644 index 0000000000..42473c1280 --- /dev/null +++ b/console/src/app/modules/policies/password-age-policy/password-age-policy-routing.module.ts @@ -0,0 +1,20 @@ +import { NgModule } from '@angular/core'; +import { RouterModule, Routes } from '@angular/router'; + +import { PasswordAgePolicyComponent } from './password-age-policy.component'; + +const routes: Routes = [ + { + path: '', + component: PasswordAgePolicyComponent, + data: { + animation: 'DetailPage', + }, + }, +]; + +@NgModule({ + imports: [RouterModule.forChild(routes)], + exports: [RouterModule], +}) +export class PasswordAgePolicyRoutingModule {} diff --git a/console/src/app/modules/policies/password-age-policy/password-age-policy.component.html b/console/src/app/modules/policies/password-age-policy/password-age-policy.component.html new file mode 100644 index 0000000000..9319bacff5 --- /dev/null +++ b/console/src/app/modules/policies/password-age-policy/password-age-policy.component.html @@ -0,0 +1,50 @@ +

{{ 'POLICY.PWD_AGE.TITLE' | translate }}

+

{{ 'POLICY.PWD_AGE.DESCRIPTION' | translate }}

+ +
+ +
+ + + + + +
+ +
+
+ + {{ 'POLICY.DATA.MAXAGEDAYS' | translate }} + + +
+ +
+ + {{ 'POLICY.DATA.EXPIREWARNDAYS' | translate }} + + +
+
+
+
+ +
+ +
diff --git a/console/src/app/modules/policies/password-age-policy/password-age-policy.component.scss b/console/src/app/modules/policies/password-age-policy/password-age-policy.component.scss new file mode 100644 index 0000000000..6a7a9f7d49 --- /dev/null +++ b/console/src/app/modules/policies/password-age-policy/password-age-policy.component.scss @@ -0,0 +1,37 @@ +.default { + display: block; + margin-bottom: 1rem; +} + +.policy-applied-to { + margin: -1rem 0 0 0; + font-size: 14px; +} + +.age-content { + display: flex; + flex-direction: column; + width: 100%; + + .row { + display: flex; + align-items: center; + padding: 0.3rem 0; + + .pwd-age-form-field { + width: 100%; + max-width: 300px; + } + } +} + +.btn-container { + display: flex; + justify-content: flex-start; + width: 100%; + + button { + display: block; + margin-right: 1rem; + } +} diff --git a/console/src/app/modules/policies/password-age-policy/password-age-policy.component.spec.ts b/console/src/app/modules/policies/password-age-policy/password-age-policy.component.spec.ts new file mode 100644 index 0000000000..6d65e83273 --- /dev/null +++ b/console/src/app/modules/policies/password-age-policy/password-age-policy.component.spec.ts @@ -0,0 +1,24 @@ +import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; + +import { PasswordAgePolicyComponent } from './password-age-policy.component'; + +describe('PasswordLockoutPolicyComponent', () => { + let component: PasswordAgePolicyComponent; + let fixture: ComponentFixture; + + beforeEach(waitForAsync(() => { + TestBed.configureTestingModule({ + declarations: [PasswordAgePolicyComponent], + }).compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(PasswordAgePolicyComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/console/src/app/modules/policies/password-age-policy/password-age-policy.component.ts b/console/src/app/modules/policies/password-age-policy/password-age-policy.component.ts new file mode 100644 index 0000000000..66a4574dbd --- /dev/null +++ b/console/src/app/modules/policies/password-age-policy/password-age-policy.component.ts @@ -0,0 +1,178 @@ +import { Component, Injector, Input, OnInit, Type } from '@angular/core'; +import { AbstractControl, UntypedFormBuilder, UntypedFormControl, UntypedFormGroup } from '@angular/forms'; +import { MatDialog } from '@angular/material/dialog'; +import { GetPasswordAgePolicyResponse as AdminGetPasswordAgePolicyResponse } from 'src/app/proto/generated/zitadel/admin_pb'; +import { GetPasswordAgePolicyResponse as MgmtGetPasswordAgePolicyResponse } from 'src/app/proto/generated/zitadel/management_pb'; +import { PasswordAgePolicy } from 'src/app/proto/generated/zitadel/policy_pb'; +import { AdminService } from 'src/app/services/admin.service'; +import { ManagementService } from 'src/app/services/mgmt.service'; +import { ToastService } from 'src/app/services/toast.service'; + +import { InfoSectionType } from '../../info-section/info-section.component'; +import { WarnDialogComponent } from '../../warn-dialog/warn-dialog.component'; +import { PolicyComponentServiceType } from '../policy-component-types.enum'; +import { requiredValidator } from '../../form-field/validators/validators'; +import { Observable } from 'rxjs'; +import { GrpcAuthService } from '../../../services/grpc-auth.service'; +import { take } from 'rxjs/operators'; + +@Component({ + selector: 'cnsl-password-age-policy', + templateUrl: './password-age-policy.component.html', + styleUrls: ['./password-age-policy.component.scss'], +}) +export class PasswordAgePolicyComponent implements OnInit { + @Input() public service!: ManagementService | AdminService; + @Input() public serviceType: PolicyComponentServiceType = PolicyComponentServiceType.MGMT; + + public passwordAgeForm!: UntypedFormGroup; + public passwordAgeData?: PasswordAgePolicy.AsObject; + public PolicyComponentServiceType: any = PolicyComponentServiceType; + public InfoSectionType: any = InfoSectionType; + public loading: boolean = false; + + public canWrite$: Observable = this.authService.isAllowed([ + this.serviceType === PolicyComponentServiceType.ADMIN + ? 'iam.policy.write' + : this.serviceType === PolicyComponentServiceType.MGMT + ? 'policy.write' + : '', + ]); + + constructor( + private authService: GrpcAuthService, + private toast: ToastService, + private injector: Injector, + private dialog: MatDialog, + private fb: UntypedFormBuilder, + ) { + this.passwordAgeForm = this.fb.group({ + maxAgeDays: ['', []], + expireWarnDays: ['', []], + }); + + this.canWrite$.pipe(take(1)).subscribe((canWrite) => { + if (canWrite) { + this.passwordAgeForm.enable(); + } else { + this.passwordAgeForm.disable(); + } + }); + } + + public ngOnInit(): void { + switch (this.serviceType) { + case PolicyComponentServiceType.MGMT: + this.service = this.injector.get(ManagementService as Type); + break; + case PolicyComponentServiceType.ADMIN: + this.service = this.injector.get(AdminService as Type); + break; + } + this.fetchData(); + } + + private fetchData(): void { + this.loading = true; + + this.getData().then((resp) => { + if (resp.policy) { + this.passwordAgeData = resp.policy; + this.passwordAgeForm.patchValue(this.passwordAgeData); + this.loading = false; + } + }); + } + + private getData(): Promise { + switch (this.serviceType) { + case PolicyComponentServiceType.MGMT: + return (this.service as ManagementService).getPasswordAgePolicy(); + case PolicyComponentServiceType.ADMIN: + return (this.service as AdminService).getPasswordAgePolicy(); + } + } + + public resetPolicy(): void { + if (this.service instanceof ManagementService) { + const dialogRef = this.dialog.open(WarnDialogComponent, { + data: { + confirmKey: 'ACTIONS.RESET', + cancelKey: 'ACTIONS.CANCEL', + titleKey: 'SETTING.DIALOG.RESET.DEFAULTTITLE', + descriptionKey: 'SETTING.DIALOG.RESET.DEFAULTDESCRIPTION', + }, + width: '400px', + }); + + dialogRef.afterClosed().subscribe((resp) => { + if (resp) { + (this.service as ManagementService) + .resetPasswordAgePolicyToDefault() + .then(() => { + this.toast.showInfo('POLICY.TOAST.RESETSUCCESS', true); + this.fetchData(); + }) + .catch((error) => { + this.toast.showError(error); + }); + } + }); + } + } + + public savePolicy(): void { + let promise: Promise; + if (this.passwordAgeData) { + if (this.service instanceof AdminService) { + promise = this.service + .updatePasswordAgePolicy(this.maxAgeDays?.value ?? 0, this.expireWarnDays?.value ?? 0) + .then(() => { + this.toast.showInfo('POLICY.TOAST.SET', true); + this.fetchData(); + }) + .catch((error) => { + this.toast.showError(error); + }); + } else { + if ((this.passwordAgeData as PasswordAgePolicy.AsObject).isDefault) { + promise = (this.service as ManagementService) + .addCustomPasswordAgePolicy(this.maxAgeDays?.value ?? 0, this.expireWarnDays?.value ?? 0) + .then(() => { + this.toast.showInfo('POLICY.TOAST.SET', true); + this.fetchData(); + }) + .catch((error) => { + this.toast.showError(error); + }); + } else { + promise = (this.service as ManagementService) + .updateCustomPasswordAgePolicy(this.maxAgeDays?.value ?? 0, this.expireWarnDays?.value ?? 0) + .then(() => { + this.toast.showInfo('POLICY.TOAST.SET', true); + this.fetchData(); + }) + .catch((error) => { + this.toast.showError(error); + }); + } + } + } + } + + public get isDefault(): boolean { + if (this.passwordAgeData && this.serviceType === PolicyComponentServiceType.MGMT) { + return (this.passwordAgeData as PasswordAgePolicy.AsObject).isDefault; + } else { + return false; + } + } + + public get maxAgeDays(): AbstractControl | null { + return this.passwordAgeForm.get('maxAgeDays'); + } + + public get expireWarnDays(): AbstractControl | null { + return this.passwordAgeForm.get('expireWarnDays'); + } +} diff --git a/console/src/app/modules/policies/password-age-policy/password-age-policy.module.ts b/console/src/app/modules/policies/password-age-policy/password-age-policy.module.ts new file mode 100644 index 0000000000..10c290cb2f --- /dev/null +++ b/console/src/app/modules/policies/password-age-policy/password-age-policy.module.ts @@ -0,0 +1,46 @@ +import { CommonModule } from '@angular/common'; +import { NgModule } from '@angular/core'; +import { FormsModule, ReactiveFormsModule } from '@angular/forms'; +import { MatButtonModule } from '@angular/material/button'; +import { MatDialogModule } from '@angular/material/dialog'; +import { MatIconModule } from '@angular/material/icon'; +import { MatSlideToggleModule } from '@angular/material/slide-toggle'; +import { MatTooltipModule } from '@angular/material/tooltip'; +import { TranslateModule } from '@ngx-translate/core'; +import { HasRoleModule } from 'src/app/directives/has-role/has-role.module'; +import { DetailLayoutModule } from 'src/app/modules/detail-layout/detail-layout.module'; +import { InputModule } from 'src/app/modules/input/input.module'; +import { HasRolePipeModule } from 'src/app/pipes/has-role-pipe/has-role-pipe.module'; + +import { CardModule } from '../../card/card.module'; +import { InfoSectionModule } from '../../info-section/info-section.module'; +import { WarnDialogModule } from '../../warn-dialog/warn-dialog.module'; +import { PasswordAgePolicyRoutingModule } from './password-age-policy-routing.module'; +import { PasswordAgePolicyComponent } from './password-age-policy.component'; +import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; + +@NgModule({ + declarations: [PasswordAgePolicyComponent], + imports: [ + PasswordAgePolicyRoutingModule, + CommonModule, + FormsModule, + InputModule, + MatButtonModule, + MatSlideToggleModule, + HasRolePipeModule, + MatDialogModule, + WarnDialogModule, + MatIconModule, + HasRoleModule, + MatTooltipModule, + CardModule, + TranslateModule, + DetailLayoutModule, + InfoSectionModule, + ReactiveFormsModule, + MatProgressSpinnerModule, + ], + exports: [PasswordAgePolicyComponent], +}) +export class PasswordAgePolicyModule {} diff --git a/console/src/app/modules/settings-list/settings-list.component.html b/console/src/app/modules/settings-list/settings-list.component.html index 0038737b8d..f60427a300 100644 --- a/console/src/app/modules/settings-list/settings-list.component.html +++ b/console/src/app/modules/settings-list/settings-list.component.html @@ -18,6 +18,9 @@ + + + diff --git a/console/src/app/modules/settings-list/settings-list.module.ts b/console/src/app/modules/settings-list/settings-list.module.ts index 5538c49bef..3ff71f9e30 100644 --- a/console/src/app/modules/settings-list/settings-list.module.ts +++ b/console/src/app/modules/settings-list/settings-list.module.ts @@ -16,6 +16,7 @@ import { NotificationPolicyModule } from '../policies/notification-policy/notifi import { NotificationSMSProviderModule } from '../policies/notification-sms-provider/notification-sms-provider.module'; import { OIDCConfigurationModule } from '../policies/oidc-configuration/oidc-configuration.module'; import { PasswordComplexityPolicyModule } from '../policies/password-complexity-policy/password-complexity-policy.module'; +import { PasswordAgePolicyModule } from '../policies/password-age-policy/password-age-policy.module'; import { PasswordLockoutPolicyModule } from '../policies/password-lockout-policy/password-lockout-policy.module'; import { PrivacyPolicyModule } from '../policies/privacy-policy/privacy-policy.module'; import { PrivateLabelingPolicyModule } from '../policies/private-labeling-policy/private-labeling-policy.module'; @@ -40,6 +41,7 @@ import OrgListModule from 'src/app/pages/org-list/org-list.module'; LoginPolicyModule, CardModule, PasswordComplexityPolicyModule, + PasswordAgePolicyModule, PasswordLockoutPolicyModule, PrivateLabelingPolicyModule, LanguageSettingsModule, diff --git a/console/src/app/modules/settings-list/settings.ts b/console/src/app/modules/settings-list/settings.ts index 2b24d84e24..0335e511b2 100644 --- a/console/src/app/modules/settings-list/settings.ts +++ b/console/src/app/modules/settings-list/settings.ts @@ -117,6 +117,16 @@ export const LOCKOUT: SidenavSetting = { }, }; +export const AGE: SidenavSetting = { + id: 'age', + i18nKey: 'SETTINGS.LIST.AGE', + groupI18nKey: 'SETTINGS.GROUPS.LOGIN', + requiredRoles: { + [PolicyComponentServiceType.MGMT]: ['policy.read'], + [PolicyComponentServiceType.ADMIN]: ['iam.policy.read'], + }, +}; + export const COMPLEXITY: SidenavSetting = { id: 'complexity', i18nKey: 'SETTINGS.LIST.COMPLEXITY', diff --git a/console/src/app/pages/instance/instance.component.ts b/console/src/app/pages/instance/instance.component.ts index 8798027400..52151a2fa4 100644 --- a/console/src/app/pages/instance/instance.component.ts +++ b/console/src/app/pages/instance/instance.component.ts @@ -18,6 +18,7 @@ import { LANGUAGES, IDP, LOCKOUT, + AGE, LOGIN, LOGINTEXTS, MESSAGETEXTS, @@ -64,6 +65,7 @@ export class InstanceComponent implements OnInit, OnDestroy { LOGIN, IDP, COMPLEXITY, + AGE, LOCKOUT, DOMAIN, diff --git a/console/src/app/pages/org-settings/org-settings.component.ts b/console/src/app/pages/org-settings/org-settings.component.ts index 79624e204a..1cc5a9d902 100644 --- a/console/src/app/pages/org-settings/org-settings.component.ts +++ b/console/src/app/pages/org-settings/org-settings.component.ts @@ -7,6 +7,7 @@ import { Breadcrumb, BreadcrumbService, BreadcrumbType } from 'src/app/services/ import { GrpcAuthService } from 'src/app/services/grpc-auth.service'; import { + AGE, BRANDING, COMPLEXITY, DOMAIN, @@ -33,6 +34,7 @@ export class OrgSettingsComponent implements OnInit { LOGIN, IDP, COMPLEXITY, + AGE, LOCKOUT, NOTIFICATIONS, VERIFIED_DOMAINS, diff --git a/console/src/assets/i18n/bg.json b/console/src/assets/i18n/bg.json index 6589d79ff0..a2b2f7616c 100644 --- a/console/src/assets/i18n/bg.json +++ b/console/src/assets/i18n/bg.json @@ -1319,6 +1319,7 @@ "LANGUAGES": "Езици", "LOGIN": "Поведение при влизане и сигурност", "LOCKOUT": "Блокиране", + "AGE": "Изтичане на паролата", "COMPLEXITY": "Сложност на паролата", "NOTIFICATIONS": "Настройки за известията", "SMTP_PROVIDER": "SMTP доставчик", @@ -1539,8 +1540,8 @@ } }, "PWD_AGE": { - "TITLE": "Остаряване на паролата", - "DESCRIPTION": "Можете да зададете политика за остаряването на паролите. " + "TITLE": "Изтичане на паролата", + "DESCRIPTION": "Можете да зададете политика за изтичане на паролите. Тази политика ще принуди потребителя да смени паролата при следващото влизане след изтичането. Няма автоматични предупреждения и известия." }, "PWD_LOCKOUT": { "TITLE": "Политика за блокиране", @@ -1693,8 +1694,8 @@ "SHOWLOCKOUTFAILURES": "показва грешки при блокиране", "MAXPASSWORDATTEMPTS": "Максимален брой опити за парола", "MAXOTPATTEMPTS": "Максимален брой опити за OTP", - "EXPIREWARNDAYS": "Предупреждение за изтичане след ден", - "MAXAGEDAYS": "Максимална възраст в дни", + "EXPIREWARNDAYS": "Предупреждение за изтичане след дни", + "MAXAGEDAYS": "Максимална валидност в дни", "USERLOGINMUSTBEDOMAIN": "Добавяне на домейн на организация като суфикс към имената за вход", "USERLOGINMUSTBEDOMAIN_DESCRIPTION": "Ако активирате тази настройка, всички имена за вход ще имат суфикс с домейна на организацията. ", "VALIDATEORGDOMAINS": "Верификация на домейна на организацията е необходима (DNS или HTTP предизвикателство)", diff --git a/console/src/assets/i18n/cs.json b/console/src/assets/i18n/cs.json index e72ef21840..8e78955c6a 100644 --- a/console/src/assets/i18n/cs.json +++ b/console/src/assets/i18n/cs.json @@ -1326,6 +1326,7 @@ "LANGUAGES": "Jazyky", "LOGIN": "Chování při přihlášení a bezpečnost", "LOCKOUT": "Blokování", + "AGE": "Expirace hesla", "COMPLEXITY": "Složitost hesla", "NOTIFICATIONS": "Oznámení", "SMTP_PROVIDER": "Poskytovatel SMTP", @@ -1546,8 +1547,8 @@ } }, "PWD_AGE": { - "TITLE": "Stáří hesla", - "DESCRIPTION": "Můžete nastavit politiku pro stáří hesel. Tato politika vydá varování po uplynutí konkrétního času stáří." + "TITLE": "Expirace hesla", + "DESCRIPTION": "Můžete nastavit pravidlo pro vypršení platnosti hesel. Toto pravidlo donutí uživatele změnit heslo při dalším přihlášení po uplynutí platnosti. Neexistují žádná automatická varování a upozornění." }, "PWD_LOCKOUT": { "TITLE": "Politika uzamčení", @@ -1700,8 +1701,8 @@ "SHOWLOCKOUTFAILURES": "zobrazit neúspěšné pokusy o uzamčení", "MAXPASSWORDATTEMPTS": "Maximální počet pokusů o heslo", "MAXOTPATTEMPTS": "Maximální počet pokusů o OTP", - "EXPIREWARNDAYS": "Upozornění na expiraci po dni", - "MAXAGEDAYS": "Maximální stáří v dnech", + "EXPIREWARNDAYS": "Upozornění na uplynutí po dnech", + "MAXAGEDAYS": "Maximální platnost v dnech", "USERLOGINMUSTBEDOMAIN": "Přidat doménu organizace jako příponu k přihlašovacím jménům", "USERLOGINMUSTBEDOMAIN_DESCRIPTION": "Pokud povolíte toto nastavení, všechna přihlašovací jména budou doplněna o doménu organizace. Pokud je toto nastavení zakázáno, musíte zajistit, aby byla uživatelská jména jedinečná napříč všemi organizacemi.", "VALIDATEORGDOMAINS": "Požadováno ověření domény organizace (DNS nebo HTTP výzva)", diff --git a/console/src/assets/i18n/de.json b/console/src/assets/i18n/de.json index 8b5f09929d..5c905e2e62 100644 --- a/console/src/assets/i18n/de.json +++ b/console/src/assets/i18n/de.json @@ -1325,6 +1325,7 @@ "LANGUAGES": "Sprachen", "LOGIN": "Loginverhalten und Sicherheit", "LOCKOUT": "Sperrmechanismen", + "AGE": "Passwortgültigkeitsdauer", "COMPLEXITY": "Passwordkomplexität", "NOTIFICATIONS": "Benachrichtigungseinstellungen", "SMTP_PROVIDER": "SMTP-Anbieter", @@ -1546,7 +1547,7 @@ }, "PWD_AGE": { "TITLE": "Gültigkeitsdauer für Passwörter", - "DESCRIPTION": "Du kannst eine Richtlinie für die maximale Gültigkeitsdauer von Passwörtern festlegen. Diese Richtlinie löst eine Warnung nach Ablauf einer festgelegten Gültigkeitsdauer aus." + "DESCRIPTION": "Du kannst eine Richtlinie für die maximale Gültigkeitsdauer von Passwörtern festlegen. Diese Richtlinie zwingt den Benutzer dazu, das Passwort bei der nächsten Anmeldung nach dem Ablauf zu ändern. Es gibt keine automatischen Warnungen und Benachrichtigungen." }, "PWD_LOCKOUT": { "TITLE": "Passwortsperre", diff --git a/console/src/assets/i18n/en.json b/console/src/assets/i18n/en.json index 70a4bc63c8..00b54a64b0 100644 --- a/console/src/assets/i18n/en.json +++ b/console/src/assets/i18n/en.json @@ -1326,6 +1326,7 @@ "LANGUAGES": "Languages", "LOGIN": "Login Behavior and Security", "LOCKOUT": "Lockout", + "AGE": "Password expiry", "COMPLEXITY": "Password complexity", "NOTIFICATIONS": "Notifications", "SMTP_PROVIDER": "SMTP Provider", @@ -1546,8 +1547,8 @@ } }, "PWD_AGE": { - "TITLE": "Password Aging", - "DESCRIPTION": "You can set a policy for the aging of passwords. This policy emits a warning after the specific aging time has elapsed." + "TITLE": "Password Expiry", + "DESCRIPTION": "You can set a policy for the expiry of passwords. This policy will force the user to change the password on the next login after the expiration. There are no automatic warnings and notifications." }, "PWD_LOCKOUT": { "TITLE": "Lockout Policy", @@ -1700,8 +1701,8 @@ "SHOWLOCKOUTFAILURES": "show lockout failures", "MAXPASSWORDATTEMPTS": "Password maximum attempts", "MAXOTPATTEMPTS": "OTP maximum attempts", - "EXPIREWARNDAYS": "Expiration Warning after day", - "MAXAGEDAYS": "Max Age in days", + "EXPIREWARNDAYS": "Expiration Warning after days", + "MAXAGEDAYS": "Maximum validity in days", "USERLOGINMUSTBEDOMAIN": "Add organization domain as suffix to loginnames", "USERLOGINMUSTBEDOMAIN_DESCRIPTION": "If you enable this setting, all loginnames will be suffixed with the organization domain. If this settings is disabled, you have to ensure that usernames are unique over all organizations.", "VALIDATEORGDOMAINS": "Organization domain verification required (DNS or HTTP challenge)", diff --git a/console/src/assets/i18n/es.json b/console/src/assets/i18n/es.json index 6c6f1b1dbb..bbf6db2056 100644 --- a/console/src/assets/i18n/es.json +++ b/console/src/assets/i18n/es.json @@ -1327,6 +1327,7 @@ "LANGUAGES": "Idiomas", "LOGIN": "Comportamiento del inicio de sesión y de la seguridad", "LOCKOUT": "Bloqueo", + "AGE": "Caducidad de la contraseña", "COMPLEXITY": "Complejidad de contraseña", "NOTIFICATIONS": "Ajustes de notificación", "SMTP_PROVIDER": "Proveedor SMTP", @@ -1547,8 +1548,8 @@ } }, "PWD_AGE": { - "TITLE": "Antigüedad de la contraseña", - "DESCRIPTION": "Puedes establecer una política para la antigüedad de las contraseñas. Esta política emite un aviso después de que la antigüedad máxima se haya superado." + "TITLE": "Caducidad de la contraseña", + "DESCRIPTION": "Puedes establecer una política para la caducidad de las contraseñas. Esta política obligará al usuario a cambiar la contraseña en el próximo inicio de sesión después de la caducidad. No hay avisos ni notificaciones automáticos." }, "PWD_LOCKOUT": { "TITLE": "Política de bloqueo", @@ -1701,8 +1702,8 @@ "SHOWLOCKOUTFAILURES": "mostrar fallos de bloqueo", "MAXPASSWORDATTEMPTS": "Intentos máximos de contraseña", "MAXOTPATTEMPTS": "Intentos máximos de OTP", - "EXPIREWARNDAYS": "Aviso de expiración después de estos días: ", - "MAXAGEDAYS": "Antigüedad máxima en días", + "EXPIREWARNDAYS": "Aviso de caducidad después de días", + "MAXAGEDAYS": "Validez máxima en días", "USERLOGINMUSTBEDOMAIN": "Añadir el dominio de la organización como sufijo de los nombres de inicio de sesión", "USERLOGINMUSTBEDOMAIN_DESCRIPTION": "Si activas esta opción, todos los nombres de inicio de sesión tendrán como sufijo el dominio de esta organización. Si esta opción está desactivada, tendrás que asegurarte de que los nombres de usuario son únicos para todas las organizaciones.", "VALIDATEORGDOMAINS": "Verificación de dominio de la organización requerida (desafío DNS o HTTP)", diff --git a/console/src/assets/i18n/fr.json b/console/src/assets/i18n/fr.json index c2104d9016..afa97d1adf 100644 --- a/console/src/assets/i18n/fr.json +++ b/console/src/assets/i18n/fr.json @@ -1325,6 +1325,7 @@ "LANGUAGES": "Langues", "LOGIN": "Comportement de connexion et sécurité", "LOCKOUT": "Verrouillage", + "AGE": "Expiration du mot de passe", "COMPLEXITY": "Complexité du mot de passe", "NOTIFICATIONS": "Paramètres de notification", "SMTP_PROVIDER": "Fournisseur SMTP", @@ -1545,8 +1546,8 @@ } }, "PWD_AGE": { - "TITLE": "Vieillissement des mots de passe", - "DESCRIPTION": "Vous pouvez définir une politique pour le vieillissement des mots de passe. Cette politique émet un avertissement après que le temps de vieillissement spécifique se soit écoulé." + "TITLE": "Expiration du mot de passe", + "DESCRIPTION": "Vous pouvez définir une politique d'expiration des mots de passe. Cette politique obligera l'utilisateur à changer son mot de passe lors de la prochaine connexion après l'expiration. Il n'y a pas d'avertissements ni de notifications automatiques." }, "PWD_LOCKOUT": { "TITLE": "Politique de verrouillage", @@ -1699,8 +1700,8 @@ "SHOWLOCKOUTFAILURES": "montrer les échecs de verrouillage", "MAXPASSWORDATTEMPTS": "Tentatives maximales du mot de passe", "MAXOTPATTEMPTS": "Tentatives maximales de l'OTP", - "EXPIREWARNDAYS": "Avertissement d'expiration après le jour", - "MAXAGEDAYS": "Âge maximum en jours", + "EXPIREWARNDAYS": "Avertissement d'expiration après jours", + "MAXAGEDAYS": "Validité maximale en jours", "USERLOGINMUSTBEDOMAIN": "Le nom de connexion de l'utilisateur doit contenir le nom de domaine de l'organisation", "USERLOGINMUSTBEDOMAIN_DESCRIPTION": "Si vous activez ce paramètre, tous les noms de connexion seront suffixés avec le domaine de l'organisation. Si ce paramètre est désactivé, vous devez vous assurer que les noms d'utilisateur sont uniques pour toutes les organisations.", "VALIDATEORGDOMAINS": "Vérification du domaine de l'organisation requise (challenge DNS ou HTTP)", diff --git a/console/src/assets/i18n/it.json b/console/src/assets/i18n/it.json index 2a1003db6b..ac84a51c49 100644 --- a/console/src/assets/i18n/it.json +++ b/console/src/assets/i18n/it.json @@ -1325,6 +1325,7 @@ "LANGUAGES": "Lingue", "LOGIN": "Comportamento login e sicurezza", "LOCKOUT": "Meccanismi di bloccaggio", + "AGE": "Scadenza password", "COMPLEXITY": "Complessità della password", "NOTIFICATIONS": "Impostazioni di notifica", "SMTP_PROVIDER": "Fornitore SMTP", @@ -1545,8 +1546,8 @@ } }, "PWD_AGE": { - "TITLE": "Impostazioni di validità della password", - "DESCRIPTION": "È possibile impostare una impostazone per la validità delle password. Questa emette un avviso dopo che il tempo di invecchiamento specifico è trascorso." + "TITLE": "Scadenza password", + "DESCRIPTION": "Puoi impostare una policy per la scadenza delle password. Questa policy obbligherà l'utente a cambiare la password al prossimo accesso dopo la scadenza. Non ci sono avvisi e notifiche automatiche." }, "PWD_LOCKOUT": { "TITLE": "Impostazioni di blocco", @@ -1699,8 +1700,8 @@ "SHOWLOCKOUTFAILURES": "mostra i fallimenti del blocco", "MAXPASSWORDATTEMPTS": "Massimo numero di tentativi di password", "MAXOTPATTEMPTS": "Massimo numero di tentativi di OTP", - "EXPIREWARNDAYS": "Avviso scadenza dopo il giorno", - "MAXAGEDAYS": "Lunghezza massima in giorni", + "EXPIREWARNDAYS": "Avviso di scadenza dopo giorni", + "MAXAGEDAYS": "Validità massima in giorni", "USERLOGINMUSTBEDOMAIN": "Nome utente deve contenere il dominio dell' organizzazione", "USERLOGINMUSTBEDOMAIN_DESCRIPTION": "Se abiliti questa impostazione, a tutti i nomi di accesso verrà aggiunto il suffisso del dominio dell'organizzazione. Se questa impostazione è disabilitata, devi assicurarti che i nomi utente siano univoci per tutte le organizzazioni.", "VALIDATEORGDOMAINS": "Verifica del dominio dell'organizzazione richiesta (challenge DNS o HTTP)", diff --git a/console/src/assets/i18n/ja.json b/console/src/assets/i18n/ja.json index d435a53372..bd31dff6ee 100644 --- a/console/src/assets/i18n/ja.json +++ b/console/src/assets/i18n/ja.json @@ -1326,6 +1326,7 @@ "LANGUAGES": "一般設定", "LOGIN": "ログイン動作とセキュリティ", "LOCKOUT": "ロックアウト", + "AGE": "パスワードの有効期限", "COMPLEXITY": "パスワードの複雑さ", "NOTIFICATIONS": "通知設定", "SMTP_PROVIDER": "SMTPプロバイダー", @@ -1542,8 +1543,8 @@ } }, "PWD_AGE": { - "TITLE": "パスワードエージング", - "DESCRIPTION": "パスワードエージングに関するポリシーを設定できます。このポリシーは、特定のエージング時間が経過した後に警告を発します。" + "TITLE": "パスワードの有効期限", + "DESCRIPTION": "パスワードの有効期限ポリシーを設定できます。 このポリシーにより、有効期限が切れた後にユーザーは次回のログイン時にパスワードを変更することを求められます。 自動的な警告や通知はない。" }, "PWD_LOCKOUT": { "TITLE": "ロックアウトポリシー", @@ -1696,8 +1697,8 @@ "SHOWLOCKOUTFAILURES": "ロックアウトの失敗を表示する", "MAXPASSWORDATTEMPTS": "パスワードの最大試行", "MAXOTPATTEMPTS": "最大OTP試行回数", - "EXPIREWARNDAYS": "有効期限の翌日以降の警告", - "MAXAGEDAYS": "最大有効期限", + "EXPIREWARNDAYS": "数日後に有効期限が切れます", + "MAXAGEDAYS": "最大有効期限 (日数)", "USERLOGINMUSTBEDOMAIN": "ログイン名の接尾辞として組織ドメインを追加する", "USERLOGINMUSTBEDOMAIN_DESCRIPTION": "この設定を有効にすると、すべてのログイン名が組織ドメインで接尾辞が付けられます。この設定が無効になっている場合、ユーザー名がすべての組織で一意であることを確認する必要があります。", "VALIDATEORGDOMAINS": "組織のドメイン検証が必要です (DNSまたはHTTPチャレンジ)", diff --git a/console/src/assets/i18n/mk.json b/console/src/assets/i18n/mk.json index d337590bce..868437796b 100644 --- a/console/src/assets/i18n/mk.json +++ b/console/src/assets/i18n/mk.json @@ -1327,6 +1327,7 @@ "LANGUAGES": "Општо", "LOGIN": "Правила и безбедност при најава", "LOCKOUT": "Забрана на пристап", + "AGE": "Истекување на лозинката", "COMPLEXITY": "Сложеност на лозинката", "NOTIFICATIONS": "Подесувања за известувања", "SMTP_PROVIDER": "SMTP провајдер", @@ -1547,8 +1548,8 @@ } }, "PWD_AGE": { - "TITLE": "Важност на лозинка", - "DESCRIPTION": "Можете да поставите политика за истекување на лозинките. Оваа политика издава предупредување откако ќе помени одреденото време на истекување." + "TITLE": "Истекување на лозинката", + "DESCRIPTION": "Можете да поставите политика за истекување на лозинките. Оваа политика ќе го принуди корисникот да ја смени лозинката при следлогото влегување по истекувањето. Нема автоматски предупредувања и известувања." }, "PWD_LOCKOUT": { "TITLE": "Политика за забрана на пристап", @@ -1701,8 +1702,8 @@ "SHOWLOCKOUTFAILURES": "прикажи неуспешни заклучувања", "MAXPASSWORDATTEMPTS": "Максимален број на обиди за лозинка", "MAXOTPATTEMPTS": "Максимални обиди за OTP", - "EXPIREWARNDAYS": "Предупредување за истекување по ден", - "MAXAGEDAYS": "Максимална возраст во денови", + "EXPIREWARNDAYS": "Предупредување за истекување по денови", + "MAXAGEDAYS": "Максимална валидност во денови", "USERLOGINMUSTBEDOMAIN": "Додади организациски домен како суфикс на корисничките имиња", "USERLOGINMUSTBEDOMAIN_DESCRIPTION": "Ако го овозможите ова подесување, сите кориснички имиња ќе имаат суфикс на организацискиот домен. Доколку ова подесување е оневозможено, морате да се осигурате дека корисничките имиња се уникатни низ сите организации.", "VALIDATEORGDOMAINS": "Потврда на доменот на организацијата е неопходна (DNS или HTTP предизвик)", diff --git a/console/src/assets/i18n/nl.json b/console/src/assets/i18n/nl.json index 8937aa236f..b6feca01b3 100644 --- a/console/src/assets/i18n/nl.json +++ b/console/src/assets/i18n/nl.json @@ -1326,6 +1326,7 @@ "LANGUAGES": "Talen", "LOGIN": "Login Gedrag en Beveiliging", "LOCKOUT": "Lockout", + "AGE": "Wachtwoord verloopt", "COMPLEXITY": "Wachtwoord complexiteit", "NOTIFICATIONS": "Notificaties", "SMTP_PROVIDER": "SMTP Provider", @@ -1546,8 +1547,8 @@ } }, "PWD_AGE": { - "TITLE": "Wachtwoord Veroudering", - "DESCRIPTION": "U kunt een beleid instellen voor de veroudering van wachtwoorden. Dit beleid geeft een waarschuwing nadat de specifieke verouderingstijd is verstreken." + "TITLE": "Wachtwoord verloopt", + "DESCRIPTION": "U kunt een beleid instellen voor het verlopen van wachtwoorden. Dit beleid dwingt de gebruiker om het wachtwoord te wijzigen bij de volgende aanmelding na het verlopen. Er zijn geen automatische waarschuwingen en meldingen." }, "PWD_LOCKOUT": { "TITLE": "Lockout Beleid", @@ -1700,8 +1701,8 @@ "SHOWLOCKOUTFAILURES": "toon lockout mislukkingen", "MAXPASSWORDATTEMPTS": "Maximum pogingen voor wachtwoord", "MAXOTPATTEMPTS": "Maximale OTP-pogingen", - "EXPIREWARNDAYS": "Vervaldatum Waarschuwing na dag", - "MAXAGEDAYS": "Maximale Leeftijd in dagen", + "EXPIREWARNDAYS": "Waarschuwing voor verlopen na dagen", + "MAXAGEDAYS": "Maximale geldigheid in dagen", "USERLOGINMUSTBEDOMAIN": "Voeg organisatie domein toe als achtervoegsel aan inlognamen", "USERLOGINMUSTBEDOMAIN_DESCRIPTION": "Als u deze instelling inschakelt, worden alle inlognamen voorzien van een achtervoegsel met het domein van de organisatie. Als deze instelling is uitgeschakeld, moet u ervoor zorgen dat gebruikersnamen uniek zijn over alle organisaties.", "VALIDATEORGDOMAINS": "Verificatie van organisatiedomeinen vereist (DNS of HTTP-uitdaging)", diff --git a/console/src/assets/i18n/pl.json b/console/src/assets/i18n/pl.json index db0ed46d66..d630c791f0 100644 --- a/console/src/assets/i18n/pl.json +++ b/console/src/assets/i18n/pl.json @@ -1325,6 +1325,7 @@ "LANGUAGES": "Języki", "LOGIN": "Zachowanie logowania i bezpieczeństwo", "LOCKOUT": "Blokada", + "AGE": "Wygaśnięcie hasła", "COMPLEXITY": "Złożoność hasła", "NOTIFICATIONS": "Ustawienia powiadomień", "SMTP_PROVIDER": "Dostawca SMTP", @@ -1545,8 +1546,8 @@ } }, "PWD_AGE": { - "TITLE": "Starzenie się hasła", - "DESCRIPTION": "Możesz ustawić politykę dotyczącą starzenia się haseł. Ta polityka emituje ostrzeżenie po upływie określonego czasu starzenia." + "TITLE": "Wygaśnięcie hasła", + "DESCRIPTION": "Możesz ustawić zasady wygasania haseł. Ta zasada zmusi użytkownika do zmiany hasła przy następnym logowaniu po jego wygaśnięciu. Nie ma automatycznych ostrzeżeń i powiadomień." }, "PWD_LOCKOUT": { "TITLE": "Polityka blokowania", @@ -1699,8 +1700,8 @@ "SHOWLOCKOUTFAILURES": "pokaż blokady nieudanych prób", "MAXPASSWORDATTEMPTS": "Maksymalna liczba prób wprowadzenia hasła", "MAXOTPATTEMPTS": "Maksymalna liczba prób OTP", - "EXPIREWARNDAYS": "Ostrzeżenie o wygaśnięciu po dniu", - "MAXAGEDAYS": "Maksymalny wiek w dniach", + "EXPIREWARNDAYS": "Ostrzeżenie o wygaśnięciu po dniach", + "MAXAGEDAYS": "Maksymalna ważność w dniach", "USERLOGINMUSTBEDOMAIN": "Dodaj domenę organizacji jako przyrostek do nazw logowania", "USERLOGINMUSTBEDOMAIN_DESCRIPTION": "Jeśli włączysz to ustawienie, wszystkie nazwy logowania będą miały przyrostek z domeną organizacji. Jeśli to ustawienie jest wyłączone, musisz zapewnić unikalność nazw użytkowników we wszystkich organizacjach.", "VALIDATEORGDOMAINS": "Weryfikacja domeny organizacji jest wymagana (wyzwanie DNS lub HTTP)", diff --git a/console/src/assets/i18n/pt.json b/console/src/assets/i18n/pt.json index 744f6008b0..afbb02d83d 100644 --- a/console/src/assets/i18n/pt.json +++ b/console/src/assets/i18n/pt.json @@ -1327,6 +1327,7 @@ "LANGUAGES": "Idiomas", "LOGIN": "Comportamento de Login e Segurança", "LOCKOUT": "Bloqueio", + "AGE": "Expiração da senha", "COMPLEXITY": "Complexidade de Senha", "NOTIFICATIONS": "Configurações de Notificação", "SMTP_PROVIDER": "Provedor SMTP", @@ -1547,8 +1548,8 @@ } }, "PWD_AGE": { - "TITLE": "Envelhecimento de senha", - "DESCRIPTION": "Você pode definir uma política para o envelhecimento de senhas. Essa política emite um aviso após o tempo de envelhecimento específico ter passado." + "TITLE": "Expiração da senha", + "DESCRIPTION": "Você pode definir uma política para a expiração de senhas. Esta política forçará o usuário a alterar a senha no próximo login após a expiração. Não existem avisos e notificações automáticas." }, "PWD_LOCKOUT": { "TITLE": "Política de bloqueio", @@ -1702,7 +1703,7 @@ "MAXPASSWORDATTEMPTS": "Máximo de tentativas de senha", "MAXOTPATTEMPTS": "Máximo de tentativas de OTP", "EXPIREWARNDAYS": "Aviso de expiração após dias", - "MAXAGEDAYS": "Idade máxima em dias", + "MAXAGEDAYS": "Validade máxima em dias", "USERLOGINMUSTBEDOMAIN": "Adicionar domínio da organização como sufixo aos nomes de login", "USERLOGINMUSTBEDOMAIN_DESCRIPTION": "Se você habilitar essa configuração, todos os nomes de login serão sufixados com o domínio da organização. Se essa configuração estiver desabilitada, você deve garantir que os nomes de usuário sejam exclusivos em todas as organizações.", "VALIDATEORGDOMAINS": "Verificação de domínio da organização necessária (desafio DNS ou HTTP)", diff --git a/console/src/assets/i18n/ru.json b/console/src/assets/i18n/ru.json index 4e7a7b3e23..50e0562967 100644 --- a/console/src/assets/i18n/ru.json +++ b/console/src/assets/i18n/ru.json @@ -1373,6 +1373,7 @@ "LANGUAGES": "Языки", "LOGIN": "Действия при входе и безопасность", "LOCKOUT": "Блокировка", + "AGE": "Срок действия пароля", "COMPLEXITY": "Сложность пароля", "NOTIFICATIONS": "Настройки уведомлений", "NOTIFICATIONS_DESC": "Настройки SMTP и SMS", @@ -1596,7 +1597,7 @@ }, "PWD_AGE": { "TITLE": "Срок действия пароля", - "DESCRIPTION": "Вы можете установить политику срока действия паролей. Данная политика предупреждает об истечении определённого времени срока действия." + "DESCRIPTION": "Вы можете установить политику истечения срока действия паролей. Эта политика вынудит пользователя изменить пароль при следующем входе в систему после истечения срока его действия. Нет никаких автоматических предупреждений и уведомлений." }, "PWD_LOCKOUT": { "TITLE": "Политика блокировки", @@ -1767,8 +1768,8 @@ "SHOWLOCKOUTFAILURES": "Показать ошибки блокировки", "MAXPASSWORDATTEMPTS": "Максимальное количество попыток пароля", "MAXOTPATTEMPTS": "Максимальное количество попыток OTP", - "EXPIREWARNDAYS": "Предупреждение об истечении срока действия после дня", - "MAXAGEDAYS": "Максимальный возраст в днях", + "EXPIREWARNDAYS": "Предупреждение об истечении срока действия через несколько дней", + "MAXAGEDAYS": "Максимальная продолжительность действия (дни)", "USERLOGINMUSTBEDOMAIN": "Добавить домен организации в качестве суффикса к именам логина", "USERLOGINMUSTBEDOMAIN_DESCRIPTION": "Если вы включите данный параметр, все имена входа будут иметь суффикс домена организации. Если данный параметр отключен, вы должны убедиться, что имена пользователей уникальны для всех организаций.", "VALIDATEORGDOMAINS": "Проверка доменов организации", diff --git a/console/src/assets/i18n/sv.json b/console/src/assets/i18n/sv.json index 5c57447b03..c7a947b690 100644 --- a/console/src/assets/i18n/sv.json +++ b/console/src/assets/i18n/sv.json @@ -1326,6 +1326,7 @@ "LANGUAGES": "Språk", "LOGIN": "Inloggningsbeteende och säkerhet", "LOCKOUT": "Låsning", + "AGE": "Lösenordets utgång", "COMPLEXITY": "Lösenordskomplexitet", "NOTIFICATIONS": "Meddelanden", "SMTP_PROVIDER": "SMTP-leverantör", @@ -1546,8 +1547,8 @@ } }, "PWD_AGE": { - "TITLE": "Lösenordsåldrande", - "DESCRIPTION": "Du kan ställa in en policy för lösenordsåldrande. Denna policy avger en varning efter den specifika åldringstiden har passerat." + "TITLE": "Lösenordets utgång", + "DESCRIPTION": "Du kan ställa in en policy för utgångsdatum för lösenord. Den här policyn tvingar användaren att byta lösenord vid nästa inloggning efter att lösenordet har löpt ut. Det finns inga automatiska varningar eller meddelanden." }, "PWD_LOCKOUT": { "TITLE": "Låsning av lösenordspolicy", @@ -1700,8 +1701,8 @@ "SHOWLOCKOUTFAILURES": "visa låsning misslyckanden", "MAXPASSWORDATTEMPTS": "Maximalt antal lösenordsförsök", "MAXOTPATTEMPTS": "Maximalt antal OTP-försök", - "EXPIREWARNDAYS": "Utgångsvarning efter dag", - "MAXAGEDAYS": "Max ålder i dagar", + "EXPIREWARNDAYS": "Utgångsvarning efter dagar", + "MAXAGEDAYS": "Maximal giltighetstid i dagar", "USERLOGINMUSTBEDOMAIN": "Lägg till organisationsdomän som suffix till inloggningsnamn", "USERLOGINMUSTBEDOMAIN_DESCRIPTION": "Om du aktiverar denna inställning kommer alla inloggningsnamn att ha organisationsdomänen som suffix. Om denna inställning är inaktiverad måste du säkerställa att användarnamn är unika över alla organisationer.", "VALIDATEORGDOMAINS": "Organisationsdomänverifiering krävs (DNS eller HTTP-utmaning)", diff --git a/console/src/assets/i18n/zh.json b/console/src/assets/i18n/zh.json index 7a40fd8fba..82d7f0c541 100644 --- a/console/src/assets/i18n/zh.json +++ b/console/src/assets/i18n/zh.json @@ -1325,6 +1325,7 @@ "LANGUAGES": "语言", "LOGIN": "登录行为和安全", "LOCKOUT": "安全锁策略", + "AGE": "密码过期", "COMPLEXITY": "密码复杂性", "NOTIFICATIONS": "通知设置", "SMTP_PROVIDER": "SMTP 提供商", @@ -1545,7 +1546,7 @@ }, "PWD_AGE": { "TITLE": "密码过期", - "DESCRIPTION": "您可以设置密码过期策略。此策略会在特定过期时间过后发出警告。" + "DESCRIPTION": "您可以设置密码过期策略。此策略将强制用户在密码过期后下次登录时更改密码。没有自动警告和通知。" }, "PWD_LOCKOUT": { "TITLE": "锁定策略", @@ -1698,8 +1699,8 @@ "SHOWLOCKOUTFAILURES": "显示锁定失败", "MAXPASSWORDATTEMPTS": "密码最大尝试次数", "MAXOTPATTEMPTS": "最多尝试 OTP 次数", - "EXPIREWARNDAYS": "密码过期警告", - "MAXAGEDAYS": "Max Age in days", + "EXPIREWARNDAYS": "密码将在几天后过期", + "MAXAGEDAYS": "最大有效期 (天)", "USERLOGINMUSTBEDOMAIN": "用户名必须包含组织域名", "USERLOGINMUSTBEDOMAIN_DESCRIPTION": "如果启用此设置,所有登录名都将以组织域为后缀。如果禁用此设置,您必须确保用户名在所有组织中都是唯一的。", "VALIDATEORGDOMAINS": "组织域名验证需要 (DNS 或 HTTP 挑战)", diff --git a/internal/api/grpc/settings/v2/settings.go b/internal/api/grpc/settings/v2/settings.go index 11f41f26b6..9b6546645a 100644 --- a/internal/api/grpc/settings/v2/settings.go +++ b/internal/api/grpc/settings/v2/settings.go @@ -35,7 +35,22 @@ func (s *Server) GetPasswordComplexitySettings(ctx context.Context, req *setting return nil, err } return &settings.GetPasswordComplexitySettingsResponse{ - Settings: passwordSettingsToPb(current), + Settings: passwordComplexitySettingsToPb(current), + Details: &object_pb.Details{ + Sequence: current.Sequence, + ChangeDate: timestamppb.New(current.ChangeDate), + ResourceOwner: current.ResourceOwner, + }, + }, nil +} + +func (s *Server) GetPasswordExpirySettings(ctx context.Context, req *settings.GetPasswordExpirySettingsRequest) (*settings.GetPasswordExpirySettingsResponse, error) { + current, err := s.query.PasswordAgePolicyByOrg(ctx, true, object.ResourceOwnerFromReq(ctx, req.GetCtx()), false) + if err != nil { + return nil, err + } + return &settings.GetPasswordExpirySettingsResponse{ + Settings: passwordExpirySettingsToPb(current), Details: &object_pb.Details{ Sequence: current.Sequence, ChangeDate: timestamppb.New(current.ChangeDate), diff --git a/internal/api/grpc/settings/v2/settings_converter.go b/internal/api/grpc/settings/v2/settings_converter.go index 78c440012a..05e01bfecf 100644 --- a/internal/api/grpc/settings/v2/settings_converter.go +++ b/internal/api/grpc/settings/v2/settings_converter.go @@ -91,7 +91,7 @@ func multiFactorTypeToPb(typ domain.MultiFactorType) settings.MultiFactorType { } } -func passwordSettingsToPb(current *query.PasswordComplexityPolicy) *settings.PasswordComplexitySettings { +func passwordComplexitySettingsToPb(current *query.PasswordComplexityPolicy) *settings.PasswordComplexitySettings { return &settings.PasswordComplexitySettings{ MinLength: current.MinLength, RequiresUppercase: current.HasUppercase, @@ -102,6 +102,14 @@ func passwordSettingsToPb(current *query.PasswordComplexityPolicy) *settings.Pas } } +func passwordExpirySettingsToPb(current *query.PasswordAgePolicy) *settings.PasswordExpirySettings { + return &settings.PasswordExpirySettings{ + MaxAgeDays: current.MaxAgeDays, + ExpireWarnDays: current.ExpireWarnDays, + ResourceOwnerType: isDefaultToResourceOwnerTypePb(current.IsDefault), + } +} + func brandingSettingsToPb(current *query.LabelPolicy, assetPrefix string) *settings.BrandingSettings { return &settings.BrandingSettings{ LightTheme: themeToPb(current.Light, assetPrefix, current.ResourceOwner), diff --git a/internal/api/grpc/settings/v2/settings_converter_test.go b/internal/api/grpc/settings/v2/settings_converter_test.go index 078483042a..f8a99e5df6 100644 --- a/internal/api/grpc/settings/v2/settings_converter_test.go +++ b/internal/api/grpc/settings/v2/settings_converter_test.go @@ -213,7 +213,7 @@ func Test_multiFactorTypeToPb(t *testing.T) { } } -func Test_passwordSettingsToPb(t *testing.T) { +func Test_passwordComplexitySettingsToPb(t *testing.T) { arg := &query.PasswordComplexityPolicy{ MinLength: 12, HasUppercase: true, @@ -231,10 +231,29 @@ func Test_passwordSettingsToPb(t *testing.T) { ResourceOwnerType: settings.ResourceOwnerType_RESOURCE_OWNER_TYPE_INSTANCE, } - got := passwordSettingsToPb(arg) + got := passwordComplexitySettingsToPb(arg) grpc.AllFieldsSet(t, got.ProtoReflect(), ignoreTypes...) if !proto.Equal(got, want) { - t.Errorf("passwordSettingsToPb() =\n%v\nwant\n%v", got, want) + t.Errorf("passwordComplexitySettingsToPb() =\n%v\nwant\n%v", got, want) + } +} + +func Test_passwordExpirySettingsToPb(t *testing.T) { + arg := &query.PasswordAgePolicy{ + ExpireWarnDays: 80, + MaxAgeDays: 90, + IsDefault: true, + } + want := &settings.PasswordExpirySettings{ + ExpireWarnDays: 80, + MaxAgeDays: 90, + ResourceOwnerType: settings.ResourceOwnerType_RESOURCE_OWNER_TYPE_INSTANCE, + } + + got := passwordExpirySettingsToPb(arg) + grpc.AllFieldsSet(t, got.ProtoReflect(), ignoreTypes...) + if !proto.Equal(got, want) { + t.Errorf("passwordExpirySettingsToPb() =\n%v\nwant\n%v", got, want) } } diff --git a/internal/api/grpc/text/custom_text.go b/internal/api/grpc/text/custom_text.go index 52c9c4af02..82e77cbbcc 100644 --- a/internal/api/grpc/text/custom_text.go +++ b/internal/api/grpc/text/custom_text.go @@ -316,6 +316,7 @@ func PasswordChangeScreenTextToPb(text domain.PasswordChangeScreenText) *text_pb return &text_pb.PasswordChangeScreenText{ Title: text.Title, Description: text.Description, + ExpiredDescription: text.ExpiredDescription, OldPasswordLabel: text.OldPasswordLabel, NewPasswordLabel: text.NewPasswordLabel, NewPasswordConfirmLabel: text.NewPasswordConfirmLabel, @@ -784,6 +785,7 @@ func PasswordChangeScreenTextPbToDomain(text *text_pb.PasswordChangeScreenText) return domain.PasswordChangeScreenText{ Title: text.Title, Description: text.Description, + ExpiredDescription: text.ExpiredDescription, OldPasswordLabel: text.OldPasswordLabel, NewPasswordLabel: text.NewPasswordLabel, NewPasswordConfirmLabel: text.NewPasswordConfirmLabel, diff --git a/internal/api/grpc/user/converter.go b/internal/api/grpc/user/converter.go index 50c47faaa9..621d445672 100644 --- a/internal/api/grpc/user/converter.go +++ b/internal/api/grpc/user/converter.go @@ -1,6 +1,8 @@ package user import ( + "google.golang.org/protobuf/types/known/timestamppb" + "github.com/zitadel/zitadel/internal/api/grpc/object" "github.com/zitadel/zitadel/internal/domain" "github.com/zitadel/zitadel/internal/eventstore/v1/models" @@ -48,6 +50,10 @@ func UserTypeToPb(user *query.User, assetPrefix string) user_pb.UserType { } func HumanToPb(view *query.Human, assetPrefix, owner string) *user_pb.Human { + var passwordChanged *timestamppb.Timestamp + if !view.PasswordChanged.IsZero() { + passwordChanged = timestamppb.New(view.PasswordChanged) + } return &user_pb.Human{ Profile: &user_pb.Profile{ FirstName: view.FirstName, @@ -66,6 +72,7 @@ func HumanToPb(view *query.Human, assetPrefix, owner string) *user_pb.Human { Phone: string(view.Phone), IsPhoneVerified: view.IsPhoneVerified, }, + PasswordChanged: passwordChanged, } } diff --git a/internal/api/grpc/user/v2/query.go b/internal/api/grpc/user/v2/query.go index aac070cede..5ccaea84b0 100644 --- a/internal/api/grpc/user/v2/query.go +++ b/internal/api/grpc/user/v2/query.go @@ -4,6 +4,7 @@ import ( "context" "github.com/muhlemmer/gu" + "google.golang.org/protobuf/types/known/timestamppb" "github.com/zitadel/zitadel/internal/api/authz" "github.com/zitadel/zitadel/internal/api/grpc/object/v2" @@ -83,6 +84,10 @@ func userTypeToPb(userQ *query.User, assetPrefix string) user.UserType { } func humanToPb(userQ *query.Human, assetPrefix, owner string) *user.HumanUser { + var passwordChanged *timestamppb.Timestamp + if !userQ.PasswordChanged.IsZero() { + passwordChanged = timestamppb.New(userQ.PasswordChanged) + } return &user.HumanUser{ Profile: &user.HumanProfile{ GivenName: userQ.FirstName, @@ -102,6 +107,7 @@ func humanToPb(userQ *query.Human, assetPrefix, owner string) *user.HumanUser { IsVerified: userQ.IsPhoneVerified, }, PasswordChangeRequired: userQ.PasswordChangeRequired, + PasswordChanged: passwordChanged, } } diff --git a/internal/api/grpc/user/v2/query_integration_test.go b/internal/api/grpc/user/v2/query_integration_test.go index 5d14249926..9b5c74e42c 100644 --- a/internal/api/grpc/user/v2/query_integration_test.go +++ b/internal/api/grpc/user/v2/query_integration_test.go @@ -23,7 +23,7 @@ func TestServer_GetUserByID(t *testing.T) { type args struct { ctx context.Context req *user.GetUserByIDRequest - dep func(ctx context.Context, username string, request *user.GetUserByIDRequest) error + dep func(ctx context.Context, username string, request *user.GetUserByIDRequest) (*timestamppb.Timestamp, error) } tests := []struct { name string @@ -38,8 +38,8 @@ func TestServer_GetUserByID(t *testing.T) { &user.GetUserByIDRequest{ UserId: "", }, - func(ctx context.Context, username string, request *user.GetUserByIDRequest) error { - return nil + func(ctx context.Context, username string, request *user.GetUserByIDRequest) (*timestamppb.Timestamp, error) { + return nil, nil }, }, wantErr: true, @@ -51,8 +51,8 @@ func TestServer_GetUserByID(t *testing.T) { &user.GetUserByIDRequest{ UserId: "unknown", }, - func(ctx context.Context, username string, request *user.GetUserByIDRequest) error { - return nil + func(ctx context.Context, username string, request *user.GetUserByIDRequest) (*timestamppb.Timestamp, error) { + return nil, nil }, }, wantErr: true, @@ -62,10 +62,10 @@ func TestServer_GetUserByID(t *testing.T) { args: args{ IamCTX, &user.GetUserByIDRequest{}, - func(ctx context.Context, username string, request *user.GetUserByIDRequest) error { + func(ctx context.Context, username string, request *user.GetUserByIDRequest) (*timestamppb.Timestamp, error) { resp := Tester.CreateHumanUserVerified(ctx, orgResp.OrganizationId, username) request.UserId = resp.GetUserId() - return nil + return nil, nil }, }, want: &user.GetUserByIDResponse{ @@ -106,11 +106,11 @@ func TestServer_GetUserByID(t *testing.T) { args: args{ IamCTX, &user.GetUserByIDRequest{}, - func(ctx context.Context, username string, request *user.GetUserByIDRequest) error { + func(ctx context.Context, username string, request *user.GetUserByIDRequest) (*timestamppb.Timestamp, error) { resp := Tester.CreateHumanUserVerified(ctx, orgResp.OrganizationId, username) request.UserId = resp.GetUserId() - Tester.SetUserPassword(ctx, resp.GetUserId(), integration.UserPassword, true) - return nil + changed := Tester.SetUserPassword(ctx, resp.GetUserId(), integration.UserPassword, true) + return changed, nil }, }, want: &user.GetUserByIDResponse{ @@ -138,6 +138,7 @@ func TestServer_GetUserByID(t *testing.T) { IsVerified: true, }, PasswordChangeRequired: true, + PasswordChanged: timestamppb.Now(), }, }, }, @@ -151,7 +152,7 @@ func TestServer_GetUserByID(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { username := fmt.Sprintf("%d@mouse.com", time.Now().UnixNano()) - err := tt.args.dep(tt.args.ctx, username, tt.args.req) + changed, err := tt.args.dep(tt.args.ctx, username, tt.args.req) require.NoError(t, err) retryDuration := time.Minute if ctxDeadline, ok := CTX.Deadline(); ok { @@ -173,6 +174,9 @@ func TestServer_GetUserByID(t *testing.T) { tt.want.User.LoginNames = []string{username} if human := tt.want.User.GetHuman(); human != nil { human.Email.Email = username + if tt.want.User.GetHuman().GetPasswordChanged() != nil { + human.PasswordChanged = changed + } } assert.Equal(ttt, tt.want.User, got.User) integration.AssertDetails(t, tt.want, got) @@ -316,6 +320,7 @@ func TestServer_GetUserByID_Permission(t *testing.T) { type userAttr struct { UserID string Username string + Changed *timestamppb.Timestamp } func TestServer_ListUsers(t *testing.T) { @@ -369,7 +374,7 @@ func TestServer_ListUsers(t *testing.T) { for i, username := range usernames { resp := Tester.CreateHumanUserVerified(ctx, orgResp.OrganizationId, username) userIDs[i] = resp.GetUserId() - infos[i] = userAttr{resp.GetUserId(), username} + infos[i] = userAttr{resp.GetUserId(), username, nil} } request.Queries = append(request.Queries, InUserIDsQuery(userIDs)) return infos, nil @@ -423,8 +428,8 @@ func TestServer_ListUsers(t *testing.T) { for i, username := range usernames { resp := Tester.CreateHumanUserVerified(ctx, orgResp.OrganizationId, username) userIDs[i] = resp.GetUserId() - Tester.SetUserPassword(ctx, resp.GetUserId(), integration.UserPassword, true) - infos[i] = userAttr{resp.GetUserId(), username} + changed := Tester.SetUserPassword(ctx, resp.GetUserId(), integration.UserPassword, true) + infos[i] = userAttr{resp.GetUserId(), username, changed} } request.Queries = append(request.Queries, InUserIDsQuery(userIDs)) return infos, nil @@ -457,6 +462,7 @@ func TestServer_ListUsers(t *testing.T) { IsVerified: true, }, PasswordChangeRequired: true, + PasswordChanged: timestamppb.Now(), }, }, }, @@ -479,7 +485,7 @@ func TestServer_ListUsers(t *testing.T) { for i, username := range usernames { resp := Tester.CreateHumanUserVerified(ctx, orgResp.OrganizationId, username) userIDs[i] = resp.GetUserId() - infos[i] = userAttr{resp.GetUserId(), username} + infos[i] = userAttr{resp.GetUserId(), username, nil} } request.Queries = append(request.Queries, InUserIDsQuery(userIDs)) return infos, nil @@ -575,7 +581,7 @@ func TestServer_ListUsers(t *testing.T) { for i, username := range usernames { resp := Tester.CreateHumanUserVerified(ctx, orgResp.OrganizationId, username) userIDs[i] = resp.GetUserId() - infos[i] = userAttr{resp.GetUserId(), username} + infos[i] = userAttr{resp.GetUserId(), username, nil} request.Queries = append(request.Queries, UsernameQuery(username)) } return infos, nil @@ -627,7 +633,7 @@ func TestServer_ListUsers(t *testing.T) { infos := make([]userAttr, len(usernames)) for i, username := range usernames { resp := Tester.CreateHumanUserVerified(ctx, orgResp.OrganizationId, username) - infos[i] = userAttr{resp.GetUserId(), username} + infos[i] = userAttr{resp.GetUserId(), username, nil} } request.Queries = append(request.Queries, InUserEmailsQuery(usernames)) return infos, nil @@ -679,7 +685,7 @@ func TestServer_ListUsers(t *testing.T) { infos := make([]userAttr, len(usernames)) for i, username := range usernames { resp := Tester.CreateHumanUserVerified(ctx, orgResp.OrganizationId, username) - infos[i] = userAttr{resp.GetUserId(), username} + infos[i] = userAttr{resp.GetUserId(), username, nil} } request.Queries = append(request.Queries, InUserEmailsQuery(usernames)) return infos, nil @@ -794,7 +800,7 @@ func TestServer_ListUsers(t *testing.T) { infos := make([]userAttr, len(usernames)) for i, username := range usernames { resp := Tester.CreateHumanUserVerified(ctx, orgResp.OrganizationId, username) - infos[i] = userAttr{resp.GetUserId(), username} + infos[i] = userAttr{resp.GetUserId(), username, nil} } request.Queries = append(request.Queries, OrganizationIdQuery(orgResp.OrganizationId)) request.Queries = append(request.Queries, InUserEmailsQuery(usernames)) @@ -910,6 +916,9 @@ func TestServer_ListUsers(t *testing.T) { tt.want.Result[i].LoginNames = []string{infos[i].Username} if human := tt.want.Result[i].GetHuman(); human != nil { human.Email.Email = infos[i].Username + if tt.want.Result[i].GetHuman().GetPasswordChanged() != nil { + human.PasswordChanged = infos[i].Changed + } } } for i := range tt.want.Result { diff --git a/internal/api/ui/login/change_password_handler.go b/internal/api/ui/login/change_password_handler.go index 5c36d0f74f..19f2404c94 100644 --- a/internal/api/ui/login/change_password_handler.go +++ b/internal/api/ui/login/change_password_handler.go @@ -40,9 +40,19 @@ func (l *Login) renderChangePassword(w http.ResponseWriter, r *http.Request, aut errType, errMessage = l.getErrorMessage(r, err) } translator := l.getTranslator(r.Context(), authReq) + if authReq == nil || len(authReq.PossibleSteps) < 1 { + l.renderError(w, r, authReq, err) + return + } + step, ok := authReq.PossibleSteps[0].(*domain.ChangePasswordStep) + if !ok { + l.renderError(w, r, authReq, err) + return + } data := passwordData{ baseData: l.getBaseData(r, authReq, translator, "PasswordChange.Title", "PasswordChange.Description", errType, errMessage), profileData: l.getProfileData(authReq), + Expired: step.Expired, } policy := l.getPasswordComplexityPolicy(r, authReq.UserOrgID) if policy != nil { diff --git a/internal/api/ui/login/renderer.go b/internal/api/ui/login/renderer.go index e6234d9894..40339954d0 100644 --- a/internal/api/ui/login/renderer.go +++ b/internal/api/ui/login/renderer.go @@ -683,6 +683,7 @@ type passwordData struct { HasLowercase string HasNumber string HasSymbol string + Expired bool } type userSelectionData struct { diff --git a/internal/api/ui/login/static/i18n/bg.yaml b/internal/api/ui/login/static/i18n/bg.yaml index 5b600eabb2..93df99ab47 100644 --- a/internal/api/ui/login/static/i18n/bg.yaml +++ b/internal/api/ui/login/static/i18n/bg.yaml @@ -193,6 +193,7 @@ PasswordlessRegistrationDone: PasswordChange: Title: Промяна на паролата Description: 'Променете паролата си. ' + ExpiredDescription: Паролата ви е изтекла и трябва да бъде променена. Въведете старата и новата си парола. OldPasswordLabel: Стара парола NewPasswordLabel: нова парола NewPasswordConfirmLabel: Потвърждение на парола diff --git a/internal/api/ui/login/static/i18n/cs.yaml b/internal/api/ui/login/static/i18n/cs.yaml index 095bc2efae..d9f359bc1d 100644 --- a/internal/api/ui/login/static/i18n/cs.yaml +++ b/internal/api/ui/login/static/i18n/cs.yaml @@ -190,6 +190,7 @@ PasswordlessRegistrationDone: PasswordChange: Title: Změna hesla Description: Změňte si heslo. Zadejte své staré a nové heslo. + ExpiredDescription: Heslo vypršelo a musí být změněno. Zadejte své staré a nové heslo. OldPasswordLabel: Staré heslo NewPasswordLabel: Nové heslo NewPasswordConfirmLabel: Potvrzení hesla diff --git a/internal/api/ui/login/static/i18n/de.yaml b/internal/api/ui/login/static/i18n/de.yaml index fd9904bda8..e10e6bf1cf 100644 --- a/internal/api/ui/login/static/i18n/de.yaml +++ b/internal/api/ui/login/static/i18n/de.yaml @@ -190,6 +190,7 @@ PasswordlessRegistrationDone: PasswordChange: Title: Passwort ändern Description: Ändere dein Passwort indem du dein altes und dann dein neues Passwort eingibst. + ExpiredDescription: Dein Passwort ist abgelaufen und muss geändert werden. Gib dein altes und neues Passwort ein. OldPasswordLabel: Altes Passwort NewPasswordLabel: Neues Passwort NewPasswordConfirmLabel: Passwort wiederholen diff --git a/internal/api/ui/login/static/i18n/en.yaml b/internal/api/ui/login/static/i18n/en.yaml index 64b15e2985..45a3340bb6 100644 --- a/internal/api/ui/login/static/i18n/en.yaml +++ b/internal/api/ui/login/static/i18n/en.yaml @@ -190,6 +190,7 @@ PasswordlessRegistrationDone: PasswordChange: Title: Change Password Description: Change your password. Enter your old and new password. + ExpiredDescription: You password has expired and has to be changed. Enter your old and new password. OldPasswordLabel: Old Password NewPasswordLabel: New Password NewPasswordConfirmLabel: Password confirmation diff --git a/internal/api/ui/login/static/i18n/es.yaml b/internal/api/ui/login/static/i18n/es.yaml index 9463c1ef3c..5d1f444f73 100644 --- a/internal/api/ui/login/static/i18n/es.yaml +++ b/internal/api/ui/login/static/i18n/es.yaml @@ -190,6 +190,7 @@ PasswordlessRegistrationDone: PasswordChange: Title: Cambiar contraseña Description: Cambia tu contraseña. Introduce tu contraseña anterior y la nueva. + ExpiredDescription: Tu contraseña ha caducado y tiene que cambiarla. Introduzca tu contraseña anterior y la nueva. OldPasswordLabel: Contraseña anterior NewPasswordLabel: Nueva contraseña NewPasswordConfirmLabel: Confirmación de contraseña diff --git a/internal/api/ui/login/static/i18n/fr.yaml b/internal/api/ui/login/static/i18n/fr.yaml index 11a3c5baf8..6288f32cf8 100644 --- a/internal/api/ui/login/static/i18n/fr.yaml +++ b/internal/api/ui/login/static/i18n/fr.yaml @@ -190,6 +190,7 @@ PasswordlessRegistrationDone: PasswordChange: Title: Changer le mot de passe Description: Changez votre mot de passe. Entrez votre ancien et votre nouveau mot de passe. + ExpiredDescription: Votre mot de passe a expiré et doit être modifié. Entrez votre ancien et votre nouveau mot de passe. OldPasswordLabel: Ancien mot de passe NewPasswordLabel: Nouveau mot de passe NewPasswordConfirmLabel: Confirmation du mot de passe diff --git a/internal/api/ui/login/static/i18n/it.yaml b/internal/api/ui/login/static/i18n/it.yaml index dd5e47406f..2547b2a559 100644 --- a/internal/api/ui/login/static/i18n/it.yaml +++ b/internal/api/ui/login/static/i18n/it.yaml @@ -190,6 +190,7 @@ PasswordlessRegistrationDone: PasswordChange: Title: Reimposta password Description: Cambia la tua password. Inserisci la tua vecchia e la nuova password. + ExpiredDescription: La password è scaduta e deve essere modificata. Inserisci la tua vecchia e la nuova password. OldPasswordLabel: Vecchia password NewPasswordLabel: Nuova password NewPasswordConfirmLabel: Conferma della password diff --git a/internal/api/ui/login/static/i18n/ja.yaml b/internal/api/ui/login/static/i18n/ja.yaml index ce5db4e3bf..2fb5bea727 100644 --- a/internal/api/ui/login/static/i18n/ja.yaml +++ b/internal/api/ui/login/static/i18n/ja.yaml @@ -183,6 +183,7 @@ PasswordlessRegistrationDone: PasswordChange: Title: パスワードの変更 Description: 旧パスワードと新パスワードを入力し、パスワードを変更してください。 + ExpiredDescription: パスワードの有効期限が切れたため、変更する必要があります。古いパスワードと新しいパスワードを入力してください。 OldPasswordLabel: 旧パスワード NewPasswordLabel: 新パスワード NewPasswordConfirmLabel: 新パスワードの確認 diff --git a/internal/api/ui/login/static/i18n/mk.yaml b/internal/api/ui/login/static/i18n/mk.yaml index 10d094c113..cb98565127 100644 --- a/internal/api/ui/login/static/i18n/mk.yaml +++ b/internal/api/ui/login/static/i18n/mk.yaml @@ -190,6 +190,7 @@ PasswordlessRegistrationDone: PasswordChange: Title: Промена на лозинка Description: Променете ја вашата лозинка. Внесете ја старата и новата лозинка. + ExpiredDescription: Вашата лозинка е истечена и мора да се смени. Внесете ја старата и новата лозинка. OldPasswordLabel: Стара лозинка NewPasswordLabel: Нова лозинка NewPasswordConfirmLabel: Потврда на лозинка diff --git a/internal/api/ui/login/static/i18n/nl.yaml b/internal/api/ui/login/static/i18n/nl.yaml index dde35daf7e..7dac59687d 100644 --- a/internal/api/ui/login/static/i18n/nl.yaml +++ b/internal/api/ui/login/static/i18n/nl.yaml @@ -190,6 +190,7 @@ PasswordlessRegistrationDone: PasswordChange: Title: Verander Wachtwoord Description: Verander uw wachtwoord. Voer uw oude en nieuwe wachtwoord in. + ExpiredDescription: Je wachtwoord is verlopen en moet worden gewijzigd. Voer uw oude en nieuwe wachtwoord in. OldPasswordLabel: Oud Wachtwoord NewPasswordLabel: Nieuw Wachtwoord NewPasswordConfirmLabel: Bevestig Wachtwoord diff --git a/internal/api/ui/login/static/i18n/pl.yaml b/internal/api/ui/login/static/i18n/pl.yaml index fae5c1710b..5fd51bc49f 100644 --- a/internal/api/ui/login/static/i18n/pl.yaml +++ b/internal/api/ui/login/static/i18n/pl.yaml @@ -190,6 +190,7 @@ PasswordlessRegistrationDone: PasswordChange: Title: Zmiana hasła Description: Zmień swoje hasło. Wprowadź swoje stare i nowe hasło. + ExpiredDescription: Twoje hasło wygasło i musi zostać zmienione. Wprowadź swoje stare i nowe hasło. OldPasswordLabel: Stare hasło NewPasswordLabel: Nowe hasło NewPasswordConfirmLabel: Potwierdzenie hasła diff --git a/internal/api/ui/login/static/i18n/pt.yaml b/internal/api/ui/login/static/i18n/pt.yaml index 41f943b1cd..9155e82061 100644 --- a/internal/api/ui/login/static/i18n/pt.yaml +++ b/internal/api/ui/login/static/i18n/pt.yaml @@ -186,6 +186,7 @@ PasswordlessRegistrationDone: PasswordChange: Title: Alterar senha Description: Altere sua senha. Insira sua senha antiga e nova. + ExpiredDescription: A sua palavra-passe expirou e tem de ser alterada. Insira sua senha antiga e nova. OldPasswordLabel: Senha antiga NewPasswordLabel: Nova senha NewPasswordConfirmLabel: Confirmação de senha diff --git a/internal/api/ui/login/static/i18n/ru.yaml b/internal/api/ui/login/static/i18n/ru.yaml index 258c5baf95..0473171b15 100644 --- a/internal/api/ui/login/static/i18n/ru.yaml +++ b/internal/api/ui/login/static/i18n/ru.yaml @@ -189,6 +189,7 @@ PasswordlessRegistrationDone: PasswordChange: Title: Изменение пароля Description: Измените ваш пароль. Введите старый и новый пароли. + ExpiredDescription: Срок действия вашего пароля истек, и его необходимо изменить. Введите старый и новый пароль. OldPasswordLabel: Старый пароль NewPasswordLabel: Новый пароль NewPasswordConfirmLabel: Подтверждение пароля diff --git a/internal/api/ui/login/static/i18n/sv.yaml b/internal/api/ui/login/static/i18n/sv.yaml index 1514be228c..f2798c8ef3 100644 --- a/internal/api/ui/login/static/i18n/sv.yaml +++ b/internal/api/ui/login/static/i18n/sv.yaml @@ -28,7 +28,7 @@ SelectAccount: SessionState1: Utloggad MustBeMemberOfOrg: Användaren måste finnas i organisationen {{.OrgName}}. -Lösenord: +Password: Title: Lösenord Description: Ange dina användaruppgifter. PasswordLabel: Lösenord @@ -190,6 +190,7 @@ PasswordlessRegistrationDone: PasswordChange: Title: Ändra lösenord Description: Ändra diit lösenord. Ange både ditt gamla och det nya lösenordet. + ExpiredDescription: Ditt lösenord har gått ut och måste bytas ut. Ange ditt gamla och nya lösenord. OldPasswordLabel: Gammalt lösenord NewPasswordLabel: Nytt lösenord NewPasswordConfirmLabel: Nytt lösenord igen diff --git a/internal/api/ui/login/static/i18n/zh.yaml b/internal/api/ui/login/static/i18n/zh.yaml index 325af2789e..c49d4ed735 100644 --- a/internal/api/ui/login/static/i18n/zh.yaml +++ b/internal/api/ui/login/static/i18n/zh.yaml @@ -190,6 +190,7 @@ PasswordlessRegistrationDone: PasswordChange: Title: 更改密码 Description: 更改您的密码。输入您的旧密码和新密码。 + ExpiredDescription: 您的密码已过期,需要更改。请输入您的新旧密码。 OldPasswordLabel: 旧密码 NewPasswordLabel: 新密码 NewPasswordConfirmLabel: 确认密码 diff --git a/internal/api/ui/login/static/templates/change_password.html b/internal/api/ui/login/static/templates/change_password.html index 506c107783..74fa26e7ba 100644 --- a/internal/api/ui/login/static/templates/change_password.html +++ b/internal/api/ui/login/static/templates/change_password.html @@ -4,7 +4,11 @@

{{t "PasswordChange.Title"}}

{{ template "user-profile" . }} + {{if .Expired}} +

{{t "PasswordChange.ExpiredDescription"}}

+ {{else}}

{{t "PasswordChange.Description"}}

+ {{end}}
diff --git a/internal/auth/repository/eventsourcing/eventstore/auth_request.go b/internal/auth/repository/eventsourcing/eventstore/auth_request.go index e695d83511..79d986dc5e 100644 --- a/internal/auth/repository/eventsourcing/eventstore/auth_request.go +++ b/internal/auth/repository/eventsourcing/eventstore/auth_request.go @@ -44,6 +44,7 @@ type AuthRequestRepo struct { OrgViewProvider orgViewProvider LoginPolicyViewProvider loginPolicyViewProvider LockoutPolicyViewProvider lockoutPolicyViewProvider + PasswordAgePolicyProvider passwordAgePolicyProvider PrivacyPolicyProvider privacyPolicyProvider IDPProviderViewProvider idpProviderViewProvider IDPUserLinksProvider idpUserLinksProvider @@ -81,6 +82,10 @@ type lockoutPolicyViewProvider interface { LockoutPolicyByOrg(context.Context, bool, string) (*query.LockoutPolicy, error) } +type passwordAgePolicyProvider interface { + PasswordAgePolicyByOrg(context.Context, bool, string, bool) (*query.PasswordAgePolicy, error) +} + type idpProviderViewProvider interface { IDPLoginPolicyLinks(context.Context, string, *query.IDPLoginPolicyLinksSearchQuery, bool) (*query.IDPLoginPolicyLinks, error) } @@ -685,6 +690,13 @@ func (repo *AuthRequestRepo) fillPolicies(ctx context.Context, request *domain.A } request.LabelPolicy = labelPolicy } + if request.PasswordAgePolicy == nil || request.PolicyOrgID() != orgID { + passwordPolicy, err := repo.getPasswordAgePolicy(ctx, orgID) + if err != nil { + return err + } + request.PasswordAgePolicy = passwordPolicy + } if len(request.DefaultTranslations) == 0 { defaultLoginTranslations, err := repo.getLoginTexts(ctx, instance.InstanceID()) if err != nil { @@ -1048,8 +1060,9 @@ func (repo *AuthRequestRepo) nextSteps(ctx context.Context, request *domain.Auth return append(steps, step), nil } - if user.PasswordChangeRequired { - steps = append(steps, &domain.ChangePasswordStep{}) + expired := passwordAgeChangeRequired(request.PasswordAgePolicy, user.PasswordChanged) + if expired || user.PasswordChangeRequired { + steps = append(steps, &domain.ChangePasswordStep{Expired: expired}) } if !user.IsEmailVerified { steps = append(steps, &domain.VerifyEMailStep{}) @@ -1058,7 +1071,7 @@ func (repo *AuthRequestRepo) nextSteps(ctx context.Context, request *domain.Auth steps = append(steps, &domain.ChangeUsernameStep{}) } - if user.PasswordChangeRequired || !user.IsEmailVerified || user.UsernameChangeRequired { + if expired || user.PasswordChangeRequired || !user.IsEmailVerified || user.UsernameChangeRequired { return steps, nil } @@ -1093,6 +1106,14 @@ func (repo *AuthRequestRepo) nextSteps(ctx context.Context, request *domain.Auth return append(steps, &domain.RedirectToCallbackStep{}), nil } +func passwordAgeChangeRequired(policy *domain.PasswordAgePolicy, changed time.Time) bool { + if policy == nil || policy.MaxAgeDays == 0 { + return false + } + maxDays := time.Duration(policy.MaxAgeDays) * 24 * time.Hour + return time.Now().Add(-maxDays).After(changed) +} + func (repo *AuthRequestRepo) nextStepsUser(ctx context.Context, request *domain.AuthRequest) (_ []domain.NextStep, err error) { ctx, span := tracing.NewSpan(ctx) defer func() { span.EndWithError(err) }() @@ -1371,6 +1392,28 @@ func labelPolicyToDomain(p *query.LabelPolicy) *domain.LabelPolicy { } } +func (repo *AuthRequestRepo) getPasswordAgePolicy(ctx context.Context, orgID string) (*domain.PasswordAgePolicy, error) { + policy, err := repo.PasswordAgePolicyProvider.PasswordAgePolicyByOrg(ctx, false, orgID, false) + if err != nil { + return nil, err + } + return passwordAgePolicyToDomain(policy), nil +} + +func passwordAgePolicyToDomain(policy *query.PasswordAgePolicy) *domain.PasswordAgePolicy { + return &domain.PasswordAgePolicy{ + ObjectRoot: es_models.ObjectRoot{ + AggregateID: policy.ID, + Sequence: policy.Sequence, + ResourceOwner: policy.ResourceOwner, + CreationDate: policy.CreationDate, + ChangeDate: policy.ChangeDate, + }, + MaxAgeDays: policy.MaxAgeDays, + ExpireWarnDays: policy.ExpireWarnDays, + } +} + func (repo *AuthRequestRepo) getLoginTexts(ctx context.Context, aggregateID string) ([]*domain.CustomText, error) { loginTexts, err := repo.CustomTextProvider.CustomTextListByTemplate(ctx, aggregateID, domain.LoginCustomText, false) if err != nil { diff --git a/internal/auth/repository/eventsourcing/eventstore/auth_request_test.go b/internal/auth/repository/eventsourcing/eventstore/auth_request_test.go index 35ce216877..e64c7fed91 100644 --- a/internal/auth/repository/eventsourcing/eventstore/auth_request_test.go +++ b/internal/auth/repository/eventsourcing/eventstore/auth_request_test.go @@ -140,6 +140,7 @@ type mockViewUser struct { InitRequired bool PasswordInitRequired bool PasswordSet bool + PasswordChanged time.Time PasswordChangeRequired bool IsEmailVerified bool OTPState int32 @@ -189,6 +190,14 @@ func (m *mockLockoutPolicy) LockoutPolicyByOrg(context.Context, bool, string) (* return m.policy, nil } +type mockPasswordAgePolicy struct { + policy *query.PasswordAgePolicy +} + +func (m *mockPasswordAgePolicy) PasswordAgePolicyByOrg(context.Context, bool, string, bool) (*query.PasswordAgePolicy, error) { + return m.policy, nil +} + func (m *mockViewUser) UserByID(string, string) (*user_view_model.UserView, error) { return &user_view_model.UserView{ State: int32(user_model.UserStateActive), @@ -291,21 +300,22 @@ func (m *mockIDPUserLinks) IDPUserLinks(ctx context.Context, queries *query.IDPU func TestAuthRequestRepo_nextSteps(t *testing.T) { type fields struct { - AuthRequests cache.AuthRequestCache - View *view.View - userSessionViewProvider userSessionViewProvider - userViewProvider userViewProvider - userEventProvider userEventProvider - orgViewProvider orgViewProvider - userGrantProvider userGrantProvider - projectProvider projectProvider - applicationProvider applicationProvider - loginPolicyProvider loginPolicyViewProvider - lockoutPolicyProvider lockoutPolicyViewProvider - idpUserLinksProvider idpUserLinksProvider - privacyPolicyProvider privacyPolicyProvider - labelPolicyProvider labelPolicyProvider - customTextProvider customTextProvider + AuthRequests cache.AuthRequestCache + View *view.View + userSessionViewProvider userSessionViewProvider + userViewProvider userViewProvider + userEventProvider userEventProvider + orgViewProvider orgViewProvider + userGrantProvider userGrantProvider + projectProvider projectProvider + applicationProvider applicationProvider + loginPolicyProvider loginPolicyViewProvider + lockoutPolicyProvider lockoutPolicyViewProvider + idpUserLinksProvider idpUserLinksProvider + privacyPolicyProvider privacyPolicyProvider + labelPolicyProvider labelPolicyProvider + passwordAgePolicyProvider passwordAgePolicyProvider + customTextProvider customTextProvider } type args struct { request *domain.AuthRequest @@ -529,6 +539,9 @@ func TestAuthRequestRepo_nextSteps(t *testing.T) { labelPolicyProvider: &mockLabelPolicy{ policy: &query.LabelPolicy{}, }, + passwordAgePolicyProvider: &mockPasswordAgePolicy{ + policy: &query.PasswordAgePolicy{}, + }, customTextProvider: &mockCustomText{ texts: &query.CustomTexts{}, }, @@ -1304,6 +1317,48 @@ func TestAuthRequestRepo_nextSteps(t *testing.T) { []domain.NextStep{&domain.ChangePasswordStep{}, &domain.VerifyEMailStep{}}, nil, }, + { + "password change expired, password change step", + fields{ + userSessionViewProvider: &mockViewUserSession{ + PasswordVerification: testNow.Add(-5 * time.Minute), + SecondFactorVerification: testNow.Add(-5 * time.Minute), + }, + userViewProvider: &mockViewUser{ + PasswordSet: true, + PasswordChangeRequired: false, + PasswordChanged: testNow.Add(-50 * 24 * time.Hour), + IsEmailVerified: true, + MFAMaxSetUp: int32(domain.MFALevelSecondFactor), + }, + userEventProvider: &mockEventUser{}, + orgViewProvider: &mockViewOrg{State: domain.OrgStateActive}, + lockoutPolicyProvider: &mockLockoutPolicy{ + policy: &query.LockoutPolicy{ + ShowFailures: true, + }, + }, + passwordAgePolicyProvider: &mockPasswordAgePolicy{ + policy: &query.PasswordAgePolicy{ + MaxAgeDays: 30, + }, + }, + idpUserLinksProvider: &mockIDPUserLinks{}, + }, + args{&domain.AuthRequest{ + UserID: "UserID", + LoginPolicy: &domain.LoginPolicy{ + SecondFactors: []domain.SecondFactorType{domain.SecondFactorTypeTOTP}, + PasswordCheckLifetime: 10 * 24 * time.Hour, + SecondFactorCheckLifetime: 18 * time.Hour, + }, + PasswordAgePolicy: &domain.PasswordAgePolicy{ + MaxAgeDays: 30, + }, + }, false}, + []domain.NextStep{&domain.ChangePasswordStep{Expired: true}}, + nil, + }, { "email verified and no password change required, redirect to callback step", fields{ @@ -1662,6 +1717,7 @@ func TestAuthRequestRepo_nextSteps(t *testing.T) { IDPUserLinksProvider: tt.fields.idpUserLinksProvider, PrivacyPolicyProvider: tt.fields.privacyPolicyProvider, LabelPolicyProvider: tt.fields.labelPolicyProvider, + PasswordAgePolicyProvider: tt.fields.passwordAgePolicyProvider, CustomTextProvider: tt.fields.customTextProvider, } got, err := repo.nextSteps(context.Background(), tt.args.request, tt.args.checkLoggedIn) diff --git a/internal/auth/repository/eventsourcing/repository.go b/internal/auth/repository/eventsourcing/repository.go index 20f753863c..a9ec6aa058 100644 --- a/internal/auth/repository/eventsourcing/repository.go +++ b/internal/auth/repository/eventsourcing/repository.go @@ -73,6 +73,7 @@ func Start(ctx context.Context, conf Config, systemDefaults sd.SystemDefaults, c IDPUserLinksProvider: queries, LockoutPolicyViewProvider: queries, LoginPolicyViewProvider: queries, + PasswordAgePolicyProvider: queries, UserGrantProvider: queryView, ProjectProvider: queryView, ApplicationProvider: queries, diff --git a/internal/command/custom_login_text.go b/internal/command/custom_login_text.go index 9c22e1e298..6d4223c4ef 100644 --- a/internal/command/custom_login_text.go +++ b/internal/command/custom_login_text.go @@ -687,6 +687,10 @@ func (c *Commands) createPasswordChangeEvents(ctx context.Context, agg *eventsto if event != nil { events = append(events, event) } + event = c.createCustomLoginTextEvent(ctx, agg, domain.LoginKeyPasswordChangeExpiredDescription, existingText.PasswordChangeExpiredDescription, text.PasswordChange.ExpiredDescription, text.Language, defaultText) + if event != nil { + events = append(events, event) + } event = c.createCustomLoginTextEvent(ctx, agg, domain.LoginKeyPasswordChangeOldPasswordLabel, existingText.PasswordChangeOldPasswordLabel, text.PasswordChange.OldPasswordLabel, text.Language, defaultText) if event != nil { events = append(events, event) diff --git a/internal/command/custom_login_text_model.go b/internal/command/custom_login_text_model.go index b2147efefc..36ca04a62b 100644 --- a/internal/command/custom_login_text_model.go +++ b/internal/command/custom_login_text_model.go @@ -186,6 +186,7 @@ type CustomLoginTextReadModel struct { PasswordChangeTitle string PasswordChangeDescription string + PasswordChangeExpiredDescription string PasswordChangeOldPasswordLabel string PasswordChangeNewPasswordLabel string PasswordChangeNewPasswordConfirmLabel string @@ -1767,6 +1768,10 @@ func (wm *CustomLoginTextReadModel) handlePasswordChangeScreenSetEvent(e *policy wm.PasswordChangeDescription = e.Text return } + if e.Key == domain.LoginKeyPasswordChangeExpiredDescription { + wm.PasswordChangeExpiredDescription = e.Text + return + } if e.Key == domain.LoginKeyPasswordChangeOldPasswordLabel { wm.PasswordChangeOldPasswordLabel = e.Text return @@ -1798,6 +1803,10 @@ func (wm *CustomLoginTextReadModel) handlePasswordChangeScreenRemoveEvent(e *pol wm.PasswordChangeDescription = "" return } + if e.Key == domain.LoginKeyPasswordChangeExpiredDescription { + wm.PasswordChangeExpiredDescription = "" + return + } if e.Key == domain.LoginKeyPasswordChangeOldPasswordLabel { wm.PasswordChangeOldPasswordLabel = "" return diff --git a/internal/command/instance_custom_login_text_test.go b/internal/command/instance_custom_login_text_test.go index 57efbf43d7..aa2bf33659 100644 --- a/internal/command/instance_custom_login_text_test.go +++ b/internal/command/instance_custom_login_text_test.go @@ -480,6 +480,9 @@ func TestCommandSide_SetCustomIAMLoginText(t *testing.T) { instance.NewCustomTextSetEvent(context.Background(), &instance.NewAggregate("INSTANCE").Aggregate, domain.LoginCustomText, domain.LoginKeyPasswordChangeDescription, "Description", language.English, ), + instance.NewCustomTextSetEvent(context.Background(), + &instance.NewAggregate("INSTANCE").Aggregate, domain.LoginCustomText, domain.LoginKeyPasswordChangeExpiredDescription, "ExpiredDescription", language.English, + ), instance.NewCustomTextSetEvent(context.Background(), &instance.NewAggregate("INSTANCE").Aggregate, domain.LoginCustomText, domain.LoginKeyPasswordChangeOldPasswordLabel, "OldPasswordLabel", language.English, ), @@ -942,6 +945,7 @@ func TestCommandSide_SetCustomIAMLoginText(t *testing.T) { PasswordChange: domain.PasswordChangeScreenText{ Title: "Title", Description: "Description", + ExpiredDescription: "ExpiredDescription", OldPasswordLabel: "OldPasswordLabel", NewPasswordLabel: "NewPasswordLabel", NewPasswordConfirmLabel: "NewPasswordConfirmLabel", @@ -1860,6 +1864,12 @@ func TestCommandSide_SetCustomIAMLoginText(t *testing.T) { &instance.NewAggregate("INSTANCE").Aggregate, domain.LoginCustomText, domain.LoginKeyPasswordChangeDescription, "Description", language.English, ), ), + eventFromEventPusherWithInstanceID( + "INSTANCE", + instance.NewCustomTextSetEvent(context.Background(), + &instance.NewAggregate("INSTANCE").Aggregate, domain.LoginCustomText, domain.LoginKeyPasswordChangeExpiredDescription, "ExpiredDescription", language.English, + ), + ), eventFromEventPusherWithInstanceID( "INSTANCE", instance.NewCustomTextSetEvent(context.Background(), @@ -2813,6 +2823,9 @@ func TestCommandSide_SetCustomIAMLoginText(t *testing.T) { instance.NewCustomTextRemovedEvent(context.Background(), &instance.NewAggregate("INSTANCE").Aggregate, domain.LoginCustomText, domain.LoginKeyPasswordChangeDescription, language.English, ), + instance.NewCustomTextRemovedEvent(context.Background(), + &instance.NewAggregate("INSTANCE").Aggregate, domain.LoginCustomText, domain.LoginKeyPasswordChangeExpiredDescription, language.English, + ), instance.NewCustomTextRemovedEvent(context.Background(), &instance.NewAggregate("INSTANCE").Aggregate, domain.LoginCustomText, domain.LoginKeyPasswordChangeOldPasswordLabel, language.English, ), @@ -3934,6 +3947,12 @@ func TestCommandSide_SetCustomIAMLoginText(t *testing.T) { &instance.NewAggregate("INSTANCE").Aggregate, domain.LoginCustomText, domain.LoginKeyPasswordChangeDescription, "Description", language.English, ), ), + eventFromEventPusherWithInstanceID( + "INSTANCE", + instance.NewCustomTextSetEvent(context.Background(), + &instance.NewAggregate("INSTANCE").Aggregate, domain.LoginCustomText, domain.LoginKeyPasswordChangeExpiredDescription, "ExpiredDescription", language.English, + ), + ), eventFromEventPusherWithInstanceID( "INSTANCE", instance.NewCustomTextSetEvent(context.Background(), @@ -5279,6 +5298,12 @@ func TestCommandSide_SetCustomIAMLoginText(t *testing.T) { &instance.NewAggregate("INSTANCE").Aggregate, domain.LoginCustomText, domain.LoginKeyPasswordChangeDescription, language.English, ), ), + eventFromEventPusherWithInstanceID( + "INSTANCE", + instance.NewCustomTextRemovedEvent(context.Background(), + &instance.NewAggregate("INSTANCE").Aggregate, domain.LoginCustomText, domain.LoginKeyPasswordChangeExpiredDescription, language.English, + ), + ), eventFromEventPusherWithInstanceID( "INSTANCE", instance.NewCustomTextRemovedEvent(context.Background(), @@ -6233,6 +6258,9 @@ func TestCommandSide_SetCustomIAMLoginText(t *testing.T) { instance.NewCustomTextSetEvent(context.Background(), &instance.NewAggregate("INSTANCE").Aggregate, domain.LoginCustomText, domain.LoginKeyPasswordChangeDescription, "Description", language.English, ), + instance.NewCustomTextSetEvent(context.Background(), + &instance.NewAggregate("INSTANCE").Aggregate, domain.LoginCustomText, domain.LoginKeyPasswordChangeExpiredDescription, "ExpiredDescription", language.English, + ), instance.NewCustomTextSetEvent(context.Background(), &instance.NewAggregate("INSTANCE").Aggregate, domain.LoginCustomText, domain.LoginKeyPasswordChangeOldPasswordLabel, "OldPasswordLabel", language.English, ), @@ -6695,6 +6723,7 @@ func TestCommandSide_SetCustomIAMLoginText(t *testing.T) { PasswordChange: domain.PasswordChangeScreenText{ Title: "Title", Description: "Description", + ExpiredDescription: "ExpiredDescription", OldPasswordLabel: "OldPasswordLabel", NewPasswordLabel: "NewPasswordLabel", NewPasswordConfirmLabel: "NewPasswordConfirmLabel", diff --git a/internal/command/org_custom_login_text_test.go b/internal/command/org_custom_login_text_test.go index 81f7c308d3..dbef76c4ac 100644 --- a/internal/command/org_custom_login_text_test.go +++ b/internal/command/org_custom_login_text_test.go @@ -762,6 +762,11 @@ func TestCommandSide_SetCustomOrgLoginText(t *testing.T) { &org.NewAggregate("org1").Aggregate, domain.LoginCustomText, domain.LoginKeyPasswordChangeDescription, "Description", language.English, ), ), + eventFromEventPusher( + org.NewCustomTextSetEvent(context.Background(), + &org.NewAggregate("org1").Aggregate, domain.LoginCustomText, domain.LoginKeyPasswordChangeExpiredDescription, "ExpiredDescription", language.English, + ), + ), eventFromEventPusher( org.NewCustomTextSetEvent(context.Background(), &org.NewAggregate("org1").Aggregate, domain.LoginCustomText, domain.LoginKeyPasswordChangeOldPasswordLabel, "OldPasswordLabel", language.English, @@ -1406,6 +1411,7 @@ func TestCommandSide_SetCustomOrgLoginText(t *testing.T) { PasswordChange: domain.PasswordChangeScreenText{ Title: "Title", Description: "Description", + ExpiredDescription: "ExpiredDescription", OldPasswordLabel: "OldPasswordLabel", NewPasswordLabel: "NewPasswordLabel", NewPasswordConfirmLabel: "NewPasswordConfirmLabel", @@ -2192,6 +2198,11 @@ func TestCommandSide_SetCustomOrgLoginText(t *testing.T) { &org.NewAggregate("org1").Aggregate, domain.LoginCustomText, domain.LoginKeyPasswordChangeDescription, "Description", language.English, ), ), + eventFromEventPusher( + org.NewCustomTextSetEvent(context.Background(), + &org.NewAggregate("org1").Aggregate, domain.LoginCustomText, domain.LoginKeyPasswordChangeExpiredDescription, "ExpiredDescription", language.English, + ), + ), eventFromEventPusher( org.NewCustomTextSetEvent(context.Background(), &org.NewAggregate("org1").Aggregate, domain.LoginCustomText, domain.LoginKeyPasswordChangeOldPasswordLabel, "OldPasswordLabel", language.English, @@ -3047,6 +3058,9 @@ func TestCommandSide_SetCustomOrgLoginText(t *testing.T) { org.NewCustomTextRemovedEvent(context.Background(), &org.NewAggregate("org1").Aggregate, domain.LoginCustomText, domain.LoginKeyPasswordChangeDescription, language.English, ), + org.NewCustomTextRemovedEvent(context.Background(), + &org.NewAggregate("org1").Aggregate, domain.LoginCustomText, domain.LoginKeyPasswordChangeExpiredDescription, language.English, + ), org.NewCustomTextRemovedEvent(context.Background(), &org.NewAggregate("org1").Aggregate, domain.LoginCustomText, domain.LoginKeyPasswordChangeOldPasswordLabel, language.English, ), @@ -4035,6 +4049,11 @@ func TestCommandSide_SetCustomOrgLoginText(t *testing.T) { &org.NewAggregate("org1").Aggregate, domain.LoginCustomText, domain.LoginKeyPasswordChangeDescription, "Description", language.English, ), ), + eventFromEventPusher( + org.NewCustomTextSetEvent(context.Background(), + &org.NewAggregate("org1").Aggregate, domain.LoginCustomText, domain.LoginKeyPasswordChangeExpiredDescription, "ExpiredDescription", language.English, + ), + ), eventFromEventPusher( org.NewCustomTextSetEvent(context.Background(), &org.NewAggregate("org1").Aggregate, domain.LoginCustomText, domain.LoginKeyPasswordChangeOldPasswordLabel, "OldPasswordLabel", language.English, @@ -5150,6 +5169,11 @@ func TestCommandSide_SetCustomOrgLoginText(t *testing.T) { &org.NewAggregate("org1").Aggregate, domain.LoginCustomText, domain.LoginKeyPasswordChangeDescription, language.English, ), ), + eventFromEventPusher( + org.NewCustomTextRemovedEvent(context.Background(), + &org.NewAggregate("org1").Aggregate, domain.LoginCustomText, domain.LoginKeyPasswordChangeExpiredDescription, language.English, + ), + ), eventFromEventPusher( org.NewCustomTextRemovedEvent(context.Background(), &org.NewAggregate("org1").Aggregate, domain.LoginCustomText, domain.LoginKeyPasswordChangeOldPasswordLabel, language.English, @@ -6005,6 +6029,9 @@ func TestCommandSide_SetCustomOrgLoginText(t *testing.T) { org.NewCustomTextSetEvent(context.Background(), &org.NewAggregate("org1").Aggregate, domain.LoginCustomText, domain.LoginKeyPasswordChangeDescription, "Description", language.English, ), + org.NewCustomTextSetEvent(context.Background(), + &org.NewAggregate("org1").Aggregate, domain.LoginCustomText, domain.LoginKeyPasswordChangeExpiredDescription, "ExpiredDescription", language.English, + ), org.NewCustomTextSetEvent(context.Background(), &org.NewAggregate("org1").Aggregate, domain.LoginCustomText, domain.LoginKeyPasswordChangeOldPasswordLabel, "OldPasswordLabel", language.English, ), @@ -6465,6 +6492,7 @@ func TestCommandSide_SetCustomOrgLoginText(t *testing.T) { PasswordChange: domain.PasswordChangeScreenText{ Title: "Title", Description: "Description", + ExpiredDescription: "ExpiredDescription", OldPasswordLabel: "OldPasswordLabel", NewPasswordLabel: "NewPasswordLabel", NewPasswordConfirmLabel: "NewPasswordConfirmLabel", diff --git a/internal/domain/auth_request.go b/internal/domain/auth_request.go index 1aaf2bb63d..e302d67cbe 100644 --- a/internal/domain/auth_request.go +++ b/internal/domain/auth_request.go @@ -56,6 +56,7 @@ type AuthRequest struct { LabelPolicy *LabelPolicy PrivacyPolicy *PrivacyPolicy LockoutPolicy *LockoutPolicy + PasswordAgePolicy *PasswordAgePolicy DefaultTranslations []*CustomText OrgTranslations []*CustomText SAMLRequestID string diff --git a/internal/domain/custom_login_text.go b/internal/domain/custom_login_text.go index b8f4173b34..ac53d09b27 100644 --- a/internal/domain/custom_login_text.go +++ b/internal/domain/custom_login_text.go @@ -185,6 +185,7 @@ const ( LoginKeyPasswordChange = "PasswordChange." LoginKeyPasswordChangeTitle = LoginKeyPasswordChange + "Title" LoginKeyPasswordChangeDescription = LoginKeyPasswordChange + "Description" + LoginKeyPasswordChangeExpiredDescription = LoginKeyPasswordChange + "ExpiredDescription" LoginKeyPasswordChangeOldPasswordLabel = LoginKeyPasswordChange + "OldPasswordLabel" LoginKeyPasswordChangeNewPasswordLabel = LoginKeyPasswordChange + "NewPasswordLabel" LoginKeyPasswordChangeNewPasswordConfirmLabel = LoginKeyPasswordChange + "NewPasswordConfirmLabel" @@ -529,6 +530,7 @@ type PasswordlessScreenText struct { type PasswordChangeScreenText struct { Title string Description string + ExpiredDescription string OldPasswordLabel string NewPasswordLabel string NewPasswordConfirmLabel string diff --git a/internal/domain/next_step.go b/internal/domain/next_step.go index 0b1b5fa2a9..c871017588 100644 --- a/internal/domain/next_step.go +++ b/internal/domain/next_step.go @@ -117,7 +117,9 @@ func (s *PasswordlessRegistrationPromptStep) Type() NextStepType { return NextStepPasswordlessRegistrationPrompt } -type ChangePasswordStep struct{} +type ChangePasswordStep struct { + Expired bool +} func (s *ChangePasswordStep) Type() NextStepType { return NextStepChangePassword diff --git a/internal/integration/client.go b/internal/integration/client.go index 4b400bfb39..90f7518fea 100644 --- a/internal/integration/client.go +++ b/internal/integration/client.go @@ -17,6 +17,7 @@ import ( "google.golang.org/grpc" "google.golang.org/protobuf/types/known/durationpb" "google.golang.org/protobuf/types/known/structpb" + "google.golang.org/protobuf/types/known/timestamppb" "github.com/zitadel/zitadel/internal/api/authz" "github.com/zitadel/zitadel/internal/command" @@ -311,8 +312,8 @@ func (s *Tester) RegisterUserU2F(ctx context.Context, userID string) { logging.OnError(err).Fatal("create user u2f") } -func (s *Tester) SetUserPassword(ctx context.Context, userID, password string, changeRequired bool) { - _, err := s.Client.UserV2.SetPassword(ctx, &user.SetPasswordRequest{ +func (s *Tester) SetUserPassword(ctx context.Context, userID, password string, changeRequired bool) *timestamppb.Timestamp { + resp, err := s.Client.UserV2.SetPassword(ctx, &user.SetPasswordRequest{ UserId: userID, NewPassword: &user.Password{ Password: password, @@ -320,6 +321,7 @@ func (s *Tester) SetUserPassword(ctx context.Context, userID, password string, c }, }) logging.OnError(err).Fatal("set user password") + return resp.GetDetails().GetChangeDate() } func (s *Tester) AddGenericOAuthProvider(t *testing.T, ctx context.Context) string { diff --git a/internal/query/custom_text.go b/internal/query/custom_text.go index 5558585be1..4d766b5102 100644 --- a/internal/query/custom_text.go +++ b/internal/query/custom_text.go @@ -891,6 +891,9 @@ func passwordChangeKeyToDomain(text *CustomText, result *domain.CustomLoginText) if text.Key == domain.LoginKeyPasswordChangeDescription { result.PasswordChange.Description = text.Text } + if text.Key == domain.LoginKeyPasswordChangeExpiredDescription { + result.PasswordChange.ExpiredDescription = text.Text + } if text.Key == domain.LoginKeyPasswordChangeOldPasswordLabel { result.PasswordChange.OldPasswordLabel = text.Text } diff --git a/internal/query/iam_member_test.go b/internal/query/iam_member_test.go index 36bb476d22..2ab62d3244 100644 --- a/internal/query/iam_member_test.go +++ b/internal/query/iam_member_test.go @@ -21,21 +21,21 @@ var ( ", members.user_id" + ", members.roles" + ", projections.login_names3.login_name" + - ", projections.users12_humans.email" + - ", projections.users12_humans.first_name" + - ", projections.users12_humans.last_name" + - ", projections.users12_humans.display_name" + - ", projections.users12_machines.name" + - ", projections.users12_humans.avatar_key" + - ", projections.users12.type" + + ", projections.users13_humans.email" + + ", projections.users13_humans.first_name" + + ", projections.users13_humans.last_name" + + ", projections.users13_humans.display_name" + + ", projections.users13_machines.name" + + ", projections.users13_humans.avatar_key" + + ", projections.users13.type" + ", COUNT(*) OVER () " + "FROM projections.instance_members4 AS members " + - "LEFT JOIN projections.users12_humans " + - "ON members.user_id = projections.users12_humans.user_id AND members.instance_id = projections.users12_humans.instance_id " + - "LEFT JOIN projections.users12_machines " + - "ON members.user_id = projections.users12_machines.user_id AND members.instance_id = projections.users12_machines.instance_id " + - "LEFT JOIN projections.users12 " + - "ON members.user_id = projections.users12.id AND members.instance_id = projections.users12.instance_id " + + "LEFT JOIN projections.users13_humans " + + "ON members.user_id = projections.users13_humans.user_id AND members.instance_id = projections.users13_humans.instance_id " + + "LEFT JOIN projections.users13_machines " + + "ON members.user_id = projections.users13_machines.user_id AND members.instance_id = projections.users13_machines.instance_id " + + "LEFT JOIN projections.users13 " + + "ON members.user_id = projections.users13.id AND members.instance_id = projections.users13.instance_id " + "LEFT JOIN projections.login_names3 " + "ON members.user_id = projections.login_names3.user_id AND members.instance_id = projections.login_names3.instance_id " + "AS OF SYSTEM TIME '-1 ms' " + diff --git a/internal/query/org_member_test.go b/internal/query/org_member_test.go index 8ac13e8d73..d0247c39d3 100644 --- a/internal/query/org_member_test.go +++ b/internal/query/org_member_test.go @@ -21,24 +21,24 @@ var ( ", members.user_id" + ", members.roles" + ", projections.login_names3.login_name" + - ", projections.users12_humans.email" + - ", projections.users12_humans.first_name" + - ", projections.users12_humans.last_name" + - ", projections.users12_humans.display_name" + - ", projections.users12_machines.name" + - ", projections.users12_humans.avatar_key" + - ", projections.users12.type" + + ", projections.users13_humans.email" + + ", projections.users13_humans.first_name" + + ", projections.users13_humans.last_name" + + ", projections.users13_humans.display_name" + + ", projections.users13_machines.name" + + ", projections.users13_humans.avatar_key" + + ", projections.users13.type" + ", COUNT(*) OVER () " + "FROM projections.org_members4 AS members " + - "LEFT JOIN projections.users12_humans " + - "ON members.user_id = projections.users12_humans.user_id " + - "AND members.instance_id = projections.users12_humans.instance_id " + - "LEFT JOIN projections.users12_machines " + - "ON members.user_id = projections.users12_machines.user_id " + - "AND members.instance_id = projections.users12_machines.instance_id " + - "LEFT JOIN projections.users12 " + - "ON members.user_id = projections.users12.id " + - "AND members.instance_id = projections.users12.instance_id " + + "LEFT JOIN projections.users13_humans " + + "ON members.user_id = projections.users13_humans.user_id " + + "AND members.instance_id = projections.users13_humans.instance_id " + + "LEFT JOIN projections.users13_machines " + + "ON members.user_id = projections.users13_machines.user_id " + + "AND members.instance_id = projections.users13_machines.instance_id " + + "LEFT JOIN projections.users13 " + + "ON members.user_id = projections.users13.id " + + "AND members.instance_id = projections.users13.instance_id " + "LEFT JOIN projections.login_names3 " + "ON members.user_id = projections.login_names3.user_id " + "AND members.instance_id = projections.login_names3.instance_id " + diff --git a/internal/query/project_grant_member_test.go b/internal/query/project_grant_member_test.go index 6d0ec6d822..839a1f2c1b 100644 --- a/internal/query/project_grant_member_test.go +++ b/internal/query/project_grant_member_test.go @@ -21,24 +21,24 @@ var ( ", members.user_id" + ", members.roles" + ", projections.login_names3.login_name" + - ", projections.users12_humans.email" + - ", projections.users12_humans.first_name" + - ", projections.users12_humans.last_name" + - ", projections.users12_humans.display_name" + - ", projections.users12_machines.name" + - ", projections.users12_humans.avatar_key" + - ", projections.users12.type" + + ", projections.users13_humans.email" + + ", projections.users13_humans.first_name" + + ", projections.users13_humans.last_name" + + ", projections.users13_humans.display_name" + + ", projections.users13_machines.name" + + ", projections.users13_humans.avatar_key" + + ", projections.users13.type" + ", COUNT(*) OVER () " + "FROM projections.project_grant_members4 AS members " + - "LEFT JOIN projections.users12_humans " + - "ON members.user_id = projections.users12_humans.user_id " + - "AND members.instance_id = projections.users12_humans.instance_id " + - "LEFT JOIN projections.users12_machines " + - "ON members.user_id = projections.users12_machines.user_id " + - "AND members.instance_id = projections.users12_machines.instance_id " + - "LEFT JOIN projections.users12 " + - "ON members.user_id = projections.users12.id " + - "AND members.instance_id = projections.users12.instance_id " + + "LEFT JOIN projections.users13_humans " + + "ON members.user_id = projections.users13_humans.user_id " + + "AND members.instance_id = projections.users13_humans.instance_id " + + "LEFT JOIN projections.users13_machines " + + "ON members.user_id = projections.users13_machines.user_id " + + "AND members.instance_id = projections.users13_machines.instance_id " + + "LEFT JOIN projections.users13 " + + "ON members.user_id = projections.users13.id " + + "AND members.instance_id = projections.users13.instance_id " + "LEFT JOIN projections.login_names3 " + "ON members.user_id = projections.login_names3.user_id " + "AND members.instance_id = projections.login_names3.instance_id " + diff --git a/internal/query/project_member_test.go b/internal/query/project_member_test.go index 2662016564..74f35ef6ee 100644 --- a/internal/query/project_member_test.go +++ b/internal/query/project_member_test.go @@ -21,24 +21,24 @@ var ( ", members.user_id" + ", members.roles" + ", projections.login_names3.login_name" + - ", projections.users12_humans.email" + - ", projections.users12_humans.first_name" + - ", projections.users12_humans.last_name" + - ", projections.users12_humans.display_name" + - ", projections.users12_machines.name" + - ", projections.users12_humans.avatar_key" + - ", projections.users12.type" + + ", projections.users13_humans.email" + + ", projections.users13_humans.first_name" + + ", projections.users13_humans.last_name" + + ", projections.users13_humans.display_name" + + ", projections.users13_machines.name" + + ", projections.users13_humans.avatar_key" + + ", projections.users13.type" + ", COUNT(*) OVER () " + "FROM projections.project_members4 AS members " + - "LEFT JOIN projections.users12_humans " + - "ON members.user_id = projections.users12_humans.user_id " + - "AND members.instance_id = projections.users12_humans.instance_id " + - "LEFT JOIN projections.users12_machines " + - "ON members.user_id = projections.users12_machines.user_id " + - "AND members.instance_id = projections.users12_machines.instance_id " + - "LEFT JOIN projections.users12 " + - "ON members.user_id = projections.users12.id " + - "AND members.instance_id = projections.users12.instance_id " + + "LEFT JOIN projections.users13_humans " + + "ON members.user_id = projections.users13_humans.user_id " + + "AND members.instance_id = projections.users13_humans.instance_id " + + "LEFT JOIN projections.users13_machines " + + "ON members.user_id = projections.users13_machines.user_id " + + "AND members.instance_id = projections.users13_machines.instance_id " + + "LEFT JOIN projections.users13 " + + "ON members.user_id = projections.users13.id " + + "AND members.instance_id = projections.users13.instance_id " + "LEFT JOIN projections.login_names3 " + "ON members.user_id = projections.login_names3.user_id " + "AND members.instance_id = projections.login_names3.instance_id " + diff --git a/internal/query/projection/user.go b/internal/query/projection/user.go index d9c5f78b22..f7c2981e4c 100644 --- a/internal/query/projection/user.go +++ b/internal/query/projection/user.go @@ -16,7 +16,7 @@ import ( ) const ( - UserTable = "projections.users12" + UserTable = "projections.users13" UserHumanTable = UserTable + "_" + UserHumanSuffix UserMachineTable = UserTable + "_" + UserMachineSuffix UserNotifyTable = UserTable + "_" + UserNotifySuffix @@ -35,6 +35,7 @@ const ( HumanUserIDCol = "user_id" HumanUserInstanceIDCol = "instance_id" HumanPasswordChangeRequired = "password_change_required" + HumanPasswordChanged = "password_changed" // profile HumanFirstNameCol = "first_name" @@ -116,6 +117,7 @@ func (*userProjection) Init() *old_handler.Check { handler.NewColumn(HumanPhoneCol, handler.ColumnTypeText, handler.Nullable()), handler.NewColumn(HumanIsPhoneVerifiedCol, handler.ColumnTypeBool, handler.Nullable()), handler.NewColumn(HumanPasswordChangeRequired, handler.ColumnTypeBool), + handler.NewColumn(HumanPasswordChanged, handler.ColumnTypeTimestamp, handler.Nullable()), }, handler.NewPrimaryKey(HumanUserInstanceIDCol, HumanUserIDCol), UserHumanSuffix, @@ -322,6 +324,7 @@ func (p *userProjection) reduceHumanAdded(event eventstore.Event) (*handler.Stat if !ok { return nil, zerrors.ThrowInvalidArgumentf(nil, "HANDL-Ebynp", "reduce.wrong.event.type %s", user.HumanAddedType) } + passwordSet := crypto.SecretOrEncodedHash(e.Secret, e.EncodedHash) != "" return handler.NewMultiStatement( e, handler.AddCreateStatement( @@ -350,6 +353,7 @@ func (p *userProjection) reduceHumanAdded(event eventstore.Event) (*handler.Stat handler.NewCol(HumanEmailCol, e.EmailAddress), handler.NewCol(HumanPhoneCol, &sql.NullString{String: string(e.PhoneNumber), Valid: e.PhoneNumber != ""}), handler.NewCol(HumanPasswordChangeRequired, e.ChangeRequired), + handler.NewCol(HumanPasswordChanged, &sql.NullTime{Time: e.CreatedAt(), Valid: passwordSet}), }, handler.WithTableSuffix(UserHumanSuffix), ), @@ -359,7 +363,7 @@ func (p *userProjection) reduceHumanAdded(event eventstore.Event) (*handler.Stat handler.NewCol(NotifyInstanceIDCol, e.Aggregate().InstanceID), handler.NewCol(NotifyLastEmailCol, e.EmailAddress), handler.NewCol(NotifyLastPhoneCol, &sql.NullString{String: string(e.PhoneNumber), Valid: e.PhoneNumber != ""}), - handler.NewCol(NotifyPasswordSetCol, crypto.SecretOrEncodedHash(e.Secret, e.EncodedHash) != ""), + handler.NewCol(NotifyPasswordSetCol, passwordSet), }, handler.WithTableSuffix(UserNotifySuffix), ), @@ -371,6 +375,7 @@ func (p *userProjection) reduceHumanRegistered(event eventstore.Event) (*handler if !ok { return nil, zerrors.ThrowInvalidArgumentf(nil, "HANDL-xE53M", "reduce.wrong.event.type %s", user.HumanRegisteredType) } + passwordSet := crypto.SecretOrEncodedHash(e.Secret, e.EncodedHash) != "" return handler.NewMultiStatement( e, handler.AddCreateStatement( @@ -399,6 +404,7 @@ func (p *userProjection) reduceHumanRegistered(event eventstore.Event) (*handler handler.NewCol(HumanEmailCol, e.EmailAddress), handler.NewCol(HumanPhoneCol, &sql.NullString{String: string(e.PhoneNumber), Valid: e.PhoneNumber != ""}), handler.NewCol(HumanPasswordChangeRequired, e.ChangeRequired), + handler.NewCol(HumanPasswordChanged, &sql.NullTime{Time: e.CreatedAt(), Valid: passwordSet}), }, handler.WithTableSuffix(UserHumanSuffix), ), @@ -408,7 +414,7 @@ func (p *userProjection) reduceHumanRegistered(event eventstore.Event) (*handler handler.NewCol(NotifyInstanceIDCol, e.Aggregate().InstanceID), handler.NewCol(NotifyLastEmailCol, e.EmailAddress), handler.NewCol(NotifyLastPhoneCol, &sql.NullString{String: string(e.PhoneNumber), Valid: e.PhoneNumber != ""}), - handler.NewCol(NotifyPasswordSetCol, crypto.SecretOrEncodedHash(e.Secret, e.EncodedHash) != ""), + handler.NewCol(NotifyPasswordSetCol, passwordSet), }, handler.WithTableSuffix(UserNotifySuffix), ), @@ -918,6 +924,7 @@ func (p *userProjection) reduceHumanPasswordChanged(event eventstore.Event) (*ha handler.AddUpdateStatement( []handler.Column{ handler.NewCol(HumanPasswordChangeRequired, e.ChangeRequired), + handler.NewCol(HumanPasswordChanged, &sql.NullTime{Time: e.CreatedAt(), Valid: true}), }, []handler.Condition{ handler.NewCond(HumanUserIDCol, e.Aggregate().ID), diff --git a/internal/query/projection/user_test.go b/internal/query/projection/user_test.go index 1359b624e4..61091470b0 100644 --- a/internal/query/projection/user_test.go +++ b/internal/query/projection/user_test.go @@ -3,6 +3,7 @@ package projection import ( "database/sql" "testing" + "time" "github.com/zitadel/zitadel/internal/domain" "github.com/zitadel/zitadel/internal/eventstore" @@ -14,6 +15,7 @@ import ( ) func TestUserProjection_reduces(t *testing.T) { + testNow := time.Now() type args struct { event func(t *testing.T) eventstore.Event } @@ -27,7 +29,7 @@ func TestUserProjection_reduces(t *testing.T) { name: "reduceHumanAdded", args: args{ event: getEvent( - testEvent( + timedTestEvent( user.HumanAddedType, user.AggregateType, []byte(`{ @@ -42,6 +44,7 @@ func TestUserProjection_reduces(t *testing.T) { "phone": "+41 00 000 00 00", "changeRequired": true }`), + testNow, ), user.HumanAddedEventMapper), }, reduce: (&userProjection{}).reduceHumanAdded, @@ -51,7 +54,7 @@ func TestUserProjection_reduces(t *testing.T) { executer: &testExecuter{ executions: []execution{ { - expectedStmt: "INSERT INTO projections.users12 (id, creation_date, change_date, resource_owner, instance_id, state, sequence, username, type) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9)", + expectedStmt: "INSERT INTO projections.users13 (id, creation_date, change_date, resource_owner, instance_id, state, sequence, username, type) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9)", expectedArgs: []interface{}{ "agg-id", anyArg{}, @@ -65,7 +68,7 @@ func TestUserProjection_reduces(t *testing.T) { }, }, { - expectedStmt: "INSERT INTO projections.users12_humans (user_id, instance_id, first_name, last_name, nick_name, display_name, preferred_language, gender, email, phone, password_change_required) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11)", + expectedStmt: "INSERT INTO projections.users13_humans (user_id, instance_id, first_name, last_name, nick_name, display_name, preferred_language, gender, email, phone, password_change_required, password_changed) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12)", expectedArgs: []interface{}{ "agg-id", "instance-id", @@ -78,10 +81,11 @@ func TestUserProjection_reduces(t *testing.T) { domain.EmailAddress("email@zitadel.com"), &sql.NullString{String: "+41 00 000 00 00", Valid: true}, true, + &sql.NullTime{Time: testNow, Valid: false}, }, }, { - expectedStmt: "INSERT INTO projections.users12_notifications (user_id, instance_id, last_email, last_phone, password_set) VALUES ($1, $2, $3, $4, $5)", + expectedStmt: "INSERT INTO projections.users13_notifications (user_id, instance_id, last_email, last_phone, password_set) VALUES ($1, $2, $3, $4, $5)", expectedArgs: []interface{}{ "agg-id", "instance-id", @@ -98,7 +102,7 @@ func TestUserProjection_reduces(t *testing.T) { name: "reduceUserV1Added", args: args{ event: getEvent( - testEvent( + timedTestEvent( user.UserV1AddedType, user.AggregateType, []byte(`{ @@ -112,6 +116,7 @@ func TestUserProjection_reduces(t *testing.T) { "email": "email@zitadel.com", "phone": "+41 00 000 00 00" }`), + testNow, ), user.HumanAddedEventMapper), }, reduce: (&userProjection{}).reduceHumanAdded, @@ -121,7 +126,7 @@ func TestUserProjection_reduces(t *testing.T) { executer: &testExecuter{ executions: []execution{ { - expectedStmt: "INSERT INTO projections.users12 (id, creation_date, change_date, resource_owner, instance_id, state, sequence, username, type) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9)", + expectedStmt: "INSERT INTO projections.users13 (id, creation_date, change_date, resource_owner, instance_id, state, sequence, username, type) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9)", expectedArgs: []interface{}{ "agg-id", anyArg{}, @@ -135,7 +140,7 @@ func TestUserProjection_reduces(t *testing.T) { }, }, { - expectedStmt: "INSERT INTO projections.users12_humans (user_id, instance_id, first_name, last_name, nick_name, display_name, preferred_language, gender, email, phone, password_change_required) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11)", + expectedStmt: "INSERT INTO projections.users13_humans (user_id, instance_id, first_name, last_name, nick_name, display_name, preferred_language, gender, email, phone, password_change_required, password_changed) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12)", expectedArgs: []interface{}{ "agg-id", "instance-id", @@ -148,10 +153,11 @@ func TestUserProjection_reduces(t *testing.T) { domain.EmailAddress("email@zitadel.com"), &sql.NullString{String: "+41 00 000 00 00", Valid: true}, false, + &sql.NullTime{Time: testNow, Valid: false}, }, }, { - expectedStmt: "INSERT INTO projections.users12_notifications (user_id, instance_id, last_email, last_phone, password_set) VALUES ($1, $2, $3, $4, $5)", + expectedStmt: "INSERT INTO projections.users13_notifications (user_id, instance_id, last_email, last_phone, password_set) VALUES ($1, $2, $3, $4, $5)", expectedArgs: []interface{}{ "agg-id", "instance-id", @@ -168,7 +174,7 @@ func TestUserProjection_reduces(t *testing.T) { name: "reduceHumanAdded NULLs", args: args{ event: getEvent( - testEvent( + timedTestEvent( user.HumanAddedType, user.AggregateType, []byte(`{ @@ -177,6 +183,7 @@ func TestUserProjection_reduces(t *testing.T) { "lastName": "last-name", "email": "email@zitadel.com" }`), + testNow, ), user.HumanAddedEventMapper), }, reduce: (&userProjection{}).reduceHumanAdded, @@ -186,7 +193,7 @@ func TestUserProjection_reduces(t *testing.T) { executer: &testExecuter{ executions: []execution{ { - expectedStmt: "INSERT INTO projections.users12 (id, creation_date, change_date, resource_owner, instance_id, state, sequence, username, type) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9)", + expectedStmt: "INSERT INTO projections.users13 (id, creation_date, change_date, resource_owner, instance_id, state, sequence, username, type) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9)", expectedArgs: []interface{}{ "agg-id", anyArg{}, @@ -200,7 +207,7 @@ func TestUserProjection_reduces(t *testing.T) { }, }, { - expectedStmt: "INSERT INTO projections.users12_humans (user_id, instance_id, first_name, last_name, nick_name, display_name, preferred_language, gender, email, phone, password_change_required) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11)", + expectedStmt: "INSERT INTO projections.users13_humans (user_id, instance_id, first_name, last_name, nick_name, display_name, preferred_language, gender, email, phone, password_change_required, password_changed) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12)", expectedArgs: []interface{}{ "agg-id", "instance-id", @@ -213,10 +220,11 @@ func TestUserProjection_reduces(t *testing.T) { domain.EmailAddress("email@zitadel.com"), &sql.NullString{}, false, + &sql.NullTime{Time: testNow, Valid: false}, }, }, { - expectedStmt: "INSERT INTO projections.users12_notifications (user_id, instance_id, last_email, last_phone, password_set) VALUES ($1, $2, $3, $4, $5)", + expectedStmt: "INSERT INTO projections.users13_notifications (user_id, instance_id, last_email, last_phone, password_set) VALUES ($1, $2, $3, $4, $5)", expectedArgs: []interface{}{ "agg-id", "instance-id", @@ -233,7 +241,7 @@ func TestUserProjection_reduces(t *testing.T) { name: "reduceHumanRegistered", args: args{ event: getEvent( - testEvent( + timedTestEvent( user.HumanRegisteredType, user.AggregateType, []byte(`{ @@ -248,6 +256,7 @@ func TestUserProjection_reduces(t *testing.T) { "phone": "+41 00 000 00 00", "changeRequired": true }`), + testNow, ), user.HumanRegisteredEventMapper), }, reduce: (&userProjection{}).reduceHumanRegistered, @@ -257,7 +266,7 @@ func TestUserProjection_reduces(t *testing.T) { executer: &testExecuter{ executions: []execution{ { - expectedStmt: "INSERT INTO projections.users12 (id, creation_date, change_date, resource_owner, instance_id, state, sequence, username, type) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9)", + expectedStmt: "INSERT INTO projections.users13 (id, creation_date, change_date, resource_owner, instance_id, state, sequence, username, type) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9)", expectedArgs: []interface{}{ "agg-id", anyArg{}, @@ -271,7 +280,7 @@ func TestUserProjection_reduces(t *testing.T) { }, }, { - expectedStmt: "INSERT INTO projections.users12_humans (user_id, instance_id, first_name, last_name, nick_name, display_name, preferred_language, gender, email, phone, password_change_required) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11)", + expectedStmt: "INSERT INTO projections.users13_humans (user_id, instance_id, first_name, last_name, nick_name, display_name, preferred_language, gender, email, phone, password_change_required, password_changed) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12)", expectedArgs: []interface{}{ "agg-id", "instance-id", @@ -284,10 +293,11 @@ func TestUserProjection_reduces(t *testing.T) { domain.EmailAddress("email@zitadel.com"), &sql.NullString{String: "+41 00 000 00 00", Valid: true}, true, + &sql.NullTime{Time: testNow, Valid: false}, }, }, { - expectedStmt: "INSERT INTO projections.users12_notifications (user_id, instance_id, last_email, last_phone, password_set) VALUES ($1, $2, $3, $4, $5)", + expectedStmt: "INSERT INTO projections.users13_notifications (user_id, instance_id, last_email, last_phone, password_set) VALUES ($1, $2, $3, $4, $5)", expectedArgs: []interface{}{ "agg-id", "instance-id", @@ -304,7 +314,7 @@ func TestUserProjection_reduces(t *testing.T) { name: "reduceUserV1Registered", args: args{ event: getEvent( - testEvent( + timedTestEvent( user.UserV1RegisteredType, user.AggregateType, []byte(`{ @@ -318,6 +328,7 @@ func TestUserProjection_reduces(t *testing.T) { "email": "email@zitadel.com", "phone": "+41 00 000 00 00" }`), + testNow, ), user.HumanRegisteredEventMapper), }, reduce: (&userProjection{}).reduceHumanRegistered, @@ -327,7 +338,7 @@ func TestUserProjection_reduces(t *testing.T) { executer: &testExecuter{ executions: []execution{ { - expectedStmt: "INSERT INTO projections.users12 (id, creation_date, change_date, resource_owner, instance_id, state, sequence, username, type) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9)", + expectedStmt: "INSERT INTO projections.users13 (id, creation_date, change_date, resource_owner, instance_id, state, sequence, username, type) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9)", expectedArgs: []interface{}{ "agg-id", anyArg{}, @@ -341,7 +352,7 @@ func TestUserProjection_reduces(t *testing.T) { }, }, { - expectedStmt: "INSERT INTO projections.users12_humans (user_id, instance_id, first_name, last_name, nick_name, display_name, preferred_language, gender, email, phone, password_change_required) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11)", + expectedStmt: "INSERT INTO projections.users13_humans (user_id, instance_id, first_name, last_name, nick_name, display_name, preferred_language, gender, email, phone, password_change_required, password_changed) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12)", expectedArgs: []interface{}{ "agg-id", "instance-id", @@ -354,10 +365,11 @@ func TestUserProjection_reduces(t *testing.T) { domain.EmailAddress("email@zitadel.com"), &sql.NullString{String: "+41 00 000 00 00", Valid: true}, false, + &sql.NullTime{Time: testNow, Valid: false}, }, }, { - expectedStmt: "INSERT INTO projections.users12_notifications (user_id, instance_id, last_email, last_phone, password_set) VALUES ($1, $2, $3, $4, $5)", + expectedStmt: "INSERT INTO projections.users13_notifications (user_id, instance_id, last_email, last_phone, password_set) VALUES ($1, $2, $3, $4, $5)", expectedArgs: []interface{}{ "agg-id", "instance-id", @@ -374,7 +386,7 @@ func TestUserProjection_reduces(t *testing.T) { name: "reduceHumanRegistered NULLs", args: args{ event: getEvent( - testEvent( + timedTestEvent( user.HumanRegisteredType, user.AggregateType, []byte(`{ @@ -383,6 +395,7 @@ func TestUserProjection_reduces(t *testing.T) { "lastName": "last-name", "email": "email@zitadel.com" }`), + testNow, ), user.HumanRegisteredEventMapper), }, reduce: (&userProjection{}).reduceHumanRegistered, @@ -392,7 +405,7 @@ func TestUserProjection_reduces(t *testing.T) { executer: &testExecuter{ executions: []execution{ { - expectedStmt: "INSERT INTO projections.users12 (id, creation_date, change_date, resource_owner, instance_id, state, sequence, username, type) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9)", + expectedStmt: "INSERT INTO projections.users13 (id, creation_date, change_date, resource_owner, instance_id, state, sequence, username, type) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9)", expectedArgs: []interface{}{ "agg-id", anyArg{}, @@ -406,7 +419,7 @@ func TestUserProjection_reduces(t *testing.T) { }, }, { - expectedStmt: "INSERT INTO projections.users12_humans (user_id, instance_id, first_name, last_name, nick_name, display_name, preferred_language, gender, email, phone, password_change_required) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11)", + expectedStmt: "INSERT INTO projections.users13_humans (user_id, instance_id, first_name, last_name, nick_name, display_name, preferred_language, gender, email, phone, password_change_required, password_changed) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12)", expectedArgs: []interface{}{ "agg-id", "instance-id", @@ -419,10 +432,11 @@ func TestUserProjection_reduces(t *testing.T) { domain.EmailAddress("email@zitadel.com"), &sql.NullString{}, false, + &sql.NullTime{Time: testNow, Valid: false}, }, }, { - expectedStmt: "INSERT INTO projections.users12_notifications (user_id, instance_id, last_email, last_phone, password_set) VALUES ($1, $2, $3, $4, $5)", + expectedStmt: "INSERT INTO projections.users13_notifications (user_id, instance_id, last_email, last_phone, password_set) VALUES ($1, $2, $3, $4, $5)", expectedArgs: []interface{}{ "agg-id", "instance-id", @@ -452,7 +466,7 @@ func TestUserProjection_reduces(t *testing.T) { executer: &testExecuter{ executions: []execution{ { - expectedStmt: "UPDATE projections.users12 SET state = $1 WHERE (id = $2) AND (instance_id = $3)", + expectedStmt: "UPDATE projections.users13 SET state = $1 WHERE (id = $2) AND (instance_id = $3)", expectedArgs: []interface{}{ domain.UserStateInitial, "agg-id", @@ -480,7 +494,7 @@ func TestUserProjection_reduces(t *testing.T) { executer: &testExecuter{ executions: []execution{ { - expectedStmt: "UPDATE projections.users12 SET state = $1 WHERE (id = $2) AND (instance_id = $3)", + expectedStmt: "UPDATE projections.users13 SET state = $1 WHERE (id = $2) AND (instance_id = $3)", expectedArgs: []interface{}{ domain.UserStateInitial, "agg-id", @@ -508,7 +522,7 @@ func TestUserProjection_reduces(t *testing.T) { executer: &testExecuter{ executions: []execution{ { - expectedStmt: "UPDATE projections.users12 SET state = $1 WHERE (id = $2) AND (instance_id = $3)", + expectedStmt: "UPDATE projections.users13 SET state = $1 WHERE (id = $2) AND (instance_id = $3)", expectedArgs: []interface{}{ domain.UserStateActive, "agg-id", @@ -536,7 +550,7 @@ func TestUserProjection_reduces(t *testing.T) { executer: &testExecuter{ executions: []execution{ { - expectedStmt: "UPDATE projections.users12 SET state = $1 WHERE (id = $2) AND (instance_id = $3)", + expectedStmt: "UPDATE projections.users13 SET state = $1 WHERE (id = $2) AND (instance_id = $3)", expectedArgs: []interface{}{ domain.UserStateActive, "agg-id", @@ -564,7 +578,7 @@ func TestUserProjection_reduces(t *testing.T) { executer: &testExecuter{ executions: []execution{ { - expectedStmt: "UPDATE projections.users12 SET (change_date, state, sequence) = ($1, $2, $3) WHERE (id = $4) AND (instance_id = $5)", + expectedStmt: "UPDATE projections.users13 SET (change_date, state, sequence) = ($1, $2, $3) WHERE (id = $4) AND (instance_id = $5)", expectedArgs: []interface{}{ anyArg{}, domain.UserStateLocked, @@ -594,7 +608,7 @@ func TestUserProjection_reduces(t *testing.T) { executer: &testExecuter{ executions: []execution{ { - expectedStmt: "UPDATE projections.users12 SET (change_date, state, sequence) = ($1, $2, $3) WHERE (id = $4) AND (instance_id = $5)", + expectedStmt: "UPDATE projections.users13 SET (change_date, state, sequence) = ($1, $2, $3) WHERE (id = $4) AND (instance_id = $5)", expectedArgs: []interface{}{ anyArg{}, domain.UserStateActive, @@ -624,7 +638,7 @@ func TestUserProjection_reduces(t *testing.T) { executer: &testExecuter{ executions: []execution{ { - expectedStmt: "UPDATE projections.users12 SET (change_date, state, sequence) = ($1, $2, $3) WHERE (id = $4) AND (instance_id = $5)", + expectedStmt: "UPDATE projections.users13 SET (change_date, state, sequence) = ($1, $2, $3) WHERE (id = $4) AND (instance_id = $5)", expectedArgs: []interface{}{ anyArg{}, domain.UserStateInactive, @@ -654,7 +668,7 @@ func TestUserProjection_reduces(t *testing.T) { executer: &testExecuter{ executions: []execution{ { - expectedStmt: "UPDATE projections.users12 SET (change_date, state, sequence) = ($1, $2, $3) WHERE (id = $4) AND (instance_id = $5)", + expectedStmt: "UPDATE projections.users13 SET (change_date, state, sequence) = ($1, $2, $3) WHERE (id = $4) AND (instance_id = $5)", expectedArgs: []interface{}{ anyArg{}, domain.UserStateActive, @@ -684,7 +698,7 @@ func TestUserProjection_reduces(t *testing.T) { executer: &testExecuter{ executions: []execution{ { - expectedStmt: "DELETE FROM projections.users12 WHERE (id = $1) AND (instance_id = $2)", + expectedStmt: "DELETE FROM projections.users13 WHERE (id = $1) AND (instance_id = $2)", expectedArgs: []interface{}{ "agg-id", "instance-id", @@ -713,7 +727,7 @@ func TestUserProjection_reduces(t *testing.T) { executer: &testExecuter{ executions: []execution{ { - expectedStmt: "UPDATE projections.users12 SET (change_date, username, sequence) = ($1, $2, $3) WHERE (id = $4) AND (instance_id = $5)", + expectedStmt: "UPDATE projections.users13 SET (change_date, username, sequence) = ($1, $2, $3) WHERE (id = $4) AND (instance_id = $5)", expectedArgs: []interface{}{ anyArg{}, "username", @@ -745,7 +759,7 @@ func TestUserProjection_reduces(t *testing.T) { executer: &testExecuter{ executions: []execution{ { - expectedStmt: "UPDATE projections.users12 SET (change_date, username, sequence) = ($1, $2, $3) WHERE (id = $4) AND (instance_id = $5)", + expectedStmt: "UPDATE projections.users13 SET (change_date, username, sequence) = ($1, $2, $3) WHERE (id = $4) AND (instance_id = $5)", expectedArgs: []interface{}{ anyArg{}, "id@temporary.domain", @@ -782,7 +796,7 @@ func TestUserProjection_reduces(t *testing.T) { executer: &testExecuter{ executions: []execution{ { - expectedStmt: "UPDATE projections.users12 SET (change_date, sequence) = ($1, $2) WHERE (id = $3) AND (instance_id = $4)", + expectedStmt: "UPDATE projections.users13 SET (change_date, sequence) = ($1, $2) WHERE (id = $3) AND (instance_id = $4)", expectedArgs: []interface{}{ anyArg{}, uint64(15), @@ -791,7 +805,7 @@ func TestUserProjection_reduces(t *testing.T) { }, }, { - expectedStmt: "UPDATE projections.users12_humans SET (first_name, last_name, nick_name, display_name, preferred_language, gender) = ($1, $2, $3, $4, $5, $6) WHERE (user_id = $7) AND (instance_id = $8)", + expectedStmt: "UPDATE projections.users13_humans SET (first_name, last_name, nick_name, display_name, preferred_language, gender) = ($1, $2, $3, $4, $5, $6) WHERE (user_id = $7) AND (instance_id = $8)", expectedArgs: []interface{}{ "first-name", "last-name", @@ -831,7 +845,7 @@ func TestUserProjection_reduces(t *testing.T) { executer: &testExecuter{ executions: []execution{ { - expectedStmt: "UPDATE projections.users12 SET (change_date, sequence) = ($1, $2) WHERE (id = $3) AND (instance_id = $4)", + expectedStmt: "UPDATE projections.users13 SET (change_date, sequence) = ($1, $2) WHERE (id = $3) AND (instance_id = $4)", expectedArgs: []interface{}{ anyArg{}, uint64(15), @@ -840,7 +854,7 @@ func TestUserProjection_reduces(t *testing.T) { }, }, { - expectedStmt: "UPDATE projections.users12_humans SET (first_name, last_name, nick_name, display_name, preferred_language, gender) = ($1, $2, $3, $4, $5, $6) WHERE (user_id = $7) AND (instance_id = $8)", + expectedStmt: "UPDATE projections.users13_humans SET (first_name, last_name, nick_name, display_name, preferred_language, gender) = ($1, $2, $3, $4, $5, $6) WHERE (user_id = $7) AND (instance_id = $8)", expectedArgs: []interface{}{ "first-name", "last-name", @@ -875,7 +889,7 @@ func TestUserProjection_reduces(t *testing.T) { executer: &testExecuter{ executions: []execution{ { - expectedStmt: "UPDATE projections.users12 SET (change_date, sequence) = ($1, $2) WHERE (id = $3) AND (instance_id = $4)", + expectedStmt: "UPDATE projections.users13 SET (change_date, sequence) = ($1, $2) WHERE (id = $3) AND (instance_id = $4)", expectedArgs: []interface{}{ anyArg{}, uint64(15), @@ -884,7 +898,7 @@ func TestUserProjection_reduces(t *testing.T) { }, }, { - expectedStmt: "UPDATE projections.users12_humans SET (phone, is_phone_verified) = ($1, $2) WHERE (user_id = $3) AND (instance_id = $4)", + expectedStmt: "UPDATE projections.users13_humans SET (phone, is_phone_verified) = ($1, $2) WHERE (user_id = $3) AND (instance_id = $4)", expectedArgs: []interface{}{ domain.PhoneNumber("+41 00 000 00 00"), false, @@ -893,7 +907,7 @@ func TestUserProjection_reduces(t *testing.T) { }, }, { - expectedStmt: "UPDATE projections.users12_notifications SET last_phone = $1 WHERE (user_id = $2) AND (instance_id = $3)", + expectedStmt: "UPDATE projections.users13_notifications SET last_phone = $1 WHERE (user_id = $2) AND (instance_id = $3)", expectedArgs: []interface{}{ &sql.NullString{String: "+41 00 000 00 00", Valid: true}, "agg-id", @@ -923,7 +937,7 @@ func TestUserProjection_reduces(t *testing.T) { executer: &testExecuter{ executions: []execution{ { - expectedStmt: "UPDATE projections.users12 SET (change_date, sequence) = ($1, $2) WHERE (id = $3) AND (instance_id = $4)", + expectedStmt: "UPDATE projections.users13 SET (change_date, sequence) = ($1, $2) WHERE (id = $3) AND (instance_id = $4)", expectedArgs: []interface{}{ anyArg{}, uint64(15), @@ -932,7 +946,7 @@ func TestUserProjection_reduces(t *testing.T) { }, }, { - expectedStmt: "UPDATE projections.users12_humans SET (phone, is_phone_verified) = ($1, $2) WHERE (user_id = $3) AND (instance_id = $4)", + expectedStmt: "UPDATE projections.users13_humans SET (phone, is_phone_verified) = ($1, $2) WHERE (user_id = $3) AND (instance_id = $4)", expectedArgs: []interface{}{ domain.PhoneNumber("+41 00 000 00 00"), false, @@ -941,7 +955,7 @@ func TestUserProjection_reduces(t *testing.T) { }, }, { - expectedStmt: "UPDATE projections.users12_notifications SET last_phone = $1 WHERE (user_id = $2) AND (instance_id = $3)", + expectedStmt: "UPDATE projections.users13_notifications SET last_phone = $1 WHERE (user_id = $2) AND (instance_id = $3)", expectedArgs: []interface{}{ &sql.NullString{String: "+41 00 000 00 00", Valid: true}, "agg-id", @@ -969,7 +983,7 @@ func TestUserProjection_reduces(t *testing.T) { executer: &testExecuter{ executions: []execution{ { - expectedStmt: "UPDATE projections.users12 SET (change_date, sequence) = ($1, $2) WHERE (id = $3) AND (instance_id = $4)", + expectedStmt: "UPDATE projections.users13 SET (change_date, sequence) = ($1, $2) WHERE (id = $3) AND (instance_id = $4)", expectedArgs: []interface{}{ anyArg{}, uint64(15), @@ -978,7 +992,7 @@ func TestUserProjection_reduces(t *testing.T) { }, }, { - expectedStmt: "UPDATE projections.users12_humans SET (phone, is_phone_verified) = ($1, $2) WHERE (user_id = $3) AND (instance_id = $4)", + expectedStmt: "UPDATE projections.users13_humans SET (phone, is_phone_verified) = ($1, $2) WHERE (user_id = $3) AND (instance_id = $4)", expectedArgs: []interface{}{ nil, nil, @@ -987,7 +1001,7 @@ func TestUserProjection_reduces(t *testing.T) { }, }, { - expectedStmt: "UPDATE projections.users12_notifications SET (last_phone, verified_phone) = ($1, $2) WHERE (user_id = $3) AND (instance_id = $4)", + expectedStmt: "UPDATE projections.users13_notifications SET (last_phone, verified_phone) = ($1, $2) WHERE (user_id = $3) AND (instance_id = $4)", expectedArgs: []interface{}{ nil, nil, @@ -1016,7 +1030,7 @@ func TestUserProjection_reduces(t *testing.T) { executer: &testExecuter{ executions: []execution{ { - expectedStmt: "UPDATE projections.users12 SET (change_date, sequence) = ($1, $2) WHERE (id = $3) AND (instance_id = $4)", + expectedStmt: "UPDATE projections.users13 SET (change_date, sequence) = ($1, $2) WHERE (id = $3) AND (instance_id = $4)", expectedArgs: []interface{}{ anyArg{}, uint64(15), @@ -1025,7 +1039,7 @@ func TestUserProjection_reduces(t *testing.T) { }, }, { - expectedStmt: "UPDATE projections.users12_humans SET (phone, is_phone_verified) = ($1, $2) WHERE (user_id = $3) AND (instance_id = $4)", + expectedStmt: "UPDATE projections.users13_humans SET (phone, is_phone_verified) = ($1, $2) WHERE (user_id = $3) AND (instance_id = $4)", expectedArgs: []interface{}{ nil, nil, @@ -1034,7 +1048,7 @@ func TestUserProjection_reduces(t *testing.T) { }, }, { - expectedStmt: "UPDATE projections.users12_notifications SET (last_phone, verified_phone) = ($1, $2) WHERE (user_id = $3) AND (instance_id = $4)", + expectedStmt: "UPDATE projections.users13_notifications SET (last_phone, verified_phone) = ($1, $2) WHERE (user_id = $3) AND (instance_id = $4)", expectedArgs: []interface{}{ nil, nil, @@ -1063,7 +1077,7 @@ func TestUserProjection_reduces(t *testing.T) { executer: &testExecuter{ executions: []execution{ { - expectedStmt: "UPDATE projections.users12 SET (change_date, sequence) = ($1, $2) WHERE (id = $3) AND (instance_id = $4)", + expectedStmt: "UPDATE projections.users13 SET (change_date, sequence) = ($1, $2) WHERE (id = $3) AND (instance_id = $4)", expectedArgs: []interface{}{ anyArg{}, uint64(15), @@ -1072,7 +1086,7 @@ func TestUserProjection_reduces(t *testing.T) { }, }, { - expectedStmt: "UPDATE projections.users12_humans SET is_phone_verified = $1 WHERE (user_id = $2) AND (instance_id = $3)", + expectedStmt: "UPDATE projections.users13_humans SET is_phone_verified = $1 WHERE (user_id = $2) AND (instance_id = $3)", expectedArgs: []interface{}{ true, "agg-id", @@ -1080,7 +1094,7 @@ func TestUserProjection_reduces(t *testing.T) { }, }, { - expectedStmt: "UPDATE projections.users12_notifications SET verified_phone = last_phone WHERE (user_id = $1) AND (instance_id = $2)", + expectedStmt: "UPDATE projections.users13_notifications SET verified_phone = last_phone WHERE (user_id = $1) AND (instance_id = $2)", expectedArgs: []interface{}{ "agg-id", "instance-id", @@ -1107,7 +1121,7 @@ func TestUserProjection_reduces(t *testing.T) { executer: &testExecuter{ executions: []execution{ { - expectedStmt: "UPDATE projections.users12 SET (change_date, sequence) = ($1, $2) WHERE (id = $3) AND (instance_id = $4)", + expectedStmt: "UPDATE projections.users13 SET (change_date, sequence) = ($1, $2) WHERE (id = $3) AND (instance_id = $4)", expectedArgs: []interface{}{ anyArg{}, uint64(15), @@ -1116,7 +1130,7 @@ func TestUserProjection_reduces(t *testing.T) { }, }, { - expectedStmt: "UPDATE projections.users12_humans SET is_phone_verified = $1 WHERE (user_id = $2) AND (instance_id = $3)", + expectedStmt: "UPDATE projections.users13_humans SET is_phone_verified = $1 WHERE (user_id = $2) AND (instance_id = $3)", expectedArgs: []interface{}{ true, "agg-id", @@ -1124,7 +1138,7 @@ func TestUserProjection_reduces(t *testing.T) { }, }, { - expectedStmt: "UPDATE projections.users12_notifications SET verified_phone = last_phone WHERE (user_id = $1) AND (instance_id = $2)", + expectedStmt: "UPDATE projections.users13_notifications SET verified_phone = last_phone WHERE (user_id = $1) AND (instance_id = $2)", expectedArgs: []interface{}{ "agg-id", "instance-id", @@ -1153,7 +1167,7 @@ func TestUserProjection_reduces(t *testing.T) { executer: &testExecuter{ executions: []execution{ { - expectedStmt: "UPDATE projections.users12 SET (change_date, sequence) = ($1, $2) WHERE (id = $3) AND (instance_id = $4)", + expectedStmt: "UPDATE projections.users13 SET (change_date, sequence) = ($1, $2) WHERE (id = $3) AND (instance_id = $4)", expectedArgs: []interface{}{ anyArg{}, uint64(15), @@ -1162,7 +1176,7 @@ func TestUserProjection_reduces(t *testing.T) { }, }, { - expectedStmt: "UPDATE projections.users12_humans SET (email, is_email_verified) = ($1, $2) WHERE (user_id = $3) AND (instance_id = $4)", + expectedStmt: "UPDATE projections.users13_humans SET (email, is_email_verified) = ($1, $2) WHERE (user_id = $3) AND (instance_id = $4)", expectedArgs: []interface{}{ domain.EmailAddress("email@zitadel.com"), false, @@ -1171,7 +1185,7 @@ func TestUserProjection_reduces(t *testing.T) { }, }, { - expectedStmt: "UPDATE projections.users12_notifications SET last_email = $1 WHERE (user_id = $2) AND (instance_id = $3)", + expectedStmt: "UPDATE projections.users13_notifications SET last_email = $1 WHERE (user_id = $2) AND (instance_id = $3)", expectedArgs: []interface{}{ &sql.NullString{String: "email@zitadel.com", Valid: true}, "agg-id", @@ -1201,7 +1215,7 @@ func TestUserProjection_reduces(t *testing.T) { executer: &testExecuter{ executions: []execution{ { - expectedStmt: "UPDATE projections.users12 SET (change_date, sequence) = ($1, $2) WHERE (id = $3) AND (instance_id = $4)", + expectedStmt: "UPDATE projections.users13 SET (change_date, sequence) = ($1, $2) WHERE (id = $3) AND (instance_id = $4)", expectedArgs: []interface{}{ anyArg{}, uint64(15), @@ -1210,7 +1224,7 @@ func TestUserProjection_reduces(t *testing.T) { }, }, { - expectedStmt: "UPDATE projections.users12_humans SET (email, is_email_verified) = ($1, $2) WHERE (user_id = $3) AND (instance_id = $4)", + expectedStmt: "UPDATE projections.users13_humans SET (email, is_email_verified) = ($1, $2) WHERE (user_id = $3) AND (instance_id = $4)", expectedArgs: []interface{}{ domain.EmailAddress("email@zitadel.com"), false, @@ -1219,7 +1233,7 @@ func TestUserProjection_reduces(t *testing.T) { }, }, { - expectedStmt: "UPDATE projections.users12_notifications SET last_email = $1 WHERE (user_id = $2) AND (instance_id = $3)", + expectedStmt: "UPDATE projections.users13_notifications SET last_email = $1 WHERE (user_id = $2) AND (instance_id = $3)", expectedArgs: []interface{}{ &sql.NullString{String: "email@zitadel.com", Valid: true}, "agg-id", @@ -1247,7 +1261,7 @@ func TestUserProjection_reduces(t *testing.T) { executer: &testExecuter{ executions: []execution{ { - expectedStmt: "UPDATE projections.users12 SET (change_date, sequence) = ($1, $2) WHERE (id = $3) AND (instance_id = $4)", + expectedStmt: "UPDATE projections.users13 SET (change_date, sequence) = ($1, $2) WHERE (id = $3) AND (instance_id = $4)", expectedArgs: []interface{}{ anyArg{}, uint64(15), @@ -1256,7 +1270,7 @@ func TestUserProjection_reduces(t *testing.T) { }, }, { - expectedStmt: "UPDATE projections.users12_humans SET is_email_verified = $1 WHERE (user_id = $2) AND (instance_id = $3)", + expectedStmt: "UPDATE projections.users13_humans SET is_email_verified = $1 WHERE (user_id = $2) AND (instance_id = $3)", expectedArgs: []interface{}{ true, "agg-id", @@ -1264,7 +1278,7 @@ func TestUserProjection_reduces(t *testing.T) { }, }, { - expectedStmt: "UPDATE projections.users12_notifications SET verified_email = last_email WHERE (user_id = $1) AND (instance_id = $2)", + expectedStmt: "UPDATE projections.users13_notifications SET verified_email = last_email WHERE (user_id = $1) AND (instance_id = $2)", expectedArgs: []interface{}{ "agg-id", "instance-id", @@ -1291,7 +1305,7 @@ func TestUserProjection_reduces(t *testing.T) { executer: &testExecuter{ executions: []execution{ { - expectedStmt: "UPDATE projections.users12 SET (change_date, sequence) = ($1, $2) WHERE (id = $3) AND (instance_id = $4)", + expectedStmt: "UPDATE projections.users13 SET (change_date, sequence) = ($1, $2) WHERE (id = $3) AND (instance_id = $4)", expectedArgs: []interface{}{ anyArg{}, uint64(15), @@ -1300,7 +1314,7 @@ func TestUserProjection_reduces(t *testing.T) { }, }, { - expectedStmt: "UPDATE projections.users12_humans SET is_email_verified = $1 WHERE (user_id = $2) AND (instance_id = $3)", + expectedStmt: "UPDATE projections.users13_humans SET is_email_verified = $1 WHERE (user_id = $2) AND (instance_id = $3)", expectedArgs: []interface{}{ true, "agg-id", @@ -1308,7 +1322,7 @@ func TestUserProjection_reduces(t *testing.T) { }, }, { - expectedStmt: "UPDATE projections.users12_notifications SET verified_email = last_email WHERE (user_id = $1) AND (instance_id = $2)", + expectedStmt: "UPDATE projections.users13_notifications SET verified_email = last_email WHERE (user_id = $1) AND (instance_id = $2)", expectedArgs: []interface{}{ "agg-id", "instance-id", @@ -1337,7 +1351,7 @@ func TestUserProjection_reduces(t *testing.T) { executer: &testExecuter{ executions: []execution{ { - expectedStmt: "UPDATE projections.users12 SET (change_date, sequence) = ($1, $2) WHERE (id = $3) AND (instance_id = $4)", + expectedStmt: "UPDATE projections.users13 SET (change_date, sequence) = ($1, $2) WHERE (id = $3) AND (instance_id = $4)", expectedArgs: []interface{}{ anyArg{}, uint64(15), @@ -1346,7 +1360,7 @@ func TestUserProjection_reduces(t *testing.T) { }, }, { - expectedStmt: "UPDATE projections.users12_humans SET avatar_key = $1 WHERE (user_id = $2) AND (instance_id = $3)", + expectedStmt: "UPDATE projections.users13_humans SET avatar_key = $1 WHERE (user_id = $2) AND (instance_id = $3)", expectedArgs: []interface{}{ "users/agg-id/avatar", "agg-id", @@ -1374,7 +1388,7 @@ func TestUserProjection_reduces(t *testing.T) { executer: &testExecuter{ executions: []execution{ { - expectedStmt: "UPDATE projections.users12 SET (change_date, sequence) = ($1, $2) WHERE (id = $3) AND (instance_id = $4)", + expectedStmt: "UPDATE projections.users13 SET (change_date, sequence) = ($1, $2) WHERE (id = $3) AND (instance_id = $4)", expectedArgs: []interface{}{ anyArg{}, uint64(15), @@ -1383,7 +1397,7 @@ func TestUserProjection_reduces(t *testing.T) { }, }, { - expectedStmt: "UPDATE projections.users12_humans SET avatar_key = $1 WHERE (user_id = $2) AND (instance_id = $3)", + expectedStmt: "UPDATE projections.users13_humans SET avatar_key = $1 WHERE (user_id = $2) AND (instance_id = $3)", expectedArgs: []interface{}{ nil, "agg-id", @@ -1398,12 +1412,13 @@ func TestUserProjection_reduces(t *testing.T) { name: "reduceHumanPasswordChanged", args: args{ event: getEvent( - testEvent( + timedTestEvent( user.HumanPasswordChangedType, user.AggregateType, []byte(`{ "changeRequired": true }`), + testNow, ), user.HumanPasswordChangedEventMapper), }, reduce: (&userProjection{}).reduceHumanPasswordChanged, @@ -1413,15 +1428,16 @@ func TestUserProjection_reduces(t *testing.T) { executer: &testExecuter{ executions: []execution{ { - expectedStmt: "UPDATE projections.users12_humans SET password_change_required = $1 WHERE (user_id = $2) AND (instance_id = $3)", + expectedStmt: "UPDATE projections.users13_humans SET (password_change_required, password_changed) = ($1, $2) WHERE (user_id = $3) AND (instance_id = $4)", expectedArgs: []interface{}{ true, + &sql.NullTime{Time: testNow, Valid: true}, "agg-id", "instance-id", }, }, { - expectedStmt: "UPDATE projections.users12_notifications SET password_set = $1 WHERE (user_id = $2) AND (instance_id = $3)", + expectedStmt: "UPDATE projections.users13_notifications SET password_set = $1 WHERE (user_id = $2) AND (instance_id = $3)", expectedArgs: []interface{}{ true, "agg-id", @@ -1436,12 +1452,13 @@ func TestUserProjection_reduces(t *testing.T) { name: "reduceHumanPasswordChanged, false", args: args{ event: getEvent( - testEvent( + timedTestEvent( user.HumanPasswordChangedType, user.AggregateType, []byte(`{ "changeRequired": false }`), + testNow, ), user.HumanPasswordChangedEventMapper), }, reduce: (&userProjection{}).reduceHumanPasswordChanged, @@ -1451,15 +1468,16 @@ func TestUserProjection_reduces(t *testing.T) { executer: &testExecuter{ executions: []execution{ { - expectedStmt: "UPDATE projections.users12_humans SET password_change_required = $1 WHERE (user_id = $2) AND (instance_id = $3)", + expectedStmt: "UPDATE projections.users13_humans SET (password_change_required, password_changed) = ($1, $2) WHERE (user_id = $3) AND (instance_id = $4)", expectedArgs: []interface{}{ false, + &sql.NullTime{Time: testNow, Valid: true}, "agg-id", "instance-id", }, }, { - expectedStmt: "UPDATE projections.users12_notifications SET password_set = $1 WHERE (user_id = $2) AND (instance_id = $3)", + expectedStmt: "UPDATE projections.users13_notifications SET password_set = $1 WHERE (user_id = $2) AND (instance_id = $3)", expectedArgs: []interface{}{ true, "agg-id", @@ -1490,7 +1508,7 @@ func TestUserProjection_reduces(t *testing.T) { executer: &testExecuter{ executions: []execution{ { - expectedStmt: "INSERT INTO projections.users12 (id, creation_date, change_date, resource_owner, instance_id, state, sequence, username, type) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9)", + expectedStmt: "INSERT INTO projections.users13 (id, creation_date, change_date, resource_owner, instance_id, state, sequence, username, type) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9)", expectedArgs: []interface{}{ "agg-id", anyArg{}, @@ -1504,7 +1522,7 @@ func TestUserProjection_reduces(t *testing.T) { }, }, { - expectedStmt: "INSERT INTO projections.users12_machines (user_id, instance_id, name, description, access_token_type) VALUES ($1, $2, $3, $4, $5)", + expectedStmt: "INSERT INTO projections.users13_machines (user_id, instance_id, name, description, access_token_type) VALUES ($1, $2, $3, $4, $5)", expectedArgs: []interface{}{ "agg-id", "instance-id", @@ -1538,7 +1556,7 @@ func TestUserProjection_reduces(t *testing.T) { executer: &testExecuter{ executions: []execution{ { - expectedStmt: "INSERT INTO projections.users12 (id, creation_date, change_date, resource_owner, instance_id, state, sequence, username, type) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9)", + expectedStmt: "INSERT INTO projections.users13 (id, creation_date, change_date, resource_owner, instance_id, state, sequence, username, type) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9)", expectedArgs: []interface{}{ "agg-id", anyArg{}, @@ -1552,7 +1570,7 @@ func TestUserProjection_reduces(t *testing.T) { }, }, { - expectedStmt: "INSERT INTO projections.users12_machines (user_id, instance_id, name, description, access_token_type) VALUES ($1, $2, $3, $4, $5)", + expectedStmt: "INSERT INTO projections.users13_machines (user_id, instance_id, name, description, access_token_type) VALUES ($1, $2, $3, $4, $5)", expectedArgs: []interface{}{ "agg-id", "instance-id", @@ -1585,7 +1603,7 @@ func TestUserProjection_reduces(t *testing.T) { executer: &testExecuter{ executions: []execution{ { - expectedStmt: "UPDATE projections.users12 SET (change_date, sequence) = ($1, $2) WHERE (id = $3) AND (instance_id = $4)", + expectedStmt: "UPDATE projections.users13 SET (change_date, sequence) = ($1, $2) WHERE (id = $3) AND (instance_id = $4)", expectedArgs: []interface{}{ anyArg{}, uint64(15), @@ -1594,7 +1612,7 @@ func TestUserProjection_reduces(t *testing.T) { }, }, { - expectedStmt: "UPDATE projections.users12_machines SET (name, description) = ($1, $2) WHERE (user_id = $3) AND (instance_id = $4)", + expectedStmt: "UPDATE projections.users13_machines SET (name, description) = ($1, $2) WHERE (user_id = $3) AND (instance_id = $4)", expectedArgs: []interface{}{ "machine-name", "description", @@ -1625,7 +1643,7 @@ func TestUserProjection_reduces(t *testing.T) { executer: &testExecuter{ executions: []execution{ { - expectedStmt: "UPDATE projections.users12 SET (change_date, sequence) = ($1, $2) WHERE (id = $3) AND (instance_id = $4)", + expectedStmt: "UPDATE projections.users13 SET (change_date, sequence) = ($1, $2) WHERE (id = $3) AND (instance_id = $4)", expectedArgs: []interface{}{ anyArg{}, uint64(15), @@ -1634,7 +1652,7 @@ func TestUserProjection_reduces(t *testing.T) { }, }, { - expectedStmt: "UPDATE projections.users12_machines SET name = $1 WHERE (user_id = $2) AND (instance_id = $3)", + expectedStmt: "UPDATE projections.users13_machines SET name = $1 WHERE (user_id = $2) AND (instance_id = $3)", expectedArgs: []interface{}{ "machine-name", "agg-id", @@ -1664,7 +1682,7 @@ func TestUserProjection_reduces(t *testing.T) { executer: &testExecuter{ executions: []execution{ { - expectedStmt: "UPDATE projections.users12 SET (change_date, sequence) = ($1, $2) WHERE (id = $3) AND (instance_id = $4)", + expectedStmt: "UPDATE projections.users13 SET (change_date, sequence) = ($1, $2) WHERE (id = $3) AND (instance_id = $4)", expectedArgs: []interface{}{ anyArg{}, uint64(15), @@ -1673,7 +1691,7 @@ func TestUserProjection_reduces(t *testing.T) { }, }, { - expectedStmt: "UPDATE projections.users12_machines SET description = $1 WHERE (user_id = $2) AND (instance_id = $3)", + expectedStmt: "UPDATE projections.users13_machines SET description = $1 WHERE (user_id = $2) AND (instance_id = $3)", expectedArgs: []interface{}{ "description", "agg-id", @@ -1722,7 +1740,7 @@ func TestUserProjection_reduces(t *testing.T) { executer: &testExecuter{ executions: []execution{ { - expectedStmt: "UPDATE projections.users12 SET (change_date, sequence) = ($1, $2) WHERE (id = $3) AND (instance_id = $4)", + expectedStmt: "UPDATE projections.users13 SET (change_date, sequence) = ($1, $2) WHERE (id = $3) AND (instance_id = $4)", expectedArgs: []interface{}{ anyArg{}, uint64(15), @@ -1731,7 +1749,7 @@ func TestUserProjection_reduces(t *testing.T) { }, }, { - expectedStmt: "UPDATE projections.users12_machines SET secret = $1 WHERE (user_id = $2) AND (instance_id = $3)", + expectedStmt: "UPDATE projections.users13_machines SET secret = $1 WHERE (user_id = $2) AND (instance_id = $3)", expectedArgs: []interface{}{ "secret", "agg-id", @@ -1761,7 +1779,7 @@ func TestUserProjection_reduces(t *testing.T) { executer: &testExecuter{ executions: []execution{ { - expectedStmt: "UPDATE projections.users12 SET (change_date, sequence) = ($1, $2) WHERE (id = $3) AND (instance_id = $4)", + expectedStmt: "UPDATE projections.users13 SET (change_date, sequence) = ($1, $2) WHERE (id = $3) AND (instance_id = $4)", expectedArgs: []interface{}{ anyArg{}, uint64(15), @@ -1770,7 +1788,7 @@ func TestUserProjection_reduces(t *testing.T) { }, }, { - expectedStmt: "UPDATE projections.users12_machines SET secret = $1 WHERE (user_id = $2) AND (instance_id = $3)", + expectedStmt: "UPDATE projections.users13_machines SET secret = $1 WHERE (user_id = $2) AND (instance_id = $3)", expectedArgs: []interface{}{ "secret", "agg-id", @@ -1800,7 +1818,7 @@ func TestUserProjection_reduces(t *testing.T) { executer: &testExecuter{ executions: []execution{ { - expectedStmt: "UPDATE projections.users12 SET (change_date, sequence) = ($1, $2) WHERE (id = $3) AND (instance_id = $4)", + expectedStmt: "UPDATE projections.users13 SET (change_date, sequence) = ($1, $2) WHERE (id = $3) AND (instance_id = $4)", expectedArgs: []interface{}{ anyArg{}, uint64(15), @@ -1809,7 +1827,7 @@ func TestUserProjection_reduces(t *testing.T) { }, }, { - expectedStmt: "UPDATE projections.users12_machines SET secret = $1 WHERE (user_id = $2) AND (instance_id = $3)", + expectedStmt: "UPDATE projections.users13_machines SET secret = $1 WHERE (user_id = $2) AND (instance_id = $3)", expectedArgs: []interface{}{ "secret", "agg-id", @@ -1837,7 +1855,7 @@ func TestUserProjection_reduces(t *testing.T) { executer: &testExecuter{ executions: []execution{ { - expectedStmt: "UPDATE projections.users12 SET (change_date, sequence) = ($1, $2) WHERE (id = $3) AND (instance_id = $4)", + expectedStmt: "UPDATE projections.users13 SET (change_date, sequence) = ($1, $2) WHERE (id = $3) AND (instance_id = $4)", expectedArgs: []interface{}{ anyArg{}, uint64(15), @@ -1846,7 +1864,7 @@ func TestUserProjection_reduces(t *testing.T) { }, }, { - expectedStmt: "UPDATE projections.users12_machines SET secret = $1 WHERE (user_id = $2) AND (instance_id = $3)", + expectedStmt: "UPDATE projections.users13_machines SET secret = $1 WHERE (user_id = $2) AND (instance_id = $3)", expectedArgs: []interface{}{ nil, "agg-id", @@ -1874,7 +1892,7 @@ func TestUserProjection_reduces(t *testing.T) { executer: &testExecuter{ executions: []execution{ { - expectedStmt: "DELETE FROM projections.users12 WHERE (instance_id = $1) AND (resource_owner = $2)", + expectedStmt: "DELETE FROM projections.users13 WHERE (instance_id = $1) AND (resource_owner = $2)", expectedArgs: []interface{}{ "instance-id", "agg-id", @@ -1901,7 +1919,7 @@ func TestUserProjection_reduces(t *testing.T) { executer: &testExecuter{ executions: []execution{ { - expectedStmt: "DELETE FROM projections.users12 WHERE (instance_id = $1)", + expectedStmt: "DELETE FROM projections.users13 WHERE (instance_id = $1)", expectedArgs: []interface{}{ "agg-id", }, diff --git a/internal/query/sessions_test.go b/internal/query/sessions_test.go index 9b08b43441..c7929a98a8 100644 --- a/internal/query/sessions_test.go +++ b/internal/query/sessions_test.go @@ -31,7 +31,7 @@ var ( ` projections.sessions8.user_resource_owner,` + ` projections.sessions8.user_checked_at,` + ` projections.login_names3.login_name,` + - ` projections.users12_humans.display_name,` + + ` projections.users13_humans.display_name,` + ` projections.sessions8.password_checked_at,` + ` projections.sessions8.intent_checked_at,` + ` projections.sessions8.webauthn_checked_at,` + @@ -48,8 +48,8 @@ var ( ` projections.sessions8.expiration` + ` FROM projections.sessions8` + ` LEFT JOIN projections.login_names3 ON projections.sessions8.user_id = projections.login_names3.user_id AND projections.sessions8.instance_id = projections.login_names3.instance_id` + - ` LEFT JOIN projections.users12_humans ON projections.sessions8.user_id = projections.users12_humans.user_id AND projections.sessions8.instance_id = projections.users12_humans.instance_id` + - ` LEFT JOIN projections.users12 ON projections.sessions8.user_id = projections.users12.id AND projections.sessions8.instance_id = projections.users12.instance_id` + + ` LEFT JOIN projections.users13_humans ON projections.sessions8.user_id = projections.users13_humans.user_id AND projections.sessions8.instance_id = projections.users13_humans.instance_id` + + ` LEFT JOIN projections.users13 ON projections.sessions8.user_id = projections.users13.id AND projections.sessions8.instance_id = projections.users13.instance_id` + ` AS OF SYSTEM TIME '-1 ms'`) expectedSessionsQuery = regexp.QuoteMeta(`SELECT projections.sessions8.id,` + ` projections.sessions8.creation_date,` + @@ -62,7 +62,7 @@ var ( ` projections.sessions8.user_resource_owner,` + ` projections.sessions8.user_checked_at,` + ` projections.login_names3.login_name,` + - ` projections.users12_humans.display_name,` + + ` projections.users13_humans.display_name,` + ` projections.sessions8.password_checked_at,` + ` projections.sessions8.intent_checked_at,` + ` projections.sessions8.webauthn_checked_at,` + @@ -75,8 +75,8 @@ var ( ` COUNT(*) OVER ()` + ` FROM projections.sessions8` + ` LEFT JOIN projections.login_names3 ON projections.sessions8.user_id = projections.login_names3.user_id AND projections.sessions8.instance_id = projections.login_names3.instance_id` + - ` LEFT JOIN projections.users12_humans ON projections.sessions8.user_id = projections.users12_humans.user_id AND projections.sessions8.instance_id = projections.users12_humans.instance_id` + - ` LEFT JOIN projections.users12 ON projections.sessions8.user_id = projections.users12.id AND projections.sessions8.instance_id = projections.users12.instance_id` + + ` LEFT JOIN projections.users13_humans ON projections.sessions8.user_id = projections.users13_humans.user_id AND projections.sessions8.instance_id = projections.users13_humans.instance_id` + + ` LEFT JOIN projections.users13 ON projections.sessions8.user_id = projections.users13.id AND projections.sessions8.instance_id = projections.users13.instance_id` + ` AS OF SYSTEM TIME '-1 ms'`) sessionCols = []string{ diff --git a/internal/query/user.go b/internal/query/user.go index cb48346e45..bb3758b17b 100644 --- a/internal/query/user.go +++ b/internal/query/user.go @@ -53,6 +53,7 @@ type Human struct { Phone domain.PhoneNumber `json:"phone,omitempty"` IsPhoneVerified bool `json:"is_phone_verified,omitempty"` PasswordChangeRequired bool `json:"password_change_required,omitempty"` + PasswordChanged time.Time `json:"password_changed,omitempty"` } type Profile struct { @@ -280,6 +281,10 @@ var ( name: projection.HumanPasswordChangeRequired, table: humanTable, } + HumanPasswordChangedCol = Column{ + name: projection.HumanPasswordChanged, + table: humanTable, + } ) var ( @@ -822,6 +827,7 @@ func scanUser(row *sql.Row) (*User, error) { phone := sql.NullString{} isPhoneVerified := sql.NullBool{} passwordChangeRequired := sql.NullBool{} + passwordChanged := sql.NullTime{} machineID := sql.NullString{} name := sql.NullString{} @@ -853,6 +859,7 @@ func scanUser(row *sql.Row) (*User, error) { &phone, &isPhoneVerified, &passwordChangeRequired, + &passwordChanged, &machineID, &name, &description, @@ -884,6 +891,7 @@ func scanUser(row *sql.Row) (*User, error) { Phone: domain.PhoneNumber(phone.String), IsPhoneVerified: isPhoneVerified.Bool, PasswordChangeRequired: passwordChangeRequired.Bool, + PasswordChanged: passwordChanged.Time, } } else if machineID.Valid { u.Machine = &Machine{ @@ -929,6 +937,7 @@ func prepareUserQuery(ctx context.Context, db prepareDatabase) (sq.SelectBuilder HumanPhoneCol.identifier(), HumanIsPhoneVerifiedCol.identifier(), HumanPasswordChangeRequiredCol.identifier(), + HumanPasswordChangedCol.identifier(), MachineUserIDCol.identifier(), MachineNameCol.identifier(), MachineDescriptionCol.identifier(), @@ -1316,6 +1325,7 @@ func prepareUsersQuery(ctx context.Context, db prepareDatabase) (sq.SelectBuilde HumanPhoneCol.identifier(), HumanIsPhoneVerifiedCol.identifier(), HumanPasswordChangeRequiredCol.identifier(), + HumanPasswordChangedCol.identifier(), MachineUserIDCol.identifier(), MachineNameCol.identifier(), MachineDescriptionCol.identifier(), @@ -1355,6 +1365,7 @@ func prepareUsersQuery(ctx context.Context, db prepareDatabase) (sq.SelectBuilde phone := sql.NullString{} isPhoneVerified := sql.NullBool{} passwordChangeRequired := sql.NullBool{} + passwordChanged := sql.NullTime{} machineID := sql.NullString{} name := sql.NullString{} @@ -1386,6 +1397,7 @@ func prepareUsersQuery(ctx context.Context, db prepareDatabase) (sq.SelectBuilde &phone, &isPhoneVerified, &passwordChangeRequired, + &passwordChanged, &machineID, &name, &description, @@ -1416,6 +1428,7 @@ func prepareUsersQuery(ctx context.Context, db prepareDatabase) (sq.SelectBuilde Phone: domain.PhoneNumber(phone.String), IsPhoneVerified: isPhoneVerified.Bool, PasswordChangeRequired: passwordChangeRequired.Bool, + PasswordChanged: passwordChanged.Time, } } else if machineID.Valid { u.Machine = &Machine{ diff --git a/internal/query/user_auth_method_test.go b/internal/query/user_auth_method_test.go index b75e6fd461..59004f5daa 100644 --- a/internal/query/user_auth_method_test.go +++ b/internal/query/user_auth_method_test.go @@ -40,29 +40,29 @@ var ( "method_type", "count", } - prepareActiveAuthMethodTypesStmt = `SELECT projections.users12_notifications.password_set,` + + prepareActiveAuthMethodTypesStmt = `SELECT projections.users13_notifications.password_set,` + ` auth_method_types.method_type,` + ` user_idps_count.count` + - ` FROM projections.users12` + - ` LEFT JOIN projections.users12_notifications ON projections.users12.id = projections.users12_notifications.user_id AND projections.users12.instance_id = projections.users12_notifications.instance_id` + + ` FROM projections.users13` + + ` LEFT JOIN projections.users13_notifications ON projections.users13.id = projections.users13_notifications.user_id AND projections.users13.instance_id = projections.users13_notifications.instance_id` + ` LEFT JOIN (SELECT DISTINCT(auth_method_types.method_type), auth_method_types.user_id, auth_method_types.instance_id FROM projections.user_auth_methods4 AS auth_method_types` + ` WHERE auth_method_types.state = $1) AS auth_method_types` + - ` ON auth_method_types.user_id = projections.users12.id AND auth_method_types.instance_id = projections.users12.instance_id` + + ` ON auth_method_types.user_id = projections.users13.id AND auth_method_types.instance_id = projections.users13.instance_id` + ` LEFT JOIN (SELECT user_idps_count.user_id, user_idps_count.instance_id, COUNT(user_idps_count.user_id) AS count FROM projections.idp_user_links3 AS user_idps_count` + ` GROUP BY user_idps_count.user_id, user_idps_count.instance_id) AS user_idps_count` + - ` ON user_idps_count.user_id = projections.users12.id AND user_idps_count.instance_id = projections.users12.instance_id` + + ` ON user_idps_count.user_id = projections.users13.id AND user_idps_count.instance_id = projections.users13.instance_id` + ` AS OF SYSTEM TIME '-1 ms` prepareActiveAuthMethodTypesCols = []string{ "password_set", "method_type", "idps_count", } - prepareAuthMethodTypesRequiredStmt = `SELECT projections.users12.type,` + + prepareAuthMethodTypesRequiredStmt = `SELECT projections.users13.type,` + ` auth_methods_force_mfa.force_mfa,` + ` auth_methods_force_mfa.force_mfa_local_only` + - ` FROM projections.users12` + + ` FROM projections.users13` + ` LEFT JOIN (SELECT auth_methods_force_mfa.force_mfa, auth_methods_force_mfa.force_mfa_local_only, auth_methods_force_mfa.instance_id, auth_methods_force_mfa.aggregate_id, auth_methods_force_mfa.is_default FROM projections.login_policies5 AS auth_methods_force_mfa) AS auth_methods_force_mfa` + - ` ON (auth_methods_force_mfa.aggregate_id = projections.users12.instance_id OR auth_methods_force_mfa.aggregate_id = projections.users12.resource_owner) AND auth_methods_force_mfa.instance_id = projections.users12.instance_id` + + ` ON (auth_methods_force_mfa.aggregate_id = projections.users13.instance_id OR auth_methods_force_mfa.aggregate_id = projections.users13.resource_owner) AND auth_methods_force_mfa.instance_id = projections.users13.instance_id` + ` ORDER BY auth_methods_force_mfa.is_default LIMIT 1 ` prepareAuthMethodTypesRequiredCols = []string{ diff --git a/internal/query/user_by_id.sql b/internal/query/user_by_id.sql index 766464605d..2871f08893 100644 --- a/internal/query/user_by_id.sql +++ b/internal/query/user_by_id.sql @@ -59,20 +59,21 @@ SELECT , h.phone , h.is_phone_verified , h.password_change_required + , h.password_changed , m.user_id , m.name , m.description , m.secret , m.access_token_type , count(*) OVER () -FROM projections.users12 u +FROM projections.users13 u LEFT JOIN - projections.users12_humans h + projections.users13_humans h ON u.id = h.user_id AND u.instance_id = h.instance_id LEFT JOIN - projections.users12_machines m + projections.users13_machines m ON u.id = m.user_id AND u.instance_id = m.instance_id diff --git a/internal/query/user_by_login_name.sql b/internal/query/user_by_login_name.sql index fb513a953b..6890d83863 100644 --- a/internal/query/user_by_login_name.sql +++ b/internal/query/user_by_login_name.sql @@ -74,6 +74,7 @@ SELECT , h.phone , h.is_phone_verified , h.password_change_required + , h.password_changed , m.user_id , m.name , m.description @@ -82,17 +83,17 @@ SELECT , count(*) OVER () FROM found_users fu JOIN - projections.users12 u + projections.users13 u ON fu.id = u.id AND fu.instance_id = u.instance_id LEFT JOIN - projections.users12_humans h + projections.users13_humans h ON fu.id = h.user_id AND fu.instance_id = h.instance_id LEFT JOIN - projections.users12_machines m + projections.users13_machines m ON fu.id = m.user_id AND fu.instance_id = m.instance_id diff --git a/internal/query/user_grant_test.go b/internal/query/user_grant_test.go index 2e5b1c3bf6..3bc9b38f69 100644 --- a/internal/query/user_grant_test.go +++ b/internal/query/user_grant_test.go @@ -23,14 +23,14 @@ var ( ", projections.user_grants5.roles" + ", projections.user_grants5.state" + ", projections.user_grants5.user_id" + - ", projections.users12.username" + - ", projections.users12.type" + - ", projections.users12.resource_owner" + - ", projections.users12_humans.first_name" + - ", projections.users12_humans.last_name" + - ", projections.users12_humans.email" + - ", projections.users12_humans.display_name" + - ", projections.users12_humans.avatar_key" + + ", projections.users13.username" + + ", projections.users13.type" + + ", projections.users13.resource_owner" + + ", projections.users13_humans.first_name" + + ", projections.users13_humans.last_name" + + ", projections.users13_humans.email" + + ", projections.users13_humans.display_name" + + ", projections.users13_humans.avatar_key" + ", projections.login_names3.login_name" + ", projections.user_grants5.resource_owner" + ", projections.orgs1.name" + @@ -41,11 +41,11 @@ var ( ", granted_orgs.name" + ", granted_orgs.primary_domain" + " FROM projections.user_grants5" + - " LEFT JOIN projections.users12 ON projections.user_grants5.user_id = projections.users12.id AND projections.user_grants5.instance_id = projections.users12.instance_id" + - " LEFT JOIN projections.users12_humans ON projections.user_grants5.user_id = projections.users12_humans.user_id AND projections.user_grants5.instance_id = projections.users12_humans.instance_id" + + " LEFT JOIN projections.users13 ON projections.user_grants5.user_id = projections.users13.id AND projections.user_grants5.instance_id = projections.users13.instance_id" + + " LEFT JOIN projections.users13_humans ON projections.user_grants5.user_id = projections.users13_humans.user_id AND projections.user_grants5.instance_id = projections.users13_humans.instance_id" + " LEFT JOIN projections.orgs1 ON projections.user_grants5.resource_owner = projections.orgs1.id AND projections.user_grants5.instance_id = projections.orgs1.instance_id" + " LEFT JOIN projections.projects4 ON projections.user_grants5.project_id = projections.projects4.id AND projections.user_grants5.instance_id = projections.projects4.instance_id" + - " LEFT JOIN projections.orgs1 AS granted_orgs ON projections.users12.resource_owner = granted_orgs.id AND projections.users12.instance_id = granted_orgs.instance_id" + + " LEFT JOIN projections.orgs1 AS granted_orgs ON projections.users13.resource_owner = granted_orgs.id AND projections.users13.instance_id = granted_orgs.instance_id" + " LEFT JOIN projections.login_names3 ON projections.user_grants5.user_id = projections.login_names3.user_id AND projections.user_grants5.instance_id = projections.login_names3.instance_id" + ` AS OF SYSTEM TIME '-1 ms' ` + " WHERE projections.login_names3.is_primary = $1") @@ -85,14 +85,14 @@ var ( ", projections.user_grants5.roles" + ", projections.user_grants5.state" + ", projections.user_grants5.user_id" + - ", projections.users12.username" + - ", projections.users12.type" + - ", projections.users12.resource_owner" + - ", projections.users12_humans.first_name" + - ", projections.users12_humans.last_name" + - ", projections.users12_humans.email" + - ", projections.users12_humans.display_name" + - ", projections.users12_humans.avatar_key" + + ", projections.users13.username" + + ", projections.users13.type" + + ", projections.users13.resource_owner" + + ", projections.users13_humans.first_name" + + ", projections.users13_humans.last_name" + + ", projections.users13_humans.email" + + ", projections.users13_humans.display_name" + + ", projections.users13_humans.avatar_key" + ", projections.login_names3.login_name" + ", projections.user_grants5.resource_owner" + ", projections.orgs1.name" + @@ -104,11 +104,11 @@ var ( ", granted_orgs.primary_domain" + ", COUNT(*) OVER ()" + " FROM projections.user_grants5" + - " LEFT JOIN projections.users12 ON projections.user_grants5.user_id = projections.users12.id AND projections.user_grants5.instance_id = projections.users12.instance_id" + - " LEFT JOIN projections.users12_humans ON projections.user_grants5.user_id = projections.users12_humans.user_id AND projections.user_grants5.instance_id = projections.users12_humans.instance_id" + + " LEFT JOIN projections.users13 ON projections.user_grants5.user_id = projections.users13.id AND projections.user_grants5.instance_id = projections.users13.instance_id" + + " LEFT JOIN projections.users13_humans ON projections.user_grants5.user_id = projections.users13_humans.user_id AND projections.user_grants5.instance_id = projections.users13_humans.instance_id" + " LEFT JOIN projections.orgs1 ON projections.user_grants5.resource_owner = projections.orgs1.id AND projections.user_grants5.instance_id = projections.orgs1.instance_id" + " LEFT JOIN projections.projects4 ON projections.user_grants5.project_id = projections.projects4.id AND projections.user_grants5.instance_id = projections.projects4.instance_id" + - " LEFT JOIN projections.orgs1 AS granted_orgs ON projections.users12.resource_owner = granted_orgs.id AND projections.users12.instance_id = granted_orgs.instance_id" + + " LEFT JOIN projections.orgs1 AS granted_orgs ON projections.users13.resource_owner = granted_orgs.id AND projections.users13.instance_id = granted_orgs.instance_id" + " LEFT JOIN projections.login_names3 ON projections.user_grants5.user_id = projections.login_names3.user_id AND projections.user_grants5.instance_id = projections.login_names3.instance_id" + ` AS OF SYSTEM TIME '-1 ms' ` + " WHERE projections.login_names3.is_primary = $1") diff --git a/internal/query/user_notify_by_id.sql b/internal/query/user_notify_by_id.sql index 94134c2b9f..19c2ebe82b 100644 --- a/internal/query/user_notify_by_id.sql +++ b/internal/query/user_notify_by_id.sql @@ -62,14 +62,14 @@ SELECT , n.verified_phone , n.password_set , count(*) OVER () -FROM projections.users12 u +FROM projections.users13 u LEFT JOIN - projections.users12_humans h + projections.users13_humans h ON u.id = h.user_id AND u.instance_id = h.instance_id LEFT JOIN - projections.users12_notifications n + projections.users13_notifications n ON u.id = n.user_id AND u.instance_id = n.instance_id diff --git a/internal/query/user_notify_by_login_name.sql b/internal/query/user_notify_by_login_name.sql index 74c5e330a0..154907d620 100644 --- a/internal/query/user_notify_by_login_name.sql +++ b/internal/query/user_notify_by_login_name.sql @@ -78,17 +78,17 @@ SELECT , count(*) OVER () FROM found_users fu JOIN - projections.users12 u + projections.users13 u ON fu.id = u.id AND fu.instance_id = u.instance_id LEFT JOIN - projections.users12_humans h + projections.users13_humans h ON fu.id = h.user_id AND fu.instance_id = h.instance_id LEFT JOIN - projections.users12_notifications n + projections.users13_notifications n ON fu.id = n.user_id AND fu.instance_id = n.instance_id diff --git a/internal/query/user_test.go b/internal/query/user_test.go index 55dd1f1b69..04271fb649 100644 --- a/internal/query/user_test.go +++ b/internal/query/user_test.go @@ -147,44 +147,45 @@ var ( preferredLoginNameQuery = `SELECT preferred_login_name.user_id, preferred_login_name.login_name, preferred_login_name.instance_id` + ` FROM projections.login_names3 AS preferred_login_name` + ` WHERE preferred_login_name.is_primary = $1` - userQuery = `SELECT projections.users12.id,` + - ` projections.users12.creation_date,` + - ` projections.users12.change_date,` + - ` projections.users12.resource_owner,` + - ` projections.users12.sequence,` + - ` projections.users12.state,` + - ` projections.users12.type,` + - ` projections.users12.username,` + + userQuery = `SELECT projections.users13.id,` + + ` projections.users13.creation_date,` + + ` projections.users13.change_date,` + + ` projections.users13.resource_owner,` + + ` projections.users13.sequence,` + + ` projections.users13.state,` + + ` projections.users13.type,` + + ` projections.users13.username,` + ` login_names.loginnames,` + ` preferred_login_name.login_name,` + - ` projections.users12_humans.user_id,` + - ` projections.users12_humans.first_name,` + - ` projections.users12_humans.last_name,` + - ` projections.users12_humans.nick_name,` + - ` projections.users12_humans.display_name,` + - ` projections.users12_humans.preferred_language,` + - ` projections.users12_humans.gender,` + - ` projections.users12_humans.avatar_key,` + - ` projections.users12_humans.email,` + - ` projections.users12_humans.is_email_verified,` + - ` projections.users12_humans.phone,` + - ` projections.users12_humans.is_phone_verified,` + - ` projections.users12_humans.password_change_required,` + - ` projections.users12_machines.user_id,` + - ` projections.users12_machines.name,` + - ` projections.users12_machines.description,` + - ` projections.users12_machines.secret,` + - ` projections.users12_machines.access_token_type,` + + ` projections.users13_humans.user_id,` + + ` projections.users13_humans.first_name,` + + ` projections.users13_humans.last_name,` + + ` projections.users13_humans.nick_name,` + + ` projections.users13_humans.display_name,` + + ` projections.users13_humans.preferred_language,` + + ` projections.users13_humans.gender,` + + ` projections.users13_humans.avatar_key,` + + ` projections.users13_humans.email,` + + ` projections.users13_humans.is_email_verified,` + + ` projections.users13_humans.phone,` + + ` projections.users13_humans.is_phone_verified,` + + ` projections.users13_humans.password_change_required,` + + ` projections.users13_humans.password_changed,` + + ` projections.users13_machines.user_id,` + + ` projections.users13_machines.name,` + + ` projections.users13_machines.description,` + + ` projections.users13_machines.secret,` + + ` projections.users13_machines.access_token_type,` + ` COUNT(*) OVER ()` + - ` FROM projections.users12` + - ` LEFT JOIN projections.users12_humans ON projections.users12.id = projections.users12_humans.user_id AND projections.users12.instance_id = projections.users12_humans.instance_id` + - ` LEFT JOIN projections.users12_machines ON projections.users12.id = projections.users12_machines.user_id AND projections.users12.instance_id = projections.users12_machines.instance_id` + + ` FROM projections.users13` + + ` LEFT JOIN projections.users13_humans ON projections.users13.id = projections.users13_humans.user_id AND projections.users13.instance_id = projections.users13_humans.instance_id` + + ` LEFT JOIN projections.users13_machines ON projections.users13.id = projections.users13_machines.user_id AND projections.users13.instance_id = projections.users13_machines.instance_id` + ` LEFT JOIN` + ` (` + loginNamesQuery + `) AS login_names` + - ` ON login_names.user_id = projections.users12.id AND login_names.instance_id = projections.users12.instance_id` + + ` ON login_names.user_id = projections.users13.id AND login_names.instance_id = projections.users13.instance_id` + ` LEFT JOIN` + ` (` + preferredLoginNameQuery + `) AS preferred_login_name` + - ` ON preferred_login_name.user_id = projections.users12.id AND preferred_login_name.instance_id = projections.users12.instance_id` + + ` ON preferred_login_name.user_id = projections.users13.id AND preferred_login_name.instance_id = projections.users13.instance_id` + ` AS OF SYSTEM TIME '-1 ms'` userCols = []string{ "id", @@ -211,6 +212,7 @@ var ( "phone", "is_phone_verified", "password_change_required", + "password_changed", // machine "user_id", "name", @@ -219,21 +221,21 @@ var ( "access_token_type", "count", } - profileQuery = `SELECT projections.users12.id,` + - ` projections.users12.creation_date,` + - ` projections.users12.change_date,` + - ` projections.users12.resource_owner,` + - ` projections.users12.sequence,` + - ` projections.users12_humans.user_id,` + - ` projections.users12_humans.first_name,` + - ` projections.users12_humans.last_name,` + - ` projections.users12_humans.nick_name,` + - ` projections.users12_humans.display_name,` + - ` projections.users12_humans.preferred_language,` + - ` projections.users12_humans.gender,` + - ` projections.users12_humans.avatar_key` + - ` FROM projections.users12` + - ` LEFT JOIN projections.users12_humans ON projections.users12.id = projections.users12_humans.user_id AND projections.users12.instance_id = projections.users12_humans.instance_id` + + profileQuery = `SELECT projections.users13.id,` + + ` projections.users13.creation_date,` + + ` projections.users13.change_date,` + + ` projections.users13.resource_owner,` + + ` projections.users13.sequence,` + + ` projections.users13_humans.user_id,` + + ` projections.users13_humans.first_name,` + + ` projections.users13_humans.last_name,` + + ` projections.users13_humans.nick_name,` + + ` projections.users13_humans.display_name,` + + ` projections.users13_humans.preferred_language,` + + ` projections.users13_humans.gender,` + + ` projections.users13_humans.avatar_key` + + ` FROM projections.users13` + + ` LEFT JOIN projections.users13_humans ON projections.users13.id = projections.users13_humans.user_id AND projections.users13.instance_id = projections.users13_humans.instance_id` + ` AS OF SYSTEM TIME '-1 ms'` profileCols = []string{ "id", @@ -250,16 +252,16 @@ var ( "gender", "avatar_key", } - emailQuery = `SELECT projections.users12.id,` + - ` projections.users12.creation_date,` + - ` projections.users12.change_date,` + - ` projections.users12.resource_owner,` + - ` projections.users12.sequence,` + - ` projections.users12_humans.user_id,` + - ` projections.users12_humans.email,` + - ` projections.users12_humans.is_email_verified` + - ` FROM projections.users12` + - ` LEFT JOIN projections.users12_humans ON projections.users12.id = projections.users12_humans.user_id AND projections.users12.instance_id = projections.users12_humans.instance_id` + + emailQuery = `SELECT projections.users13.id,` + + ` projections.users13.creation_date,` + + ` projections.users13.change_date,` + + ` projections.users13.resource_owner,` + + ` projections.users13.sequence,` + + ` projections.users13_humans.user_id,` + + ` projections.users13_humans.email,` + + ` projections.users13_humans.is_email_verified` + + ` FROM projections.users13` + + ` LEFT JOIN projections.users13_humans ON projections.users13.id = projections.users13_humans.user_id AND projections.users13.instance_id = projections.users13_humans.instance_id` + ` AS OF SYSTEM TIME '-1 ms'` emailCols = []string{ "id", @@ -271,16 +273,16 @@ var ( "email", "is_email_verified", } - phoneQuery = `SELECT projections.users12.id,` + - ` projections.users12.creation_date,` + - ` projections.users12.change_date,` + - ` projections.users12.resource_owner,` + - ` projections.users12.sequence,` + - ` projections.users12_humans.user_id,` + - ` projections.users12_humans.phone,` + - ` projections.users12_humans.is_phone_verified` + - ` FROM projections.users12` + - ` LEFT JOIN projections.users12_humans ON projections.users12.id = projections.users12_humans.user_id AND projections.users12.instance_id = projections.users12_humans.instance_id` + + phoneQuery = `SELECT projections.users13.id,` + + ` projections.users13.creation_date,` + + ` projections.users13.change_date,` + + ` projections.users13.resource_owner,` + + ` projections.users13.sequence,` + + ` projections.users13_humans.user_id,` + + ` projections.users13_humans.phone,` + + ` projections.users13_humans.is_phone_verified` + + ` FROM projections.users13` + + ` LEFT JOIN projections.users13_humans ON projections.users13.id = projections.users13_humans.user_id AND projections.users13.instance_id = projections.users13_humans.instance_id` + ` AS OF SYSTEM TIME '-1 ms'` phoneCols = []string{ "id", @@ -292,14 +294,14 @@ var ( "phone", "is_phone_verified", } - userUniqueQuery = `SELECT projections.users12.id,` + - ` projections.users12.state,` + - ` projections.users12.username,` + - ` projections.users12_humans.user_id,` + - ` projections.users12_humans.email,` + - ` projections.users12_humans.is_email_verified` + - ` FROM projections.users12` + - ` LEFT JOIN projections.users12_humans ON projections.users12.id = projections.users12_humans.user_id AND projections.users12.instance_id = projections.users12_humans.instance_id` + + userUniqueQuery = `SELECT projections.users13.id,` + + ` projections.users13.state,` + + ` projections.users13.username,` + + ` projections.users13_humans.user_id,` + + ` projections.users13_humans.email,` + + ` projections.users13_humans.is_email_verified` + + ` FROM projections.users13` + + ` LEFT JOIN projections.users13_humans ON projections.users13.id = projections.users13_humans.user_id AND projections.users13.instance_id = projections.users13_humans.instance_id` + ` AS OF SYSTEM TIME '-1 ms'` userUniqueCols = []string{ "id", @@ -309,40 +311,40 @@ var ( "email", "is_email_verified", } - notifyUserQuery = `SELECT projections.users12.id,` + - ` projections.users12.creation_date,` + - ` projections.users12.change_date,` + - ` projections.users12.resource_owner,` + - ` projections.users12.sequence,` + - ` projections.users12.state,` + - ` projections.users12.type,` + - ` projections.users12.username,` + + notifyUserQuery = `SELECT projections.users13.id,` + + ` projections.users13.creation_date,` + + ` projections.users13.change_date,` + + ` projections.users13.resource_owner,` + + ` projections.users13.sequence,` + + ` projections.users13.state,` + + ` projections.users13.type,` + + ` projections.users13.username,` + ` login_names.loginnames,` + ` preferred_login_name.login_name,` + - ` projections.users12_humans.user_id,` + - ` projections.users12_humans.first_name,` + - ` projections.users12_humans.last_name,` + - ` projections.users12_humans.nick_name,` + - ` projections.users12_humans.display_name,` + - ` projections.users12_humans.preferred_language,` + - ` projections.users12_humans.gender,` + - ` projections.users12_humans.avatar_key,` + - ` projections.users12_notifications.user_id,` + - ` projections.users12_notifications.last_email,` + - ` projections.users12_notifications.verified_email,` + - ` projections.users12_notifications.last_phone,` + - ` projections.users12_notifications.verified_phone,` + - ` projections.users12_notifications.password_set,` + + ` projections.users13_humans.user_id,` + + ` projections.users13_humans.first_name,` + + ` projections.users13_humans.last_name,` + + ` projections.users13_humans.nick_name,` + + ` projections.users13_humans.display_name,` + + ` projections.users13_humans.preferred_language,` + + ` projections.users13_humans.gender,` + + ` projections.users13_humans.avatar_key,` + + ` projections.users13_notifications.user_id,` + + ` projections.users13_notifications.last_email,` + + ` projections.users13_notifications.verified_email,` + + ` projections.users13_notifications.last_phone,` + + ` projections.users13_notifications.verified_phone,` + + ` projections.users13_notifications.password_set,` + ` COUNT(*) OVER ()` + - ` FROM projections.users12` + - ` LEFT JOIN projections.users12_humans ON projections.users12.id = projections.users12_humans.user_id AND projections.users12.instance_id = projections.users12_humans.instance_id` + - ` LEFT JOIN projections.users12_notifications ON projections.users12.id = projections.users12_notifications.user_id AND projections.users12.instance_id = projections.users12_notifications.instance_id` + + ` FROM projections.users13` + + ` LEFT JOIN projections.users13_humans ON projections.users13.id = projections.users13_humans.user_id AND projections.users13.instance_id = projections.users13_humans.instance_id` + + ` LEFT JOIN projections.users13_notifications ON projections.users13.id = projections.users13_notifications.user_id AND projections.users13.instance_id = projections.users13_notifications.instance_id` + ` LEFT JOIN` + ` (` + loginNamesQuery + `) AS login_names` + - ` ON login_names.user_id = projections.users12.id AND login_names.instance_id = projections.users12.instance_id` + + ` ON login_names.user_id = projections.users13.id AND login_names.instance_id = projections.users13.instance_id` + ` LEFT JOIN` + ` (` + preferredLoginNameQuery + `) AS preferred_login_name` + - ` ON preferred_login_name.user_id = projections.users12.id AND preferred_login_name.instance_id = projections.users12.instance_id` + + ` ON preferred_login_name.user_id = projections.users13.id AND preferred_login_name.instance_id = projections.users13.instance_id` + ` AS OF SYSTEM TIME '-1 ms'` notifyUserCols = []string{ "id", @@ -373,44 +375,45 @@ var ( "password_set", "count", } - usersQuery = `SELECT projections.users12.id,` + - ` projections.users12.creation_date,` + - ` projections.users12.change_date,` + - ` projections.users12.resource_owner,` + - ` projections.users12.sequence,` + - ` projections.users12.state,` + - ` projections.users12.type,` + - ` projections.users12.username,` + + usersQuery = `SELECT projections.users13.id,` + + ` projections.users13.creation_date,` + + ` projections.users13.change_date,` + + ` projections.users13.resource_owner,` + + ` projections.users13.sequence,` + + ` projections.users13.state,` + + ` projections.users13.type,` + + ` projections.users13.username,` + ` login_names.loginnames,` + ` preferred_login_name.login_name,` + - ` projections.users12_humans.user_id,` + - ` projections.users12_humans.first_name,` + - ` projections.users12_humans.last_name,` + - ` projections.users12_humans.nick_name,` + - ` projections.users12_humans.display_name,` + - ` projections.users12_humans.preferred_language,` + - ` projections.users12_humans.gender,` + - ` projections.users12_humans.avatar_key,` + - ` projections.users12_humans.email,` + - ` projections.users12_humans.is_email_verified,` + - ` projections.users12_humans.phone,` + - ` projections.users12_humans.is_phone_verified,` + - ` projections.users12_humans.password_change_required,` + - ` projections.users12_machines.user_id,` + - ` projections.users12_machines.name,` + - ` projections.users12_machines.description,` + - ` projections.users12_machines.secret,` + - ` projections.users12_machines.access_token_type,` + + ` projections.users13_humans.user_id,` + + ` projections.users13_humans.first_name,` + + ` projections.users13_humans.last_name,` + + ` projections.users13_humans.nick_name,` + + ` projections.users13_humans.display_name,` + + ` projections.users13_humans.preferred_language,` + + ` projections.users13_humans.gender,` + + ` projections.users13_humans.avatar_key,` + + ` projections.users13_humans.email,` + + ` projections.users13_humans.is_email_verified,` + + ` projections.users13_humans.phone,` + + ` projections.users13_humans.is_phone_verified,` + + ` projections.users13_humans.password_change_required,` + + ` projections.users13_humans.password_changed,` + + ` projections.users13_machines.user_id,` + + ` projections.users13_machines.name,` + + ` projections.users13_machines.description,` + + ` projections.users13_machines.secret,` + + ` projections.users13_machines.access_token_type,` + ` COUNT(*) OVER ()` + - ` FROM projections.users12` + - ` LEFT JOIN projections.users12_humans ON projections.users12.id = projections.users12_humans.user_id AND projections.users12.instance_id = projections.users12_humans.instance_id` + - ` LEFT JOIN projections.users12_machines ON projections.users12.id = projections.users12_machines.user_id AND projections.users12.instance_id = projections.users12_machines.instance_id` + + ` FROM projections.users13` + + ` LEFT JOIN projections.users13_humans ON projections.users13.id = projections.users13_humans.user_id AND projections.users13.instance_id = projections.users13_humans.instance_id` + + ` LEFT JOIN projections.users13_machines ON projections.users13.id = projections.users13_machines.user_id AND projections.users13.instance_id = projections.users13_machines.instance_id` + ` LEFT JOIN` + ` (` + loginNamesQuery + `) AS login_names` + - ` ON login_names.user_id = projections.users12.id AND login_names.instance_id = projections.users12.instance_id` + + ` ON login_names.user_id = projections.users13.id AND login_names.instance_id = projections.users13.instance_id` + ` LEFT JOIN` + ` (` + preferredLoginNameQuery + `) AS preferred_login_name` + - ` ON preferred_login_name.user_id = projections.users12.id AND preferred_login_name.instance_id = projections.users12.instance_id` + + ` ON preferred_login_name.user_id = projections.users13.id AND preferred_login_name.instance_id = projections.users13.instance_id` + ` AS OF SYSTEM TIME '-1 ms'` usersCols = []string{ "id", @@ -437,6 +440,7 @@ var ( "phone", "is_phone_verified", "password_change_required", + "password_changed", // machine "user_id", "name", @@ -508,6 +512,7 @@ func Test_UserPrepares(t *testing.T) { "phone", true, true, + testNow, // machine nil, nil, @@ -542,6 +547,7 @@ func Test_UserPrepares(t *testing.T) { Phone: "phone", IsPhoneVerified: true, PasswordChangeRequired: true, + PasswordChanged: testNow, }, }, }, @@ -577,6 +583,7 @@ func Test_UserPrepares(t *testing.T) { nil, nil, nil, + nil, // machine "id", "name", @@ -638,6 +645,7 @@ func Test_UserPrepares(t *testing.T) { nil, nil, nil, + nil, // machine "id", "name", @@ -1226,6 +1234,7 @@ func Test_UserPrepares(t *testing.T) { "phone", true, true, + testNow, // machine nil, nil, @@ -1265,6 +1274,7 @@ func Test_UserPrepares(t *testing.T) { Phone: "phone", IsPhoneVerified: true, PasswordChangeRequired: true, + PasswordChanged: testNow, }, }, }, @@ -1303,6 +1313,7 @@ func Test_UserPrepares(t *testing.T) { "phone", true, true, + testNow, // machine nil, nil, @@ -1335,6 +1346,7 @@ func Test_UserPrepares(t *testing.T) { nil, nil, nil, + nil, // machine "id", "name", @@ -1374,6 +1386,7 @@ func Test_UserPrepares(t *testing.T) { Phone: "phone", IsPhoneVerified: true, PasswordChangeRequired: true, + PasswordChanged: testNow, }, }, { diff --git a/internal/query/userinfo_by_id.sql b/internal/query/userinfo_by_id.sql index 21c5175974..2c09215a69 100644 --- a/internal/query/userinfo_by_id.sql +++ b/internal/query/userinfo_by_id.sql @@ -1,6 +1,6 @@ with usr as ( select u.id, u.creation_date, u.change_date, u.sequence, u.state, u.resource_owner, u.username, n.login_name as preferred_login_name - from projections.users12 u + from projections.users13 u left join projections.login_names3 n on u.id = n.user_id and u.instance_id = n.instance_id where u.id = $1 and u.instance_id = $2 @@ -9,7 +9,7 @@ with usr as ( human as ( select $1 as user_id, row_to_json(r) as human from ( select first_name, last_name, nick_name, display_name, avatar_key, preferred_language, gender, email, is_email_verified, phone, is_phone_verified - from projections.users12_humans + from projections.users13_humans where user_id = $1 and instance_id = $2 ) r @@ -17,7 +17,7 @@ human as ( machine as ( select $1 as user_id, row_to_json(r) as machine from ( select name, description - from projections.users12_machines + from projections.users13_machines where user_id = $1 and instance_id = $2 ) r diff --git a/internal/user/repository/view/user_by_id.sql b/internal/user/repository/view/user_by_id.sql index 1e21e59486..6362c61039 100644 --- a/internal/user/repository/view/user_by_id.sql +++ b/internal/user/repository/view/user_by_id.sql @@ -73,15 +73,15 @@ SELECT , u.instance_id , (SELECT EXISTS (SELECT true FROM verified_auth_methods WHERE method_type = 6)) AS otp_sms_added , (SELECT EXISTS (SELECT true FROM verified_auth_methods WHERE method_type = 7)) AS otp_email_added -FROM projections.users12 u - LEFT JOIN projections.users12_humans h +FROM projections.users13 u + LEFT JOIN projections.users13_humans h ON u.instance_id = h.instance_id AND u.id = h.user_id LEFT JOIN projections.login_names3 l ON u.instance_id = l.instance_id AND u.id = l.user_id AND l.is_primary = true - LEFT JOIN projections.users12_machines m + LEFT JOIN projections.users13_machines m ON u.instance_id = m.instance_id AND u.id = m.user_id LEFT JOIN auth.users3 au diff --git a/internal/user/repository/view/user_session_by_id.sql b/internal/user/repository/view/user_session_by_id.sql index 1a9f3c250e..884ace1688 100644 --- a/internal/user/repository/view/user_session_by_id.sql +++ b/internal/user/repository/view/user_session_by_id.sql @@ -19,8 +19,8 @@ SELECT s.creation_date, s.sequence, s.instance_id FROM auth.user_sessions s - LEFT JOIN projections.users12 u ON s.user_id = u.id AND s.instance_id = u.instance_id - LEFT JOIN projections.users12_humans h ON s.user_id = h.user_id AND s.instance_id = h.instance_id + LEFT JOIN projections.users13 u ON s.user_id = u.id AND s.instance_id = u.instance_id + LEFT JOIN projections.users13_humans h ON s.user_id = h.user_id AND s.instance_id = h.instance_id LEFT JOIN projections.login_names3 l ON s.user_id = l.user_id AND s.instance_id = l.instance_id AND l.is_primary = true WHERE (s.user_agent_id = $1) AND (s.user_id = $2) diff --git a/internal/user/repository/view/user_sessions_by_user_agent.sql b/internal/user/repository/view/user_sessions_by_user_agent.sql index ac72f27e3c..d5f5191863 100644 --- a/internal/user/repository/view/user_sessions_by_user_agent.sql +++ b/internal/user/repository/view/user_sessions_by_user_agent.sql @@ -19,8 +19,8 @@ SELECT s.creation_date, s.sequence, s.instance_id FROM auth.user_sessions s - LEFT JOIN projections.users12 u ON s.user_id = u.id AND s.instance_id = u.instance_id - LEFT JOIN projections.users12_humans h ON s.user_id = h.user_id AND s.instance_id = h.instance_id + LEFT JOIN projections.users13 u ON s.user_id = u.id AND s.instance_id = u.instance_id + LEFT JOIN projections.users13_humans h ON s.user_id = h.user_id AND s.instance_id = h.instance_id LEFT JOIN projections.login_names3 l ON s.user_id = l.user_id AND s.instance_id = l.instance_id AND l.is_primary = true WHERE (s.user_agent_id = $1) AND (s.instance_id = $2) diff --git a/proto/zitadel/admin.proto b/proto/zitadel/admin.proto index e05d74b435..cc336f5875 100644 --- a/proto/zitadel/admin.proto +++ b/proto/zitadel/admin.proto @@ -2655,7 +2655,7 @@ service AdminService { tags: "Settings"; tags: "Password Settings"; summary: "Get Password Age Settings"; - description: "Not implemented" + description: "Returns the password age settings configured on the instance. It affects all organizations, that do not have a custom setting configured. The settings specify the expiry of password, after which a user is forced to change it on the next login."; responses: { key: "200"; value: { @@ -2679,7 +2679,7 @@ service AdminService { tags: "Settings"; tags: "Password Settings"; summary: "Update Password Age Settings"; - description: "Not implemented" + description: "Updates the default password complexity settings configured on the instance. It affects all organizations, that do not have a custom setting configured. The settings specify the expiry of password, after which a user is forced to change it on the next login."; responses: { key: "200"; value: { @@ -6736,18 +6736,10 @@ message GetPasswordAgePolicyResponse { } message UpdatePasswordAgePolicyRequest { - uint32 max_age_days = 1 [ - (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { - description: "Maximum days since last password change" - example: "\"365\"" - } - ]; - uint32 expire_warn_days = 2 [ - (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { - description: "Days before the password expiry the user gets notified to change the password" - example: "\"10\"" - } - ]; + // Amount of days after which a password will expire. The user will be forced to change the password on the following authentication. + uint32 max_age_days = 1; + // Amount of days after which the user should be notified of the upcoming expiry. ZITADEL will not notify the user. + uint32 expire_warn_days = 2; } message UpdatePasswordAgePolicyResponse { diff --git a/proto/zitadel/management.proto b/proto/zitadel/management.proto index 15fde6851b..9ee2f6cc0b 100644 --- a/proto/zitadel/management.proto +++ b/proto/zitadel/management.proto @@ -4742,7 +4742,6 @@ service ManagementService { }; } - // The password age policy is not used at the moment rpc GetPasswordAgePolicy(GetPasswordAgePolicyRequest) returns (GetPasswordAgePolicyResponse) { option (google.api.http) = { get: "/policies/password/age" @@ -4756,7 +4755,7 @@ service ManagementService { tags: "Settings"; tags: "Password Settings"; summary: "Get Password Age Settings"; - description: "Not implemented"; + description: "Returns the password age settings configured on the organization. The settings specify the expiry of password, after which a user is forced to change it on the next login."; parameters: { headers: { name: "x-zitadel-orgid"; @@ -4768,7 +4767,6 @@ service ManagementService { }; } - // The password age policy is not used at the moment rpc GetDefaultPasswordAgePolicy(GetDefaultPasswordAgePolicyRequest) returns (GetDefaultPasswordAgePolicyResponse) { option (google.api.http) = { get: "/policies/default/password/age" @@ -4782,7 +4780,7 @@ service ManagementService { tags: "Settings"; tags: "Password Settings"; summary: "Get Default Password Age Settings"; - description: "Not implemented"; + description: "Returns the default password age settings configured on the instance. The settings specify the expiry of password, after which a user is forced to change it on the next login."; parameters: { headers: { name: "x-zitadel-orgid"; @@ -4794,7 +4792,6 @@ service ManagementService { }; } - // The password age policy is not used at the moment rpc AddCustomPasswordAgePolicy(AddCustomPasswordAgePolicyRequest) returns (AddCustomPasswordAgePolicyResponse) { option (google.api.http) = { post: "/policies/password/age" @@ -4809,7 +4806,7 @@ service ManagementService { tags: "Settings"; tags: "Password Settings"; summary: "Add Password Age Settings"; - description: "Not implemented"; + description: "Create new password age settings for the organization. This will overwrite the settings of the instance for this organization. The settings specify the expiry of password, after which a user is forced to change it on the next login."; parameters: { headers: { name: "x-zitadel-orgid"; @@ -4821,7 +4818,6 @@ service ManagementService { }; } - // The password age policy is not used at the moment rpc UpdateCustomPasswordAgePolicy(UpdateCustomPasswordAgePolicyRequest) returns (UpdateCustomPasswordAgePolicyResponse) { option (google.api.http) = { put: "/policies/password/age" @@ -4836,7 +4832,7 @@ service ManagementService { tags: "Settings"; tags: "Password Settings"; summary: "Update Password Age Settings"; - description: "Not implemented"; + description: "Update the password age settings of the organization. The settings specify the expiry of password, after which a user is forced to change it on the next login."; parameters: { headers: { name: "x-zitadel-orgid"; @@ -4848,7 +4844,6 @@ service ManagementService { }; } - // The password age policy is not used at the moment rpc ResetPasswordAgePolicyToDefault(ResetPasswordAgePolicyToDefaultRequest) returns (ResetPasswordAgePolicyToDefaultResponse) { option (google.api.http) = { delete: "/policies/password/age" @@ -4862,7 +4857,7 @@ service ManagementService { tags: "Settings"; tags: "Password Settings"; summary: "Reset Password Age Settings to Default"; - description: "Not implemented"; + description: "Remove the password age settings of the organization and therefore use the default settings on the instance.. The settings specify the expiry of password, after which a user is forced to change it on the next login."; parameters: { headers: { name: "x-zitadel-orgid"; @@ -10604,7 +10599,9 @@ message GetDefaultPasswordAgePolicyResponse { } message AddCustomPasswordAgePolicyRequest { + // Amount of days after which a password will expire. The user will be forced to change the password on the following authentication. uint32 max_age_days = 1; + // Amount of days after which the user should be notified of the upcoming expiry. ZITADEL will not notify the user. uint32 expire_warn_days = 2; } @@ -10613,7 +10610,9 @@ message AddCustomPasswordAgePolicyResponse { } message UpdateCustomPasswordAgePolicyRequest { + // Amount of days after which a password will expire. The user will be forced to change the password on the following authentication. uint32 max_age_days = 1; + // Amount of days after which the user should be notified of the upcoming expiry. ZITADEL will not notify the user. uint32 expire_warn_days = 2; } diff --git a/proto/zitadel/policy.proto b/proto/zitadel/policy.proto index 02b7e453f3..2bce22e2fd 100644 --- a/proto/zitadel/policy.proto +++ b/proto/zitadel/policy.proto @@ -310,23 +310,20 @@ message PasswordComplexityPolicy { message PasswordAgePolicy { zitadel.v1.ObjectDetails details = 1; + // Amount of days after which a password will expire. The user will be forced to change the password on the following authentication. uint64 max_age_days = 2 [ (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { - description: "Maximum days since last password change" example: "\"365\"" } ]; + // Amount of days after which the user should be notified of the upcoming expiry. ZITADEL will not notify the user. uint64 expire_warn_days = 3 [ (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { - description: "Days before the password expiry the user gets notified to change the password" example: "\"10\"" } ]; - bool is_default = 4 [ - (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { - description: "defines if the organization's admin changed the policy" - } - ]; + // If true, the returned values represent the instance settings, e.g. by an organization without custom settings. + bool is_default = 4; } message LockoutPolicy { diff --git a/proto/zitadel/settings/v2beta/password_settings.proto b/proto/zitadel/settings/v2beta/password_settings.proto index 869cbb0ff2..f4dfde4f60 100644 --- a/proto/zitadel/settings/v2beta/password_settings.proto +++ b/proto/zitadel/settings/v2beta/password_settings.proto @@ -41,3 +41,20 @@ message PasswordComplexitySettings { } ]; } + +message PasswordExpirySettings { + // Amount of days after which a password will expire. The user will be forced to change the password on the following authentication. + uint64 max_age_days = 1 [ + (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { + example: "\"365\"" + } + ]; + // Amount of days after which the user should be notified of the upcoming expiry. ZITADEL will not notify the user. + uint64 expire_warn_days = 2 [ + (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { + example: "\"10\"" + } + ]; + // resource_owner_type returns if the settings is managed on the organization or on the instance + ResourceOwnerType resource_owner_type = 3; +} diff --git a/proto/zitadel/settings/v2beta/settings_service.proto b/proto/zitadel/settings/v2beta/settings_service.proto index 6ac86badad..988a284004 100644 --- a/proto/zitadel/settings/v2beta/settings_service.proto +++ b/proto/zitadel/settings/v2beta/settings_service.proto @@ -204,6 +204,30 @@ service SettingsService { }; } + // Get the password expiry settings + rpc GetPasswordExpirySettings (GetPasswordExpirySettingsRequest) returns (GetPasswordExpirySettingsResponse) { + option (google.api.http) = { + get: "/v2beta/settings/password/expiry" + }; + + option (zitadel.protoc_gen_zitadel.v2.options) = { + auth_option: { + permission: "policy.read" + } + }; + + option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation) = { + summary: "Get the password expiry settings"; + description: "Return the password expiry settings for the requested context" + responses: { + key: "200" + value: { + description: "OK"; + } + }; + }; + } + // Get the current active branding settings rpc GetBrandingSettings (GetBrandingSettingsRequest) returns (GetBrandingSettingsResponse) { option (google.api.http) = { @@ -358,6 +382,15 @@ message GetPasswordComplexitySettingsResponse { zitadel.settings.v2beta.PasswordComplexitySettings settings = 2; } +message GetPasswordExpirySettingsRequest { + zitadel.object.v2beta.RequestContext ctx = 1; +} + +message GetPasswordExpirySettingsResponse { + zitadel.object.v2beta.Details details = 1; + zitadel.settings.v2beta.PasswordExpirySettings settings = 2; +} + message GetBrandingSettingsRequest { zitadel.object.v2beta.RequestContext ctx = 1; } diff --git a/proto/zitadel/text.proto b/proto/zitadel/text.proto index b6632a1b42..af464bf97f 100644 --- a/proto/zitadel/text.proto +++ b/proto/zitadel/text.proto @@ -272,6 +272,7 @@ message PasswordChangeScreenText { string new_password_confirm_label = 5 [(validate.rules).string = {max_len: 200}]; string cancel_button_text = 6 [(validate.rules).string = {max_len: 100}]; string next_button_text = 7 [(validate.rules).string = {max_len: 100}]; + string expired_description = 8 [(validate.rules).string = {max_len: 500}]; } message PasswordChangeDoneScreenText { diff --git a/proto/zitadel/user.proto b/proto/zitadel/user.proto index c38f4f78af..569c2ce97e 100644 --- a/proto/zitadel/user.proto +++ b/proto/zitadel/user.proto @@ -65,6 +65,8 @@ message Human { Profile profile = 1; Email email = 2; Phone phone = 3; + // The time the user last changed their password. + google.protobuf.Timestamp password_changed = 4; } message Machine { diff --git a/proto/zitadel/user/v2beta/user.proto b/proto/zitadel/user/v2beta/user.proto index d74feca10e..69d9f8dce3 100644 --- a/proto/zitadel/user/v2beta/user.proto +++ b/proto/zitadel/user/v2beta/user.proto @@ -5,6 +5,7 @@ package zitadel.user.v2beta; option go_package = "github.com/zitadel/zitadel/pkg/grpc/user/v2beta;user"; import "google/api/field_behavior.proto"; +import "google/protobuf/timestamp.proto"; import "protoc-gen-openapiv2/options/annotations.proto"; import "validate/validate.proto"; import "zitadel/object/v2beta/object.proto"; @@ -172,6 +173,8 @@ message HumanUser { HumanPhone phone = 8; // User is required to change the used password on the next login. bool password_change_required = 9; + // The time the user last changed their password. + google.protobuf.Timestamp password_changed = 10; } message User { From f9742a58f49f7d19d1a088c338b3d3262b61552c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim=20M=C3=B6hlmann?= Date: Wed, 19 Jun 2024 13:56:33 +0300 Subject: [PATCH 40/44] fix(import): add tracing spans to all import related functions (#8160) # Which Problems Are Solved This fix adds tracing spans to all V1 API import related functions. This is to troubleshoot import related performance issues reported to us. # How the Problems Are Solved Add a tracing span to `api/grpc/admin/import.go` and all related functions that are called in the `command` package. # Additional Changes - none # Additional Context - Reported by internal communication --- internal/api/grpc/admin/import.go | 165 +++++++++++++++--- internal/command/idp.go | 4 + internal/command/org.go | 18 +- internal/command/org_action.go | 11 +- internal/command/org_custom_login_text.go | 6 +- internal/command/org_custom_message_text.go | 6 +- internal/command/org_domain.go | 28 ++- internal/command/org_flow.go | 13 +- internal/command/org_idp_config.go | 5 +- internal/command/org_member.go | 10 +- internal/command/org_policy_domain.go | 15 +- internal/command/org_policy_label.go | 20 ++- internal/command/org_policy_lockout.go | 13 +- internal/command/org_policy_login.go | 10 +- .../command/org_policy_password_complexity.go | 13 +- internal/command/org_policy_privacy.go | 7 +- internal/command/project.go | 21 ++- internal/command/project_application.go | 8 +- internal/command/project_application_api.go | 13 +- internal/command/project_application_key.go | 5 + internal/command/project_application_oidc.go | 13 +- internal/command/project_grant.go | 3 + internal/command/project_grant_member.go | 7 +- internal/command/project_member.go | 12 +- internal/command/project_role.go | 4 + internal/command/user.go | 5 +- internal/command/user_domain_policy.go | 11 +- internal/command/user_grant.go | 10 +- internal/command/user_human.go | 13 +- internal/command/user_human_otp.go | 5 +- internal/command/user_idp_link.go | 3 + internal/command/user_machine.go | 14 +- internal/command/user_machine_key.go | 9 +- internal/command/user_metadata.go | 4 + internal/domain/human.go | 6 +- internal/eventstore/repository/sql/crdb.go | 8 +- internal/query/secret_generators.go | 5 +- 37 files changed, 428 insertions(+), 95 deletions(-) diff --git a/internal/api/grpc/admin/import.go b/internal/api/grpc/admin/import.go index 5eab0fb8d7..7c20e7617e 100644 --- a/internal/api/grpc/admin/import.go +++ b/internal/api/grpc/admin/import.go @@ -246,7 +246,10 @@ func (s *Server) transportDataFromFile(ctx context.Context, v1Transformation boo return dataOrgs, nil } -func getFileFromS3(ctx context.Context, input *admin_pb.ImportDataRequest_S3Input) ([]byte, error) { +func getFileFromS3(ctx context.Context, input *admin_pb.ImportDataRequest_S3Input) (_ []byte, err error) { + ctx, span := tracing.NewSpan(ctx) + defer func() { span.EndWithError(err) }() + minioClient, err := minio.New(input.Endpoint, &minio.Options{ Creds: credentials.NewStaticV4(input.AccessKeyId, input.SecretAccessKey, ""), Secure: input.Ssl, @@ -272,7 +275,10 @@ func getFileFromS3(ctx context.Context, input *admin_pb.ImportDataRequest_S3Inpu return ioutil.ReadAll(object) } -func getFileFromGCS(ctx context.Context, input *admin_pb.ImportDataRequest_GCSInput) ([]byte, error) { +func getFileFromGCS(ctx context.Context, input *admin_pb.ImportDataRequest_GCSInput) (_ []byte, err error) { + ctx, span := tracing.NewSpan(ctx) + defer func() { span.EndWithError(err) }() + saJson, err := base64.StdEncoding.DecodeString(input.ServiceaccountJson) if err != nil { return nil, err @@ -292,8 +298,11 @@ func getFileFromGCS(ctx context.Context, input *admin_pb.ImportDataRequest_GCSIn return ioutil.ReadAll(reader) } -func importOrg1(ctx context.Context, s *Server, errors *[]*admin_pb.ImportDataError, ctxData authz.CtxData, org *admin_pb.DataOrg, success *admin_pb.ImportDataSuccess, count *counts, initCodeGenerator, emailCodeGenerator, phoneCodeGenerator, passwordlessInitCode crypto.Generator) error { - _, err := s.command.AddOrgWithID(ctx, org.GetOrg().GetName(), ctxData.UserID, ctxData.ResourceOwner, org.GetOrgId(), []string{}) +func importOrg1(ctx context.Context, s *Server, errors *[]*admin_pb.ImportDataError, ctxData authz.CtxData, org *admin_pb.DataOrg, success *admin_pb.ImportDataSuccess, count *counts, initCodeGenerator, emailCodeGenerator, phoneCodeGenerator, passwordlessInitCode crypto.Generator) (err error) { + ctx, span := tracing.NewSpan(ctx) + defer func() { span.EndWithError(err) }() + + _, err = s.command.AddOrgWithID(ctx, org.GetOrg().GetName(), ctxData.UserID, ctxData.ResourceOwner, org.GetOrgId(), []string{}) if err != nil { *errors = append(*errors, &admin_pb.ImportDataError{Type: "org", Id: org.GetOrgId(), Message: err.Error()}) if _, err := s.query.OrgByID(ctx, true, org.OrgId); err != nil { @@ -328,11 +337,14 @@ func importOrg1(ctx context.Context, s *Server, errors *[]*admin_pb.ImportDataEr return importResources(ctx, s, errors, successOrg, org, count, initCodeGenerator, emailCodeGenerator, phoneCodeGenerator, passwordlessInitCode) } -func importLabelPolicy(ctx context.Context, s *Server, errors *[]*admin_pb.ImportDataError, org *admin_pb.DataOrg) error { +func importLabelPolicy(ctx context.Context, s *Server, errors *[]*admin_pb.ImportDataError, org *admin_pb.DataOrg) (err error) { + ctx, span := tracing.NewSpan(ctx) + defer func() { span.EndWithError(err) }() + if org.LabelPolicy == nil { return nil } - _, err := s.command.AddLabelPolicy(ctx, org.GetOrgId(), management.AddLabelPolicyToDomain(org.GetLabelPolicy())) + _, err = s.command.AddLabelPolicy(ctx, org.GetOrgId(), management.AddLabelPolicyToDomain(org.GetLabelPolicy())) if err != nil { *errors = append(*errors, &admin_pb.ImportDataError{Type: "label_policy", Id: org.GetOrgId(), Message: err.Error()}) if isCtxTimeout(ctx) { @@ -351,6 +363,9 @@ func importLabelPolicy(ctx context.Context, s *Server, errors *[]*admin_pb.Impor } func importLockoutPolicy(ctx context.Context, s *Server, errors *[]*admin_pb.ImportDataError, org *admin_pb.DataOrg) { + ctx, span := tracing.NewSpan(ctx) + defer func() { span.End() }() + if org.LockoutPolicy == nil { return } @@ -360,7 +375,10 @@ func importLockoutPolicy(ctx context.Context, s *Server, errors *[]*admin_pb.Imp } } -func importOidcIdps(ctx context.Context, s *Server, errors *[]*admin_pb.ImportDataError, successOrg *admin_pb.ImportDataSuccessOrg, org *admin_pb.DataOrg) error { +func importOidcIdps(ctx context.Context, s *Server, errors *[]*admin_pb.ImportDataError, successOrg *admin_pb.ImportDataSuccessOrg, org *admin_pb.DataOrg) (err error) { + ctx, span := tracing.NewSpan(ctx) + defer func() { span.EndWithError(err) }() + if org.OidcIdps == nil { return nil } @@ -380,7 +398,10 @@ func importOidcIdps(ctx context.Context, s *Server, errors *[]*admin_pb.ImportDa return nil } -func importJwtIdps(ctx context.Context, s *Server, errors *[]*admin_pb.ImportDataError, successOrg *admin_pb.ImportDataSuccessOrg, org *admin_pb.DataOrg) error { +func importJwtIdps(ctx context.Context, s *Server, errors *[]*admin_pb.ImportDataError, successOrg *admin_pb.ImportDataSuccessOrg, org *admin_pb.DataOrg) (err error) { + ctx, span := tracing.NewSpan(ctx) + defer func() { span.EndWithError(err) }() + if org.JwtIdps == nil { return nil } @@ -401,6 +422,9 @@ func importJwtIdps(ctx context.Context, s *Server, errors *[]*admin_pb.ImportDat } func importLoginPolicy(ctx context.Context, s *Server, errors *[]*admin_pb.ImportDataError, org *admin_pb.DataOrg) { + ctx, span := tracing.NewSpan(ctx) + defer func() { span.End() }() + if org.LoginPolicy == nil { return } @@ -411,6 +435,9 @@ func importLoginPolicy(ctx context.Context, s *Server, errors *[]*admin_pb.Impor } func importPwComlexityPolicy(ctx context.Context, s *Server, errors *[]*admin_pb.ImportDataError, org *admin_pb.DataOrg) { + ctx, span := tracing.NewSpan(ctx) + defer func() { span.End() }() + if org.PasswordComplexityPolicy == nil { return } @@ -421,6 +448,9 @@ func importPwComlexityPolicy(ctx context.Context, s *Server, errors *[]*admin_pb } func importPrivacyPolicy(ctx context.Context, s *Server, errors *[]*admin_pb.ImportDataError, org *admin_pb.DataOrg) { + ctx, span := tracing.NewSpan(ctx) + defer func() { span.End() }() + if org.PrivacyPolicy == nil { return } @@ -430,7 +460,10 @@ func importPrivacyPolicy(ctx context.Context, s *Server, errors *[]*admin_pb.Imp } } -func importHumanUsers(ctx context.Context, s *Server, errors *[]*admin_pb.ImportDataError, successOrg *admin_pb.ImportDataSuccessOrg, org *admin_pb.DataOrg, count *counts, initCodeGenerator, emailCodeGenerator, phoneCodeGenerator, passwordlessInitCode crypto.Generator) error { +func importHumanUsers(ctx context.Context, s *Server, errors *[]*admin_pb.ImportDataError, successOrg *admin_pb.ImportDataSuccessOrg, org *admin_pb.DataOrg, count *counts, initCodeGenerator, emailCodeGenerator, phoneCodeGenerator, passwordlessInitCode crypto.Generator) (err error) { + ctx, span := tracing.NewSpan(ctx) + defer func() { span.EndWithError(err) }() + if org.HumanUsers == nil { return nil } @@ -465,7 +498,10 @@ func importHumanUsers(ctx context.Context, s *Server, errors *[]*admin_pb.Import return nil } -func importMachineUsers(ctx context.Context, s *Server, errors *[]*admin_pb.ImportDataError, successOrg *admin_pb.ImportDataSuccessOrg, org *admin_pb.DataOrg, count *counts) error { +func importMachineUsers(ctx context.Context, s *Server, errors *[]*admin_pb.ImportDataError, successOrg *admin_pb.ImportDataSuccessOrg, org *admin_pb.DataOrg, count *counts) (err error) { + ctx, span := tracing.NewSpan(ctx) + defer func() { span.EndWithError(err) }() + if org.MachineUsers == nil { return nil } @@ -486,7 +522,10 @@ func importMachineUsers(ctx context.Context, s *Server, errors *[]*admin_pb.Impo return nil } -func importUserMetadata(ctx context.Context, s *Server, errors *[]*admin_pb.ImportDataError, successOrg *admin_pb.ImportDataSuccessOrg, org *admin_pb.DataOrg, count *counts) error { +func importUserMetadata(ctx context.Context, s *Server, errors *[]*admin_pb.ImportDataError, successOrg *admin_pb.ImportDataSuccessOrg, org *admin_pb.DataOrg, count *counts) (err error) { + ctx, span := tracing.NewSpan(ctx) + defer func() { span.EndWithError(err) }() + if org.UserMetadata == nil { return nil } @@ -507,7 +546,10 @@ func importUserMetadata(ctx context.Context, s *Server, errors *[]*admin_pb.Impo return nil } -func importMachineKeys(ctx context.Context, s *Server, errors *[]*admin_pb.ImportDataError, successOrg *admin_pb.ImportDataSuccessOrg, org *admin_pb.DataOrg, count *counts) error { +func importMachineKeys(ctx context.Context, s *Server, errors *[]*admin_pb.ImportDataError, successOrg *admin_pb.ImportDataSuccessOrg, org *admin_pb.DataOrg, count *counts) (err error) { + ctx, span := tracing.NewSpan(ctx) + defer func() { span.EndWithError(err) }() + if org.MachineKeys == nil { return nil } @@ -537,7 +579,10 @@ func importMachineKeys(ctx context.Context, s *Server, errors *[]*admin_pb.Impor return nil } -func importUserLinks(ctx context.Context, s *Server, errors *[]*admin_pb.ImportDataError, successOrg *admin_pb.ImportDataSuccessOrg, org *admin_pb.DataOrg, count *counts) error { +func importUserLinks(ctx context.Context, s *Server, errors *[]*admin_pb.ImportDataError, successOrg *admin_pb.ImportDataSuccessOrg, org *admin_pb.DataOrg, count *counts) (err error) { + ctx, span := tracing.NewSpan(ctx) + defer func() { span.EndWithError(err) }() + if org.UserLinks == nil { return nil } @@ -548,6 +593,7 @@ func importUserLinks(ctx context.Context, s *Server, errors *[]*admin_pb.ImportD IDPExternalID: userLinks.ProvidedUserId, DisplayName: userLinks.ProvidedUserName, } + // TBD: why not command.BulkAddedUserIDPLinks? if _, err := s.command.AddUserIDPLink(ctx, userLinks.UserId, org.GetOrgId(), externalIDP); err != nil { *errors = append(*errors, &admin_pb.ImportDataError{Type: "user_link", Id: userLinks.UserId + "_" + userLinks.IdpId, Message: err.Error()}) if isCtxTimeout(ctx) { @@ -563,7 +609,10 @@ func importUserLinks(ctx context.Context, s *Server, errors *[]*admin_pb.ImportD } -func importProjects(ctx context.Context, s *Server, errors *[]*admin_pb.ImportDataError, successOrg *admin_pb.ImportDataSuccessOrg, org *admin_pb.DataOrg, count *counts) error { +func importProjects(ctx context.Context, s *Server, errors *[]*admin_pb.ImportDataError, successOrg *admin_pb.ImportDataSuccessOrg, org *admin_pb.DataOrg, count *counts) (err error) { + ctx, span := tracing.NewSpan(ctx) + defer func() { span.EndWithError(err) }() + if org.Projects == nil { return nil } @@ -584,7 +633,10 @@ func importProjects(ctx context.Context, s *Server, errors *[]*admin_pb.ImportDa return nil } -func importOIDCApps(ctx context.Context, s *Server, errors *[]*admin_pb.ImportDataError, successOrg *admin_pb.ImportDataSuccessOrg, org *admin_pb.DataOrg, count *counts) error { +func importOIDCApps(ctx context.Context, s *Server, errors *[]*admin_pb.ImportDataError, successOrg *admin_pb.ImportDataSuccessOrg, org *admin_pb.DataOrg, count *counts) (err error) { + ctx, span := tracing.NewSpan(ctx) + defer func() { span.EndWithError(err) }() + if org.OidcApps == nil { return nil } @@ -605,7 +657,10 @@ func importOIDCApps(ctx context.Context, s *Server, errors *[]*admin_pb.ImportDa return nil } -func importAPIApps(ctx context.Context, s *Server, errors *[]*admin_pb.ImportDataError, successOrg *admin_pb.ImportDataSuccessOrg, org *admin_pb.DataOrg, count *counts) error { +func importAPIApps(ctx context.Context, s *Server, errors *[]*admin_pb.ImportDataError, successOrg *admin_pb.ImportDataSuccessOrg, org *admin_pb.DataOrg, count *counts) (err error) { + ctx, span := tracing.NewSpan(ctx) + defer func() { span.EndWithError(err) }() + if org.ApiApps == nil { return nil } @@ -626,7 +681,10 @@ func importAPIApps(ctx context.Context, s *Server, errors *[]*admin_pb.ImportDat return nil } -func importAppKeys(ctx context.Context, s *Server, errors *[]*admin_pb.ImportDataError, successOrg *admin_pb.ImportDataSuccessOrg, org *admin_pb.DataOrg, count *counts) error { +func importAppKeys(ctx context.Context, s *Server, errors *[]*admin_pb.ImportDataError, successOrg *admin_pb.ImportDataSuccessOrg, org *admin_pb.DataOrg, count *counts) (err error) { + ctx, span := tracing.NewSpan(ctx) + defer func() { span.EndWithError(err) }() + if org.AppKeys == nil { return nil } @@ -658,7 +716,10 @@ func importAppKeys(ctx context.Context, s *Server, errors *[]*admin_pb.ImportDat return nil } -func importActions(ctx context.Context, s *Server, errors *[]*admin_pb.ImportDataError, successOrg *admin_pb.ImportDataSuccessOrg, org *admin_pb.DataOrg, count *counts) error { +func importActions(ctx context.Context, s *Server, errors *[]*admin_pb.ImportDataError, successOrg *admin_pb.ImportDataSuccessOrg, org *admin_pb.DataOrg, count *counts) (err error) { + ctx, span := tracing.NewSpan(ctx) + defer func() { span.EndWithError(err) }() + if org.Actions == nil { return nil } @@ -678,12 +739,17 @@ func importActions(ctx context.Context, s *Server, errors *[]*admin_pb.ImportDat } return nil } -func importProjectRoles(ctx context.Context, s *Server, errors *[]*admin_pb.ImportDataError, successOrg *admin_pb.ImportDataSuccessOrg, org *admin_pb.DataOrg, count *counts) error { +func importProjectRoles(ctx context.Context, s *Server, errors *[]*admin_pb.ImportDataError, successOrg *admin_pb.ImportDataSuccessOrg, org *admin_pb.DataOrg, count *counts) (err error) { + ctx, span := tracing.NewSpan(ctx) + defer func() { span.EndWithError(err) }() + if org.ProjectRoles == nil { return nil } for _, role := range org.GetProjectRoles() { logging.Debugf("import projectroles: %s", role.ProjectId+"_"+role.RoleKey) + + // TBD: why not command.BulkAddProjectRole? _, err := s.command.AddProjectRole(ctx, management.AddProjectRoleRequestToDomain(role), org.GetOrgId()) if err != nil { *errors = append(*errors, &admin_pb.ImportDataError{Type: "project_role", Id: role.ProjectId + "_" + role.RoleKey, Message: err.Error()}) @@ -700,7 +766,10 @@ func importProjectRoles(ctx context.Context, s *Server, errors *[]*admin_pb.Impo return nil } -func importResources(ctx context.Context, s *Server, errors *[]*admin_pb.ImportDataError, successOrg *admin_pb.ImportDataSuccessOrg, org *admin_pb.DataOrg, count *counts, initCodeGenerator, emailCodeGenerator, phoneCodeGenerator, passwordlessInitCode crypto.Generator) error { +func importResources(ctx context.Context, s *Server, errors *[]*admin_pb.ImportDataError, successOrg *admin_pb.ImportDataSuccessOrg, org *admin_pb.DataOrg, count *counts, initCodeGenerator, emailCodeGenerator, phoneCodeGenerator, passwordlessInitCode crypto.Generator) (err error) { + ctx, span := tracing.NewSpan(ctx) + defer func() { span.EndWithError(err) }() + if err := importOrgDomains(ctx, s, errors, successOrg, org); err != nil { return err } @@ -760,7 +829,10 @@ func importResources(ctx context.Context, s *Server, errors *[]*admin_pb.ImportD return nil } -func importOrgDomains(ctx context.Context, s *Server, errors *[]*admin_pb.ImportDataError, successOrg *admin_pb.ImportDataSuccessOrg, org *admin_pb.DataOrg) error { +func importOrgDomains(ctx context.Context, s *Server, errors *[]*admin_pb.ImportDataError, successOrg *admin_pb.ImportDataSuccessOrg, org *admin_pb.DataOrg) (err error) { + ctx, span := tracing.NewSpan(ctx) + defer func() { span.EndWithError(err) }() + if org.Domains == nil { return nil } @@ -799,6 +871,9 @@ func importOrgDomains(ctx context.Context, s *Server, errors *[]*admin_pb.Import } func importLoginTexts(ctx context.Context, s *Server, errors *[]*admin_pb.ImportDataError, org *admin_pb.DataOrg) { + ctx, span := tracing.NewSpan(ctx) + defer func() { span.End() }() + if org.LoginTexts == nil { return } @@ -811,6 +886,9 @@ func importLoginTexts(ctx context.Context, s *Server, errors *[]*admin_pb.Import } func importInitMessageTexts(ctx context.Context, s *Server, errors *[]*admin_pb.ImportDataError, org *admin_pb.DataOrg) { + ctx, span := tracing.NewSpan(ctx) + defer func() { span.End() }() + if org.InitMessages == nil { return } @@ -823,6 +901,9 @@ func importInitMessageTexts(ctx context.Context, s *Server, errors *[]*admin_pb. } func importPWResetMessageTexts(ctx context.Context, s *Server, errors *[]*admin_pb.ImportDataError, org *admin_pb.DataOrg) { + ctx, span := tracing.NewSpan(ctx) + defer func() { span.End() }() + if org.PasswordResetMessages == nil { return } @@ -835,6 +916,9 @@ func importPWResetMessageTexts(ctx context.Context, s *Server, errors *[]*admin_ } func importVerifyEmailMessageTexts(ctx context.Context, s *Server, errors *[]*admin_pb.ImportDataError, org *admin_pb.DataOrg) { + ctx, span := tracing.NewSpan(ctx) + defer func() { span.End() }() + if org.VerifyEmailMessages == nil { return } @@ -847,6 +931,9 @@ func importVerifyEmailMessageTexts(ctx context.Context, s *Server, errors *[]*ad } func importVerifyPhoneMessageTexts(ctx context.Context, s *Server, errors *[]*admin_pb.ImportDataError, org *admin_pb.DataOrg) { + ctx, span := tracing.NewSpan(ctx) + defer func() { span.End() }() + if org.VerifyPhoneMessages != nil { return } @@ -859,6 +946,9 @@ func importVerifyPhoneMessageTexts(ctx context.Context, s *Server, errors *[]*ad } func importDomainClaimedMessageTexts(ctx context.Context, s *Server, errors *[]*admin_pb.ImportDataError, org *admin_pb.DataOrg) { + ctx, span := tracing.NewSpan(ctx) + defer func() { span.End() }() + if org.DomainClaimedMessages == nil { return } @@ -871,6 +961,9 @@ func importDomainClaimedMessageTexts(ctx context.Context, s *Server, errors *[]* } func importPasswordlessRegistrationMessageTexts(ctx context.Context, s *Server, errors *[]*admin_pb.ImportDataError, org *admin_pb.DataOrg) { + ctx, span := tracing.NewSpan(ctx) + defer func() { span.End() }() + if org.PasswordlessRegistrationMessages == nil { return } @@ -882,7 +975,10 @@ func importPasswordlessRegistrationMessageTexts(ctx context.Context, s *Server, } } -func importOrg2(ctx context.Context, s *Server, errors *[]*admin_pb.ImportDataError, success *admin_pb.ImportDataSuccess, count *counts, org *admin_pb.DataOrg) error { +func importOrg2(ctx context.Context, s *Server, errors *[]*admin_pb.ImportDataError, success *admin_pb.ImportDataSuccess, count *counts, org *admin_pb.DataOrg) (err error) { + ctx, span := tracing.NewSpan(ctx) + defer func() { span.EndWithError(err) }() + successOrg := findOldOrg(success, org.OrgId) if successOrg == nil { return nil @@ -932,7 +1028,10 @@ func importOrg2(ctx context.Context, s *Server, errors *[]*admin_pb.ImportDataEr return nil } -func importOrg3(ctx context.Context, s *Server, errors *[]*admin_pb.ImportDataError, success *admin_pb.ImportDataSuccess, count *counts, org *admin_pb.DataOrg) error { +func importOrg3(ctx context.Context, s *Server, errors *[]*admin_pb.ImportDataError, success *admin_pb.ImportDataSuccess, count *counts, org *admin_pb.DataOrg) (err error) { + ctx, span := tracing.NewSpan(ctx) + defer func() { span.EndWithError(err) }() + successOrg := findOldOrg(success, org.OrgId) if successOrg == nil { return nil @@ -946,7 +1045,10 @@ func importOrg3(ctx context.Context, s *Server, errors *[]*admin_pb.ImportDataEr return importProjectMembers(ctx, s, errors, successOrg, count, org) } -func importOrgMembers(ctx context.Context, s *Server, errors *[]*admin_pb.ImportDataError, successOrg *admin_pb.ImportDataSuccessOrg, count *counts, org *admin_pb.DataOrg) error { +func importOrgMembers(ctx context.Context, s *Server, errors *[]*admin_pb.ImportDataError, successOrg *admin_pb.ImportDataSuccessOrg, count *counts, org *admin_pb.DataOrg) (err error) { + ctx, span := tracing.NewSpan(ctx) + defer func() { span.EndWithError(err) }() + if org.OrgMembers == nil { return nil } @@ -967,7 +1069,10 @@ func importOrgMembers(ctx context.Context, s *Server, errors *[]*admin_pb.Import return nil } -func importProjectGrantMembers(ctx context.Context, s *Server, errors *[]*admin_pb.ImportDataError, successOrg *admin_pb.ImportDataSuccessOrg, count *counts, org *admin_pb.DataOrg) error { +func importProjectGrantMembers(ctx context.Context, s *Server, errors *[]*admin_pb.ImportDataError, successOrg *admin_pb.ImportDataSuccessOrg, count *counts, org *admin_pb.DataOrg) (err error) { + ctx, span := tracing.NewSpan(ctx) + defer func() { span.EndWithError(err) }() + if org.ProjectGrantMembers == nil { return nil } @@ -988,7 +1093,10 @@ func importProjectGrantMembers(ctx context.Context, s *Server, errors *[]*admin_ return nil } -func importProjectMembers(ctx context.Context, s *Server, errors *[]*admin_pb.ImportDataError, successOrg *admin_pb.ImportDataSuccessOrg, count *counts, org *admin_pb.DataOrg) error { +func importProjectMembers(ctx context.Context, s *Server, errors *[]*admin_pb.ImportDataError, successOrg *admin_pb.ImportDataSuccessOrg, count *counts, org *admin_pb.DataOrg) (err error) { + ctx, span := tracing.NewSpan(ctx) + defer func() { span.EndWithError(err) }() + if org.ProjectMembers == nil { return nil } @@ -1018,7 +1126,10 @@ func findOldOrg(success *admin_pb.ImportDataSuccess, orgId string) *admin_pb.Imp return nil } -func (s *Server) importData(ctx context.Context, orgs []*admin_pb.DataOrg) (*admin_pb.ImportDataResponse, *counts, error) { +func (s *Server) importData(ctx context.Context, orgs []*admin_pb.DataOrg) (_ *admin_pb.ImportDataResponse, _ *counts, err error) { + ctx, span := tracing.NewSpan(ctx) + defer func() { span.EndWithError(err) }() + errors := make([]*admin_pb.ImportDataError, 0) success := &admin_pb.ImportDataSuccess{} count := &counts{} diff --git a/internal/command/idp.go b/internal/command/idp.go index 229d19b6e1..84e6a7ddc2 100644 --- a/internal/command/idp.go +++ b/internal/command/idp.go @@ -7,6 +7,7 @@ import ( "github.com/zitadel/zitadel/internal/command/preparation" "github.com/zitadel/zitadel/internal/domain" "github.com/zitadel/zitadel/internal/repository/idp" + "github.com/zitadel/zitadel/internal/telemetry/tracing" "github.com/zitadel/zitadel/internal/zerrors" ) @@ -133,6 +134,9 @@ type AppleProvider struct { // ExistsIDPOnOrgOrInstance query first org level IDPs and then instance level IDPs, no check if the IDP is active func ExistsIDPOnOrgOrInstance(ctx context.Context, filter preparation.FilterToQueryReducer, instanceID, orgID, id string) (exists bool, err error) { + ctx, span := tracing.NewSpan(ctx) + defer func() { span.EndWithError(err) }() + writeModel := NewOrgIDPRemoveWriteModel(orgID, id) events, err := filter(ctx, writeModel.Query()) if err != nil { diff --git a/internal/command/org.go b/internal/command/org.go index db963762b1..570455794a 100644 --- a/internal/command/org.go +++ b/internal/command/org.go @@ -11,6 +11,7 @@ import ( "github.com/zitadel/zitadel/internal/repository/org" "github.com/zitadel/zitadel/internal/repository/project" "github.com/zitadel/zitadel/internal/repository/user" + "github.com/zitadel/zitadel/internal/telemetry/tracing" "github.com/zitadel/zitadel/internal/zerrors" ) @@ -275,7 +276,10 @@ func (c *Commands) checkOrgExists(ctx context.Context, orgID string) error { return nil } -func (c *Commands) AddOrgWithID(ctx context.Context, name, userID, resourceOwner, orgID string, claimedUserIDs []string) (*domain.Org, error) { +func (c *Commands) AddOrgWithID(ctx context.Context, name, userID, resourceOwner, orgID string, claimedUserIDs []string) (_ *domain.Org, err error) { + ctx, span := tracing.NewSpan(ctx) + defer func() { span.EndWithError(err) }() + existingOrg, err := c.getOrgWriteModelByID(ctx, orgID) if err != nil { return nil, err @@ -300,7 +304,10 @@ func (c *Commands) AddOrg(ctx context.Context, name, userID, resourceOwner strin return c.addOrgWithIDAndMember(ctx, name, userID, resourceOwner, orgID, claimedUserIDs) } -func (c *Commands) addOrgWithIDAndMember(ctx context.Context, name, userID, resourceOwner, orgID string, claimedUserIDs []string) (*domain.Org, error) { +func (c *Commands) addOrgWithIDAndMember(ctx context.Context, name, userID, resourceOwner, orgID string, claimedUserIDs []string) (_ *domain.Org, err error) { + ctx, span := tracing.NewSpan(ctx) + defer func() { span.EndWithError(err) }() + orgAgg, addedOrg, events, err := c.addOrgWithID(ctx, &domain.Org{Name: name}, orgID, claimedUserIDs) if err != nil { return nil, err @@ -717,9 +724,12 @@ func (c *Commands) addOrgWithID(ctx context.Context, organisation *domain.Org, o return orgAgg, addedOrg, events, nil } -func (c *Commands) getOrgWriteModelByID(ctx context.Context, orgID string) (*OrgWriteModel, error) { +func (c *Commands) getOrgWriteModelByID(ctx context.Context, orgID string) (_ *OrgWriteModel, err error) { + ctx, span := tracing.NewSpan(ctx) + defer func() { span.EndWithError(err) }() + orgWriteModel := NewOrgWriteModel(orgID) - err := c.eventstore.FilterToQueryReducer(ctx, orgWriteModel) + err = c.eventstore.FilterToQueryReducer(ctx, orgWriteModel) if err != nil { return nil, err } diff --git a/internal/command/org_action.go b/internal/command/org_action.go index 945fd929de..f8776dcba0 100644 --- a/internal/command/org_action.go +++ b/internal/command/org_action.go @@ -8,10 +8,14 @@ import ( "github.com/zitadel/zitadel/internal/eventstore" "github.com/zitadel/zitadel/internal/repository/action" "github.com/zitadel/zitadel/internal/repository/org" + "github.com/zitadel/zitadel/internal/telemetry/tracing" "github.com/zitadel/zitadel/internal/zerrors" ) func (c *Commands) AddActionWithID(ctx context.Context, addAction *domain.Action, resourceOwner, actionID string) (_ string, _ *domain.ObjectDetails, err error) { + ctx, span := tracing.NewSpan(ctx) + defer func() { span.EndWithError(err) }() + existingAction, err := c.getActionWriteModelByID(ctx, actionID, resourceOwner) if err != nil { return "", nil, err @@ -227,9 +231,12 @@ func (c *Commands) deactivateNotAllowedActionsFromOrg(ctx context.Context, resou return events, nil } -func (c *Commands) getActionWriteModelByID(ctx context.Context, actionID string, resourceOwner string) (*ActionWriteModel, error) { +func (c *Commands) getActionWriteModelByID(ctx context.Context, actionID string, resourceOwner string) (_ *ActionWriteModel, err error) { + ctx, span := tracing.NewSpan(ctx) + defer func() { span.EndWithError(err) }() + actionWriteModel := NewActionWriteModel(actionID, resourceOwner) - err := c.eventstore.FilterToQueryReducer(ctx, actionWriteModel) + err = c.eventstore.FilterToQueryReducer(ctx, actionWriteModel) if err != nil { return nil, err } diff --git a/internal/command/org_custom_login_text.go b/internal/command/org_custom_login_text.go index 1f906972bf..f5d19716b8 100644 --- a/internal/command/org_custom_login_text.go +++ b/internal/command/org_custom_login_text.go @@ -9,12 +9,16 @@ import ( "github.com/zitadel/zitadel/internal/eventstore" "github.com/zitadel/zitadel/internal/i18n" "github.com/zitadel/zitadel/internal/repository/org" + "github.com/zitadel/zitadel/internal/telemetry/tracing" "github.com/zitadel/zitadel/internal/zerrors" ) // SetOrgLoginText only validates if the language is supported, not if it is allowed. // This enables setting texts before allowing a language -func (c *Commands) SetOrgLoginText(ctx context.Context, resourceOwner string, loginText *domain.CustomLoginText) (*domain.ObjectDetails, error) { +func (c *Commands) SetOrgLoginText(ctx context.Context, resourceOwner string, loginText *domain.CustomLoginText) (_ *domain.ObjectDetails, err error) { + ctx, span := tracing.NewSpan(ctx) + defer func() { span.EndWithError(err) }() + if resourceOwner == "" { return nil, zerrors.ThrowInvalidArgument(nil, "ORG-m29rF", "Errors.ResourceOwnerMissing") } diff --git a/internal/command/org_custom_message_text.go b/internal/command/org_custom_message_text.go index 266b502090..a1cf009335 100644 --- a/internal/command/org_custom_message_text.go +++ b/internal/command/org_custom_message_text.go @@ -9,12 +9,16 @@ import ( "github.com/zitadel/zitadel/internal/eventstore" "github.com/zitadel/zitadel/internal/i18n" "github.com/zitadel/zitadel/internal/repository/org" + "github.com/zitadel/zitadel/internal/telemetry/tracing" "github.com/zitadel/zitadel/internal/zerrors" ) // SetOrgMessageText only validates if the language is supported, not if it is allowed. // This enables setting texts before allowing a language -func (c *Commands) SetOrgMessageText(ctx context.Context, resourceOwner string, messageText *domain.CustomMessageText) (*domain.ObjectDetails, error) { +func (c *Commands) SetOrgMessageText(ctx context.Context, resourceOwner string, messageText *domain.CustomMessageText) (_ *domain.ObjectDetails, err error) { + ctx, span := tracing.NewSpan(ctx) + defer func() { span.EndWithError(err) }() + if resourceOwner == "" { return nil, zerrors.ThrowInvalidArgument(nil, "ORG-2biiR", "Errors.ResourceOwnerMissing") } diff --git a/internal/command/org_domain.go b/internal/command/org_domain.go index 98519bfc5d..2837c7c31c 100644 --- a/internal/command/org_domain.go +++ b/internal/command/org_domain.go @@ -14,6 +14,7 @@ import ( "github.com/zitadel/zitadel/internal/domain" "github.com/zitadel/zitadel/internal/eventstore" "github.com/zitadel/zitadel/internal/repository/org" + "github.com/zitadel/zitadel/internal/telemetry/tracing" "github.com/zitadel/zitadel/internal/zerrors" ) @@ -22,7 +23,10 @@ func (c *Commands) prepareAddOrgDomain(a *org.Aggregate, addDomain string, userI if addDomain = strings.TrimSpace(addDomain); addDomain == "" { return nil, zerrors.ThrowInvalidArgument(nil, "ORG-r3h4J", "Errors.Invalid.Argument") } - return func(ctx context.Context, filter preparation.FilterToQueryReducer) ([]eventstore.Command, error) { + return func(ctx context.Context, filter preparation.FilterToQueryReducer) (_ []eventstore.Command, err error) { + ctx, span := tracing.NewSpan(ctx) + defer func() { span.EndWithError(err) }() + existing, err := orgDomain(ctx, filter, a.ID, addDomain) if err != nil && !errors.Is(err, zerrors.ThrowNotFound(nil, "", "")) { return nil, err @@ -101,7 +105,10 @@ func orgDomain(ctx context.Context, filter preparation.FilterToQueryReducer, org return wm, nil } -func (c *Commands) VerifyOrgDomain(ctx context.Context, orgID, domain string) (*domain.ObjectDetails, error) { +func (c *Commands) VerifyOrgDomain(ctx context.Context, orgID, domain string) (_ *domain.ObjectDetails, err error) { + ctx, span := tracing.NewSpan(ctx) + defer func() { span.EndWithError(err) }() + orgAgg := org.NewAggregate(orgID) cmds, err := preparation.PrepareCommands(ctx, c.eventstore.Filter, verifyOrgDomain(orgAgg, domain)) if err != nil { @@ -114,7 +121,10 @@ func (c *Commands) VerifyOrgDomain(ctx context.Context, orgID, domain string) (* return pushedEventsToObjectDetails(pushedEvents), nil } -func (c *Commands) AddOrgDomain(ctx context.Context, orgID, domain string, claimedUserIDs []string) (*domain.ObjectDetails, error) { +func (c *Commands) AddOrgDomain(ctx context.Context, orgID, domain string, claimedUserIDs []string) (_ *domain.ObjectDetails, err error) { + ctx, span := tracing.NewSpan(ctx) + defer func() { span.EndWithError(err) }() + orgAgg := org.NewAggregate(orgID) cmds, err := preparation.PrepareCommands(ctx, c.eventstore.Filter, c.prepareAddOrgDomain(orgAgg, domain, claimedUserIDs)) if err != nil { @@ -220,7 +230,10 @@ func (c *Commands) ValidateOrgDomain(ctx context.Context, orgDomain *domain.OrgD return nil, err } -func (c *Commands) SetPrimaryOrgDomain(ctx context.Context, orgDomain *domain.OrgDomain) (*domain.ObjectDetails, error) { +func (c *Commands) SetPrimaryOrgDomain(ctx context.Context, orgDomain *domain.OrgDomain) (_ *domain.ObjectDetails, err error) { + ctx, span := tracing.NewSpan(ctx) + defer func() { span.EndWithError(err) }() + if orgDomain == nil || !orgDomain.IsValid() || orgDomain.AggregateID == "" { return nil, zerrors.ThrowInvalidArgument(nil, "ORG-SsDG2", "Errors.Org.InvalidDomain") } @@ -366,9 +379,12 @@ func (c *Commands) removeCustomDomains(ctx context.Context, orgID string) ([]eve return events, nil } -func (c *Commands) getOrgDomainWriteModel(ctx context.Context, orgID, domain string) (*OrgDomainWriteModel, error) { +func (c *Commands) getOrgDomainWriteModel(ctx context.Context, orgID, domain string) (_ *OrgDomainWriteModel, err error) { + ctx, span := tracing.NewSpan(ctx) + defer func() { span.EndWithError(err) }() + domainWriteModel := NewOrgDomainWriteModel(orgID, domain) - err := c.eventstore.FilterToQueryReducer(ctx, domainWriteModel) + err = c.eventstore.FilterToQueryReducer(ctx, domainWriteModel) if err != nil { return nil, err } diff --git a/internal/command/org_flow.go b/internal/command/org_flow.go index 9a9d47c966..eff7a90286 100644 --- a/internal/command/org_flow.go +++ b/internal/command/org_flow.go @@ -6,6 +6,7 @@ import ( "github.com/zitadel/zitadel/internal/domain" "github.com/zitadel/zitadel/internal/repository/org" + "github.com/zitadel/zitadel/internal/telemetry/tracing" "github.com/zitadel/zitadel/internal/zerrors" ) @@ -32,7 +33,10 @@ func (c *Commands) ClearFlow(ctx context.Context, flowType domain.FlowType, reso return writeModelToObjectDetails(&existingFlow.WriteModel), nil } -func (c *Commands) SetTriggerActions(ctx context.Context, flowType domain.FlowType, triggerType domain.TriggerType, actionIDs []string, resourceOwner string) (*domain.ObjectDetails, error) { +func (c *Commands) SetTriggerActions(ctx context.Context, flowType domain.FlowType, triggerType domain.TriggerType, actionIDs []string, resourceOwner string) (_ *domain.ObjectDetails, err error) { + ctx, span := tracing.NewSpan(ctx) + defer func() { span.EndWithError(err) }() + if !flowType.Valid() || !triggerType.Valid() || resourceOwner == "" { return nil, zerrors.ThrowInvalidArgument(nil, "COMMAND-Dfhj5", "Errors.Flow.FlowTypeMissing") } @@ -67,9 +71,12 @@ func (c *Commands) SetTriggerActions(ctx context.Context, flowType domain.FlowTy return writeModelToObjectDetails(&existingFlow.WriteModel), nil } -func (c *Commands) getOrgFlowWriteModelByType(ctx context.Context, flowType domain.FlowType, resourceOwner string) (*OrgFlowWriteModel, error) { +func (c *Commands) getOrgFlowWriteModelByType(ctx context.Context, flowType domain.FlowType, resourceOwner string) (_ *OrgFlowWriteModel, err error) { + ctx, span := tracing.NewSpan(ctx) + defer func() { span.EndWithError(err) }() + flowWriteModel := NewOrgFlowWriteModel(flowType, resourceOwner) - err := c.eventstore.FilterToQueryReducer(ctx, flowWriteModel) + err = c.eventstore.FilterToQueryReducer(ctx, flowWriteModel) if err != nil { return nil, err } diff --git a/internal/command/org_idp_config.go b/internal/command/org_idp_config.go index 8b4954c015..b9921cd209 100644 --- a/internal/command/org_idp_config.go +++ b/internal/command/org_idp_config.go @@ -11,7 +11,10 @@ import ( "github.com/zitadel/zitadel/internal/zerrors" ) -func (c *Commands) ImportIDPConfig(ctx context.Context, config *domain.IDPConfig, idpConfigID, resourceOwner string) (*domain.IDPConfig, error) { +func (c *Commands) ImportIDPConfig(ctx context.Context, config *domain.IDPConfig, idpConfigID, resourceOwner string) (_ *domain.IDPConfig, err error) { + ctx, span := tracing.NewSpan(ctx) + defer func() { span.EndWithError(err) }() + existingIDP, err := c.orgIDPConfigWriteModelByID(ctx, idpConfigID, resourceOwner) if err != nil { return nil, err diff --git a/internal/command/org_member.go b/internal/command/org_member.go index 9ba7ecbfff..ae9bef2151 100644 --- a/internal/command/org_member.go +++ b/internal/command/org_member.go @@ -24,7 +24,10 @@ func (c *Commands) AddOrgMemberCommand(a *org.Aggregate, userID string, roles .. if len(domain.CheckForInvalidRoles(roles, domain.OrgRolePrefix, c.zitadelRoles)) > 0 && len(domain.CheckForInvalidRoles(roles, domain.RoleSelfManagementGlobal, c.zitadelRoles)) > 0 { return nil, zerrors.ThrowInvalidArgument(nil, "Org-4N8es", "Errors.Org.MemberInvalid") } - return func(ctx context.Context, filter preparation.FilterToQueryReducer) ([]eventstore.Command, error) { + return func(ctx context.Context, filter preparation.FilterToQueryReducer) (_ []eventstore.Command, err error) { + ctx, span := tracing.NewSpan(ctx) + defer func() { span.EndWithError(err) }() + if exists, err := ExistsUser(ctx, filter, userID, ""); err != nil || !exists { return nil, zerrors.ThrowPreconditionFailed(err, "ORG-GoXOn", "Errors.User.NotFound") } @@ -73,7 +76,10 @@ func IsOrgMember(ctx context.Context, filter preparation.FilterToQueryReducer, o return isMember, nil } -func (c *Commands) AddOrgMember(ctx context.Context, orgID, userID string, roles ...string) (*domain.Member, error) { +func (c *Commands) AddOrgMember(ctx context.Context, orgID, userID string, roles ...string) (_ *domain.Member, err error) { + ctx, span := tracing.NewSpan(ctx) + defer func() { span.EndWithError(err) }() + orgAgg := org.NewAggregate(orgID) cmds, err := preparation.PrepareCommands(ctx, c.eventstore.Filter, c.AddOrgMemberCommand(orgAgg, userID, roles...)) if err != nil { diff --git a/internal/command/org_policy_domain.go b/internal/command/org_policy_domain.go index f4e4b59a93..c9a4fd547c 100644 --- a/internal/command/org_policy_domain.go +++ b/internal/command/org_policy_domain.go @@ -11,7 +11,10 @@ import ( "github.com/zitadel/zitadel/internal/zerrors" ) -func (c *Commands) AddOrgDomainPolicy(ctx context.Context, resourceOwner string, userLoginMustBeDomain, validateOrgDomains, smtpSenderAddressMatchesInstanceDomain bool) (*domain.ObjectDetails, error) { +func (c *Commands) AddOrgDomainPolicy(ctx context.Context, resourceOwner string, userLoginMustBeDomain, validateOrgDomains, smtpSenderAddressMatchesInstanceDomain bool) (_ *domain.ObjectDetails, err error) { + ctx, span := tracing.NewSpan(ctx) + defer func() { span.EndWithError(err) }() + if resourceOwner == "" { return nil, zerrors.ThrowInvalidArgument(nil, "Org-4Jfsf", "Errors.ResourceOwnerMissing") } @@ -60,7 +63,10 @@ func (c *Commands) RemoveOrgDomainPolicy(ctx context.Context, orgID string) (*do } // Deprecated: Use commands.domainPolicyWriteModel directly, to remove the domain.DomainPolicy struct -func (c *Commands) getOrgDomainPolicy(ctx context.Context, orgID string) (*domain.DomainPolicy, error) { +func (c *Commands) getOrgDomainPolicy(ctx context.Context, orgID string) (_ *domain.DomainPolicy, err error) { + ctx, span := tracing.NewSpan(ctx) + defer func() { span.EndWithError(err) }() + policy, err := c.orgDomainPolicyWriteModel(ctx, orgID) if err != nil { return nil, err @@ -90,7 +96,10 @@ func prepareAddOrgDomainPolicy( smtpSenderAddressMatchesInstanceDomain bool, ) preparation.Validation { return func() (preparation.CreateCommands, error) { - return func(ctx context.Context, filter preparation.FilterToQueryReducer) ([]eventstore.Command, error) { + return func(ctx context.Context, filter preparation.FilterToQueryReducer) (_ []eventstore.Command, err error) { + ctx, span := tracing.NewSpan(ctx) + defer func() { span.EndWithError(err) }() + writeModel, err := orgDomainPolicy(ctx, filter, a.ID) if err != nil { return nil, err diff --git a/internal/command/org_policy_label.go b/internal/command/org_policy_label.go index 4a1fff05d4..1b815585e7 100644 --- a/internal/command/org_policy_label.go +++ b/internal/command/org_policy_label.go @@ -6,10 +6,14 @@ import ( "github.com/zitadel/zitadel/internal/domain" "github.com/zitadel/zitadel/internal/repository/org" "github.com/zitadel/zitadel/internal/static" + "github.com/zitadel/zitadel/internal/telemetry/tracing" "github.com/zitadel/zitadel/internal/zerrors" ) -func (c *Commands) AddLabelPolicy(ctx context.Context, resourceOwner string, policy *domain.LabelPolicy) (*domain.LabelPolicy, error) { +func (c *Commands) AddLabelPolicy(ctx context.Context, resourceOwner string, policy *domain.LabelPolicy) (_ *domain.LabelPolicy, err error) { + ctx, span := tracing.NewSpan(ctx) + defer func() { span.EndWithError(err) }() + if resourceOwner == "" { return nil, zerrors.ThrowInvalidArgument(nil, "Org-Fn8ds", "Errors.ResourceOwnerMissing") } @@ -17,7 +21,7 @@ func (c *Commands) AddLabelPolicy(ctx context.Context, resourceOwner string, pol return nil, err } addedPolicy := NewOrgLabelPolicyWriteModel(resourceOwner) - err := c.eventstore.FilterToQueryReducer(ctx, addedPolicy) + err = c.eventstore.FilterToQueryReducer(ctx, addedPolicy) if err != nil { return nil, err } @@ -98,7 +102,10 @@ func (c *Commands) ChangeLabelPolicy(ctx context.Context, resourceOwner string, return writeModelToLabelPolicy(&existingPolicy.LabelPolicyWriteModel), nil } -func (c *Commands) ActivateLabelPolicy(ctx context.Context, orgID string) (*domain.ObjectDetails, error) { +func (c *Commands) ActivateLabelPolicy(ctx context.Context, orgID string) (_ *domain.ObjectDetails, err error) { + ctx, span := tracing.NewSpan(ctx) + defer func() { span.EndWithError(err) }() + if orgID == "" { return nil, zerrors.ThrowInvalidArgument(nil, "Org-KKd4X", "Errors.ResourceOwnerMissing") } @@ -457,9 +464,12 @@ func (c *Commands) removeLabelPolicyAssets(ctx context.Context, existingPolicy * return org.NewLabelPolicyAssetsRemovedEvent(ctx, orgAgg), nil } -func (c *Commands) orgLabelPolicyWriteModelByID(ctx context.Context, orgID string) (*OrgLabelPolicyWriteModel, error) { +func (c *Commands) orgLabelPolicyWriteModelByID(ctx context.Context, orgID string) (_ *OrgLabelPolicyWriteModel, err error) { + ctx, span := tracing.NewSpan(ctx) + defer func() { span.EndWithError(err) }() + policy := NewOrgLabelPolicyWriteModel(orgID) - err := c.eventstore.FilterToQueryReducer(ctx, policy) + err = c.eventstore.FilterToQueryReducer(ctx, policy) if err != nil { return nil, err } diff --git a/internal/command/org_policy_lockout.go b/internal/command/org_policy_lockout.go index d7ace6f69e..7f59507528 100644 --- a/internal/command/org_policy_lockout.go +++ b/internal/command/org_policy_lockout.go @@ -6,10 +6,14 @@ import ( "github.com/zitadel/zitadel/internal/domain" "github.com/zitadel/zitadel/internal/eventstore" "github.com/zitadel/zitadel/internal/repository/org" + "github.com/zitadel/zitadel/internal/telemetry/tracing" "github.com/zitadel/zitadel/internal/zerrors" ) -func (c *Commands) AddLockoutPolicy(ctx context.Context, resourceOwner string, policy *domain.LockoutPolicy) (*domain.LockoutPolicy, error) { +func (c *Commands) AddLockoutPolicy(ctx context.Context, resourceOwner string, policy *domain.LockoutPolicy) (_ *domain.LockoutPolicy, err error) { + ctx, span := tracing.NewSpan(ctx) + defer func() { span.EndWithError(err) }() + if resourceOwner == "" { return nil, zerrors.ThrowInvalidArgument(nil, "Org-8fJif", "Errors.ResourceOwnerMissing") } @@ -105,9 +109,12 @@ func (c *Commands) removeLockoutPolicyIfExists(ctx context.Context, orgID string return org.NewLockoutPolicyRemovedEvent(ctx, orgAgg), nil } -func orgLockoutPolicyWriteModelByID(ctx context.Context, orgID string, queryReducer func(ctx context.Context, r eventstore.QueryReducer) error) (*OrgLockoutPolicyWriteModel, error) { +func orgLockoutPolicyWriteModelByID(ctx context.Context, orgID string, queryReducer func(ctx context.Context, r eventstore.QueryReducer) error) (_ *OrgLockoutPolicyWriteModel, err error) { + ctx, span := tracing.NewSpan(ctx) + defer func() { span.EndWithError(err) }() + policy := NewOrgLockoutPolicyWriteModel(orgID) - err := queryReducer(ctx, policy) + err = queryReducer(ctx, policy) if err != nil { return nil, err } diff --git a/internal/command/org_policy_login.go b/internal/command/org_policy_login.go index a7b2378ec3..8ae746a298 100644 --- a/internal/command/org_policy_login.go +++ b/internal/command/org_policy_login.go @@ -63,7 +63,10 @@ type ChangeLoginPolicy struct { DisableLoginWithPhone bool } -func (c *Commands) AddLoginPolicy(ctx context.Context, resourceOwner string, policy *AddLoginPolicy) (*domain.ObjectDetails, error) { +func (c *Commands) AddLoginPolicy(ctx context.Context, resourceOwner string, policy *AddLoginPolicy) (_ *domain.ObjectDetails, err error) { + ctx, span := tracing.NewSpan(ctx) + defer func() { span.EndWithError(err) }() + orgAgg := org.NewAggregate(resourceOwner) cmds, err := preparation.PrepareCommands(ctx, c.eventstore.Filter, prepareAddLoginPolicy(orgAgg, policy)) if err != nil { @@ -411,7 +414,10 @@ func prepareAddLoginPolicy(a *org.Aggregate, policy *AddLoginPolicy) preparation return nil, zerrors.ThrowInvalidArgument(nil, "Org-WSfrg", "Errors.Org.LoginPolicy.MFA.Unspecified") } } - return func(ctx context.Context, filter preparation.FilterToQueryReducer) ([]eventstore.Command, error) { + return func(ctx context.Context, filter preparation.FilterToQueryReducer) (_ []eventstore.Command, err error) { + ctx, span := tracing.NewSpan(ctx) + defer func() { span.EndWithError(err) }() + if exists, err := exists(ctx, filter, NewOrgLoginPolicyWriteModel(a.ID)); exists || err != nil { return nil, zerrors.ThrowAlreadyExists(nil, "Org-Dgfb2", "Errors.Org.LoginPolicy.AlreadyExists") } diff --git a/internal/command/org_policy_password_complexity.go b/internal/command/org_policy_password_complexity.go index 932b598afc..01ba58c98c 100644 --- a/internal/command/org_policy_password_complexity.go +++ b/internal/command/org_policy_password_complexity.go @@ -5,10 +5,14 @@ import ( "github.com/zitadel/zitadel/internal/domain" "github.com/zitadel/zitadel/internal/repository/org" + "github.com/zitadel/zitadel/internal/telemetry/tracing" "github.com/zitadel/zitadel/internal/zerrors" ) -func (c *Commands) getOrgPasswordComplexityPolicy(ctx context.Context, orgID string) (*domain.PasswordComplexityPolicy, error) { +func (c *Commands) getOrgPasswordComplexityPolicy(ctx context.Context, orgID string) (_ *domain.PasswordComplexityPolicy, err error) { + ctx, span := tracing.NewSpan(ctx) + defer func() { span.EndWithError(err) }() + policy, err := c.orgPasswordComplexityPolicyWriteModelByID(ctx, orgID) if err != nil { return nil, err @@ -28,7 +32,10 @@ func (c *Commands) orgPasswordComplexityPolicyWriteModelByID(ctx context.Context return policy, nil } -func (c *Commands) AddPasswordComplexityPolicy(ctx context.Context, resourceOwner string, policy *domain.PasswordComplexityPolicy) (*domain.PasswordComplexityPolicy, error) { +func (c *Commands) AddPasswordComplexityPolicy(ctx context.Context, resourceOwner string, policy *domain.PasswordComplexityPolicy) (_ *domain.PasswordComplexityPolicy, err error) { + ctx, span := tracing.NewSpan(ctx) + defer func() { span.EndWithError(err) }() + if resourceOwner == "" { return nil, zerrors.ThrowInvalidArgument(nil, "Org-7ufEs", "Errors.ResourceOwnerMissing") } @@ -36,7 +43,7 @@ func (c *Commands) AddPasswordComplexityPolicy(ctx context.Context, resourceOwne return nil, err } addedPolicy := NewOrgPasswordComplexityPolicyWriteModel(resourceOwner) - err := c.eventstore.FilterToQueryReducer(ctx, addedPolicy) + err = c.eventstore.FilterToQueryReducer(ctx, addedPolicy) if err != nil { return nil, err } diff --git a/internal/command/org_policy_privacy.go b/internal/command/org_policy_privacy.go index 3e0497ccb4..26546b05aa 100644 --- a/internal/command/org_policy_privacy.go +++ b/internal/command/org_policy_privacy.go @@ -5,6 +5,7 @@ import ( "github.com/zitadel/zitadel/internal/domain" "github.com/zitadel/zitadel/internal/repository/org" + "github.com/zitadel/zitadel/internal/telemetry/tracing" "github.com/zitadel/zitadel/internal/zerrors" ) @@ -28,7 +29,9 @@ func (c *Commands) orgPrivacyPolicyWriteModelByID(ctx context.Context, orgID str return policy, nil } -func (c *Commands) AddPrivacyPolicy(ctx context.Context, resourceOwner string, policy *domain.PrivacyPolicy) (*domain.PrivacyPolicy, error) { +func (c *Commands) AddPrivacyPolicy(ctx context.Context, resourceOwner string, policy *domain.PrivacyPolicy) (_ *domain.PrivacyPolicy, err error) { + ctx, span := tracing.NewSpan(ctx) + defer func() { span.EndWithError(err) }() if policy.SupportEmail != "" { if err := policy.SupportEmail.Validate(); err != nil { @@ -41,7 +44,7 @@ func (c *Commands) AddPrivacyPolicy(ctx context.Context, resourceOwner string, p return nil, zerrors.ThrowInvalidArgument(nil, "Org-MMk9fs", "Errors.ResourceOwnerMissing") } addedPolicy := NewOrgPrivacyPolicyWriteModel(resourceOwner) - err := c.eventstore.FilterToQueryReducer(ctx, addedPolicy) + err = c.eventstore.FilterToQueryReducer(ctx, addedPolicy) if err != nil { return nil, err } diff --git a/internal/command/project.go b/internal/command/project.go index 6837fabd90..be8ea242c9 100644 --- a/internal/command/project.go +++ b/internal/command/project.go @@ -10,10 +10,14 @@ import ( "github.com/zitadel/zitadel/internal/domain" "github.com/zitadel/zitadel/internal/eventstore" "github.com/zitadel/zitadel/internal/repository/project" + "github.com/zitadel/zitadel/internal/telemetry/tracing" "github.com/zitadel/zitadel/internal/zerrors" ) func (c *Commands) AddProjectWithID(ctx context.Context, project *domain.Project, resourceOwner, projectID string) (_ *domain.Project, err error) { + ctx, span := tracing.NewSpan(ctx) + defer func() { span.EndWithError(err) }() + existingProject, err := c.getProjectWriteModelByID(ctx, projectID, resourceOwner) if err != nil { return nil, err @@ -147,7 +151,10 @@ func projectWriteModel(ctx context.Context, filter preparation.FilterToQueryRedu return project, nil } -func (c *Commands) getProjectByID(ctx context.Context, projectID, resourceOwner string) (*domain.Project, error) { +func (c *Commands) getProjectByID(ctx context.Context, projectID, resourceOwner string) (_ *domain.Project, err error) { + ctx, span := tracing.NewSpan(ctx) + defer func() { span.EndWithError(err) }() + projectWriteModel, err := c.getProjectWriteModelByID(ctx, projectID, resourceOwner) if err != nil { return nil, err @@ -158,7 +165,10 @@ func (c *Commands) getProjectByID(ctx context.Context, projectID, resourceOwner return projectWriteModelToProject(projectWriteModel), nil } -func (c *Commands) checkProjectExists(ctx context.Context, projectID, resourceOwner string) error { +func (c *Commands) checkProjectExists(ctx context.Context, projectID, resourceOwner string) (err error) { + ctx, span := tracing.NewSpan(ctx) + defer func() { span.EndWithError(err) }() + projectWriteModel, err := c.getProjectWriteModelByID(ctx, projectID, resourceOwner) if err != nil { return err @@ -312,9 +322,12 @@ func (c *Commands) RemoveProject(ctx context.Context, projectID, resourceOwner s return writeModelToObjectDetails(&existingProject.WriteModel), nil } -func (c *Commands) getProjectWriteModelByID(ctx context.Context, projectID, resourceOwner string) (*ProjectWriteModel, error) { +func (c *Commands) getProjectWriteModelByID(ctx context.Context, projectID, resourceOwner string) (_ *ProjectWriteModel, err error) { + ctx, span := tracing.NewSpan(ctx) + defer func() { span.EndWithError(err) }() + projectWriteModel := NewProjectWriteModel(projectID, resourceOwner) - err := c.eventstore.FilterToQueryReducer(ctx, projectWriteModel) + err = c.eventstore.FilterToQueryReducer(ctx, projectWriteModel) if err != nil { return nil, err } diff --git a/internal/command/project_application.go b/internal/command/project_application.go index 07bfa837b1..0ccf5dc852 100644 --- a/internal/command/project_application.go +++ b/internal/command/project_application.go @@ -5,6 +5,7 @@ import ( "github.com/zitadel/zitadel/internal/domain" "github.com/zitadel/zitadel/internal/repository/project" + "github.com/zitadel/zitadel/internal/telemetry/tracing" "github.com/zitadel/zitadel/internal/zerrors" ) @@ -129,9 +130,12 @@ func (c *Commands) RemoveApplication(ctx context.Context, projectID, appID, reso return writeModelToObjectDetails(&existingApp.WriteModel), nil } -func (c *Commands) getApplicationWriteModel(ctx context.Context, projectID, appID, resourceOwner string) (*ApplicationWriteModel, error) { +func (c *Commands) getApplicationWriteModel(ctx context.Context, projectID, appID, resourceOwner string) (_ *ApplicationWriteModel, err error) { + ctx, span := tracing.NewSpan(ctx) + defer func() { span.EndWithError(err) }() + appWriteModel := NewApplicationWriteModelWithAppIDC(projectID, appID, resourceOwner) - err := c.eventstore.FilterToQueryReducer(ctx, appWriteModel) + err = c.eventstore.FilterToQueryReducer(ctx, appWriteModel) if err != nil { return nil, err } diff --git a/internal/command/project_application_api.go b/internal/command/project_application_api.go index b1af6c1e5d..a697305ac9 100644 --- a/internal/command/project_application_api.go +++ b/internal/command/project_application_api.go @@ -68,6 +68,9 @@ func (c *Commands) AddAPIAppCommand(app *addAPIApp) preparation.Validation { } func (c *Commands) AddAPIApplicationWithID(ctx context.Context, apiApp *domain.APIApp, resourceOwner, appID string) (_ *domain.APIApp, err error) { + ctx, span := tracing.NewSpan(ctx) + defer func() { span.EndWithError(err) }() + existingAPI, err := c.getAPIAppWriteModel(ctx, apiApp.AggregateID, appID, resourceOwner) if err != nil { return nil, err @@ -105,6 +108,9 @@ func (c *Commands) AddAPIApplication(ctx context.Context, apiApp *domain.APIApp, } func (c *Commands) addAPIApplicationWithID(ctx context.Context, apiApp *domain.APIApp, resourceOwner string, project *domain.Project, appID string) (_ *domain.APIApp, err error) { + ctx, span := tracing.NewSpan(ctx) + defer func() { span.EndWithError(err) }() + apiApp.AppID = appID addedApplication := NewAPIApplicationWriteModel(apiApp.AggregateID, resourceOwner) @@ -262,9 +268,12 @@ func (c *Commands) APISecretCheckFailed(ctx context.Context, appID, projectID, r c.apiSecretCheckFailed(ctx, &agg.Aggregate, appID) } -func (c *Commands) getAPIAppWriteModel(ctx context.Context, projectID, appID, resourceOwner string) (*APIApplicationWriteModel, error) { +func (c *Commands) getAPIAppWriteModel(ctx context.Context, projectID, appID, resourceOwner string) (_ *APIApplicationWriteModel, err error) { + ctx, span := tracing.NewSpan(ctx) + defer func() { span.EndWithError(err) }() + appWriteModel := NewAPIApplicationWriteModelWithAppID(projectID, appID, resourceOwner) - err := c.eventstore.FilterToQueryReducer(ctx, appWriteModel) + err = c.eventstore.FilterToQueryReducer(ctx, appWriteModel) if err != nil { return nil, err } diff --git a/internal/command/project_application_key.go b/internal/command/project_application_key.go index 1b791c2670..519e9fc30a 100644 --- a/internal/command/project_application_key.go +++ b/internal/command/project_application_key.go @@ -10,6 +10,9 @@ import ( ) func (c *Commands) AddApplicationKeyWithID(ctx context.Context, key *domain.ApplicationKey, resourceOwner string) (_ *domain.ApplicationKey, err error) { + ctx, span := tracing.NewSpan(ctx) + defer func() { span.EndWithError(err) }() + writeModel, err := c.applicationKeyWriteModelByID(ctx, key.AggregateID, key.ApplicationID, key.KeyID, resourceOwner) if err != nil { return nil, err @@ -47,6 +50,8 @@ func (c *Commands) AddApplicationKey(ctx context.Context, key *domain.Applicatio } func (c *Commands) addApplicationKey(ctx context.Context, key *domain.ApplicationKey, resourceOwner string) (_ *domain.ApplicationKey, err error) { + ctx, span := tracing.NewSpan(ctx) + defer func() { span.EndWithError(err) }() keyWriteModel := NewApplicationKeyWriteModel(key.AggregateID, key.ApplicationID, key.KeyID, resourceOwner) err = c.eventstore.FilterToQueryReducer(ctx, keyWriteModel) diff --git a/internal/command/project_application_oidc.go b/internal/command/project_application_oidc.go index b4a9eaae9b..6c9df8a69a 100644 --- a/internal/command/project_application_oidc.go +++ b/internal/command/project_application_oidc.go @@ -115,6 +115,9 @@ func (c *Commands) AddOIDCAppCommand(app *addOIDCApp) preparation.Validation { } func (c *Commands) AddOIDCApplicationWithID(ctx context.Context, oidcApp *domain.OIDCApp, resourceOwner, appID string) (_ *domain.OIDCApp, err error) { + ctx, span := tracing.NewSpan(ctx) + defer func() { span.EndWithError(err) }() + existingApp, err := c.getOIDCAppWriteModel(ctx, oidcApp.AggregateID, appID, resourceOwner) if err != nil { return nil, err @@ -153,6 +156,9 @@ func (c *Commands) AddOIDCApplication(ctx context.Context, oidcApp *domain.OIDCA } func (c *Commands) addOIDCApplicationWithID(ctx context.Context, oidcApp *domain.OIDCApp, resourceOwner string, project *domain.Project, appID string) (_ *domain.OIDCApp, err error) { + ctx, span := tracing.NewSpan(ctx) + defer func() { span.EndWithError(err) }() + addedApplication := NewOIDCApplicationWriteModel(oidcApp.AggregateID, resourceOwner) projectAgg := ProjectAggregateFromWriteModel(&addedApplication.WriteModel) @@ -343,9 +349,12 @@ func (c *Commands) OIDCSecretCheckFailed(ctx context.Context, appID, projectID, c.oidcSecretCheckFailed(ctx, &agg.Aggregate, appID) } -func (c *Commands) getOIDCAppWriteModel(ctx context.Context, projectID, appID, resourceOwner string) (*OIDCApplicationWriteModel, error) { +func (c *Commands) getOIDCAppWriteModel(ctx context.Context, projectID, appID, resourceOwner string) (_ *OIDCApplicationWriteModel, err error) { + ctx, span := tracing.NewSpan(ctx) + defer func() { span.EndWithError(err) }() + appWriteModel := NewOIDCApplicationWriteModelWithAppID(projectID, appID, resourceOwner) - err := c.eventstore.FilterToQueryReducer(ctx, appWriteModel) + err = c.eventstore.FilterToQueryReducer(ctx, appWriteModel) if err != nil { return nil, err } diff --git a/internal/command/project_grant.go b/internal/command/project_grant.go index c53e5252df..6a5ab96fee 100644 --- a/internal/command/project_grant.go +++ b/internal/command/project_grant.go @@ -14,6 +14,9 @@ import ( ) func (c *Commands) AddProjectGrantWithID(ctx context.Context, grant *domain.ProjectGrant, grantID string, resourceOwner string) (_ *domain.ProjectGrant, err error) { + ctx, span := tracing.NewSpan(ctx) + defer func() { span.EndWithError(err) }() + existingMember, err := c.projectGrantWriteModelByID(ctx, grantID, grant.AggregateID, resourceOwner) if err != nil && !zerrors.IsNotFound(err) { return nil, err diff --git a/internal/command/project_grant_member.go b/internal/command/project_grant_member.go index 096851fb42..9208ebf011 100644 --- a/internal/command/project_grant_member.go +++ b/internal/command/project_grant_member.go @@ -11,14 +11,17 @@ import ( "github.com/zitadel/zitadel/internal/zerrors" ) -func (c *Commands) AddProjectGrantMember(ctx context.Context, member *domain.ProjectGrantMember) (*domain.ProjectGrantMember, error) { +func (c *Commands) AddProjectGrantMember(ctx context.Context, member *domain.ProjectGrantMember) (_ *domain.ProjectGrantMember, err error) { + ctx, span := tracing.NewSpan(ctx) + defer func() { span.EndWithError(err) }() + if !member.IsValid() { return nil, zerrors.ThrowInvalidArgument(nil, "PROJECT-8fi7G", "Errors.Project.Grant.Member.Invalid") } if len(domain.CheckForInvalidRoles(member.Roles, domain.ProjectGrantRolePrefix, c.zitadelRoles)) > 0 { return nil, zerrors.ThrowInvalidArgument(nil, "PROJECT-m9gKK", "Errors.Project.Grant.Member.Invalid") } - err := c.checkUserExists(ctx, member.UserID, "") + err = c.checkUserExists(ctx, member.UserID, "") if err != nil { return nil, err } diff --git a/internal/command/project_member.go b/internal/command/project_member.go index e47a4c85ee..a2e4fae553 100644 --- a/internal/command/project_member.go +++ b/internal/command/project_member.go @@ -11,7 +11,10 @@ import ( "github.com/zitadel/zitadel/internal/zerrors" ) -func (c *Commands) AddProjectMember(ctx context.Context, member *domain.Member, resourceOwner string) (*domain.Member, error) { +func (c *Commands) AddProjectMember(ctx context.Context, member *domain.Member, resourceOwner string) (_ *domain.Member, err error) { + ctx, span := tracing.NewSpan(ctx) + defer func() { span.EndWithError(err) }() + addedMember := NewProjectMemberWriteModel(member.AggregateID, member.UserID, resourceOwner) projectAgg := ProjectAggregateFromWriteModel(&addedMember.WriteModel) event, err := c.addProjectMember(ctx, projectAgg, addedMember, member) @@ -31,7 +34,10 @@ func (c *Commands) AddProjectMember(ctx context.Context, member *domain.Member, return memberWriteModelToMember(&addedMember.MemberWriteModel), nil } -func (c *Commands) addProjectMember(ctx context.Context, projectAgg *eventstore.Aggregate, addedMember *ProjectMemberWriteModel, member *domain.Member) (eventstore.Command, error) { +func (c *Commands) addProjectMember(ctx context.Context, projectAgg *eventstore.Aggregate, addedMember *ProjectMemberWriteModel, member *domain.Member) (_ eventstore.Command, err error) { + ctx, span := tracing.NewSpan(ctx) + defer func() { span.EndWithError(err) }() + if !member.IsValid() { return nil, zerrors.ThrowInvalidArgument(nil, "PROJECT-W8m4l", "Errors.Project.Member.Invalid") } @@ -39,7 +45,7 @@ func (c *Commands) addProjectMember(ctx context.Context, projectAgg *eventstore. return nil, zerrors.ThrowInvalidArgument(nil, "PROJECT-3m9ds", "Errors.Project.Member.Invalid") } - err := c.checkUserExists(ctx, addedMember.UserID, "") + err = c.checkUserExists(ctx, addedMember.UserID, "") if err != nil { return nil, err } diff --git a/internal/command/project_role.go b/internal/command/project_role.go index 065d784efc..ec9a426242 100644 --- a/internal/command/project_role.go +++ b/internal/command/project_role.go @@ -8,10 +8,14 @@ import ( "github.com/zitadel/zitadel/internal/domain" "github.com/zitadel/zitadel/internal/eventstore" "github.com/zitadel/zitadel/internal/repository/project" + "github.com/zitadel/zitadel/internal/telemetry/tracing" "github.com/zitadel/zitadel/internal/zerrors" ) func (c *Commands) AddProjectRole(ctx context.Context, projectRole *domain.ProjectRole, resourceOwner string) (_ *domain.ProjectRole, err error) { + ctx, span := tracing.NewSpan(ctx) + defer func() { span.EndWithError(err) }() + err = c.checkProjectExists(ctx, projectRole.AggregateID, resourceOwner) if err != nil { return nil, err diff --git a/internal/command/user.go b/internal/command/user.go index 17b0913c5e..053095d7e8 100644 --- a/internal/command/user.go +++ b/internal/command/user.go @@ -336,7 +336,10 @@ func (c *Commands) UserDomainClaimedSent(ctx context.Context, orgID, userID stri return err } -func (c *Commands) checkUserExists(ctx context.Context, userID, resourceOwner string) error { +func (c *Commands) checkUserExists(ctx context.Context, userID, resourceOwner string) (err error) { + ctx, span := tracing.NewSpan(ctx) + defer func() { span.EndWithError(err) }() + existingUser, err := c.userWriteModelByID(ctx, userID, resourceOwner) if err != nil { return err diff --git a/internal/command/user_domain_policy.go b/internal/command/user_domain_policy.go index 2226608ff1..cce68bd10b 100644 --- a/internal/command/user_domain_policy.go +++ b/internal/command/user_domain_policy.go @@ -4,6 +4,7 @@ import ( "context" "github.com/zitadel/zitadel/internal/command/preparation" + "github.com/zitadel/zitadel/internal/telemetry/tracing" "github.com/zitadel/zitadel/internal/zerrors" ) @@ -60,7 +61,10 @@ func orgDomainPolicy(ctx context.Context, filter preparation.FilterToQueryReduce } // Deprecated: Use commands.instanceDomainPolicyWriteModel directly, to remove use of eventstore.Filter function -func instanceDomainPolicy(ctx context.Context, filter preparation.FilterToQueryReducer) (*InstanceDomainPolicyWriteModel, error) { +func instanceDomainPolicy(ctx context.Context, filter preparation.FilterToQueryReducer) (_ *InstanceDomainPolicyWriteModel, err error) { + ctx, span := tracing.NewSpan(ctx) + defer func() { span.EndWithError(err) }() + policy := NewInstanceDomainPolicyWriteModel(ctx) events, err := filter(ctx, policy.Query()) if err != nil { @@ -74,7 +78,10 @@ func instanceDomainPolicy(ctx context.Context, filter preparation.FilterToQueryR return policy, err } -func domainPolicyUsernames(ctx context.Context, filter preparation.FilterToQueryReducer, orgID string) (*DomainPolicyUsernamesWriteModel, error) { +func domainPolicyUsernames(ctx context.Context, filter preparation.FilterToQueryReducer, orgID string) (_ *DomainPolicyUsernamesWriteModel, err error) { + ctx, span := tracing.NewSpan(ctx) + defer func() { span.EndWithError(err) }() + policy := NewDomainPolicyUsernamesWriteModel(orgID) events, err := filter(ctx, policy.Query()) if err != nil { diff --git a/internal/command/user_grant.go b/internal/command/user_grant.go index f2a8a3ddbe..b37571cd37 100644 --- a/internal/command/user_grant.go +++ b/internal/command/user_grant.go @@ -12,6 +12,9 @@ import ( ) func (c *Commands) AddUserGrant(ctx context.Context, usergrant *domain.UserGrant, resourceOwner string) (_ *domain.UserGrant, err error) { + ctx, span := tracing.NewSpan(ctx) + defer func() { span.EndWithError(err) }() + event, addedUserGrant, err := c.addUserGrant(ctx, usergrant, resourceOwner) if err != nil { return nil, err @@ -284,9 +287,12 @@ func (c *Commands) userGrantWriteModelByID(ctx context.Context, userGrantID, res return writeModel, nil } -func (c *Commands) checkUserGrantPreCondition(ctx context.Context, usergrant *domain.UserGrant, resourceOwner string) error { +func (c *Commands) checkUserGrantPreCondition(ctx context.Context, usergrant *domain.UserGrant, resourceOwner string) (err error) { + ctx, span := tracing.NewSpan(ctx) + defer func() { span.EndWithError(err) }() + preConditions := NewUserGrantPreConditionReadModel(usergrant.UserID, usergrant.ProjectID, usergrant.ProjectGrantID, resourceOwner) - err := c.eventstore.FilterToQueryReducer(ctx, preConditions) + err = c.eventstore.FilterToQueryReducer(ctx, preConditions) if err != nil { return err } diff --git a/internal/command/user_human.go b/internal/command/user_human.go index 7f117751b7..35ae22e1bf 100644 --- a/internal/command/user_human.go +++ b/internal/command/user_human.go @@ -422,6 +422,9 @@ func (h *AddHuman) shouldAddInitCode() bool { // Deprecated: use commands.AddUserHuman func (c *Commands) ImportHuman(ctx context.Context, orgID string, human *domain.Human, passwordless bool, links []*domain.UserIDPLink, initCodeGenerator, emailCodeGenerator, phoneCodeGenerator, passwordlessCodeGenerator crypto.Generator) (_ *domain.Human, passwordlessCode *domain.PasswordlessInitCode, err error) { + ctx, span := tracing.NewSpan(ctx) + defer func() { span.EndWithError(err) }() + if orgID == "" { return nil, nil, zerrors.ThrowInvalidArgument(nil, "COMMAND-5N8fs", "Errors.ResourceOwnerMissing") } @@ -470,6 +473,9 @@ func (c *Commands) ImportHuman(ctx context.Context, orgID string, human *domain. } func (c *Commands) importHuman(ctx context.Context, orgID string, human *domain.Human, passwordless bool, links []*domain.UserIDPLink, domainPolicy *domain.DomainPolicy, pwPolicy *domain.PasswordComplexityPolicy, initCodeGenerator, emailCodeGenerator, phoneCodeGenerator, passwordlessCodeGenerator crypto.Generator) (events []eventstore.Command, humanWriteModel *HumanWriteModel, passwordlessCodeWriteModel *HumanPasswordlessInitCodeWriteModel, code string, err error) { + ctx, span := tracing.NewSpan(ctx) + defer func() { span.EndWithError(err) }() + if orgID == "" { return nil, nil, nil, "", zerrors.ThrowInvalidArgument(nil, "COMMAND-00p2b", "Errors.Org.Empty") } @@ -652,9 +658,12 @@ func (c *Commands) HumansSignOut(ctx context.Context, agentID string, userIDs [] return err } -func (c *Commands) getHumanWriteModelByID(ctx context.Context, userID, resourceowner string) (*HumanWriteModel, error) { +func (c *Commands) getHumanWriteModelByID(ctx context.Context, userID, resourceowner string) (_ *HumanWriteModel, err error) { + ctx, span := tracing.NewSpan(ctx) + defer func() { span.EndWithError(err) }() + humanWriteModel := NewHumanWriteModel(userID, resourceowner) - err := c.eventstore.FilterToQueryReducer(ctx, humanWriteModel) + err = c.eventstore.FilterToQueryReducer(ctx, humanWriteModel) if err != nil { return nil, err } diff --git a/internal/command/user_human_otp.go b/internal/command/user_human_otp.go index 39abab3b86..bc65ba7245 100644 --- a/internal/command/user_human_otp.go +++ b/internal/command/user_human_otp.go @@ -16,7 +16,10 @@ import ( "github.com/zitadel/zitadel/internal/zerrors" ) -func (c *Commands) ImportHumanTOTP(ctx context.Context, userID, userAgentID, resourceOwner string, key string) error { +func (c *Commands) ImportHumanTOTP(ctx context.Context, userID, userAgentID, resourceOwner string, key string) (err error) { + ctx, span := tracing.NewSpan(ctx) + defer func() { span.EndWithError(err) }() + encryptedSecret, err := crypto.Encrypt([]byte(key), c.multifactors.OTP.CryptoMFA) if err != nil { return err diff --git a/internal/command/user_idp_link.go b/internal/command/user_idp_link.go index 38d913ca6a..14f05964a1 100644 --- a/internal/command/user_idp_link.go +++ b/internal/command/user_idp_link.go @@ -12,6 +12,9 @@ import ( ) func (c *Commands) AddUserIDPLink(ctx context.Context, userID, resourceOwner string, link *AddLink) (_ *domain.ObjectDetails, err error) { + ctx, span := tracing.NewSpan(ctx) + defer func() { span.EndWithError(err) }() + if userID == "" { return nil, zerrors.ThrowInvalidArgument(nil, "COMMAND-03j8f", "Errors.IDMissing") } diff --git a/internal/command/user_machine.go b/internal/command/user_machine.go index 77953010d3..1ec32450ac 100644 --- a/internal/command/user_machine.go +++ b/internal/command/user_machine.go @@ -8,6 +8,7 @@ import ( "github.com/zitadel/zitadel/internal/eventstore" "github.com/zitadel/zitadel/internal/eventstore/v1/models" "github.com/zitadel/zitadel/internal/repository/user" + "github.com/zitadel/zitadel/internal/telemetry/tracing" "github.com/zitadel/zitadel/internal/zerrors" ) @@ -45,6 +46,9 @@ func AddMachineCommand(a *user.Aggregate, machine *Machine) preparation.Validati return nil, zerrors.ThrowInvalidArgument(nil, "COMMAND-bm9Ds", "Errors.User.Invalid") } return func(ctx context.Context, filter preparation.FilterToQueryReducer) ([]eventstore.Command, error) { + ctx, span := tracing.NewSpan(ctx) + defer func() { span.EndWithError(err) }() + writeModel, err := getMachineWriteModel(ctx, a.ID, a.ResourceOwner, filter) if err != nil { return nil, err @@ -63,7 +67,10 @@ func AddMachineCommand(a *user.Aggregate, machine *Machine) preparation.Validati } } -func (c *Commands) AddMachine(ctx context.Context, machine *Machine) (*domain.ObjectDetails, error) { +func (c *Commands) AddMachine(ctx context.Context, machine *Machine) (_ *domain.ObjectDetails, err error) { + ctx, span := tracing.NewSpan(ctx) + defer func() { span.EndWithError(err) }() + if machine.AggregateID == "" { userID, err := c.idGenerator.Next() if err != nil { @@ -140,7 +147,10 @@ func changeMachineCommand(a *user.Aggregate, machine *Machine) preparation.Valid } } -func getMachineWriteModel(ctx context.Context, userID, resourceOwner string, filter preparation.FilterToQueryReducer) (*MachineWriteModel, error) { +func getMachineWriteModel(ctx context.Context, userID, resourceOwner string, filter preparation.FilterToQueryReducer) (_ *MachineWriteModel, err error) { + ctx, span := tracing.NewSpan(ctx) + defer func() { span.EndWithError(err) }() + writeModel := NewMachineWriteModel(userID, resourceOwner) events, err := filter(ctx, writeModel.Query()) if err != nil { diff --git a/internal/command/user_machine_key.go b/internal/command/user_machine_key.go index d6abdd9545..8a0f0f437b 100644 --- a/internal/command/user_machine_key.go +++ b/internal/command/user_machine_key.go @@ -10,6 +10,7 @@ import ( "github.com/zitadel/zitadel/internal/eventstore" "github.com/zitadel/zitadel/internal/eventstore/v1/models" "github.com/zitadel/zitadel/internal/repository/user" + "github.com/zitadel/zitadel/internal/telemetry/tracing" "github.com/zitadel/zitadel/internal/zerrors" ) @@ -96,7 +97,10 @@ func (key *MachineKey) checkAggregate(ctx context.Context, filter preparation.Fi return nil } -func (c *Commands) AddUserMachineKey(ctx context.Context, machineKey *MachineKey) (*domain.ObjectDetails, error) { +func (c *Commands) AddUserMachineKey(ctx context.Context, machineKey *MachineKey) (_ *domain.ObjectDetails, err error) { + ctx, span := tracing.NewSpan(ctx) + defer func() { span.EndWithError(err) }() + if machineKey.KeyID == "" { keyID, err := c.idGenerator.Next() if err != nil { @@ -127,6 +131,9 @@ func prepareAddUserMachineKey(machineKey *MachineKey, keySize int) preparation.V return nil, err } return func(ctx context.Context, filter preparation.FilterToQueryReducer) ([]eventstore.Command, error) { + ctx, span := tracing.NewSpan(ctx) + defer func() { span.EndWithError(err) }() + if err := machineKey.checkAggregate(ctx, filter); err != nil { return nil, err } diff --git a/internal/command/user_metadata.go b/internal/command/user_metadata.go index e33da532cd..d47c5b61d0 100644 --- a/internal/command/user_metadata.go +++ b/internal/command/user_metadata.go @@ -6,10 +6,14 @@ import ( "github.com/zitadel/zitadel/internal/domain" "github.com/zitadel/zitadel/internal/eventstore" "github.com/zitadel/zitadel/internal/repository/user" + "github.com/zitadel/zitadel/internal/telemetry/tracing" "github.com/zitadel/zitadel/internal/zerrors" ) func (c *Commands) SetUserMetadata(ctx context.Context, metadata *domain.Metadata, userID, resourceOwner string) (_ *domain.Metadata, err error) { + ctx, span := tracing.NewSpan(ctx) + defer func() { span.EndWithError(err) }() + err = c.checkUserExists(ctx, userID, resourceOwner) if err != nil { return nil, err diff --git a/internal/domain/human.go b/internal/domain/human.go index d81aed1f71..f917831375 100644 --- a/internal/domain/human.go +++ b/internal/domain/human.go @@ -8,6 +8,7 @@ import ( "github.com/zitadel/zitadel/internal/crypto" es_models "github.com/zitadel/zitadel/internal/eventstore/v1/models" + "github.com/zitadel/zitadel/internal/telemetry/tracing" "github.com/zitadel/zitadel/internal/zerrors" ) @@ -104,7 +105,10 @@ func (u *Human) EnsureDisplayName() { u.DisplayName = u.Username } -func (u *Human) HashPasswordIfExisting(ctx context.Context, policy *PasswordComplexityPolicy, hasher *crypto.Hasher, onetime bool) error { +func (u *Human) HashPasswordIfExisting(ctx context.Context, policy *PasswordComplexityPolicy, hasher *crypto.Hasher, onetime bool) (err error) { + ctx, span := tracing.NewSpan(ctx) + defer func() { span.EndWithError(err) }() + if u.Password != nil { u.Password.ChangeRequired = onetime return u.Password.HashPasswordIfExisting(ctx, policy, hasher) diff --git a/internal/eventstore/repository/sql/crdb.go b/internal/eventstore/repository/sql/crdb.go index 9f925d4635..a60a2ef7b8 100644 --- a/internal/eventstore/repository/sql/crdb.go +++ b/internal/eventstore/repository/sql/crdb.go @@ -18,6 +18,7 @@ import ( "github.com/zitadel/zitadel/internal/database/dialect" "github.com/zitadel/zitadel/internal/eventstore" "github.com/zitadel/zitadel/internal/eventstore/repository" + "github.com/zitadel/zitadel/internal/telemetry/tracing" "github.com/zitadel/zitadel/internal/zerrors" ) @@ -248,8 +249,11 @@ func (db *CRDB) handleUniqueConstraints(ctx context.Context, tx *sql.Tx, uniqueC } // FilterToReducer finds all events matching the given search query and passes them to the reduce function. -func (crdb *CRDB) FilterToReducer(ctx context.Context, searchQuery *eventstore.SearchQueryBuilder, reduce eventstore.Reducer) error { - err := query(ctx, crdb, searchQuery, reduce, false) +func (crdb *CRDB) FilterToReducer(ctx context.Context, searchQuery *eventstore.SearchQueryBuilder, reduce eventstore.Reducer) (err error) { + ctx, span := tracing.NewSpan(ctx) + defer func() { span.EndWithError(err) }() + + err = query(ctx, crdb, searchQuery, reduce, false) if err == nil { return nil } diff --git a/internal/query/secret_generators.go b/internal/query/secret_generators.go index 9517f53f4c..ffd62bd26f 100644 --- a/internal/query/secret_generators.go +++ b/internal/query/secret_generators.go @@ -102,7 +102,10 @@ type SecretGeneratorSearchQueries struct { Queries []SearchQuery } -func (q *Queries) InitEncryptionGenerator(ctx context.Context, generatorType domain.SecretGeneratorType, algorithm crypto.EncryptionAlgorithm) (crypto.Generator, error) { +func (q *Queries) InitEncryptionGenerator(ctx context.Context, generatorType domain.SecretGeneratorType, algorithm crypto.EncryptionAlgorithm) (_ crypto.Generator, err error) { + ctx, span := tracing.NewSpan(ctx) + defer func() { span.EndWithError(err) }() + generatorConfig, err := q.SecretGeneratorByType(ctx, generatorType) if err != nil { return nil, err From 4101e1cd4961ff08217dc3807ac2e667e1031684 Mon Sep 17 00:00:00 2001 From: Jan-Frederic Schubert Date: Thu, 20 Jun 2024 14:55:03 +0200 Subject: [PATCH 41/44] chore(docs): Migrate from Docusaurus v2 to v3 (#8036) Migrate Docs to latest version of Docusaursu (3.3.2 as of time of writing) --------- Co-authored-by: Florian Forster --- docs/docs/apis/openidoauth/claims.md | 10 +- docs/docs/apis/openidoauth/endpoints.mdx | 16 +- docs/docs/apis/v3.mdx | 56 +- docs/docs/concepts/features/audit-trail.md | 2 +- .../concepts/features/external-user-grant.md | 2 +- .../concepts/features/identity-brokering.md | 2 +- docs/docs/concepts/structure/applications.md | 2 +- docs/docs/concepts/structure/users.md | 2 +- .../examples/identity-proxy/oauth2-proxy.md | 2 +- docs/docs/examples/login/angular.md | 2 +- docs/docs/examples/login/go.md | 2 +- docs/docs/examples/login/java-spring.md | 2 +- docs/docs/examples/login/nextjs-b2b.md | 2 +- docs/docs/examples/login/nextjs.md | 2 +- docs/docs/examples/login/symfony.md | 2 +- .../identity-providers/introduction.md | 4 +- .../integrate/identity-providers/keycloak.mdx | 2 +- .../identity-providers/linkedin_oauth.mdx | 2 +- .../integrate/identity-providers/mocksaml.mdx | 2 +- .../identity-providers/okta-oidc.mdx | 3 +- .../identity-providers/okta_saml.mdx | 2 +- docs/docs/guides/integrate/onboarding/b2b.mdx | 4 +- .../guides/integrate/retrieve-user-roles.md | 8 +- .../authenticate-service-users.md | 2 +- .../service-users/client-credentials.md | 2 +- .../integrate/services/atlassian-saml.md | 6 +- .../guides/integrate/services/auth0-saml.md | 2 +- .../guides/integrate/services/aws-saml.md | 2 +- .../integrate/services/cloudflare-oidc.mdx | 2 +- .../guides/integrate/services/gitlab-saml.md | 2 +- .../integrate/services/google-workspace.md | 12 +- docs/docs/guides/integrate/tools/apache2.mdx | 2 +- .../manage/console/default-settings.mdx | 4 +- docs/docs/guides/manage/console/projects.mdx | 2 +- .../guides/manage/customize/restrictions.md | 2 +- .../guides/manage/customize/user-metadata.md | 2 +- docs/docs/guides/migrate/users.md | 4 +- docs/docs/legal/policies/privacy-policy.mdx | 4 +- docs/docs/self-hosting/deploy/compose.mdx | 8 +- .../loadbalancing-example.mdx | 20 +- .../manage/configure/_compose.mdx | 16 +- .../self-hosting/manage/configure/_helm.mdx | 8 +- .../manage/configure/_linuxunix.mdx | 12 +- .../self-hosting/manage/database/database.mdx | 2 - .../manage/reverseproxy/httpd/httpd.mdx | 1 + .../manage/reverseproxy/nginx/nginx.mdx | 1 + .../manage/reverseproxy/traefik/traefik.mdx | 1 + .../docs/self-hosting/manage/usage_control.md | 6 +- docs/docusaurus.config.js | 24 +- docs/package.json | 38 +- docs/sidebars.js | 24 +- docs/vercel.json | 1 + docs/yarn.lock | 11404 +++++++++------- proto/zitadel/admin.proto | 3 + proto/zitadel/auth.proto | 3 + proto/zitadel/system.proto | 9 + 56 files changed, 6421 insertions(+), 5343 deletions(-) diff --git a/docs/docs/apis/openidoauth/claims.md b/docs/docs/apis/openidoauth/claims.md index 553cae1706..c06fb2c1e3 100644 --- a/docs/docs/apis/openidoauth/claims.md +++ b/docs/docs/apis/openidoauth/claims.md @@ -32,7 +32,7 @@ Please check below the matrix for an overview where which scope is asserted. | phone_verified | When requested | When requested | When requested and response_type `id_token` | No | | preferred_username (username when Introspect) | When requested | When requested | Yes | No | | sub | Yes | Yes | Yes | When JWT | -| urn:zitadel:iam:org:domain:primary:{domainname} | When requested | When requested | When requested | When JWT and requested | +| urn:zitadel:iam:org:domain:primary:\{domainname} | When requested | When requested | When requested | When JWT and requested | | urn:zitadel:iam:org:project:roles | When requested | When requested | When requested or configured | When JWT and requested or configured | | urn:zitadel:iam:user:metadata | When requested | When requested | When requested | When JWT and requested | | urn:zitadel:iam:user:resourceowner:id | When requested | When requested | When requested | When JWT and requested | @@ -101,11 +101,11 @@ ZITADEL reserves some claims to assert certain data. Please check out the [reser | Claims | Example | Description | | :------------------------------------------------ | :------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| urn:zitadel:iam:action:{actionname}:log | `{"urn:zitadel:iam:action:appendCustomClaims:log": ["test log", "another test log"]}` | This claim is set during Actions as a log, e.g. if two custom claims with the same keys are set. | -| urn:zitadel:iam:org:domain:primary:{domainname} | `{"urn:zitadel:iam:org:domain:primary": "acme.ch"}` | This claim represents the primary domain of the organization the user belongs to. | +| urn:zitadel:iam:action:\{actionname}:log | `{"urn:zitadel:iam:action:appendCustomClaims:log": ["test log", "another test log"]}` | This claim is set during Actions as a log, e.g. if two custom claims with the same keys are set. | +| urn:zitadel:iam:org:domain:primary:\{domainname} | `{"urn:zitadel:iam:org:domain:primary": "acme.ch"}` | This claim represents the primary domain of the organization the user belongs to. | | urn:zitadel:iam:org:project:roles | `{"urn:zitadel:iam:org:project:roles": [ {"user": {"id1": "acme.zitade.ch", "id2": "caos.ch"} } ] }` | When roles are asserted, ZITADEL does this by providing the `id` and `primaryDomain` below the role. This gives you the option to check in which organization a user has the role on the current project (where your client belongs to). | -| urn:zitadel:iam:org:project:{projectid}:roles | `{"urn:zitadel:iam:org:project:id3:roles": [ {"user": {"id1": "acme.zitade.ch", "id2": "caos.ch"} } ] }` | When roles are asserted, ZITADEL does this by providing the `id` and `primaryDomain` below the role. This gives you the option to check in which organization a user has the role on a specific project. | -| urn:zitadel:iam:roles:{rolename} | TBA | TBA | +| urn:zitadel:iam:org:project:\{projectid}:roles | `{"urn:zitadel:iam:org:project:id3:roles": [ {"user": {"id1": "acme.zitade.ch", "id2": "caos.ch"} } ] }` | When roles are asserted, ZITADEL does this by providing the `id` and `primaryDomain` below the role. This gives you the option to check in which organization a user has the role on a specific project. | +| urn:zitadel:iam:roles:\{rolename} | TBA | TBA | | urn:zitadel:iam:user:metadata | `{"urn:zitadel:iam:user:metadata": [ {"key": "VmFsdWU=" } ] }` | The metadata claim will include all metadata of a user. The values are base64 encoded. | | urn:zitadel:iam:user:resourceowner:id | `{"urn:zitadel:iam:user:resourceowner:id": "orgid"}` | This claim represents the id of the resource owner organisation of the user. | | urn:zitadel:iam:user:resourceowner:name | `{"urn:zitadel:iam:user:resourceowner:name": "ACME"}` | This claim represents the name of the resource owner organisation of the user. | diff --git a/docs/docs/apis/openidoauth/endpoints.mdx b/docs/docs/apis/openidoauth/endpoints.mdx index 10b6709f19..304ac3c539 100644 --- a/docs/docs/apis/openidoauth/endpoints.mdx +++ b/docs/docs/apis/openidoauth/endpoints.mdx @@ -12,13 +12,13 @@ import TokenExchangeTypes from "./_token_exchange_types.mdx"; ## OpenID Connect 1.0 Discovery The OpenID Connect Discovery Endpoint is located within the issuer domain. -This would give us {your_domain}/.well-known/openid-configuration. +This would give us `{your_domain}/.well-known/openid-configuration`. **Link to spec.** [OpenID Connect Discovery 1.0 incorporating errata set 1](https://openid.net/specs/openid-connect-discovery-1_0.html) ## authorization_endpoint -{your_domain}/oauth/v2/authorize +`{your_domain}/oauth/v2/authorize` :::note The authorization_endpoint is located with the login page, due to the need of accessing the same cookie domain @@ -172,7 +172,7 @@ the error will be display directly to the user on the auth server ## token_endpoint -{your_domain}/oauth/v2/token +`{your_domain}/oauth/v2/token` The token_endpoint will as the name suggests return various tokens (access, id and refresh) depending on the used `grant_type`. When using [`authorization_code`](#authorization-code-grant-code-exchange) flow call this endpoint after receiving the code from the authorization_endpoint. @@ -471,7 +471,7 @@ Send a `client_assertion` as JWT for us to validate the signature against the re ## introspection_endpoint -{your_domain}/oauth/v2/introspect +`{your_domain}/oauth/v2/introspect` This endpoint enables clients to validate an `acccess_token`, either opaque or JWT. Unlike client side JWT validation, this endpoint will check if the token is not revoked (by client or logout). @@ -554,7 +554,7 @@ If the authorization fails, an HTTP 401 with `invalid_client` will be returned. ## userinfo_endpoint -{your_domain}/oidc/v1/userinfo +`{your_domain}/oidc/v1/userinfo` This endpoint will return information about the authorized user. @@ -577,7 +577,7 @@ If the token is invalid or expired, an HTTP 401 will be returned. ## revocation_endpoint -{your_domain}/oauth/v2/revoke +`{your_domain}/oauth/v2/revoke` This endpoint enables clients to revoke an `access_token` or `refresh_token` they have been granted. @@ -649,7 +649,7 @@ curl --request POST \ ## end_session_endpoint -{your_domain}/oidc/v1/end_session +`{your_domain}/oidc/v1/end_session` The endpoint has to be opened in the user agent (browser) to terminate the user sessions. @@ -667,7 +667,7 @@ If both parameters are provided, they must be equal. ## jwks_uri -{your_domain}/oauth/v2/keys +`{your_domain}/oauth/v2/keys` The endpoint returns a JSON Web Key Set (JWKS) containing the public keys that can be used to locally validate JWTs you received from ZITADEL. The alternative would be to validate tokens with the [introspection endpoint](#introspection_endpoint). diff --git a/docs/docs/apis/v3.mdx b/docs/docs/apis/v3.mdx index 839750fc47..10644ed37a 100644 --- a/docs/docs/apis/v3.mdx +++ b/docs/docs/apis/v3.mdx @@ -134,21 +134,21 @@ Additional to the standard CRUD methods: - ListAvailableExecutionMethods - ListAvailableExecutionFunctions -
action_service.proto +\
action_service.proto {ActionServiceProto} -
+\
-
action_target.proto +\
action_target.proto {ActionTargetProto} -
+\
-
action_execution.proto +\
action_execution.proto {ActionExecutionProto} -
+\
-
action_query.proto +\
action_query.proto {ActionSearchProto} -
+\
### ZITADELUsers @@ -163,29 +163,29 @@ Standard CRUD methods - Standard CRUD and methods for all IDPs - Resources have additional properties for reusability capabilities. -
idp_service.proto +\
idp_service.proto {IDPServiceProto} -
+\
-
idp.proto +\
idp.proto {IDPProto} -
+\
-
idp_search.proto +\
idp_search.proto {IDPSearchProto} -
+\
-
idp_gitlab.proto +\
idp_gitlab.proto {IDPGitLabProto} -
+\
-
object.proto +\
object.proto {ObjectProto} -
+\
-
resource_object.proto +\
resource_object.proto {ResourceObjectProto} -
+\
### ZITADELInstances @@ -265,21 +265,21 @@ For a full proto example, have a look at the [ZITADELLanguageSettings service](# Default language, restricted languages, supported languages -
language_service.proto +\
language_service.proto {LanguageServiceProto} -
+\
-
language.proto +\
language.proto {LanguageProto} -
+\
-
object.proto +\
object.proto {ObjectProto} -
+\
-
settings_object.proto +\
settings_object.proto {SettingsObjectProto} -
+\
### ZITADELTextSettings diff --git a/docs/docs/concepts/features/audit-trail.md b/docs/docs/concepts/features/audit-trail.md index 355029a6a4..4b3775b3fb 100644 --- a/docs/docs/concepts/features/audit-trail.md +++ b/docs/docs/concepts/features/audit-trail.md @@ -45,7 +45,7 @@ Go to your instance settings and then click on the Tab **Events** to open the Ev Since everything that is available in Console can also be called with our APIs, you can access all events and audit data trough our APIs: - [Event API Guide](/docs/guides/integrate/zitadel-apis/event-api) -- [API Documentation](/docs/category/apis/resources/admin/events) +- [API Documentation](/docs/apis/resources/admin/events) Access to the API is possible with a [Service User](/docs/guides/integrate/service-users/authenticate-service-users) account, allowing you to integrate the events with your own business logic. diff --git a/docs/docs/concepts/features/external-user-grant.md b/docs/docs/concepts/features/external-user-grant.md index cb72f5054d..0bb79476c2 100644 --- a/docs/docs/concepts/features/external-user-grant.md +++ b/docs/docs/concepts/features/external-user-grant.md @@ -35,6 +35,6 @@ In some use cases, external user grants are a simple way to allow users access t ## References -* [API reference for user grants](/docs/category/apis/resources/mgmt/user-grants) +* [API reference for user grants](/docs/apis/resources/mgmt/user-grants) * [How to manage user grants through ZITADEL's console](/docs/guides/manage/console/roles#authorizations) * [More about multi-tenancy with ZITADEL](https://zitadel.com/blog/multi-tenancy-with-organizations) diff --git a/docs/docs/concepts/features/identity-brokering.md b/docs/docs/concepts/features/identity-brokering.md index d1fb624c73..17be4f6e81 100644 --- a/docs/docs/concepts/features/identity-brokering.md +++ b/docs/docs/concepts/features/identity-brokering.md @@ -75,4 +75,4 @@ To address this, ZITADEL provides generic templates that enable connection to vi * [Detailed integration guide for many identity providers](/guides/integrate/identity-providers/introduction) * [Setup identity providers with Console](/guides/manage/console/default-settings#identity-providers) -* [Configure identity providers with the ZITADEL API](/docs/category/apis/resources/mgmt/identity-providers) +* [Configure identity providers with the ZITADEL API](/docs/apis/resources/mgmt/identity-providers) diff --git a/docs/docs/concepts/structure/applications.md b/docs/docs/concepts/structure/applications.md index 183e4bc032..f9c8f30a0f 100644 --- a/docs/docs/concepts/structure/applications.md +++ b/docs/docs/concepts/structure/applications.md @@ -25,4 +25,4 @@ Ensure the configuration of application settings is limited to authorized users ## References - [Configure Applications in the Console](../../guides/manage/console/applications) -- [ZITADEL API: Applications](/docs/category/apis/resources/mgmt/applications) +- [ZITADEL API: Applications](/docs/apis/resources/mgmt/applications) diff --git a/docs/docs/concepts/structure/users.md b/docs/docs/concepts/structure/users.md index b6440f33ad..80568e8473 100644 --- a/docs/docs/concepts/structure/users.md +++ b/docs/docs/concepts/structure/users.md @@ -78,5 +78,5 @@ You can use organization metadata or your own business logic to describe a hiera ## References - [Manage users in the Console](../../guides/manage/console/users) -- [ZITADEL APIs: Users](/docs/category/apis/resources/mgmt/users) +- [ZITADEL APIs: Users](/docs/apis/resources/mgmt/users) - [User onboarding and registration](/docs/guides/integrate/onboarding) diff --git a/docs/docs/examples/identity-proxy/oauth2-proxy.md b/docs/docs/examples/identity-proxy/oauth2-proxy.md index 60de436e94..1b859fd59f 100644 --- a/docs/docs/examples/identity-proxy/oauth2-proxy.md +++ b/docs/docs/examples/identity-proxy/oauth2-proxy.md @@ -21,7 +21,7 @@ We recommend that you use [Authorization Code](/apis/openidoauth/grant-types#aut A redirect URL is a URL in your application where ZITADEL redirects the user after they have authenticated. Set your url to the domain the proxy will be deployed to or use the default one `http://127.0.0.1:4180/oauth2/callback`. -> If you are following along with the sample project you downloaded from our templates, you should set the Allowed Callback URL to . You will also have to set dev mode to `true` as this will enable unsecure http for the moment. +> If you are following along with the sample project you downloaded from our templates, you should set the Allowed Callback URL to `http://localhost:4200/auth/callback`. You will also have to set dev mode to `true` as this will enable unsecure http for the moment. If you want to redirect the users back to a route on your application after they have logged out, add an optional redirect in the post redirectURI field. diff --git a/docs/docs/examples/login/angular.md b/docs/docs/examples/login/angular.md index f2dcf38a34..b9a1d02a89 100644 --- a/docs/docs/examples/login/angular.md +++ b/docs/docs/examples/login/angular.md @@ -25,7 +25,7 @@ We recommend that you use [Proof Key for Code Exchange (PKCE)](/apis/openidoauth The Redirect URIs field tells ZITADEL where it's allowed to redirect users after authentication. For development, you can set dev mode to `true` to enable insecure HTTP and redirect to a `localhost` URI. The Post-logout redirect send the users back to a route on your application after they have logged out. -> If you are following along with the [example](https://github.com/zitadel/zitadel-angular), set the dev mode to `true`, the Redirect URIs to and Post redirect URI to . +> If you are following along with the [example](https://github.com/zitadel/zitadel-angular), set the dev mode to `true`, the Redirect URIs to `http://localhost:4200/auth/callback` and Post redirect URI to `http://localhost:4200/signedout`. Continue and create the application. diff --git a/docs/docs/examples/login/go.md b/docs/docs/examples/login/go.md index 61b55f87fc..d78b41f77f 100644 --- a/docs/docs/examples/login/go.md +++ b/docs/docs/examples/login/go.md @@ -28,7 +28,7 @@ We recommend that you use [Proof Key for Code Exchange (PKCE)](/apis/openidoauth The Redirect URIs field tells ZITADEL where it's allowed to redirect users after authentication. For development, you can set dev mode to `true` to enable insecure HTTP and redirect to a `localhost` URI. The Post-logout redirect send the users back to a route on your application after they have logged out. -> If you are following along with the [example](https://github.com/zitadel/zitadel-go), set the dev mode to `true`, the Redirect URIs to and Post-logout redirect URI to . +> If you are following along with the [example](https://github.com/zitadel/zitadel-go), set the dev mode to `true`, the Redirect URIs to `http://localhost:8089/auth/callback` and Post-logout redirect URI to [http://localhost:8089/](http://localhost:8089/)>. ![Create app in console - set redirectURI](/img/go/app-create-redirect.png) diff --git a/docs/docs/examples/login/java-spring.md b/docs/docs/examples/login/java-spring.md index 22a60c06cc..f6bf42e1be 100644 --- a/docs/docs/examples/login/java-spring.md +++ b/docs/docs/examples/login/java-spring.md @@ -162,7 +162,7 @@ java \ -jar web/target/web-0.0.2-SNAPSHOT.jar ``` -If you then visit on you should directly be redirected to your ZITADEL instance. +If you then visit on [http://localhost:18080/webapp](http://localhost:18080/webapp) you should directly be redirected to your ZITADEL instance. After login with your existing user you will be presented the profile page: ![Profile Page](/img/java-spring/app-profile.png) diff --git a/docs/docs/examples/login/nextjs-b2b.md b/docs/docs/examples/login/nextjs-b2b.md index f1e31fb50b..1ac6b04d9a 100644 --- a/docs/docs/examples/login/nextjs-b2b.md +++ b/docs/docs/examples/login/nextjs-b2b.md @@ -22,7 +22,7 @@ First we need to create an organization that holds the Vendor's users, projects ### Vendor Organization -Navigate to `https://{YourDomain}.zitadel.cloud/ui/console/orgs` (replace {YourDomain}), and click on the button "New". +Navigate to `https://{YourDomain}.zitadel.cloud/ui/console/orgs` (replace \{YourDomain}), and click on the button "New". Toggle the setting "Use your personal account as organization owner". Enter the name `Demo-Vendor`, and click "Create". Then click on that organization. diff --git a/docs/docs/examples/login/nextjs.md b/docs/docs/examples/login/nextjs.md index 76a8770ded..9d237b5b68 100644 --- a/docs/docs/examples/login/nextjs.md +++ b/docs/docs/examples/login/nextjs.md @@ -41,7 +41,7 @@ Select `CODE` in the next step. This makes sure you still get a secret. Note tha With the Redirect URIs field, you tell ZITADEL where it is allowed to redirect users to after authentication. For development, you can set dev mode to `true` to enable insecure HTTP and redirect to a `localhost` URI. -> If you are following along with the [example](https://github.com/zitadel/zitadel-angular), set dev mode to `true` and the Redirect URIs to . +> If you are following along with the [example](https://github.com/zitadel/zitadel-angular), set dev mode to `true` and the Redirect URIs to `http://localhost:3000/api/auth/callback/zitadel`. If you want to redirect the users back to a route on your application after they have logged out, add an optional redirect in the Post Logout URIs field. diff --git a/docs/docs/examples/login/symfony.md b/docs/docs/examples/login/symfony.md index 86a793b02f..1856e68df5 100644 --- a/docs/docs/examples/login/symfony.md +++ b/docs/docs/examples/login/symfony.md @@ -18,7 +18,7 @@ Before we can start building our application, we have to do a few configuration ### Project roles -The Example expects [user roles](guides/integrate/retrieve-user-roles) to be returned after login. +The Example expects [user roles](/docs/guides/integrate/retrieve-user-roles) to be returned after login. Symfony uses `ROLE_USER` format. The application will take care of upper-casing and prefixing for us. Inside ZITADEL, you can use regular lower-case role names without prefixes, if you prefer. diff --git a/docs/docs/guides/integrate/identity-providers/introduction.md b/docs/docs/guides/integrate/identity-providers/introduction.md index b97b50b6db..738f7b312b 100644 --- a/docs/docs/guides/integrate/identity-providers/introduction.md +++ b/docs/docs/guides/integrate/identity-providers/introduction.md @@ -177,5 +177,5 @@ Deciding whether to configure an external Identity Provider (IdP) at the organiz ## References - [Identity brokering in ZITADEL](/docs/concepts/features/identity-brokering) -- [The ZITADEL API reference for managing external IdPs](/docs/category/apis/resources/admin/identity-providers) -- [Handle external logins in a custom login UI](/docs/guides/integrate/login-ui/external-login) \ No newline at end of file +- [The ZITADEL API reference for managing external IdPs](/docs/apis/resources/admin/identity-providers) +- [Handle external logins in a custom login UI](/docs/guides/integrate/login-ui/external-login) diff --git a/docs/docs/guides/integrate/identity-providers/keycloak.mdx b/docs/docs/guides/integrate/identity-providers/keycloak.mdx index 75212c7b25..8eb619d8b2 100644 --- a/docs/docs/guides/integrate/identity-providers/keycloak.mdx +++ b/docs/docs/guides/integrate/identity-providers/keycloak.mdx @@ -26,7 +26,7 @@ You will have to paste it in the Keycloak Client later. ### Register a new client -1. Login to your Keycloak account and go to the clients list: <$KEYCLOAK-DOMAIN/auth/admin/$REALM/console/#/$REALM/clients> +1. Login to your Keycloak account and go to the clients list: `$KEYCLOAK-DOMAIN/auth/admin/$REALM/console/#/$REALM/clients` 2. Click on "Create Client" 3. Choose OpenID Connect as Client Type and give your client an ID 4. Enable Client authentication and the standard flow and direct access grants as authentication flow diff --git a/docs/docs/guides/integrate/identity-providers/linkedin_oauth.mdx b/docs/docs/guides/integrate/identity-providers/linkedin_oauth.mdx index 93383db2a8..64d3153e6f 100644 --- a/docs/docs/guides/integrate/identity-providers/linkedin_oauth.mdx +++ b/docs/docs/guides/integrate/identity-providers/linkedin_oauth.mdx @@ -23,7 +23,7 @@ import TestSetup from './_test_setup.mdx'; 2. Add your App Name, your Company Page and a Logo 3. Add "Sign In with LinkedIn using OpenID Connect" by clicking "Request access" 4. Go to the Auth Settings of the App and add the following URL to the "Authorized redirect URLs" - - {your-domain}/ui/login/login/externalidp/callback + - `{your_domain}/ui/login/login/externalidp/callback` - Example redirect url for the domain `https://acme.zitadel.cloud` would look like this: `https://acme.zitadel.cloud/ui/login/login/externalidp/callback` 5. Verify the app as your company 6. In the Auth - OAuth 2.0 scopes section you should see `openid`, `profile` and `email` listed diff --git a/docs/docs/guides/integrate/identity-providers/mocksaml.mdx b/docs/docs/guides/integrate/identity-providers/mocksaml.mdx index f954b85bd0..67fa8220e3 100644 --- a/docs/docs/guides/integrate/identity-providers/mocksaml.mdx +++ b/docs/docs/guides/integrate/identity-providers/mocksaml.mdx @@ -44,7 +44,7 @@ All the necessary configuration is contained in the metadata which has to be exc ### Download metadata Normally, you would need to download the ServiceProvider metadata from ZITADEL to upload to the IdentityProvider. -They are available under [https://{CUSTOMDOMAIN}/idps/{ID of the provider in ZITADEL}/saml/metadata], but this step can be skipped due to the fact that MockSAML is only for testing purposes. +They are available under `https://${CUSTOMDOMAIN}/idps/\{ID of the provider in ZITADEL}/saml/metadata`, but this step can be skipped due to the fact that MockSAML is only for testing purposes. ### Activate IdP diff --git a/docs/docs/guides/integrate/identity-providers/okta-oidc.mdx b/docs/docs/guides/integrate/identity-providers/okta-oidc.mdx index 80ed9254af..f96043d941 100644 --- a/docs/docs/guides/integrate/identity-providers/okta-oidc.mdx +++ b/docs/docs/guides/integrate/identity-providers/okta-oidc.mdx @@ -27,7 +27,7 @@ You will have to paste it in the OKTA application later. ### Register a new client -1. Login to your OKTA Account and go to the applications list: +1. Login to your OKTA Account and go to the applications list: `OKTA-DOMAIN/admin/apps/active^ 2. Click on "Create App Integration" and choose "OIDC - OpenID Connect" 3. Choose Web application as Application type and give a name 4. [Paste the ZITADEL Callback URL you copied before](#open-the-generic-oidc-provider-template) to the Sign-in redirect URIs @@ -65,7 +65,6 @@ ZITADEL ensures that at least the `openid`-scope is always sent. - ![OKTA Button](/img/guides/zitadel_login_okta.png) ![OKTA Login](/img/guides/okta_login.png) diff --git a/docs/docs/guides/integrate/identity-providers/okta_saml.mdx b/docs/docs/guides/integrate/identity-providers/okta_saml.mdx index 06c90787d5..c5ab416eaa 100644 --- a/docs/docs/guides/integrate/identity-providers/okta_saml.mdx +++ b/docs/docs/guides/integrate/identity-providers/okta_saml.mdx @@ -41,7 +41,7 @@ After you created the SAML SP in ZITADEL, you can copy the URLs you need to conf ### Register a new client -1. Log in to your OKTA Account and go to the applications list: +1. Log in to your OKTA Account and go to the applications list: `OKTA-DOMAIN/admin/apps/active` 2. Click on "Create App Integration" and choose "SAML 2.0" 3. Give the application a name 4. Click on the ZITADEL URLs that your SAML IDP shows since you created it in ZITADEL and paste them accordingly: diff --git a/docs/docs/guides/integrate/onboarding/b2b.mdx b/docs/docs/guides/integrate/onboarding/b2b.mdx index 4f36c452c6..f6528d8ad6 100644 --- a/docs/docs/guides/integrate/onboarding/b2b.mdx +++ b/docs/docs/guides/integrate/onboarding/b2b.mdx @@ -26,7 +26,7 @@ ZITADEL does have multiple possibilities to achieve that process. ## Onboard customers through the ZITADEL Management Console Each ZITADEL instance does automatically bring a management console with it. The [console](/docs/guides/manage/console/overview) can be used to manage all your resources through a UI. -You can access it by calling the following URL: $CUSTOM-DOMAIN/ui/ +You can access it by calling the following URL: `${CUSTOM-DOMAIN}/ui/` Make sure that your admins have a [Manager role](/docs/guides/manage/console/managers) with permissions on an instance level such as "INSTANCE_OWNER" ### Create a customer @@ -139,7 +139,7 @@ If you want to start automating the process of onboarding your customers the fol ### Built-in register organization form A basic form that allows a customer to enter an organization name and a user account is hosted on the following URL: -{custom-domain}/ui/login/register/org +`{custom-domain}/ui/login/register/org` When a user registers through this form, an organization and a user are created. The user will automatically get the role "ORG_OWNER" withing ZITADEL and is able to manage the whole organization. diff --git a/docs/docs/guides/integrate/retrieve-user-roles.md b/docs/docs/guides/integrate/retrieve-user-roles.md index 1e97ef647a..cf69a18546 100644 --- a/docs/docs/guides/integrate/retrieve-user-roles.md +++ b/docs/docs/guides/integrate/retrieve-user-roles.md @@ -18,8 +18,8 @@ Follow the links below to assign roles to your users. - [Add application roles via the ZITADEL Console](/docs/guides/manage/console/roles) - [Add manager roles via the ZITADEL Console](/docs/guides/manage/console/managers) -- [Add application roles via the ZITADEL Management API](/docs/category/apis/resources/mgmt/project-roles) -- [Add manager roles to users via the ZITADEL Management API](/category/apis/resources/mgmt/members) +- [Add application roles via the ZITADEL Management API](/docs/apis/resources/mgmt/project-roles) +- [Add manager roles to users via the ZITADEL Management API](/docs/apis/resources/mgmt/members) ## Retrieve roles @@ -210,7 +210,7 @@ https://github.com/zitadel/actions/blob/main/examples/custom_roles.js Now we will use the auth API to retrieve roles from a logged in user using the user’s token The base URL is: **https://$ZITADEL_DOMAIN/auth/v1** -Let’s start with a user who has multiple roles in different organizations in a multi-tenanted set up. You can use the logged in user’s token or the machine user’s token to retrieve the authorizations using the [APIs listed under user authorizations/grants in the auth API](/docs/category/apis/resources/auth/user-authorizations-grants). +Let’s start with a user who has multiple roles in different organizations in a multi-tenanted set up. You can use the logged in user’s token or the machine user’s token to retrieve the authorizations using the [APIs listed under user authorizations/grants in the auth API](/docs/apis/resources/auth/user-authorizations-grants). **Scope used:** `openid urn:zitadel:iam:org:project:id:zitadel:aud` @@ -394,7 +394,7 @@ Now we will use the management API to retrieve user roles under an admin user. The base URL is: **https://$CUSTOM-DOMAIN/management/v1** -In [APIs listed under user grants in the management API](/docs/category/apis/resources/mgmt/user-grants), you will see that you can use the management API to retrieve and modify user grants. The two API paths that we are interested in to fetch user roles are given below. +In [APIs listed under user grants in the management API](/docs/apis/resources/mgmt/user-grants), you will see that you can use the management API to retrieve and modify user grants. The two API paths that we are interested in to fetch user roles are given below. **Scope used:** `openid urn:zitadel:iam:org:project:id:zitadel:aud` diff --git a/docs/docs/guides/integrate/service-users/authenticate-service-users.md b/docs/docs/guides/integrate/service-users/authenticate-service-users.md index 7ca961ae21..66e9627911 100644 --- a/docs/docs/guides/integrate/service-users/authenticate-service-users.md +++ b/docs/docs/guides/integrate/service-users/authenticate-service-users.md @@ -127,7 +127,7 @@ However, [client credentials authentication](./client-credentials.md) might be c ## Further resources * Read about the [different methods to authenticate service users](./authenticate-service-users) -* [Service User API reference](/docs/category/apis/resources/mgmt/user-machine) +* [Service User API reference](/docs/apis/resources/mgmt/user-machine) * [OIDC JWT with private key](/docs/apis/openidoauth/authn-methods#jwt-with-private-key) authentication method reference * [Access ZITADEL APIs](../zitadel-apis/access-zitadel-apis) * Validate access tokens with [token introspection with private key jwt](../token-introspection/private-key-jwt.mdx) diff --git a/docs/docs/guides/integrate/service-users/client-credentials.md b/docs/docs/guides/integrate/service-users/client-credentials.md index 7924f2b6ae..438fec1ef1 100644 --- a/docs/docs/guides/integrate/service-users/client-credentials.md +++ b/docs/docs/guides/integrate/service-users/client-credentials.md @@ -100,7 +100,7 @@ By following these steps and adhering to security best practices, you can effect ## Notes * Read about the [different methods to authenticate service users](./authenticate-service-users) -* [Service User API reference](/docs/category/apis/resources/mgmt/user-machine) +* [Service User API reference](/docs/apis/resources/mgmt/user-machine) * [OIDC client secret basic](/docs/apis/openidoauth/authn-methods#client-secret-basic) authentication method reference * [Access ZITADEL APIs](../zitadel-apis/access-zitadel-apis) * Validate access tokens with [token introspection with basic auth](../token-introspection/basic-auth) diff --git a/docs/docs/guides/integrate/services/atlassian-saml.md b/docs/docs/guides/integrate/services/atlassian-saml.md index 60e210e390..eb36bbe689 100644 --- a/docs/docs/guides/integrate/services/atlassian-saml.md +++ b/docs/docs/guides/integrate/services/atlassian-saml.md @@ -36,9 +36,9 @@ For Identity Provider select "Other provider" and enter a Directory Name. Follow the wizard. Fill in the following information: -- `Identity provider Entity ID`: {your_instance_domain}/saml/v2/metadata -- `Identity provider SSO URL`: {your_instance_domain}/saml/v2/SSO -- `Public x509 certificate`: You need to download and paste the value of the certificate from {your_instance_domain}/saml/v2/certificate +- `Identity provider Entity ID`: \{your_instance_domain}/saml/v2/metadata +- `Identity provider SSO URL`: \{your_instance_domain}/saml/v2/SSO +- `Public x509 certificate`: You need to download and paste the value of the certificate from \{your_instance_domain}/saml/v2/certificate ![Add SAML details](/img/saml/atlassian/atlassian-03.png) diff --git a/docs/docs/guides/integrate/services/auth0-saml.md b/docs/docs/guides/integrate/services/auth0-saml.md index 649d3463e6..f05e6166d1 100644 --- a/docs/docs/guides/integrate/services/auth0-saml.md +++ b/docs/docs/guides/integrate/services/auth0-saml.md @@ -42,7 +42,7 @@ This includes: All the information is filled out as an example, and to connect with any other environment you only have to change the used domain, for example "example.com" with "zitadel.cloud". Lastly, upload the certificate used to sign the reponses, provided for you under the -URL {your_instance_domain}/saml/v2/certificate. +URL \{your_instance_domain}/saml/v2/certificate. Then just press the button "Create" and the connection on Auth0 is configured. diff --git a/docs/docs/guides/integrate/services/aws-saml.md b/docs/docs/guides/integrate/services/aws-saml.md index 86aec98b07..c5f5202363 100644 --- a/docs/docs/guides/integrate/services/aws-saml.md +++ b/docs/docs/guides/integrate/services/aws-saml.md @@ -45,7 +45,7 @@ can connect to ZITADEL as a SAML2 IDP. 4. Download the ZITADEL-used certificate to sign the responses, so that AWS can validation the signature. You can download the certificate from following - URL: {your_instance_domain}/saml/v2/certificate + URL: \{your_instance_domain}/saml/v2/certificate 5. Then upload the ".crt"-file to AWS and click "next". diff --git a/docs/docs/guides/integrate/services/cloudflare-oidc.mdx b/docs/docs/guides/integrate/services/cloudflare-oidc.mdx index c014bdb4d2..cd3624b32f 100644 --- a/docs/docs/guides/integrate/services/cloudflare-oidc.mdx +++ b/docs/docs/guides/integrate/services/cloudflare-oidc.mdx @@ -30,7 +30,7 @@ Cloudflare will return an error "User email was not returned. API permissions ar 1. On the Cloudflare dashboard go to Zero Trust, click settings, and then select "Authentication" 2. Add a new login method with the type "OpenID Connect" -3. Fill in the required information. Check the discovery endpoint of your instance (https://{your_domain}/.well-known/openid-configuration) for the urls. As mentioned in the Cloudflare docs the Certificate Url is jwks_uri. +3. Fill in the required information. Check the discovery endpoint of your instance `https://{your_domain}/.well-known/openid-configuration` for the urls. As mentioned in the Cloudflare docs the Certificate Url is jwks_uri. 4. Disable PKCE (Cloudflare requires a client secret for PKCE, which is currently not supported) 5. Add the following claims: "openid", "profile", "email" 6. Test the connection diff --git a/docs/docs/guides/integrate/services/gitlab-saml.md b/docs/docs/guides/integrate/services/gitlab-saml.md index ae6bb04a71..7a8346b822 100644 --- a/docs/docs/guides/integrate/services/gitlab-saml.md +++ b/docs/docs/guides/integrate/services/gitlab-saml.md @@ -52,7 +52,7 @@ Check your application, if everything is correct, press "Create". Complete the configuration as follows: - `Identity provider single sign-on URL`: $CUSTOM-DOMAIN/saml/v2/SSO -- `Certificate fingerprint`: You need to download the certificate from {your_instance_domain}/saml/v2/certificate and create a SHA1 fingerprint +- `Certificate fingerprint`: You need to download the certificate from \{your_instance_domain}/saml/v2/certificate and create a SHA1 fingerprint Save the changes. diff --git a/docs/docs/guides/integrate/services/google-workspace.md b/docs/docs/guides/integrate/services/google-workspace.md index a515f89a3b..14c9aba524 100644 --- a/docs/docs/guides/integrate/services/google-workspace.md +++ b/docs/docs/guides/integrate/services/google-workspace.md @@ -68,8 +68,8 @@ Create a new .xml file with the following minimal SAML metadata contents: Set or replace the variables with the values from the next screen as follows: -- `${ENTITYID}`: google.com/a/ -- `${ACSURL}`: https://www.google.com/a//acs +- `${ENTITYID}`: `google.com/a/` +- `${ACSURL}`: `https://www.google.com/a//acs` `` is the domain you have verified in Google Workspace. @@ -103,7 +103,7 @@ Save the settings. Now you should be all set to verify your setup: -- Open Gmail in an incognito session with the following link: https://mail.google.com/a/ +- Open Gmail in an incognito session with the following link: `https://mail.google.com/a/` - Enter your username and credentials - You should be redirected to Gmail and logged in @@ -165,8 +165,8 @@ Create a new .xml file with the following minimal SAML metadata contents: Set or replace the variables with the values from the next screen as follows: -- `${ENTITYID}`: https://accounts.google.com/samlrp/metadata?rpid= -- `${ACSURL}`: https://accounts.google.com/samlrp/acs?rpid= +- `${ENTITYID}`: `https://accounts.google.com/samlrp/metadata?rpid=` +- `${ACSURL}`: `https://accounts.google.com/samlrp/acs?rpid=` Replace `` with the values from the [SSO profile](#entity-id-and-acs-url). @@ -200,7 +200,7 @@ Save the settings. Now you should be all set to verify your setup: -- Open Gmail in an incognito session with the following link: https://mail.google.com/a/ +- Open Gmail in an incognito session with the following link: `https://mail.google.com/a/` - Enter your username and credentials - You should be redirected to Gmail and logged in diff --git a/docs/docs/guides/integrate/tools/apache2.mdx b/docs/docs/guides/integrate/tools/apache2.mdx index 28e9da7e2d..c4cb18c8dd 100644 --- a/docs/docs/guides/integrate/tools/apache2.mdx +++ b/docs/docs/guides/integrate/tools/apache2.mdx @@ -40,7 +40,7 @@ With the following parameters | Parameter | Description | Example value| |---|---|---| -| OIDCProviderMetadataURL | Is the url to the discovery endpoint, which is typically located at {your-domain}/.well-known/openid-configuration| https://.zitadel.cloud/.well-known/openid-configuration | +| OIDCProviderMetadataURL | Is the url to the discovery endpoint, which is typically located at `{your-domain}/.well-known/openid-configuration`| `https://.zitadel.cloud/.well-known/openid-configuration` | | OIDCClientID | Is the ID of the zitadel application. You can find it on the settings page of the application. | 123456789123@apache_test | | OIDCRedirectURI | Users will be redirected to this page after successful login. If you are using localhost or any other non-https endpoint, make sure to enable development mode in ZITADEL. | https://mysecureapp.io/secure/callback | | OIDCCryptoPassphrase | Create a secure passphrase. Consult the module's documentation for more details. | ... | diff --git a/docs/docs/guides/manage/console/default-settings.mdx b/docs/docs/guides/manage/console/default-settings.mdx index 810ca5d0f3..4c78daceed 100644 --- a/docs/docs/guides/manage/console/default-settings.mdx +++ b/docs/docs/guides/manage/console/default-settings.mdx @@ -139,7 +139,7 @@ The Login Policy defines how the login process should look like and which authen The Default Redirect URI will be used, if a user calls the login page directly. More specifically, typically a client will initiate login with an auth request. The auth request contains a client-id and a redirect uri, that must match the configuration in ZITADEL. -If there is no [auth request](https://zitadel.com/docs/apis/openidoauth/authrequest), users will be redirected to the Default Redirect URI, which is by default https:///ui/console/ +If there is no [auth request](https://zitadel.com/docs/apis/openidoauth/authrequest), users will be redirected to the Default Redirect URI, which is by default `https:///ui/console/` Reasons why ZITADEL doesn't have a redirect URI: @@ -148,7 +148,7 @@ Reasons why ZITADEL doesn't have a redirect URI: We recommend setting your own default redirect URI, if you do not want end users to access ZITADEL console. -Change default redirect url of instance: https:///ui/console/settings?id=login +Change default redirect url of instance: `https:///ui/console/settings?id=login` , and then click the button to create a new project. +To create a project, navigate to your organization, then projects or directly via `https://{your_domain}.zitadel.cloud/ui/console/projects`, and then click the button to create a new project. Empty Project) -- Bexio AG () +- [Stripe](https://stripe.com/ch/privacy) +- [Bexio AG](https://www.bexio.com/de-CH/datenschutz) As an alternative, we offer customers the option to pay by invoice instead of using external payment providers. However, this may require a positive credit check in advance. diff --git a/docs/docs/self-hosting/deploy/compose.mdx b/docs/docs/self-hosting/deploy/compose.mdx index 525637d5c5..808f5fbd54 100644 --- a/docs/docs/self-hosting/deploy/compose.mdx +++ b/docs/docs/self-hosting/deploy/compose.mdx @@ -18,9 +18,9 @@ The setup is tested against Docker version 20.10.17 and Docker Compose version v By executing the commands below, you will download the following file: -
docker-compose.yaml +\
docker-compose.yaml {DockerComposeSource} -
+\
```bash # Download the docker compose example configuration. @@ -41,9 +41,9 @@ docker compose up --detach By executing the commands below, you will download the following file: -
docker-compose-sa.yaml +\
docker-compose-sa.yaml {DockerComposeSaSource} -
+\
```bash # Download the docker compose example configuration. diff --git a/docs/docs/self-hosting/deploy/loadbalancing-example/loadbalancing-example.mdx b/docs/docs/self-hosting/deploy/loadbalancing-example/loadbalancing-example.mdx index 0c51a230a3..160a542b4c 100644 --- a/docs/docs/self-hosting/deploy/loadbalancing-example/loadbalancing-example.mdx +++ b/docs/docs/self-hosting/deploy/loadbalancing-example/loadbalancing-example.mdx @@ -21,21 +21,21 @@ The setup is tested against Docker version 20.10.17 and Docker Compose version v By executing the commands below, you will download the following files: -
docker-compose.yaml +\
docker-compose.yaml {DockerComposeSource} -
-
example-traefik.yaml +\
+\
example-traefik.yaml {ExampleTraefikSource} -
-
example-zitadel-config.yaml +\
+\
example-zitadel-config.yaml {ExampleZITADELConfigSource} -
-
example-zitadel-secrets.yaml +\
+\
example-zitadel-secrets.yaml {ExampleZITADELSecretsSource} -
-
example-zitadel-init-steps.yaml +\
+\
example-zitadel-init-steps.yaml {ExampleZITADELInitStepsSource} -
+\
```bash # Download the docker compose example configuration. diff --git a/docs/docs/self-hosting/manage/configure/_compose.mdx b/docs/docs/self-hosting/manage/configure/_compose.mdx index 803842c58e..88c0478b0c 100644 --- a/docs/docs/self-hosting/manage/configure/_compose.mdx +++ b/docs/docs/self-hosting/manage/configure/_compose.mdx @@ -8,18 +8,18 @@ The docker compose example mounts the example zitadel configuration files to the By executing the commands below, you will download the following files: -
docker-compose.yaml +\
docker-compose.yaml {DockerComposeSource} -
-
example-zitadel-config.yaml +\
+\
example-zitadel-config.yaml {ExampleZITADELConfigSource} -
-
example-zitadel-secrets.yaml +\
+\
example-zitadel-secrets.yaml {ExampleZITADELSecretsSource} -
-
example-zitadel-init-steps.yaml +\
+\
example-zitadel-init-steps.yaml {ExampleZITADELInitStepsSource} -
+\
```bash # Download the docker compose example configuration. diff --git a/docs/docs/self-hosting/manage/configure/_helm.mdx b/docs/docs/self-hosting/manage/configure/_helm.mdx index a4b5e49086..a1a8d73b92 100644 --- a/docs/docs/self-hosting/manage/configure/_helm.mdx +++ b/docs/docs/self-hosting/manage/configure/_helm.mdx @@ -9,12 +9,12 @@ For a secure installation with Docker Compose, [go to the loadbalancing example] By executing the commands below, you will download the following files: -
example-zitadel-values.yaml +\
example-zitadel-values.yaml {ExampleZITADELValuesSource} -
-
example-zitadel-values-secrets.yaml +\
+\
example-zitadel-values-secrets.yaml {ExampleZITADELValuesSecretsSource} -
+\
```bash # Download and adjust the example configuration file containing standard configuration diff --git a/docs/docs/self-hosting/manage/configure/_linuxunix.mdx b/docs/docs/self-hosting/manage/configure/_linuxunix.mdx index 0aac2036f5..9b57a1e5d0 100644 --- a/docs/docs/self-hosting/manage/configure/_linuxunix.mdx +++ b/docs/docs/self-hosting/manage/configure/_linuxunix.mdx @@ -7,15 +7,15 @@ import ExampleZITADELInitStepsSource from '!!raw-loader!./example-zitadel-init-s By executing the commands below, you will download the following files: -
example-zitadel-config.yaml +\
example-zitadel-config.yaml {ExampleZITADELConfigSource} -
-
example-zitadel-secrets.yaml +\
+\
example-zitadel-secrets.yaml {ExampleZITADELSecretsSource} -
-
example-zitadel-init-steps.yaml +\
+\
example-zitadel-init-steps.yaml {ExampleZITADELInitStepsSource} -
+\
```bash # Download and adjust the example configuration file containing standard configuration diff --git a/docs/docs/self-hosting/manage/database/database.mdx b/docs/docs/self-hosting/manage/database/database.mdx index 37be4ea22b..c67ecbaaba 100644 --- a/docs/docs/self-hosting/manage/database/database.mdx +++ b/docs/docs/self-hosting/manage/database/database.mdx @@ -19,11 +19,9 @@ import Postgres from './_postgres.mdx' > - - diff --git a/docs/docs/self-hosting/manage/reverseproxy/httpd/httpd.mdx b/docs/docs/self-hosting/manage/reverseproxy/httpd/httpd.mdx index dc17e9387e..4d75802ec4 100644 --- a/docs/docs/self-hosting/manage/reverseproxy/httpd/httpd.mdx +++ b/docs/docs/self-hosting/manage/reverseproxy/httpd/httpd.mdx @@ -5,6 +5,7 @@ sidebar_label: Apache httpd import ProxyGuideOverview from '../_proxy_guide_overview.mdx'; import ProxyGuideTLSMode from '../_proxy_guide_tls_mode.mdx'; +import ProxyGuideMore from '../_proxy_guide_more.mdx'; import Compose from "!!raw-loader!./docker-compose.yaml"; import ConfigDisabled from "!!raw-loader!./httpd-disabled-tls.conf"; import ConfigExternal from "!!raw-loader!./httpd-external-tls.conf"; diff --git a/docs/docs/self-hosting/manage/reverseproxy/nginx/nginx.mdx b/docs/docs/self-hosting/manage/reverseproxy/nginx/nginx.mdx index d05296a95d..0ad5c036b7 100644 --- a/docs/docs/self-hosting/manage/reverseproxy/nginx/nginx.mdx +++ b/docs/docs/self-hosting/manage/reverseproxy/nginx/nginx.mdx @@ -5,6 +5,7 @@ sidebar_label: NGINX import ProxyGuideOverview from '../_proxy_guide_overview.mdx'; import ProxyGuideTLSMode from '../_proxy_guide_tls_mode.mdx'; +import ProxyGuideMore from '../_proxy_guide_more.mdx'; import Compose from "!!raw-loader!./docker-compose.yaml"; import ConfigDisabled from "!!raw-loader!./nginx-disabled-tls.conf"; import ConfigExternal from "!!raw-loader!./nginx-external-tls.conf"; diff --git a/docs/docs/self-hosting/manage/reverseproxy/traefik/traefik.mdx b/docs/docs/self-hosting/manage/reverseproxy/traefik/traefik.mdx index d9d1d78f5f..d5950ad93c 100644 --- a/docs/docs/self-hosting/manage/reverseproxy/traefik/traefik.mdx +++ b/docs/docs/self-hosting/manage/reverseproxy/traefik/traefik.mdx @@ -5,6 +5,7 @@ sidebar_label: Traefik import ProxyGuideOverview from '../_proxy_guide_overview.mdx'; import ProxyGuideTLSMode from '../_proxy_guide_tls_mode.mdx'; +import ProxyGuideMore from '../_proxy_guide_more.mdx'; import Compose from "!!raw-loader!./docker-compose.yaml"; import ConfigDisabled from "!!raw-loader!./traefik-disabled-tls.yaml"; import ConfigExternal from "!!raw-loader!./traefik-external-tls.yaml"; diff --git a/docs/docs/self-hosting/manage/usage_control.md b/docs/docs/self-hosting/manage/usage_control.md index 4a3963b895..cb5c57f830 100644 --- a/docs/docs/self-hosting/manage/usage_control.md +++ b/docs/docs/self-hosting/manage/usage_control.md @@ -9,7 +9,7 @@ The usage control features are currently limited to the instance level only. ## Block Instances -You can block an instance using the [system API](/category/apis/resources/system/limits). +You can block an instance using the [system API](/apis/resources/system/limits). Most requests to a blocked instance are rejected with the HTTP status *429 Too Many Requests* or the gRPC status *8 Resource Exhausted*. However, requests to the [system API](/apis/introduction#system) are still allowed. @@ -55,7 +55,7 @@ DefaultInstance: AuditLogRetention: # ZITADEL_DEFAULTINSTANCE_LIMITS_AUDITLOGRETENTION ``` -You can also set a limit for [a specific virtual instance](/concepts/structure/instance#multiple-virtual-instances) using the [system API](/category/apis/resources/system/limits). +You can also set a limit for [a specific virtual instance](/concepts/structure/instance#multiple-virtual-instances) using the [system API](/apis/resources/system/limits). ## Quotas @@ -85,7 +85,7 @@ Quotas: MaxBulkSize: 0 # ZITADEL_QUOTAS_EXECUTION_DEBOUNCE_MAXBULKSIZE ``` -Once you have activated the quotas feature, you can configure quotas [for your virtual instances](/concepts/structure/instance#multiple-virtual-instances) using the [system API](/category/apis/resources/system/quotas) or the *DefaultInstances.Quotas* section. +Once you have activated the quotas feature, you can configure quotas [for your virtual instances](/concepts/structure/instance#multiple-virtual-instances) using the [system API](/apis/resources/system/quotas) or the *DefaultInstances.Quotas* section. The following snippets shows the defaults: ```yaml diff --git a/docs/docusaurus.config.js b/docs/docusaurus.config.js index bc021a48dc..2fe9d57d6d 100644 --- a/docs/docusaurus.config.js +++ b/docs/docusaurus.config.js @@ -4,8 +4,9 @@ module.exports = { trailingSlash: false, url: "https://zitadel.com", baseUrl: "/docs", - onBrokenLinks: "throw", - onBrokenMarkdownLinks: "warn", + onBrokenLinks: "warn", + onBrokenAnchors: "warn", + onBrokenMarkdownLinks: "throw", favicon: "img/favicon.ico", organizationName: "zitadel", projectName: "zitadel", @@ -203,6 +204,11 @@ module.exports = { syntax: 'typescript', tsx: true, }, + transform: { + react: { + runtime: 'automatic', + }, + }, target: 'es2017', }, module: { @@ -223,7 +229,7 @@ module.exports = { showLastUpdateTime: true, editUrl: "https://github.com/zitadel/zitadel/edit/main/docs/", remarkPlugins: [require("mdx-mermaid")], - docLayoutComponent: "@theme/DocPage", + docItemComponent: '@theme/ApiItem' }, theme: { @@ -245,6 +251,7 @@ module.exports = { outputDir: "docs/apis/resources/auth", sidebarOptions: { groupPathsBy: "tag", + categoryLinkSource: "tag", }, }, mgmt: { @@ -252,6 +259,7 @@ module.exports = { outputDir: "docs/apis/resources/mgmt", sidebarOptions: { groupPathsBy: "tag", + categoryLinkSource: "tag", }, }, admin: { @@ -259,6 +267,7 @@ module.exports = { outputDir: "docs/apis/resources/admin", sidebarOptions: { groupPathsBy: "tag", + categoryLinkSource: "tag", }, }, system: { @@ -266,6 +275,7 @@ module.exports = { outputDir: "docs/apis/resources/system", sidebarOptions: { groupPathsBy: "tag", + categoryLinkSource: "tag", }, }, user: { @@ -273,6 +283,7 @@ module.exports = { outputDir: "docs/apis/resources/user_service", sidebarOptions: { groupPathsBy: "tag", + categoryLinkSource: "tag", }, }, session: { @@ -280,6 +291,7 @@ module.exports = { outputDir: "docs/apis/resources/session_service", sidebarOptions: { groupPathsBy: "tag", + categoryLinkSource: "tag", }, }, oidc: { @@ -287,6 +299,7 @@ module.exports = { outputDir: "docs/apis/resources/oidc_service", sidebarOptions: { groupPathsBy: "tag", + categoryLinkSource: "tag", }, }, settings: { @@ -294,6 +307,7 @@ module.exports = { outputDir: "docs/apis/resources/settings_service", sidebarOptions: { groupPathsBy: "tag", + categoryLinkSource: "tag", }, }, user_schema: { @@ -301,6 +315,7 @@ module.exports = { outputDir: "docs/apis/resources/user_schema_service_v3", sidebarOptions: { groupPathsBy: "tag", + categoryLinkSource: "tag", }, }, user_v3: { @@ -308,6 +323,7 @@ module.exports = { outputDir: "docs/apis/resources/user_service_v3", sidebarOptions: { groupPathsBy: "tag", + categoryLinkSource: "tag", }, }, action_v3: { @@ -315,6 +331,7 @@ module.exports = { outputDir: "docs/apis/resources/action_service_v3", sidebarOptions: { groupPathsBy: "tag", + categoryLinkSource: "tag", }, }, feature_v2: { @@ -322,6 +339,7 @@ module.exports = { outputDir: "docs/apis/resources/feature_service_v2", sidebarOptions: { groupPathsBy: "tag", + categoryLinkSource: "tag", }, }, }, diff --git a/docs/package.json b/docs/package.json index 6dbca3a60f..8ff0b27e9d 100644 --- a/docs/package.json +++ b/docs/package.json @@ -5,39 +5,45 @@ "scripts": { "docusaurus": "docusaurus", "start": "docusaurus start", - "start:api": "yarn generate && docusaurus start", - "build": "yarn generate && docusaurus build", + "start:api": "yarn run generate && docusaurus start", + "build": "yarn run generate && docusaurus build", "swizzle": "docusaurus swizzle", "deploy": "docusaurus deploy", "clear": "docusaurus clear", "serve": "docusaurus serve", "write-translations": "docusaurus write-translations", "write-heading-ids": "docusaurus write-heading-ids", - "generate": "yarn generate:grpc && yarn generate:apidocs && yarn generate:configdocs", + "generate": "yarn run generate:grpc && yarn run generate:apidocs && yarn run generate:configdocs", "generate:grpc": "buf generate ../proto", - "generate:apidocs": "docusaurus clean-api-docs all && docusaurus gen-api-docs all", - "generate:configdocs": "cp -r ../cmd/defaults.yaml ./docs/self-hosting/manage/configure/ && cp -r ../cmd/setup/steps.yaml ./docs/self-hosting/manage/configure/" + "generate:apidocs": "docusaurus gen-api-docs all", + "generate:configdocs": "cp -r ../cmd/defaults.yaml ./docs/self-hosting/manage/configure/ && cp -r ../cmd/setup/steps.yaml ./docs/self-hosting/manage/configure/", + "generate:re-gen": "yarn clean-all && yarn gen-all", + "generate:clean-all": "docusaurus clean-api-docs all" }, "dependencies": { "@bufbuild/buf": "^1.14.0", - "@docusaurus/core": "2.2.0", - "@docusaurus/preset-classic": "2.2.0", - "@docusaurus/theme-search-algolia": "2.2.0", + "@docusaurus/core": "3.4.0", + "@docusaurus/preset-classic": "3.4.0", + "@docusaurus/theme-mermaid": "3.4.0", + "@docusaurus/theme-search-algolia": "3.4.0", "@headlessui/react": "^1.7.4", "@heroicons/react": "^2.0.13", + "@mdx-js/react": "^3.0.0", "@saucelabs/theme-github-codeblock": "^0.2.3", "@swc/core": "^1.3.74", "autoprefixer": "^10.4.13", "clsx": "^1.2.1", "docusaurus-plugin-image-zoom": "^1.0.1", - "docusaurus-plugin-openapi-docs": "^1.7.3", - "docusaurus-theme-openapi-docs": "^1.7.3", - "mdx-mermaid": "^1.1.0", + "docusaurus-plugin-openapi-docs": "3.0.0-beta.10", + "docusaurus-theme-openapi-docs": "3.0.0-beta.10", + "mdx-mermaid": "^2.0.0", + "mermaid": "^10.9.1", "postcss": "^8.4.31", + "prism-react-renderer": "^2.1.0", "raw-loader": "^4.0.2", - "react": "17.0.2", + "react": "^18.2.0", "react-copy-to-clipboard": "^5.1.0", - "react-dom": "17.0.2", + "react-dom": "^18.2.0", "react-player": "^2.15.1", "sitemap": "7.1.1", "swc-loader": "^0.2.3", @@ -56,7 +62,9 @@ ] }, "devDependencies": { - "@docusaurus/module-type-aliases": "2.2.0", + "@docusaurus/module-type-aliases": "3.4.0", + "@docusaurus/types": "3.4.0", "tailwindcss": "^3.2.4" - } + }, + "packageManager": "yarn@1.22.22+sha512.a6b2f7906b721bba3d67d4aff083df04dad64c399707841b7acf00f6b133b7ac24255f2652fa22ae3534329dc6180534e98d17432037ff6fd140556e2bb3137e" } diff --git a/docs/sidebars.js b/docs/sidebars.js index a1e00d5fc2..70669d4d6e 100644 --- a/docs/sidebars.js +++ b/docs/sidebars.js @@ -585,7 +585,7 @@ module.exports = { description: "The authentication API (aka Auth API) is used for all operations on the currently logged in user. The user id is taken from the sub claim in the token.", }, - items: require("./docs/apis/resources/auth/sidebar.js"), + items: require("./docs/apis/resources/auth/sidebar.ts"), }, { type: "category", @@ -597,7 +597,7 @@ module.exports = { description: "The management API is as the name states the interface where systems can mutate IAM objects like, organizations, projects, clients, users and so on if they have the necessary access rights. To identify the current organization you can send a header x-zitadel-orgid or if no header is set, the organization of the authenticated user is set.", }, - items: require("./docs/apis/resources/mgmt/sidebar.js"), + items: require("./docs/apis/resources/mgmt/sidebar.ts"), }, { type: "category", @@ -609,7 +609,7 @@ module.exports = { description: "This API is intended to configure and manage one ZITADEL instance itself.", }, - items: require("./docs/apis/resources/admin/sidebar.js"), + items: require("./docs/apis/resources/admin/sidebar.ts"), }, { type: "category", @@ -623,7 +623,7 @@ module.exports = { "\n" + "Checkout the guide how to access the ZITADEL System API.", }, - items: require("./docs/apis/resources/system/sidebar.js"), + items: require("./docs/apis/resources/system/sidebar.ts"), }, ], }, @@ -648,7 +648,7 @@ module.exports = { "\n" + "This project is in beta state. It can AND will continue breaking until the services provide the same functionality as the current login.", }, - items: require("./docs/apis/resources/user_service/sidebar.js"), + items: require("./docs/apis/resources/user_service/sidebar.ts"), }, { type: "category", @@ -662,7 +662,7 @@ module.exports = { "\n" + "This project is in beta state. It can AND will continue breaking until the services provide the same functionality as the current login.", }, - items: require("./docs/apis/resources/session_service/sidebar.js"), + items: require("./docs/apis/resources/session_service/sidebar.ts"), }, { type: "category", @@ -676,7 +676,7 @@ module.exports = { "\n" + "This project is in beta state. It can AND will continue breaking until the services provide the same functionality as the current login.", }, - items: require("./docs/apis/resources/oidc_service/sidebar.js"), + items: require("./docs/apis/resources/oidc_service/sidebar.ts"), }, { type: "category", @@ -690,7 +690,7 @@ module.exports = { "\n" + "This project is in beta state. It can AND will continue to break until the services provide the same functionality as the current login.", }, - items: require("./docs/apis/resources/settings_service/sidebar.js"), + items: require("./docs/apis/resources/settings_service/sidebar.ts"), }, { type: "category", @@ -704,7 +704,7 @@ module.exports = { "\n" + "This project is in beta state. It can AND will continue breaking until a stable version is released.", }, - items: require("./docs/apis/resources/feature_service_v2/sidebar.js"), + items: require("./docs/apis/resources/feature_service_v2/sidebar.ts"), }, ], }, @@ -729,7 +729,7 @@ module.exports = { "\n" + "This project is in Preview state. It can AND will continue breaking until the service provides the same functionality as the v1 and v2 user services.", }, - items: require("./docs/apis/resources/user_schema_service_v3/sidebar.js"), + items: require("./docs/apis/resources/user_schema_service_v3/sidebar.ts"), }, { type: "category", @@ -743,7 +743,7 @@ module.exports = { "\n" + "This project is in Preview state. It can AND will continue breaking until the service provides the same functionality as the v1 and v2 user services.", }, - items: require("./docs/apis/resources/user_service_v3/sidebar.js"), + items: require("./docs/apis/resources/user_service_v3/sidebar.ts"), }, { type: "category", @@ -757,7 +757,7 @@ module.exports = { "\n" + "This project is in Preview state. It can AND will continue breaking until the services provide the same functionality as the current actions.", }, - items: require("./docs/apis/resources/action_service_v3/sidebar.js"), + items: require("./docs/apis/resources/action_service_v3/sidebar.ts"), }, ], }, diff --git a/docs/vercel.json b/docs/vercel.json index 809a72beca..ab0202a3f8 100644 --- a/docs/vercel.json +++ b/docs/vercel.json @@ -19,6 +19,7 @@ ], "redirects": [ { "source": "/", "destination": "/docs" }, + { "source": "/docs/category/apis/:slug*", "destination": "/docs/apis/:slug*", "permanent": true }, { "source": "/docs/apis/mgmt/:slug*", "destination": "/docs/apis/resources/mgmt/:slug*", "permanent": true }, { "source": "/docs/apis/auth/:slug*", "destination": "/docs/apis/resources/auth/:slug*", "permanent": true }, { "source": "/docs/apis/system/:slug*", "destination": "/docs/apis/resources/system/:slug*", "permanent": true }, diff --git a/docs/yarn.lock b/docs/yarn.lock index 106b1b1132..d85d1bacee 100644 --- a/docs/yarn.lock +++ b/docs/yarn.lock @@ -2,320 +2,279 @@ # yarn lockfile v1 -"@algolia/autocomplete-core@1.7.2": - version "1.7.2" - resolved "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.7.2.tgz" - integrity sha512-eclwUDC6qfApNnEfu1uWcL/rudQsn59tjEoUYZYE2JSXZrHLRjBUGMxiCoknobU2Pva8ejb0eRxpIYDtVVqdsw== +"@algolia/autocomplete-core@1.9.3": + version "1.9.3" + resolved "https://registry.yarnpkg.com/@algolia/autocomplete-core/-/autocomplete-core-1.9.3.tgz#1d56482a768c33aae0868c8533049e02e8961be7" + integrity sha512-009HdfugtGCdC4JdXUbVJClA0q0zh24yyePn+KUGk3rP7j8FEe/m5Yo/z65gn6nP/cM39PxpzqKrL7A6fP6PPw== dependencies: - "@algolia/autocomplete-shared" "1.7.2" + "@algolia/autocomplete-plugin-algolia-insights" "1.9.3" + "@algolia/autocomplete-shared" "1.9.3" -"@algolia/autocomplete-preset-algolia@1.7.2": - version "1.7.2" - resolved "https://registry.npmjs.org/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.7.2.tgz" - integrity sha512-+RYEG6B0QiGGfRb2G3MtPfyrl0dALF3cQNTWBzBX6p5o01vCCGTTinAm2UKG3tfc2CnOMAtnPLkzNZyJUpnVJw== +"@algolia/autocomplete-plugin-algolia-insights@1.9.3": + version "1.9.3" + resolved "https://registry.yarnpkg.com/@algolia/autocomplete-plugin-algolia-insights/-/autocomplete-plugin-algolia-insights-1.9.3.tgz#9b7f8641052c8ead6d66c1623d444cbe19dde587" + integrity sha512-a/yTUkcO/Vyy+JffmAnTWbr4/90cLzw+CC3bRbhnULr/EM0fGNvM13oQQ14f2moLMcVDyAx/leczLlAOovhSZg== dependencies: - "@algolia/autocomplete-shared" "1.7.2" + "@algolia/autocomplete-shared" "1.9.3" -"@algolia/autocomplete-shared@1.7.2": - version "1.7.2" - resolved "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.7.2.tgz" - integrity sha512-QCckjiC7xXHIUaIL3ektBtjJ0w7tTA3iqKcAE/Hjn1lZ5omp7i3Y4e09rAr9ZybqirL7AbxCLLq0Ra5DDPKeug== - -"@algolia/cache-browser-local-storage@4.14.2": - version "4.14.2" - resolved "https://registry.npmjs.org/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.14.2.tgz" - integrity sha512-FRweBkK/ywO+GKYfAWbrepewQsPTIEirhi1BdykX9mxvBPtGNKccYAxvGdDCumU1jL4r3cayio4psfzKMejBlA== +"@algolia/autocomplete-preset-algolia@1.9.3": + version "1.9.3" + resolved "https://registry.yarnpkg.com/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.9.3.tgz#64cca4a4304cfcad2cf730e83067e0c1b2f485da" + integrity sha512-d4qlt6YmrLMYy95n5TB52wtNDr6EgAIPH81dvvvW8UmuWRgxEtY0NJiPwl/h95JtG2vmRM804M0DSwMCNZlzRA== dependencies: - "@algolia/cache-common" "4.14.2" + "@algolia/autocomplete-shared" "1.9.3" -"@algolia/cache-common@4.14.2": - version "4.14.2" - resolved "https://registry.npmjs.org/@algolia/cache-common/-/cache-common-4.14.2.tgz" - integrity sha512-SbvAlG9VqNanCErr44q6lEKD2qoK4XtFNx9Qn8FK26ePCI8I9yU7pYB+eM/cZdS9SzQCRJBbHUumVr4bsQ4uxg== +"@algolia/autocomplete-shared@1.9.3": + version "1.9.3" + resolved "https://registry.yarnpkg.com/@algolia/autocomplete-shared/-/autocomplete-shared-1.9.3.tgz#2e22e830d36f0a9cf2c0ccd3c7f6d59435b77dfa" + integrity sha512-Wnm9E4Ye6Rl6sTTqjoymD+l8DjSTHsHboVRYrKgEt8Q7UHm9nYbqhN/i0fhUYA3OAEH7WA8x3jfpnmJm3rKvaQ== -"@algolia/cache-in-memory@4.14.2": - version "4.14.2" - resolved "https://registry.npmjs.org/@algolia/cache-in-memory/-/cache-in-memory-4.14.2.tgz" - integrity sha512-HrOukWoop9XB/VFojPv1R5SVXowgI56T9pmezd/djh2JnVN/vXswhXV51RKy4nCpqxyHt/aGFSq2qkDvj6KiuQ== +"@algolia/cache-browser-local-storage@4.23.3": + version "4.23.3" + resolved "https://registry.yarnpkg.com/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.23.3.tgz#0cc26b96085e1115dac5fcb9d826651ba57faabc" + integrity sha512-vRHXYCpPlTDE7i6UOy2xE03zHF2C8MEFjPN2v7fRbqVpcOvAUQK81x3Kc21xyb5aSIpYCjWCZbYZuz8Glyzyyg== dependencies: - "@algolia/cache-common" "4.14.2" + "@algolia/cache-common" "4.23.3" -"@algolia/client-account@4.14.2": - version "4.14.2" - resolved "https://registry.npmjs.org/@algolia/client-account/-/client-account-4.14.2.tgz" - integrity sha512-WHtriQqGyibbb/Rx71YY43T0cXqyelEU0lB2QMBRXvD2X0iyeGl4qMxocgEIcbHyK7uqE7hKgjT8aBrHqhgc1w== - dependencies: - "@algolia/client-common" "4.14.2" - "@algolia/client-search" "4.14.2" - "@algolia/transporter" "4.14.2" +"@algolia/cache-common@4.23.3": + version "4.23.3" + resolved "https://registry.yarnpkg.com/@algolia/cache-common/-/cache-common-4.23.3.tgz#3bec79092d512a96c9bfbdeec7cff4ad36367166" + integrity sha512-h9XcNI6lxYStaw32pHpB1TMm0RuxphF+Ik4o7tcQiodEdpKK+wKufY6QXtba7t3k8eseirEMVB83uFFF3Nu54A== -"@algolia/client-analytics@4.14.2": - version "4.14.2" - resolved "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-4.14.2.tgz" - integrity sha512-yBvBv2mw+HX5a+aeR0dkvUbFZsiC4FKSnfqk9rrfX+QrlNOKEhCG0tJzjiOggRW4EcNqRmaTULIYvIzQVL2KYQ== +"@algolia/cache-in-memory@4.23.3": + version "4.23.3" + resolved "https://registry.yarnpkg.com/@algolia/cache-in-memory/-/cache-in-memory-4.23.3.tgz#3945f87cd21ffa2bec23890c85305b6b11192423" + integrity sha512-yvpbuUXg/+0rbcagxNT7un0eo3czx2Uf0y4eiR4z4SD7SiptwYTpbuS0IHxcLHG3lq22ukx1T6Kjtk/rT+mqNg== dependencies: - "@algolia/client-common" "4.14.2" - "@algolia/client-search" "4.14.2" - "@algolia/requester-common" "4.14.2" - "@algolia/transporter" "4.14.2" + "@algolia/cache-common" "4.23.3" -"@algolia/client-common@4.14.2": - version "4.14.2" - resolved "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.14.2.tgz" - integrity sha512-43o4fslNLcktgtDMVaT5XwlzsDPzlqvqesRi4MjQz2x4/Sxm7zYg5LRYFol1BIhG6EwxKvSUq8HcC/KxJu3J0Q== +"@algolia/client-account@4.23.3": + version "4.23.3" + resolved "https://registry.yarnpkg.com/@algolia/client-account/-/client-account-4.23.3.tgz#8751bbf636e6741c95e7c778488dee3ee430ac6f" + integrity sha512-hpa6S5d7iQmretHHF40QGq6hz0anWEHGlULcTIT9tbUssWUriN9AUXIFQ8Ei4w9azD0hc1rUok9/DeQQobhQMA== dependencies: - "@algolia/requester-common" "4.14.2" - "@algolia/transporter" "4.14.2" + "@algolia/client-common" "4.23.3" + "@algolia/client-search" "4.23.3" + "@algolia/transporter" "4.23.3" -"@algolia/client-personalization@4.14.2": - version "4.14.2" - resolved "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-4.14.2.tgz" - integrity sha512-ACCoLi0cL8CBZ1W/2juehSltrw2iqsQBnfiu/Rbl9W2yE6o2ZUb97+sqN/jBqYNQBS+o0ekTMKNkQjHHAcEXNw== +"@algolia/client-analytics@4.23.3": + version "4.23.3" + resolved "https://registry.yarnpkg.com/@algolia/client-analytics/-/client-analytics-4.23.3.tgz#f88710885278fe6fb6964384af59004a5a6f161d" + integrity sha512-LBsEARGS9cj8VkTAVEZphjxTjMVCci+zIIiRhpFun9jGDUlS1XmhCW7CTrnaWeIuCQS/2iPyRqSy1nXPjcBLRA== dependencies: - "@algolia/client-common" "4.14.2" - "@algolia/requester-common" "4.14.2" - "@algolia/transporter" "4.14.2" + "@algolia/client-common" "4.23.3" + "@algolia/client-search" "4.23.3" + "@algolia/requester-common" "4.23.3" + "@algolia/transporter" "4.23.3" -"@algolia/client-search@4.14.2": - version "4.14.2" - resolved "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.14.2.tgz" - integrity sha512-L5zScdOmcZ6NGiVbLKTvP02UbxZ0njd5Vq9nJAmPFtjffUSOGEp11BmD2oMJ5QvARgx2XbX4KzTTNS5ECYIMWw== +"@algolia/client-common@4.23.3": + version "4.23.3" + resolved "https://registry.yarnpkg.com/@algolia/client-common/-/client-common-4.23.3.tgz#891116aa0db75055a7ecc107649f7f0965774704" + integrity sha512-l6EiPxdAlg8CYhroqS5ybfIczsGUIAC47slLPOMDeKSVXYG1n0qGiz4RjAHLw2aD0xzh2EXZ7aRguPfz7UKDKw== dependencies: - "@algolia/client-common" "4.14.2" - "@algolia/requester-common" "4.14.2" - "@algolia/transporter" "4.14.2" + "@algolia/requester-common" "4.23.3" + "@algolia/transporter" "4.23.3" + +"@algolia/client-personalization@4.23.3": + version "4.23.3" + resolved "https://registry.yarnpkg.com/@algolia/client-personalization/-/client-personalization-4.23.3.tgz#35fa8e5699b0295fbc400a8eb211dc711e5909db" + integrity sha512-3E3yF3Ocr1tB/xOZiuC3doHQBQ2zu2MPTYZ0d4lpfWads2WTKG7ZzmGnsHmm63RflvDeLK/UVx7j2b3QuwKQ2g== + dependencies: + "@algolia/client-common" "4.23.3" + "@algolia/requester-common" "4.23.3" + "@algolia/transporter" "4.23.3" + +"@algolia/client-search@4.23.3": + version "4.23.3" + resolved "https://registry.yarnpkg.com/@algolia/client-search/-/client-search-4.23.3.tgz#a3486e6af13a231ec4ab43a915a1f318787b937f" + integrity sha512-P4VAKFHqU0wx9O+q29Q8YVuaowaZ5EM77rxfmGnkHUJggh28useXQdopokgwMeYw2XUht49WX5RcTQ40rZIabw== + dependencies: + "@algolia/client-common" "4.23.3" + "@algolia/requester-common" "4.23.3" + "@algolia/transporter" "4.23.3" "@algolia/events@^4.0.1": version "4.0.1" - resolved "https://registry.npmjs.org/@algolia/events/-/events-4.0.1.tgz" + resolved "https://registry.yarnpkg.com/@algolia/events/-/events-4.0.1.tgz#fd39e7477e7bc703d7f893b556f676c032af3950" integrity sha512-FQzvOCgoFXAbf5Y6mYozw2aj5KCJoA3m4heImceldzPSMbdyS4atVjJzXKMsfX3wnZTFYwkkt8/z8UesLHlSBQ== -"@algolia/logger-common@4.14.2": - version "4.14.2" - resolved "https://registry.npmjs.org/@algolia/logger-common/-/logger-common-4.14.2.tgz" - integrity sha512-/JGlYvdV++IcMHBnVFsqEisTiOeEr6cUJtpjz8zc0A9c31JrtLm318Njc72p14Pnkw3A/5lHHh+QxpJ6WFTmsA== +"@algolia/logger-common@4.23.3": + version "4.23.3" + resolved "https://registry.yarnpkg.com/@algolia/logger-common/-/logger-common-4.23.3.tgz#35c6d833cbf41e853a4f36ba37c6e5864920bfe9" + integrity sha512-y9kBtmJwiZ9ZZ+1Ek66P0M68mHQzKRxkW5kAAXYN/rdzgDN0d2COsViEFufxJ0pb45K4FRcfC7+33YB4BLrZ+g== -"@algolia/logger-console@4.14.2": - version "4.14.2" - resolved "https://registry.npmjs.org/@algolia/logger-console/-/logger-console-4.14.2.tgz" - integrity sha512-8S2PlpdshbkwlLCSAB5f8c91xyc84VM9Ar9EdfE9UmX+NrKNYnWR1maXXVDQQoto07G1Ol/tYFnFVhUZq0xV/g== +"@algolia/logger-console@4.23.3": + version "4.23.3" + resolved "https://registry.yarnpkg.com/@algolia/logger-console/-/logger-console-4.23.3.tgz#30f916781826c4db5f51fcd9a8a264a06e136985" + integrity sha512-8xoiseoWDKuCVnWP8jHthgaeobDLolh00KJAdMe9XPrWPuf1by732jSpgy2BlsLTaT9m32pHI8CRfrOqQzHv3A== dependencies: - "@algolia/logger-common" "4.14.2" + "@algolia/logger-common" "4.23.3" -"@algolia/requester-browser-xhr@4.14.2": - version "4.14.2" - resolved "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.14.2.tgz" - integrity sha512-CEh//xYz/WfxHFh7pcMjQNWgpl4wFB85lUMRyVwaDPibNzQRVcV33YS+63fShFWc2+42YEipFGH2iPzlpszmDw== +"@algolia/recommend@4.23.3": + version "4.23.3" + resolved "https://registry.yarnpkg.com/@algolia/recommend/-/recommend-4.23.3.tgz#53d4f194d22d9c72dc05f3f7514c5878f87c5890" + integrity sha512-9fK4nXZF0bFkdcLBRDexsnGzVmu4TSYZqxdpgBW2tEyfuSSY54D4qSRkLmNkrrz4YFvdh2GM1gA8vSsnZPR73w== dependencies: - "@algolia/requester-common" "4.14.2" + "@algolia/cache-browser-local-storage" "4.23.3" + "@algolia/cache-common" "4.23.3" + "@algolia/cache-in-memory" "4.23.3" + "@algolia/client-common" "4.23.3" + "@algolia/client-search" "4.23.3" + "@algolia/logger-common" "4.23.3" + "@algolia/logger-console" "4.23.3" + "@algolia/requester-browser-xhr" "4.23.3" + "@algolia/requester-common" "4.23.3" + "@algolia/requester-node-http" "4.23.3" + "@algolia/transporter" "4.23.3" -"@algolia/requester-common@4.14.2": - version "4.14.2" - resolved "https://registry.npmjs.org/@algolia/requester-common/-/requester-common-4.14.2.tgz" - integrity sha512-73YQsBOKa5fvVV3My7iZHu1sUqmjjfs9TteFWwPwDmnad7T0VTCopttcsM3OjLxZFtBnX61Xxl2T2gmG2O4ehg== - -"@algolia/requester-node-http@4.14.2": - version "4.14.2" - resolved "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-4.14.2.tgz" - integrity sha512-oDbb02kd1o5GTEld4pETlPZLY0e+gOSWjWMJHWTgDXbv9rm/o2cF7japO6Vj1ENnrqWvLBmW1OzV9g6FUFhFXg== +"@algolia/requester-browser-xhr@4.23.3": + version "4.23.3" + resolved "https://registry.yarnpkg.com/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.23.3.tgz#9e47e76f60d540acc8b27b4ebc7a80d1b41938b9" + integrity sha512-jDWGIQ96BhXbmONAQsasIpTYWslyjkiGu0Quydjlowe+ciqySpiDUrJHERIRfELE5+wFc7hc1Q5hqjGoV7yghw== dependencies: - "@algolia/requester-common" "4.14.2" + "@algolia/requester-common" "4.23.3" -"@algolia/transporter@4.14.2": - version "4.14.2" - resolved "https://registry.npmjs.org/@algolia/transporter/-/transporter-4.14.2.tgz" - integrity sha512-t89dfQb2T9MFQHidjHcfhh6iGMNwvuKUvojAj+JsrHAGbuSy7yE4BylhLX6R0Q1xYRoC4Vvv+O5qIw/LdnQfsQ== +"@algolia/requester-common@4.23.3": + version "4.23.3" + resolved "https://registry.yarnpkg.com/@algolia/requester-common/-/requester-common-4.23.3.tgz#7dbae896e41adfaaf1d1fa5f317f83a99afb04b3" + integrity sha512-xloIdr/bedtYEGcXCiF2muajyvRhwop4cMZo+K2qzNht0CMzlRkm8YsDdj5IaBhshqfgmBb3rTg4sL4/PpvLYw== + +"@algolia/requester-node-http@4.23.3": + version "4.23.3" + resolved "https://registry.yarnpkg.com/@algolia/requester-node-http/-/requester-node-http-4.23.3.tgz#c9f94a5cb96a15f48cea338ab6ef16bbd0ff989f" + integrity sha512-zgu++8Uj03IWDEJM3fuNl34s746JnZOWn1Uz5taV1dFyJhVM/kTNw9Ik7YJWiUNHJQXcaD8IXD1eCb0nq/aByA== dependencies: - "@algolia/cache-common" "4.14.2" - "@algolia/logger-common" "4.14.2" - "@algolia/requester-common" "4.14.2" + "@algolia/requester-common" "4.23.3" + +"@algolia/transporter@4.23.3": + version "4.23.3" + resolved "https://registry.yarnpkg.com/@algolia/transporter/-/transporter-4.23.3.tgz#545b045b67db3850ddf0bbecbc6c84ff1f3398b7" + integrity sha512-Wjl5gttqnf/gQKJA+dafnD0Y6Yw97yvfY8R9h0dQltX1GXTgNs1zWgvtWW0tHl1EgMdhAyw189uWiZMnL3QebQ== + dependencies: + "@algolia/cache-common" "4.23.3" + "@algolia/logger-common" "4.23.3" + "@algolia/requester-common" "4.23.3" + +"@alloc/quick-lru@^5.2.0": + version "5.2.0" + resolved "https://registry.yarnpkg.com/@alloc/quick-lru/-/quick-lru-5.2.0.tgz#7bf68b20c0a350f936915fcae06f58e32007ce30" + integrity sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw== "@ampproject/remapping@^2.2.0": - version "2.2.0" - resolved "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz" - integrity sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w== + version "2.3.0" + resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.3.0.tgz#ed441b6fa600072520ce18b43d2c8cc8caecc7f4" + integrity sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw== dependencies: - "@jridgewell/gen-mapping" "^0.1.0" - "@jridgewell/trace-mapping" "^0.3.9" + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.24" -"@apidevtools/json-schema-ref-parser@^10.1.0": - version "10.1.0" - resolved "https://registry.npmjs.org/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-10.1.0.tgz" - integrity sha512-3e+viyMuXdrcK8v5pvP+SDoAQ77FH6OyRmuK48SZKmdHJRFm87RsSs8qm6kP39a/pOPURByJw+OXzQIqcfmKtA== +"@apidevtools/json-schema-ref-parser@^11.5.4": + version "11.6.4" + resolved "https://registry.yarnpkg.com/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-11.6.4.tgz#0f3e02302f646471d621a8850e6a346d63c8ebd4" + integrity sha512-9K6xOqeevacvweLGik6LnZCb1fBtCOSIWQs8d096XGeqoLKC33UVMGz9+77Gw44KvbH4pKcQPWo4ZpxkXYj05w== dependencies: "@jsdevtools/ono" "^7.1.3" - "@types/json-schema" "^7.0.11" - "@types/lodash.clonedeep" "^4.5.7" + "@types/json-schema" "^7.0.15" js-yaml "^4.1.0" - lodash.clonedeep "^4.5.0" -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.16.0", "@babel/code-frame@^7.22.13", "@babel/code-frame@^7.8.3": - version "7.22.13" - resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz" - integrity sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w== +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.16.0", "@babel/code-frame@^7.24.7", "@babel/code-frame@^7.8.3": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.24.7.tgz#882fd9e09e8ee324e496bd040401c6f046ef4465" + integrity sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA== dependencies: - "@babel/highlight" "^7.22.13" - chalk "^2.4.2" + "@babel/highlight" "^7.24.7" + picocolors "^1.0.0" -"@babel/compat-data@^7.17.7", "@babel/compat-data@^7.19.4", "@babel/compat-data@^7.22.5", "@babel/compat-data@^7.22.6", "@babel/compat-data@^7.22.9": - version "7.22.20" - resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.20.tgz" - integrity sha512-BQYjKbpXjoXwFW5jGqiizJQQT/aC7pFm9Ok1OWssonuguICi264lbgMzRp2ZMmRSlfkX6DsWDDcsrctK8Rwfiw== +"@babel/compat-data@^7.22.6", "@babel/compat-data@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.24.7.tgz#d23bbea508c3883ba8251fb4164982c36ea577ed" + integrity sha512-qJzAIcv03PyaWqxRgO4mSU3lihncDT296vnyuE2O8uA4w3UHWI4S3hgeZd1L8W1Bft40w9JxJ2b412iDUFFRhw== -"@babel/core@7.12.9": - version "7.12.9" - resolved "https://registry.npmjs.org/@babel/core/-/core-7.12.9.tgz" - integrity sha512-gTXYh3M5wb7FRXQy+FErKFAv90BnlOuNn1QkCK2lREoPAjrQCO49+HVSrFoe5uakFAF5eenS75KbO2vQiLrTMQ== - dependencies: - "@babel/code-frame" "^7.10.4" - "@babel/generator" "^7.12.5" - "@babel/helper-module-transforms" "^7.12.1" - "@babel/helpers" "^7.12.5" - "@babel/parser" "^7.12.7" - "@babel/template" "^7.12.7" - "@babel/traverse" "^7.12.9" - "@babel/types" "^7.12.7" - convert-source-map "^1.7.0" - debug "^4.1.0" - gensync "^1.0.0-beta.1" - json5 "^2.1.2" - lodash "^4.17.19" - resolve "^1.3.2" - semver "^5.4.1" - source-map "^0.5.0" - -"@babel/core@^7.18.6", "@babel/core@^7.19.6": - version "7.22.20" - resolved "https://registry.npmjs.org/@babel/core/-/core-7.22.20.tgz" - integrity sha512-Y6jd1ahLubuYweD/zJH+vvOY141v4f9igNQAQ+MBgq9JlHS2iTsZKn1aMsb3vGccZsXI16VzTBw52Xx0DWmtnA== +"@babel/core@^7.21.3", "@babel/core@^7.23.3": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.24.7.tgz#b676450141e0b52a3d43bc91da86aa608f950ac4" + integrity sha512-nykK+LEK86ahTkX/3TgauT0ikKoNCfKHEaZYTUVupJdTLzGNvrblu4u6fa7DhZONAltdf8e662t/abY8idrd/g== dependencies: "@ampproject/remapping" "^2.2.0" - "@babel/code-frame" "^7.22.13" - "@babel/generator" "^7.22.15" - "@babel/helper-compilation-targets" "^7.22.15" - "@babel/helper-module-transforms" "^7.22.20" - "@babel/helpers" "^7.22.15" - "@babel/parser" "^7.22.16" - "@babel/template" "^7.22.15" - "@babel/traverse" "^7.22.20" - "@babel/types" "^7.22.19" - convert-source-map "^1.7.0" + "@babel/code-frame" "^7.24.7" + "@babel/generator" "^7.24.7" + "@babel/helper-compilation-targets" "^7.24.7" + "@babel/helper-module-transforms" "^7.24.7" + "@babel/helpers" "^7.24.7" + "@babel/parser" "^7.24.7" + "@babel/template" "^7.24.7" + "@babel/traverse" "^7.24.7" + "@babel/types" "^7.24.7" + convert-source-map "^2.0.0" debug "^4.1.0" gensync "^1.0.0-beta.2" json5 "^2.2.3" semver "^6.3.1" -"@babel/generator@^7.12.5", "@babel/generator@^7.18.7", "@babel/generator@^7.22.15": - version "7.22.15" - resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.22.15.tgz" - integrity sha512-Zu9oWARBqeVOW0dZOjXc3JObrzuqothQ3y/n1kUtrjCoCPLkXUwMvOo/F/TCfoHMbWIFlWwpZtkZVb9ga4U2pA== +"@babel/generator@^7.23.3", "@babel/generator@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.24.7.tgz#1654d01de20ad66b4b4d99c135471bc654c55e6d" + integrity sha512-oipXieGC3i45Y1A41t4tAqpnEZWgB/lC6Ehh6+rOviR5XWpTtMmLN+fGjz9vOiNRt0p6RtO6DtD0pdU3vpqdSA== dependencies: - "@babel/types" "^7.22.15" - "@jridgewell/gen-mapping" "^0.3.2" - "@jridgewell/trace-mapping" "^0.3.17" + "@babel/types" "^7.24.7" + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.25" jsesc "^2.5.1" -"@babel/helper-annotate-as-pure@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz" - integrity sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA== +"@babel/helper-annotate-as-pure@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.24.7.tgz#5373c7bc8366b12a033b4be1ac13a206c6656aab" + integrity sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg== dependencies: - "@babel/types" "^7.18.6" + "@babel/types" "^7.24.7" -"@babel/helper-annotate-as-pure@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz" - integrity sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg== +"@babel/helper-builder-binary-assignment-operator-visitor@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.24.7.tgz#37d66feb012024f2422b762b9b2a7cfe27c7fba3" + integrity sha512-xZeCVVdwb4MsDBkkyZ64tReWYrLRHlMN72vP7Bdm3OUOuyFZExhsHUUnuWnm2/XOlAJzR0LfPpB56WXZn0X/lA== dependencies: - "@babel/types" "^7.22.5" + "@babel/traverse" "^7.24.7" + "@babel/types" "^7.24.7" -"@babel/helper-builder-binary-assignment-operator-visitor@^7.18.6": - version "7.18.9" - resolved "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.18.9.tgz" - integrity sha512-yFQ0YCHoIqarl8BCRwBL8ulYUaZpz3bNsA7oFepAzee+8/+ImtADXNOmO5vJvsPff3qi+hvpkY/NYBTrBQgdNw== +"@babel/helper-compilation-targets@^7.22.6", "@babel/helper-compilation-targets@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.24.7.tgz#4eb6c4a80d6ffeac25ab8cd9a21b5dfa48d503a9" + integrity sha512-ctSdRHBi20qWOfy27RUb4Fhp07KSJ3sXcuSvTrXrc4aG8NSYDo1ici3Vhg9bg69y5bj0Mr1lh0aeEgTvc12rMg== dependencies: - "@babel/helper-explode-assignable-expression" "^7.18.6" - "@babel/types" "^7.18.9" - -"@babel/helper-builder-binary-assignment-operator-visitor@^7.22.5": - version "7.22.10" - resolved "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.10.tgz" - integrity sha512-Av0qubwDQxC56DoUReVDeLfMEjYYSN1nZrTUrWkXd7hpU73ymRANkbuDm3yni9npkn+RXy9nNbEJZEzXr7xrfQ== - dependencies: - "@babel/types" "^7.22.10" - -"@babel/helper-compilation-targets@^7.17.7", "@babel/helper-compilation-targets@^7.18.9", "@babel/helper-compilation-targets@^7.19.0", "@babel/helper-compilation-targets@^7.19.3", "@babel/helper-compilation-targets@^7.22.10", "@babel/helper-compilation-targets@^7.22.15", "@babel/helper-compilation-targets@^7.22.5", "@babel/helper-compilation-targets@^7.22.6": - version "7.22.15" - resolved "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz" - integrity sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw== - dependencies: - "@babel/compat-data" "^7.22.9" - "@babel/helper-validator-option" "^7.22.15" - browserslist "^4.21.9" + "@babel/compat-data" "^7.24.7" + "@babel/helper-validator-option" "^7.24.7" + browserslist "^4.22.2" lru-cache "^5.1.1" semver "^6.3.1" -"@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.19.0": - version "7.19.0" - resolved "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.19.0.tgz" - integrity sha512-NRz8DwF4jT3UfrmUoZjd0Uph9HQnP30t7Ash+weACcyNkiYTywpIjDBgReJMKgr+n86sn2nPVVmJ28Dm053Kqw== +"@babel/helper-create-class-features-plugin@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.7.tgz#2eaed36b3a1c11c53bdf80d53838b293c52f5b3b" + integrity sha512-kTkaDl7c9vO80zeX1rJxnuRpEsD5tA81yh11X1gQo+PhSti3JS+7qeZo9U4RHobKRiFPKaGK3svUAeb8D0Q7eg== dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-function-name" "^7.19.0" - "@babel/helper-member-expression-to-functions" "^7.18.9" - "@babel/helper-optimise-call-expression" "^7.18.6" - "@babel/helper-replace-supers" "^7.18.9" - "@babel/helper-split-export-declaration" "^7.18.6" - -"@babel/helper-create-class-features-plugin@^7.22.5": - version "7.22.10" - resolved "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.10.tgz" - integrity sha512-5IBb77txKYQPpOEdUdIhBx8VrZyDCQ+H82H0+5dX1TmuscP5vJKEE3cKurjtIw/vFwzbVH48VweE78kVDBrqjA== - dependencies: - "@babel/helper-annotate-as-pure" "^7.22.5" - "@babel/helper-environment-visitor" "^7.22.5" - "@babel/helper-function-name" "^7.22.5" - "@babel/helper-member-expression-to-functions" "^7.22.5" - "@babel/helper-optimise-call-expression" "^7.22.5" - "@babel/helper-replace-supers" "^7.22.9" - "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" - "@babel/helper-split-export-declaration" "^7.22.6" + "@babel/helper-annotate-as-pure" "^7.24.7" + "@babel/helper-environment-visitor" "^7.24.7" + "@babel/helper-function-name" "^7.24.7" + "@babel/helper-member-expression-to-functions" "^7.24.7" + "@babel/helper-optimise-call-expression" "^7.24.7" + "@babel/helper-replace-supers" "^7.24.7" + "@babel/helper-skip-transparent-expression-wrappers" "^7.24.7" + "@babel/helper-split-export-declaration" "^7.24.7" semver "^6.3.1" -"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.19.0": - version "7.19.0" - resolved "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.19.0.tgz" - integrity sha512-htnV+mHX32DF81amCDrwIDr8nrp1PTm+3wfBN9/v8QJOLEioOCOG7qNyq0nHeFiWbT3Eb7gsPwEmV64UCQ1jzw== +"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.24.7.tgz#be4f435a80dc2b053c76eeb4b7d16dd22cfc89da" + integrity sha512-03TCmXy2FtXJEZfbXDTSqq1fRJArk7lX9DOFC/47VthYcxyIOx+eXQmdo6DOQvrbpIix+KfXwvuXdFDZHxt+rA== dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" - regexpu-core "^5.1.0" - -"@babel/helper-create-regexp-features-plugin@^7.22.5": - version "7.22.9" - resolved "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.9.tgz" - integrity sha512-+svjVa/tFwsNSG4NEy1h85+HQ5imbT92Q5/bgtS7P0GTQlP8WuFdqsiABmQouhiFGyV66oGxZFpeYHza1rNsKw== - dependencies: - "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-annotate-as-pure" "^7.24.7" regexpu-core "^5.3.1" semver "^6.3.1" -"@babel/helper-define-polyfill-provider@^0.3.3": - version "0.3.3" - resolved "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.3.tgz" - integrity sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww== - dependencies: - "@babel/helper-compilation-targets" "^7.17.7" - "@babel/helper-plugin-utils" "^7.16.7" - debug "^4.1.1" - lodash.debounce "^4.0.8" - resolve "^1.14.2" - semver "^6.1.2" - -"@babel/helper-define-polyfill-provider@^0.4.2": - version "0.4.2" - resolved "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.2.tgz" - integrity sha512-k0qnnOqHn5dK9pZpfD5XXZ9SojAITdCKRn2Lp6rnDGzIbaP0rHyMPk/4wsSxVBVz4RfN0q6VpXWP2pDGIoQ7hw== +"@babel/helper-define-polyfill-provider@^0.6.1", "@babel/helper-define-polyfill-provider@^0.6.2": + version "0.6.2" + resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.2.tgz#18594f789c3594acb24cfdb4a7f7b7d2e8bd912d" + integrity sha512-LV76g+C502biUK6AyZ3LK10vDpDyCzZnhZFXkH1L75zHPj68+qc8Zfpx2th+gzwA2MzyK+1g/3EPl62yFnVttQ== dependencies: "@babel/helper-compilation-targets" "^7.22.6" "@babel/helper-plugin-utils" "^7.22.5" @@ -323,1342 +282,804 @@ lodash.debounce "^4.0.8" resolve "^1.14.2" -"@babel/helper-environment-visitor@^7.18.9", "@babel/helper-environment-visitor@^7.22.20", "@babel/helper-environment-visitor@^7.22.5": - version "7.22.20" - resolved "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz" - integrity sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA== - -"@babel/helper-explode-assignable-expression@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.18.6.tgz" - integrity sha512-eyAYAsQmB80jNfg4baAtLeWAQHfHFiR483rzFK+BhETlGZaQC9bsfrugfXDCbRHLQbIA7U5NxhhOxN7p/dWIcg== +"@babel/helper-environment-visitor@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.24.7.tgz#4b31ba9551d1f90781ba83491dd59cf9b269f7d9" + integrity sha512-DoiN84+4Gnd0ncbBOM9AZENV4a5ZiL39HYMyZJGZ/AZEykHYdJw0wW3kdcsh9/Kn+BRXHLkkklZ51ecPKmI1CQ== dependencies: - "@babel/types" "^7.18.6" + "@babel/types" "^7.24.7" -"@babel/helper-function-name@^7.18.9", "@babel/helper-function-name@^7.19.0", "@babel/helper-function-name@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz" - integrity sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ== +"@babel/helper-function-name@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.24.7.tgz#75f1e1725742f39ac6584ee0b16d94513da38dd2" + integrity sha512-FyoJTsj/PEUWu1/TYRiXTIHc8lbw+TDYkZuoE43opPS5TrI7MyONBE1oNvfguEXAD9yhQRrVBnXdXzSLQl9XnA== dependencies: - "@babel/template" "^7.22.5" - "@babel/types" "^7.22.5" + "@babel/template" "^7.24.7" + "@babel/types" "^7.24.7" -"@babel/helper-hoist-variables@^7.18.6", "@babel/helper-hoist-variables@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz" - integrity sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw== +"@babel/helper-hoist-variables@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.24.7.tgz#b4ede1cde2fd89436397f30dc9376ee06b0f25ee" + integrity sha512-MJJwhkoGy5c4ehfoRyrJ/owKeMl19U54h27YYftT0o2teQ3FJ3nQUf/I3LlJsX4l3qlw7WRXUmiyajvHXoTubQ== dependencies: - "@babel/types" "^7.22.5" + "@babel/types" "^7.24.7" -"@babel/helper-member-expression-to-functions@^7.18.9": - version "7.18.9" - resolved "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.18.9.tgz" - integrity sha512-RxifAh2ZoVU67PyKIO4AMi1wTenGfMR/O/ae0CCRqwgBAt5v7xjdtRw7UoSbsreKrQn5t7r89eruK/9JjYHuDg== +"@babel/helper-member-expression-to-functions@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.24.7.tgz#67613d068615a70e4ed5101099affc7a41c5225f" + integrity sha512-LGeMaf5JN4hAT471eJdBs/GK1DoYIJ5GCtZN/EsL6KUiiDZOvO/eKE11AMZJa2zP4zk4qe9V2O/hxAmkRc8p6w== dependencies: - "@babel/types" "^7.18.9" + "@babel/traverse" "^7.24.7" + "@babel/types" "^7.24.7" -"@babel/helper-member-expression-to-functions@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.22.5.tgz" - integrity sha512-aBiH1NKMG0H2cGZqspNvsaBe6wNGjbJjuLy29aU+eDZjSbbN53BaxlpB02xm9v34pLTZ1nIQPFYn2qMZoa5BQQ== +"@babel/helper-module-imports@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz#f2f980392de5b84c3328fc71d38bd81bbb83042b" + integrity sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA== dependencies: - "@babel/types" "^7.22.5" + "@babel/traverse" "^7.24.7" + "@babel/types" "^7.24.7" -"@babel/helper-module-imports@^7.18.6", "@babel/helper-module-imports@^7.22.15", "@babel/helper-module-imports@^7.22.5": - version "7.22.15" - resolved "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz" - integrity sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w== +"@babel/helper-module-transforms@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.24.7.tgz#31b6c9a2930679498db65b685b1698bfd6c7daf8" + integrity sha512-1fuJEwIrp+97rM4RWdO+qrRsZlAeL1lQJoPqtCYWv0NL115XM93hIH4CSRln2w52SqvmY5hqdtauB6QFCDiZNQ== dependencies: - "@babel/types" "^7.22.15" + "@babel/helper-environment-visitor" "^7.24.7" + "@babel/helper-module-imports" "^7.24.7" + "@babel/helper-simple-access" "^7.24.7" + "@babel/helper-split-export-declaration" "^7.24.7" + "@babel/helper-validator-identifier" "^7.24.7" -"@babel/helper-module-transforms@^7.12.1", "@babel/helper-module-transforms@^7.18.6", "@babel/helper-module-transforms@^7.19.6", "@babel/helper-module-transforms@^7.22.20", "@babel/helper-module-transforms@^7.22.5": - version "7.22.20" - resolved "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.20.tgz" - integrity sha512-dLT7JVWIUUxKOs1UnJUBR3S70YK+pKX6AbJgB2vMIvEkZkrfJDbYDJesnPshtKV4LhDOR3Oc5YULeDizRek+5A== +"@babel/helper-optimise-call-expression@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.24.7.tgz#8b0a0456c92f6b323d27cfd00d1d664e76692a0f" + integrity sha512-jKiTsW2xmWwxT1ixIdfXUZp+P5yURx2suzLZr5Hi64rURpDYdMW0pv+Uf17EYk2Rd428Lx4tLsnjGJzYKDM/6A== dependencies: - "@babel/helper-environment-visitor" "^7.22.20" - "@babel/helper-module-imports" "^7.22.15" - "@babel/helper-simple-access" "^7.22.5" - "@babel/helper-split-export-declaration" "^7.22.6" - "@babel/helper-validator-identifier" "^7.22.20" + "@babel/types" "^7.24.7" -"@babel/helper-optimise-call-expression@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz" - integrity sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA== +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.24.7", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.7.tgz#98c84fe6fe3d0d3ae7bfc3a5e166a46844feb2a0" + integrity sha512-Rq76wjt7yz9AAc1KnlRKNAi/dMSVWgDRx43FHoJEbcYU6xOWaE2dVPwcdTukJrjxS65GITyfbvEYHvkirZ6uEg== + +"@babel/helper-remap-async-to-generator@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.24.7.tgz#b3f0f203628522713849d49403f1a414468be4c7" + integrity sha512-9pKLcTlZ92hNZMQfGCHImUpDOlAgkkpqalWEeftW5FBya75k8Li2ilerxkM/uBEj01iBZXcCIB/bwvDYgWyibA== dependencies: - "@babel/types" "^7.18.6" + "@babel/helper-annotate-as-pure" "^7.24.7" + "@babel/helper-environment-visitor" "^7.24.7" + "@babel/helper-wrap-function" "^7.24.7" -"@babel/helper-optimise-call-expression@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz" - integrity sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw== +"@babel/helper-replace-supers@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.24.7.tgz#f933b7eed81a1c0265740edc91491ce51250f765" + integrity sha512-qTAxxBM81VEyoAY0TtLrx1oAEJc09ZK67Q9ljQToqCnA+55eNwCORaxlKyu+rNfX86o8OXRUSNUnrtsAZXM9sg== dependencies: - "@babel/types" "^7.22.5" + "@babel/helper-environment-visitor" "^7.24.7" + "@babel/helper-member-expression-to-functions" "^7.24.7" + "@babel/helper-optimise-call-expression" "^7.24.7" -"@babel/helper-plugin-utils@7.10.4": - version "7.10.4" - resolved "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz" - integrity sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg== - -"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.16.7", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.18.9", "@babel/helper-plugin-utils@^7.19.0", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz" - integrity sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg== - -"@babel/helper-remap-async-to-generator@^7.18.6", "@babel/helper-remap-async-to-generator@^7.18.9": - version "7.18.9" - resolved "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz" - integrity sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA== +"@babel/helper-simple-access@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.24.7.tgz#bcade8da3aec8ed16b9c4953b74e506b51b5edb3" + integrity sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg== dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-wrap-function" "^7.18.9" - "@babel/types" "^7.18.9" + "@babel/traverse" "^7.24.7" + "@babel/types" "^7.24.7" -"@babel/helper-remap-async-to-generator@^7.22.5", "@babel/helper-remap-async-to-generator@^7.22.9": - version "7.22.9" - resolved "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.9.tgz" - integrity sha512-8WWC4oR4Px+tr+Fp0X3RHDVfINGpF3ad1HIbrc8A77epiR6eMMc6jsgozkzT2uDiOOdoS9cLIQ+XD2XvI2WSmQ== +"@babel/helper-skip-transparent-expression-wrappers@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.24.7.tgz#5f8fa83b69ed5c27adc56044f8be2b3ea96669d9" + integrity sha512-IO+DLT3LQUElMbpzlatRASEyQtfhSE0+m465v++3jyyXeBTBUjtVZg28/gHeV5mrTJqvEKhKroBGAvhW+qPHiQ== dependencies: - "@babel/helper-annotate-as-pure" "^7.22.5" - "@babel/helper-environment-visitor" "^7.22.5" - "@babel/helper-wrap-function" "^7.22.9" + "@babel/traverse" "^7.24.7" + "@babel/types" "^7.24.7" -"@babel/helper-replace-supers@^7.18.6", "@babel/helper-replace-supers@^7.18.9": - version "7.19.1" - resolved "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.19.1.tgz" - integrity sha512-T7ahH7wV0Hfs46SFh5Jz3s0B6+o8g3c+7TMxu7xKfmHikg7EAZ3I2Qk9LFhjxXq8sL7UkP5JflezNwoZa8WvWw== +"@babel/helper-split-export-declaration@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.7.tgz#83949436890e07fa3d6873c61a96e3bbf692d856" + integrity sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA== dependencies: - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-member-expression-to-functions" "^7.18.9" - "@babel/helper-optimise-call-expression" "^7.18.6" - "@babel/traverse" "^7.19.1" - "@babel/types" "^7.19.0" + "@babel/types" "^7.24.7" -"@babel/helper-replace-supers@^7.22.5", "@babel/helper-replace-supers@^7.22.9": - version "7.22.9" - resolved "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.22.9.tgz" - integrity sha512-LJIKvvpgPOPUThdYqcX6IXRuIcTkcAub0IaDRGCZH0p5GPUp7PhRU9QVgFcDDd51BaPkk77ZjqFwh6DZTAEmGg== +"@babel/helper-string-parser@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.24.7.tgz#4d2d0f14820ede3b9807ea5fc36dfc8cd7da07f2" + integrity sha512-7MbVt6xrwFQbunH2DNQsAP5sTGxfqQtErvBIvIMi6EQnbgUOuVYanvREcmFrOPhoXBrTtjhhP+lW+o5UfK+tDg== + +"@babel/helper-validator-identifier@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz#75b889cfaf9e35c2aaf42cf0d72c8e91719251db" + integrity sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w== + +"@babel/helper-validator-option@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.24.7.tgz#24c3bb77c7a425d1742eec8fb433b5a1b38e62f6" + integrity sha512-yy1/KvjhV/ZCL+SM7hBrvnZJ3ZuT9OuZgIJAGpPEToANvc3iM6iDvBnRjtElWibHU6n8/LPR/EjX9EtIEYO3pw== + +"@babel/helper-wrap-function@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.24.7.tgz#52d893af7e42edca7c6d2c6764549826336aae1f" + integrity sha512-N9JIYk3TD+1vq/wn77YnJOqMtfWhNewNE+DJV4puD2X7Ew9J4JvrzrFDfTfyv5EgEXVy9/Wt8QiOErzEmv5Ifw== dependencies: - "@babel/helper-environment-visitor" "^7.22.5" - "@babel/helper-member-expression-to-functions" "^7.22.5" - "@babel/helper-optimise-call-expression" "^7.22.5" + "@babel/helper-function-name" "^7.24.7" + "@babel/template" "^7.24.7" + "@babel/traverse" "^7.24.7" + "@babel/types" "^7.24.7" -"@babel/helper-simple-access@^7.19.4", "@babel/helper-simple-access@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz" - integrity sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w== +"@babel/helpers@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.24.7.tgz#aa2ccda29f62185acb5d42fb4a3a1b1082107416" + integrity sha512-NlmJJtvcw72yRJRcnCmGvSi+3jDEg8qFu3z0AFoymmzLx5ERVWyzd9kVXr7Th9/8yIJi2Zc6av4Tqz3wFs8QWg== dependencies: - "@babel/types" "^7.22.5" + "@babel/template" "^7.24.7" + "@babel/types" "^7.24.7" -"@babel/helper-skip-transparent-expression-wrappers@^7.18.9": - version "7.20.0" - resolved "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.20.0.tgz" - integrity sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg== +"@babel/highlight@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.24.7.tgz#a05ab1df134b286558aae0ed41e6c5f731bf409d" + integrity sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw== dependencies: - "@babel/types" "^7.20.0" - -"@babel/helper-skip-transparent-expression-wrappers@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz" - integrity sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q== - dependencies: - "@babel/types" "^7.22.5" - -"@babel/helper-split-export-declaration@^7.18.6", "@babel/helper-split-export-declaration@^7.22.6": - version "7.22.6" - resolved "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz" - integrity sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g== - dependencies: - "@babel/types" "^7.22.5" - -"@babel/helper-string-parser@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz" - integrity sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw== - -"@babel/helper-validator-identifier@^7.19.1", "@babel/helper-validator-identifier@^7.22.19", "@babel/helper-validator-identifier@^7.22.20", "@babel/helper-validator-identifier@^7.22.5": - version "7.22.20" - resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz" - integrity sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A== - -"@babel/helper-validator-option@^7.18.6", "@babel/helper-validator-option@^7.22.15", "@babel/helper-validator-option@^7.22.5": - version "7.22.15" - resolved "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz" - integrity sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA== - -"@babel/helper-wrap-function@^7.18.9": - version "7.19.0" - resolved "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.19.0.tgz" - integrity sha512-txX8aN8CZyYGTwcLhlk87KRqncAzhh5TpQamZUa0/u3an36NtDpUP6bQgBCBcLeBs09R/OwQu3OjK0k/HwfNDg== - dependencies: - "@babel/helper-function-name" "^7.19.0" - "@babel/template" "^7.18.10" - "@babel/traverse" "^7.19.0" - "@babel/types" "^7.19.0" - -"@babel/helper-wrap-function@^7.22.9": - version "7.22.10" - resolved "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.10.tgz" - integrity sha512-OnMhjWjuGYtdoO3FmsEFWvBStBAe2QOgwOLsLNDjN+aaiMD8InJk1/O3HSD8lkqTjCgg5YI34Tz15KNNA3p+nQ== - dependencies: - "@babel/helper-function-name" "^7.22.5" - "@babel/template" "^7.22.5" - "@babel/types" "^7.22.10" - -"@babel/helpers@^7.12.5", "@babel/helpers@^7.22.15": - version "7.22.15" - resolved "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.15.tgz" - integrity sha512-7pAjK0aSdxOwR+CcYAqgWOGy5dcfvzsTIfFTb2odQqW47MDfv14UaJDY6eng8ylM2EaeKXdxaSWESbkmaQHTmw== - dependencies: - "@babel/template" "^7.22.15" - "@babel/traverse" "^7.22.15" - "@babel/types" "^7.22.15" - -"@babel/highlight@^7.22.13": - version "7.22.20" - resolved "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz" - integrity sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg== - dependencies: - "@babel/helper-validator-identifier" "^7.22.20" + "@babel/helper-validator-identifier" "^7.24.7" chalk "^2.4.2" js-tokens "^4.0.0" + picocolors "^1.0.0" -"@babel/parser@^7.12.7", "@babel/parser@^7.18.8", "@babel/parser@^7.22.15", "@babel/parser@^7.22.16": - version "7.22.16" - resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.22.16.tgz" - integrity sha512-+gPfKv8UWeKKeJTUxe59+OobVcrYHETCsORl61EmSkmgymguYk/X5bp7GuUIXaFsc6y++v8ZxPsLSSuujqDphA== +"@babel/parser@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.24.7.tgz#9a5226f92f0c5c8ead550b750f5608e766c8ce85" + integrity sha512-9uUYRm6OqQrCqQdG1iCBwBPZgN8ciDBro2nIOFaiRz1/BCxaI7CNvQbDHvsArAC7Tw9Hda/B3U+6ui9u4HWXPw== -"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.18.6.tgz" - integrity sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ== +"@babel/plugin-bugfix-firefox-class-in-computed-class-key@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.24.7.tgz#fd059fd27b184ea2b4c7e646868a9a381bbc3055" + integrity sha512-TiT1ss81W80eQsN+722OaeQMY/G4yTb4G9JrqeiDADs3N8lbPMGldWi9x8tyqCW5NLx1Jh2AvkE6r6QvEltMMQ== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-environment-visitor" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.22.5.tgz" - integrity sha512-NP1M5Rf+u2Gw9qfSO4ihjcTGW5zXTi36ITLd4/EoAcEhIZ0yjMqmftDNl3QC19CX7olhrjpyU454g/2W7X0jvQ== +"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.24.7.tgz#468096ca44bbcbe8fcc570574e12eb1950e18107" + integrity sha512-unaQgZ/iRu/By6tsjMZzpeBZjChYfLYry6HrEXPoz3KmfF0sVBQ1l8zKMQ4xRGLWVsjuvB8nQfjNP/DcfEOCsg== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.18.9": - version "7.18.9" - resolved "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.18.9.tgz" - integrity sha512-AHrP9jadvH7qlOj6PINbgSuphjQUAK7AOT7DPjBo9EHoLhQTnnK5u45e1Hd4DbSQEO9nqPWtQ89r+XEOWFScKg== +"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.24.7.tgz#e4eabdd5109acc399b38d7999b2ef66fc2022f89" + integrity sha512-+izXIbke1T33mY4MSNnrqhPXDz01WYhEf3yF5NbnUtkiNnm+XBZJl3kNfoK6NKmYlz/D07+l2GWVK/QfDkNCuQ== dependencies: - "@babel/helper-plugin-utils" "^7.18.9" - "@babel/helper-skip-transparent-expression-wrappers" "^7.18.9" - "@babel/plugin-proposal-optional-chaining" "^7.18.9" + "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-skip-transparent-expression-wrappers" "^7.24.7" + "@babel/plugin-transform-optional-chaining" "^7.24.7" -"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.22.5.tgz" - integrity sha512-31Bb65aZaUwqCbWMnZPduIZxCBngHFlzyN6Dq6KAJjtx+lx6ohKHubc61OomYi7XwVD4Ol0XCVz4h+pYFR048g== +"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.24.7.tgz#71b21bb0286d5810e63a1538aa901c58e87375ec" + integrity sha512-utA4HuR6F4Vvcr+o4DnjL8fCOlgRFGbeeBEGNg3ZTrLFw6VWG5XmUrvcQ0FjIYMU2ST4XcR2Wsp7t9qOAPnxMg== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" - "@babel/plugin-transform-optional-chaining" "^7.22.5" - -"@babel/plugin-proposal-async-generator-functions@^7.19.1": - version "7.20.1" - resolved "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.1.tgz" - integrity sha512-Gh5rchzSwE4kC+o/6T8waD0WHEQIsDmjltY8WnWRXHUdH8axZhuH86Ov9M72YhJfDrZseQwuuWaaIT/TmePp3g== - dependencies: - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-plugin-utils" "^7.19.0" - "@babel/helper-remap-async-to-generator" "^7.18.9" - "@babel/plugin-syntax-async-generators" "^7.8.4" - -"@babel/plugin-proposal-class-properties@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz" - integrity sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-proposal-class-static-block@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.18.6.tgz" - integrity sha512-+I3oIiNxrCpup3Gi8n5IGMwj0gOCAjcJUSQEcotNnCCPMEnixawOQ+KeJPlgfjzx+FKQ1QSyZOWe7wmoJp7vhw== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/plugin-syntax-class-static-block" "^7.14.5" - -"@babel/plugin-proposal-dynamic-import@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.18.6.tgz" - integrity sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/plugin-syntax-dynamic-import" "^7.8.3" - -"@babel/plugin-proposal-export-namespace-from@^7.18.9": - version "7.18.9" - resolved "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.9.tgz" - integrity sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA== - dependencies: - "@babel/helper-plugin-utils" "^7.18.9" - "@babel/plugin-syntax-export-namespace-from" "^7.8.3" - -"@babel/plugin-proposal-json-strings@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.18.6.tgz" - integrity sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/plugin-syntax-json-strings" "^7.8.3" - -"@babel/plugin-proposal-logical-assignment-operators@^7.18.9": - version "7.18.9" - resolved "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.18.9.tgz" - integrity sha512-128YbMpjCrP35IOExw2Fq+x55LMP42DzhOhX2aNNIdI9avSWl2PI0yuBWarr3RYpZBSPtabfadkH2yeRiMD61Q== - dependencies: - "@babel/helper-plugin-utils" "^7.18.9" - "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" - -"@babel/plugin-proposal-nullish-coalescing-operator@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz" - integrity sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" - -"@babel/plugin-proposal-numeric-separator@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz" - integrity sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/plugin-syntax-numeric-separator" "^7.10.4" - -"@babel/plugin-proposal-object-rest-spread@7.12.1": - version "7.12.1" - resolved "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.12.1.tgz" - integrity sha512-s6SowJIjzlhx8o7lsFx5zmY4At6CTtDvgNQDdPzkBQucle58A6b/TTeEBYtyDgmcXjUTM+vE8YOGHZzzbc/ioA== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - "@babel/plugin-syntax-object-rest-spread" "^7.8.0" - "@babel/plugin-transform-parameters" "^7.12.1" - -"@babel/plugin-proposal-object-rest-spread@^7.19.4": - version "7.19.4" - resolved "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.19.4.tgz" - integrity sha512-wHmj6LDxVDnL+3WhXteUBaoM1aVILZODAUjg11kHqG4cOlfgMQGxw6aCgvrXrmaJR3Bn14oZhImyCPZzRpC93Q== - dependencies: - "@babel/compat-data" "^7.19.4" - "@babel/helper-compilation-targets" "^7.19.3" - "@babel/helper-plugin-utils" "^7.19.0" - "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-transform-parameters" "^7.18.8" - -"@babel/plugin-proposal-optional-catch-binding@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz" - integrity sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" - -"@babel/plugin-proposal-optional-chaining@^7.18.9": - version "7.18.9" - resolved "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.18.9.tgz" - integrity sha512-v5nwt4IqBXihxGsW2QmCWMDS3B3bzGIk/EQVZz2ei7f3NJl8NzAJVvUmpDW5q1CRNY+Beb/k58UAH1Km1N411w== - dependencies: - "@babel/helper-plugin-utils" "^7.18.9" - "@babel/helper-skip-transparent-expression-wrappers" "^7.18.9" - "@babel/plugin-syntax-optional-chaining" "^7.8.3" - -"@babel/plugin-proposal-private-methods@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz" - integrity sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-environment-visitor" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" "@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2": version "7.21.0-placeholder-for-preset-env.2" - resolved "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz#7844f9289546efa9febac2de4cfe358a050bd703" integrity sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w== -"@babel/plugin-proposal-private-property-in-object@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.18.6.tgz" - integrity sha512-9Rysx7FOctvT5ouj5JODjAFAkgGoudQuLPamZb0v1TGLpapdNaftzifU8NTWQm0IRjqoYypdrSmyWgkocDQ8Dw== - dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-create-class-features-plugin" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/plugin-syntax-private-property-in-object" "^7.14.5" - -"@babel/plugin-proposal-unicode-property-regex@^7.18.6", "@babel/plugin-proposal-unicode-property-regex@^7.4.4": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz" - integrity sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/plugin-syntax-async-generators@^7.8.4": version "7.8.4" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-class-properties@^7.12.13": version "7.12.13" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10" integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== dependencies: "@babel/helper-plugin-utils" "^7.12.13" "@babel/plugin-syntax-class-static-block@^7.14.5": version "7.14.5" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz#195df89b146b4b78b3bf897fd7a257c84659d406" integrity sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw== dependencies: "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-dynamic-import@^7.8.3": version "7.8.3" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3" integrity sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-export-namespace-from@^7.8.3": version "7.8.3" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz#028964a9ba80dbc094c915c487ad7c4e7a66465a" integrity sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q== dependencies: "@babel/helper-plugin-utils" "^7.8.3" -"@babel/plugin-syntax-import-assertions@^7.18.6": - version "7.20.0" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.20.0.tgz" - integrity sha512-IUh1vakzNoWalR8ch/areW7qFopR2AEw03JlG7BbrDqmQ4X3q9uuipQwSGrUn7oGiemKjtSLDhNtQHzMHr1JdQ== +"@babel/plugin-syntax-import-assertions@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.24.7.tgz#2a0b406b5871a20a841240586b1300ce2088a778" + integrity sha512-Ec3NRUMoi8gskrkBe3fNmEQfxDvY8bgfQpz6jlk/41kX9eUjvpyqWU7PBP/pLAvMaSQjbMNKJmvX57jP+M6bPg== dependencies: - "@babel/helper-plugin-utils" "^7.19.0" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-syntax-import-assertions@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.22.5.tgz" - integrity sha512-rdV97N7KqsRzeNGoWUOK6yUsWarLjE5Su/Snk9IYPU9CwkWHs4t+rTGOvffTR8XGkJMTAdLfO0xVnXm8wugIJg== +"@babel/plugin-syntax-import-attributes@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.24.7.tgz#b4f9ea95a79e6912480c4b626739f86a076624ca" + integrity sha512-hbX+lKKeUMGihnK8nvKqmXBInriT3GVjzXKFriV3YC6APGxMbP8RZNFwy91+hocLXq90Mta+HshoB31802bb8A== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-syntax-import-attributes@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.22.5.tgz" - integrity sha512-KwvoWDeNKPETmozyFE0P2rOLqh39EoQHNjqizrI5B8Vt0ZNS7M56s7dAiAqbYfiAYOuIzIh96z3iR2ktgu3tEg== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.7" "@babel/plugin-syntax-import-meta@^7.10.4": version "7.10.4" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51" integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g== dependencies: "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-json-strings@^7.8.3": version "7.8.3" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-jsx@7.12.1": - version "7.12.1" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.12.1.tgz" - integrity sha512-1yRi7yAtB0ETgxdY9ti/p2TivUxJkTdhu/ZbF9MshVGqOx1TdB3b7xCXs49Fupgg50N45KcAsRP/ZqWjs9SRjg== +"@babel/plugin-syntax-jsx@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.7.tgz#39a1fa4a7e3d3d7f34e2acc6be585b718d30e02d" + integrity sha512-6ddciUPe/mpMnOKv/U+RSd2vvVy+Yw/JfBB0ZHYjEZt9NLHmCUylNYlsbqCCS1Bffjlb0fCwC9Vqz+sBz6PsiQ== dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-syntax-jsx@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz" - integrity sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-plugin-utils" "^7.24.7" "@babel/plugin-syntax-logical-assignment-operators@^7.10.4": version "7.10.4" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== dependencies: "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": version "7.8.3" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-numeric-separator@^7.10.4": version "7.10.4" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== dependencies: "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-syntax-object-rest-spread@7.8.3", "@babel/plugin-syntax-object-rest-spread@^7.8.0", "@babel/plugin-syntax-object-rest-spread@^7.8.3": +"@babel/plugin-syntax-object-rest-spread@^7.8.3": version "7.8.3" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-optional-catch-binding@^7.8.3": version "7.8.3" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1" integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-optional-chaining@^7.8.3": version "7.8.3" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-private-property-in-object@^7.14.5": version "7.14.5" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz#0dc6671ec0ea22b6e94a1114f857970cd39de1ad" integrity sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg== dependencies: "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-top-level-await@^7.14.5": version "7.14.5" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c" integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-syntax-typescript@^7.20.0": - version "7.20.0" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.20.0.tgz" - integrity sha512-rd9TkG+u1CExzS4SM1BlMEhMXwFLKVjOAFFCDx9PbX5ycJWDoWMcwdJH9RhkPu1dOgn5TrxLot/Gx6lWFuAUNQ== +"@babel/plugin-syntax-typescript@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.24.7.tgz#58d458271b4d3b6bb27ee6ac9525acbb259bad1c" + integrity sha512-c/+fVeJBB0FeKsFvwytYiUD+LBvhHjGSI0g446PRGdSVGZLRNArBUno2PETbAly3tpiNAQR5XaZ+JslxkotsbA== dependencies: - "@babel/helper-plugin-utils" "^7.19.0" + "@babel/helper-plugin-utils" "^7.24.7" "@babel/plugin-syntax-unicode-sets-regex@^7.18.6": version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz#d49a3b3e6b52e5be6740022317580234a6a47357" integrity sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg== dependencies: "@babel/helper-create-regexp-features-plugin" "^7.18.6" "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-arrow-functions@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.18.6.tgz" - integrity sha512-9S9X9RUefzrsHZmKMbDXxweEH+YlE8JJEuat9FdvW9Qh1cw7W64jELCtWNkPBPX5En45uy28KGvA/AySqUh8CQ== +"@babel/plugin-transform-arrow-functions@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.24.7.tgz#4f6886c11e423bd69f3ce51dbf42424a5f275514" + integrity sha512-Dt9LQs6iEY++gXUwY03DNFat5C2NbO48jj+j/bSAz6b3HgPs39qcPiYt77fDObIcFwj3/C2ICX9YMwGflUoSHQ== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-arrow-functions@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.22.5.tgz" - integrity sha512-26lTNXoVRdAnsaDXPpvCNUq+OVWEVC6bx7Vvz9rC53F2bagUWW4u4ii2+h8Fejfh7RYqPxn+libeFBBck9muEw== +"@babel/plugin-transform-async-generator-functions@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.24.7.tgz#7330a5c50e05181ca52351b8fd01642000c96cfd" + integrity sha512-o+iF77e3u7ZS4AoAuJvapz9Fm001PuD2V3Lp6OSE4FYQke+cSewYtnek+THqGRWyQloRCyvWL1OkyfNEl9vr/g== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-transform-async-generator-functions@^7.22.10": - version "7.22.10" - resolved "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.22.10.tgz" - integrity sha512-eueE8lvKVzq5wIObKK/7dvoeKJ+xc6TvRn6aysIjS6pSCeLy7S/eVi7pEQknZqyqvzaNKdDtem8nUNTBgDVR2g== - dependencies: - "@babel/helper-environment-visitor" "^7.22.5" - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/helper-remap-async-to-generator" "^7.22.9" + "@babel/helper-environment-visitor" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-remap-async-to-generator" "^7.24.7" "@babel/plugin-syntax-async-generators" "^7.8.4" -"@babel/plugin-transform-async-to-generator@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.18.6.tgz" - integrity sha512-ARE5wZLKnTgPW7/1ftQmSi1CmkqqHo2DNmtztFhvgtOWSDfq0Cq9/9L+KnZNYSNrydBekhW3rwShduf59RoXag== +"@babel/plugin-transform-async-to-generator@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.24.7.tgz#72a3af6c451d575842a7e9b5a02863414355bdcc" + integrity sha512-SQY01PcJfmQ+4Ash7NE+rpbLFbmqA2GPIgqzxfFTL4t1FKRq4zTms/7htKpoCUI9OcFYgzqfmCdH53s6/jn5fA== dependencies: - "@babel/helper-module-imports" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/helper-remap-async-to-generator" "^7.18.6" + "@babel/helper-module-imports" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-remap-async-to-generator" "^7.24.7" -"@babel/plugin-transform-async-to-generator@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.22.5.tgz" - integrity sha512-b1A8D8ZzE/VhNDoV1MSJTnpKkCG5bJo+19R4o4oy03zM7ws8yEMK755j61Dc3EyvdysbqH5BOOTquJ7ZX9C6vQ== +"@babel/plugin-transform-block-scoped-functions@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.24.7.tgz#a4251d98ea0c0f399dafe1a35801eaba455bbf1f" + integrity sha512-yO7RAz6EsVQDaBH18IDJcMB1HnrUn2FJ/Jslc/WtPPWcjhpUJXU/rjbwmluzp7v/ZzWcEhTMXELnnsz8djWDwQ== dependencies: - "@babel/helper-module-imports" "^7.22.5" - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/helper-remap-async-to-generator" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-block-scoped-functions@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.18.6.tgz" - integrity sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ== +"@babel/plugin-transform-block-scoping@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.24.7.tgz#42063e4deb850c7bd7c55e626bf4e7ab48e6ce02" + integrity sha512-Nd5CvgMbWc+oWzBsuaMcbwjJWAcp5qzrbg69SZdHSP7AMY0AbWFqFO0WTFCA1jxhMCwodRwvRec8k0QUbZk7RQ== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-block-scoped-functions@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.22.5.tgz" - integrity sha512-tdXZ2UdknEKQWKJP1KMNmuF5Lx3MymtMN/pvA+p/VEkhK8jVcQ1fzSy8KM9qRYhAf2/lV33hoMPKI/xaI9sADA== +"@babel/plugin-transform-class-properties@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.24.7.tgz#256879467b57b0b68c7ddfc5b76584f398cd6834" + integrity sha512-vKbfawVYayKcSeSR5YYzzyXvsDFWU2mD8U5TFeXtbCPLFUqe7GyCgvO6XDHzje862ODrOwy6WCPmKeWHbCFJ4w== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-create-class-features-plugin" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-block-scoping@^7.19.4": - version "7.20.0" - resolved "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.20.0.tgz" - integrity sha512-sXOohbpHZSk7GjxK9b3dKB7CfqUD5DwOH+DggKzOQ7TXYP+RCSbRykfjQmn/zq+rBjycVRtLf9pYhAaEJA786w== +"@babel/plugin-transform-class-static-block@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.24.7.tgz#c82027ebb7010bc33c116d4b5044fbbf8c05484d" + integrity sha512-HMXK3WbBPpZQufbMG4B46A90PkuuhN9vBCb5T8+VAHqvAqvcLi+2cKoukcpmUYkszLhScU3l1iudhrks3DggRQ== dependencies: - "@babel/helper-plugin-utils" "^7.19.0" - -"@babel/plugin-transform-block-scoping@^7.22.10": - version "7.22.10" - resolved "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.22.10.tgz" - integrity sha512-1+kVpGAOOI1Albt6Vse7c8pHzcZQdQKW+wJH+g8mCaszOdDVwRXa/slHPqIw+oJAJANTKDMuM2cBdV0Dg618Vg== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-transform-class-properties@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.22.5.tgz" - integrity sha512-nDkQ0NfkOhPTq8YCLiWNxp1+f9fCobEjCb0n8WdbNUBc4IB5V7P1QnX9IjpSoquKrXF5SKojHleVNs2vGeHCHQ== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.22.5" - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-transform-class-static-block@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.22.5.tgz" - integrity sha512-SPToJ5eYZLxlnp1UzdARpOGeC2GbHvr9d/UV0EukuVx8atktg194oe+C5BqQ8jRTkgLRVOPYeXRSBg1IlMoVRA== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.22.5" - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-create-class-features-plugin" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" "@babel/plugin-syntax-class-static-block" "^7.14.5" -"@babel/plugin-transform-classes@^7.19.0": - version "7.19.0" - resolved "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.19.0.tgz" - integrity sha512-YfeEE9kCjqTS9IitkgfJuxjcEtLUHMqa8yUJ6zdz8vR7hKuo6mOy2C05P0F1tdMmDCeuyidKnlrw/iTppHcr2A== +"@babel/plugin-transform-classes@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.24.7.tgz#4ae6ef43a12492134138c1e45913f7c46c41b4bf" + integrity sha512-CFbbBigp8ln4FU6Bpy6g7sE8B/WmCmzvivzUC6xDAdWVsjYTXijpuuGJmYkAaoWAzcItGKT3IOAbxRItZ5HTjw== dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-compilation-targets" "^7.19.0" - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-function-name" "^7.19.0" - "@babel/helper-optimise-call-expression" "^7.18.6" - "@babel/helper-plugin-utils" "^7.19.0" - "@babel/helper-replace-supers" "^7.18.9" - "@babel/helper-split-export-declaration" "^7.18.6" + "@babel/helper-annotate-as-pure" "^7.24.7" + "@babel/helper-compilation-targets" "^7.24.7" + "@babel/helper-environment-visitor" "^7.24.7" + "@babel/helper-function-name" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-replace-supers" "^7.24.7" + "@babel/helper-split-export-declaration" "^7.24.7" globals "^11.1.0" -"@babel/plugin-transform-classes@^7.22.6": - version "7.22.6" - resolved "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.22.6.tgz" - integrity sha512-58EgM6nuPNG6Py4Z3zSuu0xWu2VfodiMi72Jt5Kj2FECmaYk1RrTXA45z6KBFsu9tRgwQDwIiY4FXTt+YsSFAQ== +"@babel/plugin-transform-computed-properties@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.24.7.tgz#4cab3214e80bc71fae3853238d13d097b004c707" + integrity sha512-25cS7v+707Gu6Ds2oY6tCkUwsJ9YIDbggd9+cu9jzzDgiNq7hR/8dkzxWfKWnTic26vsI3EsCXNd4iEB6e8esQ== dependencies: - "@babel/helper-annotate-as-pure" "^7.22.5" - "@babel/helper-compilation-targets" "^7.22.6" - "@babel/helper-environment-visitor" "^7.22.5" - "@babel/helper-function-name" "^7.22.5" - "@babel/helper-optimise-call-expression" "^7.22.5" - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/helper-replace-supers" "^7.22.5" - "@babel/helper-split-export-declaration" "^7.22.6" - globals "^11.1.0" + "@babel/helper-plugin-utils" "^7.24.7" + "@babel/template" "^7.24.7" -"@babel/plugin-transform-computed-properties@^7.18.9": - version "7.18.9" - resolved "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.18.9.tgz" - integrity sha512-+i0ZU1bCDymKakLxn5srGHrsAPRELC2WIbzwjLhHW9SIE1cPYkLCL0NlnXMZaM1vhfgA2+M7hySk42VBvrkBRw== +"@babel/plugin-transform-destructuring@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.7.tgz#a097f25292defb6e6cc16d6333a4cfc1e3c72d9e" + integrity sha512-19eJO/8kdCQ9zISOf+SEUJM/bAUIsvY3YDnXZTupUCQ8LgrWnsG/gFB9dvXqdXnRXMAM8fvt7b0CBKQHNGy1mw== dependencies: - "@babel/helper-plugin-utils" "^7.18.9" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-computed-properties@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.22.5.tgz" - integrity sha512-4GHWBgRf0krxPX+AaPtgBAlTgTeZmqDynokHOX7aqqAB4tHs3U2Y02zH6ETFdLZGcg9UQSD1WCmkVrE9ErHeOg== +"@babel/plugin-transform-dotall-regex@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.24.7.tgz#5f8bf8a680f2116a7207e16288a5f974ad47a7a0" + integrity sha512-ZOA3W+1RRTSWvyqcMJDLqbchh7U4NRGqwRfFSVbOLS/ePIP4vHB5e8T8eXcuqyN1QkgKyj5wuW0lcS85v4CrSw== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/template" "^7.22.5" + "@babel/helper-create-regexp-features-plugin" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-destructuring@^7.19.4": - version "7.20.0" - resolved "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.20.0.tgz" - integrity sha512-1dIhvZfkDVx/zn2S1aFwlruspTt4189j7fEkH0Y0VyuDM6bQt7bD6kLcz3l4IlLG+e5OReaBz9ROAbttRtUHqA== +"@babel/plugin-transform-duplicate-keys@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.24.7.tgz#dd20102897c9a2324e5adfffb67ff3610359a8ee" + integrity sha512-JdYfXyCRihAe46jUIliuL2/s0x0wObgwwiGxw/UbgJBr20gQBThrokO4nYKgWkD7uBaqM7+9x5TU7NkExZJyzw== dependencies: - "@babel/helper-plugin-utils" "^7.19.0" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-destructuring@^7.22.10": - version "7.22.10" - resolved "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.22.10.tgz" - integrity sha512-dPJrL0VOyxqLM9sritNbMSGx/teueHF/htMKrPT7DNxccXxRDPYqlgPFFdr8u+F+qUZOkZoXue/6rL5O5GduEw== +"@babel/plugin-transform-dynamic-import@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.24.7.tgz#4d8b95e3bae2b037673091aa09cd33fecd6419f4" + integrity sha512-sc3X26PhZQDb3JhORmakcbvkeInvxz+A8oda99lj7J60QRuPZvNAk9wQlTBS1ZynelDrDmTU4pw1tyc5d5ZMUg== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-transform-dotall-regex@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.18.6.tgz" - integrity sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-transform-dotall-regex@^7.22.5", "@babel/plugin-transform-dotall-regex@^7.4.4": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.22.5.tgz" - integrity sha512-5/Yk9QxCQCl+sOIB1WelKnVRxTJDSAIxtJLL2/pqL14ZVlbH0fUQUZa/T5/UnQtBNgghR7mfB8ERBKyKPCi7Vw== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.22.5" - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-transform-duplicate-keys@^7.18.9": - version "7.18.9" - resolved "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.9.tgz" - integrity sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw== - dependencies: - "@babel/helper-plugin-utils" "^7.18.9" - -"@babel/plugin-transform-duplicate-keys@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.22.5.tgz" - integrity sha512-dEnYD+9BBgld5VBXHnF/DbYGp3fqGMsyxKbtD1mDyIA7AkTSpKXFhCVuj/oQVOoALfBs77DudA0BE4d5mcpmqw== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-transform-dynamic-import@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.22.5.tgz" - integrity sha512-0MC3ppTB1AMxd8fXjSrbPa7LT9hrImt+/fcj+Pg5YMD7UQyWp/02+JWpdnCymmsXwIx5Z+sYn1bwCn4ZJNvhqQ== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.7" "@babel/plugin-syntax-dynamic-import" "^7.8.3" -"@babel/plugin-transform-exponentiation-operator@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.18.6.tgz" - integrity sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw== +"@babel/plugin-transform-exponentiation-operator@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.24.7.tgz#b629ee22645f412024297d5245bce425c31f9b0d" + integrity sha512-Rqe/vSc9OYgDajNIK35u7ot+KeCoetqQYFXM4Epf7M7ez3lWlOjrDjrwMei6caCVhfdw+mIKD4cgdGNy5JQotQ== dependencies: - "@babel/helper-builder-binary-assignment-operator-visitor" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-exponentiation-operator@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.22.5.tgz" - integrity sha512-vIpJFNM/FjZ4rh1myqIya9jXwrwwgFRHPjT3DkUA9ZLHuzox8jiXkOLvwm1H+PQIP3CqfC++WPKeuDi0Sjdj1g== +"@babel/plugin-transform-export-namespace-from@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.24.7.tgz#176d52d8d8ed516aeae7013ee9556d540c53f197" + integrity sha512-v0K9uNYsPL3oXZ/7F9NNIbAj2jv1whUEtyA6aujhekLs56R++JDQuzRcP2/z4WX5Vg/c5lE9uWZA0/iUoFhLTA== dependencies: - "@babel/helper-builder-binary-assignment-operator-visitor" "^7.22.5" - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-transform-export-namespace-from@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.22.5.tgz" - integrity sha512-X4hhm7FRnPgd4nDA4b/5V280xCx6oL7Oob5+9qVS5C13Zq4bh1qq7LU0GgRU6b5dBWBvhGaXYVB4AcN6+ol6vg== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.7" "@babel/plugin-syntax-export-namespace-from" "^7.8.3" -"@babel/plugin-transform-for-of@^7.18.8": - version "7.18.8" - resolved "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.18.8.tgz" - integrity sha512-yEfTRnjuskWYo0k1mHUqrVWaZwrdq8AYbfrpqULOJOaucGSp4mNMVps+YtA8byoevxS/urwU75vyhQIxcCgiBQ== +"@babel/plugin-transform-for-of@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.24.7.tgz#f25b33f72df1d8be76399e1b8f3f9d366eb5bc70" + integrity sha512-wo9ogrDG1ITTTBsy46oGiN1dS9A7MROBTcYsfS8DtsImMkHk9JXJ3EWQM6X2SUw4x80uGPlwj0o00Uoc6nEE3g== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-skip-transparent-expression-wrappers" "^7.24.7" -"@babel/plugin-transform-for-of@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.22.5.tgz" - integrity sha512-3kxQjX1dU9uudwSshyLeEipvrLjBCVthCgeTp6CzE/9JYrlAIaeekVxRpCWsDDfYTfRZRoCeZatCQvwo+wvK8A== +"@babel/plugin-transform-function-name@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.24.7.tgz#6d8601fbffe665c894440ab4470bc721dd9131d6" + integrity sha512-U9FcnA821YoILngSmYkW6FjyQe2TyZD5pHt4EVIhmcTkrJw/3KqcrRSxuOo5tFZJi7TE19iDyI1u+weTI7bn2w== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-compilation-targets" "^7.24.7" + "@babel/helper-function-name" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-function-name@^7.18.9": - version "7.18.9" - resolved "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.9.tgz" - integrity sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ== +"@babel/plugin-transform-json-strings@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.24.7.tgz#f3e9c37c0a373fee86e36880d45b3664cedaf73a" + integrity sha512-2yFnBGDvRuxAaE/f0vfBKvtnvvqU8tGpMHqMNpTN2oWMKIR3NqFkjaAgGwawhqK/pIN2T3XdjGPdaG0vDhOBGw== dependencies: - "@babel/helper-compilation-targets" "^7.18.9" - "@babel/helper-function-name" "^7.18.9" - "@babel/helper-plugin-utils" "^7.18.9" - -"@babel/plugin-transform-function-name@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.22.5.tgz" - integrity sha512-UIzQNMS0p0HHiQm3oelztj+ECwFnj+ZRV4KnguvlsD2of1whUeM6o7wGNj6oLwcDoAXQ8gEqfgC24D+VdIcevg== - dependencies: - "@babel/helper-compilation-targets" "^7.22.5" - "@babel/helper-function-name" "^7.22.5" - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-transform-json-strings@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.22.5.tgz" - integrity sha512-DuCRB7fu8MyTLbEQd1ew3R85nx/88yMoqo2uPSjevMj3yoN7CDM8jkgrY0wmVxfJZyJ/B9fE1iq7EQppWQmR5A== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.7" "@babel/plugin-syntax-json-strings" "^7.8.3" -"@babel/plugin-transform-literals@^7.18.9": - version "7.18.9" - resolved "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.9.tgz" - integrity sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg== +"@babel/plugin-transform-literals@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.24.7.tgz#36b505c1e655151a9d7607799a9988fc5467d06c" + integrity sha512-vcwCbb4HDH+hWi8Pqenwnjy+UiklO4Kt1vfspcQYFhJdpthSnW8XvWGyDZWKNVrVbVViI/S7K9PDJZiUmP2fYQ== dependencies: - "@babel/helper-plugin-utils" "^7.18.9" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-literals@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.22.5.tgz" - integrity sha512-fTLj4D79M+mepcw3dgFBTIDYpbcB9Sm0bpm4ppXPaO+U+PKFFyV9MGRvS0gvGw62sd10kT5lRMKXAADb9pWy8g== +"@babel/plugin-transform-logical-assignment-operators@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.24.7.tgz#a58fb6eda16c9dc8f9ff1c7b1ba6deb7f4694cb0" + integrity sha512-4D2tpwlQ1odXmTEIFWy9ELJcZHqrStlzK/dAOWYyxX3zT0iXQB6banjgeOJQXzEc4S0E0a5A+hahxPaEFYftsw== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-transform-logical-assignment-operators@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.22.5.tgz" - integrity sha512-MQQOUW1KL8X0cDWfbwYP+TbVbZm16QmQXJQ+vndPtH/BoO0lOKpVoEDMI7+PskYxH+IiE0tS8xZye0qr1lGzSA== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.7" "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" -"@babel/plugin-transform-member-expression-literals@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.18.6.tgz" - integrity sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA== +"@babel/plugin-transform-member-expression-literals@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.24.7.tgz#3b4454fb0e302e18ba4945ba3246acb1248315df" + integrity sha512-T/hRC1uqrzXMKLQ6UCwMT85S3EvqaBXDGf0FaMf4446Qx9vKwlghvee0+uuZcDUCZU5RuNi4781UQ7R308zzBw== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-member-expression-literals@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.22.5.tgz" - integrity sha512-RZEdkNtzzYCFl9SE9ATaUMTj2hqMb4StarOJLrZRbqqU4HSBE7UlBw9WBWQiDzrJZJdUWiMTVDI6Gv/8DPvfew== +"@babel/plugin-transform-modules-amd@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.24.7.tgz#65090ed493c4a834976a3ca1cde776e6ccff32d7" + integrity sha512-9+pB1qxV3vs/8Hdmz/CulFB8w2tuu6EB94JZFsjdqxQokwGa9Unap7Bo2gGBGIvPmDIVvQrom7r5m/TCDMURhg== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-module-transforms" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-modules-amd@^7.18.6": - version "7.19.6" - resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.19.6.tgz" - integrity sha512-uG3od2mXvAtIFQIh0xrpLH6r5fpSQN04gIVovl+ODLdUMANokxQLZnPBHcjmv3GxRjnqwLuHvppjjcelqUFZvg== +"@babel/plugin-transform-modules-commonjs@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.7.tgz#9fd5f7fdadee9085886b183f1ad13d1ab260f4ab" + integrity sha512-iFI8GDxtevHJ/Z22J5xQpVqFLlMNstcLXh994xifFwxxGslr2ZXXLWgtBeLctOD63UFDArdvN6Tg8RFw+aEmjQ== dependencies: - "@babel/helper-module-transforms" "^7.19.6" - "@babel/helper-plugin-utils" "^7.19.0" + "@babel/helper-module-transforms" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-simple-access" "^7.24.7" -"@babel/plugin-transform-modules-amd@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.22.5.tgz" - integrity sha512-R+PTfLTcYEmb1+kK7FNkhQ1gP4KgjpSO6HfH9+f8/yfp2Nt3ggBjiVpRwmwTlfqZLafYKJACy36yDXlEmI9HjQ== +"@babel/plugin-transform-modules-systemjs@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.24.7.tgz#f8012316c5098f6e8dee6ecd58e2bc6f003d0ce7" + integrity sha512-GYQE0tW7YoaN13qFh3O1NCY4MPkUiAH3fiF7UcV/I3ajmDKEdG3l+UOcbAm4zUE3gnvUU+Eni7XrVKo9eO9auw== dependencies: - "@babel/helper-module-transforms" "^7.22.5" - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-hoist-variables" "^7.24.7" + "@babel/helper-module-transforms" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-validator-identifier" "^7.24.7" -"@babel/plugin-transform-modules-commonjs@^7.18.6": - version "7.19.6" - resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.19.6.tgz" - integrity sha512-8PIa1ym4XRTKuSsOUXqDG0YaOlEuTVvHMe5JCfgBMOtHvJKw/4NGovEGN33viISshG/rZNVrACiBmPQLvWN8xQ== +"@babel/plugin-transform-modules-umd@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.24.7.tgz#edd9f43ec549099620df7df24e7ba13b5c76efc8" + integrity sha512-3aytQvqJ/h9z4g8AsKPLvD4Zqi2qT+L3j7XoFFu1XBlZWEl2/1kWnhmAbxpLgPrHSY0M6UA02jyTiwUVtiKR6A== dependencies: - "@babel/helper-module-transforms" "^7.19.6" - "@babel/helper-plugin-utils" "^7.19.0" - "@babel/helper-simple-access" "^7.19.4" + "@babel/helper-module-transforms" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-modules-commonjs@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.22.5.tgz" - integrity sha512-B4pzOXj+ONRmuaQTg05b3y/4DuFz3WcCNAXPLb2Q0GT0TrGKGxNKV4jwsXts+StaM0LQczZbOpj8o1DLPDJIiA== +"@babel/plugin-transform-named-capturing-groups-regex@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.24.7.tgz#9042e9b856bc6b3688c0c2e4060e9e10b1460923" + integrity sha512-/jr7h/EWeJtk1U/uz2jlsCioHkZk1JJZVcc8oQsJ1dUlaJD83f4/6Zeh2aHt9BIFokHIsSeDfhUmju0+1GPd6g== dependencies: - "@babel/helper-module-transforms" "^7.22.5" - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/helper-simple-access" "^7.22.5" + "@babel/helper-create-regexp-features-plugin" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-modules-systemjs@^7.19.0": - version "7.19.6" - resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.19.6.tgz" - integrity sha512-fqGLBepcc3kErfR9R3DnVpURmckXP7gj7bAlrTQyBxrigFqszZCkFkcoxzCp2v32XmwXLvbw+8Yq9/b+QqksjQ== +"@babel/plugin-transform-new-target@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.24.7.tgz#31ff54c4e0555cc549d5816e4ab39241dfb6ab00" + integrity sha512-RNKwfRIXg4Ls/8mMTza5oPF5RkOW8Wy/WgMAp1/F1yZ8mMbtwXW+HDoJiOsagWrAhI5f57Vncrmr9XeT4CVapA== dependencies: - "@babel/helper-hoist-variables" "^7.18.6" - "@babel/helper-module-transforms" "^7.19.6" - "@babel/helper-plugin-utils" "^7.19.0" - "@babel/helper-validator-identifier" "^7.19.1" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-modules-systemjs@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.22.5.tgz" - integrity sha512-emtEpoaTMsOs6Tzz+nbmcePl6AKVtS1yC4YNAeMun9U8YCsgadPNxnOPQ8GhHFB2qdx+LZu9LgoC0Lthuu05DQ== +"@babel/plugin-transform-nullish-coalescing-operator@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.24.7.tgz#1de4534c590af9596f53d67f52a92f12db984120" + integrity sha512-Ts7xQVk1OEocqzm8rHMXHlxvsfZ0cEF2yomUqpKENHWMF4zKk175Y4q8H5knJes6PgYad50uuRmt3UJuhBw8pQ== dependencies: - "@babel/helper-hoist-variables" "^7.22.5" - "@babel/helper-module-transforms" "^7.22.5" - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/helper-validator-identifier" "^7.22.5" - -"@babel/plugin-transform-modules-umd@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.6.tgz" - integrity sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ== - dependencies: - "@babel/helper-module-transforms" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-transform-modules-umd@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.22.5.tgz" - integrity sha512-+S6kzefN/E1vkSsKx8kmQuqeQsvCKCd1fraCM7zXm4SFoggI099Tr4G8U81+5gtMdUeMQ4ipdQffbKLX0/7dBQ== - dependencies: - "@babel/helper-module-transforms" "^7.22.5" - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-transform-named-capturing-groups-regex@^7.19.1": - version "7.19.1" - resolved "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.19.1.tgz" - integrity sha512-oWk9l9WItWBQYS4FgXD4Uyy5kq898lvkXpXQxoJEY1RnvPk4R/Dvu2ebXU9q8lP+rlMwUQTFf2Ok6d78ODa0kw== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.19.0" - "@babel/helper-plugin-utils" "^7.19.0" - -"@babel/plugin-transform-named-capturing-groups-regex@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz" - integrity sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.22.5" - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-transform-new-target@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.18.6.tgz" - integrity sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-transform-new-target@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.22.5.tgz" - integrity sha512-AsF7K0Fx/cNKVyk3a+DW0JLo+Ua598/NxMRvxDnkpCIGFh43+h/v2xyhRUYf6oD8gE4QtL83C7zZVghMjHd+iw== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-transform-nullish-coalescing-operator@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.22.5.tgz" - integrity sha512-6CF8g6z1dNYZ/VXok5uYkkBBICHZPiGEl7oDnAx2Mt1hlHVHOSIKWJaXHjQJA5VB43KZnXZDIexMchY4y2PGdA== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.7" "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" -"@babel/plugin-transform-numeric-separator@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.22.5.tgz" - integrity sha512-NbslED1/6M+sXiwwtcAB/nieypGw02Ejf4KtDeMkCEpP6gWFMX1wI9WKYua+4oBneCCEmulOkRpwywypVZzs/g== +"@babel/plugin-transform-numeric-separator@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.24.7.tgz#bea62b538c80605d8a0fac9b40f48e97efa7de63" + integrity sha512-e6q1TiVUzvH9KRvicuxdBTUj4AdKSRwzIyFFnfnezpCfP2/7Qmbb8qbU2j7GODbl4JMkblitCQjKYUaX/qkkwA== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.7" "@babel/plugin-syntax-numeric-separator" "^7.10.4" -"@babel/plugin-transform-object-rest-spread@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.22.5.tgz" - integrity sha512-Kk3lyDmEslH9DnvCDA1s1kkd3YWQITiBOHngOtDL9Pt6BZjzqb6hiOlb8VfjiiQJ2unmegBqZu0rx5RxJb5vmQ== +"@babel/plugin-transform-object-rest-spread@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.7.tgz#d13a2b93435aeb8a197e115221cab266ba6e55d6" + integrity sha512-4QrHAr0aXQCEFni2q4DqKLD31n2DL+RxcwnNjDFkSG0eNQ/xCavnRkfCUjsyqGC2OviNJvZOF/mQqZBw7i2C5Q== dependencies: - "@babel/compat-data" "^7.22.5" - "@babel/helper-compilation-targets" "^7.22.5" - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-compilation-targets" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-transform-parameters" "^7.22.5" + "@babel/plugin-transform-parameters" "^7.24.7" -"@babel/plugin-transform-object-super@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.18.6.tgz" - integrity sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA== +"@babel/plugin-transform-object-super@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.24.7.tgz#66eeaff7830bba945dd8989b632a40c04ed625be" + integrity sha512-A/vVLwN6lBrMFmMDmPPz0jnE6ZGx7Jq7d6sT/Ev4H65RER6pZ+kczlf1DthF5N0qaPHBsI7UXiE8Zy66nmAovg== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/helper-replace-supers" "^7.18.6" + "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-replace-supers" "^7.24.7" -"@babel/plugin-transform-object-super@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.22.5.tgz" - integrity sha512-klXqyaT9trSjIUrcsYIfETAzmOEZL3cBYqOYLJxBHfMFFggmXOv+NYSX/Jbs9mzMVESw/WycLFPRx8ba/b2Ipw== +"@babel/plugin-transform-optional-catch-binding@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.24.7.tgz#00eabd883d0dd6a60c1c557548785919b6e717b4" + integrity sha512-uLEndKqP5BfBbC/5jTwPxLh9kqPWWgzN/f8w6UwAIirAEqiIVJWWY312X72Eub09g5KF9+Zn7+hT7sDxmhRuKA== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/helper-replace-supers" "^7.22.5" - -"@babel/plugin-transform-optional-catch-binding@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.22.5.tgz" - integrity sha512-pH8orJahy+hzZje5b8e2QIlBWQvGpelS76C63Z+jhZKsmzfNaPQ+LaW6dcJ9bxTpo1mtXbgHwy765Ro3jftmUg== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.7" "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" -"@babel/plugin-transform-optional-chaining@^7.22.10", "@babel/plugin-transform-optional-chaining@^7.22.5": - version "7.22.10" - resolved "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.22.10.tgz" - integrity sha512-MMkQqZAZ+MGj+jGTG3OTuhKeBpNcO+0oCEbrGNEaOmiEn+1MzRyQlYsruGiU8RTK3zV6XwrVJTmwiDOyYK6J9g== +"@babel/plugin-transform-optional-chaining@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.7.tgz#b8f6848a80cf2da98a8a204429bec04756c6d454" + integrity sha512-tK+0N9yd4j+x/4hxF3F0e0fu/VdcxU18y5SevtyM/PCFlQvXbR0Zmlo2eBrKtVipGNFzpq56o8WsIIKcJFUCRQ== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-skip-transparent-expression-wrappers" "^7.24.7" "@babel/plugin-syntax-optional-chaining" "^7.8.3" -"@babel/plugin-transform-parameters@^7.12.1", "@babel/plugin-transform-parameters@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.22.5.tgz" - integrity sha512-AVkFUBurORBREOmHRKo06FjHYgjrabpdqRSwq6+C7R5iTCZOsM4QbcB27St0a4U6fffyAOqh3s/qEfybAhfivg== +"@babel/plugin-transform-parameters@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.7.tgz#5881f0ae21018400e320fc7eb817e529d1254b68" + integrity sha512-yGWW5Rr+sQOhK0Ot8hjDJuxU3XLRQGflvT4lhlSY0DFvdb3TwKaY26CJzHtYllU0vT9j58hc37ndFPsqT1SrzA== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-parameters@^7.18.8": - version "7.20.1" - resolved "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.20.1.tgz" - integrity sha512-nDvKLrAvl+kf6BOy1UJ3MGwzzfTMgppxwiD2Jb4LO3xjYyZq30oQzDNJbCQpMdG9+j2IXHoiMrw5Cm/L6ZoxXQ== +"@babel/plugin-transform-private-methods@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.24.7.tgz#e6318746b2ae70a59d023d5cc1344a2ba7a75f5e" + integrity sha512-COTCOkG2hn4JKGEKBADkA8WNb35TGkkRbI5iT845dB+NyqgO8Hn+ajPbSnIQznneJTa3d30scb6iz/DhH8GsJQ== dependencies: - "@babel/helper-plugin-utils" "^7.19.0" + "@babel/helper-create-class-features-plugin" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-private-methods@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.22.5.tgz" - integrity sha512-PPjh4gyrQnGe97JTalgRGMuU4icsZFnWkzicB/fUtzlKUqvsWBKEpPPfr5a2JiyirZkHxnAqkQMO5Z5B2kK3fA== +"@babel/plugin-transform-private-property-in-object@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.7.tgz#4eec6bc701288c1fab5f72e6a4bbc9d67faca061" + integrity sha512-9z76mxwnwFxMyxZWEgdgECQglF2Q7cFLm0kMf8pGwt+GSJsY0cONKj/UuO4bOH0w/uAel3ekS4ra5CEAyJRmDA== dependencies: - "@babel/helper-create-class-features-plugin" "^7.22.5" - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-transform-private-property-in-object@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.22.5.tgz" - integrity sha512-/9xnaTTJcVoBtSSmrVyhtSvO3kbqS2ODoh2juEU72c3aYonNF0OMGiaz2gjukyKM2wBBYJP38S4JiE0Wfb5VMQ== - dependencies: - "@babel/helper-annotate-as-pure" "^7.22.5" - "@babel/helper-create-class-features-plugin" "^7.22.5" - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-annotate-as-pure" "^7.24.7" + "@babel/helper-create-class-features-plugin" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" "@babel/plugin-syntax-private-property-in-object" "^7.14.5" -"@babel/plugin-transform-property-literals@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.18.6.tgz" - integrity sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg== +"@babel/plugin-transform-property-literals@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.24.7.tgz#f0d2ed8380dfbed949c42d4d790266525d63bbdc" + integrity sha512-EMi4MLQSHfd2nrCqQEWxFdha2gBCqU4ZcCng4WBGZ5CJL4bBRW0ptdqqDdeirGZcpALazVVNJqRmsO8/+oNCBA== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-property-literals@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.22.5.tgz" - integrity sha512-TiOArgddK3mK/x1Qwf5hay2pxI6wCZnvQqrFSqbtg1GLl2JcNMitVH/YnqjP+M31pLUeTfzY1HAXFDnUBV30rQ== +"@babel/plugin-transform-react-constant-elements@^7.21.3": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.24.7.tgz#b85e8f240b14400277f106c9c9b585d9acf608a1" + integrity sha512-7LidzZfUXyfZ8/buRW6qIIHBY8wAZ1OrY9c/wTr8YhZ6vMPo+Uc/CVFLYY1spZrEQlD4w5u8wjqk5NQ3OVqQKA== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-react-constant-elements@^7.18.12": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.22.5.tgz" - integrity sha512-BF5SXoO+nX3h5OhlN78XbbDrBOffv+AxPP2ENaJOVqjWCgBDeOY3WcaUcddutGSfoap+5NEQ/q/4I3WZIvgkXA== +"@babel/plugin-transform-react-display-name@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.24.7.tgz#9caff79836803bc666bcfe210aeb6626230c293b" + integrity sha512-H/Snz9PFxKsS1JLI4dJLtnJgCJRoo0AUm3chP6NYr+9En1JMKloheEiLIhlp5MDVznWo+H3AAC1Mc8lmUEpsgg== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-react-display-name@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.18.6.tgz" - integrity sha512-TV4sQ+T013n61uMoygyMRm+xf04Bd5oqFpv2jAEQwSZ8NwQA7zeRPg1LMVg2PWi3zWBz+CLKD+v5bcpZ/BS0aA== +"@babel/plugin-transform-react-jsx-development@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.24.7.tgz#eaee12f15a93f6496d852509a850085e6361470b" + integrity sha512-QG9EnzoGn+Qar7rxuW+ZOsbWOt56FvvI93xInqsZDC5fsekx1AlIO4KIJ5M+D0p0SqSH156EpmZyXq630B8OlQ== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/plugin-transform-react-jsx" "^7.24.7" -"@babel/plugin-transform-react-jsx-development@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.18.6.tgz" - integrity sha512-SA6HEjwYFKF7WDjWcMcMGUimmw/nhNRDWxr+KaLSCrkD/LMDBvWRmHAYgE1HDeF8KUuI8OAu+RT6EOtKxSW2qA== +"@babel/plugin-transform-react-jsx@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.24.7.tgz#17cd06b75a9f0e2bd076503400e7c4b99beedac4" + integrity sha512-+Dj06GDZEFRYvclU6k4bme55GKBEWUmByM/eoKuqg4zTNQHiApWRhQph5fxQB2wAEFvRzL1tOEj1RJ19wJrhoA== dependencies: - "@babel/plugin-transform-react-jsx" "^7.18.6" + "@babel/helper-annotate-as-pure" "^7.24.7" + "@babel/helper-module-imports" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" + "@babel/plugin-syntax-jsx" "^7.24.7" + "@babel/types" "^7.24.7" -"@babel/plugin-transform-react-jsx@^7.18.6": - version "7.19.0" - resolved "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.19.0.tgz" - integrity sha512-UVEvX3tXie3Szm3emi1+G63jyw1w5IcMY0FSKM+CRnKRI5Mr1YbCNgsSTwoTwKphQEG9P+QqmuRFneJPZuHNhg== +"@babel/plugin-transform-react-pure-annotations@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.24.7.tgz#bdd9d140d1c318b4f28b29a00fb94f97ecab1595" + integrity sha512-PLgBVk3fzbmEjBJ/u8kFzOqS9tUeDjiaWud/rRym/yjCo/M9cASPlnrd2ZmmZpQT40fOOrvR8jh+n8jikrOhNA== dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-module-imports" "^7.18.6" - "@babel/helper-plugin-utils" "^7.19.0" - "@babel/plugin-syntax-jsx" "^7.18.6" - "@babel/types" "^7.19.0" + "@babel/helper-annotate-as-pure" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-react-pure-annotations@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.18.6.tgz" - integrity sha512-I8VfEPg9r2TRDdvnHgPepTKvuRomzA8+u+nhY7qSI1fR2hRNebasZEETLyM5mAUr0Ku56OkXJ0I7NHJnO6cJiQ== +"@babel/plugin-transform-regenerator@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.24.7.tgz#021562de4534d8b4b1851759fd7af4e05d2c47f8" + integrity sha512-lq3fvXPdimDrlg6LWBoqj+r/DEWgONuwjuOuQCSYgRroXDH/IdM1C0IZf59fL5cHLpjEH/O6opIRBbqv7ELnuA== dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-transform-regenerator@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.18.6.tgz" - integrity sha512-poqRI2+qiSdeldcz4wTSTXBRryoq3Gc70ye7m7UD5Ww0nE29IXqMl6r7Nd15WBgRd74vloEMlShtH6CKxVzfmQ== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - regenerator-transform "^0.15.0" - -"@babel/plugin-transform-regenerator@^7.22.10": - version "7.22.10" - resolved "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.22.10.tgz" - integrity sha512-F28b1mDt8KcT5bUyJc/U9nwzw6cV+UmTeRlXYIl2TNqMMJif0Jeey9/RQ3C4NOd2zp0/TRsDns9ttj2L523rsw== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.7" regenerator-transform "^0.15.2" -"@babel/plugin-transform-reserved-words@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.18.6.tgz" - integrity sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA== +"@babel/plugin-transform-reserved-words@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.24.7.tgz#80037fe4fbf031fc1125022178ff3938bb3743a4" + integrity sha512-0DUq0pHcPKbjFZCfTss/pGkYMfy3vFWydkUBd9r0GHpIyfs2eCDENvqadMycRS9wZCXR41wucAfJHJmwA0UmoQ== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-reserved-words@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.22.5.tgz" - integrity sha512-DTtGKFRQUDm8svigJzZHzb/2xatPc6TzNvAIJ5GqOKDsGFYgAskjRulbR/vGsPKq3OPqtexnz327qYpP57RFyA== +"@babel/plugin-transform-runtime@^7.22.9": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.24.7.tgz#00a5bfaf8c43cf5c8703a8a6e82b59d9c58f38ca" + integrity sha512-YqXjrk4C+a1kZjewqt+Mmu2UuV1s07y8kqcUf4qYLnoqemhR4gRQikhdAhSVJioMjVTu6Mo6pAbaypEA3jY6fw== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-module-imports" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" + babel-plugin-polyfill-corejs2 "^0.4.10" + babel-plugin-polyfill-corejs3 "^0.10.1" + babel-plugin-polyfill-regenerator "^0.6.1" + semver "^6.3.1" -"@babel/plugin-transform-runtime@^7.18.6": - version "7.19.6" - resolved "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.19.6.tgz" - integrity sha512-PRH37lz4JU156lYFW1p8OxE5i7d6Sl/zV58ooyr+q1J1lnQPyg5tIiXlIwNVhJaY4W3TmOtdc8jqdXQcB1v5Yw== +"@babel/plugin-transform-shorthand-properties@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.24.7.tgz#85448c6b996e122fa9e289746140aaa99da64e73" + integrity sha512-KsDsevZMDsigzbA09+vacnLpmPH4aWjcZjXdyFKGzpplxhbeB4wYtury3vglQkg6KM/xEPKt73eCjPPf1PgXBA== dependencies: - "@babel/helper-module-imports" "^7.18.6" - "@babel/helper-plugin-utils" "^7.19.0" - babel-plugin-polyfill-corejs2 "^0.3.3" - babel-plugin-polyfill-corejs3 "^0.6.0" - babel-plugin-polyfill-regenerator "^0.4.1" - semver "^6.3.0" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-shorthand-properties@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.18.6.tgz" - integrity sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw== +"@babel/plugin-transform-spread@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.24.7.tgz#e8a38c0fde7882e0fb8f160378f74bd885cc7bb3" + integrity sha512-x96oO0I09dgMDxJaANcRyD4ellXFLLiWhuwDxKZX5g2rWP1bTPkBSwCYv96VDXVT1bD9aPj8tppr5ITIh8hBng== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-skip-transparent-expression-wrappers" "^7.24.7" -"@babel/plugin-transform-shorthand-properties@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.22.5.tgz" - integrity sha512-vM4fq9IXHscXVKzDv5itkO1X52SmdFBFcMIBZ2FRn2nqVYqw6dBexUgMvAjHW+KXpPPViD/Yo3GrDEBaRC0QYA== +"@babel/plugin-transform-sticky-regex@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.24.7.tgz#96ae80d7a7e5251f657b5cf18f1ea6bf926f5feb" + integrity sha512-kHPSIJc9v24zEml5geKg9Mjx5ULpfncj0wRpYtxbvKyTtHCYDkVE3aHQ03FrpEo4gEe2vrJJS1Y9CJTaThA52g== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-spread@^7.19.0": - version "7.19.0" - resolved "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.19.0.tgz" - integrity sha512-RsuMk7j6n+r752EtzyScnWkQyuJdli6LdO5Klv8Yx0OfPVTcQkIUfS8clx5e9yHXzlnhOZF3CbQ8C2uP5j074w== +"@babel/plugin-transform-template-literals@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.24.7.tgz#a05debb4a9072ae8f985bcf77f3f215434c8f8c8" + integrity sha512-AfDTQmClklHCOLxtGoP7HkeMw56k1/bTQjwsfhL6pppo/M4TOBSq+jjBUBLmV/4oeFg4GWMavIl44ZeCtmmZTw== dependencies: - "@babel/helper-plugin-utils" "^7.19.0" - "@babel/helper-skip-transparent-expression-wrappers" "^7.18.9" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-spread@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.22.5.tgz" - integrity sha512-5ZzDQIGyvN4w8+dMmpohL6MBo+l2G7tfC/O2Dg7/hjpgeWvUx8FzfeOKxGog9IimPa4YekaQ9PlDqTLOljkcxg== +"@babel/plugin-transform-typeof-symbol@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.7.tgz#f074be466580d47d6e6b27473a840c9f9ca08fb0" + integrity sha512-VtR8hDy7YLB7+Pet9IarXjg/zgCMSF+1mNS/EQEiEaUPoFXCVsHG64SIxcaaI2zJgRiv+YmgaQESUfWAdbjzgg== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-sticky-regex@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.18.6.tgz" - integrity sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q== +"@babel/plugin-transform-typescript@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.24.7.tgz#b006b3e0094bf0813d505e0c5485679eeaf4a881" + integrity sha512-iLD3UNkgx2n/HrjBesVbYX6j0yqn/sJktvbtKKgcaLIQ4bTTQ8obAypc1VpyHPD2y4Phh9zHOaAt8e/L14wCpw== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-annotate-as-pure" "^7.24.7" + "@babel/helper-create-class-features-plugin" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" + "@babel/plugin-syntax-typescript" "^7.24.7" -"@babel/plugin-transform-sticky-regex@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.22.5.tgz" - integrity sha512-zf7LuNpHG0iEeiyCNwX4j3gDg1jgt1k3ZdXBKbZSoA3BbGQGvMiSvfbZRR3Dr3aeJe3ooWFZxOOG3IRStYp2Bw== +"@babel/plugin-transform-unicode-escapes@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.24.7.tgz#2023a82ced1fb4971630a2e079764502c4148e0e" + integrity sha512-U3ap1gm5+4edc2Q/P+9VrBNhGkfnf+8ZqppY71Bo/pzZmXhhLdqgaUl6cuB07O1+AQJtCLfaOmswiNbSQ9ivhw== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-template-literals@^7.18.9": - version "7.18.9" - resolved "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.9.tgz" - integrity sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA== +"@babel/plugin-transform-unicode-property-regex@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.24.7.tgz#9073a4cd13b86ea71c3264659590ac086605bbcd" + integrity sha512-uH2O4OV5M9FZYQrwc7NdVmMxQJOCCzFeYudlZSzUAHRFeOujQefa92E74TQDVskNHCzOXoigEuoyzHDhaEaK5w== dependencies: - "@babel/helper-plugin-utils" "^7.18.9" + "@babel/helper-create-regexp-features-plugin" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-template-literals@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.22.5.tgz" - integrity sha512-5ciOehRNf+EyUeewo8NkbQiUs4d6ZxiHo6BcBcnFlgiJfu16q0bQUw9Jvo0b0gBKFG1SMhDSjeKXSYuJLeFSMA== +"@babel/plugin-transform-unicode-regex@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.24.7.tgz#dfc3d4a51127108099b19817c0963be6a2adf19f" + integrity sha512-hlQ96MBZSAXUq7ltkjtu3FJCCSMx/j629ns3hA3pXnBXjanNP0LHi+JpPeA81zaWgVK1VGH95Xuy7u0RyQ8kMg== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-create-regexp-features-plugin" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-typeof-symbol@^7.18.9": - version "7.18.9" - resolved "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.9.tgz" - integrity sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw== +"@babel/plugin-transform-unicode-sets-regex@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.24.7.tgz#d40705d67523803a576e29c63cef6e516b858ed9" + integrity sha512-2G8aAvF4wy1w/AGZkemprdGMRg5o6zPNhbHVImRz3lss55TYCBd6xStN19rt8XJHq20sqV0JbyWjOWwQRwV/wg== dependencies: - "@babel/helper-plugin-utils" "^7.18.9" + "@babel/helper-create-regexp-features-plugin" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-typeof-symbol@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.22.5.tgz" - integrity sha512-bYkI5lMzL4kPii4HHEEChkD0rkc+nvnlR6+o/qdqR6zrm0Sv/nodmyLhlq2DO0YKLUNd2VePmPRjJXSBh9OIdA== +"@babel/preset-env@^7.20.2", "@babel/preset-env@^7.22.9": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.24.7.tgz#ff067b4e30ba4a72f225f12f123173e77b987f37" + integrity sha512-1YZNsc+y6cTvWlDHidMBsQZrZfEFjRIo/BZCT906PMdzOyXtSLTgqGdrpcuTDCXyd11Am5uQULtDIcCfnTc8fQ== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-transform-typescript@^7.18.6": - version "7.20.0" - resolved "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.20.0.tgz" - integrity sha512-xOAsAFaun3t9hCwZ13Qe7gq423UgMZ6zAgmLxeGGapFqlT/X3L5qT2btjiVLlFn7gWtMaVyceS5VxGAuKbgizw== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.19.0" - "@babel/helper-plugin-utils" "^7.19.0" - "@babel/plugin-syntax-typescript" "^7.20.0" - -"@babel/plugin-transform-unicode-escapes@^7.18.10": - version "7.18.10" - resolved "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.18.10.tgz" - integrity sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ== - dependencies: - "@babel/helper-plugin-utils" "^7.18.9" - -"@babel/plugin-transform-unicode-escapes@^7.22.10": - version "7.22.10" - resolved "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.22.10.tgz" - integrity sha512-lRfaRKGZCBqDlRU3UIFovdp9c9mEvlylmpod0/OatICsSfuQ9YFthRo1tpTkGsklEefZdqlEFdY4A2dwTb6ohg== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-transform-unicode-property-regex@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.22.5.tgz" - integrity sha512-HCCIb+CbJIAE6sXn5CjFQXMwkCClcOfPCzTlilJ8cUatfzwHlWQkbtV0zD338u9dZskwvuOYTuuaMaA8J5EI5A== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.22.5" - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-transform-unicode-regex@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.18.6.tgz" - integrity sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-transform-unicode-regex@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.22.5.tgz" - integrity sha512-028laaOKptN5vHJf9/Arr/HiJekMd41hOEZYvNsrsXqJ7YPYuX2bQxh31fkZzGmq3YqHRJzYFFAVYvKfMPKqyg== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.22.5" - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-transform-unicode-sets-regex@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.22.5.tgz" - integrity sha512-lhMfi4FC15j13eKrh3DnYHjpGj6UKQHtNKTbtc1igvAhRy4+kLhV07OpLcsN0VgDEw/MjAvJO4BdMJsHwMhzCg== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.22.5" - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/preset-env@^7.18.6": - version "7.19.4" - resolved "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.19.4.tgz" - integrity sha512-5QVOTXUdqTCjQuh2GGtdd7YEhoRXBMVGROAtsBeLGIbIz3obCBIfRMT1I3ZKkMgNzwkyCkftDXSSkHxnfVf4qg== - dependencies: - "@babel/compat-data" "^7.19.4" - "@babel/helper-compilation-targets" "^7.19.3" - "@babel/helper-plugin-utils" "^7.19.0" - "@babel/helper-validator-option" "^7.18.6" - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.18.6" - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.18.9" - "@babel/plugin-proposal-async-generator-functions" "^7.19.1" - "@babel/plugin-proposal-class-properties" "^7.18.6" - "@babel/plugin-proposal-class-static-block" "^7.18.6" - "@babel/plugin-proposal-dynamic-import" "^7.18.6" - "@babel/plugin-proposal-export-namespace-from" "^7.18.9" - "@babel/plugin-proposal-json-strings" "^7.18.6" - "@babel/plugin-proposal-logical-assignment-operators" "^7.18.9" - "@babel/plugin-proposal-nullish-coalescing-operator" "^7.18.6" - "@babel/plugin-proposal-numeric-separator" "^7.18.6" - "@babel/plugin-proposal-object-rest-spread" "^7.19.4" - "@babel/plugin-proposal-optional-catch-binding" "^7.18.6" - "@babel/plugin-proposal-optional-chaining" "^7.18.9" - "@babel/plugin-proposal-private-methods" "^7.18.6" - "@babel/plugin-proposal-private-property-in-object" "^7.18.6" - "@babel/plugin-proposal-unicode-property-regex" "^7.18.6" - "@babel/plugin-syntax-async-generators" "^7.8.4" - "@babel/plugin-syntax-class-properties" "^7.12.13" - "@babel/plugin-syntax-class-static-block" "^7.14.5" - "@babel/plugin-syntax-dynamic-import" "^7.8.3" - "@babel/plugin-syntax-export-namespace-from" "^7.8.3" - "@babel/plugin-syntax-import-assertions" "^7.18.6" - "@babel/plugin-syntax-json-strings" "^7.8.3" - "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" - "@babel/plugin-syntax-numeric-separator" "^7.10.4" - "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" - "@babel/plugin-syntax-optional-chaining" "^7.8.3" - "@babel/plugin-syntax-private-property-in-object" "^7.14.5" - "@babel/plugin-syntax-top-level-await" "^7.14.5" - "@babel/plugin-transform-arrow-functions" "^7.18.6" - "@babel/plugin-transform-async-to-generator" "^7.18.6" - "@babel/plugin-transform-block-scoped-functions" "^7.18.6" - "@babel/plugin-transform-block-scoping" "^7.19.4" - "@babel/plugin-transform-classes" "^7.19.0" - "@babel/plugin-transform-computed-properties" "^7.18.9" - "@babel/plugin-transform-destructuring" "^7.19.4" - "@babel/plugin-transform-dotall-regex" "^7.18.6" - "@babel/plugin-transform-duplicate-keys" "^7.18.9" - "@babel/plugin-transform-exponentiation-operator" "^7.18.6" - "@babel/plugin-transform-for-of" "^7.18.8" - "@babel/plugin-transform-function-name" "^7.18.9" - "@babel/plugin-transform-literals" "^7.18.9" - "@babel/plugin-transform-member-expression-literals" "^7.18.6" - "@babel/plugin-transform-modules-amd" "^7.18.6" - "@babel/plugin-transform-modules-commonjs" "^7.18.6" - "@babel/plugin-transform-modules-systemjs" "^7.19.0" - "@babel/plugin-transform-modules-umd" "^7.18.6" - "@babel/plugin-transform-named-capturing-groups-regex" "^7.19.1" - "@babel/plugin-transform-new-target" "^7.18.6" - "@babel/plugin-transform-object-super" "^7.18.6" - "@babel/plugin-transform-parameters" "^7.18.8" - "@babel/plugin-transform-property-literals" "^7.18.6" - "@babel/plugin-transform-regenerator" "^7.18.6" - "@babel/plugin-transform-reserved-words" "^7.18.6" - "@babel/plugin-transform-shorthand-properties" "^7.18.6" - "@babel/plugin-transform-spread" "^7.19.0" - "@babel/plugin-transform-sticky-regex" "^7.18.6" - "@babel/plugin-transform-template-literals" "^7.18.9" - "@babel/plugin-transform-typeof-symbol" "^7.18.9" - "@babel/plugin-transform-unicode-escapes" "^7.18.10" - "@babel/plugin-transform-unicode-regex" "^7.18.6" - "@babel/preset-modules" "^0.1.5" - "@babel/types" "^7.19.4" - babel-plugin-polyfill-corejs2 "^0.3.3" - babel-plugin-polyfill-corejs3 "^0.6.0" - babel-plugin-polyfill-regenerator "^0.4.1" - core-js-compat "^3.25.1" - semver "^6.3.0" - -"@babel/preset-env@^7.19.4": - version "7.22.10" - resolved "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.22.10.tgz" - integrity sha512-riHpLb1drNkpLlocmSyEg4oYJIQFeXAK/d7rI6mbD0XsvoTOOweXDmQPG/ErxsEhWk3rl3Q/3F6RFQlVFS8m0A== - dependencies: - "@babel/compat-data" "^7.22.9" - "@babel/helper-compilation-targets" "^7.22.10" - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/helper-validator-option" "^7.22.5" - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.22.5" - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.22.5" + "@babel/compat-data" "^7.24.7" + "@babel/helper-compilation-targets" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-validator-option" "^7.24.7" + "@babel/plugin-bugfix-firefox-class-in-computed-class-key" "^7.24.7" + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.24.7" + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.24.7" + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly" "^7.24.7" "@babel/plugin-proposal-private-property-in-object" "7.21.0-placeholder-for-preset-env.2" "@babel/plugin-syntax-async-generators" "^7.8.4" "@babel/plugin-syntax-class-properties" "^7.12.13" "@babel/plugin-syntax-class-static-block" "^7.14.5" "@babel/plugin-syntax-dynamic-import" "^7.8.3" "@babel/plugin-syntax-export-namespace-from" "^7.8.3" - "@babel/plugin-syntax-import-assertions" "^7.22.5" - "@babel/plugin-syntax-import-attributes" "^7.22.5" + "@babel/plugin-syntax-import-assertions" "^7.24.7" + "@babel/plugin-syntax-import-attributes" "^7.24.7" "@babel/plugin-syntax-import-meta" "^7.10.4" "@babel/plugin-syntax-json-strings" "^7.8.3" "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" @@ -1670,776 +1091,802 @@ "@babel/plugin-syntax-private-property-in-object" "^7.14.5" "@babel/plugin-syntax-top-level-await" "^7.14.5" "@babel/plugin-syntax-unicode-sets-regex" "^7.18.6" - "@babel/plugin-transform-arrow-functions" "^7.22.5" - "@babel/plugin-transform-async-generator-functions" "^7.22.10" - "@babel/plugin-transform-async-to-generator" "^7.22.5" - "@babel/plugin-transform-block-scoped-functions" "^7.22.5" - "@babel/plugin-transform-block-scoping" "^7.22.10" - "@babel/plugin-transform-class-properties" "^7.22.5" - "@babel/plugin-transform-class-static-block" "^7.22.5" - "@babel/plugin-transform-classes" "^7.22.6" - "@babel/plugin-transform-computed-properties" "^7.22.5" - "@babel/plugin-transform-destructuring" "^7.22.10" - "@babel/plugin-transform-dotall-regex" "^7.22.5" - "@babel/plugin-transform-duplicate-keys" "^7.22.5" - "@babel/plugin-transform-dynamic-import" "^7.22.5" - "@babel/plugin-transform-exponentiation-operator" "^7.22.5" - "@babel/plugin-transform-export-namespace-from" "^7.22.5" - "@babel/plugin-transform-for-of" "^7.22.5" - "@babel/plugin-transform-function-name" "^7.22.5" - "@babel/plugin-transform-json-strings" "^7.22.5" - "@babel/plugin-transform-literals" "^7.22.5" - "@babel/plugin-transform-logical-assignment-operators" "^7.22.5" - "@babel/plugin-transform-member-expression-literals" "^7.22.5" - "@babel/plugin-transform-modules-amd" "^7.22.5" - "@babel/plugin-transform-modules-commonjs" "^7.22.5" - "@babel/plugin-transform-modules-systemjs" "^7.22.5" - "@babel/plugin-transform-modules-umd" "^7.22.5" - "@babel/plugin-transform-named-capturing-groups-regex" "^7.22.5" - "@babel/plugin-transform-new-target" "^7.22.5" - "@babel/plugin-transform-nullish-coalescing-operator" "^7.22.5" - "@babel/plugin-transform-numeric-separator" "^7.22.5" - "@babel/plugin-transform-object-rest-spread" "^7.22.5" - "@babel/plugin-transform-object-super" "^7.22.5" - "@babel/plugin-transform-optional-catch-binding" "^7.22.5" - "@babel/plugin-transform-optional-chaining" "^7.22.10" - "@babel/plugin-transform-parameters" "^7.22.5" - "@babel/plugin-transform-private-methods" "^7.22.5" - "@babel/plugin-transform-private-property-in-object" "^7.22.5" - "@babel/plugin-transform-property-literals" "^7.22.5" - "@babel/plugin-transform-regenerator" "^7.22.10" - "@babel/plugin-transform-reserved-words" "^7.22.5" - "@babel/plugin-transform-shorthand-properties" "^7.22.5" - "@babel/plugin-transform-spread" "^7.22.5" - "@babel/plugin-transform-sticky-regex" "^7.22.5" - "@babel/plugin-transform-template-literals" "^7.22.5" - "@babel/plugin-transform-typeof-symbol" "^7.22.5" - "@babel/plugin-transform-unicode-escapes" "^7.22.10" - "@babel/plugin-transform-unicode-property-regex" "^7.22.5" - "@babel/plugin-transform-unicode-regex" "^7.22.5" - "@babel/plugin-transform-unicode-sets-regex" "^7.22.5" + "@babel/plugin-transform-arrow-functions" "^7.24.7" + "@babel/plugin-transform-async-generator-functions" "^7.24.7" + "@babel/plugin-transform-async-to-generator" "^7.24.7" + "@babel/plugin-transform-block-scoped-functions" "^7.24.7" + "@babel/plugin-transform-block-scoping" "^7.24.7" + "@babel/plugin-transform-class-properties" "^7.24.7" + "@babel/plugin-transform-class-static-block" "^7.24.7" + "@babel/plugin-transform-classes" "^7.24.7" + "@babel/plugin-transform-computed-properties" "^7.24.7" + "@babel/plugin-transform-destructuring" "^7.24.7" + "@babel/plugin-transform-dotall-regex" "^7.24.7" + "@babel/plugin-transform-duplicate-keys" "^7.24.7" + "@babel/plugin-transform-dynamic-import" "^7.24.7" + "@babel/plugin-transform-exponentiation-operator" "^7.24.7" + "@babel/plugin-transform-export-namespace-from" "^7.24.7" + "@babel/plugin-transform-for-of" "^7.24.7" + "@babel/plugin-transform-function-name" "^7.24.7" + "@babel/plugin-transform-json-strings" "^7.24.7" + "@babel/plugin-transform-literals" "^7.24.7" + "@babel/plugin-transform-logical-assignment-operators" "^7.24.7" + "@babel/plugin-transform-member-expression-literals" "^7.24.7" + "@babel/plugin-transform-modules-amd" "^7.24.7" + "@babel/plugin-transform-modules-commonjs" "^7.24.7" + "@babel/plugin-transform-modules-systemjs" "^7.24.7" + "@babel/plugin-transform-modules-umd" "^7.24.7" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.24.7" + "@babel/plugin-transform-new-target" "^7.24.7" + "@babel/plugin-transform-nullish-coalescing-operator" "^7.24.7" + "@babel/plugin-transform-numeric-separator" "^7.24.7" + "@babel/plugin-transform-object-rest-spread" "^7.24.7" + "@babel/plugin-transform-object-super" "^7.24.7" + "@babel/plugin-transform-optional-catch-binding" "^7.24.7" + "@babel/plugin-transform-optional-chaining" "^7.24.7" + "@babel/plugin-transform-parameters" "^7.24.7" + "@babel/plugin-transform-private-methods" "^7.24.7" + "@babel/plugin-transform-private-property-in-object" "^7.24.7" + "@babel/plugin-transform-property-literals" "^7.24.7" + "@babel/plugin-transform-regenerator" "^7.24.7" + "@babel/plugin-transform-reserved-words" "^7.24.7" + "@babel/plugin-transform-shorthand-properties" "^7.24.7" + "@babel/plugin-transform-spread" "^7.24.7" + "@babel/plugin-transform-sticky-regex" "^7.24.7" + "@babel/plugin-transform-template-literals" "^7.24.7" + "@babel/plugin-transform-typeof-symbol" "^7.24.7" + "@babel/plugin-transform-unicode-escapes" "^7.24.7" + "@babel/plugin-transform-unicode-property-regex" "^7.24.7" + "@babel/plugin-transform-unicode-regex" "^7.24.7" + "@babel/plugin-transform-unicode-sets-regex" "^7.24.7" "@babel/preset-modules" "0.1.6-no-external-plugins" - "@babel/types" "^7.22.10" - babel-plugin-polyfill-corejs2 "^0.4.5" - babel-plugin-polyfill-corejs3 "^0.8.3" - babel-plugin-polyfill-regenerator "^0.5.2" + babel-plugin-polyfill-corejs2 "^0.4.10" + babel-plugin-polyfill-corejs3 "^0.10.4" + babel-plugin-polyfill-regenerator "^0.6.1" core-js-compat "^3.31.0" semver "^6.3.1" "@babel/preset-modules@0.1.6-no-external-plugins": version "0.1.6-no-external-plugins" - resolved "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz" + resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz#ccb88a2c49c817236861fee7826080573b8a923a" integrity sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA== dependencies: "@babel/helper-plugin-utils" "^7.0.0" "@babel/types" "^7.4.4" esutils "^2.0.2" -"@babel/preset-modules@^0.1.5": - version "0.1.5" - resolved "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.5.tgz" - integrity sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA== +"@babel/preset-react@^7.18.6", "@babel/preset-react@^7.22.5": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.24.7.tgz#480aeb389b2a798880bf1f889199e3641cbb22dc" + integrity sha512-AAH4lEkpmzFWrGVlHaxJB7RLH21uPQ9+He+eFLWHmF9IuFQVugz8eAsamaW0DXRrTfco5zj1wWtpdcXJUOfsag== dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-proposal-unicode-property-regex" "^7.4.4" - "@babel/plugin-transform-dotall-regex" "^7.4.4" - "@babel/types" "^7.4.4" - esutils "^2.0.2" + "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-validator-option" "^7.24.7" + "@babel/plugin-transform-react-display-name" "^7.24.7" + "@babel/plugin-transform-react-jsx" "^7.24.7" + "@babel/plugin-transform-react-jsx-development" "^7.24.7" + "@babel/plugin-transform-react-pure-annotations" "^7.24.7" -"@babel/preset-react@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.18.6.tgz" - integrity sha512-zXr6atUmyYdiWRVLOZahakYmOBHtWc2WGCkP8PYTgZi0iJXDY2CN180TdrIW4OGOAdLc7TifzDIvtx6izaRIzg== +"@babel/preset-typescript@^7.21.0", "@babel/preset-typescript@^7.22.5": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.24.7.tgz#66cd86ea8f8c014855671d5ea9a737139cbbfef1" + integrity sha512-SyXRe3OdWwIwalxDg5UtJnJQO+YPcTfwiIY2B0Xlddh9o7jpWLvv8X1RthIeDOxQ+O1ML5BLPCONToObyVQVuQ== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/helper-validator-option" "^7.18.6" - "@babel/plugin-transform-react-display-name" "^7.18.6" - "@babel/plugin-transform-react-jsx" "^7.18.6" - "@babel/plugin-transform-react-jsx-development" "^7.18.6" - "@babel/plugin-transform-react-pure-annotations" "^7.18.6" - -"@babel/preset-typescript@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.18.6.tgz" - integrity sha512-s9ik86kXBAnD760aybBucdpnLsAt0jK1xqJn2juOn9lkOvSHV60os5hxoVJsPzMQxvnUJFAlkont2DvvaYEBtQ== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/helper-validator-option" "^7.18.6" - "@babel/plugin-transform-typescript" "^7.18.6" + "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-validator-option" "^7.24.7" + "@babel/plugin-syntax-jsx" "^7.24.7" + "@babel/plugin-transform-modules-commonjs" "^7.24.7" + "@babel/plugin-transform-typescript" "^7.24.7" "@babel/regjsgen@^0.8.0": version "0.8.0" - resolved "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz" + resolved "https://registry.yarnpkg.com/@babel/regjsgen/-/regjsgen-0.8.0.tgz#f0ba69b075e1f05fb2825b7fad991e7adbb18310" integrity sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA== -"@babel/runtime-corejs3@^7.18.6": - version "7.20.1" - resolved "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.20.1.tgz" - integrity sha512-CGulbEDcg/ND1Im7fUNRZdGXmX2MTWVVZacQi/6DiKE5HNwZ3aVTm5PV4lO8HHz0B2h8WQyvKKjbX5XgTtydsg== +"@babel/runtime-corejs3@^7.22.6": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/runtime-corejs3/-/runtime-corejs3-7.24.7.tgz#65a99097e4c28e6c3a174825591700cc5abd710e" + integrity sha512-eytSX6JLBY6PVAeQa2bFlDx/7Mmln/gaEpsit5a3WEvjGfiIytEsgAwuIXCPM0xvw0v0cJn3ilq0/TvXrW0kgA== dependencies: - core-js-pure "^3.25.1" - regenerator-runtime "^0.13.10" + core-js-pure "^3.30.2" + regenerator-runtime "^0.14.0" -"@babel/runtime@^7.1.2", "@babel/runtime@^7.10.3", "@babel/runtime@^7.12.13", "@babel/runtime@^7.12.5", "@babel/runtime@^7.15.4", "@babel/runtime@^7.18.6", "@babel/runtime@^7.8.4", "@babel/runtime@^7.9.2": - version "7.20.1" - resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.20.1.tgz" - integrity sha512-mrzLkl6U9YLF8qpqI7TB82PESyEGjm/0Ly91jG575eVxMMlb8fYfOXFZIJ8XfLrJZQbm7dlKry2bJmXBUEkdFg== - dependencies: - regenerator-runtime "^0.13.10" - -"@babel/runtime@^7.20.13": - version "7.22.10" - resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.10.tgz" - integrity sha512-21t/fkKLMZI4pqP2wlmsQAWnYW1PDyKyyUV4vCi+B25ydmdaYTKXPwCj0BzSUnZf4seIiYvSA3jcZ3gdsMFkLQ== +"@babel/runtime@^7.1.2", "@babel/runtime@^7.10.3", "@babel/runtime@^7.12.13", "@babel/runtime@^7.12.5", "@babel/runtime@^7.15.4", "@babel/runtime@^7.22.6", "@babel/runtime@^7.8.4", "@babel/runtime@^7.9.2": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.24.7.tgz#f4f0d5530e8dbdf59b3451b9b3e594b6ba082e12" + integrity sha512-UwgBRMjJP+xv857DCngvqXI3Iq6J4v0wXmwc6sapg+zyhbwmQX67LUEFrkK5tbyJ30jGuG3ZvWpBiB9LCy1kWw== dependencies: regenerator-runtime "^0.14.0" -"@babel/template@^7.12.7", "@babel/template@^7.18.10", "@babel/template@^7.22.15", "@babel/template@^7.22.5": - version "7.22.15" - resolved "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz" - integrity sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w== +"@babel/template@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.24.7.tgz#02efcee317d0609d2c07117cb70ef8fb17ab7315" + integrity sha512-jYqfPrU9JTF0PmPy1tLYHW4Mp4KlgxJD9l2nP9fD6yT/ICi554DmrWBAEYpIelzjHf1msDP3PxJIRt/nFNfBig== dependencies: - "@babel/code-frame" "^7.22.13" - "@babel/parser" "^7.22.15" - "@babel/types" "^7.22.15" + "@babel/code-frame" "^7.24.7" + "@babel/parser" "^7.24.7" + "@babel/types" "^7.24.7" -"@babel/traverse@^7.12.9", "@babel/traverse@^7.18.8", "@babel/traverse@^7.19.0", "@babel/traverse@^7.19.1", "@babel/traverse@^7.22.15", "@babel/traverse@^7.22.20": - version "7.22.20" - resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.20.tgz" - integrity sha512-eU260mPZbU7mZ0N+X10pxXhQFMGTeLb9eFS0mxehS8HZp9o1uSnFeWQuG1UPrlxgA7QoUzFhOnilHDp0AXCyHw== +"@babel/traverse@^7.22.8", "@babel/traverse@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.24.7.tgz#de2b900163fa741721ba382163fe46a936c40cf5" + integrity sha512-yb65Ed5S/QAcewNPh0nZczy9JdYXkkAbIsEo+P7BE7yO3txAY30Y/oPa3QkQ5It3xVG2kpKMg9MsdxZaO31uKA== dependencies: - "@babel/code-frame" "^7.22.13" - "@babel/generator" "^7.22.15" - "@babel/helper-environment-visitor" "^7.22.20" - "@babel/helper-function-name" "^7.22.5" - "@babel/helper-hoist-variables" "^7.22.5" - "@babel/helper-split-export-declaration" "^7.22.6" - "@babel/parser" "^7.22.16" - "@babel/types" "^7.22.19" - debug "^4.1.0" + "@babel/code-frame" "^7.24.7" + "@babel/generator" "^7.24.7" + "@babel/helper-environment-visitor" "^7.24.7" + "@babel/helper-function-name" "^7.24.7" + "@babel/helper-hoist-variables" "^7.24.7" + "@babel/helper-split-export-declaration" "^7.24.7" + "@babel/parser" "^7.24.7" + "@babel/types" "^7.24.7" + debug "^4.3.1" globals "^11.1.0" -"@babel/types@^7.12.7", "@babel/types@^7.18.6", "@babel/types@^7.18.9", "@babel/types@^7.19.0", "@babel/types@^7.19.4", "@babel/types@^7.20.0", "@babel/types@^7.22.10", "@babel/types@^7.22.15", "@babel/types@^7.22.19", "@babel/types@^7.22.5", "@babel/types@^7.4.4": - version "7.22.19" - resolved "https://registry.npmjs.org/@babel/types/-/types-7.22.19.tgz" - integrity sha512-P7LAw/LbojPzkgp5oznjE6tQEIWbp4PkkfrZDINTro9zgBRtI324/EYsiSI7lhPbpIQ+DCeR2NNmMWANGGfZsg== +"@babel/types@^7.21.3", "@babel/types@^7.24.7", "@babel/types@^7.4.4": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.24.7.tgz#6027fe12bc1aa724cd32ab113fb7f1988f1f66f2" + integrity sha512-XEFXSlxiG5td2EJRe8vOmRbaXVgfcBlszKujvVmWIK/UpywWljQCfzAv3RQCGujWQ1RD4YYWEAqDXfuJiy8f5Q== dependencies: - "@babel/helper-string-parser" "^7.22.5" - "@babel/helper-validator-identifier" "^7.22.19" + "@babel/helper-string-parser" "^7.24.7" + "@babel/helper-validator-identifier" "^7.24.7" to-fast-properties "^2.0.0" -"@bufbuild/buf-darwin-arm64@1.15.0": - version "1.15.0" - resolved "https://registry.npmjs.org/@bufbuild/buf-darwin-arm64/-/buf-darwin-arm64-1.15.0.tgz" - integrity sha512-sLN6uGc8sIBALa7Q4fB6rW9NM0MXK32pH6RRDUdl7aDrp/3A6TLKKBGiHcY81axUyxDTUNFb8dOwhHTI2H8FzQ== +"@braintree/sanitize-url@^6.0.1": + version "6.0.4" + resolved "https://registry.yarnpkg.com/@braintree/sanitize-url/-/sanitize-url-6.0.4.tgz#923ca57e173c6b232bbbb07347b1be982f03e783" + integrity sha512-s3jaWicZd0pkP0jf5ysyHUI/RE7MHos6qlToFcGWXVp+ykHOy77OUMrfbgJ9it2C5bow7OIQwYYaHjk9XlBQ2A== -"@bufbuild/buf-darwin-x64@1.15.0": - version "1.15.0" - resolved "https://registry.yarnpkg.com/@bufbuild/buf-darwin-x64/-/buf-darwin-x64-1.15.0.tgz#33023704c80c8dea32e463e0728bb6297a0abf69" - integrity sha512-iHml29I/hOl7ORyp9ohiV7fC1WqPbM5UjogwVpA8j06o5SgxRhp42nd80XRAXCM+65ecwiu5JVuspicGzQFOgg== +"@bufbuild/buf-darwin-arm64@1.33.0": + version "1.33.0" + resolved "https://registry.yarnpkg.com/@bufbuild/buf-darwin-arm64/-/buf-darwin-arm64-1.33.0.tgz#9d68f4cbbe1fcf43e4ca8e791a6977836310e4a4" + integrity sha512-h2CKZUS3apPDxuB/HQHIvbzh+xXVsRik7w/AbeYO1r9PKjdet/8F53t3KrdQa4NFF948JGxQ/0/1VvVowjjZUA== -"@bufbuild/buf-linux-aarch64@1.15.0": - version "1.15.0" - resolved "https://registry.yarnpkg.com/@bufbuild/buf-linux-aarch64/-/buf-linux-aarch64-1.15.0.tgz#8e833440f090b1cafda143135f797aebc6d9e6b0" - integrity sha512-YQHXqV1HhdpmIUrYg+gZNWCf43XHJJO5TlJT+pzXB/92PoN8gNP3KdxeRaM2sExcCs91G6zy1/Ms9N6DpeidUQ== +"@bufbuild/buf-darwin-x64@1.33.0": + version "1.33.0" + resolved "https://registry.yarnpkg.com/@bufbuild/buf-darwin-x64/-/buf-darwin-x64-1.33.0.tgz#842495c18553c897346adb40abe49b47cd5405ad" + integrity sha512-DMBkAJVwwRHF0gwiCWyqToOVfcNAU8WYOkE3M2NYvQDIdeiSKw0+OjD0l+CYfppMOGh9MJWQV7di96ugDO+VbA== -"@bufbuild/buf-linux-x64@1.15.0": - version "1.15.0" - resolved "https://registry.yarnpkg.com/@bufbuild/buf-linux-x64/-/buf-linux-x64-1.15.0.tgz#68c2cc39833c018c1e2e9660e9a87f6f61df52e3" - integrity sha512-DD2OcsfofawRPQKXLFMqV2GSzi4WyE7kKE1PvXBtJy7sombv5TM26vgdb+DQv4T4Z2i7vhKshnflNkfd3QXtXA== +"@bufbuild/buf-linux-aarch64@1.33.0": + version "1.33.0" + resolved "https://registry.yarnpkg.com/@bufbuild/buf-linux-aarch64/-/buf-linux-aarch64-1.33.0.tgz#7516dbc6467cc64988b6b1191e1dcbdef9506ec0" + integrity sha512-68OxC000rHtXzV2zxHXJ54ZkkPy/3yrm9HLALo8vUk4p5/fupwzjkGMQqD6BmL/ThDO8AX3jUvhJUAg+kS1+Hw== -"@bufbuild/buf-win32-arm64@1.15.0": - version "1.15.0" - resolved "https://registry.yarnpkg.com/@bufbuild/buf-win32-arm64/-/buf-win32-arm64-1.15.0.tgz#d9b441854bd4bd26ab678da31936561ab8d82368" - integrity sha512-wk65iDXWRicfrt/9Gb1voAn9eGP2giQfKMrKOoEyytnDHFolMSmQimKH6iQ1uS5Vn0gI/BVp582cF1m9YsbXEg== +"@bufbuild/buf-linux-x64@1.33.0": + version "1.33.0" + resolved "https://registry.yarnpkg.com/@bufbuild/buf-linux-x64/-/buf-linux-x64-1.33.0.tgz#413b20c6222c662033f35c421ff6ad7f9524ee03" + integrity sha512-KsED6sanzwZCviSCMlq/P2yuuTVbgWGeUmS9CGsVn28sdjFCJb7bNhB6CKpUhox617XwqTPYZzEulQ1fF/sqJg== -"@bufbuild/buf-win32-x64@1.15.0": - version "1.15.0" - resolved "https://registry.yarnpkg.com/@bufbuild/buf-win32-x64/-/buf-win32-x64-1.15.0.tgz#48ed4c94d195d6a763686821ef23da6afa8a868b" - integrity sha512-KVoMj52ghYfLwGjQ+t19XZiQy8jGSGUYIe/yVZz08rsm5msXHGYOt++Bk3wr48rcv8gts8jo2/h1Ebkj+F6emw== +"@bufbuild/buf-win32-arm64@1.33.0": + version "1.33.0" + resolved "https://registry.yarnpkg.com/@bufbuild/buf-win32-arm64/-/buf-win32-arm64-1.33.0.tgz#5e73ed4bf652047018fc63af692fe42328af568b" + integrity sha512-QEGjUNEDI2zfajtHlbjZsM05ya9dtza5X3q95IeUJmy+7NOhV9OOLqtWnHv2iCh1zvyzefKSXWfmQhNs+M/0qA== + +"@bufbuild/buf-win32-x64@1.33.0": + version "1.33.0" + resolved "https://registry.yarnpkg.com/@bufbuild/buf-win32-x64/-/buf-win32-x64-1.33.0.tgz#167f7e600c1384b885bc003cd5df4f1eb3b1fbd0" + integrity sha512-JdPxQc7m5L6BsMzrqecKGmgJSYn3k3389dFtEXIEB2D7u2G3AWoRbPluzggo6udBYtjq+ZMdErdPjDDknNQvEg== "@bufbuild/buf@^1.14.0": - version "1.15.0" - resolved "https://registry.npmjs.org/@bufbuild/buf/-/buf-1.15.0.tgz" - integrity sha512-HX6AjKiI8TVFJKWdDGIUC/zZQG/8sf5FbmU5VdbK/U8tbfCwBADkJ6I+qP6HnDDtSU4obS164J0sibdGhAJKqg== + version "1.33.0" + resolved "https://registry.yarnpkg.com/@bufbuild/buf/-/buf-1.33.0.tgz#0f9e3f8c8674707981312c02295a0838066972e4" + integrity sha512-VnXdRDsfr1aO7gqy/geVK4/r9w4K6lj3ypsZwu75gdXMq9QXtOmdEO6QqlXO/BpjYG4Aw/Z6Bt/WEezA6hqJow== optionalDependencies: - "@bufbuild/buf-darwin-arm64" "1.15.0" - "@bufbuild/buf-darwin-x64" "1.15.0" - "@bufbuild/buf-linux-aarch64" "1.15.0" - "@bufbuild/buf-linux-x64" "1.15.0" - "@bufbuild/buf-win32-arm64" "1.15.0" - "@bufbuild/buf-win32-x64" "1.15.0" + "@bufbuild/buf-darwin-arm64" "1.33.0" + "@bufbuild/buf-darwin-x64" "1.33.0" + "@bufbuild/buf-linux-aarch64" "1.33.0" + "@bufbuild/buf-linux-x64" "1.33.0" + "@bufbuild/buf-win32-arm64" "1.33.0" + "@bufbuild/buf-win32-x64" "1.33.0" "@colors/colors@1.5.0": version "1.5.0" - resolved "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz" + resolved "https://registry.yarnpkg.com/@colors/colors/-/colors-1.5.0.tgz#bb504579c1cae923e6576a4f5da43d25f97bdbd9" integrity sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ== -"@docsearch/css@3.3.0": - version "3.3.0" - resolved "https://registry.npmjs.org/@docsearch/css/-/css-3.3.0.tgz" - integrity sha512-rODCdDtGyudLj+Va8b6w6Y85KE85bXRsps/R4Yjwt5vueXKXZQKYw0aA9knxLBT6a/bI/GMrAcmCR75KYOM6hg== +"@discoveryjs/json-ext@0.5.7": + version "0.5.7" + resolved "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz#1d572bfbbe14b7704e0ba0f39b74815b84870d70" + integrity sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw== -"@docsearch/react@^3.1.1": - version "3.3.0" - resolved "https://registry.npmjs.org/@docsearch/react/-/react-3.3.0.tgz" - integrity sha512-fhS5adZkae2SSdMYEMVg6pxI5a/cE+tW16ki1V0/ur4Fdok3hBRkmN/H8VvlXnxzggkQIIRIVvYPn00JPjen3A== - dependencies: - "@algolia/autocomplete-core" "1.7.2" - "@algolia/autocomplete-preset-algolia" "1.7.2" - "@docsearch/css" "3.3.0" - algoliasearch "^4.0.0" +"@docsearch/css@3.6.0": + version "3.6.0" + resolved "https://registry.yarnpkg.com/@docsearch/css/-/css-3.6.0.tgz#0e9f56f704b3a34d044d15fd9962ebc1536ba4fb" + integrity sha512-+sbxb71sWre+PwDK7X2T8+bhS6clcVMLwBPznX45Qu6opJcgRjAp7gYSDzVFp187J+feSj5dNBN1mJoi6ckkUQ== -"@docusaurus/core@2.2.0": - version "2.2.0" - resolved "https://registry.npmjs.org/@docusaurus/core/-/core-2.2.0.tgz" - integrity sha512-Vd6XOluKQqzG12fEs9prJgDtyn6DPok9vmUWDR2E6/nV5Fl9SVkhEQOBxwObjk3kQh7OY7vguFaLh0jqdApWsA== +"@docsearch/react@^3.5.2": + version "3.6.0" + resolved "https://registry.yarnpkg.com/@docsearch/react/-/react-3.6.0.tgz#b4f25228ecb7fc473741aefac592121e86dd2958" + integrity sha512-HUFut4ztcVNmqy9gp/wxNbC7pTOHhgVVkHVGCACTuLhUKUhKAF9KYHJtMiLUJxEqiFLQiuri1fWF8zqwM/cu1w== dependencies: - "@babel/core" "^7.18.6" - "@babel/generator" "^7.18.7" + "@algolia/autocomplete-core" "1.9.3" + "@algolia/autocomplete-preset-algolia" "1.9.3" + "@docsearch/css" "3.6.0" + algoliasearch "^4.19.1" + +"@docusaurus/core@3.4.0": + version "3.4.0" + resolved "https://registry.yarnpkg.com/@docusaurus/core/-/core-3.4.0.tgz#bdbf1af4b2f25d1bf4a5b62ec6137d84c821cb3c" + integrity sha512-g+0wwmN2UJsBqy2fQRQ6fhXruoEa62JDeEa5d8IdTJlMoaDaEDfHh7WjwGRn4opuTQWpjAwP/fbcgyHKlE+64w== + dependencies: + "@babel/core" "^7.23.3" + "@babel/generator" "^7.23.3" "@babel/plugin-syntax-dynamic-import" "^7.8.3" - "@babel/plugin-transform-runtime" "^7.18.6" - "@babel/preset-env" "^7.18.6" - "@babel/preset-react" "^7.18.6" - "@babel/preset-typescript" "^7.18.6" - "@babel/runtime" "^7.18.6" - "@babel/runtime-corejs3" "^7.18.6" - "@babel/traverse" "^7.18.8" - "@docusaurus/cssnano-preset" "2.2.0" - "@docusaurus/logger" "2.2.0" - "@docusaurus/mdx-loader" "2.2.0" - "@docusaurus/react-loadable" "5.5.2" - "@docusaurus/utils" "2.2.0" - "@docusaurus/utils-common" "2.2.0" - "@docusaurus/utils-validation" "2.2.0" - "@slorber/static-site-generator-webpack-plugin" "^4.0.7" - "@svgr/webpack" "^6.2.1" - autoprefixer "^10.4.7" - babel-loader "^8.2.5" + "@babel/plugin-transform-runtime" "^7.22.9" + "@babel/preset-env" "^7.22.9" + "@babel/preset-react" "^7.22.5" + "@babel/preset-typescript" "^7.22.5" + "@babel/runtime" "^7.22.6" + "@babel/runtime-corejs3" "^7.22.6" + "@babel/traverse" "^7.22.8" + "@docusaurus/cssnano-preset" "3.4.0" + "@docusaurus/logger" "3.4.0" + "@docusaurus/mdx-loader" "3.4.0" + "@docusaurus/utils" "3.4.0" + "@docusaurus/utils-common" "3.4.0" + "@docusaurus/utils-validation" "3.4.0" + autoprefixer "^10.4.14" + babel-loader "^9.1.3" babel-plugin-dynamic-import-node "^2.3.3" boxen "^6.2.1" chalk "^4.1.2" chokidar "^3.5.3" - clean-css "^5.3.0" - cli-table3 "^0.6.2" + clean-css "^5.3.2" + cli-table3 "^0.6.3" combine-promises "^1.1.0" commander "^5.1.0" copy-webpack-plugin "^11.0.0" - core-js "^3.23.3" - css-loader "^6.7.1" - css-minimizer-webpack-plugin "^4.0.0" - cssnano "^5.1.12" + core-js "^3.31.1" + css-loader "^6.8.1" + css-minimizer-webpack-plugin "^5.0.1" + cssnano "^6.1.2" del "^6.1.1" - detect-port "^1.3.0" + detect-port "^1.5.1" escape-html "^1.0.3" - eta "^1.12.3" + eta "^2.2.0" + eval "^0.1.8" file-loader "^6.2.0" - fs-extra "^10.1.0" - html-minifier-terser "^6.1.0" - html-tags "^3.2.0" - html-webpack-plugin "^5.5.0" - import-fresh "^3.3.0" + fs-extra "^11.1.1" + html-minifier-terser "^7.2.0" + html-tags "^3.3.1" + html-webpack-plugin "^5.5.3" leven "^3.1.0" lodash "^4.17.21" - mini-css-extract-plugin "^2.6.1" - postcss "^8.4.14" - postcss-loader "^7.0.0" + mini-css-extract-plugin "^2.7.6" + p-map "^4.0.0" + postcss "^8.4.26" + postcss-loader "^7.3.3" prompts "^2.4.2" react-dev-utils "^12.0.1" react-helmet-async "^1.3.0" - react-loadable "npm:@docusaurus/react-loadable@5.5.2" + react-loadable "npm:@docusaurus/react-loadable@6.0.0" react-loadable-ssr-addon-v5-slorber "^1.0.1" - react-router "^5.3.3" + react-router "^5.3.4" react-router-config "^5.1.1" - react-router-dom "^5.3.3" + react-router-dom "^5.3.4" rtl-detect "^1.0.4" - semver "^7.3.7" - serve-handler "^6.1.3" + semver "^7.5.4" + serve-handler "^6.1.5" shelljs "^0.8.5" - terser-webpack-plugin "^5.3.3" - tslib "^2.4.0" - update-notifier "^5.1.0" + terser-webpack-plugin "^5.3.9" + tslib "^2.6.0" + update-notifier "^6.0.2" url-loader "^4.1.1" - wait-on "^6.0.1" - webpack "^5.73.0" - webpack-bundle-analyzer "^4.5.0" - webpack-dev-server "^4.9.3" - webpack-merge "^5.8.0" + webpack "^5.88.1" + webpack-bundle-analyzer "^4.9.0" + webpack-dev-server "^4.15.1" + webpack-merge "^5.9.0" webpackbar "^5.0.2" -"@docusaurus/cssnano-preset@2.2.0": - version "2.2.0" - resolved "https://registry.npmjs.org/@docusaurus/cssnano-preset/-/cssnano-preset-2.2.0.tgz" - integrity sha512-mAAwCo4n66TMWBH1kXnHVZsakW9VAXJzTO4yZukuL3ro4F+JtkMwKfh42EG75K/J/YIFQG5I/Bzy0UH/hFxaTg== +"@docusaurus/cssnano-preset@3.4.0": + version "3.4.0" + resolved "https://registry.yarnpkg.com/@docusaurus/cssnano-preset/-/cssnano-preset-3.4.0.tgz#dc7922b3bbeabcefc9b60d0161680d81cf72c368" + integrity sha512-qwLFSz6v/pZHy/UP32IrprmH5ORce86BGtN0eBtG75PpzQJAzp9gefspox+s8IEOr0oZKuQ/nhzZ3xwyc3jYJQ== dependencies: - cssnano-preset-advanced "^5.3.8" - postcss "^8.4.14" - postcss-sort-media-queries "^4.2.1" - tslib "^2.4.0" + cssnano-preset-advanced "^6.1.2" + postcss "^8.4.38" + postcss-sort-media-queries "^5.2.0" + tslib "^2.6.0" -"@docusaurus/logger@2.2.0": - version "2.2.0" - resolved "https://registry.npmjs.org/@docusaurus/logger/-/logger-2.2.0.tgz" - integrity sha512-DF3j1cA5y2nNsu/vk8AG7xwpZu6f5MKkPPMaaIbgXLnWGfm6+wkOeW7kNrxnM95YOhKUkJUophX69nGUnLsm0A== +"@docusaurus/logger@3.4.0": + version "3.4.0" + resolved "https://registry.yarnpkg.com/@docusaurus/logger/-/logger-3.4.0.tgz#8b0ac05c7f3dac2009066e2f964dee8209a77403" + integrity sha512-bZwkX+9SJ8lB9kVRkXw+xvHYSMGG4bpYHKGXeXFvyVc79NMeeBSGgzd4TQLHH+DYeOJoCdl8flrFJVxlZ0wo/Q== dependencies: chalk "^4.1.2" - tslib "^2.4.0" + tslib "^2.6.0" -"@docusaurus/mdx-loader@2.2.0", "@docusaurus/mdx-loader@>=2.0.1 <2.3.0": - version "2.2.0" - resolved "https://registry.npmjs.org/@docusaurus/mdx-loader/-/mdx-loader-2.2.0.tgz" - integrity sha512-X2bzo3T0jW0VhUU+XdQofcEeozXOTmKQMvc8tUnWRdTnCvj4XEcBVdC3g+/jftceluiwSTNRAX4VBOJdNt18jA== +"@docusaurus/mdx-loader@3.4.0": + version "3.4.0" + resolved "https://registry.yarnpkg.com/@docusaurus/mdx-loader/-/mdx-loader-3.4.0.tgz#483d7ab57928fdbb5c8bd1678098721a930fc5f6" + integrity sha512-kSSbrrk4nTjf4d+wtBA9H+FGauf2gCax89kV8SUSJu3qaTdSIKdWERlngsiHaCFgZ7laTJ8a67UFf+xlFPtuTw== dependencies: - "@babel/parser" "^7.18.8" - "@babel/traverse" "^7.18.8" - "@docusaurus/logger" "2.2.0" - "@docusaurus/utils" "2.2.0" - "@mdx-js/mdx" "^1.6.22" + "@docusaurus/logger" "3.4.0" + "@docusaurus/utils" "3.4.0" + "@docusaurus/utils-validation" "3.4.0" + "@mdx-js/mdx" "^3.0.0" + "@slorber/remark-comment" "^1.0.0" escape-html "^1.0.3" + estree-util-value-to-estree "^3.0.1" file-loader "^6.2.0" - fs-extra "^10.1.0" - image-size "^1.0.1" - mdast-util-to-string "^2.0.0" - remark-emoji "^2.2.0" + fs-extra "^11.1.1" + image-size "^1.0.2" + mdast-util-mdx "^3.0.0" + mdast-util-to-string "^4.0.0" + rehype-raw "^7.0.0" + remark-directive "^3.0.0" + remark-emoji "^4.0.0" + remark-frontmatter "^5.0.0" + remark-gfm "^4.0.0" stringify-object "^3.3.0" - tslib "^2.4.0" - unified "^9.2.2" - unist-util-visit "^2.0.3" + tslib "^2.6.0" + unified "^11.0.3" + unist-util-visit "^5.0.0" url-loader "^4.1.1" - webpack "^5.73.0" + vfile "^6.0.1" + webpack "^5.88.1" -"@docusaurus/module-type-aliases@2.2.0": - version "2.2.0" - resolved "https://registry.npmjs.org/@docusaurus/module-type-aliases/-/module-type-aliases-2.2.0.tgz" - integrity sha512-wDGW4IHKoOr9YuJgy7uYuKWrDrSpsUSDHLZnWQYM9fN7D5EpSmYHjFruUpKWVyxLpD/Wh0rW8hYZwdjJIQUQCQ== +"@docusaurus/module-type-aliases@3.4.0": + version "3.4.0" + resolved "https://registry.yarnpkg.com/@docusaurus/module-type-aliases/-/module-type-aliases-3.4.0.tgz#2653bde58fc1aa3dbc626a6c08cfb63a37ae1bb8" + integrity sha512-A1AyS8WF5Bkjnb8s+guTDuYmUiwJzNrtchebBHpc0gz0PyHJNMaybUlSrmJjHVcGrya0LKI4YcR3lBDQfXRYLw== dependencies: - "@docusaurus/react-loadable" "5.5.2" - "@docusaurus/types" "2.2.0" + "@docusaurus/types" "3.4.0" "@types/history" "^4.7.11" "@types/react" "*" "@types/react-router-config" "*" "@types/react-router-dom" "*" react-helmet-async "*" - react-loadable "npm:@docusaurus/react-loadable@5.5.2" + react-loadable "npm:@docusaurus/react-loadable@6.0.0" -"@docusaurus/plugin-content-blog@2.2.0": - version "2.2.0" - resolved "https://registry.npmjs.org/@docusaurus/plugin-content-blog/-/plugin-content-blog-2.2.0.tgz" - integrity sha512-0mWBinEh0a5J2+8ZJXJXbrCk1tSTNf7Nm4tYAl5h2/xx+PvH/Bnu0V+7mMljYm/1QlDYALNIIaT/JcoZQFUN3w== +"@docusaurus/plugin-content-blog@3.4.0": + version "3.4.0" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-content-blog/-/plugin-content-blog-3.4.0.tgz#6373632fdbababbda73a13c4a08f907d7de8f007" + integrity sha512-vv6ZAj78ibR5Jh7XBUT4ndIjmlAxkijM3Sx5MAAzC1gyv0vupDQNhzuFg1USQmQVj3P5I6bquk12etPV3LJ+Xw== dependencies: - "@docusaurus/core" "2.2.0" - "@docusaurus/logger" "2.2.0" - "@docusaurus/mdx-loader" "2.2.0" - "@docusaurus/types" "2.2.0" - "@docusaurus/utils" "2.2.0" - "@docusaurus/utils-common" "2.2.0" - "@docusaurus/utils-validation" "2.2.0" + "@docusaurus/core" "3.4.0" + "@docusaurus/logger" "3.4.0" + "@docusaurus/mdx-loader" "3.4.0" + "@docusaurus/types" "3.4.0" + "@docusaurus/utils" "3.4.0" + "@docusaurus/utils-common" "3.4.0" + "@docusaurus/utils-validation" "3.4.0" cheerio "^1.0.0-rc.12" feed "^4.2.2" - fs-extra "^10.1.0" + fs-extra "^11.1.1" lodash "^4.17.21" reading-time "^1.5.0" - tslib "^2.4.0" - unist-util-visit "^2.0.3" + srcset "^4.0.0" + tslib "^2.6.0" + unist-util-visit "^5.0.0" utility-types "^3.10.0" - webpack "^5.73.0" + webpack "^5.88.1" -"@docusaurus/plugin-content-docs@2.2.0", "@docusaurus/plugin-content-docs@>=2.0.1 <2.3.0": - version "2.2.0" - resolved "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-2.2.0.tgz" - integrity sha512-BOazBR0XjzsHE+2K1wpNxz5QZmrJgmm3+0Re0EVPYFGW8qndCWGNtXW/0lGKhecVPML8yyFeAmnUCIs7xM2wPw== +"@docusaurus/plugin-content-docs@3.4.0", "@docusaurus/plugin-content-docs@^3.0.1": + version "3.4.0" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-content-docs/-/plugin-content-docs-3.4.0.tgz#3088973f72169a2a6d533afccec7153c8720d332" + integrity sha512-HkUCZffhBo7ocYheD9oZvMcDloRnGhBMOZRyVcAQRFmZPmNqSyISlXA1tQCIxW+r478fty97XXAGjNYzBjpCsg== dependencies: - "@docusaurus/core" "2.2.0" - "@docusaurus/logger" "2.2.0" - "@docusaurus/mdx-loader" "2.2.0" - "@docusaurus/module-type-aliases" "2.2.0" - "@docusaurus/types" "2.2.0" - "@docusaurus/utils" "2.2.0" - "@docusaurus/utils-validation" "2.2.0" - "@types/react-router-config" "^5.0.6" + "@docusaurus/core" "3.4.0" + "@docusaurus/logger" "3.4.0" + "@docusaurus/mdx-loader" "3.4.0" + "@docusaurus/module-type-aliases" "3.4.0" + "@docusaurus/types" "3.4.0" + "@docusaurus/utils" "3.4.0" + "@docusaurus/utils-common" "3.4.0" + "@docusaurus/utils-validation" "3.4.0" + "@types/react-router-config" "^5.0.7" combine-promises "^1.1.0" - fs-extra "^10.1.0" - import-fresh "^3.3.0" + fs-extra "^11.1.1" js-yaml "^4.1.0" lodash "^4.17.21" - tslib "^2.4.0" + tslib "^2.6.0" utility-types "^3.10.0" - webpack "^5.73.0" + webpack "^5.88.1" -"@docusaurus/plugin-content-pages@2.2.0": - version "2.2.0" - resolved "https://registry.npmjs.org/@docusaurus/plugin-content-pages/-/plugin-content-pages-2.2.0.tgz" - integrity sha512-+OTK3FQHk5WMvdelz8v19PbEbx+CNT6VSpx7nVOvMNs5yJCKvmqBJBQ2ZSxROxhVDYn+CZOlmyrC56NSXzHf6g== +"@docusaurus/plugin-content-pages@3.4.0": + version "3.4.0" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-content-pages/-/plugin-content-pages-3.4.0.tgz#1846172ca0355c7d32a67ef8377750ce02bbb8ad" + integrity sha512-h2+VN/0JjpR8fIkDEAoadNjfR3oLzB+v1qSXbIAKjQ46JAHx3X22n9nqS+BWSQnTnp1AjkjSvZyJMekmcwxzxg== dependencies: - "@docusaurus/core" "2.2.0" - "@docusaurus/mdx-loader" "2.2.0" - "@docusaurus/types" "2.2.0" - "@docusaurus/utils" "2.2.0" - "@docusaurus/utils-validation" "2.2.0" - fs-extra "^10.1.0" - tslib "^2.4.0" - webpack "^5.73.0" + "@docusaurus/core" "3.4.0" + "@docusaurus/mdx-loader" "3.4.0" + "@docusaurus/types" "3.4.0" + "@docusaurus/utils" "3.4.0" + "@docusaurus/utils-validation" "3.4.0" + fs-extra "^11.1.1" + tslib "^2.6.0" + webpack "^5.88.1" -"@docusaurus/plugin-debug@2.2.0": - version "2.2.0" - resolved "https://registry.npmjs.org/@docusaurus/plugin-debug/-/plugin-debug-2.2.0.tgz" - integrity sha512-p9vOep8+7OVl6r/NREEYxf4HMAjV8JMYJ7Bos5fCFO0Wyi9AZEo0sCTliRd7R8+dlJXZEgcngSdxAUo/Q+CJow== +"@docusaurus/plugin-debug@3.4.0": + version "3.4.0" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-debug/-/plugin-debug-3.4.0.tgz#74e4ec5686fa314c26f3ac150bacadbba7f06948" + integrity sha512-uV7FDUNXGyDSD3PwUaf5YijX91T5/H9SX4ErEcshzwgzWwBtK37nUWPU3ZLJfeTavX3fycTOqk9TglpOLaWkCg== dependencies: - "@docusaurus/core" "2.2.0" - "@docusaurus/types" "2.2.0" - "@docusaurus/utils" "2.2.0" - fs-extra "^10.1.0" - react-json-view "^1.21.3" - tslib "^2.4.0" + "@docusaurus/core" "3.4.0" + "@docusaurus/types" "3.4.0" + "@docusaurus/utils" "3.4.0" + fs-extra "^11.1.1" + react-json-view-lite "^1.2.0" + tslib "^2.6.0" -"@docusaurus/plugin-google-analytics@2.2.0": - version "2.2.0" - resolved "https://registry.npmjs.org/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-2.2.0.tgz" - integrity sha512-+eZVVxVeEnV5nVQJdey9ZsfyEVMls6VyWTIj8SmX0k5EbqGvnIfET+J2pYEuKQnDIHxy+syRMoRM6AHXdHYGIg== +"@docusaurus/plugin-google-analytics@3.4.0": + version "3.4.0" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-3.4.0.tgz#5f59fc25329a59decc231936f6f9fb5663da3c55" + integrity sha512-mCArluxEGi3cmYHqsgpGGt3IyLCrFBxPsxNZ56Mpur0xSlInnIHoeLDH7FvVVcPJRPSQ9/MfRqLsainRw+BojA== dependencies: - "@docusaurus/core" "2.2.0" - "@docusaurus/types" "2.2.0" - "@docusaurus/utils-validation" "2.2.0" - tslib "^2.4.0" + "@docusaurus/core" "3.4.0" + "@docusaurus/types" "3.4.0" + "@docusaurus/utils-validation" "3.4.0" + tslib "^2.6.0" -"@docusaurus/plugin-google-gtag@2.2.0": - version "2.2.0" - resolved "https://registry.npmjs.org/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-2.2.0.tgz" - integrity sha512-6SOgczP/dYdkqUMGTRqgxAS1eTp6MnJDAQMy8VCF1QKbWZmlkx4agHDexihqmYyCujTYHqDAhm1hV26EET54NQ== +"@docusaurus/plugin-google-gtag@3.4.0": + version "3.4.0" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-3.4.0.tgz#42489ac5fe1c83b5523ceedd5ef74f9aa8bc251b" + integrity sha512-Dsgg6PLAqzZw5wZ4QjUYc8Z2KqJqXxHxq3vIoyoBWiLEEfigIs7wHR+oiWUQy3Zk9MIk6JTYj7tMoQU0Jm3nqA== dependencies: - "@docusaurus/core" "2.2.0" - "@docusaurus/types" "2.2.0" - "@docusaurus/utils-validation" "2.2.0" - tslib "^2.4.0" + "@docusaurus/core" "3.4.0" + "@docusaurus/types" "3.4.0" + "@docusaurus/utils-validation" "3.4.0" + "@types/gtag.js" "^0.0.12" + tslib "^2.6.0" -"@docusaurus/plugin-sitemap@2.2.0": - version "2.2.0" - resolved "https://registry.npmjs.org/@docusaurus/plugin-sitemap/-/plugin-sitemap-2.2.0.tgz" - integrity sha512-0jAmyRDN/aI265CbWZNZuQpFqiZuo+5otk2MylU9iVrz/4J7gSc+ZJ9cy4EHrEsW7PV8s1w18hIEsmcA1YgkKg== +"@docusaurus/plugin-google-tag-manager@3.4.0": + version "3.4.0" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-google-tag-manager/-/plugin-google-tag-manager-3.4.0.tgz#cebb03a5ffa1e70b37d95601442babea251329ff" + integrity sha512-O9tX1BTwxIhgXpOLpFDueYA9DWk69WCbDRrjYoMQtFHSkTyE7RhNgyjSPREUWJb9i+YUg3OrsvrBYRl64FCPCQ== dependencies: - "@docusaurus/core" "2.2.0" - "@docusaurus/logger" "2.2.0" - "@docusaurus/types" "2.2.0" - "@docusaurus/utils" "2.2.0" - "@docusaurus/utils-common" "2.2.0" - "@docusaurus/utils-validation" "2.2.0" - fs-extra "^10.1.0" + "@docusaurus/core" "3.4.0" + "@docusaurus/types" "3.4.0" + "@docusaurus/utils-validation" "3.4.0" + tslib "^2.6.0" + +"@docusaurus/plugin-sitemap@3.4.0": + version "3.4.0" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-sitemap/-/plugin-sitemap-3.4.0.tgz#b091d64d1e3c6c872050189999580187537bcbc6" + integrity sha512-+0VDvx9SmNrFNgwPoeoCha+tRoAjopwT0+pYO1xAbyLcewXSemq+eLxEa46Q1/aoOaJQ0qqHELuQM7iS2gp33Q== + dependencies: + "@docusaurus/core" "3.4.0" + "@docusaurus/logger" "3.4.0" + "@docusaurus/types" "3.4.0" + "@docusaurus/utils" "3.4.0" + "@docusaurus/utils-common" "3.4.0" + "@docusaurus/utils-validation" "3.4.0" + fs-extra "^11.1.1" sitemap "^7.1.1" - tslib "^2.4.0" + tslib "^2.6.0" -"@docusaurus/preset-classic@2.2.0": - version "2.2.0" - resolved "https://registry.npmjs.org/@docusaurus/preset-classic/-/preset-classic-2.2.0.tgz" - integrity sha512-yKIWPGNx7BT8v2wjFIWvYrS+nvN04W+UameSFf8lEiJk6pss0kL6SG2MRvyULiI3BDxH+tj6qe02ncpSPGwumg== +"@docusaurus/preset-classic@3.4.0": + version "3.4.0" + resolved "https://registry.yarnpkg.com/@docusaurus/preset-classic/-/preset-classic-3.4.0.tgz#6082a32fbb465b0cb2c2a50ebfc277cff2c0f139" + integrity sha512-Ohj6KB7siKqZaQhNJVMBBUzT3Nnp6eTKqO+FXO3qu/n1hJl3YLwVKTWBg28LF7MWrKu46UuYavwMRxud0VyqHg== dependencies: - "@docusaurus/core" "2.2.0" - "@docusaurus/plugin-content-blog" "2.2.0" - "@docusaurus/plugin-content-docs" "2.2.0" - "@docusaurus/plugin-content-pages" "2.2.0" - "@docusaurus/plugin-debug" "2.2.0" - "@docusaurus/plugin-google-analytics" "2.2.0" - "@docusaurus/plugin-google-gtag" "2.2.0" - "@docusaurus/plugin-sitemap" "2.2.0" - "@docusaurus/theme-classic" "2.2.0" - "@docusaurus/theme-common" "2.2.0" - "@docusaurus/theme-search-algolia" "2.2.0" - "@docusaurus/types" "2.2.0" + "@docusaurus/core" "3.4.0" + "@docusaurus/plugin-content-blog" "3.4.0" + "@docusaurus/plugin-content-docs" "3.4.0" + "@docusaurus/plugin-content-pages" "3.4.0" + "@docusaurus/plugin-debug" "3.4.0" + "@docusaurus/plugin-google-analytics" "3.4.0" + "@docusaurus/plugin-google-gtag" "3.4.0" + "@docusaurus/plugin-google-tag-manager" "3.4.0" + "@docusaurus/plugin-sitemap" "3.4.0" + "@docusaurus/theme-classic" "3.4.0" + "@docusaurus/theme-common" "3.4.0" + "@docusaurus/theme-search-algolia" "3.4.0" + "@docusaurus/types" "3.4.0" -"@docusaurus/react-loadable@5.5.2": - version "5.5.2" - resolved "https://registry.npmjs.org/@docusaurus/react-loadable/-/react-loadable-5.5.2.tgz" - integrity sha512-A3dYjdBGuy0IGT+wyLIGIKLRE+sAk1iNk0f1HjNDysO7u8lhL4N3VEm+FAubmJbAztn94F7MxBTPmnixbiyFdQ== +"@docusaurus/theme-classic@3.4.0": + version "3.4.0" + resolved "https://registry.yarnpkg.com/@docusaurus/theme-classic/-/theme-classic-3.4.0.tgz#1b0f48edec3e3ec8927843554b9f11e5927b0e52" + integrity sha512-0IPtmxsBYv2adr1GnZRdMkEQt1YW6tpzrUPj02YxNpvJ5+ju4E13J5tB4nfdaen/tfR1hmpSPlTFPvTf4kwy8Q== dependencies: - "@types/react" "*" - prop-types "^15.6.2" - -"@docusaurus/theme-classic@2.2.0": - version "2.2.0" - resolved "https://registry.npmjs.org/@docusaurus/theme-classic/-/theme-classic-2.2.0.tgz" - integrity sha512-kjbg/qJPwZ6H1CU/i9d4l/LcFgnuzeiGgMQlt6yPqKo0SOJIBMPuz7Rnu3r/WWbZFPi//o8acclacOzmXdUUEg== - dependencies: - "@docusaurus/core" "2.2.0" - "@docusaurus/mdx-loader" "2.2.0" - "@docusaurus/module-type-aliases" "2.2.0" - "@docusaurus/plugin-content-blog" "2.2.0" - "@docusaurus/plugin-content-docs" "2.2.0" - "@docusaurus/plugin-content-pages" "2.2.0" - "@docusaurus/theme-common" "2.2.0" - "@docusaurus/theme-translations" "2.2.0" - "@docusaurus/types" "2.2.0" - "@docusaurus/utils" "2.2.0" - "@docusaurus/utils-common" "2.2.0" - "@docusaurus/utils-validation" "2.2.0" - "@mdx-js/react" "^1.6.22" - clsx "^1.2.1" - copy-text-to-clipboard "^3.0.1" - infima "0.2.0-alpha.42" + "@docusaurus/core" "3.4.0" + "@docusaurus/mdx-loader" "3.4.0" + "@docusaurus/module-type-aliases" "3.4.0" + "@docusaurus/plugin-content-blog" "3.4.0" + "@docusaurus/plugin-content-docs" "3.4.0" + "@docusaurus/plugin-content-pages" "3.4.0" + "@docusaurus/theme-common" "3.4.0" + "@docusaurus/theme-translations" "3.4.0" + "@docusaurus/types" "3.4.0" + "@docusaurus/utils" "3.4.0" + "@docusaurus/utils-common" "3.4.0" + "@docusaurus/utils-validation" "3.4.0" + "@mdx-js/react" "^3.0.0" + clsx "^2.0.0" + copy-text-to-clipboard "^3.2.0" + infima "0.2.0-alpha.43" lodash "^4.17.21" nprogress "^0.2.0" - postcss "^8.4.14" - prism-react-renderer "^1.3.5" - prismjs "^1.28.0" - react-router-dom "^5.3.3" - rtlcss "^3.5.0" - tslib "^2.4.0" + postcss "^8.4.26" + prism-react-renderer "^2.3.0" + prismjs "^1.29.0" + react-router-dom "^5.3.4" + rtlcss "^4.1.0" + tslib "^2.6.0" utility-types "^3.10.0" -"@docusaurus/theme-common@2.2.0", "@docusaurus/theme-common@>=2.0.1 <2.3.0": - version "2.2.0" - resolved "https://registry.npmjs.org/@docusaurus/theme-common/-/theme-common-2.2.0.tgz" - integrity sha512-R8BnDjYoN90DCL75gP7qYQfSjyitXuP9TdzgsKDmSFPNyrdE3twtPNa2dIN+h+p/pr+PagfxwWbd6dn722A1Dw== +"@docusaurus/theme-common@3.4.0", "@docusaurus/theme-common@^3.0.1": + version "3.4.0" + resolved "https://registry.yarnpkg.com/@docusaurus/theme-common/-/theme-common-3.4.0.tgz#01f2b728de6cb57f6443f52fc30675cf12a5d49f" + integrity sha512-0A27alXuv7ZdCg28oPE8nH/Iz73/IUejVaCazqu9elS4ypjiLhK3KfzdSQBnL/g7YfHSlymZKdiOHEo8fJ0qMA== dependencies: - "@docusaurus/mdx-loader" "2.2.0" - "@docusaurus/module-type-aliases" "2.2.0" - "@docusaurus/plugin-content-blog" "2.2.0" - "@docusaurus/plugin-content-docs" "2.2.0" - "@docusaurus/plugin-content-pages" "2.2.0" - "@docusaurus/utils" "2.2.0" + "@docusaurus/mdx-loader" "3.4.0" + "@docusaurus/module-type-aliases" "3.4.0" + "@docusaurus/plugin-content-blog" "3.4.0" + "@docusaurus/plugin-content-docs" "3.4.0" + "@docusaurus/plugin-content-pages" "3.4.0" + "@docusaurus/utils" "3.4.0" + "@docusaurus/utils-common" "3.4.0" "@types/history" "^4.7.11" "@types/react" "*" "@types/react-router-config" "*" - clsx "^1.2.1" + clsx "^2.0.0" parse-numeric-range "^1.3.0" - prism-react-renderer "^1.3.5" - tslib "^2.4.0" + prism-react-renderer "^2.3.0" + tslib "^2.6.0" utility-types "^3.10.0" -"@docusaurus/theme-search-algolia@2.2.0": - version "2.2.0" - resolved "https://registry.npmjs.org/@docusaurus/theme-search-algolia/-/theme-search-algolia-2.2.0.tgz" - integrity sha512-2h38B0tqlxgR2FZ9LpAkGrpDWVdXZ7vltfmTdX+4RsDs3A7khiNsmZB+x/x6sA4+G2V2CvrsPMlsYBy5X+cY1w== +"@docusaurus/theme-mermaid@3.4.0": + version "3.4.0" + resolved "https://registry.yarnpkg.com/@docusaurus/theme-mermaid/-/theme-mermaid-3.4.0.tgz#ef1d2231d0858767f67538b4fafd7d0ce2a3e845" + integrity sha512-3w5QW0HEZ2O6x2w6lU3ZvOe1gNXP2HIoKDMJBil1VmLBc9PmpAG17VmfhI/p3L2etNmOiVs5GgniUqvn8AFEGQ== dependencies: - "@docsearch/react" "^3.1.1" - "@docusaurus/core" "2.2.0" - "@docusaurus/logger" "2.2.0" - "@docusaurus/plugin-content-docs" "2.2.0" - "@docusaurus/theme-common" "2.2.0" - "@docusaurus/theme-translations" "2.2.0" - "@docusaurus/utils" "2.2.0" - "@docusaurus/utils-validation" "2.2.0" - algoliasearch "^4.13.1" - algoliasearch-helper "^3.10.0" - clsx "^1.2.1" - eta "^1.12.3" - fs-extra "^10.1.0" + "@docusaurus/core" "3.4.0" + "@docusaurus/module-type-aliases" "3.4.0" + "@docusaurus/theme-common" "3.4.0" + "@docusaurus/types" "3.4.0" + "@docusaurus/utils-validation" "3.4.0" + mermaid "^10.4.0" + tslib "^2.6.0" + +"@docusaurus/theme-search-algolia@3.4.0": + version "3.4.0" + resolved "https://registry.yarnpkg.com/@docusaurus/theme-search-algolia/-/theme-search-algolia-3.4.0.tgz#c499bad71d668df0d0f15b0e5e33e2fc4e330fcc" + integrity sha512-aiHFx7OCw4Wck1z6IoShVdUWIjntC8FHCw9c5dR8r3q4Ynh+zkS8y2eFFunN/DL6RXPzpnvKCg3vhLQYJDmT9Q== + dependencies: + "@docsearch/react" "^3.5.2" + "@docusaurus/core" "3.4.0" + "@docusaurus/logger" "3.4.0" + "@docusaurus/plugin-content-docs" "3.4.0" + "@docusaurus/theme-common" "3.4.0" + "@docusaurus/theme-translations" "3.4.0" + "@docusaurus/utils" "3.4.0" + "@docusaurus/utils-validation" "3.4.0" + algoliasearch "^4.18.0" + algoliasearch-helper "^3.13.3" + clsx "^2.0.0" + eta "^2.2.0" + fs-extra "^11.1.1" lodash "^4.17.21" - tslib "^2.4.0" + tslib "^2.6.0" utility-types "^3.10.0" -"@docusaurus/theme-translations@2.2.0": - version "2.2.0" - resolved "https://registry.npmjs.org/@docusaurus/theme-translations/-/theme-translations-2.2.0.tgz" - integrity sha512-3T140AG11OjJrtKlY4pMZ5BzbGRDjNs2co5hJ6uYJG1bVWlhcaFGqkaZ5lCgKflaNHD7UHBHU9Ec5f69jTdd6w== +"@docusaurus/theme-translations@3.4.0": + version "3.4.0" + resolved "https://registry.yarnpkg.com/@docusaurus/theme-translations/-/theme-translations-3.4.0.tgz#e6355d01352886c67e38e848b2542582ea3070af" + integrity sha512-zSxCSpmQCCdQU5Q4CnX/ID8CSUUI3fvmq4hU/GNP/XoAWtXo9SAVnM3TzpU8Gb//H3WCsT8mJcTfyOk3d9ftNg== dependencies: - fs-extra "^10.1.0" - tslib "^2.4.0" + fs-extra "^11.1.1" + tslib "^2.6.0" -"@docusaurus/types@2.2.0": - version "2.2.0" - resolved "https://registry.npmjs.org/@docusaurus/types/-/types-2.2.0.tgz" - integrity sha512-b6xxyoexfbRNRI8gjblzVOnLr4peCJhGbYGPpJ3LFqpi5nsFfoK4mmDLvWdeah0B7gmJeXabN7nQkFoqeSdmOw== +"@docusaurus/types@3.4.0": + version "3.4.0" + resolved "https://registry.yarnpkg.com/@docusaurus/types/-/types-3.4.0.tgz#237c3f737e9db3f7c1a5935a3ef48d6eadde8292" + integrity sha512-4jcDO8kXi5Cf9TcyikB/yKmz14f2RZ2qTRerbHAsS+5InE9ZgSLBNLsewtFTcTOXSVcbU3FoGOzcNWAmU1TR0A== dependencies: + "@mdx-js/mdx" "^3.0.0" "@types/history" "^4.7.11" "@types/react" "*" commander "^5.1.0" - joi "^17.6.0" + joi "^17.9.2" react-helmet-async "^1.3.0" utility-types "^3.10.0" - webpack "^5.73.0" - webpack-merge "^5.8.0" + webpack "^5.88.1" + webpack-merge "^5.9.0" -"@docusaurus/utils-common@2.2.0": - version "2.2.0" - resolved "https://registry.npmjs.org/@docusaurus/utils-common/-/utils-common-2.2.0.tgz" - integrity sha512-qebnerHp+cyovdUseDQyYFvMW1n1nv61zGe5JJfoNQUnjKuApch3IVsz+/lZ9a38pId8kqehC1Ao2bW/s0ntDA== +"@docusaurus/utils-common@3.4.0": + version "3.4.0" + resolved "https://registry.yarnpkg.com/@docusaurus/utils-common/-/utils-common-3.4.0.tgz#2a43fefd35b85ab9fcc6833187e66c15f8bfbbc6" + integrity sha512-NVx54Wr4rCEKsjOH5QEVvxIqVvm+9kh7q8aYTU5WzUU9/Hctd6aTrcZ3G0Id4zYJ+AeaG5K5qHA4CY5Kcm2iyQ== dependencies: - tslib "^2.4.0" + tslib "^2.6.0" -"@docusaurus/utils-validation@2.2.0", "@docusaurus/utils-validation@>=2.0.1 <2.3.0": - version "2.2.0" - resolved "https://registry.npmjs.org/@docusaurus/utils-validation/-/utils-validation-2.2.0.tgz" - integrity sha512-I1hcsG3yoCkasOL5qQAYAfnmVoLei7apugT6m4crQjmDGxq+UkiRrq55UqmDDyZlac/6ax/JC0p+usZ6W4nVyg== +"@docusaurus/utils-validation@3.4.0", "@docusaurus/utils-validation@^3.0.1": + version "3.4.0" + resolved "https://registry.yarnpkg.com/@docusaurus/utils-validation/-/utils-validation-3.4.0.tgz#0176f6e503ff45f4390ec2ecb69550f55e0b5eb7" + integrity sha512-hYQ9fM+AXYVTWxJOT1EuNaRnrR2WGpRdLDQG07O8UOpsvCPWUVOeo26Rbm0JWY2sGLfzAb+tvJ62yF+8F+TV0g== dependencies: - "@docusaurus/logger" "2.2.0" - "@docusaurus/utils" "2.2.0" - joi "^17.6.0" + "@docusaurus/logger" "3.4.0" + "@docusaurus/utils" "3.4.0" + "@docusaurus/utils-common" "3.4.0" + fs-extra "^11.2.0" + joi "^17.9.2" js-yaml "^4.1.0" - tslib "^2.4.0" + lodash "^4.17.21" + tslib "^2.6.0" -"@docusaurus/utils@2.2.0", "@docusaurus/utils@>=2.0.1 <2.3.0": - version "2.2.0" - resolved "https://registry.npmjs.org/@docusaurus/utils/-/utils-2.2.0.tgz" - integrity sha512-oNk3cjvx7Tt1Lgh/aeZAmFpGV2pDr5nHKrBVx6hTkzGhrnMuQqLt6UPlQjdYQ3QHXwyF/ZtZMO1D5Pfi0lu7SA== +"@docusaurus/utils@3.4.0", "@docusaurus/utils@^3.0.1": + version "3.4.0" + resolved "https://registry.yarnpkg.com/@docusaurus/utils/-/utils-3.4.0.tgz#c508e20627b7a55e2b541e4a28c95e0637d6a204" + integrity sha512-fRwnu3L3nnWaXOgs88BVBmG1yGjcQqZNHG+vInhEa2Sz2oQB+ZjbEMO5Rh9ePFpZ0YDiDUhpaVjwmS+AU2F14g== dependencies: - "@docusaurus/logger" "2.2.0" - "@svgr/webpack" "^6.2.1" + "@docusaurus/logger" "3.4.0" + "@docusaurus/utils-common" "3.4.0" + "@svgr/webpack" "^8.1.0" + escape-string-regexp "^4.0.0" file-loader "^6.2.0" - fs-extra "^10.1.0" - github-slugger "^1.4.0" + fs-extra "^11.1.1" + github-slugger "^1.5.0" globby "^11.1.0" gray-matter "^4.0.3" + jiti "^1.20.0" js-yaml "^4.1.0" lodash "^4.17.21" micromatch "^4.0.5" + prompts "^2.4.2" resolve-pathname "^3.0.0" shelljs "^0.8.5" - tslib "^2.4.0" + tslib "^2.6.0" url-loader "^4.1.1" - webpack "^5.73.0" + utility-types "^3.10.0" + webpack "^5.88.1" "@exodus/schemasafe@^1.0.0-rc.2": - version "1.0.0" - resolved "https://registry.npmjs.org/@exodus/schemasafe/-/schemasafe-1.0.0.tgz" - integrity sha512-2cyupPIZI69HQxEAPllLXBjQp4njDKkOjYRCYxvMZe3/LY9pp9fBM3Tb1wiFAdP6Emo4v3OEbCLGj6u73Q5KLw== + version "1.3.0" + resolved "https://registry.yarnpkg.com/@exodus/schemasafe/-/schemasafe-1.3.0.tgz#731656abe21e8e769a7f70a4d833e6312fe59b7f" + integrity sha512-5Aap/GaRupgNx/feGBwLLTVv8OQFfv3pq2lPRzPg9R+IOBnDgghTGW7l7EuVXOvg5cc/xSAlRW8rBrjIC3Nvqw== -"@hapi/hoek@^9.0.0": +"@hapi/hoek@^9.0.0", "@hapi/hoek@^9.3.0": version "9.3.0" - resolved "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz" + resolved "https://registry.yarnpkg.com/@hapi/hoek/-/hoek-9.3.0.tgz#8368869dcb735be2e7f5cb7647de78e167a251fb" integrity sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ== -"@hapi/topo@^5.0.0": +"@hapi/topo@^5.1.0": version "5.1.0" - resolved "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz" + resolved "https://registry.yarnpkg.com/@hapi/topo/-/topo-5.1.0.tgz#dc448e332c6c6e37a4dc02fd84ba8d44b9afb012" integrity sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg== dependencies: "@hapi/hoek" "^9.0.0" "@headlessui/react@^1.7.4": - version "1.7.13" - resolved "https://registry.npmjs.org/@headlessui/react/-/react-1.7.13.tgz" - integrity sha512-9n+EQKRtD9266xIHXdY5MfiXPDfYwl7zBM7KOx2Ae3Gdgxy8QML1FkCMjq6AsOf0l6N9uvI4HcFtuFlenaldKg== + version "1.7.19" + resolved "https://registry.yarnpkg.com/@headlessui/react/-/react-1.7.19.tgz#91c78cf5fcb254f4a0ebe96936d48421caf75f40" + integrity sha512-Ll+8q3OlMJfJbAKM/+/Y2q6PPYbryqNTXDbryx7SXLIDamkF6iQFbriYHga0dY44PvDhvvBWCx1Xj4U5+G4hOw== dependencies: + "@tanstack/react-virtual" "^3.0.0-beta.60" client-only "^0.0.1" "@heroicons/react@^2.0.13": - version "2.0.17" - resolved "https://registry.npmjs.org/@heroicons/react/-/react-2.0.17.tgz" - integrity sha512-90GMZktkA53YbNzHp6asVEDevUQCMtxWH+2UK2S8OpnLEu7qckTJPhNxNQG52xIR1WFTwFqtH6bt7a60ZNcLLA== + version "2.1.3" + resolved "https://registry.yarnpkg.com/@heroicons/react/-/react-2.1.3.tgz#78a2a7f504a7370283d07eabcddc7fec04f503db" + integrity sha512-fEcPfo4oN345SoqdlCDdSa4ivjaKbk0jTd+oubcgNxnNgAfzysfwWfQUr+51wigiWHQQRiZNd1Ao0M5Y3M2EGg== -"@jest/schemas@^29.0.0": - version "29.0.0" - resolved "https://registry.npmjs.org/@jest/schemas/-/schemas-29.0.0.tgz" - integrity sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA== - dependencies: - "@sinclair/typebox" "^0.24.1" +"@hookform/error-message@^2.0.1": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@hookform/error-message/-/error-message-2.0.1.tgz#6a37419106e13664ad6a29c9dae699ae6cd276b8" + integrity sha512-U410sAr92xgxT1idlu9WWOVjndxLdgPUHEB8Schr27C9eh7/xUnITWpCMF93s+lGiG++D4JnbSnrb5A21AdSNg== -"@jest/types@^29.2.1": - version "29.2.1" - resolved "https://registry.npmjs.org/@jest/types/-/types-29.2.1.tgz" - integrity sha512-O/QNDQODLnINEPAI0cl9U6zUIDXEWXt6IC1o2N2QENuos7hlGUIthlKyV4p6ki3TvXFX071blj8HUhgLGquPjw== +"@isaacs/cliui@^8.0.2": + version "8.0.2" + resolved "https://registry.yarnpkg.com/@isaacs/cliui/-/cliui-8.0.2.tgz#b37667b7bc181c168782259bab42474fbf52b550" + integrity sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA== dependencies: - "@jest/schemas" "^29.0.0" + string-width "^5.1.2" + string-width-cjs "npm:string-width@^4.2.0" + strip-ansi "^7.0.1" + strip-ansi-cjs "npm:strip-ansi@^6.0.1" + wrap-ansi "^8.1.0" + wrap-ansi-cjs "npm:wrap-ansi@^7.0.0" + +"@jest/schemas@^29.6.3": + version "29.6.3" + resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-29.6.3.tgz#430b5ce8a4e0044a7e3819663305a7b3091c8e03" + integrity sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA== + dependencies: + "@sinclair/typebox" "^0.27.8" + +"@jest/types@^29.6.3": + version "29.6.3" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-29.6.3.tgz#1131f8cf634e7e84c5e77bab12f052af585fba59" + integrity sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw== + dependencies: + "@jest/schemas" "^29.6.3" "@types/istanbul-lib-coverage" "^2.0.0" "@types/istanbul-reports" "^3.0.0" "@types/node" "*" "@types/yargs" "^17.0.8" chalk "^4.0.0" -"@jridgewell/gen-mapping@^0.1.0": - version "0.1.1" - resolved "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz" - integrity sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w== +"@jridgewell/gen-mapping@^0.3.2", "@jridgewell/gen-mapping@^0.3.5": + version "0.3.5" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz#dcce6aff74bdf6dad1a95802b69b04a2fcb1fb36" + integrity sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg== dependencies: - "@jridgewell/set-array" "^1.0.0" + "@jridgewell/set-array" "^1.2.1" "@jridgewell/sourcemap-codec" "^1.4.10" - -"@jridgewell/gen-mapping@^0.3.0": - version "0.3.3" - resolved "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz" - integrity sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ== - dependencies: - "@jridgewell/set-array" "^1.0.1" - "@jridgewell/sourcemap-codec" "^1.4.10" - "@jridgewell/trace-mapping" "^0.3.9" - -"@jridgewell/gen-mapping@^0.3.2": - version "0.3.2" - resolved "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz" - integrity sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A== - dependencies: - "@jridgewell/set-array" "^1.0.1" - "@jridgewell/sourcemap-codec" "^1.4.10" - "@jridgewell/trace-mapping" "^0.3.9" + "@jridgewell/trace-mapping" "^0.3.24" "@jridgewell/resolve-uri@^3.1.0": - version "3.1.1" - resolved "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz" - integrity sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA== + version "3.1.2" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" + integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== -"@jridgewell/set-array@^1.0.0", "@jridgewell/set-array@^1.0.1": - version "1.1.1" - resolved "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.1.tgz" - integrity sha512-Ct5MqZkLGEXTVmQYbGtx9SVqD2fqwvdubdps5D3djjAkgkKwT918VNOz65pEHFaYTeWcukmJmH5SwsA9Tn2ObQ== +"@jridgewell/set-array@^1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.2.1.tgz#558fb6472ed16a4c850b889530e6b36438c49280" + integrity sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A== "@jridgewell/source-map@^0.3.3": - version "0.3.5" - resolved "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz" - integrity sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ== + version "0.3.6" + resolved "https://registry.yarnpkg.com/@jridgewell/source-map/-/source-map-0.3.6.tgz#9d71ca886e32502eb9362c9a74a46787c36df81a" + integrity sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ== dependencies: - "@jridgewell/gen-mapping" "^0.3.0" - "@jridgewell/trace-mapping" "^0.3.9" + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.25" "@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14": - version "1.4.14" - resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz" - integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== + version "1.4.15" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" + integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== -"@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.9": - version "0.3.19" - resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz" - integrity sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw== +"@jridgewell/trace-mapping@^0.3.18", "@jridgewell/trace-mapping@^0.3.20", "@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25": + version "0.3.25" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz#15f190e98895f3fc23276ee14bc76b675c2e50f0" + integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ== dependencies: "@jridgewell/resolve-uri" "^3.1.0" "@jridgewell/sourcemap-codec" "^1.4.14" "@jsdevtools/ono@^7.1.3": version "7.1.3" - resolved "https://registry.npmjs.org/@jsdevtools/ono/-/ono-7.1.3.tgz" + resolved "https://registry.yarnpkg.com/@jsdevtools/ono/-/ono-7.1.3.tgz#9df03bbd7c696a5c58885c34aa06da41c8543796" integrity sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg== "@leichtgewicht/ip-codec@^2.0.1": - version "2.0.4" - resolved "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz" - integrity sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A== + version "2.0.5" + resolved "https://registry.yarnpkg.com/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz#4fc56c15c580b9adb7dc3c333a134e540b44bfb1" + integrity sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw== -"@mdx-js/mdx@^1.6.22": - version "1.6.22" - resolved "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-1.6.22.tgz" - integrity sha512-AMxuLxPz2j5/6TpF/XSdKpQP1NlG0z11dFOlq+2IP/lSgl11GY8ji6S/rgsViN/L0BDvHvUMruRb7ub+24LUYA== +"@mdx-js/mdx@^3.0.0": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@mdx-js/mdx/-/mdx-3.0.1.tgz#617bd2629ae561fdca1bb88e3badd947f5a82191" + integrity sha512-eIQ4QTrOWyL3LWEe/bu6Taqzq2HQvHcyTMaOrI95P2/LmJE7AsfPfgJGuFLPVqBUE1BC1rik3VIhU+s9u72arA== dependencies: - "@babel/core" "7.12.9" - "@babel/plugin-syntax-jsx" "7.12.1" - "@babel/plugin-syntax-object-rest-spread" "7.8.3" - "@mdx-js/util" "1.6.22" - babel-plugin-apply-mdx-type-prop "1.6.22" - babel-plugin-extract-import-names "1.6.22" - camelcase-css "2.0.1" - detab "2.0.4" - hast-util-raw "6.0.1" - lodash.uniq "4.5.0" - mdast-util-to-hast "10.0.1" - remark-footnotes "2.0.0" - remark-mdx "1.6.22" - remark-parse "8.0.3" - remark-squeeze-paragraphs "4.0.0" - style-to-object "0.3.0" - unified "9.2.0" - unist-builder "2.0.3" - unist-util-visit "2.0.3" + "@types/estree" "^1.0.0" + "@types/estree-jsx" "^1.0.0" + "@types/hast" "^3.0.0" + "@types/mdx" "^2.0.0" + collapse-white-space "^2.0.0" + devlop "^1.0.0" + estree-util-build-jsx "^3.0.0" + estree-util-is-identifier-name "^3.0.0" + estree-util-to-js "^2.0.0" + estree-walker "^3.0.0" + hast-util-to-estree "^3.0.0" + hast-util-to-jsx-runtime "^2.0.0" + markdown-extensions "^2.0.0" + periscopic "^3.0.0" + remark-mdx "^3.0.0" + remark-parse "^11.0.0" + remark-rehype "^11.0.0" + source-map "^0.7.0" + unified "^11.0.0" + unist-util-position-from-estree "^2.0.0" + unist-util-stringify-position "^4.0.0" + unist-util-visit "^5.0.0" + vfile "^6.0.0" -"@mdx-js/react@^1.6.21", "@mdx-js/react@^1.6.22": - version "1.6.22" - resolved "https://registry.npmjs.org/@mdx-js/react/-/react-1.6.22.tgz" - integrity sha512-TDoPum4SHdfPiGSAaRBw7ECyI8VaHpK8GJugbJIJuqyh6kzw9ZLJZW3HGL3NNrJGxcAixUvqROm+YuQOo5eXtg== - -"@mdx-js/util@1.6.22": - version "1.6.22" - resolved "https://registry.npmjs.org/@mdx-js/util/-/util-1.6.22.tgz" - integrity sha512-H1rQc1ZOHANWBvPcW+JpGwr+juXSxM8Q8YCkm3GhZd8REu1fHR3z99CErO1p9pkcfcxZnMdIZdIsXkOHY0NilA== +"@mdx-js/react@^3.0.0": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@mdx-js/react/-/react-3.0.1.tgz#997a19b3a5b783d936c75ae7c47cfe62f967f746" + integrity sha512-9ZrPIU4MGf6et1m1ov3zKf+q9+deetI51zprKB1D/z3NOb+rUxxtEl3mCjW5wTGh6VhRdwPueh1oRzi6ezkA8A== + dependencies: + "@types/mdx" "^2.0.0" "@nodelib/fs.scandir@2.1.5": version "2.1.5" - resolved "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz" + resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== dependencies: "@nodelib/fs.stat" "2.0.5" @@ -2447,12 +1894,12 @@ "@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": version "2.0.5" - resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== "@nodelib/fs.walk@^1.2.3": version "1.2.8" - resolved "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz" + resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== dependencies: "@nodelib/fs.scandir" "2.1.5" @@ -2460,7 +1907,7 @@ "@paloaltonetworks/openapi-to-postmanv2@3.1.0-hotfix.1": version "3.1.0-hotfix.1" - resolved "https://registry.npmjs.org/@paloaltonetworks/openapi-to-postmanv2/-/openapi-to-postmanv2-3.1.0-hotfix.1.tgz" + resolved "https://registry.yarnpkg.com/@paloaltonetworks/openapi-to-postmanv2/-/openapi-to-postmanv2-3.1.0-hotfix.1.tgz#4baf401d2e94ba86d888e6011a4c45d824e88114" integrity sha512-0bdaPCEyQbnUo4xpOu7EzxXXkDx4BAXqc8QSbVBlzlVB5KoTLJiKKB4c3fa4BXbK+3u/OqfLbeNCebc2EC8ngA== dependencies: "@paloaltonetworks/postman-collection" "^4.1.0" @@ -2477,7 +1924,7 @@ "@paloaltonetworks/postman-code-generators@1.1.15-patch.2": version "1.1.15-patch.2" - resolved "https://registry.npmjs.org/@paloaltonetworks/postman-code-generators/-/postman-code-generators-1.1.15-patch.2.tgz" + resolved "https://registry.yarnpkg.com/@paloaltonetworks/postman-code-generators/-/postman-code-generators-1.1.15-patch.2.tgz#012051485269a2da6bd9a6b60031ddbc53e5e363" integrity sha512-tRnAKtV4M8wLxcVnAx6ZCjCqbrR1xiqJNQkf1A71K8UxEP3N/+EspT82N5c0555w02oYFk21ViHuzuhm4gaGLw== dependencies: "@paloaltonetworks/postman-collection" "^4.1.0" @@ -2487,7 +1934,7 @@ "@paloaltonetworks/postman-collection@^4.1.0": version "4.1.1" - resolved "https://registry.npmjs.org/@paloaltonetworks/postman-collection/-/postman-collection-4.1.1.tgz" + resolved "https://registry.yarnpkg.com/@paloaltonetworks/postman-collection/-/postman-collection-4.1.1.tgz#b2130bc8d7396ea8e6a6b2e4642a6b224b41e1e1" integrity sha512-9JHHkkD8Xb4rvdKob7TDPRfqfmdG3KU0aO5gJyyjvMFbOVysam5I0d8/9HPOuJXWkUHGo3Sn+ov2Fcm2bnJ52Q== dependencies: file-type "3.9.0" @@ -2501,14 +1948,40 @@ semver "7.3.5" uuid "8.3.2" -"@polka/url@^1.0.0-next.20": - version "1.0.0-next.21" - resolved "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.21.tgz" - integrity sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g== +"@pkgjs/parseargs@^0.11.0": + version "0.11.0" + resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" + integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== + +"@pnpm/config.env-replace@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@pnpm/config.env-replace/-/config.env-replace-1.1.0.tgz#ab29da53df41e8948a00f2433f085f54de8b3a4c" + integrity sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w== + +"@pnpm/network.ca-file@^1.0.1": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@pnpm/network.ca-file/-/network.ca-file-1.0.2.tgz#2ab05e09c1af0cdf2fcf5035bea1484e222f7983" + integrity sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA== + dependencies: + graceful-fs "4.2.10" + +"@pnpm/npm-conf@^2.1.0": + version "2.2.2" + resolved "https://registry.yarnpkg.com/@pnpm/npm-conf/-/npm-conf-2.2.2.tgz#0058baf1c26cbb63a828f0193795401684ac86f0" + integrity sha512-UA91GwWPhFExt3IizW6bOeY/pQ0BkuNwKjk9iQW9KqxluGCrg4VenZ0/L+2Y0+ZOtme72EVvg6v0zo3AMQRCeA== + dependencies: + "@pnpm/config.env-replace" "^1.1.0" + "@pnpm/network.ca-file" "^1.0.1" + config-chain "^1.1.11" + +"@polka/url@^1.0.0-next.24": + version "1.0.0-next.25" + resolved "https://registry.yarnpkg.com/@polka/url/-/url-1.0.0-next.25.tgz#f077fdc0b5d0078d30893396ff4827a13f99e817" + integrity sha512-j7P6Rgr3mmtdkeDGTe0E/aYyWEWVtc5yFXtHCRHs28/jptDEWfaVOc5T7cblqy1XKPPfCxJc/8DwQ5YgLOZOVQ== "@redocly/ajv@^8.11.0": version "8.11.0" - resolved "https://registry.npmjs.org/@redocly/ajv/-/ajv-8.11.0.tgz" + resolved "https://registry.yarnpkg.com/@redocly/ajv/-/ajv-8.11.0.tgz#2fad322888dc0113af026e08fceb3e71aae495ae" integrity sha512-9GWx27t7xWhDIR02PA18nzBdLcKQRgc46xNQvjFkrYk4UOmvKhJ/dawwiX0cCOeetN5LcaaiqQbVOWYK62SGHw== dependencies: fast-deep-equal "^3.1.1" @@ -2516,13 +1989,18 @@ require-from-string "^2.0.2" uri-js "^4.2.2" -"@redocly/openapi-core@^1.0.0-beta.125": - version "1.0.2" - resolved "https://registry.npmjs.org/@redocly/openapi-core/-/openapi-core-1.0.2.tgz" - integrity sha512-53dzhmG2bsi/8rcAAgBKk9ZLMR035VHgN7oSM3+BM4UAIoNBg6lMC/ChHSf9zO+GrX5qtuWVPqHhjjMti3SAlQ== +"@redocly/config@^0.6.0": + version "0.6.0" + resolved "https://registry.yarnpkg.com/@redocly/config/-/config-0.6.0.tgz#dbee2d5b181791b16b847565657f85092ff4c975" + integrity sha512-hNVN3eTxFj2nHYX0gGzZxxXwdE0DXWeWou1TIK3HYf0S9VKVxTxjO9EZbMB7iVUqaHkeqy4PSjlBQcEgD0Ftjg== + +"@redocly/openapi-core@^1.10.5": + version "1.15.0" + resolved "https://registry.yarnpkg.com/@redocly/openapi-core/-/openapi-core-1.15.0.tgz#dfe02cb65960d7d43935f2e55731f215d9fa741a" + integrity sha512-ac+3nn9y/dE+cgIVgIdq7eIisjZlBEJptLsCbOVLIsR2jb+O1SznXeyqy2MkTHMSs6zM/KHP4bMQy0DGmi7K0Q== dependencies: "@redocly/ajv" "^8.11.0" - "@types/node" "^14.11.8" + "@redocly/config" "^0.6.0" colorette "^1.2.0" js-levenshtein "^1.1.6" js-yaml "^4.1.0" @@ -2533,302 +2011,365 @@ yaml-ast-parser "0.0.43" "@reduxjs/toolkit@^1.7.1": - version "1.9.3" - resolved "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-1.9.3.tgz" - integrity sha512-GU2TNBQVofL09VGmuSioNPQIu6Ml0YLf4EJhgj0AvBadRlCGzUWet8372LjvO4fqKZF2vH1xU0htAa7BrK9pZg== + version "1.9.7" + resolved "https://registry.yarnpkg.com/@reduxjs/toolkit/-/toolkit-1.9.7.tgz#7fc07c0b0ebec52043f8cb43510cf346405f78a6" + integrity sha512-t7v8ZPxhhKgOKtU+uyJT13lu4vL7az5aFi4IdoDs/eS548edn2M8Ik9h8fxgvMjGoAUVFSt6ZC1P5cWmQ014QQ== dependencies: - immer "^9.0.16" - redux "^4.2.0" + immer "^9.0.21" + redux "^4.2.1" redux-thunk "^2.4.2" - reselect "^4.1.7" + reselect "^4.1.8" "@saucelabs/theme-github-codeblock@^0.2.3": version "0.2.3" - resolved "https://registry.npmjs.org/@saucelabs/theme-github-codeblock/-/theme-github-codeblock-0.2.3.tgz" + resolved "https://registry.yarnpkg.com/@saucelabs/theme-github-codeblock/-/theme-github-codeblock-0.2.3.tgz#706a43292f600532271979941b0155db667c2c21" integrity sha512-GSl3Lr/jOWm4OP3BPX2vXxc8FMSOXj1mJnls6cUqMwlGOfKQ1Ia9pq1O9/ES+5TrZHIzAws/n5FFSn1OkGJw/Q== -"@sideway/address@^4.1.3": - version "4.1.4" - resolved "https://registry.npmjs.org/@sideway/address/-/address-4.1.4.tgz" - integrity sha512-7vwq+rOHVWjyXxVlR76Agnvhy8I9rpzjosTESvmhNeXOXdZZB15Fl+TI9x1SiHZH5Jv2wTGduSxFDIaq0m3DUw== +"@sideway/address@^4.1.5": + version "4.1.5" + resolved "https://registry.yarnpkg.com/@sideway/address/-/address-4.1.5.tgz#4bc149a0076623ced99ca8208ba780d65a99b9d5" + integrity sha512-IqO/DUQHUkPeixNQ8n0JA6102hT9CmaljNTPmQ1u8MEhBo/R4Q8eKLN/vGZxuebwOroDB4cbpjheD4+/sKFK4Q== dependencies: "@hapi/hoek" "^9.0.0" -"@sideway/formula@^3.0.0": +"@sideway/formula@^3.0.1": version "3.0.1" - resolved "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.1.tgz" + resolved "https://registry.yarnpkg.com/@sideway/formula/-/formula-3.0.1.tgz#80fcbcbaf7ce031e0ef2dd29b1bfc7c3f583611f" integrity sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg== "@sideway/pinpoint@^2.0.0": version "2.0.0" - resolved "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz" + resolved "https://registry.yarnpkg.com/@sideway/pinpoint/-/pinpoint-2.0.0.tgz#cff8ffadc372ad29fd3f78277aeb29e632cc70df" integrity sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ== -"@sinclair/typebox@^0.24.1": - version "0.24.51" - resolved "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.24.51.tgz" - integrity sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA== +"@sinclair/typebox@^0.27.8": + version "0.27.8" + resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.27.8.tgz#6667fac16c436b5434a387a34dedb013198f6e6e" + integrity sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA== -"@sindresorhus/is@^0.14.0": - version "0.14.0" - resolved "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz" - integrity sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ== +"@sindresorhus/is@^4.6.0": + version "4.6.0" + resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-4.6.0.tgz#3c7c9c46e678feefe7a2e5bb609d3dbd665ffb3f" + integrity sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw== -"@slorber/static-site-generator-webpack-plugin@^4.0.7": - version "4.0.7" - resolved "https://registry.npmjs.org/@slorber/static-site-generator-webpack-plugin/-/static-site-generator-webpack-plugin-4.0.7.tgz" - integrity sha512-Ug7x6z5lwrz0WqdnNFOMYrDQNTPAprvHLSh6+/fmml3qUiz6l5eq+2MzLKWtn/q5K5NpSiFsZTP/fck/3vjSxA== +"@sindresorhus/is@^5.2.0": + version "5.6.0" + resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-5.6.0.tgz#41dd6093d34652cddb5d5bdeee04eafc33826668" + integrity sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g== + +"@slorber/remark-comment@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@slorber/remark-comment/-/remark-comment-1.0.0.tgz#2a020b3f4579c89dec0361673206c28d67e08f5a" + integrity sha512-RCE24n7jsOj1M0UPvIQCHTe7fI0sFL4S2nwKVWwHyVr/wI/H8GosgsJGyhnsZoGFnD/P2hLf1mSbrrgSLN93NA== dependencies: - eval "^0.1.8" - p-map "^4.0.0" - webpack-sources "^3.2.2" + micromark-factory-space "^1.0.0" + micromark-util-character "^1.1.0" + micromark-util-symbol "^1.0.1" -"@svgr/babel-plugin-add-jsx-attribute@^6.5.1": - version "6.5.1" - resolved "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-6.5.1.tgz" - integrity sha512-9PYGcXrAxitycIjRmZB+Q0JaN07GZIWaTBIGQzfaZv+qr1n8X1XUEJ5rZ/vx6OVD9RRYlrNnXWExQXcmZeD/BQ== - -"@svgr/babel-plugin-remove-jsx-attribute@*": +"@svgr/babel-plugin-add-jsx-attribute@8.0.0": version "8.0.0" - resolved "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-8.0.0.tgz" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-8.0.0.tgz#4001f5d5dd87fa13303e36ee106e3ff3a7eb8b22" + integrity sha512-b9MIk7yhdS1pMCZM8VeNfUlSKVRhsHZNMl5O9SfaX0l0t5wjdgu4IDzGB8bpnGBBOjGST3rRFVsaaEtI4W6f7g== + +"@svgr/babel-plugin-remove-jsx-attribute@8.0.0": + version "8.0.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-8.0.0.tgz#69177f7937233caca3a1afb051906698f2f59186" integrity sha512-BcCkm/STipKvbCl6b7QFrMh/vx00vIP63k2eM66MfHJzPr6O2U0jYEViXkHJWqXqQYjdeA9cuCl5KWmlwjDvbA== -"@svgr/babel-plugin-remove-jsx-empty-expression@*": +"@svgr/babel-plugin-remove-jsx-empty-expression@8.0.0": version "8.0.0" - resolved "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-8.0.0.tgz" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-8.0.0.tgz#c2c48104cfd7dcd557f373b70a56e9e3bdae1d44" integrity sha512-5BcGCBfBxB5+XSDSWnhTThfI9jcO5f0Ai2V24gZpG+wXF14BzwxxdDb4g6trdOux0rhibGs385BeFMSmxtS3uA== -"@svgr/babel-plugin-replace-jsx-attribute-value@^6.5.1": - version "6.5.1" - resolved "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-6.5.1.tgz" - integrity sha512-8DPaVVE3fd5JKuIC29dqyMB54sA6mfgki2H2+swh+zNJoynC8pMPzOkidqHOSc6Wj032fhl8Z0TVn1GiPpAiJg== +"@svgr/babel-plugin-replace-jsx-attribute-value@8.0.0": + version "8.0.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-8.0.0.tgz#8fbb6b2e91fa26ac5d4aa25c6b6e4f20f9c0ae27" + integrity sha512-KVQ+PtIjb1BuYT3ht8M5KbzWBhdAjjUPdlMtpuw/VjT8coTrItWX6Qafl9+ji831JaJcu6PJNKCV0bp01lBNzQ== -"@svgr/babel-plugin-svg-dynamic-title@^6.5.1": - version "6.5.1" - resolved "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-6.5.1.tgz" - integrity sha512-FwOEi0Il72iAzlkaHrlemVurgSQRDFbk0OC8dSvD5fSBPHltNh7JtLsxmZUhjYBZo2PpcU/RJvvi6Q0l7O7ogw== +"@svgr/babel-plugin-svg-dynamic-title@8.0.0": + version "8.0.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-8.0.0.tgz#1d5ba1d281363fc0f2f29a60d6d936f9bbc657b0" + integrity sha512-omNiKqwjNmOQJ2v6ge4SErBbkooV2aAWwaPFs2vUY7p7GhVkzRkJ00kILXQvRhA6miHnNpXv7MRnnSjdRjK8og== -"@svgr/babel-plugin-svg-em-dimensions@^6.5.1": - version "6.5.1" - resolved "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-6.5.1.tgz" - integrity sha512-gWGsiwjb4tw+ITOJ86ndY/DZZ6cuXMNE/SjcDRg+HLuCmwpcjOktwRF9WgAiycTqJD/QXqL2f8IzE2Rzh7aVXA== +"@svgr/babel-plugin-svg-em-dimensions@8.0.0": + version "8.0.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-8.0.0.tgz#35e08df300ea8b1d41cb8f62309c241b0369e501" + integrity sha512-mURHYnu6Iw3UBTbhGwE/vsngtCIbHE43xCRK7kCw4t01xyGqb2Pd+WXekRRoFOBIY29ZoOhUCTEweDMdrjfi9g== -"@svgr/babel-plugin-transform-react-native-svg@^6.5.1": - version "6.5.1" - resolved "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-6.5.1.tgz" - integrity sha512-2jT3nTayyYP7kI6aGutkyfJ7UMGtuguD72OjeGLwVNyfPRBD8zQthlvL+fAbAKk5n9ZNcvFkp/b1lZ7VsYqVJg== +"@svgr/babel-plugin-transform-react-native-svg@8.1.0": + version "8.1.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-8.1.0.tgz#90a8b63998b688b284f255c6a5248abd5b28d754" + integrity sha512-Tx8T58CHo+7nwJ+EhUwx3LfdNSG9R2OKfaIXXs5soiy5HtgoAEkDay9LIimLOcG8dJQH1wPZp/cnAv6S9CrR1Q== -"@svgr/babel-plugin-transform-svg-component@^6.5.1": - version "6.5.1" - resolved "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-6.5.1.tgz" - integrity sha512-a1p6LF5Jt33O3rZoVRBqdxL350oge54iZWHNI6LJB5tQ7EelvD/Mb1mfBiZNAan0dt4i3VArkFRjA4iObuNykQ== +"@svgr/babel-plugin-transform-svg-component@8.0.0": + version "8.0.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-8.0.0.tgz#013b4bfca88779711f0ed2739f3f7efcefcf4f7e" + integrity sha512-DFx8xa3cZXTdb/k3kfPeaixecQLgKh5NVBMwD0AQxOzcZawK4oo1Jh9LbrcACUivsCA7TLG8eeWgrDXjTMhRmw== -"@svgr/babel-preset@^6.5.1": - version "6.5.1" - resolved "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-6.5.1.tgz" - integrity sha512-6127fvO/FF2oi5EzSQOAjo1LE3OtNVh11R+/8FXa+mHx1ptAaS4cknIjnUA7e6j6fwGGJ17NzaTJFUwOV2zwCw== +"@svgr/babel-preset@8.1.0": + version "8.1.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-preset/-/babel-preset-8.1.0.tgz#0e87119aecdf1c424840b9d4565b7137cabf9ece" + integrity sha512-7EYDbHE7MxHpv4sxvnVPngw5fuR6pw79SkcrILHJ/iMpuKySNCl5W1qcwPEpU+LgyRXOaAFgH0KhwD18wwg6ug== dependencies: - "@svgr/babel-plugin-add-jsx-attribute" "^6.5.1" - "@svgr/babel-plugin-remove-jsx-attribute" "*" - "@svgr/babel-plugin-remove-jsx-empty-expression" "*" - "@svgr/babel-plugin-replace-jsx-attribute-value" "^6.5.1" - "@svgr/babel-plugin-svg-dynamic-title" "^6.5.1" - "@svgr/babel-plugin-svg-em-dimensions" "^6.5.1" - "@svgr/babel-plugin-transform-react-native-svg" "^6.5.1" - "@svgr/babel-plugin-transform-svg-component" "^6.5.1" + "@svgr/babel-plugin-add-jsx-attribute" "8.0.0" + "@svgr/babel-plugin-remove-jsx-attribute" "8.0.0" + "@svgr/babel-plugin-remove-jsx-empty-expression" "8.0.0" + "@svgr/babel-plugin-replace-jsx-attribute-value" "8.0.0" + "@svgr/babel-plugin-svg-dynamic-title" "8.0.0" + "@svgr/babel-plugin-svg-em-dimensions" "8.0.0" + "@svgr/babel-plugin-transform-react-native-svg" "8.1.0" + "@svgr/babel-plugin-transform-svg-component" "8.0.0" -"@svgr/core@^6.5.1": - version "6.5.1" - resolved "https://registry.npmjs.org/@svgr/core/-/core-6.5.1.tgz" - integrity sha512-/xdLSWxK5QkqG524ONSjvg3V/FkNyCv538OIBdQqPNaAta3AsXj/Bd2FbvR87yMbXO2hFSWiAe/Q6IkVPDw+mw== +"@svgr/core@8.1.0": + version "8.1.0" + resolved "https://registry.yarnpkg.com/@svgr/core/-/core-8.1.0.tgz#41146f9b40b1a10beaf5cc4f361a16a3c1885e88" + integrity sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA== dependencies: - "@babel/core" "^7.19.6" - "@svgr/babel-preset" "^6.5.1" - "@svgr/plugin-jsx" "^6.5.1" + "@babel/core" "^7.21.3" + "@svgr/babel-preset" "8.1.0" camelcase "^6.2.0" - cosmiconfig "^7.0.1" + cosmiconfig "^8.1.3" + snake-case "^3.0.4" -"@svgr/hast-util-to-babel-ast@^6.5.1": - version "6.5.1" - resolved "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-6.5.1.tgz" - integrity sha512-1hnUxxjd83EAxbL4a0JDJoD3Dao3hmjvyvyEV8PzWmLK3B9m9NPlW7GKjFyoWE8nM7HnXzPcmmSyOW8yOddSXw== +"@svgr/hast-util-to-babel-ast@8.0.0": + version "8.0.0" + resolved "https://registry.yarnpkg.com/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-8.0.0.tgz#6952fd9ce0f470e1aded293b792a2705faf4ffd4" + integrity sha512-EbDKwO9GpfWP4jN9sGdYwPBU0kdomaPIL2Eu4YwmgP+sJeXT+L7bMwJUBnhzfH8Q2qMBqZ4fJwpCyYsAN3mt2Q== dependencies: - "@babel/types" "^7.20.0" + "@babel/types" "^7.21.3" entities "^4.4.0" -"@svgr/plugin-jsx@^6.5.1": - version "6.5.1" - resolved "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-6.5.1.tgz" - integrity sha512-+UdQxI3jgtSjCykNSlEMuy1jSRQlGC7pqBCPvkG/2dATdWo082zHTTK3uhnAju2/6XpE6B5mZ3z4Z8Ns01S8Gw== +"@svgr/plugin-jsx@8.1.0": + version "8.1.0" + resolved "https://registry.yarnpkg.com/@svgr/plugin-jsx/-/plugin-jsx-8.1.0.tgz#96969f04a24b58b174ee4cd974c60475acbd6928" + integrity sha512-0xiIyBsLlr8quN+WyuxooNW9RJ0Dpr8uOnH/xrCVO8GLUcwHISwj1AG0k+LFzteTkAA0GbX0kj9q6Dk70PTiPA== dependencies: - "@babel/core" "^7.19.6" - "@svgr/babel-preset" "^6.5.1" - "@svgr/hast-util-to-babel-ast" "^6.5.1" + "@babel/core" "^7.21.3" + "@svgr/babel-preset" "8.1.0" + "@svgr/hast-util-to-babel-ast" "8.0.0" svg-parser "^2.0.4" -"@svgr/plugin-svgo@^6.5.1": - version "6.5.1" - resolved "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-6.5.1.tgz" - integrity sha512-omvZKf8ixP9z6GWgwbtmP9qQMPX4ODXi+wzbVZgomNFsUIlHA1sf4fThdwTWSsZGgvGAG6yE+b/F5gWUkcZ/iQ== +"@svgr/plugin-svgo@8.1.0": + version "8.1.0" + resolved "https://registry.yarnpkg.com/@svgr/plugin-svgo/-/plugin-svgo-8.1.0.tgz#b115b7b967b564f89ac58feae89b88c3decd0f00" + integrity sha512-Ywtl837OGO9pTLIN/onoWLmDQ4zFUycI1g76vuKGEz6evR/ZTJlJuz3G/fIkb6OVBJ2g0o6CGJzaEjfmEo3AHA== dependencies: - cosmiconfig "^7.0.1" - deepmerge "^4.2.2" - svgo "^2.8.0" + cosmiconfig "^8.1.3" + deepmerge "^4.3.1" + svgo "^3.0.2" -"@svgr/webpack@^6.2.1": - version "6.5.1" - resolved "https://registry.npmjs.org/@svgr/webpack/-/webpack-6.5.1.tgz" - integrity sha512-cQ/AsnBkXPkEK8cLbv4Dm7JGXq2XrumKnL1dRpJD9rIO2fTIlJI9a1uCciYG1F2aUsox/hJQyNGbt3soDxSRkA== +"@svgr/webpack@^8.1.0": + version "8.1.0" + resolved "https://registry.yarnpkg.com/@svgr/webpack/-/webpack-8.1.0.tgz#16f1b5346f102f89fda6ec7338b96a701d8be0c2" + integrity sha512-LnhVjMWyMQV9ZmeEy26maJk+8HTIbd59cH4F2MJ439k9DqejRisfFNGAPvRYlKETuh9LrImlS8aKsBgKjMA8WA== dependencies: - "@babel/core" "^7.19.6" - "@babel/plugin-transform-react-constant-elements" "^7.18.12" - "@babel/preset-env" "^7.19.4" + "@babel/core" "^7.21.3" + "@babel/plugin-transform-react-constant-elements" "^7.21.3" + "@babel/preset-env" "^7.20.2" "@babel/preset-react" "^7.18.6" - "@babel/preset-typescript" "^7.18.6" - "@svgr/core" "^6.5.1" - "@svgr/plugin-jsx" "^6.5.1" - "@svgr/plugin-svgo" "^6.5.1" + "@babel/preset-typescript" "^7.21.0" + "@svgr/core" "8.1.0" + "@svgr/plugin-jsx" "8.1.0" + "@svgr/plugin-svgo" "8.1.0" -"@swc/core-darwin-arm64@1.3.78": - version "1.3.78" - resolved "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.3.78.tgz" - integrity sha512-596KRua/d5Gx1buHKKchSyHuwoIL4S1BRD/wCvYNLNZ3xOzcuBBmXOjrDVigKi1ztNDeS07p30RO5UyYur0XAA== +"@swc/core-darwin-arm64@1.6.1": + version "1.6.1" + resolved "https://registry.yarnpkg.com/@swc/core-darwin-arm64/-/core-darwin-arm64-1.6.1.tgz#72d861fb7094b7a0004f4f300e2c5d4ea1549d9e" + integrity sha512-u6GdwOXsOEdNAdSI6nWq6G2BQw5HiSNIZVcBaH1iSvBnxZvWbnIKyDiZKaYnDwTLHLzig2GuUjjE2NaCJPy4jg== -"@swc/core-darwin-x64@1.3.78": - version "1.3.78" - resolved "https://registry.yarnpkg.com/@swc/core-darwin-x64/-/core-darwin-x64-1.3.78.tgz#0279831884f3275eea67c34a87fb503b35a6f6c7" - integrity sha512-w0RsD1onQAj0vuLAoOVi48HgnW6D6oBEIZP17l0HYejCDBZ+FRZLjml7wgNAWMqHcd2qNRqgtZ+v7aLza2JtBQ== +"@swc/core-darwin-x64@1.6.1": + version "1.6.1" + resolved "https://registry.yarnpkg.com/@swc/core-darwin-x64/-/core-darwin-x64-1.6.1.tgz#8b7070fcee4a4570d0af245c4614ca4e492dfd5b" + integrity sha512-/tXwQibkDNLVbAtr7PUQI0iQjoB708fjhDDDfJ6WILSBVZ3+qs/LHjJ7jHwumEYxVq1XA7Fv2Q7SE/ZSQoWHcQ== -"@swc/core-linux-arm-gnueabihf@1.3.78": - version "1.3.78" - resolved "https://registry.yarnpkg.com/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.3.78.tgz#4268cac6945329f47216ae57e8ad17bf0e5cc294" - integrity sha512-v1CpRn+H6fha1WIqmdRvJM40pFdjUHrGfhf4Ygci72nlAU41l5XimN8Iwkm8FgIwf2wnv0lLzedSM4IHvpq/yA== +"@swc/core-linux-arm-gnueabihf@1.6.1": + version "1.6.1" + resolved "https://registry.yarnpkg.com/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.6.1.tgz#bea6d2e75127bbc65a664284f012ffa90c8325d5" + integrity sha512-aDgipxhJTms8iH78emHVutFR2c16LNhO+NTRCdYi+X4PyIn58/DyYTH6VDZ0AeEcS5f132ZFldU5AEgExwihXA== -"@swc/core-linux-arm64-gnu@1.3.78": - version "1.3.78" - resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.3.78.tgz#dcedcc8fb3addaca8660c8c712376850a04d5251" - integrity sha512-Sis17dz9joJRFVvR/gteOZSUNrrrioo81RQzani0Zr5ZZOfWLMTB9DA+0MVlfnVa2taYcsJHJZFoAv9JkLwbzg== +"@swc/core-linux-arm64-gnu@1.6.1": + version "1.6.1" + resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.6.1.tgz#5c84d804ec23cf54b31c0bc0b4bdd30ec5d43ce8" + integrity sha512-XkJ+eO4zUKG5g458RyhmKPyBGxI0FwfWFgpfIj5eDybxYJ6s4HBT5MoxyBLorB5kMlZ0XoY/usUMobPVY3nL0g== -"@swc/core-linux-arm64-musl@1.3.78": - version "1.3.78" - resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.3.78.tgz#c09c29419879e819a1790994da614887714fa675" - integrity sha512-E5F8/qp+QupnfBnsP4vN1PKyCmAHYHDG1GMyPE/zLFOUYLgw+jK4C9rfyLBR0o2bWo1ay2WCIjusBZD9XHGOSA== +"@swc/core-linux-arm64-musl@1.6.1": + version "1.6.1" + resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.6.1.tgz#e167a350bec12caebc97304068c3ffbad6c398ce" + integrity sha512-dr6YbLBg/SsNxs1hDqJhxdcrS8dGMlOXJwXIrUvACiA8jAd6S5BxYCaqsCefLYXtaOmu0bbx1FB/evfodqB70Q== -"@swc/core-linux-x64-gnu@1.3.78": - version "1.3.78" - resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.3.78.tgz#e295812b2c871a559fda2314c7063f965d7a3139" - integrity sha512-iDxa+RknnTQlyy+WfPor1FM6y44ERNI2E0xiUV6gV6uPwegCngi8LFC+E7IvP6+p+yXtAkesunAaiZ8nn0s+rw== +"@swc/core-linux-x64-gnu@1.6.1": + version "1.6.1" + resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.6.1.tgz#fdd4e1d63b3e53d195e2ddcb9cb5ad9f31995796" + integrity sha512-A0b/3V+yFy4LXh3O9umIE7LXPC7NBWdjl6AQYqymSMcMu0EOb1/iygA6s6uWhz9y3e172Hpb9b/CGsuD8Px/bg== -"@swc/core-linux-x64-musl@1.3.78": - version "1.3.78" - resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.3.78.tgz#e9742111dc62b857492559491cff277ce7f952f2" - integrity sha512-dWtIYUFL5sMTE2UKshkXTusHcK8+zAhhGzvqWq1wJS45pqTlrAbzpyqB780fle880x3A6DMitWmsAFARdNzpuQ== +"@swc/core-linux-x64-musl@1.6.1": + version "1.6.1" + resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.6.1.tgz#81a312dd9e62da5f4c48e3cd23b6c6d28a31ac42" + integrity sha512-5dJjlzZXhC87nZZZWbpiDP8kBIO0ibis893F/rtPIQBI5poH+iJuA32EU3wN4/WFHeK4et8z6SGSVghPtWyk4g== -"@swc/core-win32-arm64-msvc@1.3.78": - version "1.3.78" - resolved "https://registry.yarnpkg.com/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.3.78.tgz#59d76fbd58e0efcc003cf2a08984e697d285be8d" - integrity sha512-CXFaGEc2M9Su3UoUMC8AnzKb9g+GwPxXfakLWZsjwS448h6jcreExq3nwtBNdVGzQ26xqeVLMFfb1l/oK99Hwg== +"@swc/core-win32-arm64-msvc@1.6.1": + version "1.6.1" + resolved "https://registry.yarnpkg.com/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.6.1.tgz#e131f579a69c5d807013e54ccb311e10caa27bcb" + integrity sha512-HBi1ZlwvfcUibLtT3g/lP57FaDPC799AD6InolB2KSgkqyBbZJ9wAXM8/CcH67GLIP0tZ7FqblrJTzGXxetTJQ== -"@swc/core-win32-ia32-msvc@1.3.78": - version "1.3.78" - resolved "https://registry.yarnpkg.com/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.3.78.tgz#5aac382bc8e1d3c74228f823033e19d04720cb28" - integrity sha512-FaH1jwWnJpWkdImpMoiZpMg9oy9UUyZwltzN7hFwjR48e3Li82cRFb+9PifIBHCUSBM+CrrsJXbHP213IMVAyw== +"@swc/core-win32-ia32-msvc@1.6.1": + version "1.6.1" + resolved "https://registry.yarnpkg.com/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.6.1.tgz#9f3d88cf0e826aa8222a695177a065ed2899eb21" + integrity sha512-AKqHohlWERclexar5y6ux4sQ8yaMejEXNxeKXm7xPhXrp13/1p4/I3E5bPVX/jMnvpm4HpcKSP0ee2WsqmhhPw== -"@swc/core-win32-x64-msvc@1.3.78": - version "1.3.78" - resolved "https://registry.yarnpkg.com/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.3.78.tgz#3ee7a3bd46503bf81a88343d545d7e1aca8d57de" - integrity sha512-oYxa+tPdhlx1aH14AIoF6kvVjo49tEOW0drNqoEaVHufvgH0y43QU2Jum3b2+xXztmMRtzK2CSN3GPOAXDKKKg== +"@swc/core-win32-x64-msvc@1.6.1": + version "1.6.1" + resolved "https://registry.yarnpkg.com/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.6.1.tgz#b2082710bc46c484a2c9f2e33a15973806e5031d" + integrity sha512-0dLdTLd+ONve8kgC5T6VQ2Y5G+OZ7y0ujjapnK66wpvCBM6BKYGdT/OKhZKZydrC5gUKaxFN6Y5oOt9JOFUrOQ== "@swc/core@^1.3.74": - version "1.3.78" - resolved "https://registry.npmjs.org/@swc/core/-/core-1.3.78.tgz" - integrity sha512-y6DQP571v7fbUUY7nz5G4lNIRGofuO48K5pGhD9VnuOCTuptfooCdi8wnigIrIhM/M4zQ53m/YCMDCbOtDgEww== - optionalDependencies: - "@swc/core-darwin-arm64" "1.3.78" - "@swc/core-darwin-x64" "1.3.78" - "@swc/core-linux-arm-gnueabihf" "1.3.78" - "@swc/core-linux-arm64-gnu" "1.3.78" - "@swc/core-linux-arm64-musl" "1.3.78" - "@swc/core-linux-x64-gnu" "1.3.78" - "@swc/core-linux-x64-musl" "1.3.78" - "@swc/core-win32-arm64-msvc" "1.3.78" - "@swc/core-win32-ia32-msvc" "1.3.78" - "@swc/core-win32-x64-msvc" "1.3.78" - -"@szmarczak/http-timer@^1.1.2": - version "1.1.2" - resolved "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz" - integrity sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA== + version "1.6.1" + resolved "https://registry.yarnpkg.com/@swc/core/-/core-1.6.1.tgz#a899a205cfaa8e23f805451ef4787987e03b8920" + integrity sha512-Yz5uj5hNZpS5brLtBvKY0L4s2tBAbQ4TjmW8xF1EC3YLFxQRrUjMP49Zm1kp/KYyYvTkSaG48Ffj2YWLu9nChw== dependencies: - defer-to-connect "^1.0.1" + "@swc/counter" "^0.1.3" + "@swc/types" "^0.1.8" + optionalDependencies: + "@swc/core-darwin-arm64" "1.6.1" + "@swc/core-darwin-x64" "1.6.1" + "@swc/core-linux-arm-gnueabihf" "1.6.1" + "@swc/core-linux-arm64-gnu" "1.6.1" + "@swc/core-linux-arm64-musl" "1.6.1" + "@swc/core-linux-x64-gnu" "1.6.1" + "@swc/core-linux-x64-musl" "1.6.1" + "@swc/core-win32-arm64-msvc" "1.6.1" + "@swc/core-win32-ia32-msvc" "1.6.1" + "@swc/core-win32-x64-msvc" "1.6.1" + +"@swc/counter@^0.1.3": + version "0.1.3" + resolved "https://registry.yarnpkg.com/@swc/counter/-/counter-0.1.3.tgz#cc7463bd02949611c6329596fccd2b0ec782b0e9" + integrity sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ== + +"@swc/types@^0.1.8": + version "0.1.8" + resolved "https://registry.yarnpkg.com/@swc/types/-/types-0.1.8.tgz#2c81d107c86cfbd0c3a05ecf7bb54c50dfa58a95" + integrity sha512-RNFA3+7OJFNYY78x0FYwi1Ow+iF1eF5WvmfY1nXPOEH4R2p/D4Cr1vzje7dNAI2aLFqpv8Wyz4oKSWqIZArpQA== + dependencies: + "@swc/counter" "^0.1.3" + +"@szmarczak/http-timer@^5.0.1": + version "5.0.1" + resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-5.0.1.tgz#c7c1bf1141cdd4751b0399c8fc7b8b664cd5be3a" + integrity sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw== + dependencies: + defer-to-connect "^2.0.1" + +"@tanstack/react-virtual@^3.0.0-beta.60": + version "3.5.1" + resolved "https://registry.yarnpkg.com/@tanstack/react-virtual/-/react-virtual-3.5.1.tgz#1ce466f530a10f781871360ed2bf7ff83e664f85" + integrity sha512-jIsuhfgy8GqA67PdWqg73ZB2LFE+HD9hjWL1L6ifEIZVyZVAKpYmgUG4WsKQ005aEyImJmbuimPiEvc57IY0Aw== + dependencies: + "@tanstack/virtual-core" "3.5.1" + +"@tanstack/virtual-core@3.5.1": + version "3.5.1" + resolved "https://registry.yarnpkg.com/@tanstack/virtual-core/-/virtual-core-3.5.1.tgz#f519149bce9156d0e7954b9531df15f446f2fc12" + integrity sha512-046+AUSiDru/V9pajE1du8WayvBKeCvJ2NmKPy/mR8/SbKKrqmSbj7LJBfXE+nSq4f5TBXvnCzu0kcYebI9WdQ== "@trysound/sax@0.2.0": version "0.2.0" - resolved "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz" + resolved "https://registry.yarnpkg.com/@trysound/sax/-/sax-0.2.0.tgz#cccaab758af56761eb7bf37af6f03f326dd798ad" integrity sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA== +"@types/acorn@^4.0.0": + version "4.0.6" + resolved "https://registry.yarnpkg.com/@types/acorn/-/acorn-4.0.6.tgz#d61ca5480300ac41a7d973dd5b84d0a591154a22" + integrity sha512-veQTnWP+1D/xbxVrPC3zHnCZRjSrKfhbMUlEA43iMZLu7EsnTtkJklIuwrCPbOi8YkvDQAiW05VQQFvvz9oieQ== + dependencies: + "@types/estree" "*" + "@types/body-parser@*": - version "1.19.2" - resolved "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz" - integrity sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g== + version "1.19.5" + resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.5.tgz#04ce9a3b677dc8bd681a17da1ab9835dc9d3ede4" + integrity sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg== dependencies: "@types/connect" "*" "@types/node" "*" "@types/bonjour@^3.5.9": - version "3.5.10" - resolved "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.10.tgz" - integrity sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw== + version "3.5.13" + resolved "https://registry.yarnpkg.com/@types/bonjour/-/bonjour-3.5.13.tgz#adf90ce1a105e81dd1f9c61fdc5afda1bfb92956" + integrity sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ== dependencies: "@types/node" "*" "@types/connect-history-api-fallback@^1.3.5": - version "1.3.5" - resolved "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.3.5.tgz" - integrity sha512-h8QJa8xSb1WD4fpKBDcATDNGXghFj6/3GRWG6dhmRcu0RX1Ubasur2Uvx5aeEwlf0MwblEC2bMzzMQntxnw/Cw== + version "1.5.4" + resolved "https://registry.yarnpkg.com/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.4.tgz#7de71645a103056b48ac3ce07b3520b819c1d5b3" + integrity sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw== dependencies: "@types/express-serve-static-core" "*" "@types/node" "*" "@types/connect@*": - version "3.4.35" - resolved "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz" - integrity sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ== + version "3.4.38" + resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.38.tgz#5ba7f3bc4fbbdeaff8dded952e5ff2cc53f8d858" + integrity sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug== dependencies: "@types/node" "*" +"@types/d3-scale-chromatic@^3.0.0": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@types/d3-scale-chromatic/-/d3-scale-chromatic-3.0.3.tgz#fc0db9c10e789c351f4c42d96f31f2e4df8f5644" + integrity sha512-laXM4+1o5ImZv3RpFAsTRn3TEkzqkytiOY0Dz0sq5cnd1dtNlk6sHLon4OvqaiJb28T0S/TdsBI3Sjsy+keJrw== + +"@types/d3-scale@^4.0.3": + version "4.0.8" + resolved "https://registry.yarnpkg.com/@types/d3-scale/-/d3-scale-4.0.8.tgz#d409b5f9dcf63074464bf8ddfb8ee5a1f95945bb" + integrity sha512-gkK1VVTr5iNiYJ7vWDI+yUFFlszhNMtVeneJ6lUTKPjprsvLLI9/tgEGiXJOnlINJA8FyA88gfnQsHbybVZrYQ== + dependencies: + "@types/d3-time" "*" + +"@types/d3-time@*": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@types/d3-time/-/d3-time-3.0.3.tgz#3c186bbd9d12b9d84253b6be6487ca56b54f88be" + integrity sha512-2p6olUZ4w3s+07q3Tm2dbiMZy5pCDfYwtLXXHUnVzXgQlZ/OyPtUz6OL382BkOuGlLXqfT+wqv8Fw2v8/0geBw== + "@types/debug@^4.0.0": - version "4.1.7" - resolved "https://registry.npmjs.org/@types/debug/-/debug-4.1.7.tgz" - integrity sha512-9AonUzyTjXXhEOa0DnqpzZi6VHlqKMswga9EXjpXnnqxwLtdvPPtlO8evrI5D9S6asFRCQ6v+wpiUKbw+vKqyg== + version "4.1.12" + resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.12.tgz#a155f21690871953410df4b6b6f53187f0500917" + integrity sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ== dependencies: "@types/ms" "*" "@types/eslint-scope@^3.7.3": - version "3.7.3" - resolved "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.3.tgz" - integrity sha512-PB3ldyrcnAicT35TWPs5IcwKD8S333HMaa2VVv4+wdvebJkjWuW/xESoB8IwRcog8HYVYamb1g/R31Qv5Bx03g== + version "3.7.7" + resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.7.tgz#3108bd5f18b0cdb277c867b3dd449c9ed7079ac5" + integrity sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg== dependencies: "@types/eslint" "*" "@types/estree" "*" "@types/eslint@*": - version "8.44.2" - resolved "https://registry.npmjs.org/@types/eslint/-/eslint-8.44.2.tgz" - integrity sha512-sdPRb9K6iL5XZOmBubg8yiFp5yS/JdUDQsq5e6h95km91MCYMuvp7mh1fjPEYUhvHepKpZOjnEaMBR4PxjWDzg== + version "8.56.10" + resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.56.10.tgz#eb2370a73bf04a901eeba8f22595c7ee0f7eb58d" + integrity sha512-Shavhk87gCtY2fhXDctcfS3e6FdxWkCx1iUZ9eEUbh7rTqlZT0/IzOkCOVt0fCjcFuZ9FPYfuezTBImfHCDBGQ== dependencies: "@types/estree" "*" "@types/json-schema" "*" -"@types/estree@*", "@types/estree@^1.0.0": - version "1.0.1" - resolved "https://registry.npmjs.org/@types/estree/-/estree-1.0.1.tgz" - integrity sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA== +"@types/estree-jsx@^1.0.0": + version "1.0.5" + resolved "https://registry.yarnpkg.com/@types/estree-jsx/-/estree-jsx-1.0.5.tgz#858a88ea20f34fe65111f005a689fa1ebf70dc18" + integrity sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg== + dependencies: + "@types/estree" "*" -"@types/express-serve-static-core@*", "@types/express-serve-static-core@^4.17.18": - version "4.17.35" - resolved "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.35.tgz" - integrity sha512-wALWQwrgiB2AWTT91CB62b6Yt0sNHpznUXeZEcnPU3DRdlDIz74x8Qg1UUYKSVFi+va5vKOLYRBI1bRKiLLKIg== +"@types/estree@*", "@types/estree@^1.0.0", "@types/estree@^1.0.5": + version "1.0.5" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.5.tgz#a6ce3e556e00fd9895dd872dd172ad0d4bd687f4" + integrity sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw== + +"@types/express-serve-static-core@*", "@types/express-serve-static-core@^4.17.33": + version "4.19.3" + resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.19.3.tgz#e469a13e4186c9e1c0418fb17be8bc8ff1b19a7a" + integrity sha512-KOzM7MhcBFlmnlr/fzISFF5vGWVSvN6fTd4T+ExOt08bA/dA5kpSzY52nMsI1KDFmUREpJelPYyuslLRSjjgCg== dependencies: "@types/node" "*" "@types/qs" "*" @@ -2836,298 +2377,325 @@ "@types/send" "*" "@types/express@*", "@types/express@^4.17.13": - version "4.17.13" - resolved "https://registry.npmjs.org/@types/express/-/express-4.17.13.tgz" - integrity sha512-6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA== + version "4.17.21" + resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.21.tgz#c26d4a151e60efe0084b23dc3369ebc631ed192d" + integrity sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ== dependencies: "@types/body-parser" "*" - "@types/express-serve-static-core" "^4.17.18" + "@types/express-serve-static-core" "^4.17.33" "@types/qs" "*" "@types/serve-static" "*" +"@types/gtag.js@^0.0.12": + version "0.0.12" + resolved "https://registry.yarnpkg.com/@types/gtag.js/-/gtag.js-0.0.12.tgz#095122edca896689bdfcdd73b057e23064d23572" + integrity sha512-YQV9bUsemkzG81Ea295/nF/5GijnD2Af7QhEofh7xu+kvCN6RdodgNwwGWXB5GMI3NoyvQo0odNctoH/qLMIpg== + "@types/hast@^2.0.0": - version "2.3.4" - resolved "https://registry.npmjs.org/@types/hast/-/hast-2.3.4.tgz" - integrity sha512-wLEm0QvaoawEDoTRwzTXp4b4jpwiJDvR5KMnFnVodm3scufTlBOWRD6N1OBf9TZMhjlNsSfcO5V+7AF4+Vy+9g== + version "2.3.10" + resolved "https://registry.yarnpkg.com/@types/hast/-/hast-2.3.10.tgz#5c9d9e0b304bbb8879b857225c5ebab2d81d7643" + integrity sha512-McWspRw8xx8J9HurkVBfYj0xKoE25tOFlHGdx4MJ5xORQrMGZNqJhVQWaIbm6Oyla5kYOXtDiopzKRJzEOkwJw== + dependencies: + "@types/unist" "^2" + +"@types/hast@^3.0.0": + version "3.0.4" + resolved "https://registry.yarnpkg.com/@types/hast/-/hast-3.0.4.tgz#1d6b39993b82cea6ad783945b0508c25903e15aa" + integrity sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ== dependencies: "@types/unist" "*" "@types/history@^4.7.11": version "4.7.11" - resolved "https://registry.npmjs.org/@types/history/-/history-4.7.11.tgz" + resolved "https://registry.yarnpkg.com/@types/history/-/history-4.7.11.tgz#56588b17ae8f50c53983a524fc3cc47437969d64" integrity sha512-qjDJRrmvBMiTx+jyLxvLfJU7UznFuokDv4f3WRuriHKERccVpFU+8XMQUAbDzoiJCsmexxRExQeMwwCdamSKDA== "@types/hoist-non-react-statics@^3.3.0": - version "3.3.1" - resolved "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz" - integrity sha512-iMIqiko6ooLrTh1joXodJK5X9xeEALT1kM5G3ZLhD3hszxBdIEd5C75U834D9mLcINgD4OyZf5uQXjkuYydWvA== + version "3.3.5" + resolved "https://registry.yarnpkg.com/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.5.tgz#dab7867ef789d87e2b4b0003c9d65c49cc44a494" + integrity sha512-SbcrWzkKBw2cdwRTwQAswfpB9g9LJWfjtUeW/jvNwbhC8cpmmNYVePa+ncbUe0rGTQ7G3Ff6mYUN2VMfLVr+Sg== dependencies: "@types/react" "*" hoist-non-react-statics "^3.3.0" "@types/html-minifier-terser@^6.0.0": version "6.1.0" - resolved "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz" + resolved "https://registry.yarnpkg.com/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz#4fc33a00c1d0c16987b1a20cf92d20614c55ac35" integrity sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg== +"@types/http-cache-semantics@^4.0.2": + version "4.0.4" + resolved "https://registry.yarnpkg.com/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz#b979ebad3919799c979b17c72621c0bc0a31c6c4" + integrity sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA== + "@types/http-errors@*": - version "2.0.1" - resolved "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.1.tgz" - integrity sha512-/K3ds8TRAfBvi5vfjuz8y6+GiAYBZ0x4tXv1Av6CWBWn0IlADc+ZX9pMq7oU0fNQPnBwIZl3rmeLp6SBApbxSQ== + version "2.0.4" + resolved "https://registry.yarnpkg.com/@types/http-errors/-/http-errors-2.0.4.tgz#7eb47726c391b7345a6ec35ad7f4de469cf5ba4f" + integrity sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA== "@types/http-proxy@^1.17.8": - version "1.17.9" - resolved "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.9.tgz" - integrity sha512-QsbSjA/fSk7xB+UXlCT3wHBy5ai9wOcNDWwZAtud+jXhwOM3l+EYZh8Lng4+/6n8uar0J7xILzqftJdJ/Wdfkw== + version "1.17.14" + resolved "https://registry.yarnpkg.com/@types/http-proxy/-/http-proxy-1.17.14.tgz#57f8ccaa1c1c3780644f8a94f9c6b5000b5e2eec" + integrity sha512-SSrD0c1OQzlFX7pGu1eXxSEjemej64aaNPRhhVYUGqXh0BtldAAx37MG8btcumvpgKyZp1F5Gn3JkktdxiFv6w== dependencies: "@types/node" "*" "@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0": - version "2.0.4" - resolved "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz" - integrity sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g== + version "2.0.6" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz#7739c232a1fee9b4d3ce8985f314c0c6d33549d7" + integrity sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w== "@types/istanbul-lib-report@*": - version "3.0.0" - resolved "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz" - integrity sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg== + version "3.0.3" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz#53047614ae72e19fc0401d872de3ae2b4ce350bf" + integrity sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA== dependencies: "@types/istanbul-lib-coverage" "*" "@types/istanbul-reports@^3.0.0": - version "3.0.1" - resolved "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz" - integrity sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw== + version "3.0.4" + resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz#0f03e3d2f670fbdac586e34b433783070cc16f54" + integrity sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ== dependencies: "@types/istanbul-lib-report" "*" -"@types/json-schema@*", "@types/json-schema@^7.0.11", "@types/json-schema@^7.0.4", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": - version "7.0.11" - resolved "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz" - integrity sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ== - -"@types/lodash.clonedeep@^4.5.7": - version "4.5.7" - resolved "https://registry.npmjs.org/@types/lodash.clonedeep/-/lodash.clonedeep-4.5.7.tgz" - integrity sha512-ccNqkPptFIXrpVqUECi60/DFxjNKsfoQxSQsgcBJCX/fuX1wgyQieojkcWH/KpE3xzLoWN/2k+ZeGqIN3paSvw== - dependencies: - "@types/lodash" "*" - -"@types/lodash@*": - version "4.14.197" - resolved "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.197.tgz" - integrity sha512-BMVOiWs0uNxHVlHBgzTIqJYmj+PgCo4euloGF+5m4okL3rEYzM2EEv78mw8zWSMM57dM7kVIgJ2QDvwHSoCI5g== +"@types/json-schema@*", "@types/json-schema@^7.0.15", "@types/json-schema@^7.0.4", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": + version "7.0.15" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" + integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== "@types/mdast@^3.0.0": - version "3.0.10" - resolved "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.10.tgz" - integrity sha512-W864tg/Osz1+9f4lrGTZpCSO5/z4608eUp19tbozkq2HJK6i3z1kT0H9tlADXuYIb1YYOBByU4Jsqkk75q48qA== + version "3.0.15" + resolved "https://registry.yarnpkg.com/@types/mdast/-/mdast-3.0.15.tgz#49c524a263f30ffa28b71ae282f813ed000ab9f5" + integrity sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ== + dependencies: + "@types/unist" "^2" + +"@types/mdast@^4.0.0", "@types/mdast@^4.0.2": + version "4.0.4" + resolved "https://registry.yarnpkg.com/@types/mdast/-/mdast-4.0.4.tgz#7ccf72edd2f1aa7dd3437e180c64373585804dd6" + integrity sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA== dependencies: "@types/unist" "*" -"@types/mime@*": - version "3.0.1" - resolved "https://registry.npmjs.org/@types/mime/-/mime-3.0.1.tgz" - integrity sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA== +"@types/mdx@^2.0.0": + version "2.0.13" + resolved "https://registry.yarnpkg.com/@types/mdx/-/mdx-2.0.13.tgz#68f6877043d377092890ff5b298152b0a21671bd" + integrity sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw== "@types/mime@^1": - version "1.3.2" - resolved "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz" - integrity sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw== + version "1.3.5" + resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.5.tgz#1ef302e01cf7d2b5a0fa526790c9123bf1d06690" + integrity sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w== "@types/ms@*": - version "0.7.31" - resolved "https://registry.npmjs.org/@types/ms/-/ms-0.7.31.tgz" - integrity sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA== + version "0.7.34" + resolved "https://registry.yarnpkg.com/@types/ms/-/ms-0.7.34.tgz#10964ba0dee6ac4cd462e2795b6bebd407303433" + integrity sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g== + +"@types/node-forge@^1.3.0": + version "1.3.11" + resolved "https://registry.yarnpkg.com/@types/node-forge/-/node-forge-1.3.11.tgz#0972ea538ddb0f4d9c2fa0ec5db5724773a604da" + integrity sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ== + dependencies: + "@types/node" "*" "@types/node@*": - version "20.5.1" - resolved "https://registry.npmjs.org/@types/node/-/node-20.5.1.tgz" - integrity sha512-4tT2UrL5LBqDwoed9wZ6N3umC4Yhz3W3FloMmiiG4JwmUJWpie0c7lcnUNd4gtMKuDEO4wRVS8B6Xa0uMRsMKg== - -"@types/node@^14.11.8": - version "14.18.54" - resolved "https://registry.npmjs.org/@types/node/-/node-14.18.54.tgz" - integrity sha512-uq7O52wvo2Lggsx1x21tKZgqkJpvwCseBBPtX/nKQfpVlEsLOb11zZ1CRsWUKvJF0+lzuA9jwvA7Pr2Wt7i3xw== + version "20.14.2" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.14.2.tgz#a5f4d2bcb4b6a87bffcaa717718c5a0f208f4a18" + integrity sha512-xyu6WAMVwv6AKFLB+e/7ySZVr/0zLCzOa7rSpq6jNwpqOrUbcACDWC+53d4n2QHOnDou0fbIsg8wZu/sxrnI4Q== + dependencies: + undici-types "~5.26.4" "@types/node@^17.0.5": version "17.0.45" - resolved "https://registry.npmjs.org/@types/node/-/node-17.0.45.tgz" + resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.45.tgz#2c0fafd78705e7a18b7906b5201a522719dc5190" integrity sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw== "@types/parse-json@^4.0.0": - version "4.0.0" - resolved "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz" - integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== - -"@types/parse5@^5.0.0": - version "5.0.3" - resolved "https://registry.npmjs.org/@types/parse5/-/parse5-5.0.3.tgz" - integrity sha512-kUNnecmtkunAoQ3CnjmMkzNU/gtxG8guhi+Fk2U/kOpIKjIMKnXGp4IJCgQJrXSgMsWYimYG4TGjz/UzbGEBTw== + version "4.0.2" + resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.2.tgz#5950e50960793055845e956c427fc2b0d70c5239" + integrity sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw== "@types/parse5@^6.0.0": version "6.0.3" - resolved "https://registry.npmjs.org/@types/parse5/-/parse5-6.0.3.tgz" + resolved "https://registry.yarnpkg.com/@types/parse5/-/parse5-6.0.3.tgz#705bb349e789efa06f43f128cef51240753424cb" integrity sha512-SuT16Q1K51EAVPz1K29DJ/sXjhSQ0zjvsypYJ6tlwVsRV9jwW5Adq2ch8Dq8kDBCkYnELS7N7VNCSB5nC56t/g== +"@types/prismjs@^1.26.0": + version "1.26.4" + resolved "https://registry.yarnpkg.com/@types/prismjs/-/prismjs-1.26.4.tgz#1a9e1074619ce1d7322669e5b46fbe823925103a" + integrity sha512-rlAnzkW2sZOjbqZ743IHUhFcvzaGbqijwOu8QZnZCjfQzBqFE3s4lOTJEsxikImav9uzz/42I+O7YUs1mWgMlg== + "@types/prop-types@*", "@types/prop-types@^15.0.0": - version "15.7.5" - resolved "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz" - integrity sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w== + version "15.7.12" + resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.12.tgz#12bb1e2be27293c1406acb6af1c3f3a1481d98c6" + integrity sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q== "@types/qs@*": - version "6.9.7" - resolved "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz" - integrity sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw== + version "6.9.15" + resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.15.tgz#adde8a060ec9c305a82de1babc1056e73bd64dce" + integrity sha512-uXHQKES6DQKKCLh441Xv/dwxOq1TVS3JPUMlEqoEglvlhR6Mxnlew/Xq/LRVHpLyk7iK3zODe1qYHIMltO7XGg== "@types/range-parser@*": - version "1.2.4" - resolved "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz" - integrity sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw== + version "1.2.7" + resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.7.tgz#50ae4353eaaddc04044279812f52c8c65857dbcb" + integrity sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ== "@types/react-redux@^7.1.20": - version "7.1.25" - resolved "https://registry.npmjs.org/@types/react-redux/-/react-redux-7.1.25.tgz" - integrity sha512-bAGh4e+w5D8dajd6InASVIyCo4pZLJ66oLb80F9OBLO1gKESbZcRCJpTT6uLXX+HAB57zw1WTdwJdAsewuTweg== + version "7.1.33" + resolved "https://registry.yarnpkg.com/@types/react-redux/-/react-redux-7.1.33.tgz#53c5564f03f1ded90904e3c90f77e4bd4dc20b15" + integrity sha512-NF8m5AjWCkert+fosDsN3hAlHzpjSiXlVy9EgQEmLoBhaNXbmyeGs/aj5dQzKuF+/q+S7JQagorGDW8pJ28Hmg== dependencies: "@types/hoist-non-react-statics" "^3.3.0" "@types/react" "*" hoist-non-react-statics "^3.3.0" redux "^4.0.0" -"@types/react-router-config@*", "@types/react-router-config@^5.0.6": - version "5.0.6" - resolved "https://registry.npmjs.org/@types/react-router-config/-/react-router-config-5.0.6.tgz" - integrity sha512-db1mx37a1EJDf1XeX8jJN7R3PZABmJQXR8r28yUjVMFSjkmnQo6X6pOEEmNl+Tp2gYQOGPdYbFIipBtdElZ3Yg== +"@types/react-router-config@*", "@types/react-router-config@^5.0.7": + version "5.0.11" + resolved "https://registry.yarnpkg.com/@types/react-router-config/-/react-router-config-5.0.11.tgz#2761a23acc7905a66a94419ee40294a65aaa483a" + integrity sha512-WmSAg7WgqW7m4x8Mt4N6ZyKz0BubSj/2tVUMsAHp+Yd2AMwcSbeFq9WympT19p5heCFmF97R9eD5uUR/t4HEqw== dependencies: "@types/history" "^4.7.11" "@types/react" "*" - "@types/react-router" "*" + "@types/react-router" "^5.1.0" "@types/react-router-dom@*": version "5.3.3" - resolved "https://registry.npmjs.org/@types/react-router-dom/-/react-router-dom-5.3.3.tgz" + resolved "https://registry.yarnpkg.com/@types/react-router-dom/-/react-router-dom-5.3.3.tgz#e9d6b4a66fcdbd651a5f106c2656a30088cc1e83" integrity sha512-kpqnYK4wcdm5UaWI3fLcELopqLrHgLqNsdpHauzlQktfkHL3npOSwtj1Uz9oKBAzs7lFtVkV8j83voAz2D8fhw== dependencies: "@types/history" "^4.7.11" "@types/react" "*" "@types/react-router" "*" -"@types/react-router@*": - version "5.1.18" - resolved "https://registry.npmjs.org/@types/react-router/-/react-router-5.1.18.tgz" - integrity sha512-YYknwy0D0iOwKQgz9v8nOzt2J6l4gouBmDnWqUUznltOTaon+r8US8ky8HvN0tXvc38U9m6z/t2RsVsnd1zM0g== +"@types/react-router@*", "@types/react-router@^5.1.0": + version "5.1.20" + resolved "https://registry.yarnpkg.com/@types/react-router/-/react-router-5.1.20.tgz#88eccaa122a82405ef3efbcaaa5dcdd9f021387c" + integrity sha512-jGjmu/ZqS7FjSH6owMcD5qpq19+1RS9DeVRqfl1FeBMxTDQAGwlMWOcs52NDoXaNKyG3d1cYQFMs9rCrb88o9Q== dependencies: "@types/history" "^4.7.11" "@types/react" "*" "@types/react@*": - version "17.0.56" - resolved "https://registry.npmjs.org/@types/react/-/react-17.0.56.tgz" - integrity sha512-Z13f9Qz7Hg8f2g2NsBjiJSVWmON2b3K8RIqFK8mMKCIgvD0CD0ZChTukz87H3lI28X3ukXoNFGzo3ZW1ICTtPA== + version "18.3.3" + resolved "https://registry.yarnpkg.com/@types/react/-/react-18.3.3.tgz#9679020895318b0915d7a3ab004d92d33375c45f" + integrity sha512-hti/R0pS0q1/xx+TsI73XIqk26eBsISZ2R0wUijXIngRK9R/e7Xw/cXVxQK7R5JjW+SV4zGcn5hXjudkN/pLIw== dependencies: "@types/prop-types" "*" - "@types/scheduler" "*" csstype "^3.0.2" "@types/retry@0.12.0": version "0.12.0" - resolved "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz" + resolved "https://registry.yarnpkg.com/@types/retry/-/retry-0.12.0.tgz#2b35eccfcee7d38cd72ad99232fbd58bffb3c84d" integrity sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA== "@types/sax@^1.2.1": - version "1.2.4" - resolved "https://registry.npmjs.org/@types/sax/-/sax-1.2.4.tgz" - integrity sha512-pSAff4IAxJjfAXUG6tFkO7dsSbTmf8CtUpfhhZ5VhkRpC4628tJhh3+V6H1E+/Gs9piSzYKT5yzHO5M4GG9jkw== + version "1.2.7" + resolved "https://registry.yarnpkg.com/@types/sax/-/sax-1.2.7.tgz#ba5fe7df9aa9c89b6dff7688a19023dd2963091d" + integrity sha512-rO73L89PJxeYM3s3pPPjiPgVVcymqU490g0YO5n5By0k2Erzj6tay/4lr1CHAAU4JyOWd1rpQ8bCf6cZfHU96A== dependencies: "@types/node" "*" -"@types/scheduler@*": - version "0.16.2" - resolved "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz" - integrity sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew== - "@types/send@*": - version "0.17.1" - resolved "https://registry.npmjs.org/@types/send/-/send-0.17.1.tgz" - integrity sha512-Cwo8LE/0rnvX7kIIa3QHCkcuF21c05Ayb0ZfxPiv0W8VRiZiNW/WuRupHKpqqGVGf7SUA44QSOUKaEd9lIrd/Q== + version "0.17.4" + resolved "https://registry.yarnpkg.com/@types/send/-/send-0.17.4.tgz#6619cd24e7270793702e4e6a4b958a9010cfc57a" + integrity sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA== dependencies: "@types/mime" "^1" "@types/node" "*" "@types/serve-index@^1.9.1": - version "1.9.1" - resolved "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.1.tgz" - integrity sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg== + version "1.9.4" + resolved "https://registry.yarnpkg.com/@types/serve-index/-/serve-index-1.9.4.tgz#e6ae13d5053cb06ed36392110b4f9a49ac4ec898" + integrity sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug== dependencies: "@types/express" "*" "@types/serve-static@*", "@types/serve-static@^1.13.10": - version "1.15.2" - resolved "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.2.tgz" - integrity sha512-J2LqtvFYCzaj8pVYKw8klQXrLLk7TBZmQ4ShlcdkELFKGwGMfevMLneMMRkMgZxotOD9wg497LpC7O8PcvAmfw== + version "1.15.7" + resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.15.7.tgz#22174bbd74fb97fe303109738e9b5c2f3064f714" + integrity sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw== dependencies: "@types/http-errors" "*" - "@types/mime" "*" "@types/node" "*" + "@types/send" "*" "@types/sockjs@^0.3.33": - version "0.3.33" - resolved "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.33.tgz" - integrity sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw== + version "0.3.36" + resolved "https://registry.yarnpkg.com/@types/sockjs/-/sockjs-0.3.36.tgz#ce322cf07bcc119d4cbf7f88954f3a3bd0f67535" + integrity sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q== dependencies: "@types/node" "*" -"@types/unist@*", "@types/unist@^2.0.0", "@types/unist@^2.0.2", "@types/unist@^2.0.3": - version "2.0.6" - resolved "https://registry.npmjs.org/@types/unist/-/unist-2.0.6.tgz" - integrity sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ== +"@types/unist@*", "@types/unist@^3.0.0": + version "3.0.2" + resolved "https://registry.yarnpkg.com/@types/unist/-/unist-3.0.2.tgz#6dd61e43ef60b34086287f83683a5c1b2dc53d20" + integrity sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ== -"@types/ws@^8.5.1": - version "8.5.3" - resolved "https://registry.npmjs.org/@types/ws/-/ws-8.5.3.tgz" - integrity sha512-6YOoWjruKj1uLf3INHH7D3qTXwFfEsg1kf3c0uDdSBJwfa/llkwIjrAGV7j7mVgGNbzTQ3HiHKKDXl6bJPD97w== +"@types/unist@^2", "@types/unist@^2.0.0": + version "2.0.10" + resolved "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.10.tgz#04ffa7f406ab628f7f7e97ca23e290cd8ab15efc" + integrity sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA== + +"@types/ws@^8.5.5": + version "8.5.10" + resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.10.tgz#4acfb517970853fa6574a3a6886791d04a396787" + integrity sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A== dependencies: "@types/node" "*" "@types/yargs-parser@*": - version "21.0.0" - resolved "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz" - integrity sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA== + version "21.0.3" + resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.3.tgz#815e30b786d2e8f0dcd85fd5bcf5e1a04d008f15" + integrity sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ== "@types/yargs@^17.0.8": - version "17.0.13" - resolved "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.13.tgz" - integrity sha512-9sWaruZk2JGxIQU+IhI1fhPYRcQ0UuTNuKuCW9bR5fp7qi2Llf7WDzNa17Cy7TKnh3cdxDOiyTu6gaLS0eDatg== + version "17.0.32" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.32.tgz#030774723a2f7faafebf645f4e5a48371dca6229" + integrity sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog== dependencies: "@types/yargs-parser" "*" -"@webassemblyjs/ast@1.11.6", "@webassemblyjs/ast@^1.11.5": - version "1.11.6" - resolved "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz" - integrity sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q== +"@types/yauzl@^2.9.1": + version "2.10.3" + resolved "https://registry.yarnpkg.com/@types/yauzl/-/yauzl-2.10.3.tgz#e9b2808b4f109504a03cda958259876f61017999" + integrity sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q== + dependencies: + "@types/node" "*" + +"@ungap/structured-clone@^1.0.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.2.0.tgz#756641adb587851b5ccb3e095daf27ae581c8406" + integrity sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ== + +"@webassemblyjs/ast@1.12.1", "@webassemblyjs/ast@^1.12.1": + version "1.12.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.12.1.tgz#bb16a0e8b1914f979f45864c23819cc3e3f0d4bb" + integrity sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg== dependencies: "@webassemblyjs/helper-numbers" "1.11.6" "@webassemblyjs/helper-wasm-bytecode" "1.11.6" "@webassemblyjs/floating-point-hex-parser@1.11.6": version "1.11.6" - resolved "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz" + resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz#dacbcb95aff135c8260f77fa3b4c5fea600a6431" integrity sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw== "@webassemblyjs/helper-api-error@1.11.6": version "1.11.6" - resolved "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz#6132f68c4acd59dcd141c44b18cbebbd9f2fa768" integrity sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q== -"@webassemblyjs/helper-buffer@1.11.6": - version "1.11.6" - resolved "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz" - integrity sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA== +"@webassemblyjs/helper-buffer@1.12.1": + version "1.12.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.12.1.tgz#6df20d272ea5439bf20ab3492b7fb70e9bfcb3f6" + integrity sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw== "@webassemblyjs/helper-numbers@1.11.6": version "1.11.6" - resolved "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz#cbce5e7e0c1bd32cf4905ae444ef64cea919f1b5" integrity sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g== dependencies: "@webassemblyjs/floating-point-hex-parser" "1.11.6" @@ -3136,141 +2704,155 @@ "@webassemblyjs/helper-wasm-bytecode@1.11.6": version "1.11.6" - resolved "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz#bb2ebdb3b83aa26d9baad4c46d4315283acd51e9" integrity sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA== -"@webassemblyjs/helper-wasm-section@1.11.6": - version "1.11.6" - resolved "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz" - integrity sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g== +"@webassemblyjs/helper-wasm-section@1.12.1": + version "1.12.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.12.1.tgz#3da623233ae1a60409b509a52ade9bc22a37f7bf" + integrity sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g== dependencies: - "@webassemblyjs/ast" "1.11.6" - "@webassemblyjs/helper-buffer" "1.11.6" + "@webassemblyjs/ast" "1.12.1" + "@webassemblyjs/helper-buffer" "1.12.1" "@webassemblyjs/helper-wasm-bytecode" "1.11.6" - "@webassemblyjs/wasm-gen" "1.11.6" + "@webassemblyjs/wasm-gen" "1.12.1" "@webassemblyjs/ieee754@1.11.6": version "1.11.6" - resolved "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz#bb665c91d0b14fffceb0e38298c329af043c6e3a" integrity sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg== dependencies: "@xtuc/ieee754" "^1.2.0" "@webassemblyjs/leb128@1.11.6": version "1.11.6" - resolved "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz" + resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.11.6.tgz#70e60e5e82f9ac81118bc25381a0b283893240d7" integrity sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ== dependencies: "@xtuc/long" "4.2.2" "@webassemblyjs/utf8@1.11.6": version "1.11.6" - resolved "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz" + resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.11.6.tgz#90f8bc34c561595fe156603be7253cdbcd0fab5a" integrity sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA== -"@webassemblyjs/wasm-edit@^1.11.5": - version "1.11.6" - resolved "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz" - integrity sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw== +"@webassemblyjs/wasm-edit@^1.12.1": + version "1.12.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.12.1.tgz#9f9f3ff52a14c980939be0ef9d5df9ebc678ae3b" + integrity sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g== dependencies: - "@webassemblyjs/ast" "1.11.6" - "@webassemblyjs/helper-buffer" "1.11.6" + "@webassemblyjs/ast" "1.12.1" + "@webassemblyjs/helper-buffer" "1.12.1" "@webassemblyjs/helper-wasm-bytecode" "1.11.6" - "@webassemblyjs/helper-wasm-section" "1.11.6" - "@webassemblyjs/wasm-gen" "1.11.6" - "@webassemblyjs/wasm-opt" "1.11.6" - "@webassemblyjs/wasm-parser" "1.11.6" - "@webassemblyjs/wast-printer" "1.11.6" + "@webassemblyjs/helper-wasm-section" "1.12.1" + "@webassemblyjs/wasm-gen" "1.12.1" + "@webassemblyjs/wasm-opt" "1.12.1" + "@webassemblyjs/wasm-parser" "1.12.1" + "@webassemblyjs/wast-printer" "1.12.1" -"@webassemblyjs/wasm-gen@1.11.6": - version "1.11.6" - resolved "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz" - integrity sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA== +"@webassemblyjs/wasm-gen@1.12.1": + version "1.12.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.12.1.tgz#a6520601da1b5700448273666a71ad0a45d78547" + integrity sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w== dependencies: - "@webassemblyjs/ast" "1.11.6" + "@webassemblyjs/ast" "1.12.1" "@webassemblyjs/helper-wasm-bytecode" "1.11.6" "@webassemblyjs/ieee754" "1.11.6" "@webassemblyjs/leb128" "1.11.6" "@webassemblyjs/utf8" "1.11.6" -"@webassemblyjs/wasm-opt@1.11.6": - version "1.11.6" - resolved "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz" - integrity sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g== +"@webassemblyjs/wasm-opt@1.12.1": + version "1.12.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.12.1.tgz#9e6e81475dfcfb62dab574ac2dda38226c232bc5" + integrity sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg== dependencies: - "@webassemblyjs/ast" "1.11.6" - "@webassemblyjs/helper-buffer" "1.11.6" - "@webassemblyjs/wasm-gen" "1.11.6" - "@webassemblyjs/wasm-parser" "1.11.6" + "@webassemblyjs/ast" "1.12.1" + "@webassemblyjs/helper-buffer" "1.12.1" + "@webassemblyjs/wasm-gen" "1.12.1" + "@webassemblyjs/wasm-parser" "1.12.1" -"@webassemblyjs/wasm-parser@1.11.6", "@webassemblyjs/wasm-parser@^1.11.5": - version "1.11.6" - resolved "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz" - integrity sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ== +"@webassemblyjs/wasm-parser@1.12.1", "@webassemblyjs/wasm-parser@^1.12.1": + version "1.12.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.12.1.tgz#c47acb90e6f083391e3fa61d113650eea1e95937" + integrity sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ== dependencies: - "@webassemblyjs/ast" "1.11.6" + "@webassemblyjs/ast" "1.12.1" "@webassemblyjs/helper-api-error" "1.11.6" "@webassemblyjs/helper-wasm-bytecode" "1.11.6" "@webassemblyjs/ieee754" "1.11.6" "@webassemblyjs/leb128" "1.11.6" "@webassemblyjs/utf8" "1.11.6" -"@webassemblyjs/wast-printer@1.11.6": - version "1.11.6" - resolved "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz" - integrity sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A== +"@webassemblyjs/wast-printer@1.12.1": + version "1.12.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.12.1.tgz#bcecf661d7d1abdaf989d8341a4833e33e2b31ac" + integrity sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA== dependencies: - "@webassemblyjs/ast" "1.11.6" + "@webassemblyjs/ast" "1.12.1" "@xtuc/long" "4.2.2" "@xtuc/ieee754@^1.2.0": version "1.2.0" - resolved "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz" + resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA== "@xtuc/long@4.2.2": version "4.2.2" - resolved "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz" + resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== abort-controller@^3.0.0: version "3.0.0" - resolved "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz" + resolved "https://registry.yarnpkg.com/abort-controller/-/abort-controller-3.0.0.tgz#eaf54d53b62bae4138e809ca225c8439a6efb392" integrity sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg== dependencies: event-target-shim "^5.0.0" accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.8: version "1.3.8" - resolved "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz" + resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== dependencies: mime-types "~2.1.34" negotiator "0.6.3" -acorn-import-assertions@^1.9.0: - version "1.9.0" - resolved "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz" - integrity sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA== +acorn-import-attributes@^1.9.5: + version "1.9.5" + resolved "https://registry.yarnpkg.com/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz#7eb1557b1ba05ef18b5ed0ec67591bfab04688ef" + integrity sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ== + +acorn-jsx@^5.0.0: + version "5.3.2" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" + integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== acorn-walk@^8.0.0: - version "8.2.0" - resolved "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz" - integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== + version "8.3.3" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.3.3.tgz#9caeac29eefaa0c41e3d4c65137de4d6f34df43e" + integrity sha512-MxXdReSRhGO7VlFe1bRG/oI7/mdLV9B9JJT0N8vZOhF7gFRR5l3M8W9G8JxmKV+JC5mGqJ0QvqfSOLsCPa4nUw== + dependencies: + acorn "^8.11.0" -acorn@^8.0.4, acorn@^8.7.1, acorn@^8.8.2: - version "8.10.0" - resolved "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz" - integrity sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw== +acorn@^8.0.0, acorn@^8.0.4, acorn@^8.11.0, acorn@^8.7.1, acorn@^8.8.2: + version "8.12.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.12.0.tgz#1627bfa2e058148036133b8d9b51a700663c294c" + integrity sha512-RTvkC4w+KNXrM39/lWCUaG0IbRkWdCv7W/IOW9oU6SawyxulvkQy5HQPVTKxEjczcUvapcrw3cFx/60VN/NRNw== address@^1.0.1, address@^1.1.2: - version "1.2.0" - resolved "https://registry.npmjs.org/address/-/address-1.2.0.tgz" - integrity sha512-tNEZYz5G/zYunxFm7sfhAxkXEuLj3K6BKwv6ZURlsF6yiUQ65z0Q2wZW9L5cPUl9ocofGvXOdFYbFHp0+6MOig== + version "1.2.2" + resolved "https://registry.yarnpkg.com/address/-/address-1.2.2.tgz#2b5248dac5485a6390532c6a517fda2e3faac89e" + integrity sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA== + +agent-base@6: + version "6.0.2" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" + integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== + dependencies: + debug "4" aggregate-error@^3.0.0: version "3.1.0" - resolved "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz" + resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== dependencies: clean-stack "^2.0.0" @@ -3278,26 +2860,26 @@ aggregate-error@^3.0.0: ajv-formats@2.1.1, ajv-formats@^2.1.1: version "2.1.1" - resolved "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz" + resolved "https://registry.yarnpkg.com/ajv-formats/-/ajv-formats-2.1.1.tgz#6e669400659eb74973bbf2e33327180a0996b520" integrity sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA== dependencies: ajv "^8.0.0" ajv-keywords@^3.4.1, ajv-keywords@^3.5.2: version "3.5.2" - resolved "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d" integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== -ajv-keywords@^5.0.0: +ajv-keywords@^5.1.0: version "5.1.0" - resolved "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-5.1.0.tgz#69d4d385a4733cdbeab44964a1170a88f87f0e16" integrity sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw== dependencies: fast-deep-equal "^3.1.3" ajv@8.1.0: version "8.1.0" - resolved "https://registry.npmjs.org/ajv/-/ajv-8.1.0.tgz" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.1.0.tgz#45d5d3d36c7cdd808930cc3e603cf6200dbeb736" integrity sha512-B/Sk2Ix7A36fs/ZkuGLIR86EdjbgR6fsAcbx9lOP/QBSXujDNbVmIS/U4Itz5k8fPFDeVZl/zQ/gJW4Jrq6XjQ== dependencies: fast-deep-equal "^3.1.1" @@ -3305,9 +2887,9 @@ ajv@8.1.0: require-from-string "^2.0.2" uri-js "^4.2.2" -ajv@^6.12.2, ajv@^6.12.4, ajv@^6.12.5: +ajv@^6.12.2, ajv@^6.12.5: version "6.12.6" - resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== dependencies: fast-deep-equal "^3.1.1" @@ -3315,378 +2897,313 @@ ajv@^6.12.2, ajv@^6.12.4, ajv@^6.12.5: json-schema-traverse "^0.4.1" uri-js "^4.2.2" -ajv@^8.0.0, ajv@^8.8.0: - version "8.11.0" - resolved "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz" - integrity sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg== +ajv@^8.0.0, ajv@^8.9.0: + version "8.16.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.16.0.tgz#22e2a92b94f005f7e0f9c9d39652ef0b8f6f0cb4" + integrity sha512-F0twR8U1ZU67JIEtekUcLkXkoO5mMMmgGD8sK/xUFzJ805jxHQl92hImFAqqXMyMYjSPOyUPAwHYhB72g5sTXw== dependencies: - fast-deep-equal "^3.1.1" + fast-deep-equal "^3.1.3" json-schema-traverse "^1.0.0" require-from-string "^2.0.2" - uri-js "^4.2.2" + uri-js "^4.4.1" -algoliasearch-helper@^3.10.0: - version "3.11.1" - resolved "https://registry.npmjs.org/algoliasearch-helper/-/algoliasearch-helper-3.11.1.tgz" - integrity sha512-mvsPN3eK4E0bZG0/WlWJjeqe/bUD2KOEVOl0GyL/TGXn6wcpZU8NOuztGHCUKXkyg5gq6YzUakVTmnmSSO5Yiw== +algoliasearch-helper@^3.13.3: + version "3.21.0" + resolved "https://registry.yarnpkg.com/algoliasearch-helper/-/algoliasearch-helper-3.21.0.tgz#d28fdb61199b5c229714788bfb812376b18aaf28" + integrity sha512-hjVOrL15I3Y3K8xG0icwG1/tWE+MocqBrhW6uVBWpU+/kVEMK0BnM2xdssj6mZM61eJ4iRxHR0djEI3ENOpR8w== dependencies: "@algolia/events" "^4.0.1" -algoliasearch@^4.0.0, algoliasearch@^4.13.1: - version "4.14.2" - resolved "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.14.2.tgz" - integrity sha512-ngbEQonGEmf8dyEh5f+uOIihv4176dgbuOZspiuhmTTBRBuzWu3KCGHre6uHj5YyuC7pNvQGzB6ZNJyZi0z+Sg== +algoliasearch@^4.18.0, algoliasearch@^4.19.1: + version "4.23.3" + resolved "https://registry.yarnpkg.com/algoliasearch/-/algoliasearch-4.23.3.tgz#e09011d0a3b0651444916a3e6bbcba064ec44b60" + integrity sha512-Le/3YgNvjW9zxIQMRhUHuhiUjAlKY/zsdZpfq4dlLqg6mEm0nL6yk+7f2hDOtLpxsgE4jSzDmvHL7nXdBp5feg== dependencies: - "@algolia/cache-browser-local-storage" "4.14.2" - "@algolia/cache-common" "4.14.2" - "@algolia/cache-in-memory" "4.14.2" - "@algolia/client-account" "4.14.2" - "@algolia/client-analytics" "4.14.2" - "@algolia/client-common" "4.14.2" - "@algolia/client-personalization" "4.14.2" - "@algolia/client-search" "4.14.2" - "@algolia/logger-common" "4.14.2" - "@algolia/logger-console" "4.14.2" - "@algolia/requester-browser-xhr" "4.14.2" - "@algolia/requester-common" "4.14.2" - "@algolia/requester-node-http" "4.14.2" - "@algolia/transporter" "4.14.2" + "@algolia/cache-browser-local-storage" "4.23.3" + "@algolia/cache-common" "4.23.3" + "@algolia/cache-in-memory" "4.23.3" + "@algolia/client-account" "4.23.3" + "@algolia/client-analytics" "4.23.3" + "@algolia/client-common" "4.23.3" + "@algolia/client-personalization" "4.23.3" + "@algolia/client-search" "4.23.3" + "@algolia/logger-common" "4.23.3" + "@algolia/logger-console" "4.23.3" + "@algolia/recommend" "4.23.3" + "@algolia/requester-browser-xhr" "4.23.3" + "@algolia/requester-common" "4.23.3" + "@algolia/requester-node-http" "4.23.3" + "@algolia/transporter" "4.23.3" -ansi-align@^3.0.0, ansi-align@^3.0.1: +ansi-align@^3.0.1: version "3.0.1" - resolved "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz" + resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-3.0.1.tgz#0cdf12e111ace773a86e9a1fad1225c43cb19a59" integrity sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w== dependencies: string-width "^4.1.0" ansi-html-community@^0.0.8: version "0.0.8" - resolved "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz" + resolved "https://registry.yarnpkg.com/ansi-html-community/-/ansi-html-community-0.0.8.tgz#69fbc4d6ccbe383f9736934ae34c3f8290f1bf41" integrity sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw== ansi-regex@^5.0.1: version "5.0.1" - resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== ansi-regex@^6.0.1: version "6.0.1" - resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.0.1.tgz#3183e38fae9a65d7cb5e53945cd5897d0260a06a" integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA== ansi-styles@^3.2.1: version "3.2.1" - resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== dependencies: color-convert "^1.9.0" ansi-styles@^4.0.0, ansi-styles@^4.1.0: version "4.3.0" - resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== dependencies: color-convert "^2.0.1" ansi-styles@^6.1.0: - version "6.1.0" - resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.1.0.tgz" - integrity sha512-VbqNsoz55SYGczauuup0MFUyXNQviSpFTj1RQtFzmQLk18qbVSpTFFGMT293rmDaQuKCT6InmbuEyUne4mTuxQ== + version "6.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5" + integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== any-promise@^1.0.0: version "1.3.0" - resolved "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz" + resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f" integrity sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A== anymatch@~3.1.2: - version "3.1.2" - resolved "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz" - integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== + version "3.1.3" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" + integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== dependencies: normalize-path "^3.0.0" picomatch "^2.0.4" arg@^5.0.0, arg@^5.0.2: version "5.0.2" - resolved "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz" + resolved "https://registry.yarnpkg.com/arg/-/arg-5.0.2.tgz#c81433cc427c92c4dcf4865142dbca6f15acd59c" integrity sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg== argparse@^1.0.7: version "1.0.10" - resolved "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== dependencies: sprintf-js "~1.0.2" argparse@^2.0.1: version "2.0.1" - resolved "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== array-flatten@1.1.1: version "1.1.1" - resolved "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz" + resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== -array-flatten@^2.1.2: - version "2.1.2" - resolved "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz" - integrity sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ== - array-union@^2.1.0: version "2.1.0" - resolved "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== -asap@^2.0.0, asap@~2.0.3: - version "2.0.6" - resolved "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz" - integrity sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA== - -asn1.js@^5.2.0: - version "5.4.1" - resolved "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz" - integrity sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA== +asn1.js@^4.10.1: + version "4.10.1" + resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-4.10.1.tgz#b9c2bf5805f1e64aadeed6df3a2bfafb5a73f5a0" + integrity sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw== dependencies: bn.js "^4.0.0" inherits "^2.0.1" minimalistic-assert "^1.0.0" - safer-buffer "^2.1.0" assert@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/assert/-/assert-2.0.0.tgz" - integrity sha512-se5Cd+js9dXJnu6Ag2JFc00t+HmHOen+8Q+L7O9zI0PqQXr20uk2J0XQqMxZEeo5U50o8Nvmmx7dZrl+Ufr35A== + version "2.1.0" + resolved "https://registry.yarnpkg.com/assert/-/assert-2.1.0.tgz#6d92a238d05dc02e7427c881fb8be81c8448b2dd" + integrity sha512-eLHpSK/Y4nhMJ07gDaAzoX/XAKS8PSaojml3M0DM4JpV1LAi5JOJ/p6H/XWrl8L+DzVEvVCW1z3vWAaB9oTsQw== dependencies: - es6-object-assign "^1.1.0" - is-nan "^1.2.1" - object-is "^1.0.1" - util "^0.12.0" + call-bind "^1.0.2" + is-nan "^1.3.2" + object-is "^1.1.5" + object.assign "^4.1.4" + util "^0.12.5" + +astring@^1.8.0: + version "1.8.6" + resolved "https://registry.yarnpkg.com/astring/-/astring-1.8.6.tgz#2c9c157cf1739d67561c56ba896e6948f6b93731" + integrity sha512-ISvCdHdlTDlH5IpxQJIex7BWBywFWgjJSVdwst+/iQCoEYnyOaQ95+X1JGshuBjGp6nxKUy1jMgE3zPqN7fQdg== async@3.2.1: version "3.2.1" - resolved "https://registry.npmjs.org/async/-/async-3.2.1.tgz" + resolved "https://registry.yarnpkg.com/async/-/async-3.2.1.tgz#d3274ec66d107a47476a4c49136aacdb00665fc8" integrity sha512-XdD5lRO/87udXCMC9meWdYiR+Nq6ZjUfXidViUZGu2F1MO4T3XwZ1et0hb2++BgLfhyJwy44BGB/yx80ABx8hg== async@^3.2.4: - version "3.2.4" - resolved "https://registry.npmjs.org/async/-/async-3.2.4.tgz" - integrity sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ== - -asynckit@^0.4.0: - version "0.4.0" - resolved "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz" - integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== + version "3.2.5" + resolved "https://registry.yarnpkg.com/async/-/async-3.2.5.tgz#ebd52a8fdaf7a2289a24df399f8d8485c8a46b66" + integrity sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg== at-least-node@^1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz" + resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== -autoprefixer@^10.4.12, autoprefixer@^10.4.13, autoprefixer@^10.4.7: - version "10.4.14" - resolved "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.14.tgz" - integrity sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ== +autoprefixer@^10.4.13, autoprefixer@^10.4.14, autoprefixer@^10.4.19: + version "10.4.19" + resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.19.tgz#ad25a856e82ee9d7898c59583c1afeb3fa65f89f" + integrity sha512-BaENR2+zBZ8xXhM4pUaKUxlVdxZ0EZhjvbopwnXmxRUfqDmwSpC2lAi/QXvx7NRdPCo1WKEcEF6mV64si1z4Ew== dependencies: - browserslist "^4.21.5" - caniuse-lite "^1.0.30001464" - fraction.js "^4.2.0" + browserslist "^4.23.0" + caniuse-lite "^1.0.30001599" + fraction.js "^4.3.7" normalize-range "^0.1.2" picocolors "^1.0.0" postcss-value-parser "^4.2.0" -available-typed-arrays@^1.0.5: - version "1.0.5" - resolved "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz" - integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw== +available-typed-arrays@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz#a5cc375d6a03c2efc87a553f3e0b1522def14846" + integrity sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ== + dependencies: + possible-typed-array-names "^1.0.0" axios@^0.25.0: version "0.25.0" - resolved "https://registry.npmjs.org/axios/-/axios-0.25.0.tgz" + resolved "https://registry.yarnpkg.com/axios/-/axios-0.25.0.tgz#349cfbb31331a9b4453190791760a8d35b093e0a" integrity sha512-cD8FOb0tRH3uuEe6+evtAbgJtfxr7ly3fQjYcMcuPlgkwVS9xboaVIpcDV+cYQe+yGykgwZCs1pzjntcGa6l5g== dependencies: follow-redirects "^1.14.7" -babel-loader@^8.2.5: - version "8.2.5" - resolved "https://registry.npmjs.org/babel-loader/-/babel-loader-8.2.5.tgz" - integrity sha512-OSiFfH89LrEMiWd4pLNqGz4CwJDtbs2ZVc+iGu2HrkRfPxId9F2anQj38IxWpmRfsUY0aBZYi1EFcd3mhtRMLQ== +babel-loader@^9.1.3: + version "9.1.3" + resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-9.1.3.tgz#3d0e01b4e69760cc694ee306fe16d358aa1c6f9a" + integrity sha512-xG3ST4DglodGf8qSwv0MdeWLhrDsw/32QMdTO5T1ZIp9gQur0HkCyFs7Awskr10JKXFXwpAhiCuYX5oGXnRGbw== dependencies: - find-cache-dir "^3.3.1" - loader-utils "^2.0.0" - make-dir "^3.1.0" - schema-utils "^2.6.5" - -babel-plugin-apply-mdx-type-prop@1.6.22: - version "1.6.22" - resolved "https://registry.npmjs.org/babel-plugin-apply-mdx-type-prop/-/babel-plugin-apply-mdx-type-prop-1.6.22.tgz" - integrity sha512-VefL+8o+F/DfK24lPZMtJctrCVOfgbqLAGZSkxwhazQv4VxPg3Za/i40fu22KR2m8eEda+IfSOlPLUSIiLcnCQ== - dependencies: - "@babel/helper-plugin-utils" "7.10.4" - "@mdx-js/util" "1.6.22" + find-cache-dir "^4.0.0" + schema-utils "^4.0.0" babel-plugin-dynamic-import-node@^2.3.3: version "2.3.3" - resolved "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz" + resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz#84fda19c976ec5c6defef57f9427b3def66e17a3" integrity sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ== dependencies: object.assign "^4.1.0" -babel-plugin-extract-import-names@1.6.22: - version "1.6.22" - resolved "https://registry.npmjs.org/babel-plugin-extract-import-names/-/babel-plugin-extract-import-names-1.6.22.tgz" - integrity sha512-yJ9BsJaISua7d8zNT7oRG1ZLBJCIdZ4PZqmH8qa9N5AK01ifk3fnkc98AXhtzE7UkfCsEumvoQWgoYLhOnJ7jQ== - dependencies: - "@babel/helper-plugin-utils" "7.10.4" - -babel-plugin-polyfill-corejs2@^0.3.3: - version "0.3.3" - resolved "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.3.tgz" - integrity sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q== - dependencies: - "@babel/compat-data" "^7.17.7" - "@babel/helper-define-polyfill-provider" "^0.3.3" - semver "^6.1.1" - -babel-plugin-polyfill-corejs2@^0.4.5: - version "0.4.5" - resolved "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.5.tgz" - integrity sha512-19hwUH5FKl49JEsvyTcoHakh6BE0wgXLLptIyKZ3PijHc/Ci521wygORCUCCred+E/twuqRyAkE02BAWPmsHOg== +babel-plugin-polyfill-corejs2@^0.4.10: + version "0.4.11" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.11.tgz#30320dfe3ffe1a336c15afdcdafd6fd615b25e33" + integrity sha512-sMEJ27L0gRHShOh5G54uAAPaiCOygY/5ratXuiyb2G46FmlSpc9eFCzYVyDiPxfNbwzA7mYahmjQc5q+CZQ09Q== dependencies: "@babel/compat-data" "^7.22.6" - "@babel/helper-define-polyfill-provider" "^0.4.2" + "@babel/helper-define-polyfill-provider" "^0.6.2" semver "^6.3.1" -babel-plugin-polyfill-corejs3@^0.6.0: - version "0.6.0" - resolved "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.6.0.tgz" - integrity sha512-+eHqR6OPcBhJOGgsIar7xoAB1GcSwVUA3XjAd7HJNzOXT4wv6/H7KIdA/Nc60cvUlDbKApmqNvD1B1bzOt4nyA== +babel-plugin-polyfill-corejs3@^0.10.1, babel-plugin-polyfill-corejs3@^0.10.4: + version "0.10.4" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.4.tgz#789ac82405ad664c20476d0233b485281deb9c77" + integrity sha512-25J6I8NGfa5YkCDogHRID3fVCadIR8/pGl1/spvCkzb6lVn6SR3ojpx9nOn9iEBcUsjY24AmdKm5khcfKdylcg== dependencies: - "@babel/helper-define-polyfill-provider" "^0.3.3" - core-js-compat "^3.25.1" + "@babel/helper-define-polyfill-provider" "^0.6.1" + core-js-compat "^3.36.1" -babel-plugin-polyfill-corejs3@^0.8.3: - version "0.8.3" - resolved "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.3.tgz" - integrity sha512-z41XaniZL26WLrvjy7soabMXrfPWARN25PZoriDEiLMxAp50AUW3t35BGQUMg5xK3UrpVTtagIDklxYa+MhiNA== +babel-plugin-polyfill-regenerator@^0.6.1: + version "0.6.2" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.2.tgz#addc47e240edd1da1058ebda03021f382bba785e" + integrity sha512-2R25rQZWP63nGwaAswvDazbPXfrM3HwVoBXK6HcqeKrSrL/JqcC/rDcf95l4r7LXLyxDXc8uQDa064GubtCABg== dependencies: - "@babel/helper-define-polyfill-provider" "^0.4.2" - core-js-compat "^3.31.0" - -babel-plugin-polyfill-regenerator@^0.4.1: - version "0.4.1" - resolved "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.4.1.tgz" - integrity sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw== - dependencies: - "@babel/helper-define-polyfill-provider" "^0.3.3" - -babel-plugin-polyfill-regenerator@^0.5.2: - version "0.5.2" - resolved "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.2.tgz" - integrity sha512-tAlOptU0Xj34V1Y2PNTL4Y0FOJMDB6bZmoW39FeCQIhigGLkqu3Fj6uiXpxIf6Ij274ENdYx64y6Au+ZKlb1IA== - dependencies: - "@babel/helper-define-polyfill-provider" "^0.4.2" - -bail@^1.0.0: - version "1.0.5" - resolved "https://registry.npmjs.org/bail/-/bail-1.0.5.tgz" - integrity sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ== + "@babel/helper-define-polyfill-provider" "^0.6.2" bail@^2.0.0: version "2.0.2" - resolved "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz" + resolved "https://registry.yarnpkg.com/bail/-/bail-2.0.2.tgz#d26f5cd8fe5d6f832a31517b9f7c356040ba6d5d" integrity sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw== balanced-match@^1.0.0: version "1.0.2" - resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== -base16@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/base16/-/base16-1.0.0.tgz" - integrity sha512-pNdYkNPiJUnEhnfXV56+sQy8+AaPcG3POZAUnwr4EeqCUZFz4u2PePbo3e5Gj4ziYPCWGUZT9RHisvJKnwFuBQ== - base64-js@^1.3.1: version "1.5.1" - resolved "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== batch@0.6.1: version "0.6.1" - resolved "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz" + resolved "https://registry.yarnpkg.com/batch/-/batch-0.6.1.tgz#dc34314f4e679318093fc760272525f94bf25c16" integrity sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw== big.js@^5.2.2: version "5.2.2" - resolved "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz" + resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== binary-extensions@^2.0.0: - version "2.2.0" - resolved "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz" - integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== + version "2.3.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.3.0.tgz#f6e14a97858d327252200242d4ccfe522c445522" + integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw== + +bl@^4.0.3: + version "4.1.0" + resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" + integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== + dependencies: + buffer "^5.5.0" + inherits "^2.0.4" + readable-stream "^3.4.0" bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.11.9: version "4.12.0" - resolved "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== -bn.js@^5.0.0, bn.js@^5.1.1: +bn.js@^5.0.0, bn.js@^5.2.1: version "5.2.1" - resolved "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.1.tgz#0bc527a6a0d18d0aa8d5b0538ce4a77dccfa7b70" integrity sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ== -body-parser@1.20.0: - version "1.20.0" - resolved "https://registry.npmjs.org/body-parser/-/body-parser-1.20.0.tgz" - integrity sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg== +body-parser@1.20.2: + version "1.20.2" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.2.tgz#6feb0e21c4724d06de7ff38da36dad4f57a747fd" + integrity sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA== dependencies: bytes "3.1.2" - content-type "~1.0.4" + content-type "~1.0.5" debug "2.6.9" depd "2.0.0" destroy "1.2.0" http-errors "2.0.0" iconv-lite "0.4.24" on-finished "2.4.1" - qs "6.10.3" - raw-body "2.5.1" + qs "6.11.0" + raw-body "2.5.2" type-is "~1.6.18" unpipe "1.0.0" bonjour-service@^1.0.11: - version "1.0.12" - resolved "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.0.12.tgz" - integrity sha512-pMmguXYCu63Ug37DluMKEHdxc+aaIf/ay4YbF8Gxtba+9d3u+rmEWy61VK3Z3hp8Rskok3BunHYnG0dUHAsblw== + version "1.2.1" + resolved "https://registry.yarnpkg.com/bonjour-service/-/bonjour-service-1.2.1.tgz#eb41b3085183df3321da1264719fbada12478d02" + integrity sha512-oSzCS2zV14bh2kji6vNe7vrpJYCHGvcZnlffFQ1MEoX/WOeQ/teD8SYWKR942OI3INjq8OMNJlbPK5LLLUxFDw== dependencies: - array-flatten "^2.1.2" - dns-equal "^1.0.0" fast-deep-equal "^3.1.3" - multicast-dns "^7.2.4" + multicast-dns "^7.2.5" boolbase@^1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz" + resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" integrity sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww== -boxen@^5.0.0: - version "5.1.2" - resolved "https://registry.npmjs.org/boxen/-/boxen-5.1.2.tgz" - integrity sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ== - dependencies: - ansi-align "^3.0.0" - camelcase "^6.2.0" - chalk "^4.1.0" - cli-boxes "^2.2.1" - string-width "^4.2.2" - type-fest "^0.20.2" - widest-line "^3.1.0" - wrap-ansi "^7.0.0" - boxen@^6.2.1: version "6.2.1" - resolved "https://registry.npmjs.org/boxen/-/boxen-6.2.1.tgz" + resolved "https://registry.yarnpkg.com/boxen/-/boxen-6.2.1.tgz#b098a2278b2cd2845deef2dff2efc38d329b434d" integrity sha512-H4PEsJXfFI/Pt8sjDWbHlQPx4zL/bvSQjcilJmaulGt5mLDorHOHpmdXAJcBcmru7PhYSp/cDMWRko4ZUMFkSw== dependencies: ansi-align "^3.0.1" @@ -3698,9 +3215,23 @@ boxen@^6.2.1: widest-line "^4.0.1" wrap-ansi "^8.0.1" +boxen@^7.0.0: + version "7.1.1" + resolved "https://registry.yarnpkg.com/boxen/-/boxen-7.1.1.tgz#f9ba525413c2fec9cdb88987d835c4f7cad9c8f4" + integrity sha512-2hCgjEmP8YLWQ130n2FerGv7rYpfBmnmp9Uy2Le1vge6X3gZIfSmEzP5QTDElFxcvVcXlEn8Aq6MU/PZygIOog== + dependencies: + ansi-align "^3.0.1" + camelcase "^7.0.1" + chalk "^5.2.0" + cli-boxes "^3.0.0" + string-width "^5.1.2" + type-fest "^2.13.0" + widest-line "^4.0.1" + wrap-ansi "^8.1.0" + brace-expansion@^1.1.7: version "1.1.11" - resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== dependencies: balanced-match "^1.0.0" @@ -3708,26 +3239,26 @@ brace-expansion@^1.1.7: brace-expansion@^2.0.1: version "2.0.1" - resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== dependencies: balanced-match "^1.0.0" -braces@^3.0.2, braces@~3.0.2: - version "3.0.2" - resolved "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz" - integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== +braces@^3.0.3, braces@~3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789" + integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== dependencies: - fill-range "^7.0.1" + fill-range "^7.1.1" brorand@^1.0.1, brorand@^1.1.0: version "1.1.0" - resolved "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz" + resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" integrity sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w== -browserify-aes@^1.0.0, browserify-aes@^1.0.4: +browserify-aes@^1.0.4, browserify-aes@^1.2.0: version "1.2.0" - resolved "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz" + resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA== dependencies: buffer-xor "^1.0.3" @@ -3739,7 +3270,7 @@ browserify-aes@^1.0.0, browserify-aes@^1.0.4: browserify-cipher@^1.0.0: version "1.0.1" - resolved "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz" + resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0" integrity sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w== dependencies: browserify-aes "^1.0.4" @@ -3748,7 +3279,7 @@ browserify-cipher@^1.0.0: browserify-des@^1.0.0: version "1.0.2" - resolved "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz" + resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.2.tgz#3af4f1f59839403572f1c66204375f7a7f703e9c" integrity sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A== dependencies: cipher-base "^1.0.1" @@ -3756,59 +3287,73 @@ browserify-des@^1.0.0: inherits "^2.0.1" safe-buffer "^5.1.2" -browserify-rsa@^4.0.0, browserify-rsa@^4.0.1: +browserify-rsa@^4.0.0, browserify-rsa@^4.1.0: version "4.1.0" - resolved "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz" + resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.1.0.tgz#b2fd06b5b75ae297f7ce2dc651f918f5be158c8d" integrity sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog== dependencies: bn.js "^5.0.0" randombytes "^2.0.1" browserify-sign@^4.0.0: - version "4.2.1" - resolved "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz" - integrity sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg== + version "4.2.3" + resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.2.3.tgz#7afe4c01ec7ee59a89a558a4b75bd85ae62d4208" + integrity sha512-JWCZW6SKhfhjJxO8Tyiiy+XYB7cqd2S5/+WeYHsKdNKFlCBhKbblba1A/HN/90YwtxKc8tCErjffZl++UNmGiw== dependencies: - bn.js "^5.1.1" - browserify-rsa "^4.0.1" + bn.js "^5.2.1" + browserify-rsa "^4.1.0" create-hash "^1.2.0" create-hmac "^1.1.7" - elliptic "^6.5.3" + elliptic "^6.5.5" + hash-base "~3.0" inherits "^2.0.4" - parse-asn1 "^5.1.5" - readable-stream "^3.6.0" - safe-buffer "^5.2.0" + parse-asn1 "^5.1.7" + readable-stream "^2.3.8" + safe-buffer "^5.2.1" browserify-zlib@^0.2.0: version "0.2.0" - resolved "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz" + resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.2.0.tgz#2869459d9aa3be245fe8fe2ca1f46e2e7f54d73f" integrity sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA== dependencies: pako "~1.0.5" -browserslist@^4.0.0, browserslist@^4.14.5, browserslist@^4.16.6, browserslist@^4.18.1, browserslist@^4.21.10, browserslist@^4.21.4, browserslist@^4.21.5, browserslist@^4.21.9: - version "4.21.10" - resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.21.10.tgz" - integrity sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ== +browserslist@^4.0.0, browserslist@^4.18.1, browserslist@^4.21.10, browserslist@^4.22.2, browserslist@^4.23.0: + version "4.23.1" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.23.1.tgz#ce4af0534b3d37db5c1a4ca98b9080f985041e96" + integrity sha512-TUfofFo/KsK/bWZ9TWQ5O26tsWW4Uhmt8IYklbnUa70udB6P2wA7w7o4PY4muaEPBQaAX+CEnmmIA41NVHtPVw== dependencies: - caniuse-lite "^1.0.30001517" - electron-to-chromium "^1.4.477" - node-releases "^2.0.13" - update-browserslist-db "^1.0.11" + caniuse-lite "^1.0.30001629" + electron-to-chromium "^1.4.796" + node-releases "^2.0.14" + update-browserslist-db "^1.0.16" + +buffer-crc32@~0.2.3: + version "0.2.13" + resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" + integrity sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ== buffer-from@^1.0.0: version "1.1.2" - resolved "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== buffer-xor@^1.0.3: version "1.0.3" - resolved "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz" + resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" integrity sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ== +buffer@^5.2.1, buffer@^5.5.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" + integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.1.13" + buffer@^6.0.3: version "6.0.3" - resolved "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.3.tgz#2ace578459cc8fbe2a70aaa8f52ee63b6a74c6c6" integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA== dependencies: base64-js "^1.3.1" @@ -3816,76 +3361,89 @@ buffer@^6.0.3: builtin-status-codes@^3.0.0: version "3.0.0" - resolved "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz" + resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" integrity sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ== bytes@3.0.0: version "3.0.0" - resolved "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" integrity sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw== bytes@3.1.2: version "3.1.2" - resolved "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== -cacheable-request@^6.0.0: - version "6.1.0" - resolved "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz" - integrity sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg== - dependencies: - clone-response "^1.0.2" - get-stream "^5.1.0" - http-cache-semantics "^4.0.0" - keyv "^3.0.0" - lowercase-keys "^2.0.0" - normalize-url "^4.1.0" - responselike "^1.0.2" +cacheable-lookup@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz#3476a8215d046e5a3202a9209dd13fec1f933a27" + integrity sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w== -call-bind@^1.0.0, call-bind@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz" - integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== +cacheable-request@^10.2.8: + version "10.2.14" + resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-10.2.14.tgz#eb915b665fda41b79652782df3f553449c406b9d" + integrity sha512-zkDT5WAF4hSSoUgyfg5tFIxz8XQK+25W/TLVojJTMKBaxevLBBtLxgqguAuVQB8PVW79FVjHcU+GJ9tVbDZ9mQ== dependencies: - function-bind "^1.1.1" - get-intrinsic "^1.0.2" + "@types/http-cache-semantics" "^4.0.2" + get-stream "^6.0.1" + http-cache-semantics "^4.1.1" + keyv "^4.5.3" + mimic-response "^4.0.0" + normalize-url "^8.0.0" + responselike "^3.0.0" + +call-bind@^1.0.0, call-bind@^1.0.2, call-bind@^1.0.5, call-bind@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.7.tgz#06016599c40c56498c18769d2730be242b6fa3b9" + integrity sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w== + dependencies: + es-define-property "^1.0.0" + es-errors "^1.3.0" + function-bind "^1.1.2" + get-intrinsic "^1.2.4" + set-function-length "^1.2.1" call-me-maybe@^1.0.1: version "1.0.2" - resolved "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.2.tgz" + resolved "https://registry.yarnpkg.com/call-me-maybe/-/call-me-maybe-1.0.2.tgz#03f964f19522ba643b1b0693acb9152fe2074baa" integrity sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ== callsites@^3.0.0: version "3.1.0" - resolved "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== camel-case@^4.1.2: version "4.1.2" - resolved "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz" + resolved "https://registry.yarnpkg.com/camel-case/-/camel-case-4.1.2.tgz#9728072a954f805228225a6deea6b38461e1bd5a" integrity sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw== dependencies: pascal-case "^3.1.2" tslib "^2.0.3" -camelcase-css@2.0.1, camelcase-css@^2.0.1: +camelcase-css@^2.0.1: version "2.0.1" - resolved "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz" + resolved "https://registry.yarnpkg.com/camelcase-css/-/camelcase-css-2.0.1.tgz#ee978f6947914cc30c6b44741b6ed1df7f043fd5" integrity sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA== camelcase@^5.0.0: version "5.3.1" - resolved "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== camelcase@^6.2.0: version "6.3.0" - resolved "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== +camelcase@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-7.0.1.tgz#f02e50af9fd7782bc8b88a3558c32fd3a388f048" + integrity sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw== + caniuse-api@^3.0.0: version "3.0.0" - resolved "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz" + resolved "https://registry.yarnpkg.com/caniuse-api/-/caniuse-api-3.0.0.tgz#5e4d90e2274961d46291997df599e3ed008ee4c0" integrity sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw== dependencies: browserslist "^4.0.0" @@ -3893,19 +3451,19 @@ caniuse-api@^3.0.0: lodash.memoize "^4.1.2" lodash.uniq "^4.5.0" -caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001464, caniuse-lite@^1.0.30001517: - version "1.0.30001632" - resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001632.tgz" - integrity sha512-udx3o7yHJfUxMLkGohMlVHCvFvWmirKh9JAH/d7WOLPetlH+LTL5cocMZ0t7oZx/mdlOWXti97xLZWc8uURRHg== +caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001599, caniuse-lite@^1.0.30001629: + version "1.0.30001636" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001636.tgz#b15f52d2bdb95fad32c2f53c0b68032b85188a78" + integrity sha512-bMg2vmr8XBsbL6Lr0UHXy/21m84FTxDLWn2FSqMd5PrlbMxwJlQnC2YWYxVgp66PZE+BBNF2jYQUBKCo1FDeZg== -ccount@^1.0.0: - version "1.1.0" - resolved "https://registry.npmjs.org/ccount/-/ccount-1.1.0.tgz" - integrity sha512-vlNK021QdI7PNeiUh/lKkC/mNHHfV0m/Ad5JoI0TYtlBnJAslM/JIkm/tGC88bkLIwO6OQ5uV6ztS6kVAtCDlg== +ccount@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/ccount/-/ccount-2.0.1.tgz#17a3bf82302e0870d6da43a01311a8bc02a3ecf5" + integrity sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg== chalk@^2.4.2: version "2.4.2" - resolved "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== dependencies: ansi-styles "^3.2.1" @@ -3914,40 +3472,50 @@ chalk@^2.4.2: chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.2: version "4.1.2" - resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== dependencies: ansi-styles "^4.1.0" supports-color "^7.1.0" -character-entities-legacy@^1.0.0: - version "1.1.4" - resolved "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz" - integrity sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA== +chalk@^5.0.1, chalk@^5.2.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-5.3.0.tgz#67c20a7ebef70e7f3970a01f90fa210cb6860385" + integrity sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w== -character-entities@^1.0.0: - version "1.2.4" - resolved "https://registry.npmjs.org/character-entities/-/character-entities-1.2.4.tgz" - integrity sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw== +char-regex@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf" + integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw== + +character-entities-html4@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/character-entities-html4/-/character-entities-html4-2.1.0.tgz#1f1adb940c971a4b22ba39ddca6b618dc6e56b2b" + integrity sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA== + +character-entities-legacy@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz#76bc83a90738901d7bc223a9e93759fdd560125b" + integrity sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ== character-entities@^2.0.0: version "2.0.2" - resolved "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz" + resolved "https://registry.yarnpkg.com/character-entities/-/character-entities-2.0.2.tgz#2d09c2e72cd9523076ccb21157dff66ad43fcc22" integrity sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ== -character-reference-invalid@^1.0.0: - version "1.1.4" - resolved "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz" - integrity sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg== +character-reference-invalid@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz#85c66b041e43b47210faf401278abf808ac45cb9" + integrity sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw== charset@^1.0.0: version "1.0.1" - resolved "https://registry.npmjs.org/charset/-/charset-1.0.1.tgz" + resolved "https://registry.yarnpkg.com/charset/-/charset-1.0.1.tgz#8d59546c355be61049a8fa9164747793319852bd" integrity sha512-6dVyOOYjpfFcL1Y4qChrAoQLRHvj2ziyhcm0QJlhOcAhykL/k1kTUPbeo+87MNRTRdk2OIIsIXbuF3x2wi5EXg== cheerio-select@^2.1.0: version "2.1.0" - resolved "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz" + resolved "https://registry.yarnpkg.com/cheerio-select/-/cheerio-select-2.1.0.tgz#4d8673286b8126ca2a8e42740d5e3c4884ae21b4" integrity sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g== dependencies: boolbase "^1.0.0" @@ -3959,7 +3527,7 @@ cheerio-select@^2.1.0: cheerio@^1.0.0-rc.12: version "1.0.0-rc.12" - resolved "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.12.tgz" + resolved "https://registry.yarnpkg.com/cheerio/-/cheerio-1.0.0-rc.12.tgz#788bf7466506b1c6bf5fae51d24a2c4d62e47683" integrity sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q== dependencies: cheerio-select "^2.1.0" @@ -3970,10 +3538,10 @@ cheerio@^1.0.0-rc.12: parse5 "^7.0.0" parse5-htmlparser2-tree-adapter "^7.0.0" -chokidar@^3.4.2, chokidar@^3.5.3: - version "3.5.3" - resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz" - integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== +"chokidar@>=3.0.0 <4.0.0", chokidar@^3.4.2, chokidar@^3.5.3: + version "3.6.0" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b" + integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw== dependencies: anymatch "~3.1.2" braces "~3.0.2" @@ -3985,55 +3553,50 @@ chokidar@^3.4.2, chokidar@^3.5.3: optionalDependencies: fsevents "~2.3.2" -chrome-trace-event@^1.0.2: - version "1.0.3" - resolved "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz" - integrity sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg== +chownr@^1.1.1: + version "1.1.4" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" + integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== -ci-info@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz" - integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== +chrome-trace-event@^1.0.2: + version "1.0.4" + resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz#05bffd7ff928465093314708c93bdfa9bd1f0f5b" + integrity sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ== ci-info@^3.2.0: - version "3.5.0" - resolved "https://registry.npmjs.org/ci-info/-/ci-info-3.5.0.tgz" - integrity sha512-yH4RezKOGlOhxkmhbeNuC4eYZKAUsEaGtBuBzDDP1eFUKiccDWzBABxBfOx31IDwDIXMTxWuwAxUGModvkbuVw== + version "3.9.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.9.0.tgz#4279a62028a7b1f262f3473fc9605f5e218c59b4" + integrity sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ== cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: version "1.0.4" - resolved "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz" + resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" integrity sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q== dependencies: inherits "^2.0.1" safe-buffer "^5.0.1" -clean-css@^5.2.2, clean-css@^5.3.0: - version "5.3.0" - resolved "https://registry.npmjs.org/clean-css/-/clean-css-5.3.0.tgz" - integrity sha512-YYuuxv4H/iNb1Z/5IbMRoxgrzjWGhOEFfd+groZ5dMCVkpENiMZmwspdrzBo9286JjM1gZJPAyL7ZIdzuvu2AQ== +clean-css@^5.2.2, clean-css@^5.3.2, clean-css@~5.3.2: + version "5.3.3" + resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-5.3.3.tgz#b330653cd3bd6b75009cc25c714cae7b93351ccd" + integrity sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg== dependencies: source-map "~0.6.0" clean-stack@^2.0.0: version "2.2.0" - resolved "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz" + resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== -cli-boxes@^2.2.1: - version "2.2.1" - resolved "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz" - integrity sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw== - cli-boxes@^3.0.0: version "3.0.0" - resolved "https://registry.npmjs.org/cli-boxes/-/cli-boxes-3.0.0.tgz" + resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-3.0.0.tgz#71a10c716feeba005e4504f36329ef0b17cf3145" integrity sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g== -cli-table3@^0.6.2: - version "0.6.2" - resolved "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.2.tgz" - integrity sha512-QyavHCaIC80cMivimWu4aWHilIpiDpfm3hGmqAmXVL1UsnbLuBSMd21hTX6VY4ZSDSM73ESLeF8TOYId3rBTbw== +cli-table3@^0.6.3: + version "0.6.5" + resolved "https://registry.yarnpkg.com/cli-table3/-/cli-table3-0.6.5.tgz#013b91351762739c16a9567c21a04632e449bf2f" + integrity sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ== dependencies: string-width "^4.2.0" optionalDependencies: @@ -4041,12 +3604,12 @@ cli-table3@^0.6.2: client-only@^0.0.1: version "0.0.1" - resolved "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz" + resolved "https://registry.yarnpkg.com/client-only/-/client-only-0.0.1.tgz#38bba5d403c41ab150bff64a95c85013cf73bca1" integrity sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA== cliui@^6.0.0: version "6.0.0" - resolved "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-6.0.0.tgz#511d702c0c4e41ca156d7d0e96021f23e13225b1" integrity sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ== dependencies: string-width "^4.2.0" @@ -4055,7 +3618,7 @@ cliui@^6.0.0: cliui@^8.0.1: version "8.0.1" - resolved "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== dependencies: string-width "^4.2.0" @@ -4064,136 +3627,122 @@ cliui@^8.0.1: clone-deep@^4.0.1: version "4.0.1" - resolved "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz" + resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-4.0.1.tgz#c19fd9bdbbf85942b4fd979c84dcf7d5f07c2387" integrity sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ== dependencies: is-plain-object "^2.0.4" kind-of "^6.0.2" shallow-clone "^3.0.0" -clone-response@^1.0.2: - version "1.0.3" - resolved "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz" - integrity sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA== - dependencies: - mimic-response "^1.0.0" - clsx@^1.1.1, clsx@^1.2.1: version "1.2.1" - resolved "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz" + resolved "https://registry.yarnpkg.com/clsx/-/clsx-1.2.1.tgz#0ddc4a20a549b59c93a4116bb26f5294ca17dc12" integrity sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg== -collapse-white-space@^1.0.2: - version "1.0.6" - resolved "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-1.0.6.tgz" - integrity sha512-jEovNnrhMuqyCcjfEJA56v0Xq8SkIoPKDyaHahwo3POf4qcSXqMYuwNcOTzp74vTsR9Tn08z4MxWqAhcekogkQ== +clsx@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/clsx/-/clsx-2.1.1.tgz#eed397c9fd8bd882bfb18deab7102049a2f32999" + integrity sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA== + +collapse-white-space@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/collapse-white-space/-/collapse-white-space-2.1.0.tgz#640257174f9f42c740b40f3b55ee752924feefca" + integrity sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw== color-convert@^1.9.0: version "1.9.3" - resolved "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== dependencies: color-name "1.1.3" color-convert@^2.0.1: version "2.0.1" - resolved "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== dependencies: color-name "~1.1.4" color-name@1.1.3: version "1.1.3" - resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== -color-name@^1.1.4, color-name@~1.1.4: +color-name@~1.1.4: version "1.1.4" - resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== -colord@^2.9.1: - version "2.9.2" - resolved "https://registry.npmjs.org/colord/-/colord-2.9.2.tgz" - integrity sha512-Uqbg+J445nc1TKn4FoDPS6ZZqAvEDnwrH42yo8B40JSOgSLxMZ/gt3h4nmCtPLQeXhjJJkqBx7SCY35WnIixaQ== +colord@^2.9.3: + version "2.9.3" + resolved "https://registry.yarnpkg.com/colord/-/colord-2.9.3.tgz#4f8ce919de456f1d5c1c368c307fe20f3e59fb43" + integrity sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw== colorette@^1.2.0: version "1.4.0" - resolved "https://registry.npmjs.org/colorette/-/colorette-1.4.0.tgz" + resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.4.0.tgz#5190fbb87276259a86ad700bff2c6d6faa3fca40" integrity sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g== colorette@^2.0.10: version "2.0.20" - resolved "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz" + resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.20.tgz#9eb793e6833067f7235902fcd3b09917a000a95a" integrity sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w== combine-promises@^1.1.0: - version "1.1.0" - resolved "https://registry.npmjs.org/combine-promises/-/combine-promises-1.1.0.tgz" - integrity sha512-ZI9jvcLDxqwaXEixOhArm3r7ReIivsXkpbyEWyeOhzz1QS0iSgBPnWvEqvIQtYyamGCYA88gFhmUrs9hrrQ0pg== - -combined-stream@^1.0.8: - version "1.0.8" - resolved "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz" - integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== - dependencies: - delayed-stream "~1.0.0" - -comma-separated-tokens@^1.0.0: - version "1.0.8" - resolved "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-1.0.8.tgz" - integrity sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw== + version "1.2.0" + resolved "https://registry.yarnpkg.com/combine-promises/-/combine-promises-1.2.0.tgz#5f2e68451862acf85761ded4d9e2af7769c2ca6a" + integrity sha512-VcQB1ziGD0NXrhKxiwyNbCDmRzs/OShMs2GqW2DlU2A/Sd0nQxE1oWDAE5O0ygSx5mgQOn9eIFh7yKPgFRVkPQ== comma-separated-tokens@^2.0.0: version "2.0.3" - resolved "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz" + resolved "https://registry.yarnpkg.com/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz#4e89c9458acb61bc8fef19f4529973b2392839ee" integrity sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg== commander@2.20.3, commander@^2.20.0: version "2.20.3" - resolved "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== -commander@^4.0.0, commander@~4.1.1: +commander@7, commander@^7.2.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7" + integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== + +commander@^10.0.0: + version "10.0.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-10.0.1.tgz#881ee46b4f77d1c1dccc5823433aa39b022cbe06" + integrity sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug== + +commander@^4.0.0: version "4.1.1" - resolved "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz" + resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068" integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA== commander@^5.1.0: version "5.1.0" - resolved "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz" + resolved "https://registry.yarnpkg.com/commander/-/commander-5.1.0.tgz#46abbd1652f8e059bddaef99bbdcb2ad9cf179ae" integrity sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg== -commander@^7.2.0: - version "7.2.0" - resolved "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz" - integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== - commander@^8.3.0: version "8.3.0" - resolved "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz" + resolved "https://registry.yarnpkg.com/commander/-/commander-8.3.0.tgz#4837ea1b2da67b9c616a67afbb0fafee567bca66" integrity sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww== -commondir@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz" - integrity sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg== - -component-emitter@^1.3.0: - version "1.3.0" - resolved "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz" - integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== +common-path-prefix@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/common-path-prefix/-/common-path-prefix-3.0.0.tgz#7d007a7e07c58c4b4d5f433131a19141b29f11e0" + integrity sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w== compressible@~2.0.16: version "2.0.18" - resolved "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz" + resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.18.tgz#af53cca6b070d4c3c0750fbd77286a6d7cc46fba" integrity sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg== dependencies: mime-db ">= 1.43.0 < 2" compression@^1.7.4: version "1.7.4" - resolved "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz" + resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.4.tgz#95523eff170ca57c29a0ca41e6fe131f41e5bb8f" integrity sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ== dependencies: accepts "~1.3.5" @@ -4206,7 +3755,7 @@ compression@^1.7.4: compute-gcd@^1.2.1: version "1.2.1" - resolved "https://registry.npmjs.org/compute-gcd/-/compute-gcd-1.2.1.tgz" + resolved "https://registry.yarnpkg.com/compute-gcd/-/compute-gcd-1.2.1.tgz#34d639f3825625e1357ce81f0e456a6249d8c77f" integrity sha512-TwMbxBNz0l71+8Sc4czv13h4kEqnchV9igQZBi6QUaz09dnz13juGnnaWWJTRsP3brxOoxeB4SA2WELLw1hCtg== dependencies: validate.io-array "^1.0.3" @@ -4215,7 +3764,7 @@ compute-gcd@^1.2.1: compute-lcm@^1.1.2: version "1.1.2" - resolved "https://registry.npmjs.org/compute-lcm/-/compute-lcm-1.1.2.tgz" + resolved "https://registry.yarnpkg.com/compute-lcm/-/compute-lcm-1.1.2.tgz#9107c66b9dca28cefb22b4ab4545caac4034af23" integrity sha512-OFNPdQAXnQhDSKioX8/XYT6sdUlXwpeMjfd6ApxMJfyZ4GxmLR1xvMERctlYhlHwIiz6CSpBc2+qYKjHGZw4TQ== dependencies: compute-gcd "^1.2.1" @@ -4225,95 +3774,95 @@ compute-lcm@^1.1.2: concat-map@0.0.1: version "0.0.1" - resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== -configstore@^5.0.1: - version "5.0.1" - resolved "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz" - integrity sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA== +config-chain@^1.1.11: + version "1.1.13" + resolved "https://registry.yarnpkg.com/config-chain/-/config-chain-1.1.13.tgz#fad0795aa6a6cdaff9ed1b68e9dff94372c232f4" + integrity sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ== dependencies: - dot-prop "^5.2.0" - graceful-fs "^4.1.2" - make-dir "^3.0.0" - unique-string "^2.0.0" - write-file-atomic "^3.0.0" - xdg-basedir "^4.0.0" + ini "^1.3.4" + proto-list "~1.2.1" + +configstore@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/configstore/-/configstore-6.0.0.tgz#49eca2ebc80983f77e09394a1a56e0aca8235566" + integrity sha512-cD31W1v3GqUlQvbBCGcXmd2Nj9SvLDOP1oQ0YFuLETufzSPaKp11rYBsSOm7rCsW3OnIRAFM3OxRhceaXNYHkA== + dependencies: + dot-prop "^6.0.1" + graceful-fs "^4.2.6" + unique-string "^3.0.0" + write-file-atomic "^3.0.3" + xdg-basedir "^5.0.1" connect-history-api-fallback@^2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz" + resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz#647264845251a0daf25b97ce87834cace0f5f1c8" integrity sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA== consola@^2.15.3: version "2.15.3" - resolved "https://registry.npmjs.org/consola/-/consola-2.15.3.tgz" + resolved "https://registry.yarnpkg.com/consola/-/consola-2.15.3.tgz#2e11f98d6a4be71ff72e0bdf07bd23e12cb61550" integrity sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw== console-browserify@^1.2.0: version "1.2.0" - resolved "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz" + resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.2.0.tgz#67063cef57ceb6cf4993a2ab3a55840ae8c49336" integrity sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA== constants-browserify@^1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz" + resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" integrity sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ== content-disposition@0.5.2: version "0.5.2" - resolved "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz" + resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.2.tgz#0cf68bb9ddf5f2be7961c3a85178cb85dba78cb4" integrity sha512-kRGRZw3bLlFISDBgwTSA1TMBFN6J6GWDeubmDE3AF+3+yXL8hTWv8r5rkLbqYXY4RjPk/EzHnClI3zQf1cFmHA== content-disposition@0.5.4: version "0.5.4" - resolved "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz" + resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe" integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== dependencies: safe-buffer "5.2.1" -content-type@~1.0.4: - version "1.0.4" - resolved "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz" - integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== +content-type@~1.0.4, content-type@~1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.5.tgz#8b773162656d1d1086784c8f23a54ce6d73d7918" + integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== -convert-source-map@^1.7.0: - version "1.8.0" - resolved "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz" - integrity sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA== - dependencies: - safe-buffer "~5.1.1" +convert-source-map@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a" + integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== cookie-signature@1.0.6: version "1.0.6" - resolved "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz" + resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== -cookie@0.5.0: - version "0.5.0" - resolved "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz" - integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw== +cookie@0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.6.0.tgz#2798b04b071b0ecbff0dbb62a505a8efa4e19051" + integrity sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw== -cookiejar@^2.1.3: - version "2.1.4" - resolved "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.4.tgz" - integrity sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw== - -copy-text-to-clipboard@^3.0.1: - version "3.0.1" - resolved "https://registry.npmjs.org/copy-text-to-clipboard/-/copy-text-to-clipboard-3.0.1.tgz" - integrity sha512-rvVsHrpFcL4F2P8ihsoLdFHmd404+CMg71S756oRSeQgqk51U3kicGdnvfkrxva0xXH92SjGS62B0XIJsbh+9Q== +copy-text-to-clipboard@^3.1.0, copy-text-to-clipboard@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/copy-text-to-clipboard/-/copy-text-to-clipboard-3.2.0.tgz#0202b2d9bdae30a49a53f898626dcc3b49ad960b" + integrity sha512-RnJFp1XR/LOBDckxTib5Qjr/PMfkatD0MUCQgdpqS8MdKiNUzBjAQBEN6oUy+jW7LI93BBG3DtMB2KOOKpGs2Q== copy-to-clipboard@^3.3.1: version "3.3.3" - resolved "https://registry.npmjs.org/copy-to-clipboard/-/copy-to-clipboard-3.3.3.tgz" + resolved "https://registry.yarnpkg.com/copy-to-clipboard/-/copy-to-clipboard-3.3.3.tgz#55ac43a1db8ae639a4bd99511c148cdd1b83a1b0" integrity sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA== dependencies: toggle-selection "^1.0.6" copy-webpack-plugin@^11.0.0: version "11.0.0" - resolved "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-11.0.0.tgz" + resolved "https://registry.yarnpkg.com/copy-webpack-plugin/-/copy-webpack-plugin-11.0.0.tgz#96d4dbdb5f73d02dd72d0528d1958721ab72e04a" integrity sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ== dependencies: fast-glob "^3.2.11" @@ -4323,38 +3872,38 @@ copy-webpack-plugin@^11.0.0: schema-utils "^4.0.0" serialize-javascript "^6.0.0" -core-js-compat@^3.25.1: - version "3.26.0" - resolved "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.26.0.tgz" - integrity sha512-piOX9Go+Z4f9ZiBFLnZ5VrOpBl0h7IGCkiFUN11QTe6LjAvOT3ifL/5TdoizMh99hcGy5SoLyWbapIY/PIb/3A== +core-js-compat@^3.31.0, core-js-compat@^3.36.1: + version "3.37.1" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.37.1.tgz#c844310c7852f4bdf49b8d339730b97e17ff09ee" + integrity sha512-9TNiImhKvQqSUkOvk/mMRZzOANTiEVC7WaBNhHcKM7x+/5E1l5NvsysR19zuDQScE8k+kfQXWRN3AtS/eOSHpg== dependencies: - browserslist "^4.21.4" + browserslist "^4.23.0" -core-js-compat@^3.31.0: - version "3.32.1" - resolved "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.32.1.tgz" - integrity sha512-GSvKDv4wE0bPnQtjklV101juQ85g6H3rm5PDP20mqlS5j0kXF3pP97YvAu5hl+uFHqMictp3b2VxOHljWMAtuA== - dependencies: - browserslist "^4.21.10" +core-js-pure@^3.30.2: + version "3.37.1" + resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.37.1.tgz#2b4b34281f54db06c9a9a5bd60105046900553bd" + integrity sha512-J/r5JTHSmzTxbiYYrzXg9w1VpqrYt+gexenBE9pugeyhwPZTAEJddyiReJWsLO6uNQ8xJZFbod6XC7KKwatCiA== -core-js-pure@^3.25.1: - version "3.26.0" - resolved "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.26.0.tgz" - integrity sha512-LiN6fylpVBVwT8twhhluD9TzXmZQQsr2I2eIKtWNbZI1XMfBT7CV18itaN6RA7EtQd/SDdRx/wzvAShX2HvhQA== - -core-js@^3.23.3: - version "3.26.0" - resolved "https://registry.npmjs.org/core-js/-/core-js-3.26.0.tgz" - integrity sha512-+DkDrhoR4Y0PxDz6rurahuB+I45OsEUv8E1maPTB6OuHRohMMcznBq9TMpdpDMm/hUPob/mJJS3PqgbHpMTQgw== +core-js@^3.31.1: + version "3.37.1" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.37.1.tgz#d21751ddb756518ac5a00e4d66499df981a62db9" + integrity sha512-Xn6qmxrQZyB0FFY8E3bgRXei3lWDJHhvI+u0q9TKIYM49G8pAr0FgnnrFRAmsbptZL1yxRADVXn+x5AGsbBfyw== core-util-is@~1.0.0: version "1.0.3" - resolved "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== +cose-base@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/cose-base/-/cose-base-1.0.3.tgz#650334b41b869578a543358b80cda7e0abe0a60a" + integrity sha512-s9whTXInMSgAp/NVXVNuVxVKzGH2qck3aQlVHxDCdAEPgtMKwc4Wq6/QKhgdEdgbLSi9rBTAcPoRa6JpiG4ksg== + dependencies: + layout-base "^1.0.0" + cosmiconfig@^6.0.0: version "6.0.0" - resolved "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-6.0.0.tgz#da4fee853c52f6b1e6935f41c1a2fc50bd4a9982" integrity sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg== dependencies: "@types/parse-json" "^4.0.0" @@ -4363,20 +3912,19 @@ cosmiconfig@^6.0.0: path-type "^4.0.0" yaml "^1.7.2" -cosmiconfig@^7.0.0, cosmiconfig@^7.0.1: - version "7.0.1" - resolved "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz" - integrity sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ== +cosmiconfig@^8.1.3, cosmiconfig@^8.3.5: + version "8.3.6" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-8.3.6.tgz#060a2b871d66dba6c8538ea1118ba1ac16f5fae3" + integrity sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA== dependencies: - "@types/parse-json" "^4.0.0" - import-fresh "^3.2.1" - parse-json "^5.0.0" + import-fresh "^3.3.0" + js-yaml "^4.1.0" + parse-json "^5.2.0" path-type "^4.0.0" - yaml "^1.10.0" create-ecdh@^4.0.0: version "4.0.4" - resolved "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz" + resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.4.tgz#d6e7f4bffa66736085a0762fd3a632684dabcc4e" integrity sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A== dependencies: bn.js "^4.1.0" @@ -4384,7 +3932,7 @@ create-ecdh@^4.0.0: create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0: version "1.2.0" - resolved "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz" + resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg== dependencies: cipher-base "^1.0.1" @@ -4395,7 +3943,7 @@ create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0: create-hmac@^1.1.0, create-hmac@^1.1.4, create-hmac@^1.1.7: version "1.1.7" - resolved "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz" + resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg== dependencies: cipher-base "^1.0.3" @@ -4405,16 +3953,16 @@ create-hmac@^1.1.0, create-hmac@^1.1.4, create-hmac@^1.1.7: safe-buffer "^5.0.1" sha.js "^2.4.8" -cross-fetch@^3.1.5: +cross-fetch@3.1.5: version "3.1.5" - resolved "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.5.tgz" + resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.1.5.tgz#e1389f44d9e7ba767907f7af8454787952ab534f" integrity sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw== dependencies: node-fetch "2.6.7" -cross-spawn@^7.0.3: +cross-spawn@^7.0.0, cross-spawn@^7.0.3: version "7.0.3" - resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== dependencies: path-key "^3.1.0" @@ -4423,7 +3971,7 @@ cross-spawn@^7.0.3: crypto-browserify@^3.12.0: version "3.12.0" - resolved "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz" + resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec" integrity sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg== dependencies: browserify-cipher "^1.0.0" @@ -4439,49 +3987,51 @@ crypto-browserify@^3.12.0: randomfill "^1.0.3" crypto-js@^4.1.1: - version "4.1.1" - resolved "https://registry.npmjs.org/crypto-js/-/crypto-js-4.1.1.tgz" - integrity sha512-o2JlM7ydqd3Qk9CA0L4NL6mTzU2sdx96a+oOfPu8Mkl/PK51vSyoi8/rQ8NknZtk44vq15lmhAj9CIAGwgeWKw== + version "4.2.0" + resolved "https://registry.yarnpkg.com/crypto-js/-/crypto-js-4.2.0.tgz#4d931639ecdfd12ff80e8186dba6af2c2e856631" + integrity sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q== -crypto-random-string@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz" - integrity sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA== +crypto-random-string@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-4.0.0.tgz#5a3cc53d7dd86183df5da0312816ceeeb5bb1fc2" + integrity sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA== + dependencies: + type-fest "^1.0.1" -css-declaration-sorter@^6.3.1: - version "6.3.1" - resolved "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.3.1.tgz" - integrity sha512-fBffmak0bPAnyqc/HO8C3n2sHrp9wcqQz6ES9koRF2/mLOVAx9zIQ3Y7R29sYCteTPqMCwns4WYQoCX91Xl3+w== +css-declaration-sorter@^7.2.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/css-declaration-sorter/-/css-declaration-sorter-7.2.0.tgz#6dec1c9523bc4a643e088aab8f09e67a54961024" + integrity sha512-h70rUM+3PNFuaBDTLe8wF/cdWu+dOZmb7pJt8Z2sedYbAcQVQV/tEchueg3GWxwqS0cxtbxmaHEdkNACqcvsow== -css-loader@^6.7.1: - version "6.7.1" - resolved "https://registry.npmjs.org/css-loader/-/css-loader-6.7.1.tgz" - integrity sha512-yB5CNFa14MbPJcomwNh3wLThtkZgcNyI2bNMRt8iE5Z8Vwl7f8vQXFAzn2HDOJvtDq2NTZBUGMSUNNyrv3/+cw== +css-loader@^6.8.1: + version "6.11.0" + resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-6.11.0.tgz#33bae3bf6363d0a7c2cf9031c96c744ff54d85ba" + integrity sha512-CTJ+AEQJjq5NzLga5pE39qdiSV56F8ywCIsqNIRF0r7BDgWsN25aazToqAFg7ZrtA/U016xudB3ffgweORxX7g== dependencies: icss-utils "^5.1.0" - postcss "^8.4.7" - postcss-modules-extract-imports "^3.0.0" - postcss-modules-local-by-default "^4.0.0" - postcss-modules-scope "^3.0.0" + postcss "^8.4.33" + postcss-modules-extract-imports "^3.1.0" + postcss-modules-local-by-default "^4.0.5" + postcss-modules-scope "^3.2.0" postcss-modules-values "^4.0.0" postcss-value-parser "^4.2.0" - semver "^7.3.5" + semver "^7.5.4" -css-minimizer-webpack-plugin@^4.0.0: - version "4.2.2" - resolved "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-4.2.2.tgz" - integrity sha512-s3Of/4jKfw1Hj9CxEO1E5oXhQAxlayuHO2y/ML+C6I9sQ7FdzfEV6QgMLN3vI+qFsjJGIAFLKtQK7t8BOXAIyA== +css-minimizer-webpack-plugin@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-5.0.1.tgz#33effe662edb1a0bf08ad633c32fa75d0f7ec565" + integrity sha512-3caImjKFQkS+ws1TGcFn0V1HyDJFq1Euy589JlD6/3rV2kj+w7r5G9WDMgSHvpvXHNZ2calVypZWuEDQd9wfLg== dependencies: - cssnano "^5.1.8" - jest-worker "^29.1.2" - postcss "^8.4.17" - schema-utils "^4.0.0" - serialize-javascript "^6.0.0" - source-map "^0.6.1" + "@jridgewell/trace-mapping" "^0.3.18" + cssnano "^6.0.1" + jest-worker "^29.4.3" + postcss "^8.4.24" + schema-utils "^4.0.1" + serialize-javascript "^6.0.1" css-select@^4.1.3: version "4.3.0" - resolved "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz" + resolved "https://registry.yarnpkg.com/css-select/-/css-select-4.3.0.tgz#db7129b2846662fd8628cfc496abb2b59e41529b" integrity sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ== dependencies: boolbase "^1.0.0" @@ -4492,7 +4042,7 @@ css-select@^4.1.3: css-select@^5.1.0: version "5.1.0" - resolved "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz" + resolved "https://registry.yarnpkg.com/css-select/-/css-select-5.1.0.tgz#b8ebd6554c3637ccc76688804ad3f6a6fdaea8a6" integrity sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg== dependencies: boolbase "^1.0.0" @@ -4501,173 +4051,495 @@ css-select@^5.1.0: domutils "^3.0.1" nth-check "^2.0.1" -css-tree@^1.1.2, css-tree@^1.1.3: - version "1.1.3" - resolved "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz" - integrity sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q== +css-tree@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-2.3.1.tgz#10264ce1e5442e8572fc82fbe490644ff54b5c20" + integrity sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw== dependencies: - mdn-data "2.0.14" - source-map "^0.6.1" + mdn-data "2.0.30" + source-map-js "^1.0.1" + +css-tree@~2.2.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-2.2.1.tgz#36115d382d60afd271e377f9c5f67d02bd48c032" + integrity sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA== + dependencies: + mdn-data "2.0.28" + source-map-js "^1.0.1" css-what@^6.0.1, css-what@^6.1.0: version "6.1.0" - resolved "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz" + resolved "https://registry.yarnpkg.com/css-what/-/css-what-6.1.0.tgz#fb5effcf76f1ddea2c81bdfaa4de44e79bac70f4" integrity sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw== cssesc@^3.0.0: version "3.0.0" - resolved "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz" + resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== -cssnano-preset-advanced@^5.3.8: - version "5.3.9" - resolved "https://registry.npmjs.org/cssnano-preset-advanced/-/cssnano-preset-advanced-5.3.9.tgz" - integrity sha512-njnh4pp1xCsibJcEHnWZb4EEzni0ePMqPuPNyuWT4Z+YeXmsgqNuTPIljXFEXhxGsWs9183JkXgHxc1TcsahIg== +cssnano-preset-advanced@^6.1.2: + version "6.1.2" + resolved "https://registry.yarnpkg.com/cssnano-preset-advanced/-/cssnano-preset-advanced-6.1.2.tgz#82b090872b8f98c471f681d541c735acf8b94d3f" + integrity sha512-Nhao7eD8ph2DoHolEzQs5CfRpiEP0xa1HBdnFZ82kvqdmbwVBUr2r1QuQ4t1pi+D1ZpqpcO4T+wy/7RxzJ/WPQ== dependencies: - autoprefixer "^10.4.12" - cssnano-preset-default "^5.2.13" - postcss-discard-unused "^5.1.0" - postcss-merge-idents "^5.1.1" - postcss-reduce-idents "^5.2.0" - postcss-zindex "^5.1.0" + autoprefixer "^10.4.19" + browserslist "^4.23.0" + cssnano-preset-default "^6.1.2" + postcss-discard-unused "^6.0.5" + postcss-merge-idents "^6.0.3" + postcss-reduce-idents "^6.0.3" + postcss-zindex "^6.0.2" -cssnano-preset-default@^5.2.13: - version "5.2.13" - resolved "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.13.tgz" - integrity sha512-PX7sQ4Pb+UtOWuz8A1d+Rbi+WimBIxJTRyBdgGp1J75VU0r/HFQeLnMYgHiCAp6AR4rqrc7Y4R+1Rjk3KJz6DQ== +cssnano-preset-default@^6.1.2: + version "6.1.2" + resolved "https://registry.yarnpkg.com/cssnano-preset-default/-/cssnano-preset-default-6.1.2.tgz#adf4b89b975aa775f2750c89dbaf199bbd9da35e" + integrity sha512-1C0C+eNaeN8OcHQa193aRgYexyJtU8XwbdieEjClw+J9d94E41LwT6ivKH0WT+fYwYWB0Zp3I3IZ7tI/BbUbrg== dependencies: - css-declaration-sorter "^6.3.1" - cssnano-utils "^3.1.0" - postcss-calc "^8.2.3" - postcss-colormin "^5.3.0" - postcss-convert-values "^5.1.3" - postcss-discard-comments "^5.1.2" - postcss-discard-duplicates "^5.1.0" - postcss-discard-empty "^5.1.1" - postcss-discard-overridden "^5.1.0" - postcss-merge-longhand "^5.1.7" - postcss-merge-rules "^5.1.3" - postcss-minify-font-values "^5.1.0" - postcss-minify-gradients "^5.1.1" - postcss-minify-params "^5.1.4" - postcss-minify-selectors "^5.2.1" - postcss-normalize-charset "^5.1.0" - postcss-normalize-display-values "^5.1.0" - postcss-normalize-positions "^5.1.1" - postcss-normalize-repeat-style "^5.1.1" - postcss-normalize-string "^5.1.0" - postcss-normalize-timing-functions "^5.1.0" - postcss-normalize-unicode "^5.1.1" - postcss-normalize-url "^5.1.0" - postcss-normalize-whitespace "^5.1.1" - postcss-ordered-values "^5.1.3" - postcss-reduce-initial "^5.1.1" - postcss-reduce-transforms "^5.1.0" - postcss-svgo "^5.1.0" - postcss-unique-selectors "^5.1.1" + browserslist "^4.23.0" + css-declaration-sorter "^7.2.0" + cssnano-utils "^4.0.2" + postcss-calc "^9.0.1" + postcss-colormin "^6.1.0" + postcss-convert-values "^6.1.0" + postcss-discard-comments "^6.0.2" + postcss-discard-duplicates "^6.0.3" + postcss-discard-empty "^6.0.3" + postcss-discard-overridden "^6.0.2" + postcss-merge-longhand "^6.0.5" + postcss-merge-rules "^6.1.1" + postcss-minify-font-values "^6.1.0" + postcss-minify-gradients "^6.0.3" + postcss-minify-params "^6.1.0" + postcss-minify-selectors "^6.0.4" + postcss-normalize-charset "^6.0.2" + postcss-normalize-display-values "^6.0.2" + postcss-normalize-positions "^6.0.2" + postcss-normalize-repeat-style "^6.0.2" + postcss-normalize-string "^6.0.2" + postcss-normalize-timing-functions "^6.0.2" + postcss-normalize-unicode "^6.1.0" + postcss-normalize-url "^6.0.2" + postcss-normalize-whitespace "^6.0.2" + postcss-ordered-values "^6.0.2" + postcss-reduce-initial "^6.1.0" + postcss-reduce-transforms "^6.0.2" + postcss-svgo "^6.0.3" + postcss-unique-selectors "^6.0.4" -cssnano-utils@^3.1.0: - version "3.1.0" - resolved "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-3.1.0.tgz" - integrity sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA== +cssnano-utils@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/cssnano-utils/-/cssnano-utils-4.0.2.tgz#56f61c126cd0f11f2eef1596239d730d9fceff3c" + integrity sha512-ZR1jHg+wZ8o4c3zqf1SIUSTIvm/9mU343FMR6Obe/unskbvpGhZOo1J6d/r8D1pzkRQYuwbcH3hToOuoA2G7oQ== -cssnano@^5.1.12, cssnano@^5.1.8: - version "5.1.14" - resolved "https://registry.npmjs.org/cssnano/-/cssnano-5.1.14.tgz" - integrity sha512-Oou7ihiTocbKqi0J1bB+TRJIQX5RMR3JghA8hcWSw9mjBLQ5Y3RWqEDoYG3sRNlAbCIXpqMoZGbq5KDR3vdzgw== +cssnano@^6.0.1, cssnano@^6.1.2: + version "6.1.2" + resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-6.1.2.tgz#4bd19e505bd37ee7cf0dc902d3d869f6d79c66b8" + integrity sha512-rYk5UeX7VAM/u0lNqewCdasdtPK81CgX8wJFLEIXHbV2oldWRgJAsZrdhRXkV1NJzA2g850KiFm9mMU2HxNxMA== dependencies: - cssnano-preset-default "^5.2.13" - lilconfig "^2.0.3" - yaml "^1.10.2" + cssnano-preset-default "^6.1.2" + lilconfig "^3.1.1" -csso@^4.2.0: - version "4.2.0" - resolved "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz" - integrity sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA== +csso@^5.0.5: + version "5.0.5" + resolved "https://registry.yarnpkg.com/csso/-/csso-5.0.5.tgz#f9b7fe6cc6ac0b7d90781bb16d5e9874303e2ca6" + integrity sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ== dependencies: - css-tree "^1.1.2" + css-tree "~2.2.0" csstype@^3.0.2: + version "3.1.3" + resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.3.tgz#d80ff294d114fb0e6ac500fbf85b60137d7eff81" + integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw== + +cytoscape-cose-bilkent@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/cytoscape-cose-bilkent/-/cytoscape-cose-bilkent-4.1.0.tgz#762fa121df9930ffeb51a495d87917c570ac209b" + integrity sha512-wgQlVIUJF13Quxiv5e1gstZ08rnZj2XaLHGoFMYXz7SkNfCDOOteKBE6SYRfA9WxxI/iBc3ajfDoc6hb/MRAHQ== + dependencies: + cose-base "^1.0.0" + +cytoscape@^3.28.1: + version "3.29.2" + resolved "https://registry.yarnpkg.com/cytoscape/-/cytoscape-3.29.2.tgz#c99f42513c80a75e2e94858add32896c860202ac" + integrity sha512-2G1ycU28Nh7OHT9rkXRLpCDP30MKH1dXJORZuBhtEhEW7pKwgPi77ImqlCWinouyE1PNepIOGZBOrE84DG7LyQ== + +"d3-array@1 - 2": + version "2.12.1" + resolved "https://registry.yarnpkg.com/d3-array/-/d3-array-2.12.1.tgz#e20b41aafcdffdf5d50928004ececf815a465e81" + integrity sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ== + dependencies: + internmap "^1.0.0" + +"d3-array@2 - 3", "d3-array@2.10.0 - 3", "d3-array@2.5.0 - 3", d3-array@3, d3-array@^3.2.0: + version "3.2.4" + resolved "https://registry.yarnpkg.com/d3-array/-/d3-array-3.2.4.tgz#15fec33b237f97ac5d7c986dc77da273a8ed0bb5" + integrity sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg== + dependencies: + internmap "1 - 2" + +d3-axis@3: + version "3.0.0" + resolved "https://registry.yarnpkg.com/d3-axis/-/d3-axis-3.0.0.tgz#c42a4a13e8131d637b745fc2973824cfeaf93322" + integrity sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw== + +d3-brush@3: + version "3.0.0" + resolved "https://registry.yarnpkg.com/d3-brush/-/d3-brush-3.0.0.tgz#6f767c4ed8dcb79de7ede3e1c0f89e63ef64d31c" + integrity sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ== + dependencies: + d3-dispatch "1 - 3" + d3-drag "2 - 3" + d3-interpolate "1 - 3" + d3-selection "3" + d3-transition "3" + +d3-chord@3: + version "3.0.1" + resolved "https://registry.yarnpkg.com/d3-chord/-/d3-chord-3.0.1.tgz#d156d61f485fce8327e6abf339cb41d8cbba6966" + integrity sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g== + dependencies: + d3-path "1 - 3" + +"d3-color@1 - 3", d3-color@3: + version "3.1.0" + resolved "https://registry.yarnpkg.com/d3-color/-/d3-color-3.1.0.tgz#395b2833dfac71507f12ac2f7af23bf819de24e2" + integrity sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA== + +d3-contour@4: + version "4.0.2" + resolved "https://registry.yarnpkg.com/d3-contour/-/d3-contour-4.0.2.tgz#bb92063bc8c5663acb2422f99c73cbb6c6ae3bcc" + integrity sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA== + dependencies: + d3-array "^3.2.0" + +d3-delaunay@6: + version "6.0.4" + resolved "https://registry.yarnpkg.com/d3-delaunay/-/d3-delaunay-6.0.4.tgz#98169038733a0a5babbeda55054f795bb9e4a58b" + integrity sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A== + dependencies: + delaunator "5" + +"d3-dispatch@1 - 3", d3-dispatch@3: + version "3.0.1" + resolved "https://registry.yarnpkg.com/d3-dispatch/-/d3-dispatch-3.0.1.tgz#5fc75284e9c2375c36c839411a0cf550cbfc4d5e" + integrity sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg== + +"d3-drag@2 - 3", d3-drag@3: + version "3.0.0" + resolved "https://registry.yarnpkg.com/d3-drag/-/d3-drag-3.0.0.tgz#994aae9cd23c719f53b5e10e3a0a6108c69607ba" + integrity sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg== + dependencies: + d3-dispatch "1 - 3" + d3-selection "3" + +"d3-dsv@1 - 3", d3-dsv@3: + version "3.0.1" + resolved "https://registry.yarnpkg.com/d3-dsv/-/d3-dsv-3.0.1.tgz#c63af978f4d6a0d084a52a673922be2160789b73" + integrity sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q== + dependencies: + commander "7" + iconv-lite "0.6" + rw "1" + +"d3-ease@1 - 3", d3-ease@3: + version "3.0.1" + resolved "https://registry.yarnpkg.com/d3-ease/-/d3-ease-3.0.1.tgz#9658ac38a2140d59d346160f1f6c30fda0bd12f4" + integrity sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w== + +d3-fetch@3: + version "3.0.1" + resolved "https://registry.yarnpkg.com/d3-fetch/-/d3-fetch-3.0.1.tgz#83141bff9856a0edb5e38de89cdcfe63d0a60a22" + integrity sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw== + dependencies: + d3-dsv "1 - 3" + +d3-force@3: + version "3.0.0" + resolved "https://registry.yarnpkg.com/d3-force/-/d3-force-3.0.0.tgz#3e2ba1a61e70888fe3d9194e30d6d14eece155c4" + integrity sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg== + dependencies: + d3-dispatch "1 - 3" + d3-quadtree "1 - 3" + d3-timer "1 - 3" + +"d3-format@1 - 3", d3-format@3: + version "3.1.0" + resolved "https://registry.yarnpkg.com/d3-format/-/d3-format-3.1.0.tgz#9260e23a28ea5cb109e93b21a06e24e2ebd55641" + integrity sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA== + +d3-geo@3: + version "3.1.1" + resolved "https://registry.yarnpkg.com/d3-geo/-/d3-geo-3.1.1.tgz#6027cf51246f9b2ebd64f99e01dc7c3364033a4d" + integrity sha512-637ln3gXKXOwhalDzinUgY83KzNWZRKbYubaG+fGVuc/dxO64RRljtCTnf5ecMyE1RIdtqpkVcq0IbtU2S8j2Q== + dependencies: + d3-array "2.5.0 - 3" + +d3-hierarchy@3: version "3.1.2" - resolved "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz" - integrity sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ== + resolved "https://registry.yarnpkg.com/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz#b01cd42c1eed3d46db77a5966cf726f8c09160c6" + integrity sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA== + +"d3-interpolate@1 - 3", "d3-interpolate@1.2.0 - 3", d3-interpolate@3: + version "3.0.1" + resolved "https://registry.yarnpkg.com/d3-interpolate/-/d3-interpolate-3.0.1.tgz#3c47aa5b32c5b3dfb56ef3fd4342078a632b400d" + integrity sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g== + dependencies: + d3-color "1 - 3" + +d3-path@1: + version "1.0.9" + resolved "https://registry.yarnpkg.com/d3-path/-/d3-path-1.0.9.tgz#48c050bb1fe8c262493a8caf5524e3e9591701cf" + integrity sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg== + +"d3-path@1 - 3", d3-path@3, d3-path@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/d3-path/-/d3-path-3.1.0.tgz#22df939032fb5a71ae8b1800d61ddb7851c42526" + integrity sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ== + +d3-polygon@3: + version "3.0.1" + resolved "https://registry.yarnpkg.com/d3-polygon/-/d3-polygon-3.0.1.tgz#0b45d3dd1c48a29c8e057e6135693ec80bf16398" + integrity sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg== + +"d3-quadtree@1 - 3", d3-quadtree@3: + version "3.0.1" + resolved "https://registry.yarnpkg.com/d3-quadtree/-/d3-quadtree-3.0.1.tgz#6dca3e8be2b393c9a9d514dabbd80a92deef1a4f" + integrity sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw== + +d3-random@3: + version "3.0.1" + resolved "https://registry.yarnpkg.com/d3-random/-/d3-random-3.0.1.tgz#d4926378d333d9c0bfd1e6fa0194d30aebaa20f4" + integrity sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ== + +d3-sankey@^0.12.3: + version "0.12.3" + resolved "https://registry.yarnpkg.com/d3-sankey/-/d3-sankey-0.12.3.tgz#b3c268627bd72e5d80336e8de6acbfec9d15d01d" + integrity sha512-nQhsBRmM19Ax5xEIPLMY9ZmJ/cDvd1BG3UVvt5h3WRxKg5zGRbvnteTyWAbzeSvlh3tW7ZEmq4VwR5mB3tutmQ== + dependencies: + d3-array "1 - 2" + d3-shape "^1.2.0" + +d3-scale-chromatic@3: + version "3.1.0" + resolved "https://registry.yarnpkg.com/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz#34c39da298b23c20e02f1a4b239bd0f22e7f1314" + integrity sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ== + dependencies: + d3-color "1 - 3" + d3-interpolate "1 - 3" + +d3-scale@4: + version "4.0.2" + resolved "https://registry.yarnpkg.com/d3-scale/-/d3-scale-4.0.2.tgz#82b38e8e8ff7080764f8dcec77bd4be393689396" + integrity sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ== + dependencies: + d3-array "2.10.0 - 3" + d3-format "1 - 3" + d3-interpolate "1.2.0 - 3" + d3-time "2.1.1 - 3" + d3-time-format "2 - 4" + +"d3-selection@2 - 3", d3-selection@3: + version "3.0.0" + resolved "https://registry.yarnpkg.com/d3-selection/-/d3-selection-3.0.0.tgz#c25338207efa72cc5b9bd1458a1a41901f1e1b31" + integrity sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ== + +d3-shape@3: + version "3.2.0" + resolved "https://registry.yarnpkg.com/d3-shape/-/d3-shape-3.2.0.tgz#a1a839cbd9ba45f28674c69d7f855bcf91dfc6a5" + integrity sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA== + dependencies: + d3-path "^3.1.0" + +d3-shape@^1.2.0: + version "1.3.7" + resolved "https://registry.yarnpkg.com/d3-shape/-/d3-shape-1.3.7.tgz#df63801be07bc986bc54f63789b4fe502992b5d7" + integrity sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw== + dependencies: + d3-path "1" + +"d3-time-format@2 - 4", d3-time-format@4: + version "4.1.0" + resolved "https://registry.yarnpkg.com/d3-time-format/-/d3-time-format-4.1.0.tgz#7ab5257a5041d11ecb4fe70a5c7d16a195bb408a" + integrity sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg== + dependencies: + d3-time "1 - 3" + +"d3-time@1 - 3", "d3-time@2.1.1 - 3", d3-time@3: + version "3.1.0" + resolved "https://registry.yarnpkg.com/d3-time/-/d3-time-3.1.0.tgz#9310db56e992e3c0175e1ef385e545e48a9bb5c7" + integrity sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q== + dependencies: + d3-array "2 - 3" + +"d3-timer@1 - 3", d3-timer@3: + version "3.0.1" + resolved "https://registry.yarnpkg.com/d3-timer/-/d3-timer-3.0.1.tgz#6284d2a2708285b1abb7e201eda4380af35e63b0" + integrity sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA== + +"d3-transition@2 - 3", d3-transition@3: + version "3.0.1" + resolved "https://registry.yarnpkg.com/d3-transition/-/d3-transition-3.0.1.tgz#6869fdde1448868077fdd5989200cb61b2a1645f" + integrity sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w== + dependencies: + d3-color "1 - 3" + d3-dispatch "1 - 3" + d3-ease "1 - 3" + d3-interpolate "1 - 3" + d3-timer "1 - 3" + +d3-zoom@3: + version "3.0.0" + resolved "https://registry.yarnpkg.com/d3-zoom/-/d3-zoom-3.0.0.tgz#d13f4165c73217ffeaa54295cd6969b3e7aee8f3" + integrity sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw== + dependencies: + d3-dispatch "1 - 3" + d3-drag "2 - 3" + d3-interpolate "1 - 3" + d3-selection "2 - 3" + d3-transition "2 - 3" + +d3@^7.4.0, d3@^7.8.2: + version "7.9.0" + resolved "https://registry.yarnpkg.com/d3/-/d3-7.9.0.tgz#579e7acb3d749caf8860bd1741ae8d371070cd5d" + integrity sha512-e1U46jVP+w7Iut8Jt8ri1YsPOvFpg46k+K8TpCb0P+zjCkjkPnV7WzfDJzMHy1LnA+wj5pLT1wjO901gLXeEhA== + dependencies: + d3-array "3" + d3-axis "3" + d3-brush "3" + d3-chord "3" + d3-color "3" + d3-contour "4" + d3-delaunay "6" + d3-dispatch "3" + d3-drag "3" + d3-dsv "3" + d3-ease "3" + d3-fetch "3" + d3-force "3" + d3-format "3" + d3-geo "3" + d3-hierarchy "3" + d3-interpolate "3" + d3-path "3" + d3-polygon "3" + d3-quadtree "3" + d3-random "3" + d3-scale "4" + d3-scale-chromatic "3" + d3-selection "3" + d3-shape "3" + d3-time "3" + d3-time-format "4" + d3-timer "3" + d3-transition "3" + d3-zoom "3" + +dagre-d3-es@7.0.10: + version "7.0.10" + resolved "https://registry.yarnpkg.com/dagre-d3-es/-/dagre-d3-es-7.0.10.tgz#19800d4be674379a3cd8c86a8216a2ac6827cadc" + integrity sha512-qTCQmEhcynucuaZgY5/+ti3X/rnszKZhEQH/ZdWdtP1tA/y3VoHJzcVrO9pjjJCNpigfscAtoUB5ONcd2wNn0A== + dependencies: + d3 "^7.8.2" + lodash-es "^4.17.21" + +dayjs@^1.11.7: + version "1.11.11" + resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.11.tgz#dfe0e9d54c5f8b68ccf8ca5f72ac603e7e5ed59e" + integrity sha512-okzr3f11N6WuqYtZSvm+F776mB41wRZMhKP+hc34YdW+KmtYYK9iqvHSwo2k9FEH3fhGXvOPV6yz2IcSrfRUDg== + +debounce@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/debounce/-/debounce-1.2.1.tgz#38881d8f4166a5c5848020c11827b834bcb3e0a5" + integrity sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug== debug@2.6.9, debug@^2.6.0: version "2.6.9" - resolved "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== dependencies: ms "2.0.0" -debug@^4.0.0, debug@^4.1.0, debug@^4.1.1, debug@^4.3.4: +debug@4, debug@^4.0.0, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1: + version "4.3.5" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.5.tgz#e83444eceb9fedd4a1da56d671ae2446a01a6e1e" + integrity sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg== + dependencies: + ms "2.1.2" + +debug@4.3.4: version "4.3.4" - resolved "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== dependencies: ms "2.1.2" decamelize@^1.2.0: version "1.2.0" - resolved "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA== decode-named-character-reference@^1.0.0: version "1.0.2" - resolved "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.0.2.tgz" + resolved "https://registry.yarnpkg.com/decode-named-character-reference/-/decode-named-character-reference-1.0.2.tgz#daabac9690874c394c81e4162a0304b35d824f0e" integrity sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg== dependencies: character-entities "^2.0.0" -decompress-response@^3.3.0: - version "3.3.0" - resolved "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz" - integrity sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA== +decompress-response@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-6.0.0.tgz#ca387612ddb7e104bd16d85aab00d5ecf09c66fc" + integrity sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ== dependencies: - mimic-response "^1.0.0" + mimic-response "^3.1.0" deep-extend@^0.6.0: version "0.6.0" - resolved "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz" + resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== -deepmerge@^4.0.0: +deepmerge@^4.0.0, deepmerge@^4.2.2, deepmerge@^4.3.1: version "4.3.1" resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a" integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== -deepmerge@^4.2.2: - version "4.2.2" - resolved "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz" - integrity sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg== - default-gateway@^6.0.3: version "6.0.3" - resolved "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz" + resolved "https://registry.yarnpkg.com/default-gateway/-/default-gateway-6.0.3.tgz#819494c888053bdb743edbf343d6cdf7f2943a71" integrity sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg== dependencies: execa "^5.0.0" -defer-to-connect@^1.0.1: - version "1.1.3" - resolved "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz" - integrity sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ== +defer-to-connect@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-2.0.1.tgz#8016bdb4143e4632b77a3449c6236277de520587" + integrity sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg== + +define-data-property@^1.0.1, define-data-property@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e" + integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A== + dependencies: + es-define-property "^1.0.0" + es-errors "^1.3.0" + gopd "^1.0.1" define-lazy-prop@^2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz" + resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz#3f7ae421129bcaaac9bc74905c98a0009ec9ee7f" integrity sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og== -define-properties@^1.1.3: - version "1.1.4" - resolved "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz" - integrity sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA== +define-properties@^1.1.3, define-properties@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c" + integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg== dependencies: + define-data-property "^1.0.1" has-property-descriptors "^1.0.0" object-keys "^1.1.1" del@^6.1.1: version "6.1.1" - resolved "https://registry.npmjs.org/del/-/del-6.1.1.tgz" + resolved "https://registry.yarnpkg.com/del/-/del-6.1.1.tgz#3b70314f1ec0aa325c6b14eb36b95786671edb7a" integrity sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg== dependencies: globby "^11.0.1" @@ -4679,29 +4551,31 @@ del@^6.1.1: rimraf "^3.0.2" slash "^3.0.0" -delayed-stream@~1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz" - integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== +delaunator@5: + version "5.0.1" + resolved "https://registry.yarnpkg.com/delaunator/-/delaunator-5.0.1.tgz#39032b08053923e924d6094fe2cde1a99cc51278" + integrity sha512-8nvh+XBe96aCESrGOqMp/84b13H9cdKbG5P2ejQCh4d4sK9RL4371qou9drQjMhvnPmhWl5hnmqbEE0fXr9Xnw== + dependencies: + robust-predicates "^3.0.2" depd@2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz" + resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== depd@~1.1.2: version "1.1.2" - resolved "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz" + resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" integrity sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ== dequal@^2.0.0: version "2.0.3" - resolved "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz" + resolved "https://registry.yarnpkg.com/dequal/-/dequal-2.0.3.tgz#2644214f1997d39ed0ee0ece72335490a7ac67be" integrity sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA== des.js@^1.0.0: version "1.1.0" - resolved "https://registry.npmjs.org/des.js/-/des.js-1.1.0.tgz" + resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.1.0.tgz#1d37f5766f3bbff4ee9638e871a8768c173b81da" integrity sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg== dependencies: inherits "^2.0.1" @@ -4709,58 +4583,55 @@ des.js@^1.0.0: destroy@1.2.0: version "1.2.0" - resolved "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz" + resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== -detab@2.0.4: - version "2.0.4" - resolved "https://registry.npmjs.org/detab/-/detab-2.0.4.tgz" - integrity sha512-8zdsQA5bIkoRECvCrNKPla84lyoR7DSAyf7p0YgXzBO9PDJx8KntPUay7NS6yp+KdxdVtiE5SpHKtbp2ZQyA9g== - dependencies: - repeat-string "^1.5.4" - detect-node@^2.0.4: version "2.1.0" - resolved "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz" + resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.1.0.tgz#c9c70775a49c3d03bc2c06d9a73be550f978f8b1" integrity sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g== detect-port-alt@^1.1.6: version "1.1.6" - resolved "https://registry.npmjs.org/detect-port-alt/-/detect-port-alt-1.1.6.tgz" + resolved "https://registry.yarnpkg.com/detect-port-alt/-/detect-port-alt-1.1.6.tgz#24707deabe932d4a3cf621302027c2b266568275" integrity sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q== dependencies: address "^1.0.1" debug "^2.6.0" -detect-port@^1.3.0: - version "1.3.0" - resolved "https://registry.npmjs.org/detect-port/-/detect-port-1.3.0.tgz" - integrity sha512-E+B1gzkl2gqxt1IhUzwjrxBKRqx1UzC3WLONHinn8S3T6lwV/agVCyitiFOsGJ/eYuEUBvD71MZHy3Pv1G9doQ== +detect-port@^1.5.1: + version "1.6.1" + resolved "https://registry.yarnpkg.com/detect-port/-/detect-port-1.6.1.tgz#45e4073997c5f292b957cb678fb0bb8ed4250a67" + integrity sha512-CmnVc+Hek2egPx1PeTFVta2W78xy2K/9Rkf6cC4T59S50tVnzKj+tnx5mmx5lwvCkujZ4uRrpRSuV+IVs3f90Q== dependencies: address "^1.0.1" - debug "^2.6.0" + debug "4" -dezalgo@^1.0.4: - version "1.0.4" - resolved "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.4.tgz" - integrity sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig== +devlop@^1.0.0, devlop@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/devlop/-/devlop-1.1.0.tgz#4db7c2ca4dc6e0e834c30be70c94bbc976dc7018" + integrity sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA== dependencies: - asap "^2.0.0" - wrappy "1" + dequal "^2.0.0" + +devtools-protocol@0.0.1045489: + version "0.0.1045489" + resolved "https://registry.yarnpkg.com/devtools-protocol/-/devtools-protocol-0.0.1045489.tgz#f959ad560b05acd72d55644bc3fb8168a83abf28" + integrity sha512-D+PTmWulkuQW4D1NTiCRCFxF7pQPn0hgp4YyX4wAQ6xYXKOadSWPR3ENGDQ47MW/Ewc9v2rpC/UEEGahgBYpSQ== didyoumean@^1.2.2: version "1.2.2" - resolved "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz" + resolved "https://registry.yarnpkg.com/didyoumean/-/didyoumean-1.2.2.tgz#989346ffe9e839b4555ecf5666edea0d3e8ad037" integrity sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw== diff@^5.0.0: - version "5.1.0" - resolved "https://registry.npmjs.org/diff/-/diff-5.1.0.tgz" - integrity sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw== + version "5.2.0" + resolved "https://registry.yarnpkg.com/diff/-/diff-5.2.0.tgz#26ded047cd1179b78b9537d5ef725503ce1ae531" + integrity sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A== diffie-hellman@^5.0.0: version "5.0.3" - resolved "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz" + resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875" integrity sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg== dependencies: bn.js "^4.1.0" @@ -4769,103 +4640,103 @@ diffie-hellman@^5.0.0: dir-glob@^3.0.1: version "3.0.1" - resolved "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz" + resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== dependencies: path-type "^4.0.0" dlv@^1.1.3: version "1.1.3" - resolved "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz" + resolved "https://registry.yarnpkg.com/dlv/-/dlv-1.1.3.tgz#5c198a8a11453596e751494d49874bc7732f2e79" integrity sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA== -dns-equal@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz" - integrity sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg== - dns-packet@^5.2.2: - version "5.6.0" - resolved "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.0.tgz" - integrity sha512-rza3UH1LwdHh9qyPXp8lkwpjSNk/AMD3dPytUoRoqnypDUhY0xvbdmVhWOfxO68frEfV9BU8V12Ez7ZsHGZpCQ== + version "5.6.1" + resolved "https://registry.yarnpkg.com/dns-packet/-/dns-packet-5.6.1.tgz#ae888ad425a9d1478a0674256ab866de1012cf2f" + integrity sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw== dependencies: "@leichtgewicht/ip-codec" "^2.0.1" docusaurus-plugin-image-zoom@^1.0.1: version "1.0.1" - resolved "https://registry.npmjs.org/docusaurus-plugin-image-zoom/-/docusaurus-plugin-image-zoom-1.0.1.tgz" + resolved "https://registry.yarnpkg.com/docusaurus-plugin-image-zoom/-/docusaurus-plugin-image-zoom-1.0.1.tgz#17afec39f2e630cac50a4ed3a8bbdad8d0aa8b9d" integrity sha512-96IpSKUx2RWy3db9aZ0s673OQo5DWgV9UVWouS+CPOSIVEdCWh6HKmWf6tB9rsoaiIF3oNn9keiyv6neEyKb1Q== dependencies: medium-zoom "^1.0.6" validate-peer-dependencies "^2.2.0" -docusaurus-plugin-openapi-docs@^1.7.3: - version "1.7.3" - resolved "https://registry.npmjs.org/docusaurus-plugin-openapi-docs/-/docusaurus-plugin-openapi-docs-1.7.3.tgz" - integrity sha512-h0SmUJJjjN1ewNDFcxXxGF41pg6aCm8GI0cMBBvlLcxmaFuKVkQ57w+cDyX2Ip+Vd0kPrgtcssfI0ujmYQjC2g== +docusaurus-plugin-openapi-docs@3.0.0-beta.10, docusaurus-plugin-openapi-docs@^3.0.0-beta.10: + version "3.0.0-beta.10" + resolved "https://registry.yarnpkg.com/docusaurus-plugin-openapi-docs/-/docusaurus-plugin-openapi-docs-3.0.0-beta.10.tgz#f0c303ee852487c852c163d019678a92b53abf81" + integrity sha512-BtMBH4TzCiMM0WbO2ZAMXSuL7Ge9yyASZhAycb5vX+KSUnUgp47/Ex2f6/evBfaadnr6vXYEr1UBT1fSiJYh5w== dependencies: - "@apidevtools/json-schema-ref-parser" "^10.1.0" - "@docusaurus/mdx-loader" ">=2.0.1 <2.3.0" - "@docusaurus/plugin-content-docs" ">=2.0.1 <2.3.0" - "@docusaurus/utils" ">=2.0.1 <2.3.0" - "@docusaurus/utils-validation" ">=2.0.1 <2.3.0" + "@apidevtools/json-schema-ref-parser" "^11.5.4" + "@docusaurus/plugin-content-docs" "^3.0.1" + "@docusaurus/utils" "^3.0.1" + "@docusaurus/utils-validation" "^3.0.1" "@paloaltonetworks/openapi-to-postmanv2" "3.1.0-hotfix.1" "@paloaltonetworks/postman-collection" "^4.1.0" - "@redocly/openapi-core" "^1.0.0-beta.125" + "@redocly/openapi-core" "^1.10.5" chalk "^4.1.2" clsx "^1.1.1" fs-extra "^9.0.1" - js-yaml "^4.1.0" json-pointer "^0.6.2" - json-refs "^3.0.15" json-schema-merge-allof "^0.8.1" + json5 "^2.2.3" lodash "^4.17.20" mustache "^4.2.0" slugify "^1.6.5" swagger2openapi "^7.0.8" - url-template "^3.0.0" - webpack "^5.61.0" xml-formatter "^2.6.1" -docusaurus-theme-openapi-docs@^1.7.3: - version "1.7.3" - resolved "https://registry.npmjs.org/docusaurus-theme-openapi-docs/-/docusaurus-theme-openapi-docs-1.7.3.tgz" - integrity sha512-riLEj2tNGLDAMs0eMrStLoOSgsvpa0tmwzhIDYhETxZSBZ50Gd9sBPW58LRhuzQ5d9UZMTu6tg2swZiYQAlnag== +docusaurus-plugin-sass@^0.2.3: + version "0.2.5" + resolved "https://registry.yarnpkg.com/docusaurus-plugin-sass/-/docusaurus-plugin-sass-0.2.5.tgz#6bfb8a227ac6265be685dcbc24ba1989e27b8005" + integrity sha512-Z+D0fLFUKcFpM+bqSUmqKIU+vO+YF1xoEQh5hoFreg2eMf722+siwXDD+sqtwU8E4MvVpuvsQfaHwODNlxJAEg== dependencies: - "@docusaurus/theme-common" ">=2.0.1 <2.3.0" - "@mdx-js/react" "^1.6.21" + sass-loader "^10.1.1" + +docusaurus-theme-openapi-docs@3.0.0-beta.10: + version "3.0.0-beta.10" + resolved "https://registry.yarnpkg.com/docusaurus-theme-openapi-docs/-/docusaurus-theme-openapi-docs-3.0.0-beta.10.tgz#f9a790b1ef88ff01f266224064f4b2f80d0892ff" + integrity sha512-8oUMMZSrRJ9EssrjWwbM9aYuHOt1AAm6wQDzWr8k6VvefGvVAibg4Y9PK7GeZ243lJikq9s45KqUA0SMwsm+Fg== + dependencies: + "@docusaurus/theme-common" "^3.0.1" + "@hookform/error-message" "^2.0.1" "@paloaltonetworks/postman-code-generators" "1.1.15-patch.2" "@paloaltonetworks/postman-collection" "^4.1.0" "@reduxjs/toolkit" "^1.7.1" - buffer "^6.0.3" clsx "^1.1.1" + copy-text-to-clipboard "^3.1.0" crypto-js "^4.1.1" - docusaurus-plugin-openapi-docs "^1.7.3" + docusaurus-plugin-openapi-docs "^3.0.0-beta.10" + docusaurus-plugin-sass "^0.2.3" file-saver "^2.0.5" - immer "^9.0.7" lodash "^4.17.20" node-polyfill-webpack-plugin "^2.0.1" - process "^0.11.10" - react-live "^3.1.1" + prism-react-renderer "^2.3.0" + react-hook-form "^7.43.8" + react-live "^4.0.0" react-magic-dropzone "^1.0.1" react-markdown "^8.0.1" react-modal "^3.15.1" react-redux "^7.2.0" - redux-devtools-extension "^2.13.8" rehype-raw "^6.1.1" + sass "^1.58.1" + sass-loader "^13.3.2" webpack "^5.61.0" xml-formatter "^2.6.1" dom-converter@^0.2.0: version "0.2.0" - resolved "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz" + resolved "https://registry.yarnpkg.com/dom-converter/-/dom-converter-0.2.0.tgz#6721a9daee2e293682955b6afe416771627bb768" integrity sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA== dependencies: utila "~0.4" dom-serializer@^1.0.1: version "1.4.1" - resolved "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz" + resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-1.4.1.tgz#de5d41b1aea290215dc45a6dae8adcf1d32e2d30" integrity sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag== dependencies: domelementtype "^2.0.1" @@ -4874,7 +4745,7 @@ dom-serializer@^1.0.1: dom-serializer@^2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz" + resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-2.0.0.tgz#e41b802e1eedf9f6cae183ce5e622d789d7d8e53" integrity sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg== dependencies: domelementtype "^2.3.0" @@ -4882,32 +4753,37 @@ dom-serializer@^2.0.0: entities "^4.2.0" domain-browser@^4.22.0: - version "4.22.0" - resolved "https://registry.npmjs.org/domain-browser/-/domain-browser-4.22.0.tgz" - integrity sha512-IGBwjF7tNk3cwypFNH/7bfzBcgSCbaMOD3GsaY1AU/JRrnHnYgEM0+9kQt52iZxjNsjBtJYtao146V+f8jFZNw== + version "4.23.0" + resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-4.23.0.tgz#427ebb91efcb070f05cffdfb8a4e9a6c25f8c94b" + integrity sha512-ArzcM/II1wCCujdCNyQjXrAFwS4mrLh4C7DZWlaI8mdh7h3BfKdNd3bKXITfl2PT9FtfQqaGvhi1vPRQPimjGA== domelementtype@^2.0.1, domelementtype@^2.2.0, domelementtype@^2.3.0: version "2.3.0" - resolved "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.3.0.tgz#5c45e8e869952626331d7aab326d01daf65d589d" integrity sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw== domhandler@^4.0.0, domhandler@^4.2.0, domhandler@^4.3.1: version "4.3.1" - resolved "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz" + resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-4.3.1.tgz#8d792033416f59d68bc03a5aa7b018c1ca89279c" integrity sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ== dependencies: domelementtype "^2.2.0" -domhandler@^5.0.1, domhandler@^5.0.2, domhandler@^5.0.3: +domhandler@^5.0.2, domhandler@^5.0.3: version "5.0.3" - resolved "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz" + resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-5.0.3.tgz#cc385f7f751f1d1fc650c21374804254538c7d31" integrity sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w== dependencies: domelementtype "^2.3.0" +dompurify@^3.0.5: + version "3.1.5" + resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-3.1.5.tgz#2c6a113fc728682a0f55684b1388c58ddb79dc38" + integrity sha512-lwG+n5h8QNpxtyrJW/gJWckL+1/DQiYMX8f7t8Z2AZTPw1esVrqjI63i7Zc2Gz0aKzLVMYC1V1PL/ky+aY/NgA== + domutils@^2.5.2, domutils@^2.8.0: version "2.8.0" - resolved "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-2.8.0.tgz#4437def5db6e2d1f5d6ee859bd95ca7d02048135" integrity sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A== dependencies: dom-serializer "^1.0.1" @@ -4915,58 +4791,58 @@ domutils@^2.5.2, domutils@^2.8.0: domhandler "^4.2.0" domutils@^3.0.1: - version "3.0.1" - resolved "https://registry.npmjs.org/domutils/-/domutils-3.0.1.tgz" - integrity sha512-z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q== + version "3.1.0" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-3.1.0.tgz#c47f551278d3dc4b0b1ab8cbb42d751a6f0d824e" + integrity sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA== dependencies: dom-serializer "^2.0.0" domelementtype "^2.3.0" - domhandler "^5.0.1" + domhandler "^5.0.3" dot-case@^3.0.4: version "3.0.4" - resolved "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz" + resolved "https://registry.yarnpkg.com/dot-case/-/dot-case-3.0.4.tgz#9b2b670d00a431667a8a75ba29cd1b98809ce751" integrity sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w== dependencies: no-case "^3.0.4" tslib "^2.0.3" -dot-prop@^5.2.0: - version "5.3.0" - resolved "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz" - integrity sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q== +dot-prop@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-6.0.1.tgz#fc26b3cf142b9e59b74dbd39ed66ce620c681083" + integrity sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA== dependencies: is-obj "^2.0.0" -duplexer3@^0.1.4: - version "0.1.5" - resolved "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.5.tgz" - integrity sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA== - duplexer@^0.1.2: version "0.1.2" - resolved "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz" + resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.2.tgz#3abe43aef3835f8ae077d136ddce0f276b0400e6" integrity sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg== eastasianwidth@^0.2.0: version "0.2.0" - resolved "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz" + resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== ee-first@1.1.1: version "1.1.1" - resolved "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz" + resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== -electron-to-chromium@^1.4.477: - version "1.4.526" - resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.526.tgz" - integrity sha512-tjjTMjmZAx1g6COrintLTa2/jcafYKxKoiEkdQOrVdbLaHh2wCt2nsAF8ZHweezkrP+dl/VG9T5nabcYoo0U5Q== +electron-to-chromium@^1.4.796: + version "1.4.803" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.803.tgz#cf55808a5ee12e2a2778bbe8cdc941ef87c2093b" + integrity sha512-61H9mLzGOCLLVsnLiRzCbc63uldP0AniRYPV3hbGVtONA1pI7qSGILdbofR7A8TMbOypDocEAjH/e+9k1QIe3g== -elliptic@^6.5.3: - version "6.5.4" - resolved "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz" - integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ== +elkjs@^0.9.0: + version "0.9.3" + resolved "https://registry.yarnpkg.com/elkjs/-/elkjs-0.9.3.tgz#16711f8ceb09f1b12b99e971b138a8384a529161" + integrity sha512-f/ZeWvW/BCXbhGEf1Ujp29EASo/lk1FDnETgNKwJrsVvGZhUWCZyg3xLJjAsxfOmt8KjswHmI5EwCQcPMpOYhQ== + +elliptic@^6.5.3, elliptic@^6.5.5: + version "6.5.5" + resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.5.tgz#c715e09f78b6923977610d4c2346d6ce22e6dded" + integrity sha512-7EjbcmUm17NQFu4Pmgmq2olYMj8nwMnpcddByChSUjArp8F5DQWcIcpriwO4ZToLNAJig0yiyjswfyGNje/ixw== dependencies: bn.js "^4.11.9" brorand "^1.1.0" @@ -4978,104 +4854,121 @@ elliptic@^6.5.3: emoji-regex@^8.0.0: version "8.0.0" - resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== emoji-regex@^9.2.2: version "9.2.2" - resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== +emojilib@^2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/emojilib/-/emojilib-2.4.0.tgz#ac518a8bb0d5f76dda57289ccb2fdf9d39ae721e" + integrity sha512-5U0rVMU5Y2n2+ykNLQqMoqklN9ICBT/KsvC1Gz6vqHbz2AXXGkG+Pm5rMWk/8Vjrr/mY9985Hi8DYzn1F09Nyw== + emojis-list@^3.0.0: version "3.0.0" - resolved "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz" + resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78" integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q== -emoticon@^3.2.0: - version "3.2.0" - resolved "https://registry.npmjs.org/emoticon/-/emoticon-3.2.0.tgz" - integrity sha512-SNujglcLTTg+lDAcApPNgEdudaqQFiAbJCqzjNxJkvN9vAwCGi0uu8IUVvx+f16h+V44KCY6Y2yboroc9pilHg== +emoticon@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/emoticon/-/emoticon-4.0.1.tgz#2d2bbbf231ce3a5909e185bbb64a9da703a1e749" + integrity sha512-dqx7eA9YaqyvYtUhJwT4rC1HIp82j5ybS1/vQ42ur+jBe17dJMwZE4+gvL1XadSFfxaPFFGt3Xsw+Y8akThDlw== encodeurl@~1.0.2: version "1.0.2" - resolved "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz" + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== -end-of-stream@^1.1.0: +end-of-stream@^1.1.0, end-of-stream@^1.4.1: version "1.4.4" - resolved "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== dependencies: once "^1.4.0" -enhanced-resolve@^5.15.0: - version "5.15.0" - resolved "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz" - integrity sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg== +enhanced-resolve@^5.17.0: + version "5.17.0" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.17.0.tgz#d037603789dd9555b89aaec7eb78845c49089bc5" + integrity sha512-dwDPwZL0dmye8Txp2gzFmA6sxALaSvdRDjPH0viLcKrtlOL3tw62nWWweVD1SdILDTJrbrL6tdWVN58Wo6U3eA== dependencies: graceful-fs "^4.2.4" tapable "^2.2.0" entities@^2.0.0: version "2.2.0" - resolved "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz" + resolved "https://registry.yarnpkg.com/entities/-/entities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55" integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A== -entities@^4.2.0, entities@^4.3.0, entities@^4.4.0: - version "4.4.0" - resolved "https://registry.npmjs.org/entities/-/entities-4.4.0.tgz" - integrity sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA== +entities@^4.2.0, entities@^4.4.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48" + integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw== error-ex@^1.3.1: version "1.3.2" - resolved "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz" + resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== dependencies: is-arrayish "^0.2.1" -es-module-lexer@^1.2.1: - version "1.3.0" - resolved "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.3.0.tgz" - integrity sha512-vZK7T0N2CBmBOixhmjdqx2gWVbFZ4DXZ/NyRMZVlJXPa7CyFS+/a4QQsDGDQy9ZfEzxFuNEsMLeQJnKP2p5/JA== +es-define-property@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.0.tgz#c7faefbdff8b2696cf5f46921edfb77cc4ba3845" + integrity sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ== + dependencies: + get-intrinsic "^1.2.4" -es6-object-assign@^1.1.0: - version "1.1.0" - resolved "https://registry.npmjs.org/es6-object-assign/-/es6-object-assign-1.1.0.tgz" - integrity sha512-MEl9uirslVwqQU369iHNWZXsI8yaZYGg/D65aOgZkeyFJwHYSxilf7rQzXKI7DdDuBPrBXbfk3sl9hJhmd5AUw== +es-errors@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" + integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== + +es-module-lexer@^1.2.1: + version "1.5.3" + resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-1.5.3.tgz#25969419de9c0b1fbe54279789023e8a9a788412" + integrity sha512-i1gCgmR9dCl6Vil6UKPI/trA69s08g/syhiDK9TG0Nf1RJjjFI+AzoWW7sPufzkgYAn861skuCwJa0pIIHYxvg== es6-promise@^3.2.1: version "3.3.1" - resolved "https://registry.npmjs.org/es6-promise/-/es6-promise-3.3.1.tgz" + resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-3.3.1.tgz#a08cdde84ccdbf34d027a1451bc91d4bcd28a613" integrity sha512-SOp9Phqvqn7jtEUxPWdWfWoLmyt2VaJ6MpvP9Comy1MceMXqE6bxvaTu4iaxpYYPzhny28Lc+M87/c2cPK6lDg== -escalade@^3.1.1: - version "3.1.1" - resolved "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz" - integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== +escalade@^3.1.1, escalade@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.2.tgz#54076e9ab29ea5bf3d8f1ed62acffbb88272df27" + integrity sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA== -escape-goat@^2.0.0: - version "2.1.1" - resolved "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz" - integrity sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q== +escape-goat@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/escape-goat/-/escape-goat-4.0.0.tgz#9424820331b510b0666b98f7873fe11ac4aa8081" + integrity sha512-2Sd4ShcWxbx6OY1IHyla/CVNwvg7XwZVoXZHcSu9w9SReNP1EzzD5T8NWKIR38fIqEns9kDWKUQTXXAmlDrdPg== escape-html@^1.0.3, escape-html@~1.0.3: version "1.0.3" - resolved "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz" + resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== escape-string-regexp@^1.0.5: version "1.0.5" - resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== escape-string-regexp@^4.0.0: version "4.0.0" - resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== +escape-string-regexp@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz#4683126b500b61762f2dbebace1806e8be31b1c8" + integrity sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw== + eslint-scope@5.1.1: version "5.1.1" - resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== dependencies: esrecurse "^4.3.0" @@ -5083,44 +4976,127 @@ eslint-scope@5.1.1: esprima@^4.0.0: version "4.0.1" - resolved "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== esrecurse@^4.3.0: version "4.3.0" - resolved "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== dependencies: estraverse "^5.2.0" estraverse@^4.1.1: version "4.3.0" - resolved "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== estraverse@^5.2.0: version "5.3.0" - resolved "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== +estree-util-attach-comments@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/estree-util-attach-comments/-/estree-util-attach-comments-2.1.1.tgz#ee44f4ff6890ee7dfb3237ac7810154c94c63f84" + integrity sha512-+5Ba/xGGS6mnwFbXIuQiDPTbuTxuMCooq3arVv7gPZtYpjp+VXH/NkHAP35OOefPhNG/UGqU3vt/LTABwcHX0w== + dependencies: + "@types/estree" "^1.0.0" + +estree-util-attach-comments@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/estree-util-attach-comments/-/estree-util-attach-comments-3.0.0.tgz#344bde6a64c8a31d15231e5ee9e297566a691c2d" + integrity sha512-cKUwm/HUcTDsYh/9FgnuFqpfquUbwIqwKM26BVCGDPVgvaCl/nDCCjUfiLlx6lsEZ3Z4RFxNbOQ60pkaEwFxGw== + dependencies: + "@types/estree" "^1.0.0" + +estree-util-build-jsx@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/estree-util-build-jsx/-/estree-util-build-jsx-3.0.1.tgz#b6d0bced1dcc4f06f25cf0ceda2b2dcaf98168f1" + integrity sha512-8U5eiL6BTrPxp/CHbs2yMgP8ftMhR5ww1eIKoWRMlqvltHF8fZn5LRDvTKuxD3DUn+shRbLGqXemcP51oFCsGQ== + dependencies: + "@types/estree-jsx" "^1.0.0" + devlop "^1.0.0" + estree-util-is-identifier-name "^3.0.0" + estree-walker "^3.0.0" + +estree-util-is-identifier-name@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/estree-util-is-identifier-name/-/estree-util-is-identifier-name-2.1.0.tgz#fb70a432dcb19045e77b05c8e732f1364b4b49b2" + integrity sha512-bEN9VHRyXAUOjkKVQVvArFym08BTWB0aJPppZZr0UNyAqWsLaVfAqP7hbaTJjzHifmB5ebnR8Wm7r7yGN/HonQ== + +estree-util-is-identifier-name@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/estree-util-is-identifier-name/-/estree-util-is-identifier-name-3.0.0.tgz#0b5ef4c4ff13508b34dcd01ecfa945f61fce5dbd" + integrity sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg== + +estree-util-to-js@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/estree-util-to-js/-/estree-util-to-js-1.2.0.tgz#0f80d42443e3b13bd32f7012fffa6f93603f4a36" + integrity sha512-IzU74r1PK5IMMGZXUVZbmiu4A1uhiPgW5hm1GjcOfr4ZzHaMPpLNJjR7HjXiIOzi25nZDrgFTobHTkV5Q6ITjA== + dependencies: + "@types/estree-jsx" "^1.0.0" + astring "^1.8.0" + source-map "^0.7.0" + +estree-util-to-js@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/estree-util-to-js/-/estree-util-to-js-2.0.0.tgz#10a6fb924814e6abb62becf0d2bc4dea51d04f17" + integrity sha512-WDF+xj5rRWmD5tj6bIqRi6CkLIXbbNQUcxQHzGysQzvHmdYG2G7p/Tf0J0gpxGgkeMZNTIjT/AoSvC9Xehcgdg== + dependencies: + "@types/estree-jsx" "^1.0.0" + astring "^1.8.0" + source-map "^0.7.0" + +estree-util-value-to-estree@^3.0.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/estree-util-value-to-estree/-/estree-util-value-to-estree-3.1.1.tgz#a007388eca677510f319603a2f279fed6d104a15" + integrity sha512-5mvUrF2suuv5f5cGDnDphIy4/gW86z82kl5qG6mM9z04SEQI4FB5Apmaw/TGEf3l55nLtMs5s51dmhUzvAHQCA== + dependencies: + "@types/estree" "^1.0.0" + is-plain-obj "^4.0.0" + +estree-util-visit@^1.0.0, estree-util-visit@^1.2.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/estree-util-visit/-/estree-util-visit-1.2.1.tgz#8bc2bc09f25b00827294703835aabee1cc9ec69d" + integrity sha512-xbgqcrkIVbIG+lI/gzbvd9SGTJL4zqJKBFttUl5pP27KhAjtMKbX/mQXJ7qgyXpMgVy/zvpm0xoQQaGL8OloOw== + dependencies: + "@types/estree-jsx" "^1.0.0" + "@types/unist" "^2.0.0" + +estree-util-visit@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/estree-util-visit/-/estree-util-visit-2.0.0.tgz#13a9a9f40ff50ed0c022f831ddf4b58d05446feb" + integrity sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww== + dependencies: + "@types/estree-jsx" "^1.0.0" + "@types/unist" "^3.0.0" + +estree-walker@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-3.0.3.tgz#67c3e549ec402a487b4fc193d1953a524752340d" + integrity sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g== + dependencies: + "@types/estree" "^1.0.0" + esutils@^2.0.2: version "2.0.3" - resolved "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== -eta@^1.12.3: - version "1.14.2" - resolved "https://registry.npmjs.org/eta/-/eta-1.14.2.tgz" - integrity sha512-wZmJAV7EFUG5W8XNXSazIdichnWEhGB1OWg4tnXWPj0CPNUcFdgorGNO6N9p6WBUgoUe4P0OziJYn1+6zxP2aQ== +eta@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/eta/-/eta-2.2.0.tgz#eb8b5f8c4e8b6306561a455e62cd7492fe3a9b8a" + integrity sha512-UVQ72Rqjy/ZKQalzV5dCCJP80GrmPrMxh6NlNf+erV6ObL0ZFkhCstWRawS85z3smdr3d2wXPsZEY7rDPfGd2g== etag@~1.8.1: version "1.8.1" - resolved "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz" + resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== eval@^0.1.8: version "0.1.8" - resolved "https://registry.npmjs.org/eval/-/eval-0.1.8.tgz" + resolved "https://registry.yarnpkg.com/eval/-/eval-0.1.8.tgz#2b903473b8cc1d1989b83a1e7923f883eb357f85" integrity sha512-EzV94NYKoO09GLXGjXj9JIlXijVck4ONSr5wiCWDvhsvj5jxSrzTmRU/9C1DyB6uToszLs8aifA6NQ7lEQdvFw== dependencies: "@types/node" "*" @@ -5128,22 +5104,22 @@ eval@^0.1.8: event-target-shim@^5.0.0: version "5.0.1" - resolved "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz" + resolved "https://registry.yarnpkg.com/event-target-shim/-/event-target-shim-5.0.1.tgz#5d4d3ebdf9583d63a5333ce2deb7480ab2b05789" integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ== eventemitter3@^4.0.0: version "4.0.7" - resolved "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== events@^3.2.0, events@^3.3.0: version "3.3.0" - resolved "https://registry.npmjs.org/events/-/events-3.3.0.tgz" + resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: version "1.0.3" - resolved "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz" + resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA== dependencies: md5.js "^1.3.4" @@ -5151,7 +5127,7 @@ evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: execa@^5.0.0: version "5.1.1" - resolved "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz" + resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== dependencies: cross-spawn "^7.0.3" @@ -5166,20 +5142,20 @@ execa@^5.0.0: exenv@^1.2.0: version "1.2.2" - resolved "https://registry.npmjs.org/exenv/-/exenv-1.2.2.tgz" + resolved "https://registry.yarnpkg.com/exenv/-/exenv-1.2.2.tgz#2ae78e85d9894158670b03d47bec1f03bd91bb9d" integrity sha512-Z+ktTxTwv9ILfgKCk32OX3n/doe+OcLTRtqK9pcL+JsP3J1/VW8Uvl4ZjLlKqeW4rzK4oesDOGMEMRIZqtP4Iw== express@^4.17.3: - version "4.18.1" - resolved "https://registry.npmjs.org/express/-/express-4.18.1.tgz" - integrity sha512-zZBcOX9TfehHQhtupq57OF8lFZ3UZi08Y97dwFCkD8p9d/d2Y3M+ykKcwaMDEL+4qyUolgBDX6AblpR3fL212Q== + version "4.19.2" + resolved "https://registry.yarnpkg.com/express/-/express-4.19.2.tgz#e25437827a3aa7f2a827bc8171bbbb664a356465" + integrity sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q== dependencies: accepts "~1.3.8" array-flatten "1.1.1" - body-parser "1.20.0" + body-parser "1.20.2" content-disposition "0.5.4" content-type "~1.0.4" - cookie "0.5.0" + cookie "0.6.0" cookie-signature "1.0.6" debug "2.6.9" depd "2.0.0" @@ -5195,7 +5171,7 @@ express@^4.17.3: parseurl "~1.3.3" path-to-regexp "0.1.7" proxy-addr "~2.0.7" - qs "6.10.3" + qs "6.11.0" range-parser "~1.2.1" safe-buffer "5.2.1" send "0.18.0" @@ -5208,25 +5184,36 @@ express@^4.17.3: extend-shallow@^2.0.1: version "2.0.1" - resolved "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" integrity sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug== dependencies: is-extendable "^0.1.0" extend@^3.0.0: version "3.0.2" - resolved "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz" + resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== +extract-zip@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-2.0.1.tgz#663dca56fe46df890d5f131ef4a06d22bb8ba13a" + integrity sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg== + dependencies: + debug "^4.1.1" + get-stream "^5.1.0" + yauzl "^2.10.0" + optionalDependencies: + "@types/yauzl" "^2.9.1" + fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: version "3.1.3" - resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== -fast-glob@^3.2.11, fast-glob@^3.2.12, fast-glob@^3.2.9: - version "3.2.12" - resolved "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz" - integrity sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w== +fast-glob@^3.2.11, fast-glob@^3.2.9, fast-glob@^3.3.0: + version "3.3.2" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129" + integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow== dependencies: "@nodelib/fs.stat" "^2.0.2" "@nodelib/fs.walk" "^1.2.3" @@ -5236,70 +5223,59 @@ fast-glob@^3.2.11, fast-glob@^3.2.12, fast-glob@^3.2.9: fast-json-stable-stringify@^2.0.0: version "2.1.0" - resolved "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== -fast-safe-stringify@^2.0.7, fast-safe-stringify@^2.1.1: +fast-safe-stringify@^2.0.7: version "2.1.1" - resolved "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz" + resolved "https://registry.yarnpkg.com/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz#c406a83b6e70d9e35ce3b30a81141df30aeba884" integrity sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA== fast-url-parser@1.1.3: version "1.1.3" - resolved "https://registry.npmjs.org/fast-url-parser/-/fast-url-parser-1.1.3.tgz" + resolved "https://registry.yarnpkg.com/fast-url-parser/-/fast-url-parser-1.1.3.tgz#f4af3ea9f34d8a271cf58ad2b3759f431f0b318d" integrity sha512-5jOCVXADYNuRkKFzNJ0dCCewsZiYo0dz8QNYljkOpFC6r2U4OBmKtvm/Tsuh4w1YYdDqDb31a8TVhBJ2OJKdqQ== dependencies: punycode "^1.3.2" fastq@^1.6.0: - version "1.13.0" - resolved "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz" - integrity sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw== + version "1.17.1" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.17.1.tgz#2a523f07a4e7b1e81a42b91b8bf2254107753b47" + integrity sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w== dependencies: reusify "^1.0.4" +fault@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/fault/-/fault-2.0.1.tgz#d47ca9f37ca26e4bd38374a7c500b5a384755b6c" + integrity sha512-WtySTkS4OKev5JtpHXnib4Gxiurzh5NCGvWrFaZ34m6JehfTUhKZvn9njTfw48t6JumVQOmrKqpmGcdwxnhqBQ== + dependencies: + format "^0.2.0" + faye-websocket@^0.11.3: version "0.11.4" - resolved "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz" + resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.11.4.tgz#7f0d9275cfdd86a1c963dc8b65fcc451edcbb1da" integrity sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g== dependencies: websocket-driver ">=0.5.1" -fbemitter@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/fbemitter/-/fbemitter-3.0.0.tgz" - integrity sha512-KWKaceCwKQU0+HPoop6gn4eOHk50bBv/VxjJtGMfwmJt3D29JpN4H4eisCtIPA+a8GVBam+ldMMpMjJUvpDyHw== +fd-slicer@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.1.0.tgz#25c7c89cb1f9077f8891bbe61d8f390eae256f1e" + integrity sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g== dependencies: - fbjs "^3.0.0" - -fbjs-css-vars@^1.0.0: - version "1.0.2" - resolved "https://registry.npmjs.org/fbjs-css-vars/-/fbjs-css-vars-1.0.2.tgz" - integrity sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ== - -fbjs@^3.0.0, fbjs@^3.0.1: - version "3.0.4" - resolved "https://registry.npmjs.org/fbjs/-/fbjs-3.0.4.tgz" - integrity sha512-ucV0tDODnGV3JCnnkmoszb5lf4bNpzjv80K41wd4k798Etq+UYD0y0TIfalLjZoKgjive6/adkRnszwapiDgBQ== - dependencies: - cross-fetch "^3.1.5" - fbjs-css-vars "^1.0.0" - loose-envify "^1.0.0" - object-assign "^4.1.0" - promise "^7.1.1" - setimmediate "^1.0.5" - ua-parser-js "^0.7.30" + pend "~1.2.0" feed@^4.2.2: version "4.2.2" - resolved "https://registry.npmjs.org/feed/-/feed-4.2.2.tgz" + resolved "https://registry.yarnpkg.com/feed/-/feed-4.2.2.tgz#865783ef6ed12579e2c44bbef3c9113bc4956a7e" integrity sha512-u5/sxGfiMfZNtJ3OvQpXcvotFpYkL0n9u9mM2vkui2nGo8b4wvDkJ8gAkYqbA8QpGyFCv3RK0Z+Iv+9veCS9bQ== dependencies: xml-js "^1.6.11" file-loader@^6.2.0: version "6.2.0" - resolved "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz" + resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-6.2.0.tgz#baef7cf8e1840df325e4390b4484879480eebe4d" integrity sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw== dependencies: loader-utils "^2.0.0" @@ -5307,34 +5283,34 @@ file-loader@^6.2.0: file-saver@^2.0.5: version "2.0.5" - resolved "https://registry.npmjs.org/file-saver/-/file-saver-2.0.5.tgz" + resolved "https://registry.yarnpkg.com/file-saver/-/file-saver-2.0.5.tgz#d61cfe2ce059f414d899e9dd6d4107ee25670c38" integrity sha512-P9bmyZ3h/PRG+Nzga+rbdI4OEpNDzAVyy74uVO9ATgzLK6VtAsYybF/+TOCvrc0MO793d6+42lLyZTw7/ArVzA== file-type@3.9.0: version "3.9.0" - resolved "https://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz" + resolved "https://registry.yarnpkg.com/file-type/-/file-type-3.9.0.tgz#257a078384d1db8087bc449d107d52a52672b9e9" integrity sha512-RLoqTXE8/vPmMuTI88DAzhMYC99I8BWv7zYP4A1puo5HIjEJ5EX48ighy4ZyKMG9EDXxBgW6e++cn7d1xuFghA== filesize@^8.0.6: version "8.0.7" - resolved "https://registry.npmjs.org/filesize/-/filesize-8.0.7.tgz" + resolved "https://registry.yarnpkg.com/filesize/-/filesize-8.0.7.tgz#695e70d80f4e47012c132d57a059e80c6b580bd8" integrity sha512-pjmC+bkIF8XI7fWaH8KxHcZL3DPybs1roSKP4rKDvy20tAWwIObE4+JIseG2byfGKhud5ZnM4YSGKBz7Sh0ndQ== -fill-range@^7.0.1: - version "7.0.1" - resolved "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz" - integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== +fill-range@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292" + integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== dependencies: to-regex-range "^5.0.1" filter-obj@^2.0.2: version "2.0.2" - resolved "https://registry.npmjs.org/filter-obj/-/filter-obj-2.0.2.tgz" + resolved "https://registry.yarnpkg.com/filter-obj/-/filter-obj-2.0.2.tgz#fff662368e505d69826abb113f0f6a98f56e9d5f" integrity sha512-lO3ttPjHZRfjMcxWKb1j1eDhTFsu4meeR3lnMcnBFhk6RuLhvEiuALu2TlfL310ph4lCYYwgF/ElIjdP739tdg== finalhandler@1.2.0: version "1.2.0" - resolved "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.2.0.tgz#7d23fe5731b207b4640e4fcd00aec1f9207a7b32" integrity sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg== dependencies: debug "2.6.9" @@ -5345,25 +5321,24 @@ finalhandler@1.2.0: statuses "2.0.1" unpipe "~1.0.0" -find-cache-dir@^3.3.1: - version "3.3.2" - resolved "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz" - integrity sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig== +find-cache-dir@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-4.0.0.tgz#a30ee0448f81a3990708f6453633c733e2f6eec2" + integrity sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg== dependencies: - commondir "^1.0.1" - make-dir "^3.0.2" - pkg-dir "^4.1.0" + common-path-prefix "^3.0.0" + pkg-dir "^7.0.0" find-up@^3.0.0: version "3.0.0" - resolved "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== dependencies: locate-path "^3.0.0" -find-up@^4.0.0, find-up@^4.1.0: +find-up@^4.1.0: version "4.1.0" - resolved "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== dependencies: locate-path "^5.0.0" @@ -5371,41 +5346,54 @@ find-up@^4.0.0, find-up@^4.1.0: find-up@^5.0.0: version "5.0.0" - resolved "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== dependencies: locate-path "^6.0.0" path-exists "^4.0.0" -flux@^4.0.1: - version "4.0.3" - resolved "https://registry.npmjs.org/flux/-/flux-4.0.3.tgz" - integrity sha512-yKAbrp7JhZhj6uiT1FTuVMlIAT1J4jqEyBpFApi1kxpGZCvacMVc/t1pMQyotqHhAgvoE3bNvAykhCo2CLjnYw== +find-up@^6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-6.3.0.tgz#2abab3d3280b2dc7ac10199ef324c4e002c8c790" + integrity sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw== dependencies: - fbemitter "^3.0.0" - fbjs "^3.0.1" + locate-path "^7.1.0" + path-exists "^5.0.0" + +flat@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" + integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== follow-redirects@^1.0.0, follow-redirects@^1.14.7: - version "1.15.0" - resolved "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.0.tgz" - integrity sha512-aExlJShTV4qOUOL7yF1U5tvLCB0xQuudbf6toyYA0E/acBNw71mvjFTnLaRp50aQaYocMR0a/RMMBIHeZnGyjQ== + version "1.15.6" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.6.tgz#7f815c0cda4249c74ff09e95ef97c23b5fd0399b" + integrity sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA== for-each@^0.3.3: version "0.3.3" - resolved "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz" + resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== dependencies: is-callable "^1.1.3" foreach@^2.0.4: version "2.0.6" - resolved "https://registry.npmjs.org/foreach/-/foreach-2.0.6.tgz" + resolved "https://registry.yarnpkg.com/foreach/-/foreach-2.0.6.tgz#87bcc8a1a0e74000ff2bf9802110708cfb02eb6e" integrity sha512-k6GAGDyqLe9JaebCsFCoudPPWfihKu8pylYXRlqP1J7ms39iPoTtk2fviNglIeQEwdh0bQeKJ01ZPyuyQvKzwg== +foreground-child@^3.1.0: + version "3.2.1" + resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.2.1.tgz#767004ccf3a5b30df39bed90718bab43fe0a59f7" + integrity sha512-PXUUyLqrR2XCWICfv6ukppP96sdFwWbNEnfEMt7jNsISjMsvaLNinAHNDYyvkyU+SZG2BTSbT5NjG+vZslfGTA== + dependencies: + cross-spawn "^7.0.0" + signal-exit "^4.0.1" + fork-ts-checker-webpack-plugin@^6.5.0: - version "6.5.2" - resolved "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.2.tgz" - integrity sha512-m5cUmF30xkZ7h4tWUgTAcEaKmUW7tfyUyTqNNOz7OxWJ0v1VWKTcOvH8FWHUwSjlW/356Ijc9vi3XfcPstpQKA== + version "6.5.3" + resolved "https://registry.yarnpkg.com/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.3.tgz#eda2eff6e22476a2688d10661688c47f611b37f3" + integrity sha512-SbH/l9ikmMWycd5puHJKTkZJKddF4iRLyW3DeZ08HTI7NGyLS38MXd/KGgeWumQO7YNQbW2u/NtPT2YowbPaGQ== dependencies: "@babel/code-frame" "^7.8.3" "@types/json-schema" "^7.0.5" @@ -5421,44 +5409,40 @@ fork-ts-checker-webpack-plugin@^6.5.0: semver "^7.3.2" tapable "^1.0.0" -form-data@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz" - integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.8" - mime-types "^2.1.12" +form-data-encoder@^2.1.2: + version "2.1.4" + resolved "https://registry.yarnpkg.com/form-data-encoder/-/form-data-encoder-2.1.4.tgz#261ea35d2a70d48d30ec7a9603130fa5515e9cd5" + integrity sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw== -formidable@^2.0.1: - version "2.1.1" - resolved "https://registry.npmjs.org/formidable/-/formidable-2.1.1.tgz" - integrity sha512-0EcS9wCFEzLvfiks7omJ+SiYJAiD+TzK4Pcw1UlUoGnhUxDcMKjt0P7x8wEb0u6OHu8Nb98WG3nxtlF5C7bvUQ== - dependencies: - dezalgo "^1.0.4" - hexoid "^1.0.0" - once "^1.4.0" - qs "^6.11.0" +format@^0.2.0: + version "0.2.2" + resolved "https://registry.yarnpkg.com/format/-/format-0.2.2.tgz#d6170107e9efdc4ed30c9dc39016df942b5cb58b" + integrity sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww== forwarded@0.2.0: version "0.2.0" - resolved "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz" + resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== -fraction.js@^4.2.0: - version "4.2.0" - resolved "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz" - integrity sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA== +fraction.js@^4.3.7: + version "4.3.7" + resolved "https://registry.yarnpkg.com/fraction.js/-/fraction.js-4.3.7.tgz#06ca0085157e42fda7f9e726e79fefc4068840f7" + integrity sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew== fresh@0.5.2: version "0.5.2" - resolved "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz" + resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== -fs-extra@^10.1.0: - version "10.1.0" - resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz" - integrity sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ== +fs-constants@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" + integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== + +fs-extra@^11.1.1, fs-extra@^11.2.0: + version "11.2.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-11.2.0.tgz#e70e17dfad64232287d01929399e0ea7c86b0e5b" + integrity sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw== dependencies: graceful-fs "^4.2.0" jsonfile "^6.0.1" @@ -5466,7 +5450,7 @@ fs-extra@^10.1.0: fs-extra@^9.0.0, fs-extra@^9.0.1: version "9.1.0" - resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== dependencies: at-least-node "^1.0.0" @@ -5475,108 +5459,101 @@ fs-extra@^9.0.0, fs-extra@^9.0.1: universalify "^2.0.0" fs-monkey@^1.0.4: - version "1.0.4" - resolved "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.4.tgz" - integrity sha512-INM/fWAxMICjttnD0DX1rBvinKskj5G1w+oy/pnm9u/tSlnBrzFonJMcalKJ30P8RRsPzKcCG7Q8l0jx5Fh9YQ== + version "1.0.6" + resolved "https://registry.yarnpkg.com/fs-monkey/-/fs-monkey-1.0.6.tgz#8ead082953e88d992cf3ff844faa907b26756da2" + integrity sha512-b1FMfwetIKymC0eioW7mTywihSQE4oLzQn1dB6rZB5fx/3NpNEdAWeCSMB+60/AeT0TCXsxzAlcYVEFCTAksWg== fs.realpath@^1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== fsevents@~2.3.2: - version "2.3.2" - resolved "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz" - integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== + version "2.3.3" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" + integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== -function-bind@^1.1.1: - version "1.1.1" - resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz" - integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== +function-bind@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" + integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== -gensync@^1.0.0-beta.1, gensync@^1.0.0-beta.2: +gensync@^1.0.0-beta.2: version "1.0.0-beta.2" - resolved "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz" + resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== get-caller-file@^2.0.1, get-caller-file@^2.0.5: version "2.0.5" - resolved "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== -get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3: - version "1.2.1" - resolved "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz" - integrity sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw== +get-intrinsic@^1.1.3, get-intrinsic@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.4.tgz#e385f5a4b5227d449c3eabbad05494ef0abbeadd" + integrity sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ== dependencies: - function-bind "^1.1.1" - has "^1.0.3" + es-errors "^1.3.0" + function-bind "^1.1.2" has-proto "^1.0.1" has-symbols "^1.0.3" + hasown "^2.0.0" get-own-enumerable-property-symbols@^3.0.0: version "3.0.2" - resolved "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz" + resolved "https://registry.yarnpkg.com/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz#b5fde77f22cbe35f390b4e089922c50bce6ef664" integrity sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g== -get-stream@^4.1.0: - version "4.1.0" - resolved "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz" - integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== - dependencies: - pump "^3.0.0" - get-stream@^5.1.0: version "5.2.0" - resolved "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== dependencies: pump "^3.0.0" -get-stream@^6.0.0: +get-stream@^6.0.0, get-stream@^6.0.1: version "6.0.1" - resolved "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== -github-slugger@^1.4.0: +github-slugger@^1.5.0: version "1.5.0" - resolved "https://registry.npmjs.org/github-slugger/-/github-slugger-1.5.0.tgz" + resolved "https://registry.yarnpkg.com/github-slugger/-/github-slugger-1.5.0.tgz#17891bbc73232051474d68bd867a34625c955f7d" integrity sha512-wIh+gKBI9Nshz2o46B0B3f5k/W+WI9ZAv6y5Dn5WJ5SK1t0TnDimB4WE5rmTD05ZAIn8HALCZVmCsvj0w0v0lw== glob-parent@^5.1.2, glob-parent@~5.1.2: version "5.1.2" - resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== dependencies: is-glob "^4.0.1" glob-parent@^6.0.1, glob-parent@^6.0.2: version "6.0.2" - resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== dependencies: is-glob "^4.0.3" glob-to-regexp@^0.4.1: version "0.4.1" - resolved "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz" + resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e" integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== -glob@7.1.6: - version "7.1.6" - resolved "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz" - integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== +glob@^10.3.10: + version "10.4.1" + resolved "https://registry.yarnpkg.com/glob/-/glob-10.4.1.tgz#0cfb01ab6a6b438177bfe6a58e2576f6efe909c2" + integrity sha512-2jelhlq3E4ho74ZyVLN03oKdAZVUa6UDZzFLVH1H7dnoax+y9qyaq8zBkfDIggjniU19z0wU18y16jMB2eyVIw== dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.0.4" - once "^1.3.0" - path-is-absolute "^1.0.0" + foreground-child "^3.1.0" + jackspeak "^3.1.2" + minimatch "^9.0.4" + minipass "^7.1.2" + path-scurry "^1.11.1" glob@^7.0.0, glob@^7.1.3, glob@^7.1.6: version "7.2.3" - resolved "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== dependencies: fs.realpath "^1.0.0" @@ -5587,22 +5564,22 @@ glob@^7.0.0, glob@^7.1.3, glob@^7.1.6: path-is-absolute "^1.0.0" global-dirs@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.0.tgz" - integrity sha512-v8ho2DS5RiCjftj1nD9NmnfaOzTdud7RRnVd9kFNOjqZbISlx5DQ+OrTkywgd0dIt7oFCvKetZSHoHcP3sDdiA== + version "3.0.1" + resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-3.0.1.tgz#0c488971f066baceda21447aecb1a8b911d22485" + integrity sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA== dependencies: ini "2.0.0" global-modules@^2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz" + resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-2.0.0.tgz#997605ad2345f27f51539bea26574421215c7780" integrity sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A== dependencies: global-prefix "^3.0.0" global-prefix@^3.0.0: version "3.0.0" - resolved "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz" + resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-3.0.0.tgz#fc85f73064df69f50421f47f883fe5b913ba9b97" integrity sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg== dependencies: ini "^1.3.5" @@ -5611,12 +5588,12 @@ global-prefix@^3.0.0: globals@^11.1.0: version "11.12.0" - resolved "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz" + resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== globby@^11.0.1, globby@^11.0.4, globby@^11.1.0: version "11.1.0" - resolved "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz" + resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== dependencies: array-union "^2.1.0" @@ -5627,55 +5604,53 @@ globby@^11.0.1, globby@^11.0.4, globby@^11.1.0: slash "^3.0.0" globby@^13.1.1: - version "13.1.2" - resolved "https://registry.npmjs.org/globby/-/globby-13.1.2.tgz" - integrity sha512-LKSDZXToac40u8Q1PQtZihbNdTYSNMuWe+K5l+oa6KgDzSvVrHXlJy40hUP522RjAIoNLJYBJi7ow+rbFpIhHQ== + version "13.2.2" + resolved "https://registry.yarnpkg.com/globby/-/globby-13.2.2.tgz#63b90b1bf68619c2135475cbd4e71e66aa090592" + integrity sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w== dependencies: dir-glob "^3.0.1" - fast-glob "^3.2.11" - ignore "^5.2.0" + fast-glob "^3.3.0" + ignore "^5.2.4" merge2 "^1.4.1" slash "^4.0.0" gopd@^1.0.1: version "1.0.1" - resolved "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz" + resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== dependencies: get-intrinsic "^1.1.3" -got@^9.6.0: - version "9.6.0" - resolved "https://registry.npmjs.org/got/-/got-9.6.0.tgz" - integrity sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q== +got@^12.1.0: + version "12.6.1" + resolved "https://registry.yarnpkg.com/got/-/got-12.6.1.tgz#8869560d1383353204b5a9435f782df9c091f549" + integrity sha512-mThBblvlAF1d4O5oqyvN+ZxLAYwIJK7bpMxgYqPD9okW0C3qm5FFn7k811QrcuEBwaogR3ngOFoCfs6mRv7teQ== dependencies: - "@sindresorhus/is" "^0.14.0" - "@szmarczak/http-timer" "^1.1.2" - cacheable-request "^6.0.0" - decompress-response "^3.3.0" - duplexer3 "^0.1.4" - get-stream "^4.1.0" - lowercase-keys "^1.0.1" - mimic-response "^1.0.1" - p-cancelable "^1.0.0" - to-readable-stream "^1.0.0" - url-parse-lax "^3.0.0" + "@sindresorhus/is" "^5.2.0" + "@szmarczak/http-timer" "^5.0.1" + cacheable-lookup "^7.0.0" + cacheable-request "^10.2.8" + decompress-response "^6.0.0" + form-data-encoder "^2.1.2" + get-stream "^6.0.1" + http2-wrapper "^2.1.10" + lowercase-keys "^3.0.0" + p-cancelable "^3.0.0" + responselike "^3.0.0" -graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4, graceful-fs@^4.2.6, graceful-fs@^4.2.9: +graceful-fs@4.2.10: version "4.2.10" - resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== -graphlib@^2.1.8: - version "2.1.8" - resolved "https://registry.npmjs.org/graphlib/-/graphlib-2.1.8.tgz" - integrity sha512-jcLLfkpoVGmH7/InMC/1hIvOPSUh38oJtGhvrOFGzioE1DZ+0YW16RgmOJhHiuWTvGiJQ9Z1Ik43JvkRPRvE+A== - dependencies: - lodash "^4.17.15" +graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.11, graceful-fs@^4.2.4, graceful-fs@^4.2.6, graceful-fs@^4.2.9: + version "4.2.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" + integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== gray-matter@^4.0.3: version "4.0.3" - resolved "https://registry.npmjs.org/gray-matter/-/gray-matter-4.0.3.tgz" + resolved "https://registry.yarnpkg.com/gray-matter/-/gray-matter-4.0.3.tgz#e893c064825de73ea1f5f7d88c7a9f7274288798" integrity sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q== dependencies: js-yaml "^3.13.1" @@ -5685,107 +5660,101 @@ gray-matter@^4.0.3: gzip-size@^6.0.0: version "6.0.0" - resolved "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz" + resolved "https://registry.yarnpkg.com/gzip-size/-/gzip-size-6.0.0.tgz#065367fd50c239c0671cbcbad5be3e2eeb10e462" integrity sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q== dependencies: duplexer "^0.1.2" handle-thing@^2.0.0: version "2.0.1" - resolved "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz" + resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-2.0.1.tgz#857f79ce359580c340d43081cc648970d0bb234e" integrity sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg== has-flag@^3.0.0: version "3.0.0" - resolved "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== has-flag@^4.0.0: version "4.0.0" - resolved "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== -has-property-descriptors@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz" - integrity sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ== +has-property-descriptors@^1.0.0, has-property-descriptors@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz#963ed7d071dc7bf5f084c5bfbe0d1b6222586854" + integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg== dependencies: - get-intrinsic "^1.1.1" + es-define-property "^1.0.0" has-proto@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz" - integrity sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg== - -has-symbols@^1.0.1, has-symbols@^1.0.2, has-symbols@^1.0.3: version "1.0.3" - resolved "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz" + resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.3.tgz#b31ddfe9b0e6e9914536a6ab286426d0214f77fd" + integrity sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q== + +has-symbols@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== -has-tostringtag@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz" - integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== +has-tostringtag@^1.0.0, has-tostringtag@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz#2cdc42d40bef2e5b4eeab7c01a73c54ce7ab5abc" + integrity sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw== dependencies: - has-symbols "^1.0.2" + has-symbols "^1.0.3" -has-yarn@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz" - integrity sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw== - -has@^1.0.3: - version "1.0.3" - resolved "https://registry.npmjs.org/has/-/has-1.0.3.tgz" - integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== - dependencies: - function-bind "^1.1.1" +has-yarn@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-yarn/-/has-yarn-3.0.0.tgz#c3c21e559730d1d3b57e28af1f30d06fac38147d" + integrity sha512-IrsVwUHhEULx3R8f/aA8AHuEzAorplsab/v8HBzEiIukwq5i/EC+xmOW+HfP1OaDP+2JkgT1yILHN2O3UFIbcA== hash-base@^3.0.0: version "3.1.0" - resolved "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz" + resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.1.0.tgz#55c381d9e06e1d2997a883b4a3fddfe7f0d3af33" integrity sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA== dependencies: inherits "^2.0.4" readable-stream "^3.6.0" safe-buffer "^5.2.0" +hash-base@~3.0: + version "3.0.4" + resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.0.4.tgz#5fc8686847ecd73499403319a6b0a3f3f6ae4918" + integrity sha512-EeeoJKjTyt868liAlVmcv2ZsUfGHlE3Q+BICOXcZiwN3osr5Q/zFGYmTJpoIzuaSTAwndFy+GqhEwlU4L3j4Ow== + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + hash.js@^1.0.0, hash.js@^1.0.3: version "1.1.7" - resolved "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz" + resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== dependencies: inherits "^2.0.3" minimalistic-assert "^1.0.1" -hast-to-hyperscript@^9.0.0: - version "9.0.1" - resolved "https://registry.npmjs.org/hast-to-hyperscript/-/hast-to-hyperscript-9.0.1.tgz" - integrity sha512-zQgLKqF+O2F72S1aa4y2ivxzSlko3MAvxkwG8ehGmNiqd98BIN3JM1rAJPmplEyLmGLO2QZYJtIneOSZ2YbJuA== +hasown@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" + integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== dependencies: - "@types/unist" "^2.0.3" - comma-separated-tokens "^1.0.0" - property-information "^5.3.0" - space-separated-tokens "^1.0.0" - style-to-object "^0.3.0" - unist-util-is "^4.0.0" - web-namespaces "^1.0.0" + function-bind "^1.1.2" -hast-util-from-parse5@^6.0.0: - version "6.0.1" - resolved "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-6.0.1.tgz" - integrity sha512-jeJUWiN5pSxW12Rh01smtVkZgZr33wBokLzKLwinYOUfSzm1Nl/c3GUGebDyOKjdsRgMvoVbV0VpAcpjF4NrJA== +hast-util-from-html@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/hast-util-from-html/-/hast-util-from-html-1.0.2.tgz#2482fd701b2d8270b912b3909d6fb645d4a346cf" + integrity sha512-LhrTA2gfCbLOGJq2u/asp4kwuG0y6NhWTXiPKP+n0qNukKy7hc10whqqCFfyvIA1Q5U5d0sp9HhNim9gglEH4A== dependencies: - "@types/parse5" "^5.0.0" - hastscript "^6.0.0" - property-information "^5.0.0" - vfile "^4.0.0" - vfile-location "^3.2.0" - web-namespaces "^1.0.0" + "@types/hast" "^2.0.0" + hast-util-from-parse5 "^7.0.0" + parse5 "^7.0.0" + vfile "^5.0.0" + vfile-message "^3.0.0" hast-util-from-parse5@^7.0.0: version "7.1.2" - resolved "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-7.1.2.tgz" + resolved "https://registry.yarnpkg.com/hast-util-from-parse5/-/hast-util-from-parse5-7.1.2.tgz#aecfef73e3ceafdfa4550716443e4eb7b02e22b0" integrity sha512-Nz7FfPBuljzsN3tCQ4kCBKqdNhQE2l0Tn+X1ubgKBPRoiDIu1mL08Cfw4k7q71+Duyaw7DXDN+VTAp4Vh3oCOw== dependencies: "@types/hast" "^2.0.0" @@ -5796,37 +5765,37 @@ hast-util-from-parse5@^7.0.0: vfile-location "^4.0.0" web-namespaces "^2.0.0" -hast-util-parse-selector@^2.0.0: - version "2.2.5" - resolved "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-2.2.5.tgz" - integrity sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ== +hast-util-from-parse5@^8.0.0: + version "8.0.1" + resolved "https://registry.yarnpkg.com/hast-util-from-parse5/-/hast-util-from-parse5-8.0.1.tgz#654a5676a41211e14ee80d1b1758c399a0327651" + integrity sha512-Er/Iixbc7IEa7r/XLtuG52zoqn/b3Xng/w6aZQ0xGVxzhw5xUFxcRqdPzP6yFi/4HBYRaifaI5fQ1RH8n0ZeOQ== + dependencies: + "@types/hast" "^3.0.0" + "@types/unist" "^3.0.0" + devlop "^1.0.0" + hastscript "^8.0.0" + property-information "^6.0.0" + vfile "^6.0.0" + vfile-location "^5.0.0" + web-namespaces "^2.0.0" hast-util-parse-selector@^3.0.0: version "3.1.1" - resolved "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-3.1.1.tgz" + resolved "https://registry.yarnpkg.com/hast-util-parse-selector/-/hast-util-parse-selector-3.1.1.tgz#25ab00ae9e75cbc62cf7a901f68a247eade659e2" integrity sha512-jdlwBjEexy1oGz0aJ2f4GKMaVKkA9jwjr4MjAAI22E5fM/TXVZHuS5OpONtdeIkRKqAaryQ2E9xNQxijoThSZA== dependencies: "@types/hast" "^2.0.0" -hast-util-raw@6.0.1: - version "6.0.1" - resolved "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-6.0.1.tgz" - integrity sha512-ZMuiYA+UF7BXBtsTBNcLBF5HzXzkyE6MLzJnL605LKE8GJylNjGc4jjxazAHUtcwT5/CEt6afRKViYB4X66dig== +hast-util-parse-selector@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/hast-util-parse-selector/-/hast-util-parse-selector-4.0.0.tgz#352879fa86e25616036037dd8931fb5f34cb4a27" + integrity sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A== dependencies: - "@types/hast" "^2.0.0" - hast-util-from-parse5 "^6.0.0" - hast-util-to-parse5 "^6.0.0" - html-void-elements "^1.0.0" - parse5 "^6.0.0" - unist-util-position "^3.0.0" - vfile "^4.0.0" - web-namespaces "^1.0.0" - xtend "^4.0.0" - zwitch "^1.0.0" + "@types/hast" "^3.0.0" hast-util-raw@^7.2.0: version "7.2.3" - resolved "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-7.2.3.tgz" + resolved "https://registry.yarnpkg.com/hast-util-raw/-/hast-util-raw-7.2.3.tgz#dcb5b22a22073436dbdc4aa09660a644f4991d99" integrity sha512-RujVQfVsOrxzPOPSzZFiwofMArbQke6DJjnFfceiEbFh7S05CbPt0cYN+A5YeD3pso0JQk6O1aHBnx9+Pm2uqg== dependencies: "@types/hast" "^2.0.0" @@ -5841,20 +5810,92 @@ hast-util-raw@^7.2.0: web-namespaces "^2.0.0" zwitch "^2.0.0" -hast-util-to-parse5@^6.0.0: - version "6.0.0" - resolved "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-6.0.0.tgz" - integrity sha512-Lu5m6Lgm/fWuz8eWnrKezHtVY83JeRGaNQ2kn9aJgqaxvVkFCZQBEhgodZUDUvoodgyROHDb3r5IxAEdl6suJQ== +hast-util-raw@^9.0.0: + version "9.0.3" + resolved "https://registry.yarnpkg.com/hast-util-raw/-/hast-util-raw-9.0.3.tgz#87ad66bdd7b1ceb166452bdab7dfb3e9ba640419" + integrity sha512-ICWvVOF2fq4+7CMmtCPD5CM4QKjPbHpPotE6+8tDooV0ZuyJVUzHsrNX+O5NaRbieTf0F7FfeBOMAwi6Td0+yQ== dependencies: - hast-to-hyperscript "^9.0.0" - property-information "^5.0.0" - web-namespaces "^1.0.0" - xtend "^4.0.0" - zwitch "^1.0.0" + "@types/hast" "^3.0.0" + "@types/unist" "^3.0.0" + "@ungap/structured-clone" "^1.0.0" + hast-util-from-parse5 "^8.0.0" + hast-util-to-parse5 "^8.0.0" + html-void-elements "^3.0.0" + mdast-util-to-hast "^13.0.0" + parse5 "^7.0.0" + unist-util-position "^5.0.0" + unist-util-visit "^5.0.0" + vfile "^6.0.0" + web-namespaces "^2.0.0" + zwitch "^2.0.0" + +hast-util-to-estree@^2.1.0: + version "2.3.3" + resolved "https://registry.yarnpkg.com/hast-util-to-estree/-/hast-util-to-estree-2.3.3.tgz#da60142ffe19a6296923ec222aba73339c8bf470" + integrity sha512-ihhPIUPxN0v0w6M5+IiAZZrn0LH2uZomeWwhn7uP7avZC6TE7lIiEh2yBMPr5+zi1aUCXq6VoYRgs2Bw9xmycQ== + dependencies: + "@types/estree" "^1.0.0" + "@types/estree-jsx" "^1.0.0" + "@types/hast" "^2.0.0" + "@types/unist" "^2.0.0" + comma-separated-tokens "^2.0.0" + estree-util-attach-comments "^2.0.0" + estree-util-is-identifier-name "^2.0.0" + hast-util-whitespace "^2.0.0" + mdast-util-mdx-expression "^1.0.0" + mdast-util-mdxjs-esm "^1.0.0" + property-information "^6.0.0" + space-separated-tokens "^2.0.0" + style-to-object "^0.4.1" + unist-util-position "^4.0.0" + zwitch "^2.0.0" + +hast-util-to-estree@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/hast-util-to-estree/-/hast-util-to-estree-3.1.0.tgz#f2afe5e869ddf0cf690c75f9fc699f3180b51b19" + integrity sha512-lfX5g6hqVh9kjS/B9E2gSkvHH4SZNiQFiqWS0x9fENzEl+8W12RqdRxX6d/Cwxi30tPQs3bIO+aolQJNp1bIyw== + dependencies: + "@types/estree" "^1.0.0" + "@types/estree-jsx" "^1.0.0" + "@types/hast" "^3.0.0" + comma-separated-tokens "^2.0.0" + devlop "^1.0.0" + estree-util-attach-comments "^3.0.0" + estree-util-is-identifier-name "^3.0.0" + hast-util-whitespace "^3.0.0" + mdast-util-mdx-expression "^2.0.0" + mdast-util-mdx-jsx "^3.0.0" + mdast-util-mdxjs-esm "^2.0.0" + property-information "^6.0.0" + space-separated-tokens "^2.0.0" + style-to-object "^0.4.0" + unist-util-position "^5.0.0" + zwitch "^2.0.0" + +hast-util-to-jsx-runtime@^2.0.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.3.0.tgz#3ed27caf8dc175080117706bf7269404a0aa4f7c" + integrity sha512-H/y0+IWPdsLLS738P8tDnrQ8Z+dj12zQQ6WC11TIM21C8WFVoIxcqWXf2H3hiTVZjF1AWqoimGwrTWecWrnmRQ== + dependencies: + "@types/estree" "^1.0.0" + "@types/hast" "^3.0.0" + "@types/unist" "^3.0.0" + comma-separated-tokens "^2.0.0" + devlop "^1.0.0" + estree-util-is-identifier-name "^3.0.0" + hast-util-whitespace "^3.0.0" + mdast-util-mdx-expression "^2.0.0" + mdast-util-mdx-jsx "^3.0.0" + mdast-util-mdxjs-esm "^2.0.0" + property-information "^6.0.0" + space-separated-tokens "^2.0.0" + style-to-object "^1.0.0" + unist-util-position "^5.0.0" + vfile-message "^4.0.0" hast-util-to-parse5@^7.0.0: version "7.1.0" - resolved "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-7.1.0.tgz" + resolved "https://registry.yarnpkg.com/hast-util-to-parse5/-/hast-util-to-parse5-7.1.0.tgz#c49391bf8f151973e0c9adcd116b561e8daf29f3" integrity sha512-YNRgAJkH2Jky5ySkIqFXTQiaqcAtJyVE+D5lkN6CdtOqrnkLfGYYrEcKuHOJZlp+MwjSwuD3fZuawI+sic/RBw== dependencies: "@types/hast" "^2.0.0" @@ -5864,25 +5905,34 @@ hast-util-to-parse5@^7.0.0: web-namespaces "^2.0.0" zwitch "^2.0.0" +hast-util-to-parse5@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/hast-util-to-parse5/-/hast-util-to-parse5-8.0.0.tgz#477cd42d278d4f036bc2ea58586130f6f39ee6ed" + integrity sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw== + dependencies: + "@types/hast" "^3.0.0" + comma-separated-tokens "^2.0.0" + devlop "^1.0.0" + property-information "^6.0.0" + space-separated-tokens "^2.0.0" + web-namespaces "^2.0.0" + zwitch "^2.0.0" + hast-util-whitespace@^2.0.0: version "2.0.1" - resolved "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-2.0.1.tgz" + resolved "https://registry.yarnpkg.com/hast-util-whitespace/-/hast-util-whitespace-2.0.1.tgz#0ec64e257e6fc216c7d14c8a1b74d27d650b4557" integrity sha512-nAxA0v8+vXSBDt3AnRUNjyRIQ0rD+ntpbAp4LnPkumc5M9yUbSMa4XDU9Q6etY4f1Wp4bNgvc1yjiZtsTTrSng== -hastscript@^6.0.0: - version "6.0.0" - resolved "https://registry.npmjs.org/hastscript/-/hastscript-6.0.0.tgz" - integrity sha512-nDM6bvd7lIqDUiYEiu5Sl/+6ReP0BMk/2f4U/Rooccxkj0P5nm+acM5PrGJ/t5I8qPGiqZSE6hVAwZEdZIvP4w== +hast-util-whitespace@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz#7778ed9d3c92dd9e8c5c8f648a49c21fc51cb621" + integrity sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw== dependencies: - "@types/hast" "^2.0.0" - comma-separated-tokens "^1.0.0" - hast-util-parse-selector "^2.0.0" - property-information "^5.0.0" - space-separated-tokens "^1.0.0" + "@types/hast" "^3.0.0" hastscript@^7.0.0: version "7.2.0" - resolved "https://registry.npmjs.org/hastscript/-/hastscript-7.2.0.tgz" + resolved "https://registry.yarnpkg.com/hastscript/-/hastscript-7.2.0.tgz#0eafb7afb153d047077fa2a833dc9b7ec604d10b" integrity sha512-TtYPq24IldU8iKoJQqvZOuhi5CyCQRAbvDOX0x1eW6rsHSxa/1i2CCiptNTotGHJ3VoHRGmqiv6/D3q113ikkw== dependencies: "@types/hast" "^2.0.0" @@ -5891,19 +5941,25 @@ hastscript@^7.0.0: property-information "^6.0.0" space-separated-tokens "^2.0.0" +hastscript@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/hastscript/-/hastscript-8.0.0.tgz#4ef795ec8dee867101b9f23cc830d4baf4fd781a" + integrity sha512-dMOtzCEd3ABUeSIISmrETiKuyydk1w0pa+gE/uormcTpSYuaNJPbX1NU3JLyscSLjwAQM8bWMhhIlnCqnRvDTw== + dependencies: + "@types/hast" "^3.0.0" + comma-separated-tokens "^2.0.0" + hast-util-parse-selector "^4.0.0" + property-information "^6.0.0" + space-separated-tokens "^2.0.0" + he@^1.2.0: version "1.2.0" - resolved "https://registry.npmjs.org/he/-/he-1.2.0.tgz" + resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== -hexoid@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/hexoid/-/hexoid-1.0.0.tgz" - integrity sha512-QFLV0taWQOZtvIRIAdBChesmogZrtuXvVWsFHZTk2SU+anspqZ2vMnoLg7IE1+Uk16N19APic1BuF8bC8c2m5g== - history@^4.9.0: version "4.10.1" - resolved "https://registry.npmjs.org/history/-/history-4.10.1.tgz" + resolved "https://registry.yarnpkg.com/history/-/history-4.10.1.tgz#33371a65e3a83b267434e2b3f3b1b4c58aad4cf3" integrity sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew== dependencies: "@babel/runtime" "^7.1.2" @@ -5915,7 +5971,7 @@ history@^4.9.0: hmac-drbg@^1.0.1: version "1.0.1" - resolved "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz" + resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" integrity sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg== dependencies: hash.js "^1.0.3" @@ -5924,14 +5980,14 @@ hmac-drbg@^1.0.1: hoist-non-react-statics@^3.1.0, hoist-non-react-statics@^3.3.0, hoist-non-react-statics@^3.3.2: version "3.3.2" - resolved "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz" + resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45" integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw== dependencies: react-is "^16.7.0" hpack.js@^2.1.6: version "2.1.6" - resolved "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz" + resolved "https://registry.yarnpkg.com/hpack.js/-/hpack.js-2.1.6.tgz#87774c0949e513f42e84575b3c45681fade2a0b2" integrity sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ== dependencies: inherits "^2.0.1" @@ -5940,13 +5996,18 @@ hpack.js@^2.1.6: wbuf "^1.1.0" html-entities@^2.3.2: - version "2.3.3" - resolved "https://registry.npmjs.org/html-entities/-/html-entities-2.3.3.tgz" - integrity sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA== + version "2.5.2" + resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-2.5.2.tgz#201a3cf95d3a15be7099521620d19dfb4f65359f" + integrity sha512-K//PSRMQk4FZ78Kyau+mZurHn3FH0Vwr+H36eE0rPbeYkRRi9YxceYPhuN60UwWorxyKHhqoAJl2OFKa4BVtaA== -html-minifier-terser@^6.0.2, html-minifier-terser@^6.1.0: +html-escaper@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" + integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== + +html-minifier-terser@^6.0.2: version "6.1.0" - resolved "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz" + resolved "https://registry.yarnpkg.com/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz#bfc818934cc07918f6b3669f5774ecdfd48f32ab" integrity sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw== dependencies: camel-case "^4.1.2" @@ -5957,25 +6018,38 @@ html-minifier-terser@^6.0.2, html-minifier-terser@^6.1.0: relateurl "^0.2.7" terser "^5.10.0" -html-tags@^3.2.0: - version "3.2.0" - resolved "https://registry.npmjs.org/html-tags/-/html-tags-3.2.0.tgz" - integrity sha512-vy7ClnArOZwCnqZgvv+ddgHgJiAFXe3Ge9ML5/mBctVJoUoYPCdxVucOywjDARn6CVoh3dRSFdPHy2sX80L0Wg== +html-minifier-terser@^7.2.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/html-minifier-terser/-/html-minifier-terser-7.2.0.tgz#18752e23a2f0ed4b0f550f217bb41693e975b942" + integrity sha512-tXgn3QfqPIpGl9o+K5tpcj3/MN4SfLtsx2GWwBC3SSd0tXQGyF3gsSqad8loJgKZGM3ZxbYDd5yhiBIdWpmvLA== + dependencies: + camel-case "^4.1.2" + clean-css "~5.3.2" + commander "^10.0.0" + entities "^4.4.0" + param-case "^3.0.4" + relateurl "^0.2.7" + terser "^5.15.1" -html-void-elements@^1.0.0: - version "1.0.5" - resolved "https://registry.npmjs.org/html-void-elements/-/html-void-elements-1.0.5.tgz" - integrity sha512-uE/TxKuyNIcx44cIWnjr/rfIATDH7ZaOMmstu0CwhFG1Dunhlp4OC6/NMbhiwoq5BpW0ubi303qnEk/PZj614w== +html-tags@^3.3.1: + version "3.3.1" + resolved "https://registry.yarnpkg.com/html-tags/-/html-tags-3.3.1.tgz#a04026a18c882e4bba8a01a3d39cfe465d40b5ce" + integrity sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ== html-void-elements@^2.0.0: version "2.0.1" - resolved "https://registry.npmjs.org/html-void-elements/-/html-void-elements-2.0.1.tgz" + resolved "https://registry.yarnpkg.com/html-void-elements/-/html-void-elements-2.0.1.tgz#29459b8b05c200b6c5ee98743c41b979d577549f" integrity sha512-0quDb7s97CfemeJAnW9wC0hw78MtW7NU3hqtCD75g2vFlDLt36llsYD7uB7SUzojLMP24N5IatXf7ylGXiGG9A== -html-webpack-plugin@^5.5.0: - version "5.5.0" - resolved "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.5.0.tgz" - integrity sha512-sy88PC2cRTVxvETRgUHFrL4No3UxvcH8G1NepGhqaTT+GXN2kTamqasot0inS5hXeg1cMbFDt27zzo9p35lZVw== +html-void-elements@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/html-void-elements/-/html-void-elements-3.0.0.tgz#fc9dbd84af9e747249034d4d62602def6517f1d7" + integrity sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg== + +html-webpack-plugin@^5.5.3: + version "5.6.0" + resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-5.6.0.tgz#50a8fa6709245608cb00e811eacecb8e0d7b7ea0" + integrity sha512-iwaY4wzbe48AfKLZ/Cc8k0L+FKG6oSNRaZ8x5A/T/IVDGyXcbHncM9TdDa93wn0FsSm82FhTKW7f3vS61thXAw== dependencies: "@types/html-minifier-terser" "^6.0.0" html-minifier-terser "^6.0.2" @@ -5985,7 +6059,7 @@ html-webpack-plugin@^5.5.0: htmlparser2@^6.1.0: version "6.1.0" - resolved "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz" + resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-6.1.0.tgz#c4d762b6c3371a05dbe65e94ae43a9f845fb8fb7" integrity sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A== dependencies: domelementtype "^2.0.1" @@ -5994,28 +6068,28 @@ htmlparser2@^6.1.0: entities "^2.0.0" htmlparser2@^8.0.1: - version "8.0.1" - resolved "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.1.tgz" - integrity sha512-4lVbmc1diZC7GUJQtRQ5yBAeUCL1exyMwmForWkRLnwyzWBFxN633SALPMGYaWZvKe9j1pRZJpauvmxENSp/EA== + version "8.0.2" + resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-8.0.2.tgz#f002151705b383e62433b5cf466f5b716edaec21" + integrity sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA== dependencies: domelementtype "^2.3.0" - domhandler "^5.0.2" + domhandler "^5.0.3" domutils "^3.0.1" - entities "^4.3.0" + entities "^4.4.0" -http-cache-semantics@^4.0.0: +http-cache-semantics@^4.1.1: version "4.1.1" - resolved "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz" + resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz#abe02fcb2985460bf0323be664436ec3476a6d5a" integrity sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ== http-deceiver@^1.2.7: version "1.2.7" - resolved "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz" + resolved "https://registry.yarnpkg.com/http-deceiver/-/http-deceiver-1.2.7.tgz#fa7168944ab9a519d337cb0bec7284dc3e723d87" integrity sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw== http-errors@2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== dependencies: depd "2.0.0" @@ -6026,7 +6100,7 @@ http-errors@2.0.0: http-errors@~1.6.2: version "1.6.3" - resolved "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d" integrity sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A== dependencies: depd "~1.1.2" @@ -6036,12 +6110,12 @@ http-errors@~1.6.2: http-parser-js@>=0.5.1: version "0.5.8" - resolved "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz" + resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.5.8.tgz#af23090d9ac4e24573de6f6aecc9d84a48bf20e3" integrity sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q== http-proxy-middleware@^2.0.3: version "2.0.6" - resolved "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz" + resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz#e1a4dd6979572c7ab5a4e4b55095d1f32a74963f" integrity sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw== dependencies: "@types/http-proxy" "^1.17.8" @@ -6052,7 +6126,7 @@ http-proxy-middleware@^2.0.3: http-proxy@^1.18.1: version "1.18.1" - resolved "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz" + resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.18.1.tgz#401541f0534884bbf95260334e72f88ee3976549" integrity sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ== dependencies: eventemitter3 "^4.0.0" @@ -6061,164 +6135,200 @@ http-proxy@^1.18.1: http-reasons@0.1.0: version "0.1.0" - resolved "https://registry.npmjs.org/http-reasons/-/http-reasons-0.1.0.tgz" + resolved "https://registry.yarnpkg.com/http-reasons/-/http-reasons-0.1.0.tgz#a953ca670078669dde142ce899401b9d6e85d3b4" integrity sha512-P6kYh0lKZ+y29T2Gqz+RlC9WBLhKe8kDmcJ+A+611jFfxdPsbMRQ5aNmFRM3lENqFkK+HTTL+tlQviAiv0AbLQ== http2-client@^1.2.5: version "1.3.5" - resolved "https://registry.npmjs.org/http2-client/-/http2-client-1.3.5.tgz" + resolved "https://registry.yarnpkg.com/http2-client/-/http2-client-1.3.5.tgz#20c9dc909e3cc98284dd20af2432c524086df181" integrity sha512-EC2utToWl4RKfs5zd36Mxq7nzHHBuomZboI0yYL6Y0RmBgT7Sgkq4rQ0ezFTYoIsSs7Tm9SJe+o2FcAg6GBhGA== +http2-wrapper@^2.1.10: + version "2.2.1" + resolved "https://registry.yarnpkg.com/http2-wrapper/-/http2-wrapper-2.2.1.tgz#310968153dcdedb160d8b72114363ef5fce1f64a" + integrity sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ== + dependencies: + quick-lru "^5.1.1" + resolve-alpn "^1.2.0" + https-browserify@^1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz" + resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" integrity sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg== +https-proxy-agent@5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6" + integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== + dependencies: + agent-base "6" + debug "4" + human-signals@^2.1.0: version "2.1.0" - resolved "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== iconv-lite@0.4.24: version "0.4.24" - resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== dependencies: safer-buffer ">= 2.1.2 < 3" -iconv-lite@0.6.3: +iconv-lite@0.6, iconv-lite@0.6.3: version "0.6.3" - resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== dependencies: safer-buffer ">= 2.1.2 < 3.0.0" icss-utils@^5.0.0, icss-utils@^5.1.0: version "5.1.0" - resolved "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz" + resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-5.1.0.tgz#c6be6858abd013d768e98366ae47e25d5887b1ae" integrity sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA== -ieee754@^1.2.1: +ieee754@^1.1.13, ieee754@^1.2.1: version "1.2.1" - resolved "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== -ignore@^5.2.0: - version "5.2.0" - resolved "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz" - integrity sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ== +ignore@^5.2.0, ignore@^5.2.4: + version "5.3.1" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.1.tgz#5073e554cd42c5b33b394375f538b8593e34d4ef" + integrity sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw== -image-size@^1.0.1: - version "1.0.2" - resolved "https://registry.npmjs.org/image-size/-/image-size-1.0.2.tgz" - integrity sha512-xfOoWjceHntRb3qFCrh5ZFORYH8XCdYpASltMhZ/Q0KZiOwjdE/Yl2QCiWdwD+lygV5bMCvauzgu5PxBX/Yerg== +image-size@^1.0.2: + version "1.1.1" + resolved "https://registry.yarnpkg.com/image-size/-/image-size-1.1.1.tgz#ddd67d4dc340e52ac29ce5f546a09f4e29e840ac" + integrity sha512-541xKlUw6jr/6gGuk92F+mYM5zaFAc5ahphvkqvNe2bQ6gVBkd6bfrmVJ2t4KDAfikAYZyIqTnktX3i6/aQDrQ== dependencies: queue "6.0.2" -immer@^9.0.16, immer@^9.0.7: +immer@^9.0.21, immer@^9.0.7: version "9.0.21" - resolved "https://registry.npmjs.org/immer/-/immer-9.0.21.tgz" + resolved "https://registry.yarnpkg.com/immer/-/immer-9.0.21.tgz#1e025ea31a40f24fb064f1fef23e931496330176" integrity sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA== -import-fresh@^3.1.0, import-fresh@^3.2.1, import-fresh@^3.3.0: +immutable@^4.0.0: + version "4.3.6" + resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.3.6.tgz#6a05f7858213238e587fb83586ffa3b4b27f0447" + integrity sha512-Ju0+lEMyzMVZarkTn/gqRpdqd5dOPaz1mCZ0SH3JV6iFw81PldE/PEB1hWVEA288HPt4WXW8O7AWxB10M+03QQ== + +import-fresh@^3.1.0, import-fresh@^3.3.0: version "3.3.0" - resolved "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== dependencies: parent-module "^1.0.0" resolve-from "^4.0.0" -import-lazy@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz" - integrity sha512-m7ZEHgtw69qOGw+jwxXkHlrlIPdTGkyh66zXZ1ajZbxkDBNjSY/LGbmjc7h0s2ELsUDTAhFr55TrPSSqJGPG0A== +import-lazy@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-4.0.0.tgz#e8eb627483a0a43da3c03f3e35548be5cb0cc153" + integrity sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw== imurmurhash@^0.1.4: version "0.1.4" - resolved "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== indent-string@^4.0.0: version "4.0.0" - resolved "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== -infima@0.2.0-alpha.42: - version "0.2.0-alpha.42" - resolved "https://registry.npmjs.org/infima/-/infima-0.2.0-alpha.42.tgz" - integrity sha512-ift8OXNbQQwtbIt6z16KnSWP7uJ/SysSMFI4F87MNRTicypfl4Pv3E2OGVv6N3nSZFJvA8imYulCBS64iyHYww== +infima@0.2.0-alpha.43: + version "0.2.0-alpha.43" + resolved "https://registry.yarnpkg.com/infima/-/infima-0.2.0-alpha.43.tgz#f7aa1d7b30b6c08afef441c726bac6150228cbe0" + integrity sha512-2uw57LvUqW0rK/SWYnd/2rRfxNA5DDNOh33jxF7fy46VWoNhGxiUQyVZHbBMjQ33mQem0cjdDVwgWVAmlRfgyQ== inflight@^1.0.4: version "1.0.6" - resolved "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== dependencies: once "^1.3.0" wrappy "1" -inherits@2, inherits@2.0.4, inherits@^2.0.0, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3, inherits@~2.0.4: +inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3, inherits@~2.0.4: version "2.0.4" - resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== inherits@2.0.3: version "2.0.3" - resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" integrity sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw== ini@2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz" + resolved "https://registry.yarnpkg.com/ini/-/ini-2.0.0.tgz#e5fd556ecdd5726be978fa1001862eacb0a94bc5" integrity sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA== -ini@^1.3.5, ini@~1.3.0: +ini@^1.3.4, ini@^1.3.5, ini@~1.3.0: version "1.3.8" - resolved "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== inline-style-parser@0.1.1: version "0.1.1" - resolved "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.1.1.tgz" + resolved "https://registry.yarnpkg.com/inline-style-parser/-/inline-style-parser-0.1.1.tgz#ec8a3b429274e9c0a1f1c4ffa9453a7fef72cea1" integrity sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q== +inline-style-parser@0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/inline-style-parser/-/inline-style-parser-0.2.3.tgz#e35c5fb45f3a83ed7849fe487336eb7efa25971c" + integrity sha512-qlD8YNDqyTKTyuITrDOffsl6Tdhv+UC4hcdAVuQsK4IMQ99nSgd1MIA/Q+jQYoh9r3hVUXhYh7urSRmXPkW04g== + +"internmap@1 - 2": + version "2.0.3" + resolved "https://registry.yarnpkg.com/internmap/-/internmap-2.0.3.tgz#6685f23755e43c524e251d29cbc97248e3061009" + integrity sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg== + +internmap@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/internmap/-/internmap-1.0.1.tgz#0017cc8a3b99605f0302f2b198d272e015e5df95" + integrity sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw== + interpret@^1.0.0: version "1.4.0" - resolved "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz" + resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.4.0.tgz#665ab8bc4da27a774a40584e812e3e0fa45b1a1e" integrity sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA== invariant@^2.2.4: version "2.2.4" - resolved "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz" + resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== dependencies: loose-envify "^1.0.0" ipaddr.js@1.9.1: version "1.9.1" - resolved "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== ipaddr.js@^2.0.1: + version "2.2.0" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-2.2.0.tgz#d33fa7bac284f4de7af949638c9d68157c6b92e8" + integrity sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA== + +is-alphabetical@^2.0.0: version "2.0.1" - resolved "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.0.1.tgz" - integrity sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng== + resolved "https://registry.yarnpkg.com/is-alphabetical/-/is-alphabetical-2.0.1.tgz#01072053ea7c1036df3c7d19a6daaec7f19e789b" + integrity sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ== -is-alphabetical@1.0.4, is-alphabetical@^1.0.0: - version "1.0.4" - resolved "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.4.tgz" - integrity sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg== - -is-alphanumerical@^1.0.0: - version "1.0.4" - resolved "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz" - integrity sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A== +is-alphanumerical@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz#7c03fbe96e3e931113e57f964b0a368cc2dfd875" + integrity sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw== dependencies: - is-alphabetical "^1.0.0" - is-decimal "^1.0.0" + is-alphabetical "^2.0.0" + is-decimal "^2.0.0" is-arguments@^1.0.4: version "1.1.1" - resolved "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz" + resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b" integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA== dependencies: call-bind "^1.0.2" @@ -6226,227 +6336,228 @@ is-arguments@^1.0.4: is-arrayish@^0.2.1: version "0.2.1" - resolved "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== is-binary-path@~2.1.0: version "2.1.0" - resolved "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== dependencies: binary-extensions "^2.0.0" is-buffer@^2.0.0: version "2.0.5" - resolved "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.5.tgz#ebc252e400d22ff8d77fa09888821a24a658c191" integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ== is-callable@^1.1.3: version "1.2.7" - resolved "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== -is-ci@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz" - integrity sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w== +is-ci@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-3.0.1.tgz#db6ecbed1bd659c43dac0f45661e7674103d1867" + integrity sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ== dependencies: - ci-info "^2.0.0" + ci-info "^3.2.0" -is-core-module@^2.9.0: - version "2.13.0" - resolved "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz" - integrity sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ== +is-core-module@^2.13.0: + version "2.13.1" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.13.1.tgz#ad0d7532c6fea9da1ebdc82742d74525c6273384" + integrity sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw== dependencies: - has "^1.0.3" + hasown "^2.0.0" -is-decimal@^1.0.0: - version "1.0.4" - resolved "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.4.tgz" - integrity sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw== +is-decimal@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-decimal/-/is-decimal-2.0.1.tgz#9469d2dc190d0214fd87d78b78caecc0cc14eef7" + integrity sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A== is-docker@^2.0.0, is-docker@^2.1.1: version "2.2.1" - resolved "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz" + resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== is-extendable@^0.1.0: version "0.1.1" - resolved "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" integrity sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw== is-extglob@^2.1.1: version "2.1.1" - resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== is-fullwidth-code-point@^3.0.0: version "3.0.0" - resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== is-generator-function@^1.0.7: version "1.0.10" - resolved "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz" + resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.10.tgz#f1558baf1ac17e0deea7c0415c438351ff2b3c72" integrity sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A== dependencies: has-tostringtag "^1.0.0" is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: version "4.0.3" - resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== dependencies: is-extglob "^2.1.1" -is-hexadecimal@^1.0.0: - version "1.0.4" - resolved "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz" - integrity sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw== +is-hexadecimal@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz#86b5bf668fca307498d319dfc03289d781a90027" + integrity sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg== is-installed-globally@^0.4.0: version "0.4.0" - resolved "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz" + resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.4.0.tgz#9a0fd407949c30f86eb6959ef1b7994ed0b7b520" integrity sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ== dependencies: global-dirs "^3.0.0" is-path-inside "^3.0.2" -is-nan@^1.2.1: +is-nan@^1.3.2: version "1.3.2" - resolved "https://registry.npmjs.org/is-nan/-/is-nan-1.3.2.tgz" + resolved "https://registry.yarnpkg.com/is-nan/-/is-nan-1.3.2.tgz#043a54adea31748b55b6cd4e09aadafa69bd9e1d" integrity sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w== dependencies: call-bind "^1.0.0" define-properties "^1.1.3" -is-npm@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/is-npm/-/is-npm-5.0.0.tgz" - integrity sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA== +is-npm@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-6.0.0.tgz#b59e75e8915543ca5d881ecff864077cba095261" + integrity sha512-JEjxbSmtPSt1c8XTkVrlujcXdKV1/tvuQ7GwKcAlyiVLeYFQ2VHat8xfrDJsIkhCdF/tZ7CiIR3sy141c6+gPQ== is-number@^7.0.0: version "7.0.0" - resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== is-obj@^1.0.1: version "1.0.1" - resolved "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz" + resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" integrity sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg== is-obj@^2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz" + resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982" integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w== is-path-cwd@^2.2.0: version "2.2.0" - resolved "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz" + resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-2.2.0.tgz#67d43b82664a7b5191fd9119127eb300048a9fdb" integrity sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ== is-path-inside@^3.0.2: version "3.0.3" - resolved "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== -is-plain-obj@^2.0.0: - version "2.1.0" - resolved "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz" - integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== - is-plain-obj@^3.0.0: version "3.0.0" - resolved "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-3.0.0.tgz#af6f2ea14ac5a646183a5bbdb5baabbc156ad9d7" integrity sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA== is-plain-obj@^4.0.0: version "4.1.0" - resolved "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-4.1.0.tgz#d65025edec3657ce032fd7db63c97883eaed71f0" integrity sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg== is-plain-object@^2.0.4: version "2.0.4" - resolved "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz" + resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== dependencies: isobject "^3.0.1" +is-reference@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/is-reference/-/is-reference-3.0.2.tgz#154747a01f45cd962404ee89d43837af2cba247c" + integrity sha512-v3rht/LgVcsdZa3O2Nqs+NMowLOxeOm7Ay9+/ARQ2F+qEoANRcqrjAZKGN0v8ymUetZGgkp26LTnGT7H0Qo9Pg== + dependencies: + "@types/estree" "*" + is-regexp@^1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz" + resolved "https://registry.yarnpkg.com/is-regexp/-/is-regexp-1.0.0.tgz#fd2d883545c46bac5a633e7b9a09e87fa2cb5069" integrity sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA== is-root@^2.1.0: version "2.1.0" - resolved "https://registry.npmjs.org/is-root/-/is-root-2.1.0.tgz" + resolved "https://registry.yarnpkg.com/is-root/-/is-root-2.1.0.tgz#809e18129cf1129644302a4f8544035d51984a9c" integrity sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg== is-stream@^2.0.0: version "2.0.1" - resolved "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== is-typed-array@^1.1.3: - version "1.1.12" - resolved "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz" - integrity sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg== + version "1.1.13" + resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.13.tgz#d6c5ca56df62334959322d7d7dd1cca50debe229" + integrity sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw== dependencies: - which-typed-array "^1.1.11" + which-typed-array "^1.1.14" is-typedarray@^1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz" + resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" integrity sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA== -is-whitespace-character@^1.0.0: - version "1.0.4" - resolved "https://registry.npmjs.org/is-whitespace-character/-/is-whitespace-character-1.0.4.tgz" - integrity sha512-SDweEzfIZM0SJV0EUga669UTKlmL0Pq8Lno0QDQsPnvECB3IM2aP0gdx5TrU0A01MAPfViaZiI2V1QMZLaKK5w== - -is-word-character@^1.0.0: - version "1.0.4" - resolved "https://registry.npmjs.org/is-word-character/-/is-word-character-1.0.4.tgz" - integrity sha512-5SMO8RVennx3nZrqtKwCGyyetPE9VDba5ugvKLaD4KopPG5kR4mQ7tNt/r7feL5yt5h3lpuBbIUmCOG2eSzXHA== - is-wsl@^2.2.0: version "2.2.0" - resolved "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz" + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== dependencies: is-docker "^2.0.0" -is-yarn-global@^0.3.0: - version "0.3.0" - resolved "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz" - integrity sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw== +is-yarn-global@^0.4.0: + version "0.4.1" + resolved "https://registry.yarnpkg.com/is-yarn-global/-/is-yarn-global-0.4.1.tgz#b312d902b313f81e4eaf98b6361ba2b45cd694bb" + integrity sha512-/kppl+R+LO5VmhYSEWARUFjodS25D68gvj8W7z0I7OWhUla5xWu8KL6CtB2V0R6yqhnRgbcaREMr4EEM6htLPQ== isarray@0.0.1: version "0.0.1" - resolved "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" integrity sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ== isarray@~1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== isexe@^2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== isobject@^3.0.1: version "3.0.1" - resolved "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg== -jest-util@^29.2.1: - version "29.2.1" - resolved "https://registry.npmjs.org/jest-util/-/jest-util-29.2.1.tgz" - integrity sha512-P5VWDj25r7kj7kl4pN2rG/RN2c1TLfYYYZYULnS/35nFDjBai+hBeo3MDrYZS7p6IoY3YHZnt2vq4L6mKnLk0g== +jackspeak@^3.1.2: + version "3.4.0" + resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-3.4.0.tgz#a75763ff36ad778ede6a156d8ee8b124de445b4a" + integrity sha512-JVYhQnN59LVPFCEcVa2C3CrEKYacvjRfqIQl+h8oi91aLYQVWRYbxjPcv1bUiUy/kLmQaANrYfNMCO3kuEDHfw== dependencies: - "@jest/types" "^29.2.1" + "@isaacs/cliui" "^8.0.2" + optionalDependencies: + "@pkgjs/parseargs" "^0.11.0" + +jest-util@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.7.0.tgz#23c2b62bfb22be82b44de98055802ff3710fc0bc" + integrity sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA== + dependencies: + "@jest/types" "^29.6.3" "@types/node" "*" chalk "^4.0.0" ci-info "^3.2.0" @@ -6455,52 +6566,52 @@ jest-util@^29.2.1: jest-worker@^27.4.5: version "27.5.1" - resolved "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.5.1.tgz#8d146f0900e8973b106b6f73cc1e9a8cb86f8db0" integrity sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg== dependencies: "@types/node" "*" merge-stream "^2.0.0" supports-color "^8.0.0" -jest-worker@^29.1.2: - version "29.2.1" - resolved "https://registry.npmjs.org/jest-worker/-/jest-worker-29.2.1.tgz" - integrity sha512-ROHTZ+oj7sBrgtv46zZ84uWky71AoYi0vEV9CdEtc1FQunsoAGe5HbQmW76nI5QWdvECVPrSi1MCVUmizSavMg== +jest-worker@^29.4.3: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-29.7.0.tgz#acad073acbbaeb7262bd5389e1bcf43e10058d4a" + integrity sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw== dependencies: "@types/node" "*" - jest-util "^29.2.1" + jest-util "^29.7.0" merge-stream "^2.0.0" supports-color "^8.0.0" -jiti@^1.17.2: - version "1.18.2" - resolved "https://registry.npmjs.org/jiti/-/jiti-1.18.2.tgz" - integrity sha512-QAdOptna2NYiSSpv0O/BwoHBSmz4YhpzJHyi+fnMRTXFjp7B8i/YG5Z8IfusxB1ufjcD2Sre1F3R+nX3fvy7gg== +jiti@^1.20.0, jiti@^1.21.0: + version "1.21.6" + resolved "https://registry.yarnpkg.com/jiti/-/jiti-1.21.6.tgz#6c7f7398dd4b3142767f9a168af2f317a428d268" + integrity sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w== -joi@^17.6.0: - version "17.6.0" - resolved "https://registry.npmjs.org/joi/-/joi-17.6.0.tgz" - integrity sha512-OX5dG6DTbcr/kbMFj0KGYxuew69HPcAE3K/sZpEV2nP6e/j/C0HV+HNiBPCASxdx5T7DMoa0s8UeHWMnb6n2zw== +joi@^17.6.0, joi@^17.9.2: + version "17.13.1" + resolved "https://registry.yarnpkg.com/joi/-/joi-17.13.1.tgz#9c7b53dc3b44dd9ae200255cc3b398874918a6ca" + integrity sha512-vaBlIKCyo4FCUtCm7Eu4QZd/q02bWcxfUO6YSXAZOWF6gzcLBeba8kwotUdYJjDLW8Cz8RywsSOqiNJZW0mNvg== dependencies: - "@hapi/hoek" "^9.0.0" - "@hapi/topo" "^5.0.0" - "@sideway/address" "^4.1.3" - "@sideway/formula" "^3.0.0" + "@hapi/hoek" "^9.3.0" + "@hapi/topo" "^5.1.0" + "@sideway/address" "^4.1.5" + "@sideway/formula" "^3.0.1" "@sideway/pinpoint" "^2.0.0" js-levenshtein@^1.1.6: version "1.1.6" - resolved "https://registry.npmjs.org/js-levenshtein/-/js-levenshtein-1.1.6.tgz" + resolved "https://registry.yarnpkg.com/js-levenshtein/-/js-levenshtein-1.1.6.tgz#c6cee58eb3550372df8deb85fad5ce66ce01d59d" integrity sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g== "js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: version "4.0.0" - resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== js-yaml@3.14.1, js-yaml@^3.13.1: version "3.14.1" - resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== dependencies: argparse "^1.0.7" @@ -6508,62 +6619,48 @@ js-yaml@3.14.1, js-yaml@^3.13.1: js-yaml@^4.1.0: version "4.1.0" - resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== dependencies: argparse "^2.0.1" jsesc@^2.5.1: version "2.5.2" - resolved "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== jsesc@~0.5.0: version "0.5.0" - resolved "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" integrity sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA== -json-buffer@3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz" - integrity sha512-CuUqjv0FUZIdXkHPI8MezCnFCdaTAacej1TZYulLoAg1h/PhwkdXFN4V/gzY4g+fMBCOV2xF+rp7t2XD2ns/NQ== +json-buffer@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" + integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== json-parse-even-better-errors@^2.3.0, json-parse-even-better-errors@^2.3.1: version "2.3.1" - resolved "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz" + resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== json-pointer@^0.6.2: version "0.6.2" - resolved "https://registry.npmjs.org/json-pointer/-/json-pointer-0.6.2.tgz" + resolved "https://registry.yarnpkg.com/json-pointer/-/json-pointer-0.6.2.tgz#f97bd7550be5e9ea901f8c9264c9d436a22a93cd" integrity sha512-vLWcKbOaXlO+jvRy4qNd+TI1QUPZzfJj1tpJ3vAXDych5XJf93ftpUKe5pKCrzyIIwgBJcOcCVRUfqQP25afBw== dependencies: foreach "^2.0.4" -json-refs@^3.0.15: - version "3.0.15" - resolved "https://registry.npmjs.org/json-refs/-/json-refs-3.0.15.tgz" - integrity sha512-0vOQd9eLNBL18EGl5yYaO44GhixmImes2wiYn9Z3sag3QnehWrYWlB9AFtMxCL2Bj3fyxgDYkxGFEU/chlYssw== - dependencies: - commander "~4.1.1" - graphlib "^2.1.8" - js-yaml "^3.13.1" - lodash "^4.17.15" - native-promise-only "^0.8.1" - path-loader "^1.0.10" - slash "^3.0.0" - uri-js "^4.2.2" - json-schema-compare@^0.2.2: version "0.2.2" - resolved "https://registry.npmjs.org/json-schema-compare/-/json-schema-compare-0.2.2.tgz" + resolved "https://registry.yarnpkg.com/json-schema-compare/-/json-schema-compare-0.2.2.tgz#dd601508335a90c7f4cfadb6b2e397225c908e56" integrity sha512-c4WYmDKyJXhs7WWvAWm3uIYnfyWFoIp+JEoX34rctVvEkMYCPGhXtvmFFXiffBbxfZsvQ0RNnV5H7GvDF5HCqQ== dependencies: lodash "^4.17.4" json-schema-merge-allof@0.8.1, json-schema-merge-allof@^0.8.1: version "0.8.1" - resolved "https://registry.npmjs.org/json-schema-merge-allof/-/json-schema-merge-allof-0.8.1.tgz" + resolved "https://registry.yarnpkg.com/json-schema-merge-allof/-/json-schema-merge-allof-0.8.1.tgz#ed2828cdd958616ff74f932830a26291789eaaf2" integrity sha512-CTUKmIlPJbsWfzRRnOXz+0MjIqvnleIXwFTzz+t9T86HnYX/Rozria6ZVGLktAU9e+NygNljveP+yxqtQp/Q4w== dependencies: compute-lcm "^1.1.2" @@ -6572,80 +6669,110 @@ json-schema-merge-allof@0.8.1, json-schema-merge-allof@^0.8.1: json-schema-traverse@^0.4.1: version "0.4.1" - resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== json-schema-traverse@^1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== json5@^2.1.2, json5@^2.2.3: version "2.2.3" - resolved "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== jsonfile@^6.0.1: version "6.1.0" - resolved "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== dependencies: universalify "^2.0.0" optionalDependencies: graceful-fs "^4.1.6" -keyv@^3.0.0: - version "3.1.0" - resolved "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz" - integrity sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA== +katex@^0.16.9: + version "0.16.10" + resolved "https://registry.yarnpkg.com/katex/-/katex-0.16.10.tgz#6f81b71ac37ff4ec7556861160f53bc5f058b185" + integrity sha512-ZiqaC04tp2O5utMsl2TEZTXxa6WSC4yo0fv5ML++D3QZv/vx2Mct0mTlRx3O+uUkjfuAgOkzsCmq5MiUEsDDdA== dependencies: - json-buffer "3.0.0" + commander "^8.3.0" + +keyv@^4.5.3: + version "4.5.4" + resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" + integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== + dependencies: + json-buffer "3.0.1" + +khroma@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/khroma/-/khroma-2.1.0.tgz#45f2ce94ce231a437cf5b63c2e886e6eb42bbbb1" + integrity sha512-Ls993zuzfayK269Svk9hzpeGUKob/sIgZzyHYdjQoAdQetRKpOLj+k/QQQ/6Qi0Yz65mlROrfd+Ev+1+7dz9Kw== kind-of@^6.0.0, kind-of@^6.0.2: version "6.0.3" - resolved "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== kleur@^3.0.3: version "3.0.3" - resolved "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz" + resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== kleur@^4.0.3: version "4.1.5" - resolved "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz" + resolved "https://registry.yarnpkg.com/kleur/-/kleur-4.1.5.tgz#95106101795f7050c6c650f350c683febddb1780" integrity sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ== -klona@^2.0.5: - version "2.0.5" - resolved "https://registry.npmjs.org/klona/-/klona-2.0.5.tgz" - integrity sha512-pJiBpiXMbt7dkzXe8Ghj/u4FfXOOa98fPW+bihOJ4SjnoijweJrNThJfd3ifXpXhREjpoF2mZVH1GfS9LV3kHQ== +klona@^2.0.4: + version "2.0.6" + resolved "https://registry.yarnpkg.com/klona/-/klona-2.0.6.tgz#85bffbf819c03b2f53270412420a4555ef882e22" + integrity sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA== -latest-version@^5.1.0: - version "5.1.0" - resolved "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz" - integrity sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA== +latest-version@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-7.0.0.tgz#843201591ea81a4d404932eeb61240fe04e9e5da" + integrity sha512-KvNT4XqAMzdcL6ka6Tl3i2lYeFDgXNCuIX+xNx6ZMVR1dFq+idXd9FLKNMOIx0t9mJ9/HudyX4oZWXZQ0UJHeg== dependencies: - package-json "^6.3.0" + package-json "^8.1.0" + +launch-editor@^2.6.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/launch-editor/-/launch-editor-2.7.0.tgz#53ba12b3eb131edefee99acaef7850c40272273f" + integrity sha512-KAc66u6LxWL8MifQ94oG3YGKYWDwz/Gi0T15lN//GaQoZe08vQGFJxrXkPAeu50UXgvJPPaRKVGuP1TRUm/aHQ== + dependencies: + picocolors "^1.0.0" + shell-quote "^1.8.1" + +layout-base@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/layout-base/-/layout-base-1.0.2.tgz#1291e296883c322a9dd4c5dd82063721b53e26e2" + integrity sha512-8h2oVEZNktL4BH2JCOI90iD1yXwL6iNW7KcCKT2QZgQJR2vbqDsldCTPRU9NifTCqHZci57XvQQ15YTu+sTYPg== leven@^3.1.0: version "3.1.0" - resolved "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz" + resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== -lilconfig@^2.0.3, lilconfig@^2.0.5, lilconfig@^2.0.6: +lilconfig@^2.1.0: version "2.1.0" - resolved "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz" + resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.1.0.tgz#78e23ac89ebb7e1bfbf25b18043de756548e7f52" integrity sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ== +lilconfig@^3.0.0, lilconfig@^3.1.1: + version "3.1.2" + resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-3.1.2.tgz#e4a7c3cb549e3a606c8dcc32e5ae1005e62c05cb" + integrity sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow== + lines-and-columns@^1.1.6: version "1.2.4" - resolved "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz" + resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== liquid-json@0.3.1: version "0.3.1" - resolved "https://registry.npmjs.org/liquid-json/-/liquid-json-0.3.1.tgz" + resolved "https://registry.yarnpkg.com/liquid-json/-/liquid-json-0.3.1.tgz#9155a18136d8a6b2615e5f16f9a2448ab6b50eea" integrity sha512-wUayTU8MS827Dam6MxgD72Ui+KOSF+u/eIqpatOtjnvgJ0+mnDq33uC2M7J0tPK+upe/DpUAuK4JUU89iBoNKQ== load-script@^1.0.0: @@ -6655,12 +6782,12 @@ load-script@^1.0.0: loader-runner@^4.2.0: version "4.3.0" - resolved "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz" + resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-4.3.0.tgz#c1b4a163b99f614830353b16755e7149ac2314e1" integrity sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg== loader-utils@^2.0.0: version "2.0.4" - resolved "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.4.tgz#8b5cb38b5c34a9a018ee1fc0e6a066d1dfcc528c" integrity sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw== dependencies: big.js "^5.2.2" @@ -6668,13 +6795,13 @@ loader-utils@^2.0.0: json5 "^2.1.2" loader-utils@^3.2.0: - version "3.2.1" - resolved "https://registry.npmjs.org/loader-utils/-/loader-utils-3.2.1.tgz" - integrity sha512-ZvFw1KWS3GVyYBYb7qkmRM/WwL2TQQBxgCK62rlvm4WpVQ23Nb4tYjApUlfjrEGvOs7KHEsmyUn75OHZrJMWPw== + version "3.3.1" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-3.3.1.tgz#735b9a19fd63648ca7adbd31c2327dfe281304e5" + integrity sha512-FMJTLMXfCLMLfJxcX9PFqX5qD88Z5MRGaZCVzfuqeZSPsyiBzs+pahDQjbIWz2QIzPZz0NX9Zy4FX3lmK6YHIg== locate-path@^3.0.0: version "3.0.0" - resolved "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== dependencies: p-locate "^3.0.0" @@ -6682,144 +6809,154 @@ locate-path@^3.0.0: locate-path@^5.0.0: version "5.0.0" - resolved "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== dependencies: p-locate "^4.1.0" locate-path@^6.0.0: version "6.0.0" - resolved "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== dependencies: p-locate "^5.0.0" -lodash.clonedeep@^4.5.0: - version "4.5.0" - resolved "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz" - integrity sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ== +locate-path@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-7.2.0.tgz#69cb1779bd90b35ab1e771e1f2f89a202c2a8a8a" + integrity sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA== + dependencies: + p-locate "^6.0.0" -lodash.curry@^4.0.1: - version "4.1.1" - resolved "https://registry.npmjs.org/lodash.curry/-/lodash.curry-4.1.1.tgz" - integrity sha512-/u14pXGviLaweY5JI0IUzgzF2J6Ne8INyzAZjImcryjgkZ+ebruBxy2/JaOOkTqScddcYtakjhSaeemV8lR0tA== +lodash-es@^4.17.21: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.21.tgz#43e626c46e6591b7750beb2b50117390c609e3ee" + integrity sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw== lodash.debounce@^4.0.8: version "4.0.8" - resolved "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz" + resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" integrity sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow== -lodash.flow@^3.3.0: - version "3.5.0" - resolved "https://registry.npmjs.org/lodash.flow/-/lodash.flow-3.5.0.tgz" - integrity sha512-ff3BX/tSioo+XojX4MOsOMhJw0nZoUEF011LX8g8d3gvjVbxd89cCio4BCXronjxcTUIJUoqKEUA+n4CqvvRPw== - lodash.isequal@^4.5.0: version "4.5.0" - resolved "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz" + resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0" integrity sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ== lodash.memoize@^4.1.2: version "4.1.2" - resolved "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz" + resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" integrity sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag== -lodash.uniq@4.5.0, lodash.uniq@^4.5.0: +lodash.uniq@^4.5.0: version "4.5.0" - resolved "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz" + resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" integrity sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ== -lodash@4.17.21, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.17.4: +lodash@4.17.21, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.17.4: version "4.17.21" - resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== +longest-streak@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/longest-streak/-/longest-streak-3.1.0.tgz#62fa67cd958742a1574af9f39866364102d90cd4" + integrity sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g== + loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.2.0, loose-envify@^1.3.1, loose-envify@^1.4.0: version "1.4.0" - resolved "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz" + resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== dependencies: js-tokens "^3.0.0 || ^4.0.0" lower-case@^2.0.2: version "2.0.2" - resolved "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz" + resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-2.0.2.tgz#6fa237c63dbdc4a82ca0fd882e4722dc5e634e28" integrity sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg== dependencies: tslib "^2.0.3" -lowercase-keys@^1.0.0, lowercase-keys@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz" - integrity sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA== +lowercase-keys@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-3.0.0.tgz#c5e7d442e37ead247ae9db117a9d0a467c89d4f2" + integrity sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ== -lowercase-keys@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz" - integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA== +lru-cache@^10.2.0: + version "10.2.2" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.2.2.tgz#48206bc114c1252940c41b25b41af5b545aca878" + integrity sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ== lru-cache@^5.1.1: version "5.1.1" - resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== dependencies: yallist "^3.0.2" lru-cache@^6.0.0: version "6.0.0" - resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== dependencies: yallist "^4.0.0" -make-dir@^3.0.0, make-dir@^3.0.2, make-dir@^3.1.0: - version "3.1.0" - resolved "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz" - integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== - dependencies: - semver "^6.0.0" +markdown-extensions@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/markdown-extensions/-/markdown-extensions-2.0.0.tgz#34bebc83e9938cae16e0e017e4a9814a8330d3c4" + integrity sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q== -markdown-escapes@^1.0.0: - version "1.0.4" - resolved "https://registry.npmjs.org/markdown-escapes/-/markdown-escapes-1.0.4.tgz" - integrity sha512-8z4efJYk43E0upd0NbVXwgSTQs6cT3T06etieCMEg7dRbzCbxUCK/GHlX8mhHRDcp+OLlHkPKsvqQTCvsRl2cg== +markdown-table@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/markdown-table/-/markdown-table-3.0.3.tgz#e6331d30e493127e031dd385488b5bd326e4a6bd" + integrity sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw== md5.js@^1.3.4: version "1.3.5" - resolved "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz" + resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg== dependencies: hash-base "^3.0.0" inherits "^2.0.1" safe-buffer "^5.1.2" -mdast-squeeze-paragraphs@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/mdast-squeeze-paragraphs/-/mdast-squeeze-paragraphs-4.0.0.tgz" - integrity sha512-zxdPn69hkQ1rm4J+2Cs2j6wDEv7O17TfXTJ33tl/+JPIoEmtV9t2ZzBM5LPHE8QlHsmVD8t3vPKCyY3oH+H8MQ== - dependencies: - unist-util-remove "^2.0.0" - -mdast-util-definitions@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-4.0.0.tgz" - integrity sha512-k8AJ6aNnUkB7IE+5azR9h81O5EQ/cTDXtWdMq9Kk5KcEW/8ritU5CeLg/9HhOC++nALHBlaogJ5jz0Ybk3kPMQ== - dependencies: - unist-util-visit "^2.0.0" - mdast-util-definitions@^5.0.0: version "5.1.2" - resolved "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-5.1.2.tgz" + resolved "https://registry.yarnpkg.com/mdast-util-definitions/-/mdast-util-definitions-5.1.2.tgz#9910abb60ac5d7115d6819b57ae0bcef07a3f7a7" integrity sha512-8SVPMuHqlPME/z3gqVwWY4zVXn8lqKv/pAhC57FuJ40ImXyBpmO5ukh98zB2v7Blql2FiHjHv9LVztSIqjY+MA== dependencies: "@types/mdast" "^3.0.0" "@types/unist" "^2.0.0" unist-util-visit "^4.0.0" -mdast-util-from-markdown@^1.0.0: - version "1.3.0" - resolved "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-1.3.0.tgz" - integrity sha512-HN3W1gRIuN/ZW295c7zi7g9lVBllMgZE40RxCX37wrTPWXCWtpvOZdfnuK+1WNpvZje6XuJeI3Wnb4TJEUem+g== +mdast-util-directive@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/mdast-util-directive/-/mdast-util-directive-3.0.0.tgz#3fb1764e705bbdf0afb0d3f889e4404c3e82561f" + integrity sha512-JUpYOqKI4mM3sZcNxmF/ox04XYFFkNwr0CFlrQIkCwbvH0xzMCqkMqAde9wRd80VAhaUrwFwKm2nxretdT1h7Q== + dependencies: + "@types/mdast" "^4.0.0" + "@types/unist" "^3.0.0" + devlop "^1.0.0" + mdast-util-from-markdown "^2.0.0" + mdast-util-to-markdown "^2.0.0" + parse-entities "^4.0.0" + stringify-entities "^4.0.0" + unist-util-visit-parents "^6.0.0" + +mdast-util-find-and-replace@^3.0.0, mdast-util-find-and-replace@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.1.tgz#a6fc7b62f0994e973490e45262e4bc07607b04e0" + integrity sha512-SG21kZHGC3XRTSUhtofZkBzZTJNM5ecCi0SK2IMKmSXR8vO3peL+kb1O0z7Zl83jKtutG4k5Wv/W7V3/YHvzPA== + dependencies: + "@types/mdast" "^4.0.0" + escape-string-regexp "^5.0.0" + unist-util-is "^6.0.0" + unist-util-visit-parents "^6.0.0" + +mdast-util-from-markdown@^1.0.0, mdast-util-from-markdown@^1.1.0, mdast-util-from-markdown@^1.2.0, mdast-util-from-markdown@^1.3.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/mdast-util-from-markdown/-/mdast-util-from-markdown-1.3.1.tgz#9421a5a247f10d31d2faed2a30df5ec89ceafcf0" + integrity sha512-4xTO/M8c82qBcnQc1tgpNtubGUW/Y1tBQ1B0i5CtSoelOLKFYlElIr3bvgREYYO5iRqbMY1YuqZng0GVOI8Qww== dependencies: "@types/mdast" "^3.0.0" "@types/unist" "^2.0.0" @@ -6834,23 +6971,225 @@ mdast-util-from-markdown@^1.0.0: unist-util-stringify-position "^3.0.0" uvu "^0.5.0" -mdast-util-to-hast@10.0.1: - version "10.0.1" - resolved "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-10.0.1.tgz" - integrity sha512-BW3LM9SEMnjf4HXXVApZMt8gLQWVNXc3jryK0nJu/rOXPOnlkUjmdkDlmxMirpbU9ILncGFIwLH/ubnWBbcdgA== +mdast-util-from-markdown@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.1.tgz#32a6e8f512b416e1f51eb817fc64bd867ebcd9cc" + integrity sha512-aJEUyzZ6TzlsX2s5B4Of7lN7EQtAxvtradMMglCQDyaTFgse6CmtmdJ15ElnVRlCg1vpNyVtbem0PWzlNieZsA== dependencies: + "@types/mdast" "^4.0.0" + "@types/unist" "^3.0.0" + decode-named-character-reference "^1.0.0" + devlop "^1.0.0" + mdast-util-to-string "^4.0.0" + micromark "^4.0.0" + micromark-util-decode-numeric-character-reference "^2.0.0" + micromark-util-decode-string "^2.0.0" + micromark-util-normalize-identifier "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + unist-util-stringify-position "^4.0.0" + +mdast-util-frontmatter@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/mdast-util-frontmatter/-/mdast-util-frontmatter-2.0.1.tgz#f5f929eb1eb36c8a7737475c7eb438261f964ee8" + integrity sha512-LRqI9+wdgC25P0URIJY9vwocIzCcksduHQ9OF2joxQoyTNVduwLAFUzjoopuRJbJAReaKrNQKAZKL3uCMugWJA== + dependencies: + "@types/mdast" "^4.0.0" + devlop "^1.0.0" + escape-string-regexp "^5.0.0" + mdast-util-from-markdown "^2.0.0" + mdast-util-to-markdown "^2.0.0" + micromark-extension-frontmatter "^2.0.0" + +mdast-util-gfm-autolink-literal@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-2.0.0.tgz#5baf35407421310a08e68c15e5d8821e8898ba2a" + integrity sha512-FyzMsduZZHSc3i0Px3PQcBT4WJY/X/RCtEJKuybiC6sjPqLv7h1yqAkmILZtuxMSsUyaLUWNp71+vQH2zqp5cg== + dependencies: + "@types/mdast" "^4.0.0" + ccount "^2.0.0" + devlop "^1.0.0" + mdast-util-find-and-replace "^3.0.0" + micromark-util-character "^2.0.0" + +mdast-util-gfm-footnote@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-2.0.0.tgz#25a1753c7d16db8bfd53cd84fe50562bd1e6d6a9" + integrity sha512-5jOT2boTSVkMnQ7LTrd6n/18kqwjmuYqo7JUPe+tRCY6O7dAuTFMtTPauYYrMPpox9hlN0uOx/FL8XvEfG9/mQ== + dependencies: + "@types/mdast" "^4.0.0" + devlop "^1.1.0" + mdast-util-from-markdown "^2.0.0" + mdast-util-to-markdown "^2.0.0" + micromark-util-normalize-identifier "^2.0.0" + +mdast-util-gfm-strikethrough@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-2.0.0.tgz#d44ef9e8ed283ac8c1165ab0d0dfd058c2764c16" + integrity sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg== + dependencies: + "@types/mdast" "^4.0.0" + mdast-util-from-markdown "^2.0.0" + mdast-util-to-markdown "^2.0.0" + +mdast-util-gfm-table@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/mdast-util-gfm-table/-/mdast-util-gfm-table-2.0.0.tgz#7a435fb6223a72b0862b33afbd712b6dae878d38" + integrity sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg== + dependencies: + "@types/mdast" "^4.0.0" + devlop "^1.0.0" + markdown-table "^3.0.0" + mdast-util-from-markdown "^2.0.0" + mdast-util-to-markdown "^2.0.0" + +mdast-util-gfm-task-list-item@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-2.0.0.tgz#e68095d2f8a4303ef24094ab642e1047b991a936" + integrity sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ== + dependencies: + "@types/mdast" "^4.0.0" + devlop "^1.0.0" + mdast-util-from-markdown "^2.0.0" + mdast-util-to-markdown "^2.0.0" + +mdast-util-gfm@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/mdast-util-gfm/-/mdast-util-gfm-3.0.0.tgz#3f2aecc879785c3cb6a81ff3a243dc11eca61095" + integrity sha512-dgQEX5Amaq+DuUqf26jJqSK9qgixgd6rYDHAv4aTBuA92cTknZlKpPfa86Z/s8Dj8xsAQpFfBmPUHWJBWqS4Bw== + dependencies: + mdast-util-from-markdown "^2.0.0" + mdast-util-gfm-autolink-literal "^2.0.0" + mdast-util-gfm-footnote "^2.0.0" + mdast-util-gfm-strikethrough "^2.0.0" + mdast-util-gfm-table "^2.0.0" + mdast-util-gfm-task-list-item "^2.0.0" + mdast-util-to-markdown "^2.0.0" + +mdast-util-mdx-expression@^1.0.0: + version "1.3.2" + resolved "https://registry.yarnpkg.com/mdast-util-mdx-expression/-/mdast-util-mdx-expression-1.3.2.tgz#d027789e67524d541d6de543f36d51ae2586f220" + integrity sha512-xIPmR5ReJDu/DHH1OoIT1HkuybIfRGYRywC+gJtI7qHjCJp/M9jrmBEJW22O8lskDWm562BX2W8TiAwRTb0rKA== + dependencies: + "@types/estree-jsx" "^1.0.0" + "@types/hast" "^2.0.0" + "@types/mdast" "^3.0.0" + mdast-util-from-markdown "^1.0.0" + mdast-util-to-markdown "^1.0.0" + +mdast-util-mdx-expression@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/mdast-util-mdx-expression/-/mdast-util-mdx-expression-2.0.0.tgz#4968b73724d320a379110d853e943a501bfd9d87" + integrity sha512-fGCu8eWdKUKNu5mohVGkhBXCXGnOTLuFqOvGMvdikr+J1w7lDJgxThOKpwRWzzbyXAU2hhSwsmssOY4yTokluw== + dependencies: + "@types/estree-jsx" "^1.0.0" + "@types/hast" "^3.0.0" + "@types/mdast" "^4.0.0" + devlop "^1.0.0" + mdast-util-from-markdown "^2.0.0" + mdast-util-to-markdown "^2.0.0" + +mdast-util-mdx-jsx@^2.0.0: + version "2.1.4" + resolved "https://registry.yarnpkg.com/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-2.1.4.tgz#7c1f07f10751a78963cfabee38017cbc8b7786d1" + integrity sha512-DtMn9CmVhVzZx3f+optVDF8yFgQVt7FghCRNdlIaS3X5Bnym3hZwPbg/XW86vdpKjlc1PVj26SpnLGeJBXD3JA== + dependencies: + "@types/estree-jsx" "^1.0.0" + "@types/hast" "^2.0.0" "@types/mdast" "^3.0.0" "@types/unist" "^2.0.0" - mdast-util-definitions "^4.0.0" - mdurl "^1.0.0" - unist-builder "^2.0.0" - unist-util-generated "^1.0.0" - unist-util-position "^3.0.0" - unist-util-visit "^2.0.0" + ccount "^2.0.0" + mdast-util-from-markdown "^1.1.0" + mdast-util-to-markdown "^1.3.0" + parse-entities "^4.0.0" + stringify-entities "^4.0.0" + unist-util-remove-position "^4.0.0" + unist-util-stringify-position "^3.0.0" + vfile-message "^3.0.0" + +mdast-util-mdx-jsx@^3.0.0: + version "3.1.2" + resolved "https://registry.yarnpkg.com/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.1.2.tgz#daae777c72f9c4a106592e3025aa50fb26068e1b" + integrity sha512-eKMQDeywY2wlHc97k5eD8VC+9ASMjN8ItEZQNGwJ6E0XWKiW/Z0V5/H8pvoXUf+y+Mj0VIgeRRbujBmFn4FTyA== + dependencies: + "@types/estree-jsx" "^1.0.0" + "@types/hast" "^3.0.0" + "@types/mdast" "^4.0.0" + "@types/unist" "^3.0.0" + ccount "^2.0.0" + devlop "^1.1.0" + mdast-util-from-markdown "^2.0.0" + mdast-util-to-markdown "^2.0.0" + parse-entities "^4.0.0" + stringify-entities "^4.0.0" + unist-util-remove-position "^5.0.0" + unist-util-stringify-position "^4.0.0" + vfile-message "^4.0.0" + +mdast-util-mdx@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/mdast-util-mdx/-/mdast-util-mdx-2.0.1.tgz#49b6e70819b99bb615d7223c088d295e53bb810f" + integrity sha512-38w5y+r8nyKlGvNjSEqWrhG0w5PmnRA+wnBvm+ulYCct7nsGYhFVb0lljS9bQav4psDAS1eGkP2LMVcZBi/aqw== + dependencies: + mdast-util-from-markdown "^1.0.0" + mdast-util-mdx-expression "^1.0.0" + mdast-util-mdx-jsx "^2.0.0" + mdast-util-mdxjs-esm "^1.0.0" + mdast-util-to-markdown "^1.0.0" + +mdast-util-mdx@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/mdast-util-mdx/-/mdast-util-mdx-3.0.0.tgz#792f9cf0361b46bee1fdf1ef36beac424a099c41" + integrity sha512-JfbYLAW7XnYTTbUsmpu0kdBUVe+yKVJZBItEjwyYJiDJuZ9w4eeaqks4HQO+R7objWgS2ymV60GYpI14Ug554w== + dependencies: + mdast-util-from-markdown "^2.0.0" + mdast-util-mdx-expression "^2.0.0" + mdast-util-mdx-jsx "^3.0.0" + mdast-util-mdxjs-esm "^2.0.0" + mdast-util-to-markdown "^2.0.0" + +mdast-util-mdxjs-esm@^1.0.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/mdast-util-mdxjs-esm/-/mdast-util-mdxjs-esm-1.3.1.tgz#645d02cd607a227b49721d146fd81796b2e2d15b" + integrity sha512-SXqglS0HrEvSdUEfoXFtcg7DRl7S2cwOXc7jkuusG472Mmjag34DUDeOJUZtl+BVnyeO1frIgVpHlNRWc2gk/w== + dependencies: + "@types/estree-jsx" "^1.0.0" + "@types/hast" "^2.0.0" + "@types/mdast" "^3.0.0" + mdast-util-from-markdown "^1.0.0" + mdast-util-to-markdown "^1.0.0" + +mdast-util-mdxjs-esm@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/mdast-util-mdxjs-esm/-/mdast-util-mdxjs-esm-2.0.1.tgz#019cfbe757ad62dd557db35a695e7314bcc9fa97" + integrity sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg== + dependencies: + "@types/estree-jsx" "^1.0.0" + "@types/hast" "^3.0.0" + "@types/mdast" "^4.0.0" + devlop "^1.0.0" + mdast-util-from-markdown "^2.0.0" + mdast-util-to-markdown "^2.0.0" + +mdast-util-phrasing@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/mdast-util-phrasing/-/mdast-util-phrasing-3.0.1.tgz#c7c21d0d435d7fb90956038f02e8702781f95463" + integrity sha512-WmI1gTXUBJo4/ZmSk79Wcb2HcjPJBzM1nlI/OUWA8yk2X9ik3ffNbBGsU+09BFmXaL1IBb9fiuvq6/KMiNycSg== + dependencies: + "@types/mdast" "^3.0.0" + unist-util-is "^5.0.0" + +mdast-util-phrasing@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz#7cc0a8dec30eaf04b7b1a9661a92adb3382aa6e3" + integrity sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w== + dependencies: + "@types/mdast" "^4.0.0" + unist-util-is "^6.0.0" mdast-util-to-hast@^12.1.0: version "12.3.0" - resolved "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-12.3.0.tgz" + resolved "https://registry.yarnpkg.com/mdast-util-to-hast/-/mdast-util-to-hast-12.3.0.tgz#045d2825fb04374e59970f5b3f279b5700f6fb49" integrity sha512-pits93r8PhnIoU4Vy9bjW39M2jJ6/tdHyja9rrot9uujkN7UTU9SDnE6WNJz/IGyQk3XHX6yNNtrBH6cQzm8Hw== dependencies: "@types/hast" "^2.0.0" @@ -6862,46 +7201,100 @@ mdast-util-to-hast@^12.1.0: unist-util-position "^4.0.0" unist-util-visit "^4.0.0" -mdast-util-to-string@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-2.0.0.tgz" - integrity sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w== +mdast-util-to-hast@^13.0.0: + version "13.2.0" + resolved "https://registry.yarnpkg.com/mdast-util-to-hast/-/mdast-util-to-hast-13.2.0.tgz#5ca58e5b921cc0a3ded1bc02eed79a4fe4fe41f4" + integrity sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA== + dependencies: + "@types/hast" "^3.0.0" + "@types/mdast" "^4.0.0" + "@ungap/structured-clone" "^1.0.0" + devlop "^1.0.0" + micromark-util-sanitize-uri "^2.0.0" + trim-lines "^3.0.0" + unist-util-position "^5.0.0" + unist-util-visit "^5.0.0" + vfile "^6.0.0" -mdast-util-to-string@^3.1.0: +mdast-util-to-markdown@^1.0.0, mdast-util-to-markdown@^1.3.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/mdast-util-to-markdown/-/mdast-util-to-markdown-1.5.0.tgz#c13343cb3fc98621911d33b5cd42e7d0731171c6" + integrity sha512-bbv7TPv/WC49thZPg3jXuqzuvI45IL2EVAr/KxF0BSdHsU0ceFHOmwQn6evxAh1GaoK/6GQ1wp4R4oW2+LFL/A== + dependencies: + "@types/mdast" "^3.0.0" + "@types/unist" "^2.0.0" + longest-streak "^3.0.0" + mdast-util-phrasing "^3.0.0" + mdast-util-to-string "^3.0.0" + micromark-util-decode-string "^1.0.0" + unist-util-visit "^4.0.0" + zwitch "^2.0.0" + +mdast-util-to-markdown@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.0.tgz#9813f1d6e0cdaac7c244ec8c6dabfdb2102ea2b4" + integrity sha512-SR2VnIEdVNCJbP6y7kVTJgPLifdr8WEU440fQec7qHoHOUz/oJ2jmNRqdDQ3rbiStOXb2mCDGTuwsK5OPUgYlQ== + dependencies: + "@types/mdast" "^4.0.0" + "@types/unist" "^3.0.0" + longest-streak "^3.0.0" + mdast-util-phrasing "^4.0.0" + mdast-util-to-string "^4.0.0" + micromark-util-decode-string "^2.0.0" + unist-util-visit "^5.0.0" + zwitch "^2.0.0" + +mdast-util-to-string@^3.0.0, mdast-util-to-string@^3.1.0: version "3.2.0" - resolved "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-3.2.0.tgz" + resolved "https://registry.yarnpkg.com/mdast-util-to-string/-/mdast-util-to-string-3.2.0.tgz#66f7bb6324756741c5f47a53557f0cbf16b6f789" integrity sha512-V4Zn/ncyN1QNSqSBxTrMOLpjr+IKdHl2v3KVLoWmDPscP4r9GcCi71gjgvUV1SFSKh92AjAG4peFuBl2/YgCJg== dependencies: "@types/mdast" "^3.0.0" -mdn-data@2.0.14: - version "2.0.14" - resolved "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz" - integrity sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow== +mdast-util-to-string@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz#7a5121475556a04e7eddeb67b264aae79d312814" + integrity sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg== + dependencies: + "@types/mdast" "^4.0.0" -mdurl@^1.0.0: - version "1.0.1" - resolved "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz" - integrity sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g== +mdn-data@2.0.28: + version "2.0.28" + resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.28.tgz#5ec48e7bef120654539069e1ae4ddc81ca490eba" + integrity sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g== -mdx-mermaid@^1.1.0: - version "1.3.2" - resolved "https://registry.npmjs.org/mdx-mermaid/-/mdx-mermaid-1.3.2.tgz" - integrity sha512-8kw0tg3isKKBFzFwoe2DhIaEgKYtVeJXQtxZCCrdTPO0CTpXHnTHT0atDqsp7YkXi5iUCp/zAZPZu1cmr68T3w== +mdn-data@2.0.30: + version "2.0.30" + resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.30.tgz#ce4df6f80af6cfbe218ecd5c552ba13c4dfa08cc" + integrity sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA== + +mdx-mermaid@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/mdx-mermaid/-/mdx-mermaid-2.0.0.tgz#0bc73b31615810f5f52d0031b641a859fa30de7d" + integrity sha512-vmkh4yg/EgkhAWxdFsyol5Tgk9aTnM16njgGIYk3R3SdbejPt8YV+HRYycAOstR1TJefMNAmjAyqkRjukLP7qg== + optionalDependencies: + estree-util-to-js "^1.1.0" + estree-util-visit "^1.2.0" + hast-util-from-html "^1.0.1" + hast-util-to-estree "^2.1.0" + mdast-util-from-markdown "^1.2.0" + mdast-util-mdx "^2.0.0" + micromark-extension-mdxjs "^1.0.0" + puppeteer "^18.0.0" media-typer@0.3.0: version "0.3.0" - resolved "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz" + resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== medium-zoom@^1.0.6: - version "1.0.6" - resolved "https://registry.npmjs.org/medium-zoom/-/medium-zoom-1.0.6.tgz" - integrity sha512-UdiUWfvz9fZMg1pzf4dcuqA0W079o0mpqbTnOz5ip4VGYX96QjmbM+OgOU/0uOzAytxC0Ny4z+VcYQnhdifimg== + version "1.1.0" + resolved "https://registry.yarnpkg.com/medium-zoom/-/medium-zoom-1.1.0.tgz#6efb6bbda861a02064ee71a2617a8dc4381ecc71" + integrity sha512-ewyDsp7k4InCUp3jRmwHBRFGyjBimKps/AJLjRSox+2q/2H4p/PNpQf+pwONWlJiOudkBXtbdmVbFjqyybfTmQ== -memfs@^3.1.2, memfs@^3.4.1: +memfs@^3.1.2, memfs@^3.4.3: version "3.6.0" - resolved "https://registry.npmjs.org/memfs/-/memfs-3.6.0.tgz" + resolved "https://registry.yarnpkg.com/memfs/-/memfs-3.6.0.tgz#d7a2110f86f79dd950a8b6df6d57bc984aa185f6" integrity sha512-EGowvkkgbMcIChjMTMkESFDbZeSh8xZ7kNSF0hAiAN4Jh6jgHCRS0Ga/+C8y6Au+oqpezRHCfPsmJ2+DwAgiwQ== dependencies: fs-monkey "^1.0.4" @@ -6913,28 +7306,54 @@ memoize-one@^5.1.1: merge-descriptors@1.0.1: version "1.0.1" - resolved "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz" + resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" integrity sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w== merge-stream@^2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz" + resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== merge2@^1.3.0, merge2@^1.4.1: version "1.4.1" - resolved "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz" + resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== -methods@^1.1.2, methods@~1.1.2: +mermaid@^10.4.0, mermaid@^10.9.1: + version "10.9.1" + resolved "https://registry.yarnpkg.com/mermaid/-/mermaid-10.9.1.tgz#5f582c23f3186c46c6aa673e59eeb46d741b2ea6" + integrity sha512-Mx45Obds5W1UkW1nv/7dHRsbfMM1aOKA2+Pxs/IGHNonygDHwmng8xTHyS9z4KWVi0rbko8gjiBmuwwXQ7tiNA== + dependencies: + "@braintree/sanitize-url" "^6.0.1" + "@types/d3-scale" "^4.0.3" + "@types/d3-scale-chromatic" "^3.0.0" + cytoscape "^3.28.1" + cytoscape-cose-bilkent "^4.1.0" + d3 "^7.4.0" + d3-sankey "^0.12.3" + dagre-d3-es "7.0.10" + dayjs "^1.11.7" + dompurify "^3.0.5" + elkjs "^0.9.0" + katex "^0.16.9" + khroma "^2.0.0" + lodash-es "^4.17.21" + mdast-util-from-markdown "^1.3.0" + non-layered-tidy-tree-layout "^2.0.2" + stylis "^4.1.3" + ts-dedent "^2.2.0" + uuid "^9.0.0" + web-worker "^1.2.0" + +methods@~1.1.2: version "1.1.2" - resolved "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz" + resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== -micromark-core-commonmark@^1.0.1: - version "1.0.6" - resolved "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-1.0.6.tgz" - integrity sha512-K+PkJTxqjFfSNkfAhp4GB+cZPfQd6dxtTXnf+RjZOV7T4EEXnvgzOcnp+eSTmpGk9d1S9sL6/lqrgSNn/s0HZA== +micromark-core-commonmark@^1.0.0, micromark-core-commonmark@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-core-commonmark/-/micromark-core-commonmark-1.1.0.tgz#1386628df59946b2d39fb2edfd10f3e8e0a75bb8" + integrity sha512-BgHO1aRbolh2hcrzL2d1La37V0Aoz73ymF8rAcKnohLy93titmv62E0gP8Hrx9PKcKrqCZ1BbLGbP3bEhoXYlw== dependencies: decode-named-character-reference "^1.0.0" micromark-factory-destination "^1.0.0" @@ -6953,160 +7372,620 @@ micromark-core-commonmark@^1.0.1: micromark-util-types "^1.0.1" uvu "^0.5.0" +micromark-core-commonmark@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/micromark-core-commonmark/-/micromark-core-commonmark-2.0.1.tgz#9a45510557d068605c6e9a80f282b2bb8581e43d" + integrity sha512-CUQyKr1e///ZODyD1U3xit6zXwy1a8q2a1S1HKtIlmgvurrEpaw/Y9y6KSIbF8P59cn/NjzHyO+Q2fAyYLQrAA== + dependencies: + decode-named-character-reference "^1.0.0" + devlop "^1.0.0" + micromark-factory-destination "^2.0.0" + micromark-factory-label "^2.0.0" + micromark-factory-space "^2.0.0" + micromark-factory-title "^2.0.0" + micromark-factory-whitespace "^2.0.0" + micromark-util-character "^2.0.0" + micromark-util-chunked "^2.0.0" + micromark-util-classify-character "^2.0.0" + micromark-util-html-tag-name "^2.0.0" + micromark-util-normalize-identifier "^2.0.0" + micromark-util-resolve-all "^2.0.0" + micromark-util-subtokenize "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-extension-directive@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/micromark-extension-directive/-/micromark-extension-directive-3.0.0.tgz#527869de497a6de9024138479091bc885dae076b" + integrity sha512-61OI07qpQrERc+0wEysLHMvoiO3s2R56x5u7glHq2Yqq6EHbH4dW25G9GfDdGCDYqA21KE6DWgNSzxSwHc2hSg== + dependencies: + devlop "^1.0.0" + micromark-factory-space "^2.0.0" + micromark-factory-whitespace "^2.0.0" + micromark-util-character "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + parse-entities "^4.0.0" + +micromark-extension-frontmatter@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-extension-frontmatter/-/micromark-extension-frontmatter-2.0.0.tgz#651c52ffa5d7a8eeed687c513cd869885882d67a" + integrity sha512-C4AkuM3dA58cgZha7zVnuVxBhDsbttIMiytjgsM2XbHAB2faRVaHRle40558FBN+DJcrLNCoqG5mlrpdU4cRtg== + dependencies: + fault "^2.0.0" + micromark-util-character "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-extension-gfm-autolink-literal@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-2.0.0.tgz#f1e50b42e67d441528f39a67133eddde2bbabfd9" + integrity sha512-rTHfnpt/Q7dEAK1Y5ii0W8bhfJlVJFnJMHIPisfPK3gpVNuOP0VnRl96+YJ3RYWV/P4gFeQoGKNlT3RhuvpqAg== + dependencies: + micromark-util-character "^2.0.0" + micromark-util-sanitize-uri "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-extension-gfm-footnote@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-2.0.0.tgz#91afad310065a94b636ab1e9dab2c60d1aab953c" + integrity sha512-6Rzu0CYRKDv3BfLAUnZsSlzx3ak6HAoI85KTiijuKIz5UxZxbUI+pD6oHgw+6UtQuiRwnGRhzMmPRv4smcz0fg== + dependencies: + devlop "^1.0.0" + micromark-core-commonmark "^2.0.0" + micromark-factory-space "^2.0.0" + micromark-util-character "^2.0.0" + micromark-util-normalize-identifier "^2.0.0" + micromark-util-sanitize-uri "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-extension-gfm-strikethrough@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-2.0.0.tgz#6917db8e320da70e39ffbf97abdbff83e6783e61" + integrity sha512-c3BR1ClMp5fxxmwP6AoOY2fXO9U8uFMKs4ADD66ahLTNcwzSCyRVU4k7LPV5Nxo/VJiR4TdzxRQY2v3qIUceCw== + dependencies: + devlop "^1.0.0" + micromark-util-chunked "^2.0.0" + micromark-util-classify-character "^2.0.0" + micromark-util-resolve-all "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-extension-gfm-table@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.0.0.tgz#2cf3fe352d9e089b7ef5fff003bdfe0da29649b7" + integrity sha512-PoHlhypg1ItIucOaHmKE8fbin3vTLpDOUg8KAr8gRCF1MOZI9Nquq2i/44wFvviM4WuxJzc3demT8Y3dkfvYrw== + dependencies: + devlop "^1.0.0" + micromark-factory-space "^2.0.0" + micromark-util-character "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-extension-gfm-tagfilter@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-2.0.0.tgz#f26d8a7807b5985fba13cf61465b58ca5ff7dc57" + integrity sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg== + dependencies: + micromark-util-types "^2.0.0" + +micromark-extension-gfm-task-list-item@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-2.0.1.tgz#ee8b208f1ced1eb9fb11c19a23666e59d86d4838" + integrity sha512-cY5PzGcnULaN5O7T+cOzfMoHjBW7j+T9D2sucA5d/KbsBTPcYdebm9zUd9zzdgJGCwahV+/W78Z3nbulBYVbTw== + dependencies: + devlop "^1.0.0" + micromark-factory-space "^2.0.0" + micromark-util-character "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-extension-gfm@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/micromark-extension-gfm/-/micromark-extension-gfm-3.0.0.tgz#3e13376ab95dd7a5cfd0e29560dfe999657b3c5b" + integrity sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w== + dependencies: + micromark-extension-gfm-autolink-literal "^2.0.0" + micromark-extension-gfm-footnote "^2.0.0" + micromark-extension-gfm-strikethrough "^2.0.0" + micromark-extension-gfm-table "^2.0.0" + micromark-extension-gfm-tagfilter "^2.0.0" + micromark-extension-gfm-task-list-item "^2.0.0" + micromark-util-combine-extensions "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-extension-mdx-expression@^1.0.0: + version "1.0.8" + resolved "https://registry.yarnpkg.com/micromark-extension-mdx-expression/-/micromark-extension-mdx-expression-1.0.8.tgz#5bc1f5fd90388e8293b3ef4f7c6f06c24aff6314" + integrity sha512-zZpeQtc5wfWKdzDsHRBY003H2Smg+PUi2REhqgIhdzAa5xonhP03FcXxqFSerFiNUr5AWmHpaNPQTBVOS4lrXw== + dependencies: + "@types/estree" "^1.0.0" + micromark-factory-mdx-expression "^1.0.0" + micromark-factory-space "^1.0.0" + micromark-util-character "^1.0.0" + micromark-util-events-to-acorn "^1.0.0" + micromark-util-symbol "^1.0.0" + micromark-util-types "^1.0.0" + uvu "^0.5.0" + +micromark-extension-mdx-expression@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/micromark-extension-mdx-expression/-/micromark-extension-mdx-expression-3.0.0.tgz#1407b9ce69916cf5e03a196ad9586889df25302a" + integrity sha512-sI0nwhUDz97xyzqJAbHQhp5TfaxEvZZZ2JDqUo+7NvyIYG6BZ5CPPqj2ogUoPJlmXHBnyZUzISg9+oUmU6tUjQ== + dependencies: + "@types/estree" "^1.0.0" + devlop "^1.0.0" + micromark-factory-mdx-expression "^2.0.0" + micromark-factory-space "^2.0.0" + micromark-util-character "^2.0.0" + micromark-util-events-to-acorn "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-extension-mdx-jsx@^1.0.0: + version "1.0.5" + resolved "https://registry.yarnpkg.com/micromark-extension-mdx-jsx/-/micromark-extension-mdx-jsx-1.0.5.tgz#e72d24b7754a30d20fb797ece11e2c4e2cae9e82" + integrity sha512-gPH+9ZdmDflbu19Xkb8+gheqEDqkSpdCEubQyxuz/Hn8DOXiXvrXeikOoBA71+e8Pfi0/UYmU3wW3H58kr7akA== + dependencies: + "@types/acorn" "^4.0.0" + "@types/estree" "^1.0.0" + estree-util-is-identifier-name "^2.0.0" + micromark-factory-mdx-expression "^1.0.0" + micromark-factory-space "^1.0.0" + micromark-util-character "^1.0.0" + micromark-util-symbol "^1.0.0" + micromark-util-types "^1.0.0" + uvu "^0.5.0" + vfile-message "^3.0.0" + +micromark-extension-mdx-jsx@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/micromark-extension-mdx-jsx/-/micromark-extension-mdx-jsx-3.0.0.tgz#4aba0797c25efb2366a3fd2d367c6b1c1159f4f5" + integrity sha512-uvhhss8OGuzR4/N17L1JwvmJIpPhAd8oByMawEKx6NVdBCbesjH4t+vjEp3ZXft9DwvlKSD07fCeI44/N0Vf2w== + dependencies: + "@types/acorn" "^4.0.0" + "@types/estree" "^1.0.0" + devlop "^1.0.0" + estree-util-is-identifier-name "^3.0.0" + micromark-factory-mdx-expression "^2.0.0" + micromark-factory-space "^2.0.0" + micromark-util-character "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + vfile-message "^4.0.0" + +micromark-extension-mdx-md@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/micromark-extension-mdx-md/-/micromark-extension-mdx-md-1.0.1.tgz#595d4b2f692b134080dca92c12272ab5b74c6d1a" + integrity sha512-7MSuj2S7xjOQXAjjkbjBsHkMtb+mDGVW6uI2dBL9snOBCbZmoNgDAeZ0nSn9j3T42UE/g2xVNMn18PJxZvkBEA== + dependencies: + micromark-util-types "^1.0.0" + +micromark-extension-mdx-md@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-extension-mdx-md/-/micromark-extension-mdx-md-2.0.0.tgz#1d252881ea35d74698423ab44917e1f5b197b92d" + integrity sha512-EpAiszsB3blw4Rpba7xTOUptcFeBFi+6PY8VnJ2hhimH+vCQDirWgsMpz7w1XcZE7LVrSAUGb9VJpG9ghlYvYQ== + dependencies: + micromark-util-types "^2.0.0" + +micromark-extension-mdxjs-esm@^1.0.0: + version "1.0.5" + resolved "https://registry.yarnpkg.com/micromark-extension-mdxjs-esm/-/micromark-extension-mdxjs-esm-1.0.5.tgz#e4f8be9c14c324a80833d8d3a227419e2b25dec1" + integrity sha512-xNRBw4aoURcyz/S69B19WnZAkWJMxHMT5hE36GtDAyhoyn/8TuAeqjFJQlwk+MKQsUD7b3l7kFX+vlfVWgcX1w== + dependencies: + "@types/estree" "^1.0.0" + micromark-core-commonmark "^1.0.0" + micromark-util-character "^1.0.0" + micromark-util-events-to-acorn "^1.0.0" + micromark-util-symbol "^1.0.0" + micromark-util-types "^1.0.0" + unist-util-position-from-estree "^1.1.0" + uvu "^0.5.0" + vfile-message "^3.0.0" + +micromark-extension-mdxjs-esm@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/micromark-extension-mdxjs-esm/-/micromark-extension-mdxjs-esm-3.0.0.tgz#de21b2b045fd2059bd00d36746081de38390d54a" + integrity sha512-DJFl4ZqkErRpq/dAPyeWp15tGrcrrJho1hKK5uBS70BCtfrIFg81sqcTVu3Ta+KD1Tk5vAtBNElWxtAa+m8K9A== + dependencies: + "@types/estree" "^1.0.0" + devlop "^1.0.0" + micromark-core-commonmark "^2.0.0" + micromark-util-character "^2.0.0" + micromark-util-events-to-acorn "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + unist-util-position-from-estree "^2.0.0" + vfile-message "^4.0.0" + +micromark-extension-mdxjs@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/micromark-extension-mdxjs/-/micromark-extension-mdxjs-1.0.1.tgz#f78d4671678d16395efeda85170c520ee795ded8" + integrity sha512-7YA7hF6i5eKOfFUzZ+0z6avRG52GpWR8DL+kN47y3f2KhxbBZMhmxe7auOeaTBrW2DenbbZTf1ea9tA2hDpC2Q== + dependencies: + acorn "^8.0.0" + acorn-jsx "^5.0.0" + micromark-extension-mdx-expression "^1.0.0" + micromark-extension-mdx-jsx "^1.0.0" + micromark-extension-mdx-md "^1.0.0" + micromark-extension-mdxjs-esm "^1.0.0" + micromark-util-combine-extensions "^1.0.0" + micromark-util-types "^1.0.0" + +micromark-extension-mdxjs@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/micromark-extension-mdxjs/-/micromark-extension-mdxjs-3.0.0.tgz#b5a2e0ed449288f3f6f6c544358159557549de18" + integrity sha512-A873fJfhnJ2siZyUrJ31l34Uqwy4xIFmvPY1oj+Ean5PHcPBYzEsvqvWGaWcfEIr11O5Dlw3p2y0tZWpKHDejQ== + dependencies: + acorn "^8.0.0" + acorn-jsx "^5.0.0" + micromark-extension-mdx-expression "^3.0.0" + micromark-extension-mdx-jsx "^3.0.0" + micromark-extension-mdx-md "^2.0.0" + micromark-extension-mdxjs-esm "^3.0.0" + micromark-util-combine-extensions "^2.0.0" + micromark-util-types "^2.0.0" + micromark-factory-destination@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-1.0.0.tgz" - integrity sha512-eUBA7Rs1/xtTVun9TmV3gjfPz2wEwgK5R5xcbIM5ZYAtvGF6JkyaDsj0agx8urXnO31tEO6Ug83iVH3tdedLnw== + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-factory-destination/-/micromark-factory-destination-1.1.0.tgz#eb815957d83e6d44479b3df640f010edad667b9f" + integrity sha512-XaNDROBgx9SgSChd69pjiGKbV+nfHGDPVYFs5dOoDd7ZnMAE+Cuu91BCpsY8RT2NP9vo/B8pds2VQNCLiu0zhg== dependencies: micromark-util-character "^1.0.0" micromark-util-symbol "^1.0.0" micromark-util-types "^1.0.0" +micromark-factory-destination@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-factory-destination/-/micromark-factory-destination-2.0.0.tgz#857c94debd2c873cba34e0445ab26b74f6a6ec07" + integrity sha512-j9DGrQLm/Uhl2tCzcbLhy5kXsgkHUrjJHg4fFAeoMRwJmJerT9aw4FEhIbZStWN8A3qMwOp1uzHr4UL8AInxtA== + dependencies: + micromark-util-character "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + micromark-factory-label@^1.0.0: - version "1.0.2" - resolved "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-1.0.2.tgz" - integrity sha512-CTIwxlOnU7dEshXDQ+dsr2n+yxpP0+fn271pu0bwDIS8uqfFcumXpj5mLn3hSC8iw2MUr6Gx8EcKng1dD7i6hg== + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-factory-label/-/micromark-factory-label-1.1.0.tgz#cc95d5478269085cfa2a7282b3de26eb2e2dec68" + integrity sha512-OLtyez4vZo/1NjxGhcpDSbHQ+m0IIGnT8BoPamh+7jVlzLJBH98zzuCoUeMxvM6WsNeh8wx8cKvqLiPHEACn0w== dependencies: micromark-util-character "^1.0.0" micromark-util-symbol "^1.0.0" micromark-util-types "^1.0.0" uvu "^0.5.0" +micromark-factory-label@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-factory-label/-/micromark-factory-label-2.0.0.tgz#17c5c2e66ce39ad6f4fc4cbf40d972f9096f726a" + integrity sha512-RR3i96ohZGde//4WSe/dJsxOX6vxIg9TimLAS3i4EhBAFx8Sm5SmqVfR8E87DPSR31nEAjZfbt91OMZWcNgdZw== + dependencies: + devlop "^1.0.0" + micromark-util-character "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-factory-mdx-expression@^1.0.0: + version "1.0.9" + resolved "https://registry.yarnpkg.com/micromark-factory-mdx-expression/-/micromark-factory-mdx-expression-1.0.9.tgz#57ba4571b69a867a1530f34741011c71c73a4976" + integrity sha512-jGIWzSmNfdnkJq05c7b0+Wv0Kfz3NJ3N4cBjnbO4zjXIlxJr+f8lk+5ZmwFvqdAbUy2q6B5rCY//g0QAAaXDWA== + dependencies: + "@types/estree" "^1.0.0" + micromark-util-character "^1.0.0" + micromark-util-events-to-acorn "^1.0.0" + micromark-util-symbol "^1.0.0" + micromark-util-types "^1.0.0" + unist-util-position-from-estree "^1.0.0" + uvu "^0.5.0" + vfile-message "^3.0.0" + +micromark-factory-mdx-expression@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/micromark-factory-mdx-expression/-/micromark-factory-mdx-expression-2.0.1.tgz#f2a9724ce174f1751173beb2c1f88062d3373b1b" + integrity sha512-F0ccWIUHRLRrYp5TC9ZYXmZo+p2AM13ggbsW4T0b5CRKP8KHVRB8t4pwtBgTxtjRmwrK0Irwm7vs2JOZabHZfg== + dependencies: + "@types/estree" "^1.0.0" + devlop "^1.0.0" + micromark-util-character "^2.0.0" + micromark-util-events-to-acorn "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + unist-util-position-from-estree "^2.0.0" + vfile-message "^4.0.0" + micromark-factory-space@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-1.0.0.tgz" - integrity sha512-qUmqs4kj9a5yBnk3JMLyjtWYN6Mzfcx8uJfi5XAveBniDevmZasdGBba5b4QsvRcAkmvGo5ACmSUmyGiKTLZew== + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-factory-space/-/micromark-factory-space-1.1.0.tgz#c8f40b0640a0150751d3345ed885a080b0d15faf" + integrity sha512-cRzEj7c0OL4Mw2v6nwzttyOZe8XY/Z8G0rzmWQZTBi/jjwyw/U4uqKtUORXQrR5bAZZnbTI/feRV/R7hc4jQYQ== dependencies: micromark-util-character "^1.0.0" micromark-util-types "^1.0.0" +micromark-factory-space@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz#5e7afd5929c23b96566d0e1ae018ae4fcf81d030" + integrity sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg== + dependencies: + micromark-util-character "^2.0.0" + micromark-util-types "^2.0.0" + micromark-factory-title@^1.0.0: - version "1.0.2" - resolved "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-1.0.2.tgz" - integrity sha512-zily+Nr4yFqgMGRKLpTVsNl5L4PMu485fGFDOQJQBl2NFpjGte1e86zC0da93wf97jrc4+2G2GQudFMHn3IX+A== + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-factory-title/-/micromark-factory-title-1.1.0.tgz#dd0fe951d7a0ac71bdc5ee13e5d1465ad7f50ea1" + integrity sha512-J7n9R3vMmgjDOCY8NPw55jiyaQnH5kBdV2/UXCtZIpnHH3P6nHUKaH7XXEYuWwx/xUJcawa8plLBEjMPU24HzQ== dependencies: micromark-factory-space "^1.0.0" micromark-util-character "^1.0.0" micromark-util-symbol "^1.0.0" micromark-util-types "^1.0.0" - uvu "^0.5.0" + +micromark-factory-title@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-factory-title/-/micromark-factory-title-2.0.0.tgz#726140fc77892af524705d689e1cf06c8a83ea95" + integrity sha512-jY8CSxmpWLOxS+t8W+FG3Xigc0RDQA9bKMY/EwILvsesiRniiVMejYTE4wumNc2f4UbAa4WsHqe3J1QS1sli+A== + dependencies: + micromark-factory-space "^2.0.0" + micromark-util-character "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" micromark-factory-whitespace@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-1.0.0.tgz" - integrity sha512-Qx7uEyahU1lt1RnsECBiuEbfr9INjQTGa6Err+gF3g0Tx4YEviPbqqGKNv/NrBaE7dVHdn1bVZKM/n5I/Bak7A== + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-factory-whitespace/-/micromark-factory-whitespace-1.1.0.tgz#798fb7489f4c8abafa7ca77eed6b5745853c9705" + integrity sha512-v2WlmiymVSp5oMg+1Q0N1Lxmt6pMhIHD457whWM7/GUlEks1hI9xj5w3zbc4uuMKXGisksZk8DzP2UyGbGqNsQ== dependencies: micromark-factory-space "^1.0.0" micromark-util-character "^1.0.0" micromark-util-symbol "^1.0.0" micromark-util-types "^1.0.0" -micromark-util-character@^1.0.0: - version "1.1.0" - resolved "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-1.1.0.tgz" - integrity sha512-agJ5B3unGNJ9rJvADMJ5ZiYjBRyDpzKAOk01Kpi1TKhlT1APx3XZk6eN7RtSz1erbWHC2L8T3xLZ81wdtGRZzg== +micromark-factory-whitespace@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.0.tgz#9e92eb0f5468083381f923d9653632b3cfb5f763" + integrity sha512-28kbwaBjc5yAI1XadbdPYHX/eDnqaUFVikLwrO7FDnKG7lpgxnvk/XGRhX/PN0mOZ+dBSZ+LgunHS+6tYQAzhA== + dependencies: + micromark-factory-space "^2.0.0" + micromark-util-character "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-util-character@^1.0.0, micromark-util-character@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/micromark-util-character/-/micromark-util-character-1.2.0.tgz#4fedaa3646db249bc58caeb000eb3549a8ca5dcc" + integrity sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg== dependencies: micromark-util-symbol "^1.0.0" micromark-util-types "^1.0.0" +micromark-util-character@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/micromark-util-character/-/micromark-util-character-2.1.0.tgz#31320ace16b4644316f6bf057531689c71e2aee1" + integrity sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ== + dependencies: + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + micromark-util-chunked@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-1.0.0.tgz" - integrity sha512-5e8xTis5tEZKgesfbQMKRCyzvffRRUX+lK/y+DvsMFdabAicPkkZV6gO+FEWi9RfuKKoxxPwNL+dFF0SMImc1g== + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-util-chunked/-/micromark-util-chunked-1.1.0.tgz#37a24d33333c8c69a74ba12a14651fd9ea8a368b" + integrity sha512-Ye01HXpkZPNcV6FiyoW2fGZDUw4Yc7vT0E9Sad83+bEDiCJ1uXu0S3mr8WLpsz3HaG3x2q0HM6CTuPdcZcluFQ== dependencies: micromark-util-symbol "^1.0.0" +micromark-util-chunked@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-util-chunked/-/micromark-util-chunked-2.0.0.tgz#e51f4db85fb203a79dbfef23fd41b2f03dc2ef89" + integrity sha512-anK8SWmNphkXdaKgz5hJvGa7l00qmcaUQoMYsBwDlSKFKjc6gjGXPDw3FNL3Nbwq5L8gE+RCbGqTw49FK5Qyvg== + dependencies: + micromark-util-symbol "^2.0.0" + micromark-util-classify-character@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-1.0.0.tgz" - integrity sha512-F8oW2KKrQRb3vS5ud5HIqBVkCqQi224Nm55o5wYLzY/9PwHGXC01tr3d7+TqHHz6zrKQ72Okwtvm/xQm6OVNZA== + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-util-classify-character/-/micromark-util-classify-character-1.1.0.tgz#6a7f8c8838e8a120c8e3c4f2ae97a2bff9190e9d" + integrity sha512-SL0wLxtKSnklKSUplok1WQFoGhUdWYKggKUiqhX+Swala+BtptGCu5iPRc+xvzJ4PXE/hwM3FNXsfEVgoZsWbw== dependencies: micromark-util-character "^1.0.0" micromark-util-symbol "^1.0.0" micromark-util-types "^1.0.0" +micromark-util-classify-character@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-util-classify-character/-/micromark-util-classify-character-2.0.0.tgz#8c7537c20d0750b12df31f86e976d1d951165f34" + integrity sha512-S0ze2R9GH+fu41FA7pbSqNWObo/kzwf8rN/+IGlW/4tC6oACOs8B++bh+i9bVyNnwCcuksbFwsBme5OCKXCwIw== + dependencies: + micromark-util-character "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + micromark-util-combine-extensions@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-1.0.0.tgz" - integrity sha512-J8H058vFBdo/6+AsjHp2NF7AJ02SZtWaVUjsayNFeAiydTxUwViQPxN0Hf8dp4FmCQi0UUFovFsEyRSUmFH3MA== + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-util-combine-extensions/-/micromark-util-combine-extensions-1.1.0.tgz#192e2b3d6567660a85f735e54d8ea6e3952dbe84" + integrity sha512-Q20sp4mfNf9yEqDL50WwuWZHUrCO4fEyeDCnMGmG5Pr0Cz15Uo7KBs6jq+dq0EgX4DPwwrh9m0X+zPV1ypFvUA== dependencies: micromark-util-chunked "^1.0.0" micromark-util-types "^1.0.0" +micromark-util-combine-extensions@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.0.tgz#75d6ab65c58b7403616db8d6b31315013bfb7ee5" + integrity sha512-vZZio48k7ON0fVS3CUgFatWHoKbbLTK/rT7pzpJ4Bjp5JjkZeasRfrS9wsBdDJK2cJLHMckXZdzPSSr1B8a4oQ== + dependencies: + micromark-util-chunked "^2.0.0" + micromark-util-types "^2.0.0" + micromark-util-decode-numeric-character-reference@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-1.0.0.tgz" - integrity sha512-OzO9AI5VUtrTD7KSdagf4MWgHMtET17Ua1fIpXTpuhclCqD8egFWo85GxSGvxgkGS74bEahvtM0WP0HjvV0e4w== + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-1.1.0.tgz#b1e6e17009b1f20bc652a521309c5f22c85eb1c6" + integrity sha512-m9V0ExGv0jB1OT21mrWcuf4QhP46pH1KkfWy9ZEezqHKAxkj4mPCy3nIH1rkbdMlChLHX531eOrymlwyZIf2iw== dependencies: micromark-util-symbol "^1.0.0" +micromark-util-decode-numeric-character-reference@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.1.tgz#2698bbb38f2a9ba6310e359f99fcb2b35a0d2bd5" + integrity sha512-bmkNc7z8Wn6kgjZmVHOX3SowGmVdhYS7yBpMnuMnPzDq/6xwVA604DuOXMZTO1lvq01g+Adfa0pE2UKGlxL1XQ== + dependencies: + micromark-util-symbol "^2.0.0" + micromark-util-decode-string@^1.0.0: - version "1.0.2" - resolved "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-1.0.2.tgz" - integrity sha512-DLT5Ho02qr6QWVNYbRZ3RYOSSWWFuH3tJexd3dgN1odEuPNxCngTCXJum7+ViRAd9BbdxCvMToPOD/IvVhzG6Q== + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-util-decode-string/-/micromark-util-decode-string-1.1.0.tgz#dc12b078cba7a3ff690d0203f95b5d5537f2809c" + integrity sha512-YphLGCK8gM1tG1bd54azwyrQRjCFcmgj2S2GoJDNnh4vYtnL38JS8M4gpxzOPNyHdNEpheyWXCTnnTDY3N+NVQ== dependencies: decode-named-character-reference "^1.0.0" micromark-util-character "^1.0.0" micromark-util-decode-numeric-character-reference "^1.0.0" micromark-util-symbol "^1.0.0" +micromark-util-decode-string@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-util-decode-string/-/micromark-util-decode-string-2.0.0.tgz#7dfa3a63c45aecaa17824e656bcdb01f9737154a" + integrity sha512-r4Sc6leeUTn3P6gk20aFMj2ntPwn6qpDZqWvYmAG6NgvFTIlj4WtrAudLi65qYoaGdXYViXYw2pkmn7QnIFasA== + dependencies: + decode-named-character-reference "^1.0.0" + micromark-util-character "^2.0.0" + micromark-util-decode-numeric-character-reference "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-encode@^1.0.0: - version "1.0.1" - resolved "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-1.0.1.tgz" - integrity sha512-U2s5YdnAYexjKDel31SVMPbfi+eF8y1U4pfiRW/Y8EFVCy/vgxk/2wWTxzcqE71LHtCuCzlBDRU2a5CQ5j+mQA== + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-util-encode/-/micromark-util-encode-1.1.0.tgz#92e4f565fd4ccb19e0dcae1afab9a173bbeb19a5" + integrity sha512-EuEzTWSTAj9PA5GOAs992GzNh2dGQO52UvAbtSOMvXTxv3Criqb6IOzJUBCmEqrrXSblJIJBbFFv6zPxpreiJw== + +micromark-util-encode@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-util-encode/-/micromark-util-encode-2.0.0.tgz#0921ac7953dc3f1fd281e3d1932decfdb9382ab1" + integrity sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA== + +micromark-util-events-to-acorn@^1.0.0: + version "1.2.3" + resolved "https://registry.yarnpkg.com/micromark-util-events-to-acorn/-/micromark-util-events-to-acorn-1.2.3.tgz#a4ab157f57a380e646670e49ddee97a72b58b557" + integrity sha512-ij4X7Wuc4fED6UoLWkmo0xJQhsktfNh1J0m8g4PbIMPlx+ek/4YdW5mvbye8z/aZvAPUoxgXHrwVlXAPKMRp1w== + dependencies: + "@types/acorn" "^4.0.0" + "@types/estree" "^1.0.0" + "@types/unist" "^2.0.0" + estree-util-visit "^1.0.0" + micromark-util-symbol "^1.0.0" + micromark-util-types "^1.0.0" + uvu "^0.5.0" + vfile-message "^3.0.0" + +micromark-util-events-to-acorn@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/micromark-util-events-to-acorn/-/micromark-util-events-to-acorn-2.0.2.tgz#4275834f5453c088bd29cd72dfbf80e3327cec07" + integrity sha512-Fk+xmBrOv9QZnEDguL9OI9/NQQp6Hz4FuQ4YmCb/5V7+9eAh1s6AYSvL20kHkD67YIg7EpE54TiSlcsf3vyZgA== + dependencies: + "@types/acorn" "^4.0.0" + "@types/estree" "^1.0.0" + "@types/unist" "^3.0.0" + devlop "^1.0.0" + estree-util-visit "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + vfile-message "^4.0.0" micromark-util-html-tag-name@^1.0.0: - version "1.1.0" - resolved "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-1.1.0.tgz" - integrity sha512-BKlClMmYROy9UiV03SwNmckkjn8QHVaWkqoAqzivabvdGcwNGMMMH/5szAnywmsTBUzDsU57/mFi0sp4BQO6dA== + version "1.2.0" + resolved "https://registry.yarnpkg.com/micromark-util-html-tag-name/-/micromark-util-html-tag-name-1.2.0.tgz#48fd7a25826f29d2f71479d3b4e83e94829b3588" + integrity sha512-VTQzcuQgFUD7yYztuQFKXT49KghjtETQ+Wv/zUjGSGBioZnkA4P1XXZPT1FHeJA6RwRXSF47yvJ1tsJdoxwO+Q== + +micromark-util-html-tag-name@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.0.tgz#ae34b01cbe063363847670284c6255bb12138ec4" + integrity sha512-xNn4Pqkj2puRhKdKTm8t1YHC/BAjx6CEwRFXntTaRf/x16aqka6ouVoutm+QdkISTlT7e2zU7U4ZdlDLJd2Mcw== micromark-util-normalize-identifier@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-1.0.0.tgz" - integrity sha512-yg+zrL14bBTFrQ7n35CmByWUTFsgst5JhA4gJYoty4Dqzj4Z4Fr/DHekSS5aLfH9bdlfnSvKAWsAgJhIbogyBg== + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-1.1.0.tgz#7a73f824eb9f10d442b4d7f120fecb9b38ebf8b7" + integrity sha512-N+w5vhqrBihhjdpM8+5Xsxy71QWqGn7HYNUvch71iV2PM7+E3uWGox1Qp90loa1ephtCxG2ftRV/Conitc6P2Q== dependencies: micromark-util-symbol "^1.0.0" +micromark-util-normalize-identifier@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.0.tgz#91f9a4e65fe66cc80c53b35b0254ad67aa431d8b" + integrity sha512-2xhYT0sfo85FMrUPtHcPo2rrp1lwbDEEzpx7jiH2xXJLqBuy4H0GgXk5ToU8IEwoROtXuL8ND0ttVa4rNqYK3w== + dependencies: + micromark-util-symbol "^2.0.0" + micromark-util-resolve-all@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-1.0.0.tgz" - integrity sha512-CB/AGk98u50k42kvgaMM94wzBqozSzDDaonKU7P7jwQIuH2RU0TeBqGYJz2WY1UdihhjweivStrJ2JdkdEmcfw== + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-util-resolve-all/-/micromark-util-resolve-all-1.1.0.tgz#4652a591ee8c8fa06714c9b54cd6c8e693671188" + integrity sha512-b/G6BTMSg+bX+xVCshPTPyAu2tmA0E4X98NSR7eIbeC6ycCqCeE7wjfDIgzEbkzdEVJXRtOG4FbEm/uGbCRouA== dependencies: micromark-util-types "^1.0.0" +micromark-util-resolve-all@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.0.tgz#189656e7e1a53d0c86a38a652b284a252389f364" + integrity sha512-6KU6qO7DZ7GJkaCgwBNtplXCvGkJToU86ybBAUdavvgsCiG8lSSvYxr9MhwmQ+udpzywHsl4RpGJsYWG1pDOcA== + dependencies: + micromark-util-types "^2.0.0" + micromark-util-sanitize-uri@^1.0.0, micromark-util-sanitize-uri@^1.1.0: - version "1.1.0" - resolved "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-1.1.0.tgz" - integrity sha512-RoxtuSCX6sUNtxhbmsEFQfWzs8VN7cTctmBPvYivo98xb/kDEoTCtJQX5wyzIYEmk/lvNFTat4hL8oW0KndFpg== + version "1.2.0" + resolved "https://registry.yarnpkg.com/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-1.2.0.tgz#613f738e4400c6eedbc53590c67b197e30d7f90d" + integrity sha512-QO4GXv0XZfWey4pYFndLUKEAktKkG5kZTdUNaTAkzbuJxn2tNBOr+QtxR2XpWaMhbImT2dPzyLrPXLlPhph34A== dependencies: micromark-util-character "^1.0.0" micromark-util-encode "^1.0.0" micromark-util-symbol "^1.0.0" +micromark-util-sanitize-uri@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.0.tgz#ec8fbf0258e9e6d8f13d9e4770f9be64342673de" + integrity sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw== + dependencies: + micromark-util-character "^2.0.0" + micromark-util-encode "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-subtokenize@^1.0.0: - version "1.0.2" - resolved "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-1.0.2.tgz" - integrity sha512-d90uqCnXp/cy4G881Ub4psE57Sf8YD0pim9QdjCRNjfas2M1u6Lbt+XZK9gnHL2XFhnozZiEdCa9CNfXSfQ6xA== + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-util-subtokenize/-/micromark-util-subtokenize-1.1.0.tgz#941c74f93a93eaf687b9054aeb94642b0e92edb1" + integrity sha512-kUQHyzRoxvZO2PuLzMt2P/dwVsTiivCK8icYTeR+3WgbuPqfHgPPy7nFKbeqRivBvn/3N3GBiNC+JRTMSxEC7A== dependencies: micromark-util-chunked "^1.0.0" micromark-util-symbol "^1.0.0" micromark-util-types "^1.0.0" uvu "^0.5.0" -micromark-util-symbol@^1.0.0: - version "1.0.1" - resolved "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-1.0.1.tgz" - integrity sha512-oKDEMK2u5qqAptasDAwWDXq0tG9AssVwAx3E9bBF3t/shRIGsWIRG+cGafs2p/SnDSOecnt6hZPCE2o6lHfFmQ== +micromark-util-subtokenize@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/micromark-util-subtokenize/-/micromark-util-subtokenize-2.0.1.tgz#76129c49ac65da6e479c09d0ec4b5f29ec6eace5" + integrity sha512-jZNtiFl/1aY73yS3UGQkutD0UbhTt68qnRpw2Pifmz5wV9h8gOVsN70v+Lq/f1rKaU/W8pxRe8y8Q9FX1AOe1Q== + dependencies: + devlop "^1.0.0" + micromark-util-chunked "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-util-symbol@^1.0.0, micromark-util-symbol@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-util-symbol/-/micromark-util-symbol-1.1.0.tgz#813cd17837bdb912d069a12ebe3a44b6f7063142" + integrity sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag== + +micromark-util-symbol@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz#12225c8f95edf8b17254e47080ce0862d5db8044" + integrity sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw== micromark-util-types@^1.0.0, micromark-util-types@^1.0.1: - version "1.0.2" - resolved "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-1.0.2.tgz" - integrity sha512-DCfg/T8fcrhrRKTPjRrw/5LLvdGV7BHySf/1LOZx7TzWZdYRjogNtyNq885z3nNallwr3QUKARjqvHqX1/7t+w== + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-util-types/-/micromark-util-types-1.1.0.tgz#e6676a8cae0bb86a2171c498167971886cb7e283" + integrity sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg== + +micromark-util-types@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-util-types/-/micromark-util-types-2.0.0.tgz#63b4b7ffeb35d3ecf50d1ca20e68fc7caa36d95e" + integrity sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w== micromark@^3.0.0: - version "3.1.0" - resolved "https://registry.npmjs.org/micromark/-/micromark-3.1.0.tgz" - integrity sha512-6Mj0yHLdUZjHnOPgr5xfWIMqMWS12zDN6iws9SLuSz76W8jTtAv24MN4/CL7gJrl5vtxGInkkqDv/JIoRsQOvA== + version "3.2.0" + resolved "https://registry.yarnpkg.com/micromark/-/micromark-3.2.0.tgz#1af9fef3f995ea1ea4ac9c7e2f19c48fd5c006e9" + integrity sha512-uD66tJj54JLYq0De10AhWycZWGQNUvDI55xPgk2sQM5kn1JYlhbCMTtEeT27+vAhW2FBQxLlOmS3pmA7/2z4aA== dependencies: "@types/debug" "^4.0.0" debug "^4.0.0" @@ -7126,17 +8005,40 @@ micromark@^3.0.0: micromark-util-types "^1.0.1" uvu "^0.5.0" -micromatch@^4.0.2, micromatch@^4.0.4, micromatch@^4.0.5: - version "4.0.5" - resolved "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz" - integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== +micromark@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/micromark/-/micromark-4.0.0.tgz#84746a249ebd904d9658cfabc1e8e5f32cbc6249" + integrity sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ== dependencies: - braces "^3.0.2" + "@types/debug" "^4.0.0" + debug "^4.0.0" + decode-named-character-reference "^1.0.0" + devlop "^1.0.0" + micromark-core-commonmark "^2.0.0" + micromark-factory-space "^2.0.0" + micromark-util-character "^2.0.0" + micromark-util-chunked "^2.0.0" + micromark-util-combine-extensions "^2.0.0" + micromark-util-decode-numeric-character-reference "^2.0.0" + micromark-util-encode "^2.0.0" + micromark-util-normalize-identifier "^2.0.0" + micromark-util-resolve-all "^2.0.0" + micromark-util-sanitize-uri "^2.0.0" + micromark-util-subtokenize "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromatch@^4.0.2, micromatch@^4.0.4, micromatch@^4.0.5: + version "4.0.7" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.7.tgz#33e8190d9fe474a9895525f5618eee136d46c2e5" + integrity sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q== + dependencies: + braces "^3.0.3" picomatch "^2.3.1" miller-rabin@^4.0.0: version "4.0.1" - resolved "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz" + resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d" integrity sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA== dependencies: bn.js "^4.0.0" @@ -7144,131 +8046,149 @@ miller-rabin@^4.0.0: mime-db@1.51.0: version "1.51.0" - resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.51.0.tgz#d9ff62451859b18342d960850dc3cfb77e63fb0c" integrity sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g== mime-db@1.52.0, "mime-db@>= 1.43.0 < 2": version "1.52.0" - resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== mime-db@~1.33.0: version "1.33.0" - resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.33.0.tgz#a3492050a5cb9b63450541e39d9788d2272783db" integrity sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ== mime-format@2.0.1: version "2.0.1" - resolved "https://registry.npmjs.org/mime-format/-/mime-format-2.0.1.tgz" + resolved "https://registry.yarnpkg.com/mime-format/-/mime-format-2.0.1.tgz#1274876d58bc803332427a515f5f7036e07b9413" integrity sha512-XxU3ngPbEnrYnNbIX+lYSaYg0M01v6p2ntd2YaFksTu0vayaw5OJvbdRyWs07EYRlLED5qadUZ+xo+XhOvFhwg== dependencies: charset "^1.0.0" mime-types@2.1.18: version "2.1.18" - resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.18.tgz#6f323f60a83d11146f831ff11fd66e2fe5503bb8" integrity sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ== dependencies: mime-db "~1.33.0" mime-types@2.1.34: version "2.1.34" - resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.34.tgz#5a712f9ec1503511a945803640fafe09d3793c24" integrity sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A== dependencies: mime-db "1.51.0" -mime-types@^2.1.12, mime-types@^2.1.27, mime-types@^2.1.31, mime-types@~2.1.17, mime-types@~2.1.24, mime-types@~2.1.34: +mime-types@^2.1.27, mime-types@^2.1.31, mime-types@~2.1.17, mime-types@~2.1.24, mime-types@~2.1.34: version "2.1.35" - resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== dependencies: mime-db "1.52.0" mime@1.6.0: version "1.6.0" - resolved "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== -mime@2.6.0: - version "2.6.0" - resolved "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz" - integrity sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg== - mimic-fn@^2.1.0: version "2.1.0" - resolved "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== -mimic-response@^1.0.0, mimic-response@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz" - integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ== +mimic-response@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-3.1.0.tgz#2d1d59af9c1b129815accc2c46a022a5ce1fa3c9" + integrity sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ== -mini-css-extract-plugin@^2.6.1: - version "2.6.1" - resolved "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.6.1.tgz" - integrity sha512-wd+SD57/K6DiV7jIR34P+s3uckTRuQvx0tKPcvjFlrEylk6P4mQ2KSWk1hblj1Kxaqok7LogKOieygXqBczNlg== +mimic-response@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-4.0.0.tgz#35468b19e7c75d10f5165ea25e75a5ceea7cf70f" + integrity sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg== + +mini-css-extract-plugin@^2.7.6: + version "2.9.0" + resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-2.9.0.tgz#c73a1327ccf466f69026ac22a8e8fd707b78a235" + integrity sha512-Zs1YsZVfemekSZG+44vBsYTLQORkPMwnlv+aehcxK/NLKC+EGhDB39/YePYYqx/sTk6NnYpuqikhSn7+JIevTA== dependencies: schema-utils "^4.0.0" + tapable "^2.2.1" minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: version "1.0.1" - resolved "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz" + resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== minimalistic-crypto-utils@^1.0.1: version "1.0.1" - resolved "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz" + resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" integrity sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg== minimatch@3.1.2, minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1: version "3.1.2" - resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== dependencies: brace-expansion "^1.1.7" minimatch@^5.0.1: version "5.1.6" - resolved "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.6.tgz#1cfcb8cf5522ea69952cd2af95ae09477f122a96" integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g== dependencies: brace-expansion "^2.0.1" +minimatch@^9.0.4: + version "9.0.4" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.4.tgz#8e49c731d1749cbec05050ee5145147b32496a51" + integrity sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw== + dependencies: + brace-expansion "^2.0.1" + minimist@^1.2.0, minimist@^1.2.5: - version "1.2.6" - resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz" - integrity sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q== + version "1.2.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" + integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== + +"minipass@^5.0.0 || ^6.0.2 || ^7.0.0", minipass@^7.1.2: + version "7.1.2" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.1.2.tgz#93a9626ce5e5e66bd4db86849e7515e92340a707" + integrity sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw== + +mkdirp-classic@^0.5.2: + version "0.5.3" + resolved "https://registry.yarnpkg.com/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz#fa10c9115cc6d8865be221ba47ee9bed78601113" + integrity sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A== mri@^1.1.0: version "1.2.0" - resolved "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz" + resolved "https://registry.yarnpkg.com/mri/-/mri-1.2.0.tgz#6721480fec2a11a4889861115a48b6cbe7cc8f0b" integrity sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA== -mrmime@^1.0.0: - version "1.0.1" - resolved "https://registry.npmjs.org/mrmime/-/mrmime-1.0.1.tgz" - integrity sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw== +mrmime@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/mrmime/-/mrmime-2.0.0.tgz#151082a6e06e59a9a39b46b3e14d5cfe92b3abb4" + integrity sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw== ms@2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== ms@2.1.2: version "2.1.2" - resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== ms@2.1.3: version "2.1.3" - resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== -multicast-dns@^7.2.4: +multicast-dns@^7.2.5: version "7.2.5" - resolved "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz" + resolved "https://registry.yarnpkg.com/multicast-dns/-/multicast-dns-7.2.5.tgz#77eb46057f4d7adbd16d9290fa7299f6fa64cced" integrity sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg== dependencies: dns-packet "^5.2.2" @@ -7276,75 +8196,80 @@ multicast-dns@^7.2.4: mustache@^4.2.0: version "4.2.0" - resolved "https://registry.npmjs.org/mustache/-/mustache-4.2.0.tgz" + resolved "https://registry.yarnpkg.com/mustache/-/mustache-4.2.0.tgz#e5892324d60a12ec9c2a73359edca52972bf6f64" integrity sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ== mz@^2.7.0: version "2.7.0" - resolved "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz" + resolved "https://registry.yarnpkg.com/mz/-/mz-2.7.0.tgz#95008057a56cafadc2bc63dde7f9ff6955948e32" integrity sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q== dependencies: any-promise "^1.0.0" object-assign "^4.0.1" thenify-all "^1.0.0" -nanoid@^3.3.6: - version "3.3.6" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.6.tgz#443380c856d6e9f9824267d960b4236ad583ea4c" - integrity sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA== - -native-promise-only@^0.8.1: - version "0.8.1" - resolved "https://registry.npmjs.org/native-promise-only/-/native-promise-only-0.8.1.tgz" - integrity sha512-zkVhZUA3y8mbz652WrL5x0fB0ehrBkulWT3TomAQ9iDtyXZvzKeEA6GPxAItBYeNYl5yngKRX612qHOhvMkDeg== +nanoid@^3.3.7: + version "3.3.7" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8" + integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g== negotiator@0.6.3: version "0.6.3" - resolved "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== neo-async@^2.6.2: version "2.6.2" - resolved "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz" + resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== no-case@^3.0.4: version "3.0.4" - resolved "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz" + resolved "https://registry.yarnpkg.com/no-case/-/no-case-3.0.4.tgz#d361fd5c9800f558551a8369fc0dcd4662b6124d" integrity sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg== dependencies: lower-case "^2.0.2" tslib "^2.0.3" -node-emoji@^1.10.0: - version "1.11.0" - resolved "https://registry.npmjs.org/node-emoji/-/node-emoji-1.11.0.tgz" - integrity sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A== +node-emoji@^2.1.0: + version "2.1.3" + resolved "https://registry.yarnpkg.com/node-emoji/-/node-emoji-2.1.3.tgz#93cfabb5cc7c3653aa52f29d6ffb7927d8047c06" + integrity sha512-E2WEOVsgs7O16zsURJ/eH8BqhF029wGpEOnv7Urwdo2wmQanOACwJQh0devF9D9RhoZru0+9JXIS0dBXIAz+lA== dependencies: - lodash "^4.17.21" + "@sindresorhus/is" "^4.6.0" + char-regex "^1.0.2" + emojilib "^2.4.0" + skin-tone "^2.0.0" node-fetch-h2@^2.3.0: version "2.3.0" - resolved "https://registry.npmjs.org/node-fetch-h2/-/node-fetch-h2-2.3.0.tgz" + resolved "https://registry.yarnpkg.com/node-fetch-h2/-/node-fetch-h2-2.3.0.tgz#c6188325f9bd3d834020bf0f2d6dc17ced2241ac" integrity sha512-ofRW94Ab0T4AOh5Fk8t0h8OBWrmjb0SSB20xh1H8YnPV9EJ+f5AMoYSUQ2zgJ4Iq2HAK0I2l5/Nequ8YzFS3Hg== dependencies: http2-client "^1.2.5" -node-fetch@2.6.7, node-fetch@^2.6.1: +node-fetch@2.6.7: version "2.6.7" - resolved "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad" integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ== dependencies: whatwg-url "^5.0.0" +node-fetch@^2.6.1: + version "2.7.0" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d" + integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A== + dependencies: + whatwg-url "^5.0.0" + node-forge@^1: version "1.3.1" - resolved "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz" + resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-1.3.1.tgz#be8da2af243b2417d5f646a770663a92b7e9ded3" integrity sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA== node-polyfill-webpack-plugin@^2.0.1: version "2.0.1" - resolved "https://registry.npmjs.org/node-polyfill-webpack-plugin/-/node-polyfill-webpack-plugin-2.0.1.tgz" + resolved "https://registry.yarnpkg.com/node-polyfill-webpack-plugin/-/node-polyfill-webpack-plugin-2.0.1.tgz#141d86f177103a8517c71d99b7c6a46edbb1bb58" integrity sha512-ZUMiCnZkP1LF0Th2caY6J/eKKoA0TefpoVa68m/LQU1I/mE8rGt4fNYGgNuCcK+aG8P8P43nbeJ2RqJMOL/Y1A== dependencies: assert "^2.0.0" @@ -7375,65 +8300,65 @@ node-polyfill-webpack-plugin@^2.0.1: node-readfiles@^0.2.0: version "0.2.0" - resolved "https://registry.npmjs.org/node-readfiles/-/node-readfiles-0.2.0.tgz" + resolved "https://registry.yarnpkg.com/node-readfiles/-/node-readfiles-0.2.0.tgz#dbbd4af12134e2e635c245ef93ffcf6f60673a5d" integrity sha512-SU00ZarexNlE4Rjdm83vglt5Y9yiQ+XI1XpflWlb7q7UTN1JUItm69xMeiQCTxtTfnzt+83T8Cx+vI2ED++VDA== dependencies: es6-promise "^3.2.1" -node-releases@^2.0.13: - version "2.0.13" - resolved "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz" - integrity sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ== +node-releases@^2.0.14: + version "2.0.14" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.14.tgz#2ffb053bceb8b2be8495ece1ab6ce600c4461b0b" + integrity sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw== + +non-layered-tidy-tree-layout@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/non-layered-tidy-tree-layout/-/non-layered-tidy-tree-layout-2.0.2.tgz#57d35d13c356643fc296a55fb11ac15e74da7804" + integrity sha512-gkXMxRzUH+PB0ax9dUN0yYF0S25BqeAYqhgMaLUFmpXLEk7Fcu8f4emJuOAY0V8kjDICxROIKsTAKsV/v355xw== normalize-path@^3.0.0, normalize-path@~3.0.0: version "3.0.0" - resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== normalize-range@^0.1.2: version "0.1.2" - resolved "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz" + resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" integrity sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA== -normalize-url@^4.1.0: - version "4.5.1" - resolved "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz" - integrity sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA== - -normalize-url@^6.0.1: - version "6.1.0" - resolved "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz" - integrity sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A== +normalize-url@^8.0.0: + version "8.0.1" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-8.0.1.tgz#9b7d96af9836577c58f5883e939365fa15623a4a" + integrity sha512-IO9QvjUMWxPQQhs60oOu10CRkWCiZzSUkzbXGGV9pviYl1fXYcvkzQ5jV9z8Y6un8ARoVRl4EtC6v6jNqbaJ/w== npm-run-path@^4.0.1: version "4.0.1" - resolved "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== dependencies: path-key "^3.0.0" nprogress@^0.2.0: version "0.2.0" - resolved "https://registry.npmjs.org/nprogress/-/nprogress-0.2.0.tgz" + resolved "https://registry.yarnpkg.com/nprogress/-/nprogress-0.2.0.tgz#cb8f34c53213d895723fcbab907e9422adbcafb1" integrity sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA== nth-check@^2.0.1: version "2.1.1" - resolved "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz" + resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-2.1.1.tgz#c9eab428effce36cd6b92c924bdb000ef1f1ed1d" integrity sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w== dependencies: boolbase "^1.0.0" oas-kit-common@^1.0.8: version "1.0.8" - resolved "https://registry.npmjs.org/oas-kit-common/-/oas-kit-common-1.0.8.tgz" + resolved "https://registry.yarnpkg.com/oas-kit-common/-/oas-kit-common-1.0.8.tgz#6d8cacf6e9097967a4c7ea8bcbcbd77018e1f535" integrity sha512-pJTS2+T0oGIwgjGpw7sIRU8RQMcUoKCDWFLdBqKB2BNmGpbBMH2sdqAaOXUg8OzonZHU0L7vfJu1mJFEiYDWOQ== dependencies: fast-safe-stringify "^2.0.7" oas-linter@^3.2.2: version "3.2.2" - resolved "https://registry.npmjs.org/oas-linter/-/oas-linter-3.2.2.tgz" + resolved "https://registry.yarnpkg.com/oas-linter/-/oas-linter-3.2.2.tgz#ab6a33736313490659035ca6802dc4b35d48aa1e" integrity sha512-KEGjPDVoU5K6swgo9hJVA/qYGlwfbFx+Kg2QB/kd7rzV5N8N5Mg6PlsoCMohVnQmo+pzJap/F610qTodKzecGQ== dependencies: "@exodus/schemasafe" "^1.0.0-rc.2" @@ -7442,7 +8367,7 @@ oas-linter@^3.2.2: oas-resolver-browser@2.5.2: version "2.5.2" - resolved "https://registry.npmjs.org/oas-resolver-browser/-/oas-resolver-browser-2.5.2.tgz" + resolved "https://registry.yarnpkg.com/oas-resolver-browser/-/oas-resolver-browser-2.5.2.tgz#d972525a840d7a74ab1aa43e215e9531a99412ba" integrity sha512-L3ugWyBHOpKLT+lb+pFXCOpk3byh6usis5T9u9mfu92jH5bR6YK8MA2bebUTIjY7I4415PzDeZcmcc+i7X05MA== dependencies: node-fetch-h2 "^2.3.0" @@ -7454,7 +8379,7 @@ oas-resolver-browser@2.5.2: oas-resolver@^2.5.6: version "2.5.6" - resolved "https://registry.npmjs.org/oas-resolver/-/oas-resolver-2.5.6.tgz" + resolved "https://registry.yarnpkg.com/oas-resolver/-/oas-resolver-2.5.6.tgz#10430569cb7daca56115c915e611ebc5515c561b" integrity sha512-Yx5PWQNZomfEhPPOphFbZKi9W93CocQj18NlD2Pa4GWZzdZpSJvYwoiuurRI7m3SpcChrnO08hkuQDL3FGsVFQ== dependencies: node-fetch-h2 "^2.3.0" @@ -7465,12 +8390,12 @@ oas-resolver@^2.5.6: oas-schema-walker@^1.1.5: version "1.1.5" - resolved "https://registry.npmjs.org/oas-schema-walker/-/oas-schema-walker-1.1.5.tgz" + resolved "https://registry.yarnpkg.com/oas-schema-walker/-/oas-schema-walker-1.1.5.tgz#74c3cd47b70ff8e0b19adada14455b5d3ac38a22" integrity sha512-2yucenq1a9YPmeNExoUa9Qwrt9RFkjqaMAA1X+U7sbb0AqBeTIdMHky9SQQ6iN94bO5NW0W4TRYXerG+BdAvAQ== oas-validator@^5.0.8: version "5.0.8" - resolved "https://registry.npmjs.org/oas-validator/-/oas-validator-5.0.8.tgz" + resolved "https://registry.yarnpkg.com/oas-validator/-/oas-validator-5.0.8.tgz#387e90df7cafa2d3ffc83b5fb976052b87e73c28" integrity sha512-cu20/HE5N5HKqVygs3dt94eYJfBi0TsZvPVXDhbXQHiEityDN+RROTleefoKRKKJ9dFAF2JBkDHgvWj0sjKGmw== dependencies: call-me-maybe "^1.0.1" @@ -7482,79 +8407,79 @@ oas-validator@^5.0.8: should "^13.2.1" yaml "^1.10.0" -object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: +object-assign@^4.0.1, object-assign@^4.1.1: version "4.1.1" - resolved "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== object-hash@^3.0.0: version "3.0.0" - resolved "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz" + resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-3.0.0.tgz#73f97f753e7baffc0e2cc9d6e079079744ac82e9" integrity sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw== -object-inspect@^1.9.0: - version "1.12.0" - resolved "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.0.tgz" - integrity sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g== +object-inspect@^1.13.1: + version "1.13.1" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.1.tgz#b96c6109324ccfef6b12216a956ca4dc2ff94bc2" + integrity sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ== -object-is@^1.0.1: - version "1.1.5" - resolved "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz" - integrity sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw== +object-is@^1.1.5: + version "1.1.6" + resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.6.tgz#1a6a53aed2dd8f7e6775ff870bea58545956ab07" + integrity sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q== dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" + call-bind "^1.0.7" + define-properties "^1.2.1" object-keys@^1.1.1: version "1.1.1" - resolved "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== -object.assign@^4.1.0: - version "4.1.2" - resolved "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz" - integrity sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ== +object.assign@^4.1.0, object.assign@^4.1.4: + version "4.1.5" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.5.tgz#3a833f9ab7fdb80fc9e8d2300c803d216d8fdbb0" + integrity sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ== dependencies: - call-bind "^1.0.0" - define-properties "^1.1.3" - has-symbols "^1.0.1" + call-bind "^1.0.5" + define-properties "^1.2.1" + has-symbols "^1.0.3" object-keys "^1.1.1" obuf@^1.0.0, obuf@^1.1.2: version "1.1.2" - resolved "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz" + resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.2.tgz#09bea3343d41859ebd446292d11c9d4db619084e" integrity sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg== on-finished@2.4.1: version "2.4.1" - resolved "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz" + resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== dependencies: ee-first "1.1.1" on-headers@~1.0.2: version "1.0.2" - resolved "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz" + resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f" integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== once@^1.3.0, once@^1.3.1, once@^1.4.0: version "1.4.0" - resolved "https://registry.npmjs.org/once/-/once-1.4.0.tgz" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== dependencies: wrappy "1" onetime@^5.1.2: version "5.1.2" - resolved "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== dependencies: mimic-fn "^2.1.0" open@^8.0.9, open@^8.4.0: - version "8.4.0" - resolved "https://registry.npmjs.org/open/-/open-8.4.0.tgz" - integrity sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q== + version "8.4.2" + resolved "https://registry.yarnpkg.com/open/-/open-8.4.2.tgz#5b5ffe2a8f793dcd2aad73e550cb87b59cb084f9" + integrity sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ== dependencies: define-lazy-prop "^2.0.0" is-docker "^2.1.1" @@ -7562,64 +8487,78 @@ open@^8.0.9, open@^8.4.0: opener@^1.5.2: version "1.5.2" - resolved "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz" + resolved "https://registry.yarnpkg.com/opener/-/opener-1.5.2.tgz#5d37e1f35077b9dcac4301372271afdeb2a13598" integrity sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A== os-browserify@^0.3.0: version "0.3.0" - resolved "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz" + resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27" integrity sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A== -p-cancelable@^1.0.0: - version "1.1.0" - resolved "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz" - integrity sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw== +p-cancelable@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-3.0.0.tgz#63826694b54d61ca1c20ebcb6d3ecf5e14cd8050" + integrity sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw== p-limit@^2.0.0, p-limit@^2.2.0: version "2.3.0" - resolved "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== dependencies: p-try "^2.0.0" p-limit@^3.0.2: version "3.1.0" - resolved "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== dependencies: yocto-queue "^0.1.0" +p-limit@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-4.0.0.tgz#914af6544ed32bfa54670b061cafcbd04984b644" + integrity sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ== + dependencies: + yocto-queue "^1.0.0" + p-locate@^3.0.0: version "3.0.0" - resolved "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== dependencies: p-limit "^2.0.0" p-locate@^4.1.0: version "4.1.0" - resolved "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== dependencies: p-limit "^2.2.0" p-locate@^5.0.0: version "5.0.0" - resolved "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== dependencies: p-limit "^3.0.2" +p-locate@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-6.0.0.tgz#3da9a49d4934b901089dca3302fa65dc5a05c04f" + integrity sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw== + dependencies: + p-limit "^4.0.0" + p-map@^4.0.0: version "4.0.0" - resolved "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b" integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ== dependencies: aggregate-error "^3.0.0" p-retry@^4.5.0: version "4.6.2" - resolved "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz" + resolved "https://registry.yarnpkg.com/p-retry/-/p-retry-4.6.2.tgz#9baae7184057edd4e17231cee04264106e092a16" integrity sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ== dependencies: "@types/retry" "0.12.0" @@ -7627,27 +8566,27 @@ p-retry@^4.5.0: p-try@^2.0.0: version "2.2.0" - resolved "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== -package-json@^6.3.0: - version "6.5.0" - resolved "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz" - integrity sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ== +package-json@^8.1.0: + version "8.1.1" + resolved "https://registry.yarnpkg.com/package-json/-/package-json-8.1.1.tgz#3e9948e43df40d1e8e78a85485f1070bf8f03dc8" + integrity sha512-cbH9IAIJHNj9uXi196JVsRlt7cHKak6u/e6AkL/bkRelZ7rlL3X1YKxsZwa36xipOEKAsdtmaG6aAJoM1fx2zA== dependencies: - got "^9.6.0" - registry-auth-token "^4.0.0" - registry-url "^5.0.0" - semver "^6.2.0" + got "^12.1.0" + registry-auth-token "^5.0.1" + registry-url "^6.0.0" + semver "^7.3.7" pako@~1.0.5: version "1.0.11" - resolved "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz" + resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf" integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw== param-case@^3.0.4: version "3.0.4" - resolved "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz" + resolved "https://registry.yarnpkg.com/param-case/-/param-case-3.0.4.tgz#7d17fe4aa12bde34d4a77d91acfb6219caad01c5" integrity sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A== dependencies: dot-case "^3.0.4" @@ -7655,37 +8594,40 @@ param-case@^3.0.4: parent-module@^1.0.0: version "1.0.1" - resolved "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz" + resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== dependencies: callsites "^3.0.0" -parse-asn1@^5.0.0, parse-asn1@^5.1.5: - version "5.1.6" - resolved "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz" - integrity sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw== +parse-asn1@^5.0.0, parse-asn1@^5.1.7: + version "5.1.7" + resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.7.tgz#73cdaaa822125f9647165625eb45f8a051d2df06" + integrity sha512-CTM5kuWR3sx9IFamcl5ErfPl6ea/N8IYwiJ+vpeB2g+1iknv7zBl5uPwbMbRVznRVbrNY6lGuDoE5b30grmbqg== dependencies: - asn1.js "^5.2.0" - browserify-aes "^1.0.0" - evp_bytestokey "^1.0.0" - pbkdf2 "^3.0.3" - safe-buffer "^5.1.1" + asn1.js "^4.10.1" + browserify-aes "^1.2.0" + evp_bytestokey "^1.0.3" + hash-base "~3.0" + pbkdf2 "^3.1.2" + safe-buffer "^5.2.1" -parse-entities@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/parse-entities/-/parse-entities-2.0.0.tgz" - integrity sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ== +parse-entities@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/parse-entities/-/parse-entities-4.0.1.tgz#4e2a01111fb1c986549b944af39eeda258fc9e4e" + integrity sha512-SWzvYcSJh4d/SGLIOQfZ/CoNv6BTlI6YEQ7Nj82oDVnRpwe/Z/F1EMx42x3JAOwGBlCjeCH0BRJQbQ/opHL17w== dependencies: - character-entities "^1.0.0" - character-entities-legacy "^1.0.0" - character-reference-invalid "^1.0.0" - is-alphanumerical "^1.0.0" - is-decimal "^1.0.0" - is-hexadecimal "^1.0.0" + "@types/unist" "^2.0.0" + character-entities "^2.0.0" + character-entities-legacy "^3.0.0" + character-reference-invalid "^2.0.0" + decode-named-character-reference "^1.0.0" + is-alphanumerical "^2.0.0" + is-decimal "^2.0.0" + is-hexadecimal "^2.0.0" -parse-json@^5.0.0: +parse-json@^5.0.0, parse-json@^5.2.0: version "5.2.0" - resolved "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== dependencies: "@babel/code-frame" "^7.0.0" @@ -7695,12 +8637,12 @@ parse-json@^5.0.0: parse-numeric-range@^1.3.0: version "1.3.0" - resolved "https://registry.npmjs.org/parse-numeric-range/-/parse-numeric-range-1.3.0.tgz" + resolved "https://registry.yarnpkg.com/parse-numeric-range/-/parse-numeric-range-1.3.0.tgz#7c63b61190d61e4d53a1197f0c83c47bb670ffa3" integrity sha512-twN+njEipszzlMJd4ONUYgSfZPDxgHhT9Ahed5uTigpQn90FggW4SA/AIPq/6a149fTbE9qBEcSwE3FAEp6wQQ== parse5-htmlparser2-tree-adapter@^7.0.0: version "7.0.0" - resolved "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.0.0.tgz" + resolved "https://registry.yarnpkg.com/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.0.0.tgz#23c2cc233bcf09bb7beba8b8a69d46b08c62c2f1" integrity sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g== dependencies: domhandler "^5.0.2" @@ -7708,24 +8650,24 @@ parse5-htmlparser2-tree-adapter@^7.0.0: parse5@^6.0.0: version "6.0.1" - resolved "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b" integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== parse5@^7.0.0: - version "7.1.1" - resolved "https://registry.npmjs.org/parse5/-/parse5-7.1.1.tgz" - integrity sha512-kwpuwzB+px5WUg9pyK0IcK/shltJN5/OVhQagxhCQNtT9Y9QRZqNY2e1cmbu/paRh5LMnz/oVTVLBpjFmMZhSg== + version "7.1.2" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-7.1.2.tgz#0736bebbfd77793823240a23b7fc5e010b7f8e32" + integrity sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw== dependencies: entities "^4.4.0" parseurl@~1.3.2, parseurl@~1.3.3: version "1.3.3" - resolved "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz" + resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== pascal-case@^3.1.2: version "3.1.2" - resolved "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz" + resolved "https://registry.yarnpkg.com/pascal-case/-/pascal-case-3.1.2.tgz#b48e0ef2b98e205e7c1dae747d0b1508237660eb" integrity sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g== dependencies: no-case "^3.0.4" @@ -7733,92 +8675,97 @@ pascal-case@^3.1.2: path-browserify@1.0.1, path-browserify@^1.0.1: version "1.0.1" - resolved "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz" + resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-1.0.1.tgz#d98454a9c3753d5790860f16f68867b9e46be1fd" integrity sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g== path-exists@^3.0.0: version "3.0.0" - resolved "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" integrity sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ== path-exists@^4.0.0: version "4.0.0" - resolved "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== +path-exists@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-5.0.0.tgz#a6aad9489200b21fab31e49cf09277e5116fb9e7" + integrity sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ== + path-is-absolute@^1.0.0: version "1.0.1" - resolved "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== path-is-inside@1.0.2: version "1.0.2" - resolved "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz" + resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" integrity sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w== path-key@^3.0.0, path-key@^3.1.0: version "3.1.1" - resolved "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== -path-loader@^1.0.10: - version "1.0.12" - resolved "https://registry.npmjs.org/path-loader/-/path-loader-1.0.12.tgz" - integrity sha512-n7oDG8B+k/p818uweWrOixY9/Dsr89o2TkCm6tOTex3fpdo2+BFDgR+KpB37mGKBRsBAlR8CIJMFN0OEy/7hIQ== - dependencies: - native-promise-only "^0.8.1" - superagent "^7.1.6" - path-parse@^1.0.7: version "1.0.7" - resolved "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== path-root-regex@^0.1.0: version "0.1.2" - resolved "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz" + resolved "https://registry.yarnpkg.com/path-root-regex/-/path-root-regex-0.1.2.tgz#bfccdc8df5b12dc52c8b43ec38d18d72c04ba96d" integrity sha512-4GlJ6rZDhQZFE0DPVKh0e9jmZ5egZfxTkp7bcRDuPlJXbAwhxcl2dINPUAsjLdejqaLsCeg8axcLjIbvBjN4pQ== path-root@^0.1.1: version "0.1.1" - resolved "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz" + resolved "https://registry.yarnpkg.com/path-root/-/path-root-0.1.1.tgz#9a4a6814cac1c0cd73360a95f32083c8ea4745b7" integrity sha512-QLcPegTHF11axjfojBIoDygmS2E3Lf+8+jI6wOVmNVenrKSo3mFdSGiIgdSHenczw3wPtlVMQaFVwGmM7BJdtg== dependencies: path-root-regex "^0.1.0" +path-scurry@^1.11.1: + version "1.11.1" + resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.11.1.tgz#7960a668888594a0720b12a911d1a742ab9f11d2" + integrity sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA== + dependencies: + lru-cache "^10.2.0" + minipass "^5.0.0 || ^6.0.2 || ^7.0.0" + path-to-regexp@0.1.7: version "0.1.7" - resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" integrity sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ== path-to-regexp@2.2.1: version "2.2.1" - resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-2.2.1.tgz" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-2.2.1.tgz#90b617025a16381a879bc82a38d4e8bdeb2bcf45" integrity sha512-gu9bD6Ta5bwGrrU8muHzVOBFFREpp2iRkVfhBJahwJ6p6Xw20SjT0MxLnwkjOibQmGSYhiUnf2FLe7k+jcFmGQ== path-to-regexp@^1.7.0: version "1.8.0" - resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-1.8.0.tgz#887b3ba9d84393e87a0a0b9f4cb756198b53548a" integrity sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA== dependencies: isarray "0.0.1" path-type@^4.0.0: version "4.0.0" - resolved "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== path@^0.12.7: version "0.12.7" - resolved "https://registry.npmjs.org/path/-/path-0.12.7.tgz" + resolved "https://registry.yarnpkg.com/path/-/path-0.12.7.tgz#d4dc2a506c4ce2197eb481ebfcd5b36c0140b10f" integrity sha512-aXXC6s+1w7otVF9UletFkFcDsJeO7lSZBPUQhtb5O0xJe8LtYhj/GxldoL09bBj9+ZmE2hNoHqQSFMN5fikh4Q== dependencies: process "^0.11.1" util "^0.10.3" -pbkdf2@^3.0.3: +pbkdf2@^3.0.3, pbkdf2@^3.1.2: version "3.1.2" - resolved "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz" + resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.2.tgz#dd822aa0887580e52f1a039dc3eda108efae3075" integrity sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA== dependencies: create-hash "^1.1.2" @@ -7827,381 +8774,394 @@ pbkdf2@^3.0.3: safe-buffer "^5.0.1" sha.js "^2.4.8" -picocolors@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz" - integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== +pend@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" + integrity sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg== + +periscopic@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/periscopic/-/periscopic-3.1.0.tgz#7e9037bf51c5855bd33b48928828db4afa79d97a" + integrity sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw== + dependencies: + "@types/estree" "^1.0.0" + estree-walker "^3.0.0" + is-reference "^3.0.0" + +picocolors@^1.0.0, picocolors@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.1.tgz#a8ad579b571952f0e5d25892de5445bcfe25aaa1" + integrity sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew== picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3, picomatch@^2.3.1: version "2.3.1" - resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== pify@^2.3.0: version "2.3.0" - resolved "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz" + resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" integrity sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog== pirates@^4.0.1: - version "4.0.5" - resolved "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz" - integrity sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ== + version "4.0.6" + resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.6.tgz#3018ae32ecfcff6c29ba2267cbf21166ac1f36b9" + integrity sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg== -pkg-dir@^4.1.0: - version "4.2.0" - resolved "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz" - integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== +pkg-dir@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-7.0.0.tgz#8f0c08d6df4476756c5ff29b3282d0bab7517d11" + integrity sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA== dependencies: - find-up "^4.0.0" + find-up "^6.3.0" pkg-up@^3.1.0: version "3.1.0" - resolved "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz" + resolved "https://registry.yarnpkg.com/pkg-up/-/pkg-up-3.1.0.tgz#100ec235cc150e4fd42519412596a28512a0def5" integrity sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA== dependencies: find-up "^3.0.0" pluralize@^8.0.0: version "8.0.0" - resolved "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz" + resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-8.0.0.tgz#1a6fa16a38d12a1901e0320fa017051c539ce3b1" integrity sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA== -postcss-calc@^8.2.3: - version "8.2.4" - resolved "https://registry.npmjs.org/postcss-calc/-/postcss-calc-8.2.4.tgz" - integrity sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q== +possible-typed-array-names@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz#89bb63c6fada2c3e90adc4a647beeeb39cc7bf8f" + integrity sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q== + +postcss-calc@^9.0.1: + version "9.0.1" + resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-9.0.1.tgz#a744fd592438a93d6de0f1434c572670361eb6c6" + integrity sha512-TipgjGyzP5QzEhsOZUaIkeO5mKeMFpebWzRogWG/ysonUlnHcq5aJe0jOjpfzUU8PeSaBQnrE8ehR0QA5vs8PQ== dependencies: - postcss-selector-parser "^6.0.9" + postcss-selector-parser "^6.0.11" postcss-value-parser "^4.2.0" -postcss-colormin@^5.3.0: - version "5.3.0" - resolved "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-5.3.0.tgz" - integrity sha512-WdDO4gOFG2Z8n4P8TWBpshnL3JpmNmJwdnfP2gbk2qBA8PWwOYcmjmI/t3CmMeL72a7Hkd+x/Mg9O2/0rD54Pg== +postcss-colormin@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-6.1.0.tgz#076e8d3fb291fbff7b10e6b063be9da42ff6488d" + integrity sha512-x9yX7DOxeMAR+BgGVnNSAxmAj98NX/YxEMNFP+SDCEeNLb2r3i6Hh1ksMsnW8Ub5SLCpbescQqn9YEbE9554Sw== dependencies: - browserslist "^4.16.6" + browserslist "^4.23.0" caniuse-api "^3.0.0" - colord "^2.9.1" + colord "^2.9.3" postcss-value-parser "^4.2.0" -postcss-convert-values@^5.1.3: - version "5.1.3" - resolved "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.1.3.tgz" - integrity sha512-82pC1xkJZtcJEfiLw6UXnXVXScgtBrjlO5CBmuDQc+dlb88ZYheFsjTn40+zBVi3DkfF7iezO0nJUPLcJK3pvA== +postcss-convert-values@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-6.1.0.tgz#3498387f8efedb817cbc63901d45bd1ceaa40f48" + integrity sha512-zx8IwP/ts9WvUM6NkVSkiU902QZL1bwPhaVaLynPtCsOTqp+ZKbNi+s6XJg3rfqpKGA/oc7Oxk5t8pOQJcwl/w== dependencies: - browserslist "^4.21.4" + browserslist "^4.23.0" postcss-value-parser "^4.2.0" -postcss-discard-comments@^5.1.2: - version "5.1.2" - resolved "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.1.2.tgz" - integrity sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ== +postcss-discard-comments@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-6.0.2.tgz#e768dcfdc33e0216380623652b0a4f69f4678b6c" + integrity sha512-65w/uIqhSBBfQmYnG92FO1mWZjJ4GL5b8atm5Yw2UgrwD7HiNiSSNwJor1eCFGzUgYnN/iIknhNRVqjrrpuglw== -postcss-discard-duplicates@^5.1.0: - version "5.1.0" - resolved "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-5.1.0.tgz" - integrity sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw== +postcss-discard-duplicates@^6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/postcss-discard-duplicates/-/postcss-discard-duplicates-6.0.3.tgz#d121e893c38dc58a67277f75bb58ba43fce4c3eb" + integrity sha512-+JA0DCvc5XvFAxwx6f/e68gQu/7Z9ud584VLmcgto28eB8FqSFZwtrLwB5Kcp70eIoWP/HXqz4wpo8rD8gpsTw== -postcss-discard-empty@^5.1.1: - version "5.1.1" - resolved "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-5.1.1.tgz" - integrity sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A== +postcss-discard-empty@^6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/postcss-discard-empty/-/postcss-discard-empty-6.0.3.tgz#ee39c327219bb70473a066f772621f81435a79d9" + integrity sha512-znyno9cHKQsK6PtxL5D19Fj9uwSzC2mB74cpT66fhgOadEUPyXFkbgwm5tvc3bt3NAy8ltE5MrghxovZRVnOjQ== -postcss-discard-overridden@^5.1.0: - version "5.1.0" - resolved "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-5.1.0.tgz" - integrity sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw== +postcss-discard-overridden@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-6.0.2.tgz#4e9f9c62ecd2df46e8fdb44dc17e189776572e2d" + integrity sha512-j87xzI4LUggC5zND7KdjsI25APtyMuynXZSujByMaav2roV6OZX+8AaCUcZSWqckZpjAjRyFDdpqybgjFO0HJQ== -postcss-discard-unused@^5.1.0: - version "5.1.0" - resolved "https://registry.npmjs.org/postcss-discard-unused/-/postcss-discard-unused-5.1.0.tgz" - integrity sha512-KwLWymI9hbwXmJa0dkrzpRbSJEh0vVUd7r8t0yOGPcfKzyJJxFM8kLyC5Ev9avji6nY95pOp1W6HqIrfT+0VGw== +postcss-discard-unused@^6.0.5: + version "6.0.5" + resolved "https://registry.yarnpkg.com/postcss-discard-unused/-/postcss-discard-unused-6.0.5.tgz#c1b0e8c032c6054c3fbd22aaddba5b248136f338" + integrity sha512-wHalBlRHkaNnNwfC8z+ppX57VhvS+HWgjW508esjdaEYr3Mx7Gnn2xA4R/CKf5+Z9S5qsqC+Uzh4ueENWwCVUA== dependencies: - postcss-selector-parser "^6.0.5" + postcss-selector-parser "^6.0.16" -postcss-import@^14.1.0: - version "14.1.0" - resolved "https://registry.npmjs.org/postcss-import/-/postcss-import-14.1.0.tgz" - integrity sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw== +postcss-import@^15.1.0: + version "15.1.0" + resolved "https://registry.yarnpkg.com/postcss-import/-/postcss-import-15.1.0.tgz#41c64ed8cc0e23735a9698b3249ffdbf704adc70" + integrity sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew== dependencies: postcss-value-parser "^4.0.0" read-cache "^1.0.0" resolve "^1.1.7" -postcss-js@^4.0.0: +postcss-js@^4.0.1: version "4.0.1" - resolved "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz" + resolved "https://registry.yarnpkg.com/postcss-js/-/postcss-js-4.0.1.tgz#61598186f3703bab052f1c4f7d805f3991bee9d2" integrity sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw== dependencies: camelcase-css "^2.0.1" -postcss-load-config@^3.1.4: - version "3.1.4" - resolved "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.4.tgz" - integrity sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg== +postcss-load-config@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-4.0.2.tgz#7159dcf626118d33e299f485d6afe4aff7c4a3e3" + integrity sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ== dependencies: - lilconfig "^2.0.5" - yaml "^1.10.2" + lilconfig "^3.0.0" + yaml "^2.3.4" -postcss-loader@^7.0.0: - version "7.0.1" - resolved "https://registry.npmjs.org/postcss-loader/-/postcss-loader-7.0.1.tgz" - integrity sha512-VRviFEyYlLjctSM93gAZtcJJ/iSkPZ79zWbN/1fSH+NisBByEiVLqpdVDrPLVSi8DX0oJo12kL/GppTBdKVXiQ== +postcss-loader@^7.3.3: + version "7.3.4" + resolved "https://registry.yarnpkg.com/postcss-loader/-/postcss-loader-7.3.4.tgz#aed9b79ce4ed7e9e89e56199d25ad1ec8f606209" + integrity sha512-iW5WTTBSC5BfsBJ9daFMPVrLT36MrNiC6fqOZTTaHjBNX6Pfd5p+hSBqe/fEeNd7pc13QiAyGt7VdGMw4eRC4A== dependencies: - cosmiconfig "^7.0.0" - klona "^2.0.5" - semver "^7.3.7" + cosmiconfig "^8.3.5" + jiti "^1.20.0" + semver "^7.5.4" -postcss-merge-idents@^5.1.1: - version "5.1.1" - resolved "https://registry.npmjs.org/postcss-merge-idents/-/postcss-merge-idents-5.1.1.tgz" - integrity sha512-pCijL1TREiCoog5nQp7wUe+TUonA2tC2sQ54UGeMmryK3UFGIYKqDyjnqd6RcuI4znFn9hWSLNN8xKE/vWcUQw== +postcss-merge-idents@^6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/postcss-merge-idents/-/postcss-merge-idents-6.0.3.tgz#7b9c31c7bc823c94bec50f297f04e3c2b838ea65" + integrity sha512-1oIoAsODUs6IHQZkLQGO15uGEbK3EAl5wi9SS8hs45VgsxQfMnxvt+L+zIr7ifZFIH14cfAeVe2uCTa+SPRa3g== dependencies: - cssnano-utils "^3.1.0" + cssnano-utils "^4.0.2" postcss-value-parser "^4.2.0" -postcss-merge-longhand@^5.1.7: - version "5.1.7" - resolved "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.7.tgz" - integrity sha512-YCI9gZB+PLNskrK0BB3/2OzPnGhPkBEwmwhfYk1ilBHYVAZB7/tkTHFBAnCrvBBOmeYyMYw3DMjT55SyxMBzjQ== +postcss-merge-longhand@^6.0.5: + version "6.0.5" + resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-6.0.5.tgz#ba8a8d473617c34a36abbea8dda2b215750a065a" + integrity sha512-5LOiordeTfi64QhICp07nzzuTDjNSO8g5Ksdibt44d+uvIIAE1oZdRn8y/W5ZtYgRH/lnLDlvi9F8btZcVzu3w== dependencies: postcss-value-parser "^4.2.0" - stylehacks "^5.1.1" + stylehacks "^6.1.1" -postcss-merge-rules@^5.1.3: - version "5.1.3" - resolved "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.1.3.tgz" - integrity sha512-LbLd7uFC00vpOuMvyZop8+vvhnfRGpp2S+IMQKeuOZZapPRY4SMq5ErjQeHbHsjCUgJkRNrlU+LmxsKIqPKQlA== +postcss-merge-rules@^6.1.1: + version "6.1.1" + resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-6.1.1.tgz#7aa539dceddab56019469c0edd7d22b64c3dea9d" + integrity sha512-KOdWF0gju31AQPZiD+2Ar9Qjowz1LTChSjFFbS+e2sFgc4uHOp3ZvVX4sNeTlk0w2O31ecFGgrFzhO0RSWbWwQ== dependencies: - browserslist "^4.21.4" + browserslist "^4.23.0" caniuse-api "^3.0.0" - cssnano-utils "^3.1.0" - postcss-selector-parser "^6.0.5" + cssnano-utils "^4.0.2" + postcss-selector-parser "^6.0.16" -postcss-minify-font-values@^5.1.0: - version "5.1.0" - resolved "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-5.1.0.tgz" - integrity sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA== +postcss-minify-font-values@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/postcss-minify-font-values/-/postcss-minify-font-values-6.1.0.tgz#a0e574c02ee3f299be2846369211f3b957ea4c59" + integrity sha512-gklfI/n+9rTh8nYaSJXlCo3nOKqMNkxuGpTn/Qm0gstL3ywTr9/WRKznE+oy6fvfolH6dF+QM4nCo8yPLdvGJg== dependencies: postcss-value-parser "^4.2.0" -postcss-minify-gradients@^5.1.1: - version "5.1.1" - resolved "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-5.1.1.tgz" - integrity sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw== +postcss-minify-gradients@^6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/postcss-minify-gradients/-/postcss-minify-gradients-6.0.3.tgz#ca3eb55a7bdb48a1e187a55c6377be918743dbd6" + integrity sha512-4KXAHrYlzF0Rr7uc4VrfwDJ2ajrtNEpNEuLxFgwkhFZ56/7gaE4Nr49nLsQDZyUe+ds+kEhf+YAUolJiYXF8+Q== dependencies: - colord "^2.9.1" - cssnano-utils "^3.1.0" + colord "^2.9.3" + cssnano-utils "^4.0.2" postcss-value-parser "^4.2.0" -postcss-minify-params@^5.1.4: - version "5.1.4" - resolved "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.1.4.tgz" - integrity sha512-+mePA3MgdmVmv6g+30rn57USjOGSAyuxUmkfiWpzalZ8aiBkdPYjXWtHuwJGm1v5Ojy0Z0LaSYhHaLJQB0P8Jw== +postcss-minify-params@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-6.1.0.tgz#54551dec77b9a45a29c3cb5953bf7325a399ba08" + integrity sha512-bmSKnDtyyE8ujHQK0RQJDIKhQ20Jq1LYiez54WiaOoBtcSuflfK3Nm596LvbtlFcpipMjgClQGyGr7GAs+H1uA== dependencies: - browserslist "^4.21.4" - cssnano-utils "^3.1.0" + browserslist "^4.23.0" + cssnano-utils "^4.0.2" postcss-value-parser "^4.2.0" -postcss-minify-selectors@^5.2.1: - version "5.2.1" - resolved "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-5.2.1.tgz" - integrity sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg== +postcss-minify-selectors@^6.0.4: + version "6.0.4" + resolved "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-6.0.4.tgz#197f7d72e6dd19eed47916d575d69dc38b396aff" + integrity sha512-L8dZSwNLgK7pjTto9PzWRoMbnLq5vsZSTu8+j1P/2GB8qdtGQfn+K1uSvFgYvgh83cbyxT5m43ZZhUMTJDSClQ== dependencies: - postcss-selector-parser "^6.0.5" + postcss-selector-parser "^6.0.16" -postcss-modules-extract-imports@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz" - integrity sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw== +postcss-modules-extract-imports@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz#b4497cb85a9c0c4b5aabeb759bb25e8d89f15002" + integrity sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q== -postcss-modules-local-by-default@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz" - integrity sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ== +postcss-modules-local-by-default@^4.0.5: + version "4.0.5" + resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.5.tgz#f1b9bd757a8edf4d8556e8d0f4f894260e3df78f" + integrity sha512-6MieY7sIfTK0hYfafw1OMEG+2bg8Q1ocHCpoWLqOKj3JXlKu4G7btkmM/B7lFubYkYWmRSPLZi5chid63ZaZYw== dependencies: icss-utils "^5.0.0" postcss-selector-parser "^6.0.2" postcss-value-parser "^4.1.0" -postcss-modules-scope@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz" - integrity sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg== +postcss-modules-scope@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-3.2.0.tgz#a43d28289a169ce2c15c00c4e64c0858e43457d5" + integrity sha512-oq+g1ssrsZOsx9M96c5w8laRmvEu9C3adDSjI8oTcbfkrTE8hx/zfyobUoWIxaKPO8bt6S62kxpw5GqypEw1QQ== dependencies: postcss-selector-parser "^6.0.4" postcss-modules-values@^4.0.0: version "4.0.0" - resolved "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz" + resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz#d7c5e7e68c3bb3c9b27cbf48ca0bb3ffb4602c9c" integrity sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ== dependencies: icss-utils "^5.0.0" -postcss-nested@6.0.0: - version "6.0.0" - resolved "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.0.tgz" - integrity sha512-0DkamqrPcmkBDsLn+vQDIrtkSbNkv5AD/M322ySo9kqFkCIYklym2xEmWkwo+Y3/qZo34tzEPNUw4y7yMCdv5w== +postcss-nested@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/postcss-nested/-/postcss-nested-6.0.1.tgz#f83dc9846ca16d2f4fa864f16e9d9f7d0961662c" + integrity sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ== dependencies: - postcss-selector-parser "^6.0.10" + postcss-selector-parser "^6.0.11" -postcss-normalize-charset@^5.1.0: - version "5.1.0" - resolved "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz" - integrity sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg== +postcss-normalize-charset@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-6.0.2.tgz#1ec25c435057a8001dac942942a95ffe66f721e1" + integrity sha512-a8N9czmdnrjPHa3DeFlwqst5eaL5W8jYu3EBbTTkI5FHkfMhFZh1EGbku6jhHhIzTA6tquI2P42NtZ59M/H/kQ== -postcss-normalize-display-values@^5.1.0: - version "5.1.0" - resolved "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-5.1.0.tgz" - integrity sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA== +postcss-normalize-display-values@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-display-values/-/postcss-normalize-display-values-6.0.2.tgz#54f02764fed0b288d5363cbb140d6950dbbdd535" + integrity sha512-8H04Mxsb82ON/aAkPeq8kcBbAtI5Q2a64X/mnRRfPXBq7XeogoQvReqxEfc0B4WPq1KimjezNC8flUtC3Qz6jg== dependencies: postcss-value-parser "^4.2.0" -postcss-normalize-positions@^5.1.1: - version "5.1.1" - resolved "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-5.1.1.tgz" - integrity sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg== +postcss-normalize-positions@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-positions/-/postcss-normalize-positions-6.0.2.tgz#e982d284ec878b9b819796266f640852dbbb723a" + integrity sha512-/JFzI441OAB9O7VnLA+RtSNZvQ0NCFZDOtp6QPFo1iIyawyXg0YI3CYM9HBy1WvwCRHnPep/BvI1+dGPKoXx/Q== dependencies: postcss-value-parser "^4.2.0" -postcss-normalize-repeat-style@^5.1.1: - version "5.1.1" - resolved "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.1.1.tgz" - integrity sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g== +postcss-normalize-repeat-style@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-6.0.2.tgz#f8006942fd0617c73f049dd8b6201c3a3040ecf3" + integrity sha512-YdCgsfHkJ2jEXwR4RR3Tm/iOxSfdRt7jplS6XRh9Js9PyCR/aka/FCb6TuHT2U8gQubbm/mPmF6L7FY9d79VwQ== dependencies: postcss-value-parser "^4.2.0" -postcss-normalize-string@^5.1.0: - version "5.1.0" - resolved "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-5.1.0.tgz" - integrity sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w== +postcss-normalize-string@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-string/-/postcss-normalize-string-6.0.2.tgz#e3cc6ad5c95581acd1fc8774b309dd7c06e5e363" + integrity sha512-vQZIivlxlfqqMp4L9PZsFE4YUkWniziKjQWUtsxUiVsSSPelQydwS8Wwcuw0+83ZjPWNTl02oxlIvXsmmG+CiQ== dependencies: postcss-value-parser "^4.2.0" -postcss-normalize-timing-functions@^5.1.0: - version "5.1.0" - resolved "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.1.0.tgz" - integrity sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg== +postcss-normalize-timing-functions@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-6.0.2.tgz#40cb8726cef999de984527cbd9d1db1f3e9062c0" + integrity sha512-a+YrtMox4TBtId/AEwbA03VcJgtyW4dGBizPl7e88cTFULYsprgHWTbfyjSLyHeBcK/Q9JhXkt2ZXiwaVHoMzA== dependencies: postcss-value-parser "^4.2.0" -postcss-normalize-unicode@^5.1.1: - version "5.1.1" - resolved "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.1.tgz" - integrity sha512-qnCL5jzkNUmKVhZoENp1mJiGNPcsJCs1aaRmURmeJGES23Z/ajaln+EPTD+rBeNkSryI+2WTdW+lwcVdOikrpA== +postcss-normalize-unicode@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/postcss-normalize-unicode/-/postcss-normalize-unicode-6.1.0.tgz#aaf8bbd34c306e230777e80f7f12a4b7d27ce06e" + integrity sha512-QVC5TQHsVj33otj8/JD869Ndr5Xcc/+fwRh4HAsFsAeygQQXm+0PySrKbr/8tkDKzW+EVT3QkqZMfFrGiossDg== dependencies: - browserslist "^4.21.4" + browserslist "^4.23.0" postcss-value-parser "^4.2.0" -postcss-normalize-url@^5.1.0: - version "5.1.0" - resolved "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-5.1.0.tgz" - integrity sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew== - dependencies: - normalize-url "^6.0.1" - postcss-value-parser "^4.2.0" - -postcss-normalize-whitespace@^5.1.1: - version "5.1.1" - resolved "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.1.1.tgz" - integrity sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA== +postcss-normalize-url@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-url/-/postcss-normalize-url-6.0.2.tgz#292792386be51a8de9a454cb7b5c58ae22db0f79" + integrity sha512-kVNcWhCeKAzZ8B4pv/DnrU1wNh458zBNp8dh4y5hhxih5RZQ12QWMuQrDgPRw3LRl8mN9vOVfHl7uhvHYMoXsQ== dependencies: postcss-value-parser "^4.2.0" -postcss-ordered-values@^5.1.3: - version "5.1.3" - resolved "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-5.1.3.tgz" - integrity sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ== - dependencies: - cssnano-utils "^3.1.0" - postcss-value-parser "^4.2.0" - -postcss-reduce-idents@^5.2.0: - version "5.2.0" - resolved "https://registry.npmjs.org/postcss-reduce-idents/-/postcss-reduce-idents-5.2.0.tgz" - integrity sha512-BTrLjICoSB6gxbc58D5mdBK8OhXRDqud/zodYfdSi52qvDHdMwk+9kB9xsM8yJThH/sZU5A6QVSmMmaN001gIg== +postcss-normalize-whitespace@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-whitespace/-/postcss-normalize-whitespace-6.0.2.tgz#fbb009e6ebd312f8b2efb225c2fcc7cf32b400cd" + integrity sha512-sXZ2Nj1icbJOKmdjXVT9pnyHQKiSAyuNQHSgRCUgThn2388Y9cGVDR+E9J9iAYbSbLHI+UUwLVl1Wzco/zgv0Q== dependencies: postcss-value-parser "^4.2.0" -postcss-reduce-initial@^5.1.1: - version "5.1.1" - resolved "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-5.1.1.tgz" - integrity sha512-//jeDqWcHPuXGZLoolFrUXBDyuEGbr9S2rMo19bkTIjBQ4PqkaO+oI8wua5BOUxpfi97i3PCoInsiFIEBfkm9w== +postcss-ordered-values@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-6.0.2.tgz#366bb663919707093451ab70c3f99c05672aaae5" + integrity sha512-VRZSOB+JU32RsEAQrO94QPkClGPKJEL/Z9PCBImXMhIeK5KAYo6slP/hBYlLgrCjFxyqvn5VC81tycFEDBLG1Q== dependencies: - browserslist "^4.21.4" + cssnano-utils "^4.0.2" + postcss-value-parser "^4.2.0" + +postcss-reduce-idents@^6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/postcss-reduce-idents/-/postcss-reduce-idents-6.0.3.tgz#b0d9c84316d2a547714ebab523ec7d13704cd486" + integrity sha512-G3yCqZDpsNPoQgbDUy3T0E6hqOQ5xigUtBQyrmq3tn2GxlyiL0yyl7H+T8ulQR6kOcHJ9t7/9H4/R2tv8tJbMA== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-reduce-initial@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-6.1.0.tgz#4401297d8e35cb6e92c8e9586963e267105586ba" + integrity sha512-RarLgBK/CrL1qZags04oKbVbrrVK2wcxhvta3GCxrZO4zveibqbRPmm2VI8sSgCXwoUHEliRSbOfpR0b/VIoiw== + dependencies: + browserslist "^4.23.0" caniuse-api "^3.0.0" -postcss-reduce-transforms@^5.1.0: - version "5.1.0" - resolved "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-5.1.0.tgz" - integrity sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ== +postcss-reduce-transforms@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/postcss-reduce-transforms/-/postcss-reduce-transforms-6.0.2.tgz#6fa2c586bdc091a7373caeee4be75a0f3e12965d" + integrity sha512-sB+Ya++3Xj1WaT9+5LOOdirAxP7dJZms3GRcYheSPi1PiTMigsxHAdkrbItHxwYHr4kt1zL7mmcHstgMYT+aiA== dependencies: postcss-value-parser "^4.2.0" -postcss-selector-parser@^6.0.10, postcss-selector-parser@^6.0.11, postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4, postcss-selector-parser@^6.0.5, postcss-selector-parser@^6.0.9: - version "6.0.11" - resolved "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.11.tgz" - integrity sha512-zbARubNdogI9j7WY4nQJBiNqQf3sLS3wCP4WfOidu+p28LofJqDH1tcXypGrcmMHhDk2t9wGhCsYe/+szLTy1g== +postcss-selector-parser@^6.0.11, postcss-selector-parser@^6.0.16, postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4: + version "6.1.0" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.1.0.tgz#49694cb4e7c649299fea510a29fa6577104bcf53" + integrity sha512-UMz42UD0UY0EApS0ZL9o1XnLhSTtvvvLe5Dc2H2O56fvRZi+KulDyf5ctDhhtYJBGKStV2FL1fy6253cmLgqVQ== dependencies: cssesc "^3.0.0" util-deprecate "^1.0.2" -postcss-sort-media-queries@^4.2.1: - version "4.2.1" - resolved "https://registry.npmjs.org/postcss-sort-media-queries/-/postcss-sort-media-queries-4.2.1.tgz" - integrity sha512-9VYekQalFZ3sdgcTjXMa0dDjsfBVHXlraYJEMiOJ/2iMmI2JGCMavP16z3kWOaRu8NSaJCTgVpB/IVpH5yT9YQ== +postcss-sort-media-queries@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/postcss-sort-media-queries/-/postcss-sort-media-queries-5.2.0.tgz#4556b3f982ef27d3bac526b99b6c0d3359a6cf97" + integrity sha512-AZ5fDMLD8SldlAYlvi8NIqo0+Z8xnXU2ia0jxmuhxAU+Lqt9K+AlmLNJ/zWEnE9x+Zx3qL3+1K20ATgNOr3fAA== dependencies: - sort-css-media-queries "2.0.4" + sort-css-media-queries "2.2.0" -postcss-svgo@^5.1.0: - version "5.1.0" - resolved "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-5.1.0.tgz" - integrity sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA== +postcss-svgo@^6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-6.0.3.tgz#1d6e180d6df1fa8a3b30b729aaa9161e94f04eaa" + integrity sha512-dlrahRmxP22bX6iKEjOM+c8/1p+81asjKT+V5lrgOH944ryx/OHpclnIbGsKVd3uWOXFLYJwCVf0eEkJGvO96g== dependencies: postcss-value-parser "^4.2.0" - svgo "^2.7.0" + svgo "^3.2.0" -postcss-unique-selectors@^5.1.1: - version "5.1.1" - resolved "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-5.1.1.tgz" - integrity sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA== +postcss-unique-selectors@^6.0.4: + version "6.0.4" + resolved "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-6.0.4.tgz#983ab308896b4bf3f2baaf2336e14e52c11a2088" + integrity sha512-K38OCaIrO8+PzpArzkLKB42dSARtC2tmG6PvD4b1o1Q2E9Os8jzfWFfSy/rixsHwohtsDdFtAWGjFVFUdwYaMg== dependencies: - postcss-selector-parser "^6.0.5" + postcss-selector-parser "^6.0.16" postcss-value-parser@^4.0.0, postcss-value-parser@^4.1.0, postcss-value-parser@^4.2.0: version "4.2.0" - resolved "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz" + resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== -postcss-zindex@^5.1.0: - version "5.1.0" - resolved "https://registry.npmjs.org/postcss-zindex/-/postcss-zindex-5.1.0.tgz" - integrity sha512-fgFMf0OtVSBR1va1JNHYgMxYk73yhn/qb4uQDq1DLGYolz8gHCyr/sesEuGUaYs58E3ZJRcpoGuPVoB7Meiq9A== +postcss-zindex@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/postcss-zindex/-/postcss-zindex-6.0.2.tgz#e498304b83a8b165755f53db40e2ea65a99b56e1" + integrity sha512-5BxW9l1evPB/4ZIc+2GobEBoKC+h8gPGCMi+jxsYvd2x0mjq7wazk6DrP71pStqxE9Foxh5TVnonbWpFZzXaYg== -postcss@^8.0.9, postcss@^8.3.11, postcss@^8.4.14, postcss@^8.4.17, postcss@^8.4.31, postcss@^8.4.7: - version "8.4.31" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.31.tgz#92b451050a9f914da6755af352bdc0192508656d" - integrity sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ== +postcss@^8.4.21, postcss@^8.4.23, postcss@^8.4.24, postcss@^8.4.26, postcss@^8.4.31, postcss@^8.4.33, postcss@^8.4.38: + version "8.4.38" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.38.tgz#b387d533baf2054288e337066d81c6bee9db9e0e" + integrity sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A== dependencies: - nanoid "^3.3.6" + nanoid "^3.3.7" picocolors "^1.0.0" - source-map-js "^1.0.2" + source-map-js "^1.2.0" postman-url-encoder@3.0.5: version "3.0.5" - resolved "https://registry.npmjs.org/postman-url-encoder/-/postman-url-encoder-3.0.5.tgz" + resolved "https://registry.yarnpkg.com/postman-url-encoder/-/postman-url-encoder-3.0.5.tgz#af2efee3bb7644e2b059d8a78bc8070fae0467a5" integrity sha512-jOrdVvzUXBC7C+9gkIkpDJ3HIxOHTIqjpQ4C1EMt1ZGeMvSEpbFCKq23DEfgsj46vMnDgyQf+1ZLp2Wm+bKSsA== dependencies: punycode "^2.1.1" -prepend-http@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz" - integrity sha512-ravE6m9Atw9Z/jjttRUZ+clIXogdghyZAuWJ3qEzjT+jI/dL1ifAqhZeC5VHzQp1MSt1+jxKkFNemj/iO7tVUA== - pretty-error@^4.0.0: version "4.0.0" - resolved "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz" + resolved "https://registry.yarnpkg.com/pretty-error/-/pretty-error-4.0.0.tgz#90a703f46dd7234adb46d0f84823e9d1cb8f10d6" integrity sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw== dependencies: lodash "^4.17.20" @@ -8209,39 +9169,40 @@ pretty-error@^4.0.0: pretty-time@^1.1.0: version "1.1.0" - resolved "https://registry.npmjs.org/pretty-time/-/pretty-time-1.1.0.tgz" + resolved "https://registry.yarnpkg.com/pretty-time/-/pretty-time-1.1.0.tgz#ffb7429afabb8535c346a34e41873adf3d74dd0e" integrity sha512-28iF6xPQrP8Oa6uxE6a1biz+lWeTOAPKggvjB8HAs6nVMKZwf5bG++632Dx614hIWgUPkgivRfG+a8uAXGTIbA== -prism-react-renderer@^1.3.1, prism-react-renderer@^1.3.5: - version "1.3.5" - resolved "https://registry.npmjs.org/prism-react-renderer/-/prism-react-renderer-1.3.5.tgz" - integrity sha512-IJ+MSwBWKG+SM3b2SUfdrhC+gu01QkV2KmRQgREThBfSQRoufqRfxfHUxpG1WcaFjP+kojcFyO9Qqtpgt3qLCg== +prism-react-renderer@^2.0.6, prism-react-renderer@^2.1.0, prism-react-renderer@^2.3.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/prism-react-renderer/-/prism-react-renderer-2.3.1.tgz#e59e5450052ede17488f6bc85de1553f584ff8d5" + integrity sha512-Rdf+HzBLR7KYjzpJ1rSoxT9ioO85nZngQEoFIhL07XhtJHlCU3SOz0GJ6+qvMyQe0Se+BV3qpe6Yd/NmQF5Juw== + dependencies: + "@types/prismjs" "^1.26.0" + clsx "^2.0.0" -prismjs@^1.28.0: - version "1.28.0" - resolved "https://registry.npmjs.org/prismjs/-/prismjs-1.28.0.tgz" - integrity sha512-8aaXdYvl1F7iC7Xm1spqSaY/OJBpYW3v+KJ+F17iYxvdc8sfjW194COK5wVhMZX45tGteiBQgdvD/nhxcRwylw== +prismjs@^1.29.0: + version "1.29.0" + resolved "https://registry.yarnpkg.com/prismjs/-/prismjs-1.29.0.tgz#f113555a8fa9b57c35e637bba27509dcf802dd12" + integrity sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q== process-nextick-args@~2.0.0: version "2.0.1" - resolved "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== process@^0.11.1, process@^0.11.10: version "0.11.10" - resolved "https://registry.npmjs.org/process/-/process-0.11.10.tgz" + resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" integrity sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A== -promise@^7.1.1: - version "7.3.1" - resolved "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz" - integrity sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg== - dependencies: - asap "~2.0.3" +progress@2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" + integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== prompts@^2.4.2: version "2.4.2" - resolved "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz" + resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.2.tgz#7b57e73b3a48029ad10ebd44f74b01722a4cb069" integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q== dependencies: kleur "^3.0.3" @@ -8249,36 +9210,39 @@ prompts@^2.4.2: prop-types@^15.0.0, prop-types@^15.6.2, prop-types@^15.7.2, prop-types@^15.8.1: version "15.8.1" - resolved "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz" + resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== dependencies: loose-envify "^1.4.0" object-assign "^4.1.1" react-is "^16.13.1" -property-information@^5.0.0, property-information@^5.3.0: - version "5.6.0" - resolved "https://registry.npmjs.org/property-information/-/property-information-5.6.0.tgz" - integrity sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA== - dependencies: - xtend "^4.0.0" - property-information@^6.0.0: - version "6.2.0" - resolved "https://registry.npmjs.org/property-information/-/property-information-6.2.0.tgz" - integrity sha512-kma4U7AFCTwpqq5twzC1YVIDXSqg6qQK6JN0smOw8fgRy1OkMi0CYSzFmsy6dnqSenamAtj0CyXMUJ1Mf6oROg== + version "6.5.0" + resolved "https://registry.yarnpkg.com/property-information/-/property-information-6.5.0.tgz#6212fbb52ba757e92ef4fb9d657563b933b7ffec" + integrity sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig== + +proto-list@~1.2.1: + version "1.2.4" + resolved "https://registry.yarnpkg.com/proto-list/-/proto-list-1.2.4.tgz#212d5bfe1318306a420f6402b8e26ff39647a849" + integrity sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA== proxy-addr@~2.0.7: version "2.0.7" - resolved "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz" + resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== dependencies: forwarded "0.2.0" ipaddr.js "1.9.1" +proxy-from-env@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" + integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== + public-encrypt@^4.0.0: version "4.0.3" - resolved "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz" + resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.3.tgz#4fcc9d77a07e48ba7527e7cbe0de33d0701331e0" integrity sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q== dependencies: bn.js "^4.1.0" @@ -8290,90 +9254,101 @@ public-encrypt@^4.0.0: pump@^3.0.0: version "3.0.0" - resolved "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz" + resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== dependencies: end-of-stream "^1.1.0" once "^1.3.1" -punycode@1.3.2: - version "1.3.2" - resolved "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz" - integrity sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw== - -punycode@^1.3.2: +punycode@^1.3.2, punycode@^1.4.1: version "1.4.1" - resolved "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" integrity sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ== punycode@^2.1.0, punycode@^2.1.1: - version "2.1.1" - resolved "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz" - integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== + version "2.3.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" + integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== -pupa@^2.1.1: - version "2.1.1" - resolved "https://registry.npmjs.org/pupa/-/pupa-2.1.1.tgz" - integrity sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A== +pupa@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/pupa/-/pupa-3.1.0.tgz#f15610274376bbcc70c9a3aa8b505ea23f41c579" + integrity sha512-FLpr4flz5xZTSJxSeaheeMKN/EDzMdK7b8PTOC6a5PYFKTucWbdqjgqaEyH0shFiSJrVB1+Qqi4Tk19ccU6Aug== dependencies: - escape-goat "^2.0.0" + escape-goat "^4.0.0" -pure-color@^1.2.0: - version "1.3.0" - resolved "https://registry.npmjs.org/pure-color/-/pure-color-1.3.0.tgz" - integrity sha512-QFADYnsVoBMw1srW7OVKEYjG+MbIa49s54w1MA1EDY6r2r/sTcKKYqRX1f4GYvnXP7eN/Pe9HFcX+hwzmrXRHA== +puppeteer-core@18.2.1: + version "18.2.1" + resolved "https://registry.yarnpkg.com/puppeteer-core/-/puppeteer-core-18.2.1.tgz#9b7827bb2bf478bb615e2c21425e4659555dc1fe" + integrity sha512-MRtTAZfQTluz3U2oU/X2VqVWPcR1+94nbA2V6ZrSZRVEwLqZ8eclZ551qGFQD/vD2PYqHJwWOW/fpC721uznVw== + dependencies: + cross-fetch "3.1.5" + debug "4.3.4" + devtools-protocol "0.0.1045489" + extract-zip "2.0.1" + https-proxy-agent "5.0.1" + proxy-from-env "1.1.0" + rimraf "3.0.2" + tar-fs "2.1.1" + unbzip2-stream "1.4.3" + ws "8.9.0" -qs@6.10.3, qs@^6.10.3: - version "6.10.3" - resolved "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz" - integrity sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ== +puppeteer@^18.0.0: + version "18.2.1" + resolved "https://registry.yarnpkg.com/puppeteer/-/puppeteer-18.2.1.tgz#08967cd423efe511ee4c6e3a5c882ffaf2e6bbf3" + integrity sha512-7+UhmYa7wxPh2oMRwA++k8UGVDxh3YdWFB52r9C3tM81T6BU7cuusUSxImz0GEYSOYUKk/YzIhkQ6+vc0gHbxQ== + dependencies: + https-proxy-agent "5.0.1" + progress "2.0.3" + proxy-from-env "1.1.0" + puppeteer-core "18.2.1" + +qs@6.11.0: + version "6.11.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.0.tgz#fd0d963446f7a65e1367e01abd85429453f0c37a" + integrity sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q== dependencies: side-channel "^1.0.4" -qs@^6.11.0: - version "6.11.1" - resolved "https://registry.npmjs.org/qs/-/qs-6.11.1.tgz" - integrity sha512-0wsrzgTz/kAVIeuxSjnpGC56rzYtr6JT/2BwEvMaPhFIoYa1aGO8LbzuU1R0uUYQkLpWBTOj0l/CLAJB64J6nQ== +qs@^6.11.2: + version "6.12.1" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.12.1.tgz#39422111ca7cbdb70425541cba20c7d7b216599a" + integrity sha512-zWmv4RSuB9r2mYQw3zxQuHWeU+42aKi1wWig/j4ele4ygELZ7PEO6MM7rim9oAQH2A5MWfsAVf/jPvTPgCbvUQ== dependencies: - side-channel "^1.0.4" + side-channel "^1.0.6" querystring-es3@^0.2.1: version "0.2.1" - resolved "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz" + resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73" integrity sha512-773xhDQnZBMFobEiztv8LIl70ch5MSF/jUQVlhwFyBILqq96anmoctVIYz+ZRp0qbCKATTn6ev02M3r7Ga5vqA== -querystring@0.2.0: - version "0.2.0" - resolved "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz" - integrity sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g== - queue-microtask@^1.2.2: version "1.2.3" - resolved "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz" + resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== queue@6.0.2: version "6.0.2" - resolved "https://registry.npmjs.org/queue/-/queue-6.0.2.tgz" + resolved "https://registry.yarnpkg.com/queue/-/queue-6.0.2.tgz#b91525283e2315c7553d2efa18d83e76432fed65" integrity sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA== dependencies: inherits "~2.0.3" quick-lru@^5.1.1: version "5.1.1" - resolved "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz" + resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-5.1.1.tgz#366493e6b3e42a3a6885e2e99d18f80fb7a8c932" integrity sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA== randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5, randombytes@^2.1.0: version "2.1.0" - resolved "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz" + resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== dependencies: safe-buffer "^5.1.0" randomfill@^1.0.3: version "1.0.4" - resolved "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz" + resolved "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.4.tgz#c92196fc86ab42be983f1bf31778224931d61458" integrity sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw== dependencies: randombytes "^2.0.5" @@ -8381,18 +9356,18 @@ randomfill@^1.0.3: range-parser@1.2.0: version "1.2.0" - resolved "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz" + resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e" integrity sha512-kA5WQoNVo4t9lNx2kQNFCxKeBl5IbbSNBl1M/tLkw9WCn+hxNBAW5Qh8gdhs63CJnhjJ2zQWFoqPJP2sK1AV5A== range-parser@^1.2.1, range-parser@~1.2.1: version "1.2.1" - resolved "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz" + resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== -raw-body@2.5.1: - version "2.5.1" - resolved "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz" - integrity sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig== +raw-body@2.5.2: + version "2.5.2" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.2.tgz#99febd83b90e08975087e8f1f9419a149366b68a" + integrity sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA== dependencies: bytes "3.1.2" http-errors "2.0.0" @@ -8401,15 +9376,15 @@ raw-body@2.5.1: raw-loader@^4.0.2: version "4.0.2" - resolved "https://registry.npmjs.org/raw-loader/-/raw-loader-4.0.2.tgz" + resolved "https://registry.yarnpkg.com/raw-loader/-/raw-loader-4.0.2.tgz#1aac6b7d1ad1501e66efdac1522c73e59a584eb6" integrity sha512-ZnScIV3ag9A4wPX/ZayxL/jZH+euYb6FcUinPcgiQW0+UBtEv0O6Q3lGd3cqJ+GHH+rksEv3Pj99oxJ3u3VIKA== dependencies: loader-utils "^2.0.0" schema-utils "^3.0.0" -rc@1.2.8, rc@^1.2.8: +rc@1.2.8: version "1.2.8" - resolved "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz" + resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== dependencies: deep-extend "^0.6.0" @@ -8417,19 +9392,9 @@ rc@1.2.8, rc@^1.2.8: minimist "^1.2.0" strip-json-comments "~2.0.1" -react-base16-styling@^0.6.0: - version "0.6.0" - resolved "https://registry.npmjs.org/react-base16-styling/-/react-base16-styling-0.6.0.tgz" - integrity sha512-yvh/7CArceR/jNATXOKDlvTnPKPmGZz7zsenQ3jUwLzHkNUR0CvY3yGYJbWJ/nnxsL8Sgmt5cO3/SILVuPO6TQ== - dependencies: - base16 "^1.0.0" - lodash.curry "^4.0.1" - lodash.flow "^3.3.0" - pure-color "^1.2.0" - react-copy-to-clipboard@^5.1.0: version "5.1.0" - resolved "https://registry.npmjs.org/react-copy-to-clipboard/-/react-copy-to-clipboard-5.1.0.tgz" + resolved "https://registry.yarnpkg.com/react-copy-to-clipboard/-/react-copy-to-clipboard-5.1.0.tgz#09aae5ec4c62750ccb2e6421a58725eabc41255c" integrity sha512-k61RsNgAayIJNoy9yDsYzDe/yAZAzEbEgcz3DZMhF686LEyukcE1hzurxe85JandPUG+yTfGVFzuEw3xt8WP/A== dependencies: copy-to-clipboard "^3.3.1" @@ -8437,7 +9402,7 @@ react-copy-to-clipboard@^5.1.0: react-dev-utils@^12.0.1: version "12.0.1" - resolved "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-12.0.1.tgz" + resolved "https://registry.yarnpkg.com/react-dev-utils/-/react-dev-utils-12.0.1.tgz#ba92edb4a1f379bd46ccd6bcd4e7bc398df33e73" integrity sha512-84Ivxmr17KjUupyqzFode6xKhjwuEJDROWKJy/BthkL7Wn6NJ8h4WE6k/exAv6ImS+0oZLRRW5j/aINMHyeGeQ== dependencies: "@babel/code-frame" "^7.16.0" @@ -8465,33 +9430,36 @@ react-dev-utils@^12.0.1: strip-ansi "^6.0.1" text-table "^0.2.0" -react-dom@17.0.2: - version "17.0.2" - resolved "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz" - integrity sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA== +react-dom@^18.2.0: + version "18.3.1" + resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-18.3.1.tgz#c2265d79511b57d479b3dd3fdfa51536494c5cb4" + integrity sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw== dependencies: loose-envify "^1.1.0" - object-assign "^4.1.1" - scheduler "^0.20.2" + scheduler "^0.23.2" react-error-overlay@^6.0.11: version "6.0.11" - resolved "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.11.tgz" + resolved "https://registry.yarnpkg.com/react-error-overlay/-/react-error-overlay-6.0.11.tgz#92835de5841c5cf08ba00ddd2d677b6d17ff9adb" integrity sha512-/6UZ2qgEyH2aqzYZgQPxEnz33NJ2gNsnHA2o5+o4wW9bLM/JYQitNP9xPhsXwC08hMMovfGe/8retsdDsczPRg== -react-fast-compare@^3.0.1: +react-fast-compare@^3.0.1, react-fast-compare@^3.2.0, react-fast-compare@^3.2.2: version "3.2.2" resolved "https://registry.yarnpkg.com/react-fast-compare/-/react-fast-compare-3.2.2.tgz#929a97a532304ce9fee4bcae44234f1ce2c21d49" integrity sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ== -react-fast-compare@^3.2.0: - version "3.2.0" - resolved "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.0.tgz" - integrity sha512-rtGImPZ0YyLrscKI9xTpV8psd6I8VAtjKCzQDlzyDvqJA8XOW78TXYQwNRNd8g8JZnDu8q9Fu/1v4HPAVwVdHA== +react-helmet-async@*: + version "2.0.5" + resolved "https://registry.yarnpkg.com/react-helmet-async/-/react-helmet-async-2.0.5.tgz#cfc70cd7bb32df7883a8ed55502a1513747223ec" + integrity sha512-rYUYHeus+i27MvFE+Jaa4WsyBKGkL6qVgbJvSBoX8mbsWoABJXdEO0bZyi0F6i+4f0NuIb8AvqPMj3iXFHkMwg== + dependencies: + invariant "^2.2.4" + react-fast-compare "^3.2.2" + shallowequal "^1.1.0" -react-helmet-async@*, react-helmet-async@^1.3.0: +react-helmet-async@^1.3.0: version "1.3.0" - resolved "https://registry.npmjs.org/react-helmet-async/-/react-helmet-async-1.3.0.tgz" + resolved "https://registry.yarnpkg.com/react-helmet-async/-/react-helmet-async-1.3.0.tgz#7bd5bf8c5c69ea9f02f6083f14ce33ef545c222e" integrity sha512-9jZ57/dAn9t3q6hneQS0wukqC2ENOBgMNVEhb/ZG9ZSxUetzVIw4iAmEU38IaVg3QGYauQPhSeUTuIUtFglWpg== dependencies: "@babel/runtime" "^7.12.5" @@ -8500,69 +9468,68 @@ react-helmet-async@*, react-helmet-async@^1.3.0: react-fast-compare "^3.2.0" shallowequal "^1.1.0" +react-hook-form@^7.43.8: + version "7.52.0" + resolved "https://registry.yarnpkg.com/react-hook-form/-/react-hook-form-7.52.0.tgz#e52b33043e283719586b9dd80f6d51b68dd3999c" + integrity sha512-mJX506Xc6mirzLsmXUJyqlAI3Kj9Ph2RhplYhUVffeOQSnubK2uVqBFOBJmvKikvbFV91pxVXmDiR+QMF19x6A== + react-is@^16.13.1, react-is@^16.6.0, react-is@^16.7.0: version "16.13.1" - resolved "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== react-is@^17.0.2: version "17.0.2" - resolved "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0" integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== react-is@^18.0.0: - version "18.2.0" - resolved "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz" - integrity sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w== + version "18.3.1" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.3.1.tgz#e83557dc12eae63a99e003a46388b1dcbb44db7e" + integrity sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg== -react-json-view@^1.21.3: - version "1.21.3" - resolved "https://registry.npmjs.org/react-json-view/-/react-json-view-1.21.3.tgz" - integrity sha512-13p8IREj9/x/Ye4WI/JpjhoIwuzEgUAtgJZNBJckfzJt1qyh24BdTm6UQNGnyTq9dapQdrqvquZTo3dz1X6Cjw== - dependencies: - flux "^4.0.1" - react-base16-styling "^0.6.0" - react-lifecycles-compat "^3.0.4" - react-textarea-autosize "^8.3.2" +react-json-view-lite@^1.2.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/react-json-view-lite/-/react-json-view-lite-1.4.0.tgz#0ff493245f4550abe5e1f1836f170fa70bb95914" + integrity sha512-wh6F6uJyYAmQ4fK0e8dSQMEWuvTs2Wr3el3sLD9bambX1+pSWUVXIz1RFaoy3TI1mZ0FqdpKq9YgbgTTgyrmXA== -react-lifecycles-compat@^3.0.0, react-lifecycles-compat@^3.0.4: +react-lifecycles-compat@^3.0.0: version "3.0.4" - resolved "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz" + resolved "https://registry.yarnpkg.com/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz#4f1a273afdfc8f3488a8c516bfda78f872352362" integrity sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA== -react-live@^3.1.1: - version "3.2.0" - resolved "https://registry.npmjs.org/react-live/-/react-live-3.2.0.tgz" - integrity sha512-tHkft6spWgNOlW21XUQKqoFDP9ZVhrEUBD80sYwL1ykOovj9DN2z0GXW3d4G7gAphcUXCy+BLfe1S/IpdE5AAQ== +react-live@^4.0.0: + version "4.1.6" + resolved "https://registry.yarnpkg.com/react-live/-/react-live-4.1.6.tgz#6d9b7d381bd2b359ca859767501135112b6bab33" + integrity sha512-2oq3MADi3rupqZcdoHMrV9p+Eg/92BDds278ZuoOz8d68qw6ct0xZxX89MRxeChrnFHy1XPr8BVknDJNJNdvVw== dependencies: - prism-react-renderer "^1.3.1" - sucrase "^3.21.0" + prism-react-renderer "^2.0.6" + sucrase "^3.31.0" use-editable "^2.3.3" react-loadable-ssr-addon-v5-slorber@^1.0.1: version "1.0.1" - resolved "https://registry.npmjs.org/react-loadable-ssr-addon-v5-slorber/-/react-loadable-ssr-addon-v5-slorber-1.0.1.tgz" + resolved "https://registry.yarnpkg.com/react-loadable-ssr-addon-v5-slorber/-/react-loadable-ssr-addon-v5-slorber-1.0.1.tgz#2cdc91e8a744ffdf9e3556caabeb6e4278689883" integrity sha512-lq3Lyw1lGku8zUEJPDxsNm1AfYHBrO9Y1+olAYwpUJ2IGFBskM0DMKok97A6LWUpHm+o7IvQBOWu9MLenp9Z+A== dependencies: "@babel/runtime" "^7.10.3" -"react-loadable@npm:@docusaurus/react-loadable@5.5.2": - version "5.5.2" - resolved "https://registry.npmjs.org/@docusaurus/react-loadable/-/react-loadable-5.5.2.tgz" - integrity sha512-A3dYjdBGuy0IGT+wyLIGIKLRE+sAk1iNk0f1HjNDysO7u8lhL4N3VEm+FAubmJbAztn94F7MxBTPmnixbiyFdQ== +"react-loadable@npm:@docusaurus/react-loadable@6.0.0": + version "6.0.0" + resolved "https://registry.yarnpkg.com/@docusaurus/react-loadable/-/react-loadable-6.0.0.tgz#de6c7f73c96542bd70786b8e522d535d69069dc4" + integrity sha512-YMMxTUQV/QFSnbgrP3tjDzLHRg7vsbMn8e9HAa8o/1iXoiomo48b7sk/kkmWEuWNDPJVlKSJRB6Y2fHqdJk+SQ== dependencies: "@types/react" "*" - prop-types "^15.6.2" react-magic-dropzone@^1.0.1: version "1.0.1" - resolved "https://registry.npmjs.org/react-magic-dropzone/-/react-magic-dropzone-1.0.1.tgz" + resolved "https://registry.yarnpkg.com/react-magic-dropzone/-/react-magic-dropzone-1.0.1.tgz#bfd25b77b57e7a04aaef0a28910563b707ee54df" integrity sha512-0BIROPARmXHpk4AS3eWBOsewxoM5ndk2psYP/JmbCq8tz3uR2LIV1XiroZ9PKrmDRMctpW+TvsBCtWasuS8vFA== react-markdown@^8.0.1: - version "8.0.6" - resolved "https://registry.npmjs.org/react-markdown/-/react-markdown-8.0.6.tgz" - integrity sha512-KgPWsYgHuftdx510wwIzpwf+5js/iHqBR+fzxefv8Khk3mFbnioF1bmL2idHN3ler0LMQmICKeDrWnZrX9mtbQ== + version "8.0.7" + resolved "https://registry.yarnpkg.com/react-markdown/-/react-markdown-8.0.7.tgz#c8dbd1b9ba5f1c5e7e5f2a44de465a3caafdf89b" + integrity sha512-bvWbzG4MtOU62XqBx3Xx+zB2raaFFsq4mYiAzfjXJMEz2sixgeAfraA3tvzULF02ZdOMUOKTBFFaZJDDrq+BJQ== dependencies: "@types/hast" "^2.0.0" "@types/prop-types" "^15.0.0" @@ -8582,7 +9549,7 @@ react-markdown@^8.0.1: react-modal@^3.15.1: version "3.16.1" - resolved "https://registry.npmjs.org/react-modal/-/react-modal-3.16.1.tgz" + resolved "https://registry.yarnpkg.com/react-modal/-/react-modal-3.16.1.tgz#34018528fc206561b1a5467fc3beeaddafb39b2b" integrity sha512-VStHgI3BVcGo7OXczvnJN7yT2TWHJPDXZWyI/a0ssFNhGZWsPmB8cF0z33ewDXq4VfYMO1vXgiv/g8Nj9NDyWg== dependencies: exenv "^1.2.0" @@ -8591,9 +9558,9 @@ react-modal@^3.15.1: warning "^4.0.3" react-player@^2.15.1: - version "2.15.1" - resolved "https://registry.yarnpkg.com/react-player/-/react-player-2.15.1.tgz#a5905126a6c5ba2667391a0d72da9f3a1ab57d54" - integrity sha512-ni1XFuYZuhIKKdeFII+KRLmIPcvCYlyXvtSMhNOgssdfnSovmakBtBTW2bxowPvmpKy5BTR4jC4CF79ucgHT+g== + version "2.16.0" + resolved "https://registry.yarnpkg.com/react-player/-/react-player-2.16.0.tgz#89070700b03f5a5ded9f0b3165d4717390796481" + integrity sha512-mAIPHfioD7yxO0GNYVFD1303QFtI3lyyQZLY229UEAp/a10cSW+hPcakg0Keq8uWJxT2OiT/4Gt+Lc9bD6bJmQ== dependencies: deepmerge "^4.0.0" load-script "^1.0.0" @@ -8603,7 +9570,7 @@ react-player@^2.15.1: react-redux@^7.2.0: version "7.2.9" - resolved "https://registry.npmjs.org/react-redux/-/react-redux-7.2.9.tgz" + resolved "https://registry.yarnpkg.com/react-redux/-/react-redux-7.2.9.tgz#09488fbb9416a4efe3735b7235055442b042481d" integrity sha512-Gx4L3uM182jEEayZfRbI/G11ZpYdNAnBs70lFVMNdHJI76XYtR+7m0MN+eAs7UHBPhWXcnFPaS+9owSCJQHNpQ== dependencies: "@babel/runtime" "^7.15.4" @@ -8615,14 +9582,14 @@ react-redux@^7.2.0: react-router-config@^5.1.1: version "5.1.1" - resolved "https://registry.npmjs.org/react-router-config/-/react-router-config-5.1.1.tgz" + resolved "https://registry.yarnpkg.com/react-router-config/-/react-router-config-5.1.1.tgz#0f4263d1a80c6b2dc7b9c1902c9526478194a988" integrity sha512-DuanZjaD8mQp1ppHjgnnUnyOlqYXZVjnov/JzFhjLEwd3Z4dYjMSnqrEzzGThH47vpCOqPPwJM2FtthLeJ8Pbg== dependencies: "@babel/runtime" "^7.1.2" -react-router-dom@^5.3.3: +react-router-dom@^5.3.4: version "5.3.4" - resolved "https://registry.npmjs.org/react-router-dom/-/react-router-dom-5.3.4.tgz" + resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-5.3.4.tgz#2ed62ffd88cae6db134445f4a0c0ae8b91d2e5e6" integrity sha512-m4EqFMHv/Ih4kpcBCONHbkT68KoAeHN4p3lAGoNryfHi0dMy0kCzEZakiKRsvg5wHZ/JLrLW8o8KomWiz/qbYQ== dependencies: "@babel/runtime" "^7.12.13" @@ -8633,9 +9600,9 @@ react-router-dom@^5.3.3: tiny-invariant "^1.0.2" tiny-warning "^1.0.0" -react-router@5.3.4, react-router@^5.3.3: +react-router@5.3.4, react-router@^5.3.4: version "5.3.4" - resolved "https://registry.npmjs.org/react-router/-/react-router-5.3.4.tgz" + resolved "https://registry.yarnpkg.com/react-router/-/react-router-5.3.4.tgz#8ca252d70fcc37841e31473c7a151cf777887bb5" integrity sha512-Ys9K+ppnJah3QuaRiLxk+jDWOR1MekYQrlytiXxC1RyfbdsZkS5pvKAzCCr031xHixZwpnsYNT5xysdFHQaYsA== dependencies: "@babel/runtime" "^7.12.13" @@ -8648,34 +9615,24 @@ react-router@5.3.4, react-router@^5.3.3: tiny-invariant "^1.0.2" tiny-warning "^1.0.0" -react-textarea-autosize@^8.3.2: - version "8.5.2" - resolved "https://registry.npmjs.org/react-textarea-autosize/-/react-textarea-autosize-8.5.2.tgz" - integrity sha512-uOkyjkEl0ByEK21eCJMHDGBAAd/BoFQBawYK5XItjAmCTeSbjxghd8qnt7nzsLYzidjnoObu6M26xts0YGKsGg== - dependencies: - "@babel/runtime" "^7.20.13" - use-composed-ref "^1.3.0" - use-latest "^1.2.1" - -react@17.0.2: - version "17.0.2" - resolved "https://registry.npmjs.org/react/-/react-17.0.2.tgz" - integrity sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA== +react@^18.2.0: + version "18.3.1" + resolved "https://registry.yarnpkg.com/react/-/react-18.3.1.tgz#49ab892009c53933625bd16b2533fc754cab2891" + integrity sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ== dependencies: loose-envify "^1.1.0" - object-assign "^4.1.1" read-cache@^1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz" + resolved "https://registry.yarnpkg.com/read-cache/-/read-cache-1.0.0.tgz#e664ef31161166c9751cdbe8dbcf86b5fb58f774" integrity sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA== dependencies: pify "^2.3.0" -readable-stream@^2.0.1: - version "2.3.7" - resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz" - integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== +readable-stream@^2.0.1, readable-stream@^2.3.8: + version "2.3.8" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b" + integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA== dependencies: core-util-is "~1.0.0" inherits "~2.0.3" @@ -8685,19 +9642,19 @@ readable-stream@^2.0.1: string_decoder "~1.1.1" util-deprecate "~1.0.1" -readable-stream@^3.0.6, readable-stream@^3.5.0, readable-stream@^3.6.0: - version "3.6.0" - resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz" - integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== +readable-stream@^3.0.6, readable-stream@^3.1.1, readable-stream@^3.4.0, readable-stream@^3.5.0, readable-stream@^3.6.0: + version "3.6.2" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" + integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== dependencies: inherits "^2.0.3" string_decoder "^1.1.1" util-deprecate "^1.0.1" readable-stream@^4.0.0: - version "4.4.2" - resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-4.4.2.tgz" - integrity sha512-Lk/fICSyIhodxy1IDK2HazkeGjSmezAWX2egdtJnYhtzKEsBPJowlI6F6LPb5tqIQILrMbx22S5o3GuJavPusA== + version "4.5.2" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-4.5.2.tgz#9e7fc4c45099baeed934bff6eb97ba6cf2729e09" + integrity sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g== dependencies: abort-controller "^3.0.0" buffer "^6.0.3" @@ -8707,103 +9664,74 @@ readable-stream@^4.0.0: readdirp@~3.6.0: version "3.6.0" - resolved "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== dependencies: picomatch "^2.2.1" reading-time@^1.5.0: version "1.5.0" - resolved "https://registry.npmjs.org/reading-time/-/reading-time-1.5.0.tgz" + resolved "https://registry.yarnpkg.com/reading-time/-/reading-time-1.5.0.tgz#d2a7f1b6057cb2e169beaf87113cc3411b5bc5bb" integrity sha512-onYyVhBNr4CmAxFsKS7bz+uTLRakypIe4R+5A824vBSkQy/hB3fZepoVEf8OVAxzLvK+H/jm9TzpI3ETSm64Kg== rechoir@^0.6.2: version "0.6.2" - resolved "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz" + resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384" integrity sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw== dependencies: resolve "^1.1.6" recursive-readdir@^2.2.2: version "2.2.3" - resolved "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.3.tgz" + resolved "https://registry.yarnpkg.com/recursive-readdir/-/recursive-readdir-2.2.3.tgz#e726f328c0d69153bcabd5c322d3195252379372" integrity sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA== dependencies: minimatch "^3.0.5" -redux-devtools-extension@^2.13.8: - version "2.13.9" - resolved "https://registry.npmjs.org/redux-devtools-extension/-/redux-devtools-extension-2.13.9.tgz" - integrity sha512-cNJ8Q/EtjhQaZ71c8I9+BPySIBVEKssbPpskBfsXqb8HJ002A3KRVHfeRzwRo6mGPqsm7XuHTqNSNeS1Khig0A== - redux-thunk@^2.4.2: version "2.4.2" - resolved "https://registry.npmjs.org/redux-thunk/-/redux-thunk-2.4.2.tgz" + resolved "https://registry.yarnpkg.com/redux-thunk/-/redux-thunk-2.4.2.tgz#b9d05d11994b99f7a91ea223e8b04cf0afa5ef3b" integrity sha512-+P3TjtnP0k/FEjcBL5FZpoovtvrTNT/UXd4/sluaSyrURlSlhLSzEdfsTBW7WsKB6yPvgd7q/iZPICFjW4o57Q== -redux@^4.0.0, redux@^4.2.0: +redux@^4.0.0, redux@^4.2.1: version "4.2.1" - resolved "https://registry.npmjs.org/redux/-/redux-4.2.1.tgz" + resolved "https://registry.yarnpkg.com/redux/-/redux-4.2.1.tgz#c08f4306826c49b5e9dc901dee0452ea8fce6197" integrity sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w== dependencies: "@babel/runtime" "^7.9.2" reftools@^1.1.6, reftools@^1.1.9: version "1.1.9" - resolved "https://registry.npmjs.org/reftools/-/reftools-1.1.9.tgz" + resolved "https://registry.yarnpkg.com/reftools/-/reftools-1.1.9.tgz#e16e19f662ccd4648605312c06d34e5da3a2b77e" integrity sha512-OVede/NQE13xBQ+ob5CKd5KyeJYU2YInb1bmV4nRoOfquZPkAkxuOXicSe1PvqIuZZ4kD13sPKBbR7UFDmli6w== regenerate-unicode-properties@^10.1.0: - version "10.1.0" - resolved "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz" - integrity sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ== + version "10.1.1" + resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz#6b0e05489d9076b04c436f318d9b067bba459480" + integrity sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q== dependencies: regenerate "^1.4.2" regenerate@^1.4.2: version "1.4.2" - resolved "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz" + resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a" integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A== -regenerator-runtime@^0.13.10: - version "0.13.10" - resolved "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.10.tgz" - integrity sha512-KepLsg4dU12hryUO7bp/axHAKvwGOCV0sGloQtpagJ12ai+ojVDqkeGSiRX1zlq+kjIMZ1t7gpze+26QqtdGqw== - regenerator-runtime@^0.14.0: - version "0.14.0" - resolved "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz" - integrity sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA== - -regenerator-transform@^0.15.0: - version "0.15.0" - resolved "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.0.tgz" - integrity sha512-LsrGtPmbYg19bcPHwdtmXwbW+TqNvtY4riE3P83foeHRroMbH6/2ddFBfab3t7kbzc7v7p4wbkIecHImqt0QNg== - dependencies: - "@babel/runtime" "^7.8.4" + version "0.14.1" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz#356ade10263f685dda125100cd862c1db895327f" + integrity sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw== regenerator-transform@^0.15.2: version "0.15.2" - resolved "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.15.2.tgz#5bbae58b522098ebdf09bca2f83838929001c7a4" integrity sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg== dependencies: "@babel/runtime" "^7.8.4" -regexpu-core@^5.1.0: - version "5.2.1" - resolved "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.2.1.tgz" - integrity sha512-HrnlNtpvqP1Xkb28tMhBUO2EbyUHdQlsnlAhzWcwHy8WJR53UWr7/MAvqrsQKMbV4qdpv03oTMG8iIhfsPFktQ== - dependencies: - regenerate "^1.4.2" - regenerate-unicode-properties "^10.1.0" - regjsgen "^0.7.1" - regjsparser "^0.9.1" - unicode-match-property-ecmascript "^2.0.0" - unicode-match-property-value-ecmascript "^2.0.0" - regexpu-core@^5.3.1: version "5.3.2" - resolved "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-5.3.2.tgz#11a2b06884f3527aec3e93dbbf4a3b958a95546b" integrity sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ== dependencies: "@babel/regjsgen" "^0.8.0" @@ -8813,108 +9741,123 @@ regexpu-core@^5.3.1: unicode-match-property-ecmascript "^2.0.0" unicode-match-property-value-ecmascript "^2.1.0" -registry-auth-token@^4.0.0: - version "4.2.2" - resolved "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.2.tgz" - integrity sha512-PC5ZysNb42zpFME6D/XlIgtNGdTl8bBOCw90xQLVMpzuuubJKYDWFAEuUNc+Cn8Z8724tg2SDhDRrkVEsqfDMg== +registry-auth-token@^5.0.1: + version "5.0.2" + resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-5.0.2.tgz#8b026cc507c8552ebbe06724136267e63302f756" + integrity sha512-o/3ikDxtXaA59BmZuZrJZDJv8NMDGSj+6j6XaeBmHw8eY1i1qd9+6H+LjVvQXx3HN6aRCGa1cUdJ9RaJZUugnQ== + dependencies: + "@pnpm/npm-conf" "^2.1.0" + +registry-url@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-6.0.1.tgz#056d9343680f2f64400032b1e199faa692286c58" + integrity sha512-+crtS5QjFRqFCoQmvGduwYWEBng99ZvmFvF+cUJkGYF1L1BfU8C6Zp9T7f5vPAwyLkUExpvK+ANVZmGU49qi4Q== dependencies: rc "1.2.8" -registry-url@^5.0.0: - version "5.1.0" - resolved "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz" - integrity sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw== - dependencies: - rc "^1.2.8" - -regjsgen@^0.7.1: - version "0.7.1" - resolved "https://registry.npmjs.org/regjsgen/-/regjsgen-0.7.1.tgz" - integrity sha512-RAt+8H2ZEzHeYWxZ3H2z6tF18zyyOnlcdaafLrm21Bguj7uZy6ULibiAFdXEtKQY4Sy7wDTwDiOazasMLc4KPA== - regjsparser@^0.9.1: version "0.9.1" - resolved "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.9.1.tgz#272d05aa10c7c1f67095b1ff0addae8442fc5709" integrity sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ== dependencies: jsesc "~0.5.0" rehype-raw@^6.1.1: version "6.1.1" - resolved "https://registry.npmjs.org/rehype-raw/-/rehype-raw-6.1.1.tgz" + resolved "https://registry.yarnpkg.com/rehype-raw/-/rehype-raw-6.1.1.tgz#81bbef3793bd7abacc6bf8335879d1b6c868c9d4" integrity sha512-d6AKtisSRtDRX4aSPsJGTfnzrX2ZkHQLE5kiUuGOeEoLpbEulFF4hj0mLPbsa+7vmguDKOVVEQdHKDSwoaIDsQ== dependencies: "@types/hast" "^2.0.0" hast-util-raw "^7.2.0" unified "^10.0.0" +rehype-raw@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/rehype-raw/-/rehype-raw-7.0.0.tgz#59d7348fd5dbef3807bbaa1d443efd2dd85ecee4" + integrity sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww== + dependencies: + "@types/hast" "^3.0.0" + hast-util-raw "^9.0.0" + vfile "^6.0.0" + relateurl@^0.2.7: version "0.2.7" - resolved "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz" + resolved "https://registry.yarnpkg.com/relateurl/-/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9" integrity sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog== -remark-emoji@^2.2.0: - version "2.2.0" - resolved "https://registry.npmjs.org/remark-emoji/-/remark-emoji-2.2.0.tgz" - integrity sha512-P3cj9s5ggsUvWw5fS2uzCHJMGuXYRb0NnZqYlNecewXt8QBU9n5vW3DUUKOhepS8F9CwdMx9B8a3i7pqFWAI5w== +remark-directive@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/remark-directive/-/remark-directive-3.0.0.tgz#34452d951b37e6207d2e2a4f830dc33442923268" + integrity sha512-l1UyWJ6Eg1VPU7Hm/9tt0zKtReJQNOA4+iDMAxTyZNWnJnFlbS/7zhiel/rogTLQ2vMYwDzSJa4BiVNqGlqIMA== dependencies: - emoticon "^3.2.0" - node-emoji "^1.10.0" - unist-util-visit "^2.0.3" + "@types/mdast" "^4.0.0" + mdast-util-directive "^3.0.0" + micromark-extension-directive "^3.0.0" + unified "^11.0.0" -remark-footnotes@2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/remark-footnotes/-/remark-footnotes-2.0.0.tgz" - integrity sha512-3Clt8ZMH75Ayjp9q4CorNeyjwIxHFcTkaektplKGl2A1jNGEUey8cKL0ZC5vJwfcD5GFGsNLImLG/NGzWIzoMQ== - -remark-mdx@1.6.22: - version "1.6.22" - resolved "https://registry.npmjs.org/remark-mdx/-/remark-mdx-1.6.22.tgz" - integrity sha512-phMHBJgeV76uyFkH4rvzCftLfKCr2RZuF+/gmVcaKrpsihyzmhXjA0BEMDaPTXG5y8qZOKPVo83NAOX01LPnOQ== +remark-emoji@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/remark-emoji/-/remark-emoji-4.0.1.tgz#671bfda668047689e26b2078c7356540da299f04" + integrity sha512-fHdvsTR1dHkWKev9eNyhTo4EFwbUvJ8ka9SgeWkMPYFX4WoI7ViVBms3PjlQYgw5TLvNQso3GUB/b/8t3yo+dg== dependencies: - "@babel/core" "7.12.9" - "@babel/helper-plugin-utils" "7.10.4" - "@babel/plugin-proposal-object-rest-spread" "7.12.1" - "@babel/plugin-syntax-jsx" "7.12.1" - "@mdx-js/util" "1.6.22" - is-alphabetical "1.0.4" - remark-parse "8.0.3" - unified "9.2.0" + "@types/mdast" "^4.0.2" + emoticon "^4.0.1" + mdast-util-find-and-replace "^3.0.1" + node-emoji "^2.1.0" + unified "^11.0.4" -remark-parse@8.0.3: - version "8.0.3" - resolved "https://registry.npmjs.org/remark-parse/-/remark-parse-8.0.3.tgz" - integrity sha512-E1K9+QLGgggHxCQtLt++uXltxEprmWzNfg+MxpfHsZlrddKzZ/hZyWHDbK3/Ap8HJQqYJRXP+jHczdL6q6i85Q== +remark-frontmatter@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/remark-frontmatter/-/remark-frontmatter-5.0.0.tgz#b68d61552a421ec412c76f4f66c344627dc187a2" + integrity sha512-XTFYvNASMe5iPN0719nPrdItC9aU0ssC4v14mH1BCi1u0n1gAocqcujWUrByftZTbLhRtiKRyjYTSIOcr69UVQ== dependencies: - ccount "^1.0.0" - collapse-white-space "^1.0.2" - is-alphabetical "^1.0.0" - is-decimal "^1.0.0" - is-whitespace-character "^1.0.0" - is-word-character "^1.0.0" - markdown-escapes "^1.0.0" - parse-entities "^2.0.0" - repeat-string "^1.5.4" - state-toggle "^1.0.0" - trim "0.0.1" - trim-trailing-lines "^1.0.0" - unherit "^1.0.4" - unist-util-remove-position "^2.0.0" - vfile-location "^3.0.0" - xtend "^4.0.1" + "@types/mdast" "^4.0.0" + mdast-util-frontmatter "^2.0.0" + micromark-extension-frontmatter "^2.0.0" + unified "^11.0.0" + +remark-gfm@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/remark-gfm/-/remark-gfm-4.0.0.tgz#aea777f0744701aa288b67d28c43565c7e8c35de" + integrity sha512-U92vJgBPkbw4Zfu/IiW2oTZLSL3Zpv+uI7My2eq8JxKgqraFdU8YUGicEJCEgSbeaG+QDFqIcwwfMTOEelPxuA== + dependencies: + "@types/mdast" "^4.0.0" + mdast-util-gfm "^3.0.0" + micromark-extension-gfm "^3.0.0" + remark-parse "^11.0.0" + remark-stringify "^11.0.0" + unified "^11.0.0" + +remark-mdx@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/remark-mdx/-/remark-mdx-3.0.1.tgz#8f73dd635c1874e44426e243f72c0977cf60e212" + integrity sha512-3Pz3yPQ5Rht2pM5R+0J2MrGoBSrzf+tJG94N+t/ilfdh8YLyyKYtidAYwTveB20BoHAcwIopOUqhcmh2F7hGYA== + dependencies: + mdast-util-mdx "^3.0.0" + micromark-extension-mdxjs "^3.0.0" remark-parse@^10.0.0: - version "10.0.1" - resolved "https://registry.npmjs.org/remark-parse/-/remark-parse-10.0.1.tgz" - integrity sha512-1fUyHr2jLsVOkhbvPRBJ5zTKZZyD6yZzYaWCS6BPBdQ8vEMBCH+9zNCDA6tET/zHCi/jLqjCWtlJZUPk+DbnFw== + version "10.0.2" + resolved "https://registry.yarnpkg.com/remark-parse/-/remark-parse-10.0.2.tgz#ca241fde8751c2158933f031a4e3efbaeb8bc262" + integrity sha512-3ydxgHa/ZQzG8LvC7jTXccARYDcRld3VfcgIIFs7bI6vbRSxJJmzgLEIIoYKyrfhaY+ujuWaf/PJiMZXoiCXgw== dependencies: "@types/mdast" "^3.0.0" mdast-util-from-markdown "^1.0.0" unified "^10.0.0" +remark-parse@^11.0.0: + version "11.0.0" + resolved "https://registry.yarnpkg.com/remark-parse/-/remark-parse-11.0.0.tgz#aa60743fcb37ebf6b069204eb4da304e40db45a1" + integrity sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA== + dependencies: + "@types/mdast" "^4.0.0" + mdast-util-from-markdown "^2.0.0" + micromark-util-types "^2.0.0" + unified "^11.0.0" + remark-rehype@^10.0.0: version "10.1.0" - resolved "https://registry.npmjs.org/remark-rehype/-/remark-rehype-10.1.0.tgz" + resolved "https://registry.yarnpkg.com/remark-rehype/-/remark-rehype-10.1.0.tgz#32dc99d2034c27ecaf2e0150d22a6dcccd9a6279" integrity sha512-EFmR5zppdBp0WQeDVZ/b66CWJipB2q2VLNFMabzDSGR66Z2fQii83G5gTBbgGEnEEA0QRussvrFHxk1HWGJskw== dependencies: "@types/hast" "^2.0.0" @@ -8922,16 +9865,29 @@ remark-rehype@^10.0.0: mdast-util-to-hast "^12.1.0" unified "^10.0.0" -remark-squeeze-paragraphs@4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/remark-squeeze-paragraphs/-/remark-squeeze-paragraphs-4.0.0.tgz" - integrity sha512-8qRqmL9F4nuLPIgl92XUuxI3pFxize+F1H0e/W3llTk0UsjJaj01+RrirkMw7P21RKe4X6goQhYRSvNWX+70Rw== +remark-rehype@^11.0.0: + version "11.1.0" + resolved "https://registry.yarnpkg.com/remark-rehype/-/remark-rehype-11.1.0.tgz#d5f264f42bcbd4d300f030975609d01a1697ccdc" + integrity sha512-z3tJrAs2kIs1AqIIy6pzHmAHlF1hWQ+OdY4/hv+Wxe35EhyLKcajL33iUEn3ScxtFox9nUvRufR/Zre8Q08H/g== dependencies: - mdast-squeeze-paragraphs "^4.0.0" + "@types/hast" "^3.0.0" + "@types/mdast" "^4.0.0" + mdast-util-to-hast "^13.0.0" + unified "^11.0.0" + vfile "^6.0.0" + +remark-stringify@^11.0.0: + version "11.0.0" + resolved "https://registry.yarnpkg.com/remark-stringify/-/remark-stringify-11.0.0.tgz#4c5b01dd711c269df1aaae11743eb7e2e7636fd3" + integrity sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw== + dependencies: + "@types/mdast" "^4.0.0" + mdast-util-to-markdown "^2.0.0" + unified "^11.0.0" renderkid@^3.0.0: version "3.0.0" - resolved "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz" + resolved "https://registry.yarnpkg.com/renderkid/-/renderkid-3.0.0.tgz#5fd823e4d6951d37358ecc9a58b1f06836b6268a" integrity sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg== dependencies: css-select "^4.1.3" @@ -8940,203 +9896,230 @@ renderkid@^3.0.0: lodash "^4.17.21" strip-ansi "^6.0.1" -repeat-string@^1.5.4: - version "1.6.1" - resolved "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz" - integrity sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w== - require-directory@^2.1.1: version "2.1.1" - resolved "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== require-from-string@^2.0.2: version "2.0.2" - resolved "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz" + resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== "require-like@>= 0.1.1": version "0.1.2" - resolved "https://registry.npmjs.org/require-like/-/require-like-0.1.2.tgz" + resolved "https://registry.yarnpkg.com/require-like/-/require-like-0.1.2.tgz#ad6f30c13becd797010c468afa775c0c0a6b47fa" integrity sha512-oyrU88skkMtDdauHDuKVrgR+zuItqr6/c//FXzvmxRGMexSDc6hNvJInGW3LL46n+8b50RykrvwSUIIQH2LQ5A== require-main-filename@^2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz" + resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== requires-port@^1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz" + resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ== -reselect@^4.1.7: - version "4.1.7" - resolved "https://registry.npmjs.org/reselect/-/reselect-4.1.7.tgz" - integrity sha512-Zu1xbUt3/OPwsXL46hvOOoQrap2azE7ZQbokq61BQfiXvhewsKDwhMeZjTX9sX0nvw1t/U5Audyn1I9P/m9z0A== +reselect@^4.1.8: + version "4.1.8" + resolved "https://registry.yarnpkg.com/reselect/-/reselect-4.1.8.tgz#3f5dc671ea168dccdeb3e141236f69f02eaec524" + integrity sha512-ab9EmR80F/zQTMNeneUr4cv+jSwPJgIlvEmVwLerwrWVbpLlBuls9XHzIeTFy4cegU2NHBp3va0LKOzU5qFEYQ== + +resolve-alpn@^1.2.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/resolve-alpn/-/resolve-alpn-1.2.1.tgz#b7adbdac3546aaaec20b45e7d8265927072726f9" + integrity sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g== resolve-from@^4.0.0: version "4.0.0" - resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== resolve-package-path@^4.0.3: version "4.0.3" - resolved "https://registry.npmjs.org/resolve-package-path/-/resolve-package-path-4.0.3.tgz" + resolved "https://registry.yarnpkg.com/resolve-package-path/-/resolve-package-path-4.0.3.tgz#31dab6897236ea6613c72b83658d88898a9040aa" integrity sha512-SRpNAPW4kewOaNUt8VPqhJ0UMxawMwzJD8V7m1cJfdSTK9ieZwS6K7Dabsm4bmLFM96Z5Y/UznrpG5kt1im8yA== dependencies: path-root "^0.1.1" resolve-pathname@^3.0.0: version "3.0.0" - resolved "https://registry.npmjs.org/resolve-pathname/-/resolve-pathname-3.0.0.tgz" + resolved "https://registry.yarnpkg.com/resolve-pathname/-/resolve-pathname-3.0.0.tgz#99d02224d3cf263689becbb393bc560313025dcd" integrity sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng== -resolve@^1.1.6, resolve@^1.1.7, resolve@^1.14.2, resolve@^1.22.1, resolve@^1.3.2: - version "1.22.1" - resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz" - integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw== +resolve@^1.1.6, resolve@^1.1.7, resolve@^1.14.2, resolve@^1.22.2: + version "1.22.8" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d" + integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== dependencies: - is-core-module "^2.9.0" + is-core-module "^2.13.0" path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" -responselike@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz" - integrity sha512-/Fpe5guzJk1gPqdJLJR5u7eG/gNY4nImjbRDaVWVMRhne55TCmj2i9Q+54PBRfatRC8v/rIiv9BN0pMd9OV5EQ== +responselike@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/responselike/-/responselike-3.0.0.tgz#20decb6c298aff0dbee1c355ca95461d42823626" + integrity sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg== dependencies: - lowercase-keys "^1.0.0" + lowercase-keys "^3.0.0" retry@^0.13.1: version "0.13.1" - resolved "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz" + resolved "https://registry.yarnpkg.com/retry/-/retry-0.13.1.tgz#185b1587acf67919d63b357349e03537b2484658" integrity sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg== reusify@^1.0.4: version "1.0.4" - resolved "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz" + resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== -rimraf@^3.0.2: +rimraf@3.0.2, rimraf@^3.0.2: version "3.0.2" - resolved "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== dependencies: glob "^7.1.3" ripemd160@^2.0.0, ripemd160@^2.0.1: version "2.0.2" - resolved "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz" + resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA== dependencies: hash-base "^3.0.0" inherits "^2.0.1" -rtl-detect@^1.0.4: - version "1.0.4" - resolved "https://registry.npmjs.org/rtl-detect/-/rtl-detect-1.0.4.tgz" - integrity sha512-EBR4I2VDSSYr7PkBmFy04uhycIpDKp+21p/jARYXlCSjQksTBQcJ0HFUPOO79EPPH5JS6VAhiIQbycf0O3JAxQ== +robust-predicates@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/robust-predicates/-/robust-predicates-3.0.2.tgz#d5b28528c4824d20fc48df1928d41d9efa1ad771" + integrity sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg== -rtlcss@^3.5.0: - version "3.5.0" - resolved "https://registry.npmjs.org/rtlcss/-/rtlcss-3.5.0.tgz" - integrity sha512-wzgMaMFHQTnyi9YOwsx9LjOxYXJPzS8sYnFaKm6R5ysvTkwzHiB0vxnbHwchHQT65PTdBjDG21/kQBWI7q9O7A== +rtl-detect@^1.0.4: + version "1.1.2" + resolved "https://registry.yarnpkg.com/rtl-detect/-/rtl-detect-1.1.2.tgz#ca7f0330af5c6bb626c15675c642ba85ad6273c6" + integrity sha512-PGMBq03+TTG/p/cRB7HCLKJ1MgDIi07+QU1faSjiYRfmY5UsAttV9Hs08jDAHVwcOwmVLcSJkpwyfXszVjWfIQ== + +rtlcss@^4.1.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/rtlcss/-/rtlcss-4.1.1.tgz#f20409fcc197e47d1925996372be196fee900c0c" + integrity sha512-/oVHgBtnPNcggP2aVXQjSy6N1mMAfHg4GSag0QtZBlD5bdDgAHwr4pydqJGd+SUCu9260+Pjqbjwtvu7EMH1KQ== dependencies: - find-up "^5.0.0" + escalade "^3.1.1" picocolors "^1.0.0" - postcss "^8.3.11" + postcss "^8.4.21" strip-json-comments "^3.1.1" run-parallel@^1.1.9: version "1.2.0" - resolved "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz" + resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== dependencies: queue-microtask "^1.2.2" +rw@1: + version "1.3.3" + resolved "https://registry.yarnpkg.com/rw/-/rw-1.3.3.tgz#3f862dfa91ab766b14885ef4d01124bfda074fb4" + integrity sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ== + rxjs@^7.5.4: - version "7.5.5" - resolved "https://registry.npmjs.org/rxjs/-/rxjs-7.5.5.tgz" - integrity sha512-sy+H0pQofO95VDmFLzyaw9xNJU4KTRSwQIGM6+iG3SypAtCiLDzpeG8sJrNCWn2Up9km+KhkvTdbkrdy+yzZdw== + version "7.8.1" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.8.1.tgz#6f6f3d99ea8044291efd92e7c7fcf562c4057543" + integrity sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg== dependencies: tslib "^2.1.0" sade@^1.7.3: version "1.8.1" - resolved "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz" + resolved "https://registry.yarnpkg.com/sade/-/sade-1.8.1.tgz#0a78e81d658d394887be57d2a409bf703a3b2701" integrity sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A== dependencies: mri "^1.1.0" safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.2" - resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== -safe-buffer@5.2.1, safe-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@~5.2.0: +safe-buffer@5.2.1, safe-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@^5.2.1, safe-buffer@~5.2.0: version "5.2.1" - resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== -"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0", safer-buffer@^2.1.0: +"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0": version "2.1.2" - resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== -sax@^1.2.4: - version "1.2.4" - resolved "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz" - integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== +sass-loader@^10.1.1: + version "10.5.2" + resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-10.5.2.tgz#1ca30534fff296417b853c7597ca3b0bbe8c37d0" + integrity sha512-vMUoSNOUKJILHpcNCCyD23X34gve1TS7Rjd9uXHeKqhvBG39x6XbswFDtpbTElj6XdMFezoWhkh5vtKudf2cgQ== + dependencies: + klona "^2.0.4" + loader-utils "^2.0.0" + neo-async "^2.6.2" + schema-utils "^3.0.0" + semver "^7.3.2" -scheduler@^0.20.2: - version "0.20.2" - resolved "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz" - integrity sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ== +sass-loader@^13.3.2: + version "13.3.3" + resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-13.3.3.tgz#60df5e858788cffb1a3215e5b92e9cba61e7e133" + integrity sha512-mt5YN2F1MOZr3d/wBRcZxeFgwgkH44wVc2zohO2YF6JiOMkiXe4BYRZpSu2sO1g71mo/j16txzUhsKZlqjVGzA== + dependencies: + neo-async "^2.6.2" + +sass@^1.58.1: + version "1.77.5" + resolved "https://registry.yarnpkg.com/sass/-/sass-1.77.5.tgz#5f9009820297521356e962c0bed13ee36710edfe" + integrity sha512-oDfX1mukIlxacPdQqNb6mV2tVCrnE+P3nVYioy72V5tlk56CPNcO4TCuFcaCRKKfJ1M3lH95CleRS+dVKL2qMg== + dependencies: + chokidar ">=3.0.0 <4.0.0" + immutable "^4.0.0" + source-map-js ">=0.6.2 <2.0.0" + +sax@^1.2.4: + version "1.4.1" + resolved "https://registry.yarnpkg.com/sax/-/sax-1.4.1.tgz#44cc8988377f126304d3b3fc1010c733b929ef0f" + integrity sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg== + +scheduler@^0.23.2: + version "0.23.2" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.23.2.tgz#414ba64a3b282892e944cf2108ecc078d115cdc3" + integrity sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ== dependencies: loose-envify "^1.1.0" - object-assign "^4.1.1" schema-utils@2.7.0: version "2.7.0" - resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.7.0.tgz#17151f76d8eae67fbbf77960c33c676ad9f4efc7" integrity sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A== dependencies: "@types/json-schema" "^7.0.4" ajv "^6.12.2" ajv-keywords "^3.4.1" -schema-utils@^2.6.5: - version "2.7.1" - resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz" - integrity sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg== - dependencies: - "@types/json-schema" "^7.0.5" - ajv "^6.12.4" - ajv-keywords "^3.5.2" - schema-utils@^3.0.0, schema-utils@^3.1.1, schema-utils@^3.2.0: version "3.3.0" - resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.3.0.tgz#f50a88877c3c01652a15b622ae9e9795df7a60fe" integrity sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg== dependencies: "@types/json-schema" "^7.0.8" ajv "^6.12.5" ajv-keywords "^3.5.2" -schema-utils@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz" - integrity sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg== +schema-utils@^4.0.0, schema-utils@^4.0.1: + version "4.2.0" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-4.2.0.tgz#70d7c93e153a273a805801882ebd3bff20d89c8b" + integrity sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw== dependencies: "@types/json-schema" "^7.0.9" - ajv "^8.8.0" + ajv "^8.9.0" ajv-formats "^2.1.1" - ajv-keywords "^5.0.0" + ajv-keywords "^5.1.0" section-matter@^1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/section-matter/-/section-matter-1.0.0.tgz" + resolved "https://registry.yarnpkg.com/section-matter/-/section-matter-1.0.0.tgz#e9041953506780ec01d59f292a19c7b850b84167" integrity sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA== dependencies: extend-shallow "^2.0.1" @@ -9144,50 +10127,44 @@ section-matter@^1.0.0: select-hose@^2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz" + resolved "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca" integrity sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg== selfsigned@^2.1.1: - version "2.1.1" - resolved "https://registry.npmjs.org/selfsigned/-/selfsigned-2.1.1.tgz" - integrity sha512-GSL3aowiF7wa/WtSFwnUrludWFoNhftq8bUkH9pkzjpN2XSPOAYEgg6e0sS9s0rZwgJzJiQRPU18A6clnoW5wQ== + version "2.4.1" + resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-2.4.1.tgz#560d90565442a3ed35b674034cec4e95dceb4ae0" + integrity sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q== dependencies: + "@types/node-forge" "^1.3.0" node-forge "^1" -semver-diff@^3.1.1: - version "3.1.1" - resolved "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz" - integrity sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg== +semver-diff@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/semver-diff/-/semver-diff-4.0.0.tgz#3afcf5ed6d62259f5c72d0d5d50dffbdc9680df5" + integrity sha512-0Ju4+6A8iOnpL/Thra7dZsSlOHYAHIeMxfhWQRI1/VLcT3WDBZKKtQt/QkBOsiIN9ZpuvHE6cGZ0x4glCMmfiA== dependencies: - semver "^6.3.0" + semver "^7.3.5" semver@7.3.5: version "7.3.5" - resolved "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7" integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ== dependencies: lru-cache "^6.0.0" -semver@^5.4.1: - version "5.7.2" - resolved "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz" - integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== - -semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, semver@^6.2.0, semver@^6.3.0, semver@^6.3.1: +semver@^6.3.1: version "6.3.1" - resolved "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== -semver@^7.3.2, semver@^7.3.4, semver@^7.3.5, semver@^7.3.7, semver@^7.3.8: - version "7.5.4" - resolved "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz" - integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== - dependencies: - lru-cache "^6.0.0" +semver@^7.3.2, semver@^7.3.5, semver@^7.3.7, semver@^7.3.8, semver@^7.5.4: + version "7.6.2" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.2.tgz#1e3b34759f896e8f14d6134732ce798aeb0c6e13" + integrity sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w== send@0.18.0: version "0.18.0" - resolved "https://registry.npmjs.org/send/-/send-0.18.0.tgz" + resolved "https://registry.yarnpkg.com/send/-/send-0.18.0.tgz#670167cc654b05f5aa4a767f9113bb371bc706be" integrity sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg== dependencies: debug "2.6.9" @@ -9205,15 +10182,15 @@ send@0.18.0: statuses "2.0.1" serialize-javascript@^6.0.0, serialize-javascript@^6.0.1: - version "6.0.1" - resolved "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz" - integrity sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w== + version "6.0.2" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.2.tgz#defa1e055c83bf6d59ea805d8da862254eb6a6c2" + integrity sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g== dependencies: randombytes "^2.1.0" -serve-handler@^6.1.3: +serve-handler@^6.1.5: version "6.1.5" - resolved "https://registry.npmjs.org/serve-handler/-/serve-handler-6.1.5.tgz" + resolved "https://registry.yarnpkg.com/serve-handler/-/serve-handler-6.1.5.tgz#a4a0964f5c55c7e37a02a633232b6f0d6f068375" integrity sha512-ijPFle6Hwe8zfmBxJdE+5fta53fdIY0lHISJvuikXB3VYFafRjMRpOffSPvCYsbKyBA7pvy9oYr/BT1O3EArlg== dependencies: bytes "3.0.0" @@ -9227,7 +10204,7 @@ serve-handler@^6.1.3: serve-index@^1.9.1: version "1.9.1" - resolved "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz" + resolved "https://registry.yarnpkg.com/serve-index/-/serve-index-1.9.1.tgz#d3768d69b1e7d82e5ce050fff5b453bea12a9239" integrity sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw== dependencies: accepts "~1.3.4" @@ -9240,7 +10217,7 @@ serve-index@^1.9.1: serve-static@1.15.0: version "1.15.0" - resolved "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.15.0.tgz#faaef08cffe0a1a62f60cad0c4e513cff0ac9540" integrity sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g== dependencies: encodeurl "~1.0.2" @@ -9250,27 +10227,39 @@ serve-static@1.15.0: set-blocking@^2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz" + resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== -setimmediate@^1.0.4, setimmediate@^1.0.5: +set-function-length@^1.2.1: + version "1.2.2" + resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449" + integrity sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg== + dependencies: + define-data-property "^1.1.4" + es-errors "^1.3.0" + function-bind "^1.1.2" + get-intrinsic "^1.2.4" + gopd "^1.0.1" + has-property-descriptors "^1.0.2" + +setimmediate@^1.0.4: version "1.0.5" - resolved "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz" + resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" integrity sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA== setprototypeof@1.1.0: version "1.1.0" - resolved "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" integrity sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ== setprototypeof@1.2.0: version "1.2.0" - resolved "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== sha.js@^2.4.0, sha.js@^2.4.8: version "2.4.11" - resolved "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz" + resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== dependencies: inherits "^2.0.1" @@ -9278,36 +10267,36 @@ sha.js@^2.4.0, sha.js@^2.4.8: shallow-clone@^3.0.0: version "3.0.1" - resolved "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz" + resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-3.0.1.tgz#8f2981ad92531f55035b01fb230769a40e02efa3" integrity sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA== dependencies: kind-of "^6.0.2" shallowequal@^1.1.0: version "1.1.0" - resolved "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz" + resolved "https://registry.yarnpkg.com/shallowequal/-/shallowequal-1.1.0.tgz#188d521de95b9087404fd4dcb68b13df0ae4e7f8" integrity sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ== shebang-command@^2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== dependencies: shebang-regex "^3.0.0" shebang-regex@^3.0.0: version "3.0.0" - resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== -shell-quote@^1.7.3: - version "1.7.3" - resolved "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.3.tgz" - integrity sha512-Vpfqwm4EnqGdlsBFNmHhxhElJYrdfcxPThu+ryKS5J8L/fhAwLazFZtq+S+TWZ9ANj2piSQLGj6NQg+lKPmxrw== +shell-quote@^1.7.3, shell-quote@^1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.8.1.tgz#6dbf4db75515ad5bac63b4f1894c3a154c766680" + integrity sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA== shelljs@^0.8.5: version "0.8.5" - resolved "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz" + resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.8.5.tgz#de055408d8361bed66c669d2f000538ced8ee20c" integrity sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow== dependencies: glob "^7.0.0" @@ -9316,14 +10305,14 @@ shelljs@^0.8.5: should-equal@^2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/should-equal/-/should-equal-2.0.0.tgz" + resolved "https://registry.yarnpkg.com/should-equal/-/should-equal-2.0.0.tgz#6072cf83047360867e68e98b09d71143d04ee0c3" integrity sha512-ZP36TMrK9euEuWQYBig9W55WPC7uo37qzAEmbjHz4gfyuXrEUgF8cUvQVO+w+d3OMfPvSRQJ22lSm8MQJ43LTA== dependencies: should-type "^1.4.0" should-format@^3.0.3: version "3.0.3" - resolved "https://registry.npmjs.org/should-format/-/should-format-3.0.3.tgz" + resolved "https://registry.yarnpkg.com/should-format/-/should-format-3.0.3.tgz#9bfc8f74fa39205c53d38c34d717303e277124f1" integrity sha512-hZ58adtulAk0gKtua7QxevgUaXTTXxIi8t41L3zo9AHvjXO1/7sdLECuHeIN2SRtYXpNkmhoUP2pdeWgricQ+Q== dependencies: should-type "^1.3.0" @@ -9331,7 +10320,7 @@ should-format@^3.0.3: should-type-adaptors@^1.0.1: version "1.1.0" - resolved "https://registry.npmjs.org/should-type-adaptors/-/should-type-adaptors-1.1.0.tgz" + resolved "https://registry.yarnpkg.com/should-type-adaptors/-/should-type-adaptors-1.1.0.tgz#401e7f33b5533033944d5cd8bf2b65027792e27a" integrity sha512-JA4hdoLnN+kebEp2Vs8eBe9g7uy0zbRo+RMcU0EsNy+R+k049Ki+N5tT5Jagst2g7EAja+euFuoXFCa8vIklfA== dependencies: should-type "^1.3.0" @@ -9339,17 +10328,17 @@ should-type-adaptors@^1.0.1: should-type@^1.3.0, should-type@^1.4.0: version "1.4.0" - resolved "https://registry.npmjs.org/should-type/-/should-type-1.4.0.tgz" + resolved "https://registry.yarnpkg.com/should-type/-/should-type-1.4.0.tgz#0756d8ce846dfd09843a6947719dfa0d4cff5cf3" integrity sha512-MdAsTu3n25yDbIe1NeN69G4n6mUnJGtSJHygX3+oN0ZbO3DTiATnf7XnYJdGT42JCXurTb1JI0qOBR65shvhPQ== should-util@^1.0.0: version "1.0.1" - resolved "https://registry.npmjs.org/should-util/-/should-util-1.0.1.tgz" + resolved "https://registry.yarnpkg.com/should-util/-/should-util-1.0.1.tgz#fb0d71338f532a3a149213639e2d32cbea8bcb28" integrity sha512-oXF8tfxx5cDk8r2kYqlkUJzZpDBqVY/II2WhvU0n9Y3XYvAYRmeaf1PvvIvTgPnv4KJ+ES5M0PyDq5Jp+Ygy2g== should@^13.2.1: version "13.2.3" - resolved "https://registry.npmjs.org/should/-/should-13.2.3.tgz" + resolved "https://registry.yarnpkg.com/should/-/should-13.2.3.tgz#96d8e5acf3e97b49d89b51feaa5ae8d07ef58f10" integrity sha512-ggLesLtu2xp+ZxI+ysJTmNjh2U0TsC+rQ/pfED9bUZZ4DKefP27D+7YJVVTvKsmjLpIi9jAa7itwDGkDDmt1GQ== dependencies: should-equal "^2.0.0" @@ -9358,37 +10347,43 @@ should@^13.2.1: should-type-adaptors "^1.0.1" should-util "^1.0.0" -side-channel@^1.0.4: - version "1.0.4" - resolved "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz" - integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== +side-channel@^1.0.4, side-channel@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.6.tgz#abd25fb7cd24baf45466406b1096b7831c9215f2" + integrity sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA== dependencies: - call-bind "^1.0.0" - get-intrinsic "^1.0.2" - object-inspect "^1.9.0" + call-bind "^1.0.7" + es-errors "^1.3.0" + get-intrinsic "^1.2.4" + object-inspect "^1.13.1" signal-exit@^3.0.2, signal-exit@^3.0.3: version "3.0.7" - resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== -sirv@^1.0.7: - version "1.0.19" - resolved "https://registry.npmjs.org/sirv/-/sirv-1.0.19.tgz" - integrity sha512-JuLThK3TnZG1TAKDwNIqNq6QA2afLOCcm+iE8D1Kj3GA40pSPsxQjjJl0J8X3tsR7T+CP1GavpzLwYkgVLWrZQ== +signal-exit@^4.0.1: + version "4.1.0" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" + integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== + +sirv@^2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/sirv/-/sirv-2.0.4.tgz#5dd9a725c578e34e449f332703eb2a74e46a29b0" + integrity sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ== dependencies: - "@polka/url" "^1.0.0-next.20" - mrmime "^1.0.0" - totalist "^1.0.0" + "@polka/url" "^1.0.0-next.24" + mrmime "^2.0.0" + totalist "^3.0.0" sisteransi@^1.0.5: version "1.0.5" - resolved "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz" + resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== -sitemap@7.1.1, sitemap@^7.1.1: +sitemap@7.1.1: version "7.1.1" - resolved "https://registry.npmjs.org/sitemap/-/sitemap-7.1.1.tgz" + resolved "https://registry.yarnpkg.com/sitemap/-/sitemap-7.1.1.tgz#eeed9ad6d95499161a3eadc60f8c6dce4bea2bef" integrity sha512-mK3aFtjz4VdJN0igpIJrinf3EO8U8mxOPsTBzSsy06UtjZQJ3YY3o3Xa7zSc5nMqcMrRwlChHZ18Kxg0caiPBg== dependencies: "@types/node" "^17.0.5" @@ -9396,71 +10391,91 @@ sitemap@7.1.1, sitemap@^7.1.1: arg "^5.0.0" sax "^1.2.4" +sitemap@^7.1.1: + version "7.1.2" + resolved "https://registry.yarnpkg.com/sitemap/-/sitemap-7.1.2.tgz#6ce1deb43f6f177c68bc59cf93632f54e3ae6b72" + integrity sha512-ARCqzHJ0p4gWt+j7NlU5eDlIO9+Rkr/JhPFZKKQ1l5GCus7rJH4UdrlVAh0xC/gDS/Qir2UMxqYNHtsKr2rpCw== + dependencies: + "@types/node" "^17.0.5" + "@types/sax" "^1.2.1" + arg "^5.0.0" + sax "^1.2.4" + +skin-tone@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/skin-tone/-/skin-tone-2.0.0.tgz#4e3933ab45c0d4f4f781745d64b9f4c208e41237" + integrity sha512-kUMbT1oBJCpgrnKoSr0o6wPtvRWT9W9UKvGLwfJYO2WuahZRHOpEyL1ckyMGgMWh0UdpmaoFqKKD29WTomNEGA== + dependencies: + unicode-emoji-modifier-base "^1.0.0" + slash@^3.0.0: version "3.0.0" - resolved "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz" + resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== slash@^4.0.0: version "4.0.0" - resolved "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz" + resolved "https://registry.yarnpkg.com/slash/-/slash-4.0.0.tgz#2422372176c4c6c5addb5e2ada885af984b396a7" integrity sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew== slugify@^1.6.5: version "1.6.6" - resolved "https://registry.npmjs.org/slugify/-/slugify-1.6.6.tgz" + resolved "https://registry.yarnpkg.com/slugify/-/slugify-1.6.6.tgz#2d4ac0eacb47add6af9e04d3be79319cbcc7924b" integrity sha512-h+z7HKHYXj6wJU+AnS/+IH8Uh9fdcX1Lrhg1/VMdf9PwoBQXFcXiAdsy2tSK0P6gKwJLXp02r90ahUCqHk9rrw== +snake-case@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/snake-case/-/snake-case-3.0.4.tgz#4f2bbd568e9935abdfd593f34c691dadb49c452c" + integrity sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg== + dependencies: + dot-case "^3.0.4" + tslib "^2.0.3" + sockjs@^0.3.24: version "0.3.24" - resolved "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz" + resolved "https://registry.yarnpkg.com/sockjs/-/sockjs-0.3.24.tgz#c9bc8995f33a111bea0395ec30aa3206bdb5ccce" integrity sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ== dependencies: faye-websocket "^0.11.3" uuid "^8.3.2" websocket-driver "^0.7.4" -sort-css-media-queries@2.0.4: - version "2.0.4" - resolved "https://registry.npmjs.org/sort-css-media-queries/-/sort-css-media-queries-2.0.4.tgz" - integrity sha512-PAIsEK/XupCQwitjv7XxoMvYhT7EAfyzI3hsy/MyDgTvc+Ft55ctdkctJLOy6cQejaIC+zjpUL4djFVm2ivOOw== +sort-css-media-queries@2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/sort-css-media-queries/-/sort-css-media-queries-2.2.0.tgz#aa33cf4a08e0225059448b6c40eddbf9f1c8334c" + integrity sha512-0xtkGhWCC9MGt/EzgnvbbbKhqWjl1+/rncmhTh5qCpbYguXh6S/qwePfv/JQ8jePXXmqingylxoC49pCkSPIbA== -source-map-js@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz" - integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== +"source-map-js@>=0.6.2 <2.0.0", source-map-js@^1.0.1, source-map-js@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.0.tgz#16b809c162517b5b8c3e7dcd315a2a5c2612b2af" + integrity sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg== source-map-support@~0.5.20: version "0.5.21" - resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== dependencies: buffer-from "^1.0.0" source-map "^0.6.0" -source-map@^0.5.0: - version "0.5.7" - resolved "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz" - integrity sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ== - -source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0: +source-map@^0.6.0, source-map@~0.6.0: version "0.6.1" - resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== -space-separated-tokens@^1.0.0: - version "1.1.5" - resolved "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-1.1.5.tgz" - integrity sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA== +source-map@^0.7.0: + version "0.7.4" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.4.tgz#a9bbe705c9d8846f4e08ff6765acf0f1b0898656" + integrity sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA== space-separated-tokens@^2.0.0: version "2.0.2" - resolved "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz" + resolved "https://registry.yarnpkg.com/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz#1ecd9d2350a3844572c3f4a312bceb018348859f" integrity sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q== spdy-transport@^3.0.0: version "3.0.0" - resolved "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz" + resolved "https://registry.yarnpkg.com/spdy-transport/-/spdy-transport-3.0.0.tgz#00d4863a6400ad75df93361a1608605e5dcdcf31" integrity sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw== dependencies: debug "^4.1.0" @@ -9472,7 +10487,7 @@ spdy-transport@^3.0.0: spdy@^4.0.2: version "4.0.2" - resolved "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz" + resolved "https://registry.yarnpkg.com/spdy/-/spdy-4.0.2.tgz#b74f466203a3eda452c02492b91fb9e84a27677b" integrity sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA== dependencies: debug "^4.1.0" @@ -9483,37 +10498,32 @@ spdy@^4.0.2: sprintf-js@~1.0.2: version "1.0.3" - resolved "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== -stable@^0.1.8: - version "0.1.8" - resolved "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz" - integrity sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w== - -state-toggle@^1.0.0: - version "1.0.3" - resolved "https://registry.npmjs.org/state-toggle/-/state-toggle-1.0.3.tgz" - integrity sha512-d/5Z4/2iiCnHw6Xzghyhb+GcmF89bxwgXG60wjIiZaxnymbyOmI8Hk4VqHXiVVp6u2ysaskFfXg3ekCj4WNftQ== +srcset@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/srcset/-/srcset-4.0.0.tgz#336816b665b14cd013ba545b6fe62357f86e65f4" + integrity sha512-wvLeHgcVHKO8Sc/H/5lkGreJQVeYMm9rlmt8PuR1xE31rIuXhuzznUUqAt8MqLhB3MqJdFzlNAfpcWnxiFUcPw== statuses@2.0.1: version "2.0.1" - resolved "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== "statuses@>= 1.4.0 < 2": version "1.5.0" - resolved "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA== std-env@^3.0.1: - version "3.1.1" - resolved "https://registry.npmjs.org/std-env/-/std-env-3.1.1.tgz" - integrity sha512-/c645XdExBypL01TpFKiG/3RAa/Qmu+zRi0MwAmrdEkwHNuN0ebo8ccAXBBDa5Z0QOJgBskUIbuCK91x0sCVEw== + version "3.7.0" + resolved "https://registry.yarnpkg.com/std-env/-/std-env-3.7.0.tgz#c9f7386ced6ecf13360b6c6c55b8aaa4ef7481d2" + integrity sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg== stream-browserify@^3.0.0: version "3.0.0" - resolved "https://registry.npmjs.org/stream-browserify/-/stream-browserify-3.0.0.tgz" + resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-3.0.0.tgz#22b0a2850cdf6503e73085da1fc7b7d0c2122f2f" integrity sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA== dependencies: inherits "~2.0.4" @@ -9521,7 +10531,7 @@ stream-browserify@^3.0.0: stream-http@^3.2.0: version "3.2.0" - resolved "https://registry.npmjs.org/stream-http/-/stream-http-3.2.0.tgz" + resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-3.2.0.tgz#1872dfcf24cb15752677e40e5c3f9cc1926028b5" integrity sha512-Oq1bLqisTyK3TSCXpPbT4sdeYNdmyZJv1LxpEm2vu1ZhK89kSE5YXwZc3cWk0MagGaKriBh9mCFbVGtO+vY29A== dependencies: builtin-status-codes "^3.0.0" @@ -9529,18 +10539,27 @@ stream-http@^3.2.0: readable-stream "^3.6.0" xtend "^4.0.2" -string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.2, string-width@^4.2.3: +"string-width-cjs@npm:string-width@^4.2.0": version "4.2.3" - resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== dependencies: emoji-regex "^8.0.0" is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.1" -string-width@^5.0.1: +string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +string-width@^5.0.1, string-width@^5.1.2: version "5.1.2" - resolved "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== dependencies: eastasianwidth "^0.2.0" @@ -9549,159 +10568,163 @@ string-width@^5.0.1: string_decoder@^1.1.1, string_decoder@^1.3.0: version "1.3.0" - resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== dependencies: safe-buffer "~5.2.0" string_decoder@~1.1.1: version "1.1.1" - resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== dependencies: safe-buffer "~5.1.0" +stringify-entities@^4.0.0: + version "4.0.4" + resolved "https://registry.yarnpkg.com/stringify-entities/-/stringify-entities-4.0.4.tgz#b3b79ef5f277cc4ac73caeb0236c5ba939b3a4f3" + integrity sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg== + dependencies: + character-entities-html4 "^2.0.0" + character-entities-legacy "^3.0.0" + stringify-object@^3.3.0: version "3.3.0" - resolved "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz" + resolved "https://registry.yarnpkg.com/stringify-object/-/stringify-object-3.3.0.tgz#703065aefca19300d3ce88af4f5b3956d7556629" integrity sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw== dependencies: get-own-enumerable-property-symbols "^3.0.0" is-obj "^1.0.1" is-regexp "^1.0.0" +"strip-ansi-cjs@npm:strip-ansi@^6.0.1": + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + strip-ansi@^6.0.0, strip-ansi@^6.0.1: version "6.0.1" - resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== dependencies: ansi-regex "^5.0.1" strip-ansi@^7.0.1: - version "7.0.1" - resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz" - integrity sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw== + version "7.1.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" + integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ== dependencies: ansi-regex "^6.0.1" strip-bom-string@^1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz" + resolved "https://registry.yarnpkg.com/strip-bom-string/-/strip-bom-string-1.0.0.tgz#e5211e9224369fbb81d633a2f00044dc8cedad92" integrity sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g== strip-final-newline@^2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz" + resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== strip-json-comments@^3.1.1: version "3.1.1" - resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== strip-json-comments@~2.0.1: version "2.0.1" - resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" integrity sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ== -style-to-object@0.3.0, style-to-object@^0.3.0: - version "0.3.0" - resolved "https://registry.npmjs.org/style-to-object/-/style-to-object-0.3.0.tgz" - integrity sha512-CzFnRRXhzWIdItT3OmF8SQfWyahHhjq3HwcMNCNLn+N7klOOqPjMeG/4JSu77D7ypZdGvSzvkrbyeTMizz2VrA== +style-to-object@^0.4.0, style-to-object@^0.4.1: + version "0.4.4" + resolved "https://registry.yarnpkg.com/style-to-object/-/style-to-object-0.4.4.tgz#266e3dfd56391a7eefb7770423612d043c3f33ec" + integrity sha512-HYNoHZa2GorYNyqiCaBgsxvcJIn7OHq6inEga+E6Ke3m5JkoqpQbnFssk4jwe+K7AhGa2fcha4wSOf1Kn01dMg== dependencies: inline-style-parser "0.1.1" -style-to-object@^0.4.0: - version "0.4.1" - resolved "https://registry.npmjs.org/style-to-object/-/style-to-object-0.4.1.tgz" - integrity sha512-HFpbb5gr2ypci7Qw+IOhnP2zOU7e77b+rzM+wTzXzfi1PrtBCX0E7Pk4wL4iTLnhzZ+JgEGAhX81ebTg/aYjQw== +style-to-object@^1.0.0: + version "1.0.6" + resolved "https://registry.yarnpkg.com/style-to-object/-/style-to-object-1.0.6.tgz#0c28aed8be1813d166c60d962719b2907c26547b" + integrity sha512-khxq+Qm3xEyZfKd/y9L3oIWQimxuc4STrQKtQn8aSDRHb8mFgpukgX1hdzfrMEW6JCjyJ8p89x+IUMVnCBI1PA== dependencies: - inline-style-parser "0.1.1" + inline-style-parser "0.2.3" -stylehacks@^5.1.1: - version "5.1.1" - resolved "https://registry.npmjs.org/stylehacks/-/stylehacks-5.1.1.tgz" - integrity sha512-sBpcd5Hx7G6seo7b1LkpttvTz7ikD0LlH5RmdcBNb6fFR0Fl7LQwHDFr300q4cwUqi+IYrFGmsIHieMBfnN/Bw== +stylehacks@^6.1.1: + version "6.1.1" + resolved "https://registry.yarnpkg.com/stylehacks/-/stylehacks-6.1.1.tgz#543f91c10d17d00a440430362d419f79c25545a6" + integrity sha512-gSTTEQ670cJNoaeIp9KX6lZmm8LJ3jPB5yJmX8Zq/wQxOsAFXV3qjWzHas3YYk1qesuVIyYWWUpZ0vSE/dTSGg== dependencies: - browserslist "^4.21.4" - postcss-selector-parser "^6.0.4" + browserslist "^4.23.0" + postcss-selector-parser "^6.0.16" -sucrase@^3.21.0, sucrase@^3.29.0: - version "3.31.0" - resolved "https://registry.npmjs.org/sucrase/-/sucrase-3.31.0.tgz" - integrity sha512-6QsHnkqyVEzYcaiHsOKkzOtOgdJcb8i54x6AV2hDwyZcY9ZyykGZVw6L/YN98xC0evwTP6utsWWrKRaa8QlfEQ== +stylis@^4.1.3: + version "4.3.2" + resolved "https://registry.yarnpkg.com/stylis/-/stylis-4.3.2.tgz#8f76b70777dd53eb669c6f58c997bf0a9972e444" + integrity sha512-bhtUjWd/z6ltJiQwg0dUfxEJ+W+jdqQd8TbWLWyeIJHlnsqmGLRFFd8e5mA0AZi/zx90smXRlN66YMTcaSFifg== + +sucrase@^3.31.0, sucrase@^3.32.0: + version "3.35.0" + resolved "https://registry.yarnpkg.com/sucrase/-/sucrase-3.35.0.tgz#57f17a3d7e19b36d8995f06679d121be914ae263" + integrity sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA== dependencies: + "@jridgewell/gen-mapping" "^0.3.2" commander "^4.0.0" - glob "7.1.6" + glob "^10.3.10" lines-and-columns "^1.1.6" mz "^2.7.0" pirates "^4.0.1" ts-interface-checker "^0.1.9" -superagent@^7.1.6: - version "7.1.6" - resolved "https://registry.npmjs.org/superagent/-/superagent-7.1.6.tgz" - integrity sha512-gZkVCQR1gy/oUXr+kxJMLDjla434KmSOKbx5iGD30Ql+AkJQ/YlPKECJy2nhqOsHLjGHzoDTXNSjhnvWhzKk7g== - dependencies: - component-emitter "^1.3.0" - cookiejar "^2.1.3" - debug "^4.3.4" - fast-safe-stringify "^2.1.1" - form-data "^4.0.0" - formidable "^2.0.1" - methods "^1.1.2" - mime "2.6.0" - qs "^6.10.3" - readable-stream "^3.6.0" - semver "^7.3.7" - supports-color@^5.3.0: version "5.5.0" - resolved "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== dependencies: has-flag "^3.0.0" supports-color@^7.1.0: version "7.2.0" - resolved "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== dependencies: has-flag "^4.0.0" supports-color@^8.0.0: version "8.1.1" - resolved "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== dependencies: has-flag "^4.0.0" supports-preserve-symlinks-flag@^1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz" + resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== svg-parser@^2.0.4: version "2.0.4" - resolved "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz" + resolved "https://registry.yarnpkg.com/svg-parser/-/svg-parser-2.0.4.tgz#fdc2e29e13951736140b76cb122c8ee6630eb6b5" integrity sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ== -svgo@^2.7.0, svgo@^2.8.0: - version "2.8.0" - resolved "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz" - integrity sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg== +svgo@^3.0.2, svgo@^3.2.0: + version "3.3.2" + resolved "https://registry.yarnpkg.com/svgo/-/svgo-3.3.2.tgz#ad58002652dffbb5986fc9716afe52d869ecbda8" + integrity sha512-OoohrmuUlBs8B8o6MB2Aevn+pRIH9zDALSR+6hhqVfa6fRwG/Qw9VUMSMW9VNg2CFc/MTIfabtdOVl9ODIJjpw== dependencies: "@trysound/sax" "0.2.0" commander "^7.2.0" - css-select "^4.1.3" - css-tree "^1.1.3" - csso "^4.2.0" + css-select "^5.1.0" + css-tree "^2.3.1" + css-what "^6.1.0" + csso "^5.0.5" picocolors "^1.0.0" - stable "^0.1.8" swagger2openapi@^7.0.8: version "7.0.8" - resolved "https://registry.npmjs.org/swagger2openapi/-/swagger2openapi-7.0.8.tgz" + resolved "https://registry.yarnpkg.com/swagger2openapi/-/swagger2openapi-7.0.8.tgz#12c88d5de776cb1cbba758994930f40ad0afac59" integrity sha512-upi/0ZGkYgEcLeGieoz8gT74oWHA0E7JivX7aN9mAf+Tc7BQoRBvnIGHoPDw+f9TXTW4s6kGYCZJtauP6OYp7g== dependencies: call-me-maybe "^1.0.1" @@ -9717,65 +10740,86 @@ swagger2openapi@^7.0.8: yargs "^17.0.1" swc-loader@^0.2.3: - version "0.2.3" - resolved "https://registry.npmjs.org/swc-loader/-/swc-loader-0.2.3.tgz" - integrity sha512-D1p6XXURfSPleZZA/Lipb3A8pZ17fP4NObZvFCDjK/OKljroqDpPmsBdTraWhVBqUNpcWBQY1imWdoPScRlQ7A== + version "0.2.6" + resolved "https://registry.yarnpkg.com/swc-loader/-/swc-loader-0.2.6.tgz#bf0cba8eeff34bb19620ead81d1277fefaec6bc8" + integrity sha512-9Zi9UP2YmDpgmQVbyOPJClY0dwf58JDyDMQ7uRc4krmc72twNI2fvlBWHLqVekBpPc7h5NJkGVT1zNDxFrqhvg== + dependencies: + "@swc/counter" "^0.1.3" tailwindcss@^3.2.4: - version "3.3.1" - resolved "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.3.1.tgz" - integrity sha512-Vkiouc41d4CEq0ujXl6oiGFQ7bA3WEhUZdTgXAhtKxSy49OmKs8rEfQmupsfF0IGW8fv2iQkp1EVUuapCFrZ9g== + version "3.4.4" + resolved "https://registry.yarnpkg.com/tailwindcss/-/tailwindcss-3.4.4.tgz#351d932273e6abfa75ce7d226b5bf3a6cb257c05" + integrity sha512-ZoyXOdJjISB7/BcLTR6SEsLgKtDStYyYZVLsUtWChO4Ps20CBad7lfJKVDiejocV4ME1hLmyY0WJE3hSDcmQ2A== dependencies: + "@alloc/quick-lru" "^5.2.0" arg "^5.0.2" chokidar "^3.5.3" - color-name "^1.1.4" didyoumean "^1.2.2" dlv "^1.1.3" - fast-glob "^3.2.12" + fast-glob "^3.3.0" glob-parent "^6.0.2" is-glob "^4.0.3" - jiti "^1.17.2" - lilconfig "^2.0.6" + jiti "^1.21.0" + lilconfig "^2.1.0" micromatch "^4.0.5" normalize-path "^3.0.0" object-hash "^3.0.0" picocolors "^1.0.0" - postcss "^8.0.9" - postcss-import "^14.1.0" - postcss-js "^4.0.0" - postcss-load-config "^3.1.4" - postcss-nested "6.0.0" + postcss "^8.4.23" + postcss-import "^15.1.0" + postcss-js "^4.0.1" + postcss-load-config "^4.0.1" + postcss-nested "^6.0.1" postcss-selector-parser "^6.0.11" - postcss-value-parser "^4.2.0" - quick-lru "^5.1.1" - resolve "^1.22.1" - sucrase "^3.29.0" + resolve "^1.22.2" + sucrase "^3.32.0" tapable@^1.0.0: version "1.1.3" - resolved "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2" integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA== -tapable@^2.0.0, tapable@^2.1.1, tapable@^2.2.0: +tapable@^2.0.0, tapable@^2.1.1, tapable@^2.2.0, tapable@^2.2.1: version "2.2.1" - resolved "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== -terser-webpack-plugin@^5.3.3, terser-webpack-plugin@^5.3.7: - version "5.3.9" - resolved "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.9.tgz" - integrity sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA== +tar-fs@2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-2.1.1.tgz#489a15ab85f1f0befabb370b7de4f9eb5cbe8784" + integrity sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng== dependencies: - "@jridgewell/trace-mapping" "^0.3.17" + chownr "^1.1.1" + mkdirp-classic "^0.5.2" + pump "^3.0.0" + tar-stream "^2.1.4" + +tar-stream@^2.1.4: + version "2.2.0" + resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.2.0.tgz#acad84c284136b060dc3faa64474aa9aebd77287" + integrity sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ== + dependencies: + bl "^4.0.3" + end-of-stream "^1.4.1" + fs-constants "^1.0.0" + inherits "^2.0.3" + readable-stream "^3.1.1" + +terser-webpack-plugin@^5.3.10, terser-webpack-plugin@^5.3.9: + version "5.3.10" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz#904f4c9193c6fd2a03f693a2150c62a92f40d199" + integrity sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w== + dependencies: + "@jridgewell/trace-mapping" "^0.3.20" jest-worker "^27.4.5" schema-utils "^3.1.1" serialize-javascript "^6.0.1" - terser "^5.16.8" + terser "^5.26.0" -terser@^5.10.0, terser@^5.16.8: - version "5.19.2" - resolved "https://registry.npmjs.org/terser/-/terser-5.19.2.tgz" - integrity sha512-qC5+dmecKJA4cpYxRa5aVkKehYsQKc+AHeKl0Oe62aYjBL8ZA33tTljktDHJSaxxMnbI5ZYw+o/S2DxxLu8OfA== +terser@^5.10.0, terser@^5.15.1, terser@^5.26.0: + version "5.31.1" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.31.1.tgz#735de3c987dd671e95190e6b98cfe2f07f3cf0d4" + integrity sha512-37upzU1+viGvuFtBo9NPufCb9dwM0+l9hMxYyWfBA+fbwrPqNJAhbZ6W47bBFnZHKHTUBnMvi87434qq+qnxOg== dependencies: "@jridgewell/source-map" "^0.3.3" acorn "^8.8.2" @@ -9784,135 +10828,125 @@ terser@^5.10.0, terser@^5.16.8: text-table@^0.2.0: version "0.2.0" - resolved "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz" + resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== thenify-all@^1.0.0: version "1.6.0" - resolved "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz" + resolved "https://registry.yarnpkg.com/thenify-all/-/thenify-all-1.6.0.tgz#1a1918d402d8fc3f98fbf234db0bcc8cc10e9726" integrity sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA== dependencies: thenify ">= 3.1.0 < 4" "thenify@>= 3.1.0 < 4": version "3.3.1" - resolved "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz" + resolved "https://registry.yarnpkg.com/thenify/-/thenify-3.3.1.tgz#8932e686a4066038a016dd9e2ca46add9838a95f" integrity sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw== dependencies: any-promise "^1.0.0" +through@^2.3.8: + version "2.3.8" + resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== + thunky@^1.0.2: version "1.1.0" - resolved "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz" + resolved "https://registry.yarnpkg.com/thunky/-/thunky-1.1.0.tgz#5abaf714a9405db0504732bbccd2cedd9ef9537d" integrity sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA== timers-browserify@^2.0.12: version "2.0.12" - resolved "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.12.tgz" + resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.12.tgz#44a45c11fbf407f34f97bccd1577c652361b00ee" integrity sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ== dependencies: setimmediate "^1.0.4" tiny-invariant@^1.0.2: - version "1.2.0" - resolved "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.2.0.tgz" - integrity sha512-1Uhn/aqw5C6RI4KejVeTg6mIS7IqxnLJ8Mv2tV5rTc0qWobay7pDUz6Wi392Cnc8ak1H0F2cjoRzb2/AW4+Fvg== + version "1.3.3" + resolved "https://registry.yarnpkg.com/tiny-invariant/-/tiny-invariant-1.3.3.tgz#46680b7a873a0d5d10005995eb90a70d74d60127" + integrity sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg== tiny-warning@^1.0.0: version "1.0.3" - resolved "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz" + resolved "https://registry.yarnpkg.com/tiny-warning/-/tiny-warning-1.0.3.tgz#94a30db453df4c643d0fd566060d60a875d84754" integrity sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA== to-fast-properties@^2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== -to-readable-stream@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz" - integrity sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q== - to-regex-range@^5.0.1: version "5.0.1" - resolved "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== dependencies: is-number "^7.0.0" toggle-selection@^1.0.6: version "1.0.6" - resolved "https://registry.npmjs.org/toggle-selection/-/toggle-selection-1.0.6.tgz" + resolved "https://registry.yarnpkg.com/toggle-selection/-/toggle-selection-1.0.6.tgz#6e45b1263f2017fa0acc7d89d78b15b8bf77da32" integrity sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ== toidentifier@1.0.1: version "1.0.1" - resolved "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz" + resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== -totalist@^1.0.0: - version "1.1.0" - resolved "https://registry.npmjs.org/totalist/-/totalist-1.1.0.tgz" - integrity sha512-gduQwd1rOdDMGxFG1gEvhV88Oirdo2p+KjoYFU7k2g+i7n6AFFbDQ5kMPUsW0pNbfQsB/cwXvT1i4Bue0s9g5g== +totalist@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/totalist/-/totalist-3.0.1.tgz#ba3a3d600c915b1a97872348f79c127475f6acf8" + integrity sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ== tr46@~0.0.3: version "0.0.3" - resolved "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== trim-lines@^3.0.0: version "3.0.1" - resolved "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz" + resolved "https://registry.yarnpkg.com/trim-lines/-/trim-lines-3.0.1.tgz#d802e332a07df861c48802c04321017b1bd87338" integrity sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg== -trim-trailing-lines@^1.0.0: - version "1.1.4" - resolved "https://registry.npmjs.org/trim-trailing-lines/-/trim-trailing-lines-1.1.4.tgz" - integrity sha512-rjUWSqnfTNrjbB9NQWfPMH/xRK1deHeGsHoVfpxJ++XeYXE0d6B1En37AHfw3jtfTU7dzMzZL2jjpe8Qb5gLIQ== - -trim@0.0.1: - version "0.0.1" - resolved "https://registry.npmjs.org/trim/-/trim-0.0.1.tgz" - integrity sha512-YzQV+TZg4AxpKxaTHK3c3D+kRDCGVEE7LemdlQZoQXn0iennk10RsIoY6ikzAqJTc9Xjl9C1/waHom/J86ziAQ== - -trough@^1.0.0: - version "1.0.5" - resolved "https://registry.npmjs.org/trough/-/trough-1.0.5.tgz" - integrity sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA== - trough@^2.0.0: - version "2.1.0" - resolved "https://registry.npmjs.org/trough/-/trough-2.1.0.tgz" - integrity sha512-AqTiAOLcj85xS7vQ8QkAV41hPDIJ71XJB4RCUrzo/1GM2CQwhkJGaf9Hgr7BOugMRpgGUrqRg/DrBDl4H40+8g== + version "2.2.0" + resolved "https://registry.yarnpkg.com/trough/-/trough-2.2.0.tgz#94a60bd6bd375c152c1df911a4b11d5b0256f50f" + integrity sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw== + +ts-dedent@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/ts-dedent/-/ts-dedent-2.2.0.tgz#39e4bd297cd036292ae2394eb3412be63f563bb5" + integrity sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ== ts-interface-checker@^0.1.9: version "0.1.13" - resolved "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz" + resolved "https://registry.yarnpkg.com/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz#784fd3d679722bc103b1b4b8030bcddb5db2a699" integrity sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA== -tslib@^2.0.3, tslib@^2.1.0, tslib@^2.4.0: - version "2.6.2" - resolved "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz" - integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== +tslib@^2.0.3, tslib@^2.1.0, tslib@^2.6.0: + version "2.6.3" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.3.tgz#0438f810ad7a9edcde7a241c3d80db693c8cbfe0" + integrity sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ== tty-browserify@^0.0.1: version "0.0.1" - resolved "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.1.tgz" + resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.1.tgz#3f05251ee17904dfd0677546670db9651682b811" integrity sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw== -type-fest@^0.20.2: - version "0.20.2" - resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz" - integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== +type-fest@^1.0.1: + version "1.4.0" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-1.4.0.tgz#e9fb813fe3bf1744ec359d55d1affefa76f14be1" + integrity sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA== -type-fest@^2.14.0, type-fest@^2.5.0: +type-fest@^2.13.0, type-fest@^2.14.0, type-fest@^2.5.0: version "2.19.0" - resolved "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-2.19.0.tgz#88068015bb33036a598b952e55e9311a60fd3a9b" integrity sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA== type-is@~1.6.18: version "1.6.18" - resolved "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz" + resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== dependencies: media-typer "0.3.0" @@ -9920,67 +10954,55 @@ type-is@~1.6.18: typedarray-to-buffer@^3.1.5: version "3.1.5" - resolved "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz" + resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q== dependencies: is-typedarray "^1.0.0" -ua-parser-js@^0.7.30: - version "0.7.35" - resolved "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.35.tgz" - integrity sha512-veRf7dawaj9xaWEu9HoTVn5Pggtc/qj+kqTOFvNiN1l0YdxwC1kvel57UCjThjGa3BHBihE8/UJAHI+uQHmd/g== - -unherit@^1.0.4: - version "1.1.3" - resolved "https://registry.npmjs.org/unherit/-/unherit-1.1.3.tgz" - integrity sha512-Ft16BJcnapDKp0+J/rqFC3Rrk6Y/Ng4nzsC028k2jdDII/rdZ7Wd3pPT/6+vIIxRagwRc9K0IUX0Ra4fKvw+WQ== +unbzip2-stream@1.4.3: + version "1.4.3" + resolved "https://registry.yarnpkg.com/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz#b0da04c4371311df771cdc215e87f2130991ace7" + integrity sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg== dependencies: - inherits "^2.0.0" - xtend "^4.0.0" + buffer "^5.2.1" + through "^2.3.8" + +undici-types@~5.26.4: + version "5.26.5" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" + integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== unicode-canonical-property-names-ecmascript@^2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz" + resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz#301acdc525631670d39f6146e0e77ff6bbdebddc" integrity sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ== +unicode-emoji-modifier-base@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unicode-emoji-modifier-base/-/unicode-emoji-modifier-base-1.0.0.tgz#dbbd5b54ba30f287e2a8d5a249da6c0cef369459" + integrity sha512-yLSH4py7oFH3oG/9K+XWrz1pSi3dfUrWEnInbxMfArOfc1+33BlGPQtLsOYwvdMy11AwUBetYuaRxSPqgkq+8g== + unicode-match-property-ecmascript@^2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz" + resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz#54fd16e0ecb167cf04cf1f756bdcc92eba7976c3" integrity sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q== dependencies: unicode-canonical-property-names-ecmascript "^2.0.0" unicode-property-aliases-ecmascript "^2.0.0" -unicode-match-property-value-ecmascript@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.0.0.tgz" - integrity sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw== - unicode-match-property-value-ecmascript@^2.1.0: version "2.1.0" - resolved "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz" + resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz#cb5fffdcd16a05124f5a4b0bf7c3770208acbbe0" integrity sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA== unicode-property-aliases-ecmascript@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.0.0.tgz" - integrity sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ== - -unified@9.2.0: - version "9.2.0" - resolved "https://registry.npmjs.org/unified/-/unified-9.2.0.tgz" - integrity sha512-vx2Z0vY+a3YoTj8+pttM3tiJHCwY5UFbYdiWrwBEbHmK8pvsPj2rtAX2BFfgXen8T39CJWblWRDT4L5WGXtDdg== - dependencies: - bail "^1.0.0" - extend "^3.0.0" - is-buffer "^2.0.0" - is-plain-obj "^2.0.0" - trough "^1.0.0" - vfile "^4.0.0" + version "2.1.0" + resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz#43d41e3be698bd493ef911077c9b131f827e8ccd" + integrity sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w== unified@^10.0.0: version "10.1.2" - resolved "https://registry.npmjs.org/unified/-/unified-10.1.2.tgz" + resolved "https://registry.yarnpkg.com/unified/-/unified-10.1.2.tgz#b1d64e55dafe1f0b98bb6c719881103ecf6c86df" integrity sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q== dependencies: "@types/unist" "^2.0.0" @@ -9991,237 +11013,219 @@ unified@^10.0.0: trough "^2.0.0" vfile "^5.0.0" -unified@^9.2.2: - version "9.2.2" - resolved "https://registry.npmjs.org/unified/-/unified-9.2.2.tgz" - integrity sha512-Sg7j110mtefBD+qunSLO1lqOEKdrwBFBrR6Qd8f4uwkhWNlbkaqwHse6e7QvD3AP/MNoJdEDLaf8OxYyoWgorQ== +unified@^11.0.0, unified@^11.0.3, unified@^11.0.4: + version "11.0.4" + resolved "https://registry.yarnpkg.com/unified/-/unified-11.0.4.tgz#f4be0ac0fe4c88cb873687c07c64c49ed5969015" + integrity sha512-apMPnyLjAX+ty4OrNap7yumyVAMlKx5IWU2wlzzUdYJO9A8f1p9m/gywF/GM2ZDFcjQPrx59Mc90KwmxsoklxQ== dependencies: - bail "^1.0.0" + "@types/unist" "^3.0.0" + bail "^2.0.0" + devlop "^1.0.0" extend "^3.0.0" - is-buffer "^2.0.0" - is-plain-obj "^2.0.0" - trough "^1.0.0" - vfile "^4.0.0" + is-plain-obj "^4.0.0" + trough "^2.0.0" + vfile "^6.0.0" -unique-string@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz" - integrity sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg== +unique-string@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-3.0.0.tgz#84a1c377aff5fd7a8bc6b55d8244b2bd90d75b9a" + integrity sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ== dependencies: - crypto-random-string "^2.0.0" - -unist-builder@2.0.3, unist-builder@^2.0.0: - version "2.0.3" - resolved "https://registry.npmjs.org/unist-builder/-/unist-builder-2.0.3.tgz" - integrity sha512-f98yt5pnlMWlzP539tPc4grGMsFaQQlP/vM396b00jngsiINumNmsY8rkXjfoi1c6QaM8nQ3vaGDuoKWbe/1Uw== - -unist-util-generated@^1.0.0: - version "1.1.6" - resolved "https://registry.npmjs.org/unist-util-generated/-/unist-util-generated-1.1.6.tgz" - integrity sha512-cln2Mm1/CZzN5ttGK7vkoGw+RZ8VcUH6BtGbq98DDtRGquAAOXig1mrBQYelOwMXYS8rK+vZDyyojSjp7JX+Lg== + crypto-random-string "^4.0.0" unist-util-generated@^2.0.0: version "2.0.1" - resolved "https://registry.npmjs.org/unist-util-generated/-/unist-util-generated-2.0.1.tgz" + resolved "https://registry.yarnpkg.com/unist-util-generated/-/unist-util-generated-2.0.1.tgz#e37c50af35d3ed185ac6ceacb6ca0afb28a85cae" integrity sha512-qF72kLmPxAw0oN2fwpWIqbXAVyEqUzDHMsbtPvOudIlUzXYFIeQIuxXQCRCFh22B7cixvU0MG7m3MW8FTq/S+A== -unist-util-is@^4.0.0: - version "4.1.0" - resolved "https://registry.npmjs.org/unist-util-is/-/unist-util-is-4.1.0.tgz" - integrity sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg== - unist-util-is@^5.0.0: version "5.2.1" - resolved "https://registry.npmjs.org/unist-util-is/-/unist-util-is-5.2.1.tgz" + resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-5.2.1.tgz#b74960e145c18dcb6226bc57933597f5486deae9" integrity sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw== dependencies: "@types/unist" "^2.0.0" -unist-util-position@^3.0.0: - version "3.1.0" - resolved "https://registry.npmjs.org/unist-util-position/-/unist-util-position-3.1.0.tgz" - integrity sha512-w+PkwCbYSFw8vpgWD0v7zRCl1FpY3fjDSQ3/N/wNd9Ffa4gPi8+4keqt99N3XW6F99t/mUzp2xAhNmfKWp95QA== +unist-util-is@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-6.0.0.tgz#b775956486aff107a9ded971d996c173374be424" + integrity sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw== + dependencies: + "@types/unist" "^3.0.0" + +unist-util-position-from-estree@^1.0.0, unist-util-position-from-estree@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/unist-util-position-from-estree/-/unist-util-position-from-estree-1.1.2.tgz#8ac2480027229de76512079e377afbcabcfcce22" + integrity sha512-poZa0eXpS+/XpoQwGwl79UUdea4ol2ZuCYguVaJS4qzIOMDzbqz8a3erUCOmubSZkaOuGamb3tX790iwOIROww== + dependencies: + "@types/unist" "^2.0.0" + +unist-util-position-from-estree@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unist-util-position-from-estree/-/unist-util-position-from-estree-2.0.0.tgz#d94da4df596529d1faa3de506202f0c9a23f2200" + integrity sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ== + dependencies: + "@types/unist" "^3.0.0" unist-util-position@^4.0.0: version "4.0.4" - resolved "https://registry.npmjs.org/unist-util-position/-/unist-util-position-4.0.4.tgz" + resolved "https://registry.yarnpkg.com/unist-util-position/-/unist-util-position-4.0.4.tgz#93f6d8c7d6b373d9b825844645877c127455f037" integrity sha512-kUBE91efOWfIVBo8xzh/uZQ7p9ffYRtUbMRZBNFYwf0RK8koUMx6dGUfwylLOKmaT2cs4wSW96QoYUSXAyEtpg== dependencies: "@types/unist" "^2.0.0" -unist-util-remove-position@^2.0.0: - version "2.0.1" - resolved "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-2.0.1.tgz" - integrity sha512-fDZsLYIe2uT+oGFnuZmy73K6ZxOPG/Qcm+w7jbEjaFcJgbQ6cqjs/eSPzXhsmGpAsWPkqZM9pYjww5QTn3LHMA== +unist-util-position@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/unist-util-position/-/unist-util-position-5.0.0.tgz#678f20ab5ca1207a97d7ea8a388373c9cf896be4" + integrity sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA== dependencies: - unist-util-visit "^2.0.0" + "@types/unist" "^3.0.0" -unist-util-remove@^2.0.0: - version "2.1.0" - resolved "https://registry.npmjs.org/unist-util-remove/-/unist-util-remove-2.1.0.tgz" - integrity sha512-J8NYPyBm4baYLdCbjmf1bhPu45Cr1MWTm77qd9istEkzWpnN6O9tMsEbB2JhNnBCqGENRqEWomQ+He6au0B27Q== +unist-util-remove-position@^4.0.0: + version "4.0.2" + resolved "https://registry.yarnpkg.com/unist-util-remove-position/-/unist-util-remove-position-4.0.2.tgz#a89be6ea72e23b1a402350832b02a91f6a9afe51" + integrity sha512-TkBb0HABNmxzAcfLf4qsIbFbaPDvMO6wa3b3j4VcEzFVaw1LBKwnW4/sRJ/atSLSzoIg41JWEdnE7N6DIhGDGQ== dependencies: - unist-util-is "^4.0.0" + "@types/unist" "^2.0.0" + unist-util-visit "^4.0.0" -unist-util-stringify-position@^2.0.0: - version "2.0.3" - resolved "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz" - integrity sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g== +unist-util-remove-position@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/unist-util-remove-position/-/unist-util-remove-position-5.0.0.tgz#fea68a25658409c9460408bc6b4991b965b52163" + integrity sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q== dependencies: - "@types/unist" "^2.0.2" + "@types/unist" "^3.0.0" + unist-util-visit "^5.0.0" unist-util-stringify-position@^3.0.0: version "3.0.3" - resolved "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz" + resolved "https://registry.yarnpkg.com/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz#03ad3348210c2d930772d64b489580c13a7db39d" integrity sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg== dependencies: "@types/unist" "^2.0.0" -unist-util-visit-parents@^3.0.0: - version "3.1.1" - resolved "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-3.1.1.tgz" - integrity sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg== +unist-util-stringify-position@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz#449c6e21a880e0855bf5aabadeb3a740314abac2" + integrity sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ== dependencies: - "@types/unist" "^2.0.0" - unist-util-is "^4.0.0" + "@types/unist" "^3.0.0" unist-util-visit-parents@^5.1.1: version "5.1.3" - resolved "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-5.1.3.tgz" + resolved "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-5.1.3.tgz#b4520811b0ca34285633785045df7a8d6776cfeb" integrity sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg== dependencies: "@types/unist" "^2.0.0" unist-util-is "^5.0.0" -unist-util-visit@2.0.3, unist-util-visit@^2.0.0, unist-util-visit@^2.0.3: - version "2.0.3" - resolved "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-2.0.3.tgz" - integrity sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q== +unist-util-visit-parents@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz#4d5f85755c3b8f0dc69e21eca5d6d82d22162815" + integrity sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw== dependencies: - "@types/unist" "^2.0.0" - unist-util-is "^4.0.0" - unist-util-visit-parents "^3.0.0" + "@types/unist" "^3.0.0" + unist-util-is "^6.0.0" unist-util-visit@^4.0.0: version "4.1.2" - resolved "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.2.tgz" + resolved "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-4.1.2.tgz#125a42d1eb876283715a3cb5cceaa531828c72e2" integrity sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg== dependencies: "@types/unist" "^2.0.0" unist-util-is "^5.0.0" unist-util-visit-parents "^5.1.1" +unist-util-visit@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-5.0.0.tgz#a7de1f31f72ffd3519ea71814cccf5fd6a9217d6" + integrity sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg== + dependencies: + "@types/unist" "^3.0.0" + unist-util-is "^6.0.0" + unist-util-visit-parents "^6.0.0" + universalify@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz" - integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== + version "2.0.1" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.1.tgz#168efc2180964e6386d061e094df61afe239b18d" + integrity sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw== unpipe@1.0.0, unpipe@~1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz" + resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== -update-browserslist-db@^1.0.11: - version "1.0.12" - resolved "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.12.tgz" - integrity sha512-tE1smlR58jxbFMtrMpFNRmsrOXlpNXss965T1CrpwuZUzUAg/TBQc94SpyhDLSzrqrJS9xTRBthnZAGcE1oaxg== +update-browserslist-db@^1.0.16: + version "1.0.16" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.16.tgz#f6d489ed90fb2f07d67784eb3f53d7891f736356" + integrity sha512-KVbTxlBYlckhF5wgfyZXTWnMn7MMZjMu9XG8bPlliUOP9ThaF4QnhP8qrjrH7DRzHfSk0oQv1wToW+iA5GajEQ== dependencies: - escalade "^3.1.1" - picocolors "^1.0.0" + escalade "^3.1.2" + picocolors "^1.0.1" -update-notifier@^5.1.0: - version "5.1.0" - resolved "https://registry.npmjs.org/update-notifier/-/update-notifier-5.1.0.tgz" - integrity sha512-ItnICHbeMh9GqUy31hFPrD1kcuZ3rpxDZbf4KUDavXwS0bW5m7SLbDQpGX3UYr072cbrF5hFUs3r5tUsPwjfHw== +update-notifier@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-6.0.2.tgz#a6990253dfe6d5a02bd04fbb6a61543f55026b60" + integrity sha512-EDxhTEVPZZRLWYcJ4ZXjGFN0oP7qYvbXWzEgRm/Yql4dHX5wDbvh89YHP6PK1lzZJYrMtXUuZZz8XGK+U6U1og== dependencies: - boxen "^5.0.0" - chalk "^4.1.0" - configstore "^5.0.1" - has-yarn "^2.1.0" - import-lazy "^2.1.0" - is-ci "^2.0.0" + boxen "^7.0.0" + chalk "^5.0.1" + configstore "^6.0.0" + has-yarn "^3.0.0" + import-lazy "^4.0.0" + is-ci "^3.0.1" is-installed-globally "^0.4.0" - is-npm "^5.0.0" - is-yarn-global "^0.3.0" - latest-version "^5.1.0" - pupa "^2.1.1" - semver "^7.3.4" - semver-diff "^3.1.1" - xdg-basedir "^4.0.0" + is-npm "^6.0.0" + is-yarn-global "^0.4.0" + latest-version "^7.0.0" + pupa "^3.1.0" + semver "^7.3.7" + semver-diff "^4.0.0" + xdg-basedir "^5.1.0" -uri-js@^4.2.2: +uri-js@^4.2.2, uri-js@^4.4.1: version "4.4.1" - resolved "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== dependencies: punycode "^2.1.0" url-loader@^4.1.1: version "4.1.1" - resolved "https://registry.npmjs.org/url-loader/-/url-loader-4.1.1.tgz" + resolved "https://registry.yarnpkg.com/url-loader/-/url-loader-4.1.1.tgz#28505e905cae158cf07c92ca622d7f237e70a4e2" integrity sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA== dependencies: loader-utils "^2.0.0" mime-types "^2.1.27" schema-utils "^3.0.0" -url-parse-lax@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz" - integrity sha512-NjFKA0DidqPa5ciFcSrXnAltTtzz84ogy+NebPvfEgAck0+TNg4UJ4IN+fB7zRZfbgUf0syOo9MDxFkDSMuFaQ== - dependencies: - prepend-http "^2.0.0" - -url-template@^3.0.0: - version "3.1.0" - resolved "https://registry.npmjs.org/url-template/-/url-template-3.1.0.tgz" - integrity sha512-vB/eHWttzhN+NZzk9FcQB2h1cSEgb7zDYyvyxPhw02LYw7YqIzO+w1AqkcKvZ51gPH8o4+nyiWve/xuQqMdJZw== - url@^0.11.0: - version "0.11.0" - resolved "https://registry.npmjs.org/url/-/url-0.11.0.tgz" - integrity sha512-kbailJa29QrtXnxgq+DdCEGlbTeYM2eJUxsz6vjZavrCYPMIFHMKQmSKYAIuUK2i7hgPm28a8piX5NTUtM/LKQ== + version "0.11.3" + resolved "https://registry.yarnpkg.com/url/-/url-0.11.3.tgz#6f495f4b935de40ce4a0a52faee8954244f3d3ad" + integrity sha512-6hxOLGfZASQK/cijlZnZJTq8OXAkt/3YGfQX45vvMYXpZoo8NdWZcY73K108Jf759lS1Bv/8wXnHDTSz17dSRw== dependencies: - punycode "1.3.2" - querystring "0.2.0" - -use-composed-ref@^1.3.0: - version "1.3.0" - resolved "https://registry.npmjs.org/use-composed-ref/-/use-composed-ref-1.3.0.tgz" - integrity sha512-GLMG0Jc/jiKov/3Ulid1wbv3r54K9HlMW29IWcDFPEqFkSO2nS0MuefWgMJpeHQ9YJeXDL3ZUF+P3jdXlZX/cQ== + punycode "^1.4.1" + qs "^6.11.2" use-editable@^2.3.3: version "2.3.3" - resolved "https://registry.npmjs.org/use-editable/-/use-editable-2.3.3.tgz" + resolved "https://registry.yarnpkg.com/use-editable/-/use-editable-2.3.3.tgz#a292fe9ba4c291cd28d1cc2728c75a5fc8d9a33f" integrity sha512-7wVD2JbfAFJ3DK0vITvXBdpd9JAz5BcKAAolsnLBuBn6UDDwBGuCIAGvR3yA2BNKm578vAMVHFCWaOcA+BhhiA== -use-isomorphic-layout-effect@^1.1.1: - version "1.1.2" - resolved "https://registry.npmjs.org/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.1.2.tgz" - integrity sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA== - -use-latest@^1.2.1: - version "1.2.1" - resolved "https://registry.npmjs.org/use-latest/-/use-latest-1.2.1.tgz" - integrity sha512-xA+AVm/Wlg3e2P/JiItTziwS7FK92LWrDB0p+hgXloIMuVCeJJ8v6f0eeHyPZaJrM+usM1FkFfbNCrJGs8A/zw== - dependencies: - use-isomorphic-layout-effect "^1.1.1" - util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: version "1.0.2" - resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== util@^0.10.3: version "0.10.4" - resolved "https://registry.npmjs.org/util/-/util-0.10.4.tgz" + resolved "https://registry.yarnpkg.com/util/-/util-0.10.4.tgz#3aa0125bfe668a4672de58857d3ace27ecb76901" integrity sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A== dependencies: inherits "2.0.3" -util@^0.12.0, util@^0.12.4: +util@^0.12.4, util@^0.12.5: version "0.12.5" - resolved "https://registry.npmjs.org/util/-/util-0.12.5.tgz" + resolved "https://registry.yarnpkg.com/util/-/util-0.12.5.tgz#5f17a6059b73db61a875668781a1c2b136bd6fbc" integrity sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA== dependencies: inherits "^2.0.3" @@ -10232,27 +11236,32 @@ util@^0.12.0, util@^0.12.4: utila@~0.4: version "0.4.0" - resolved "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz" + resolved "https://registry.yarnpkg.com/utila/-/utila-0.4.0.tgz#8a16a05d445657a3aea5eecc5b12a4fa5379772c" integrity sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA== utility-types@^3.10.0: - version "3.10.0" - resolved "https://registry.npmjs.org/utility-types/-/utility-types-3.10.0.tgz" - integrity sha512-O11mqxmi7wMKCo6HKFt5AhO4BwY3VV68YU07tgxfz8zJTIxr4BpsezN49Ffwy9j3ZpwwJp4fkRwjRzq3uWE6Rg== + version "3.11.0" + resolved "https://registry.yarnpkg.com/utility-types/-/utility-types-3.11.0.tgz#607c40edb4f258915e901ea7995607fdf319424c" + integrity sha512-6Z7Ma2aVEWisaL6TvBCy7P8rm2LQoPv6dJ7ecIaIixHcwfbJ0x7mWdbcwlIM5IGQxPZSFYeqRCqlOOeKoJYMkw== utils-merge@1.0.1: version "1.0.1" - resolved "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz" + resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== uuid@8.3.2, uuid@^8.3.2: version "8.3.2" - resolved "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== +uuid@^9.0.0: + version "9.0.1" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-9.0.1.tgz#e188d4c8853cc722220392c424cd637f32293f30" + integrity sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA== + uvu@^0.5.0: version "0.5.6" - resolved "https://registry.npmjs.org/uvu/-/uvu-0.5.6.tgz" + resolved "https://registry.yarnpkg.com/uvu/-/uvu-0.5.6.tgz#2754ca20bcb0bb59b64e9985e84d2e81058502df" integrity sha512-+g8ENReyr8YsOc6fv/NVJs2vFdHBnBNdfE49rshrTzDWOlUx4Gq7KOS2GD8eqhy2j+Ejq29+SbKH8yjkAqXqoA== dependencies: dequal "^2.0.0" @@ -10262,7 +11271,7 @@ uvu@^0.5.0: validate-peer-dependencies@^2.2.0: version "2.2.0" - resolved "https://registry.npmjs.org/validate-peer-dependencies/-/validate-peer-dependencies-2.2.0.tgz" + resolved "https://registry.yarnpkg.com/validate-peer-dependencies/-/validate-peer-dependencies-2.2.0.tgz#47b8ff008f66a66fc5d8699123844522c1d874f4" integrity sha512-8X1OWlERjiUY6P6tdeU9E0EwO8RA3bahoOVG7ulOZT5MqgNDUO/BQoVjYiHPcNe+v8glsboZRIw9iToMAA2zAA== dependencies: resolve-package-path "^4.0.3" @@ -10270,17 +11279,17 @@ validate-peer-dependencies@^2.2.0: validate.io-array@^1.0.3: version "1.0.6" - resolved "https://registry.npmjs.org/validate.io-array/-/validate.io-array-1.0.6.tgz" + resolved "https://registry.yarnpkg.com/validate.io-array/-/validate.io-array-1.0.6.tgz#5b5a2cafd8f8b85abb2f886ba153f2d93a27774d" integrity sha512-DeOy7CnPEziggrOO5CZhVKJw6S3Yi7e9e65R1Nl/RTN1vTQKnzjfvks0/8kQ40FP/dsjRAOd4hxmJ7uLa6vxkg== validate.io-function@^1.0.2: version "1.0.2" - resolved "https://registry.npmjs.org/validate.io-function/-/validate.io-function-1.0.2.tgz" + resolved "https://registry.yarnpkg.com/validate.io-function/-/validate.io-function-1.0.2.tgz#343a19802ed3b1968269c780e558e93411c0bad7" integrity sha512-LlFybRJEriSuBnUhQyG5bwglhh50EpTL2ul23MPIuR1odjO7XaMLFV8vHGwp7AZciFxtYOeiSCT5st+XSPONiQ== validate.io-integer-array@^1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/validate.io-integer-array/-/validate.io-integer-array-1.0.0.tgz" + resolved "https://registry.yarnpkg.com/validate.io-integer-array/-/validate.io-integer-array-1.0.0.tgz#2cabde033293a6bcbe063feafe91eaf46b13a089" integrity sha512-mTrMk/1ytQHtCY0oNO3dztafHYyGU88KL+jRxWuzfOmQb+4qqnWmI+gykvGp8usKZOM0H7keJHEbRaFiYA0VrA== dependencies: validate.io-array "^1.0.3" @@ -10288,68 +11297,61 @@ validate.io-integer-array@^1.0.0: validate.io-integer@^1.0.4: version "1.0.5" - resolved "https://registry.npmjs.org/validate.io-integer/-/validate.io-integer-1.0.5.tgz" + resolved "https://registry.yarnpkg.com/validate.io-integer/-/validate.io-integer-1.0.5.tgz#168496480b95be2247ec443f2233de4f89878068" integrity sha512-22izsYSLojN/P6bppBqhgUDjCkr5RY2jd+N2a3DCAUey8ydvrZ/OkGvFPR7qfOpwR2LC5p4Ngzxz36g5Vgr/hQ== dependencies: validate.io-number "^1.0.3" validate.io-number@^1.0.3: version "1.0.3" - resolved "https://registry.npmjs.org/validate.io-number/-/validate.io-number-1.0.3.tgz" + resolved "https://registry.yarnpkg.com/validate.io-number/-/validate.io-number-1.0.3.tgz#f63ffeda248bf28a67a8d48e0e3b461a1665baf8" integrity sha512-kRAyotcbNaSYoDnXvb4MHg/0a1egJdLwS6oJ38TJY7aw9n93Fl/3blIXdyYvPOp55CNxywooG/3BcrwNrBpcSg== value-equal@^1.0.1: version "1.0.1" - resolved "https://registry.npmjs.org/value-equal/-/value-equal-1.0.1.tgz" + resolved "https://registry.yarnpkg.com/value-equal/-/value-equal-1.0.1.tgz#1e0b794c734c5c0cade179c437d356d931a34d6c" integrity sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw== vary@~1.1.2: version "1.1.2" - resolved "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz" + resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== -vfile-location@^3.0.0, vfile-location@^3.2.0: - version "3.2.0" - resolved "https://registry.npmjs.org/vfile-location/-/vfile-location-3.2.0.tgz" - integrity sha512-aLEIZKv/oxuCDZ8lkJGhuhztf/BW4M+iHdCwglA/eWc+vtuRFJj8EtgceYFX4LRjOhCAAiNHsKGssC6onJ+jbA== - vfile-location@^4.0.0: version "4.1.0" - resolved "https://registry.npmjs.org/vfile-location/-/vfile-location-4.1.0.tgz" + resolved "https://registry.yarnpkg.com/vfile-location/-/vfile-location-4.1.0.tgz#69df82fb9ef0a38d0d02b90dd84620e120050dd0" integrity sha512-YF23YMyASIIJXpktBa4vIGLJ5Gs88UB/XePgqPmTa7cDA+JeO3yclbpheQYCHjVHBn/yePzrXuygIL+xbvRYHw== dependencies: "@types/unist" "^2.0.0" vfile "^5.0.0" -vfile-message@^2.0.0: - version "2.0.4" - resolved "https://registry.npmjs.org/vfile-message/-/vfile-message-2.0.4.tgz" - integrity sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ== +vfile-location@^5.0.0: + version "5.0.2" + resolved "https://registry.yarnpkg.com/vfile-location/-/vfile-location-5.0.2.tgz#220d9ca1ab6f8b2504a4db398f7ebc149f9cb464" + integrity sha512-NXPYyxyBSH7zB5U6+3uDdd6Nybz6o6/od9rk8bp9H8GR3L+cm/fC0uUTbqBmUTnMCUDslAGBOIKNfvvb+gGlDg== dependencies: - "@types/unist" "^2.0.0" - unist-util-stringify-position "^2.0.0" + "@types/unist" "^3.0.0" + vfile "^6.0.0" vfile-message@^3.0.0: version "3.1.4" - resolved "https://registry.npmjs.org/vfile-message/-/vfile-message-3.1.4.tgz" + resolved "https://registry.yarnpkg.com/vfile-message/-/vfile-message-3.1.4.tgz#15a50816ae7d7c2d1fa87090a7f9f96612b59dea" integrity sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw== dependencies: "@types/unist" "^2.0.0" unist-util-stringify-position "^3.0.0" -vfile@^4.0.0: - version "4.2.1" - resolved "https://registry.npmjs.org/vfile/-/vfile-4.2.1.tgz" - integrity sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA== +vfile-message@^4.0.0: + version "4.0.2" + resolved "https://registry.yarnpkg.com/vfile-message/-/vfile-message-4.0.2.tgz#c883c9f677c72c166362fd635f21fc165a7d1181" + integrity sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw== dependencies: - "@types/unist" "^2.0.0" - is-buffer "^2.0.0" - unist-util-stringify-position "^2.0.0" - vfile-message "^2.0.0" + "@types/unist" "^3.0.0" + unist-util-stringify-position "^4.0.0" vfile@^5.0.0: version "5.3.7" - resolved "https://registry.npmjs.org/vfile/-/vfile-5.3.7.tgz" + resolved "https://registry.yarnpkg.com/vfile/-/vfile-5.3.7.tgz#de0677e6683e3380fafc46544cfe603118826ab7" integrity sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g== dependencies: "@types/unist" "^2.0.0" @@ -10357,14 +11359,23 @@ vfile@^5.0.0: unist-util-stringify-position "^3.0.0" vfile-message "^3.0.0" +vfile@^6.0.0, vfile@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/vfile/-/vfile-6.0.1.tgz#1e8327f41eac91947d4fe9d237a2dd9209762536" + integrity sha512-1bYqc7pt6NIADBJ98UiG0Bn/CHIVOoZ/IyEkqIruLg0mE1BKzkOXY2D6CSqQIcKqgadppE5lrxgWXJmXd7zZJw== + dependencies: + "@types/unist" "^3.0.0" + unist-util-stringify-position "^4.0.0" + vfile-message "^4.0.0" + vm-browserify@^1.1.2: version "1.1.2" - resolved "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz" + resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.2.tgz#78641c488b8e6ca91a75f511e7a3b32a86e5dda0" integrity sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ== -wait-on@6.0.1, wait-on@^6.0.1: +wait-on@6.0.1: version "6.0.1" - resolved "https://registry.npmjs.org/wait-on/-/wait-on-6.0.1.tgz" + resolved "https://registry.yarnpkg.com/wait-on/-/wait-on-6.0.1.tgz#16bbc4d1e4ebdd41c5b4e63a2e16dbd1f4e5601e" integrity sha512-zht+KASY3usTY5u2LgaNqn/Cd8MukxLGjdcZxT2ns5QzDmTFc4XoWBgC+C/na+sMRZTuVygQoMYwdcVjHnYIVw== dependencies: axios "^0.25.0" @@ -10375,71 +11386,74 @@ wait-on@6.0.1, wait-on@^6.0.1: warning@^4.0.3: version "4.0.3" - resolved "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz" + resolved "https://registry.yarnpkg.com/warning/-/warning-4.0.3.tgz#16e9e077eb8a86d6af7d64aa1e05fd85b4678ca3" integrity sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w== dependencies: loose-envify "^1.0.0" -watchpack@^2.4.0: - version "2.4.0" - resolved "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz" - integrity sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg== +watchpack@^2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.4.1.tgz#29308f2cac150fa8e4c92f90e0ec954a9fed7fff" + integrity sha512-8wrBCMtVhqcXP2Sup1ctSkga6uc2Bx0IIvKyT7yTFier5AXHooSI+QyQQAtTb7+E0IUCCKyTFmXqdqgum2XWGg== dependencies: glob-to-regexp "^0.4.1" graceful-fs "^4.1.2" wbuf@^1.1.0, wbuf@^1.7.3: version "1.7.3" - resolved "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz" + resolved "https://registry.yarnpkg.com/wbuf/-/wbuf-1.7.3.tgz#c1d8d149316d3ea852848895cb6a0bfe887b87df" integrity sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA== dependencies: minimalistic-assert "^1.0.0" -web-namespaces@^1.0.0: - version "1.1.4" - resolved "https://registry.npmjs.org/web-namespaces/-/web-namespaces-1.1.4.tgz" - integrity sha512-wYxSGajtmoP4WxfejAPIr4l0fVh+jeMXZb08wNc0tMg6xsfZXj3cECqIK0G7ZAqUq0PP8WlMDtaOGVBTAWztNw== - web-namespaces@^2.0.0: version "2.0.1" - resolved "https://registry.npmjs.org/web-namespaces/-/web-namespaces-2.0.1.tgz" + resolved "https://registry.yarnpkg.com/web-namespaces/-/web-namespaces-2.0.1.tgz#1010ff7c650eccb2592cebeeaf9a1b253fd40692" integrity sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ== +web-worker@^1.2.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/web-worker/-/web-worker-1.3.0.tgz#e5f2df5c7fe356755a5fb8f8410d4312627e6776" + integrity sha512-BSR9wyRsy/KOValMgd5kMyr3JzpdeoR9KVId8u5GVlTTAtNChlsE4yTxeY7zMdNSyOmoKBv8NH2qeRY9Tg+IaA== + webidl-conversions@^3.0.0: version "3.0.1" - resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== -webpack-bundle-analyzer@^4.5.0: - version "4.5.0" - resolved "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.5.0.tgz" - integrity sha512-GUMZlM3SKwS8Z+CKeIFx7CVoHn3dXFcUAjT/dcZQQmfSZGvitPfMob2ipjai7ovFFqPvTqkEZ/leL4O0YOdAYQ== +webpack-bundle-analyzer@^4.9.0: + version "4.10.2" + resolved "https://registry.yarnpkg.com/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.10.2.tgz#633af2862c213730be3dbdf40456db171b60d5bd" + integrity sha512-vJptkMm9pk5si4Bv922ZbKLV8UTT4zib4FPgXMhgzUny0bfDDkLXAVQs3ly3fS4/TN9ROFtb0NFrm04UXFE/Vw== dependencies: + "@discoveryjs/json-ext" "0.5.7" acorn "^8.0.4" acorn-walk "^8.0.0" - chalk "^4.1.0" commander "^7.2.0" + debounce "^1.2.1" + escape-string-regexp "^4.0.0" gzip-size "^6.0.0" - lodash "^4.17.20" + html-escaper "^2.0.2" opener "^1.5.2" - sirv "^1.0.7" + picocolors "^1.0.0" + sirv "^2.0.3" ws "^7.3.1" -webpack-dev-middleware@^5.3.1: - version "5.3.1" - resolved "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.1.tgz" - integrity sha512-81EujCKkyles2wphtdrnPg/QqegC/AtqNH//mQkBYSMqwFVCQrxM6ktB2O/SPlZy7LqeEfTbV3cZARGQz6umhg== +webpack-dev-middleware@^5.3.4: + version "5.3.4" + resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-5.3.4.tgz#eb7b39281cbce10e104eb2b8bf2b63fce49a3517" + integrity sha512-BVdTqhhs+0IfoeAf7EoH5WE+exCmqGerHfDM0IL096Px60Tq2Mn9MAbnaGUe6HiMa41KMCYF19gyzZmBcq/o4Q== dependencies: colorette "^2.0.10" - memfs "^3.4.1" + memfs "^3.4.3" mime-types "^2.1.31" range-parser "^1.2.1" schema-utils "^4.0.0" -webpack-dev-server@^4.9.3: - version "4.11.1" - resolved "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.11.1.tgz" - integrity sha512-lILVz9tAUy1zGFwieuaQtYiadImb5M3d+H+L1zDYalYoDl0cksAB1UNyuE5MMWJrG6zR1tXkCP2fitl7yoUJiw== +webpack-dev-server@^4.15.1: + version "4.15.2" + resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-4.15.2.tgz#9e0c70a42a012560860adb186986da1248333173" + integrity sha512-0XavAZbNJ5sDrCbkpWL8mia0o5WPOd2YGtxrEiZkBK9FjLppIUK2TgxK6qGD2P3hUXTJNNPVibrerKcx5WkR1g== dependencies: "@types/bonjour" "^3.5.9" "@types/connect-history-api-fallback" "^1.3.5" @@ -10447,7 +11461,7 @@ webpack-dev-server@^4.9.3: "@types/serve-index" "^1.9.1" "@types/serve-static" "^1.13.10" "@types/sockjs" "^0.3.33" - "@types/ws" "^8.5.1" + "@types/ws" "^8.5.5" ansi-html-community "^0.0.8" bonjour-service "^1.0.11" chokidar "^3.5.3" @@ -10460,6 +11474,7 @@ webpack-dev-server@^4.9.3: html-entities "^2.3.2" http-proxy-middleware "^2.0.3" ipaddr.js "^2.0.1" + launch-editor "^2.6.0" open "^8.0.9" p-retry "^4.5.0" rimraf "^3.0.2" @@ -10468,55 +11483,56 @@ webpack-dev-server@^4.9.3: serve-index "^1.9.1" sockjs "^0.3.24" spdy "^4.0.2" - webpack-dev-middleware "^5.3.1" - ws "^8.4.2" + webpack-dev-middleware "^5.3.4" + ws "^8.13.0" -webpack-merge@^5.8.0: - version "5.8.0" - resolved "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz" - integrity sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q== +webpack-merge@^5.9.0: + version "5.10.0" + resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-5.10.0.tgz#a3ad5d773241e9c682803abf628d4cd62b8a4177" + integrity sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA== dependencies: clone-deep "^4.0.1" + flat "^5.0.2" wildcard "^2.0.0" -webpack-sources@^3.2.2, webpack-sources@^3.2.3: +webpack-sources@^3.2.3: version "3.2.3" - resolved "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz" + resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-3.2.3.tgz#2d4daab8451fd4b240cc27055ff6a0c2ccea0cde" integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w== -webpack@^5.61.0, webpack@^5.73.0: - version "5.88.2" - resolved "https://registry.npmjs.org/webpack/-/webpack-5.88.2.tgz" - integrity sha512-JmcgNZ1iKj+aiR0OvTYtWQqJwq37Pf683dY9bVORwVbUrDhLhdn/PlO2sHsFHPkj7sHNQF3JwaAkp49V+Sq1tQ== +webpack@^5.61.0, webpack@^5.88.1: + version "5.92.0" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.92.0.tgz#cc114c71e6851d220b1feaae90159ed52c876bdf" + integrity sha512-Bsw2X39MYIgxouNATyVpCNVWBCuUwDgWtN78g6lSdPJRLaQ/PUVm/oXcaRAyY/sMFoKFQrsPeqvTizWtq7QPCA== dependencies: "@types/eslint-scope" "^3.7.3" - "@types/estree" "^1.0.0" - "@webassemblyjs/ast" "^1.11.5" - "@webassemblyjs/wasm-edit" "^1.11.5" - "@webassemblyjs/wasm-parser" "^1.11.5" + "@types/estree" "^1.0.5" + "@webassemblyjs/ast" "^1.12.1" + "@webassemblyjs/wasm-edit" "^1.12.1" + "@webassemblyjs/wasm-parser" "^1.12.1" acorn "^8.7.1" - acorn-import-assertions "^1.9.0" - browserslist "^4.14.5" + acorn-import-attributes "^1.9.5" + browserslist "^4.21.10" chrome-trace-event "^1.0.2" - enhanced-resolve "^5.15.0" + enhanced-resolve "^5.17.0" es-module-lexer "^1.2.1" eslint-scope "5.1.1" events "^3.2.0" glob-to-regexp "^0.4.1" - graceful-fs "^4.2.9" + graceful-fs "^4.2.11" json-parse-even-better-errors "^2.3.1" loader-runner "^4.2.0" mime-types "^2.1.27" neo-async "^2.6.2" schema-utils "^3.2.0" tapable "^2.1.1" - terser-webpack-plugin "^5.3.7" - watchpack "^2.4.0" + terser-webpack-plugin "^5.3.10" + watchpack "^2.4.1" webpack-sources "^3.2.3" webpackbar@^5.0.2: version "5.0.2" - resolved "https://registry.npmjs.org/webpackbar/-/webpackbar-5.0.2.tgz" + resolved "https://registry.yarnpkg.com/webpackbar/-/webpackbar-5.0.2.tgz#d3dd466211c73852741dfc842b7556dcbc2b0570" integrity sha512-BmFJo7veBDgQzfWXl/wwYXr/VFus0614qZ8i9znqcl9fnEdiVkdbi0TedLQ6xAK92HZHDJ0QmyQ0fmuZPAgCYQ== dependencies: chalk "^4.1.0" @@ -10526,7 +11542,7 @@ webpackbar@^5.0.2: websocket-driver@>=0.5.1, websocket-driver@^0.7.4: version "0.7.4" - resolved "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz" + resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.4.tgz#89ad5295bbf64b480abcba31e4953aca706f5760" integrity sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg== dependencies: http-parser-js ">=0.5.1" @@ -10535,69 +11551,71 @@ websocket-driver@>=0.5.1, websocket-driver@^0.7.4: websocket-extensions@>=0.1.1: version "0.1.4" - resolved "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz" + resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.4.tgz#7f8473bc839dfd87608adb95d7eb075211578a42" integrity sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg== whatwg-url@^5.0.0: version "5.0.0" - resolved "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== dependencies: tr46 "~0.0.3" webidl-conversions "^3.0.0" which-module@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz" - integrity sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q== + version "2.0.1" + resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.1.tgz#776b1fe35d90aebe99e8ac15eb24093389a4a409" + integrity sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ== -which-typed-array@^1.1.11, which-typed-array@^1.1.2: - version "1.1.11" - resolved "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.11.tgz" - integrity sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew== +which-typed-array@^1.1.14, which-typed-array@^1.1.2: + version "1.1.15" + resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.15.tgz#264859e9b11a649b388bfaaf4f767df1f779b38d" + integrity sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA== dependencies: - available-typed-arrays "^1.0.5" - call-bind "^1.0.2" + available-typed-arrays "^1.0.7" + call-bind "^1.0.7" for-each "^0.3.3" gopd "^1.0.1" - has-tostringtag "^1.0.0" + has-tostringtag "^1.0.2" which@^1.3.1: version "1.3.1" - resolved "https://registry.npmjs.org/which/-/which-1.3.1.tgz" + resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== dependencies: isexe "^2.0.0" which@^2.0.1: version "2.0.2" - resolved "https://registry.npmjs.org/which/-/which-2.0.2.tgz" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== dependencies: isexe "^2.0.0" -widest-line@^3.1.0: - version "3.1.0" - resolved "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz" - integrity sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg== - dependencies: - string-width "^4.0.0" - widest-line@^4.0.1: version "4.0.1" - resolved "https://registry.npmjs.org/widest-line/-/widest-line-4.0.1.tgz" + resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-4.0.1.tgz#a0fc673aaba1ea6f0a0d35b3c2795c9a9cc2ebf2" integrity sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig== dependencies: string-width "^5.0.1" wildcard@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz" - integrity sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw== + version "2.0.1" + resolved "https://registry.yarnpkg.com/wildcard/-/wildcard-2.0.1.tgz#5ab10d02487198954836b6349f74fff961e10f67" + integrity sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ== + +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" wrap-ansi@^6.2.0: version "6.2.0" - resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== dependencies: ansi-styles "^4.0.0" @@ -10606,17 +11624,17 @@ wrap-ansi@^6.2.0: wrap-ansi@^7.0.0: version "7.0.0" - resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== dependencies: ansi-styles "^4.0.0" string-width "^4.1.0" strip-ansi "^6.0.0" -wrap-ansi@^8.0.1: - version "8.0.1" - resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.0.1.tgz" - integrity sha512-QFF+ufAqhoYHvoHdajT/Po7KoXVBPXS2bgjIam5isfWJPfIOnQZ50JtUiVvCv/sjgacf3yRrt2ZKUZ/V4itN4g== +wrap-ansi@^8.0.1, wrap-ansi@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" + integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ== dependencies: ansi-styles "^6.1.0" string-width "^5.0.1" @@ -10624,12 +11642,12 @@ wrap-ansi@^8.0.1: wrappy@1: version "1.0.2" - resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== -write-file-atomic@^3.0.0: +write-file-atomic@^3.0.3: version "3.0.3" - resolved "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-3.0.3.tgz#56bd5c5a5c70481cd19c571bd39ab965a5de56e8" integrity sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q== dependencies: imurmurhash "^0.1.4" @@ -10637,78 +11655,88 @@ write-file-atomic@^3.0.0: signal-exit "^3.0.2" typedarray-to-buffer "^3.1.5" +ws@8.9.0: + version "8.9.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.9.0.tgz#2a994bb67144be1b53fe2d23c53c028adeb7f45e" + integrity sha512-Ja7nszREasGaYUYCI2k4lCKIRTt+y7XuqVoHR44YpI49TtryyqbqvDMn5eqfW7e6HzTukDRIsXqzVHScqRcafg== + ws@^7.3.1: - version "7.5.9" - resolved "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz" - integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== + version "7.5.10" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.10.tgz#58b5c20dc281633f6c19113f39b349bd8bd558d9" + integrity sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ== -ws@^8.4.2: - version "8.10.0" - resolved "https://registry.npmjs.org/ws/-/ws-8.10.0.tgz" - integrity sha512-+s49uSmZpvtAsd2h37vIPy1RBusaLawVe8of+GyEPsaJTCMpj/2v8NpeK1SHXjBlQ95lQTmQofOJnFiLoaN3yw== +ws@^8.13.0: + version "8.17.1" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.17.1.tgz#9293da530bb548febc95371d90f9c878727d919b" + integrity sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ== -xdg-basedir@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz" - integrity sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q== +xdg-basedir@^5.0.1, xdg-basedir@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-5.1.0.tgz#1efba19425e73be1bc6f2a6ceb52a3d2c884c0c9" + integrity sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ== xml-formatter@^2.6.1: version "2.6.1" - resolved "https://registry.npmjs.org/xml-formatter/-/xml-formatter-2.6.1.tgz" + resolved "https://registry.yarnpkg.com/xml-formatter/-/xml-formatter-2.6.1.tgz#066ef3a100bd58ee3b943f0c503be63176d3d497" integrity sha512-dOiGwoqm8y22QdTNI7A+N03tyVfBlQ0/oehAzxIZtwnFAHGeSlrfjF73YQvzSsa/Kt6+YZasKsrdu6OIpuBggw== dependencies: xml-parser-xo "^3.2.0" xml-js@^1.6.11: version "1.6.11" - resolved "https://registry.npmjs.org/xml-js/-/xml-js-1.6.11.tgz" + resolved "https://registry.yarnpkg.com/xml-js/-/xml-js-1.6.11.tgz#927d2f6947f7f1c19a316dd8eea3614e8b18f8e9" integrity sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g== dependencies: sax "^1.2.4" xml-parser-xo@^3.2.0: version "3.2.0" - resolved "https://registry.npmjs.org/xml-parser-xo/-/xml-parser-xo-3.2.0.tgz" + resolved "https://registry.yarnpkg.com/xml-parser-xo/-/xml-parser-xo-3.2.0.tgz#c633ab55cf1976d6b03ab4a6a85045093ac32b73" integrity sha512-8LRU6cq+d7mVsoDaMhnkkt3CTtAs4153p49fRo+HIB3I1FD1o5CeXRjRH29sQevIfVJIcPjKSsPU/+Ujhq09Rg== -xtend@^4.0.0, xtend@^4.0.1, xtend@^4.0.2: +xtend@^4.0.2: version "4.0.2" - resolved "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== y18n@^4.0.0: version "4.0.3" - resolved "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.3.tgz#b5f259c82cd6e336921efd7bfd8bf560de9eeedf" integrity sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ== y18n@^5.0.5: version "5.0.8" - resolved "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== yallist@^3.0.2: version "3.1.1" - resolved "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== yallist@^4.0.0: version "4.0.0" - resolved "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== yaml-ast-parser@0.0.43: version "0.0.43" - resolved "https://registry.npmjs.org/yaml-ast-parser/-/yaml-ast-parser-0.0.43.tgz" + resolved "https://registry.yarnpkg.com/yaml-ast-parser/-/yaml-ast-parser-0.0.43.tgz#e8a23e6fb4c38076ab92995c5dca33f3d3d7c9bb" integrity sha512-2PTINUwsRqSd+s8XxKaJWQlUuEMHJQyEuh2edBbW8KNJz0SJPwUSD2zRWqezFEdN7IzAgeuYHFUCF7o8zRdZ0A== -yaml@1.10.2, yaml@^1.10.0, yaml@^1.10.2, yaml@^1.7.2: +yaml@1.10.2, yaml@^1.10.0, yaml@^1.7.2: version "1.10.2" - resolved "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== +yaml@^2.3.4: + version "2.4.5" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.4.5.tgz#60630b206dd6d84df97003d33fc1ddf6296cca5e" + integrity sha512-aBx2bnqDzVOyNKfsysjA2ms5ZlnjSAW2eG3/L5G/CSujfjLJTJsEw1bGw8kCf04KodQWk1pxlGnZ56CRxiawmg== + yargs-parser@^18.1.2: version "18.1.3" - resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.3.tgz#be68c4975c6b2abf469236b0c870362fab09a7b0" integrity sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ== dependencies: camelcase "^5.0.0" @@ -10716,12 +11744,12 @@ yargs-parser@^18.1.2: yargs-parser@^21.1.1: version "21.1.1" - resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== yargs@^15.3.1: version "15.4.1" - resolved "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.4.1.tgz#0d87a16de01aee9d8bec2bfbf74f67851730f4f8" integrity sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A== dependencies: cliui "^6.0.0" @@ -10737,9 +11765,9 @@ yargs@^15.3.1: yargs-parser "^18.1.2" yargs@^17.0.1: - version "17.7.1" - resolved "https://registry.npmjs.org/yargs/-/yargs-17.7.1.tgz" - integrity sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw== + version "17.7.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" + integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== dependencies: cliui "^8.0.1" escalade "^3.1.1" @@ -10749,17 +11777,25 @@ yargs@^17.0.1: y18n "^5.0.5" yargs-parser "^21.1.1" +yauzl@^2.10.0: + version "2.10.0" + resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.10.0.tgz#c7eb17c93e112cb1086fa6d8e51fb0667b79a5f9" + integrity sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g== + dependencies: + buffer-crc32 "~0.2.3" + fd-slicer "~1.1.0" + yocto-queue@^0.1.0: version "0.1.0" - resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== -zwitch@^1.0.0: - version "1.0.5" - resolved "https://registry.npmjs.org/zwitch/-/zwitch-1.0.5.tgz" - integrity sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw== +yocto-queue@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-1.0.0.tgz#7f816433fb2cbc511ec8bf7d263c3b58a1a3c251" + integrity sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g== zwitch@^2.0.0: version "2.0.4" - resolved "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz" + resolved "https://registry.yarnpkg.com/zwitch/-/zwitch-2.0.4.tgz#c827d4b0acb76fc3e685a4c6ec2902d51070e9d7" integrity sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A== diff --git a/proto/zitadel/admin.proto b/proto/zitadel/admin.proto index cc336f5875..a141569ea7 100644 --- a/proto/zitadel/admin.proto +++ b/proto/zitadel/admin.proto @@ -61,6 +61,9 @@ option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_swagger) = { { name: "Failed Events" }, + { + name: "Feature Restrictions" + }, { name: "General" }, diff --git a/proto/zitadel/auth.proto b/proto/zitadel/auth.proto index 5e5dcd6fb9..0eae6d24e5 100644 --- a/proto/zitadel/auth.proto +++ b/proto/zitadel/auth.proto @@ -48,6 +48,9 @@ option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_swagger) = { { name: "User Authentication Factor" }, + { + name: "User Authorizations/Grants" + }, { name: "User Email" }, diff --git a/proto/zitadel/system.proto b/proto/zitadel/system.proto index 5d090b5c5d..8e199aa505 100644 --- a/proto/zitadel/system.proto +++ b/proto/zitadel/system.proto @@ -36,6 +36,15 @@ option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_swagger) = { tags: [ { name: "General" + }, + { + name: "Usage Control" + }, + { + name: "Limits" + }, + { + name: "Quotas" } ]; schemes: HTTPS; From 669ac6bda2fec49c667974e4787aa3d33ddb02b6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim=20M=C3=B6hlmann?= Date: Thu, 20 Jun 2024 16:31:58 +0300 Subject: [PATCH 42/44] perf(import): do not check for existing grant ID (#8164) # Which Problems Are Solved Improve the performance of the `admin/v1/import` API endpoint. Specifaclly the import of large amount of project grants. # How the Problems Are Solved `AddProjectGrantWithID` and `AddProjectGrantMember` methods of `Commands` used to get the current state of the Writemodel to check if the current GrantID or the combination of GrantID & UserID wasn't already used. However, the Added events already have protection against duplication by the `UniqueConstaint` methods. The queries become very slow when there is a great amount of project grants. Because all the events are pushed to the aggregate ID of the project, we had to obtain all related project events, including events of grantIDs we do not care about. This O(n) duration for bached import jobs adding many organization granted to a single project. This change removes the unnecesary state query to improve performance. # Additional Changes - Add integration tests for import # Additional Context - reported internally --- go.mod | 2 +- .../api/grpc/admin/import_integration_test.go | 492 ++++++++++++++++++ internal/command/project_grant.go | 8 - internal/command/project_grant_member.go | 7 - internal/command/project_grant_member_test.go | 54 -- internal/integration/assert.go | 36 ++ 6 files changed, 529 insertions(+), 70 deletions(-) create mode 100644 internal/api/grpc/admin/import_integration_test.go diff --git a/go.mod b/go.mod index 1f5bcc264e..cff93d4c84 100644 --- a/go.mod +++ b/go.mod @@ -179,7 +179,7 @@ require ( github.com/modern-go/reflect2 v1.0.2 // indirect github.com/muesli/clusters v0.0.0-20200529215643-2700303c1762 // indirect github.com/muesli/kmeans v0.3.1 // indirect - github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect + github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 github.com/prometheus/client_golang v1.19.1 github.com/prometheus/client_model v0.6.1 // indirect github.com/prometheus/common v0.54.0 // indirect diff --git a/internal/api/grpc/admin/import_integration_test.go b/internal/api/grpc/admin/import_integration_test.go new file mode 100644 index 0000000000..1ee7d7d88e --- /dev/null +++ b/internal/api/grpc/admin/import_integration_test.go @@ -0,0 +1,492 @@ +//go:build integration + +package admin_test + +import ( + "testing" + "time" + + "github.com/brianvoe/gofakeit/v6" + "github.com/google/uuid" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + + "github.com/zitadel/zitadel/internal/integration" + "github.com/zitadel/zitadel/pkg/grpc/admin" + "github.com/zitadel/zitadel/pkg/grpc/management" + v1 "github.com/zitadel/zitadel/pkg/grpc/v1" +) + +func TestServer_ImportData(t *testing.T) { + orgIDs := generateIDs(10) + projectIDs := generateIDs(10) + userIDs := generateIDs(10) + grantIDs := generateIDs(10) + + tests := []struct { + name string + req *admin.ImportDataRequest + want *admin.ImportDataResponse + wantErr bool + }{ + { + name: "success", + req: &admin.ImportDataRequest{ + Data: &admin.ImportDataRequest_DataOrgs{ + DataOrgs: &admin.ImportDataOrg{ + Orgs: []*admin.DataOrg{ + { + OrgId: orgIDs[0], + Org: &management.AddOrgRequest{ + Name: gofakeit.ProductName(), + }, + Projects: []*v1.DataProject{ + { + ProjectId: projectIDs[0], + Project: &management.AddProjectRequest{ + Name: gofakeit.AppName(), + ProjectRoleAssertion: true, + }, + }, + { + ProjectId: projectIDs[1], + Project: &management.AddProjectRequest{ + Name: gofakeit.AppName(), + ProjectRoleAssertion: false, + }, + }, + }, + ProjectRoles: []*management.AddProjectRoleRequest{ + { + ProjectId: projectIDs[0], + RoleKey: "role1", + DisplayName: "role1", + }, + { + ProjectId: projectIDs[0], + RoleKey: "role2", + DisplayName: "role2", + }, + { + ProjectId: projectIDs[1], + RoleKey: "role3", + DisplayName: "role3", + }, + { + ProjectId: projectIDs[1], + RoleKey: "role4", + DisplayName: "role4", + }, + }, + HumanUsers: []*v1.DataHumanUser{ + { + UserId: userIDs[0], + User: &management.ImportHumanUserRequest{ + UserName: gofakeit.Username(), + Profile: &management.ImportHumanUserRequest_Profile{ + FirstName: gofakeit.FirstName(), + LastName: gofakeit.LastName(), + DisplayName: gofakeit.Username(), + PreferredLanguage: gofakeit.LanguageBCP(), + }, + Email: &management.ImportHumanUserRequest_Email{ + Email: gofakeit.Email(), + IsEmailVerified: true, + }, + }, + }, + { + UserId: userIDs[1], + User: &management.ImportHumanUserRequest{ + UserName: gofakeit.Username(), + Profile: &management.ImportHumanUserRequest_Profile{ + FirstName: gofakeit.FirstName(), + LastName: gofakeit.LastName(), + DisplayName: gofakeit.Username(), + PreferredLanguage: gofakeit.LanguageBCP(), + }, + Email: &management.ImportHumanUserRequest_Email{ + Email: gofakeit.Email(), + IsEmailVerified: true, + }, + }, + }, + }, + ProjectGrants: []*v1.DataProjectGrant{ + { + GrantId: grantIDs[0], + ProjectGrant: &management.AddProjectGrantRequest{ + ProjectId: projectIDs[0], + GrantedOrgId: orgIDs[1], + RoleKeys: []string{"role1", "role2"}, + }, + }, + { + GrantId: grantIDs[1], + ProjectGrant: &management.AddProjectGrantRequest{ + ProjectId: projectIDs[1], + GrantedOrgId: orgIDs[1], + RoleKeys: []string{"role3", "role4"}, + }, + }, + { + GrantId: grantIDs[2], + ProjectGrant: &management.AddProjectGrantRequest{ + ProjectId: projectIDs[0], + GrantedOrgId: orgIDs[2], + RoleKeys: []string{"role1", "role2"}, + }, + }, + { + GrantId: grantIDs[3], + ProjectGrant: &management.AddProjectGrantRequest{ + ProjectId: projectIDs[1], + GrantedOrgId: orgIDs[2], + RoleKeys: []string{"role3", "role4"}, + }, + }, + }, + }, + { + OrgId: orgIDs[1], + Org: &management.AddOrgRequest{ + Name: gofakeit.ProductName(), + }, + UserGrants: []*management.AddUserGrantRequest{ + { + UserId: userIDs[0], + ProjectId: projectIDs[0], + ProjectGrantId: grantIDs[0], + }, + { + UserId: userIDs[0], + ProjectId: projectIDs[1], + ProjectGrantId: grantIDs[1], + }, + }, + }, + { + OrgId: orgIDs[2], + Org: &management.AddOrgRequest{ + Name: gofakeit.ProductName(), + }, + UserGrants: []*management.AddUserGrantRequest{ + { + UserId: userIDs[1], + ProjectId: projectIDs[0], + ProjectGrantId: grantIDs[2], + }, + { + UserId: userIDs[1], + ProjectId: projectIDs[1], + ProjectGrantId: grantIDs[3], + }, + }, + }, + }, + }, + }, + Timeout: time.Minute.String(), + }, + want: &admin.ImportDataResponse{ + Success: &admin.ImportDataSuccess{ + Orgs: []*admin.ImportDataSuccessOrg{ + { + OrgId: orgIDs[0], + ProjectIds: projectIDs[0:2], + ProjectRoles: []string{ + projectIDs[0] + "_role1", + projectIDs[0] + "_role2", + projectIDs[1] + "_role3", + projectIDs[1] + "_role4", + }, + HumanUserIds: userIDs[0:2], + ProjectGrants: []*admin.ImportDataSuccessProjectGrant{ + { + GrantId: grantIDs[0], + ProjectId: projectIDs[0], + OrgId: orgIDs[1], + }, + { + GrantId: grantIDs[1], + ProjectId: projectIDs[1], + OrgId: orgIDs[1], + }, + { + GrantId: grantIDs[2], + ProjectId: projectIDs[0], + OrgId: orgIDs[2], + }, + { + GrantId: grantIDs[3], + ProjectId: projectIDs[1], + OrgId: orgIDs[2], + }, + }, + }, + { + OrgId: orgIDs[1], + UserGrants: []*admin.ImportDataSuccessUserGrant{ + { + ProjectId: projectIDs[0], + UserId: userIDs[0], + }, + { + UserId: userIDs[0], + ProjectId: projectIDs[1], + }, + }, + }, + { + OrgId: orgIDs[2], + UserGrants: []*admin.ImportDataSuccessUserGrant{ + { + ProjectId: projectIDs[0], + UserId: userIDs[1], + }, + { + UserId: userIDs[1], + ProjectId: projectIDs[1], + }, + }, + }, + }, + }, + }, + }, + { + name: "duplicate project grant error", + req: &admin.ImportDataRequest{ + Data: &admin.ImportDataRequest_DataOrgs{ + DataOrgs: &admin.ImportDataOrg{ + Orgs: []*admin.DataOrg{ + { + OrgId: orgIDs[3], + Org: &management.AddOrgRequest{ + Name: gofakeit.ProductName(), + }, + Projects: []*v1.DataProject{ + { + ProjectId: projectIDs[2], + Project: &management.AddProjectRequest{ + Name: gofakeit.AppName(), + ProjectRoleAssertion: true, + }, + }, + { + ProjectId: projectIDs[3], + Project: &management.AddProjectRequest{ + Name: gofakeit.AppName(), + ProjectRoleAssertion: false, + }, + }, + }, + ProjectRoles: []*management.AddProjectRoleRequest{ + { + ProjectId: projectIDs[2], + RoleKey: "role1", + DisplayName: "role1", + }, + { + ProjectId: projectIDs[2], + RoleKey: "role2", + DisplayName: "role2", + }, + { + ProjectId: projectIDs[3], + RoleKey: "role3", + DisplayName: "role3", + }, + { + ProjectId: projectIDs[3], + RoleKey: "role4", + DisplayName: "role4", + }, + }, + ProjectGrants: []*v1.DataProjectGrant{ + { + GrantId: grantIDs[4], + ProjectGrant: &management.AddProjectGrantRequest{ + ProjectId: projectIDs[2], + GrantedOrgId: orgIDs[4], + RoleKeys: []string{"role1", "role2"}, + }, + }, + { + GrantId: grantIDs[4], + ProjectGrant: &management.AddProjectGrantRequest{ + ProjectId: projectIDs[2], + GrantedOrgId: orgIDs[4], + RoleKeys: []string{"role1", "role2"}, + }, + }, + }, + }, + }, + }, + }, + Timeout: time.Minute.String(), + }, + want: &admin.ImportDataResponse{ + Errors: []*admin.ImportDataError{ + { + Type: "project_grant", + Id: orgIDs[3] + "_" + projectIDs[2] + "_" + orgIDs[4], + Message: "ID=V3-DKcYh Message=Errors.Project.Grant.AlreadyExists Parent=(ERROR: duplicate key value violates unique constraint \"unique_constraints_pkey\" (SQLSTATE 23505))", + }, + }, + Success: &admin.ImportDataSuccess{ + Orgs: []*admin.ImportDataSuccessOrg{ + { + OrgId: orgIDs[3], + ProjectIds: projectIDs[2:4], + ProjectRoles: []string{ + projectIDs[2] + "_role1", + projectIDs[2] + "_role2", + projectIDs[3] + "_role3", + projectIDs[3] + "_role4", + }, + ProjectGrants: []*admin.ImportDataSuccessProjectGrant{ + { + GrantId: grantIDs[4], + ProjectId: projectIDs[2], + OrgId: orgIDs[4], + }, + }, + }, + }, + }, + }, + }, + { + name: "duplicate project grant member error", + req: &admin.ImportDataRequest{ + Data: &admin.ImportDataRequest_DataOrgs{ + DataOrgs: &admin.ImportDataOrg{ + Orgs: []*admin.DataOrg{ + { + OrgId: orgIDs[5], + Org: &management.AddOrgRequest{ + Name: gofakeit.ProductName(), + }, + Projects: []*v1.DataProject{ + { + ProjectId: projectIDs[4], + Project: &management.AddProjectRequest{ + Name: gofakeit.AppName(), + ProjectRoleAssertion: true, + }, + }, + }, + ProjectRoles: []*management.AddProjectRoleRequest{ + { + ProjectId: projectIDs[4], + RoleKey: "role1", + DisplayName: "role1", + }, + }, + HumanUsers: []*v1.DataHumanUser{ + { + UserId: userIDs[2], + User: &management.ImportHumanUserRequest{ + UserName: gofakeit.Username(), + Profile: &management.ImportHumanUserRequest_Profile{ + FirstName: gofakeit.FirstName(), + LastName: gofakeit.LastName(), + DisplayName: gofakeit.Username(), + PreferredLanguage: gofakeit.LanguageBCP(), + }, + Email: &management.ImportHumanUserRequest_Email{ + Email: gofakeit.Email(), + IsEmailVerified: true, + }, + }, + }, + }, + ProjectGrants: []*v1.DataProjectGrant{ + { + GrantId: grantIDs[5], + ProjectGrant: &management.AddProjectGrantRequest{ + ProjectId: projectIDs[4], + GrantedOrgId: orgIDs[6], + RoleKeys: []string{"role1", "role2"}, + }, + }, + }, + ProjectGrantMembers: []*management.AddProjectGrantMemberRequest{ + { + ProjectId: projectIDs[4], + GrantId: grantIDs[5], + UserId: userIDs[2], + Roles: []string{"PROJECT_GRANT_OWNER"}, + }, + { + ProjectId: projectIDs[4], + GrantId: grantIDs[5], + UserId: userIDs[2], + Roles: []string{"PROJECT_GRANT_OWNER"}, + }, + }, + }, + }, + }, + }, + Timeout: time.Minute.String(), + }, + want: &admin.ImportDataResponse{ + Errors: []*admin.ImportDataError{ + { + Type: "project_grant_member", + Id: orgIDs[5] + "_" + projectIDs[4] + "_" + grantIDs[5] + "_" + userIDs[2], + Message: "ID=V3-DKcYh Message=Errors.Project.Member.AlreadyExists Parent=(ERROR: duplicate key value violates unique constraint \"unique_constraints_pkey\" (SQLSTATE 23505))", + }, + }, + Success: &admin.ImportDataSuccess{ + Orgs: []*admin.ImportDataSuccessOrg{ + { + OrgId: orgIDs[5], + ProjectIds: projectIDs[4:5], + ProjectRoles: []string{ + projectIDs[4] + "_role1", + }, + HumanUserIds: userIDs[2:3], + ProjectGrants: []*admin.ImportDataSuccessProjectGrant{ + { + GrantId: grantIDs[5], + ProjectId: projectIDs[4], + OrgId: orgIDs[6], + }, + }, + ProjectGrantMembers: []*admin.ImportDataSuccessProjectGrantMember{ + { + ProjectId: projectIDs[4], + GrantId: grantIDs[5], + UserId: userIDs[2], + }, + }, + }, + }, + }, + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got, err := Client.ImportData(AdminCTX, tt.req) + if tt.wantErr { + assert.Error(t, err) + return + } + require.NoError(t, err) + integration.EqualProto(t, tt.want, got) + }) + } +} + +func generateIDs(n int) []string { + ids := make([]string, n) + for i := range ids { + ids[i] = uuid.NewString() + } + return ids +} diff --git a/internal/command/project_grant.go b/internal/command/project_grant.go index 6a5ab96fee..d0f2d210fb 100644 --- a/internal/command/project_grant.go +++ b/internal/command/project_grant.go @@ -17,14 +17,6 @@ func (c *Commands) AddProjectGrantWithID(ctx context.Context, grant *domain.Proj ctx, span := tracing.NewSpan(ctx) defer func() { span.EndWithError(err) }() - existingMember, err := c.projectGrantWriteModelByID(ctx, grantID, grant.AggregateID, resourceOwner) - if err != nil && !zerrors.IsNotFound(err) { - return nil, err - } - if existingMember != nil && existingMember.State != domain.ProjectGrantStateUnspecified { - return nil, zerrors.ThrowInvalidArgument(nil, "PROJECT-2b8fs", "Errors.Project.Grant.AlreadyExisting") - } - return c.addProjectGrantWithID(ctx, grant, grantID, resourceOwner) } diff --git a/internal/command/project_grant_member.go b/internal/command/project_grant_member.go index 9208ebf011..f7ea887475 100644 --- a/internal/command/project_grant_member.go +++ b/internal/command/project_grant_member.go @@ -26,13 +26,6 @@ func (c *Commands) AddProjectGrantMember(ctx context.Context, member *domain.Pro return nil, err } addedMember := NewProjectGrantMemberWriteModel(member.AggregateID, member.UserID, member.GrantID) - err = c.eventstore.FilterToQueryReducer(ctx, addedMember) - if err != nil { - return nil, err - } - if addedMember.State == domain.MemberStateActive { - return nil, zerrors.ThrowAlreadyExists(nil, "PROJECT-16dVN", "Errors.Project.Member.AlreadyExists") - } projectAgg := ProjectAggregateFromWriteModel(&addedMember.WriteModel) pushedEvents, err := c.eventstore.Push( ctx, diff --git a/internal/command/project_grant_member_test.go b/internal/command/project_grant_member_test.go index 2c52eace28..5535cc9367 100644 --- a/internal/command/project_grant_member_test.go +++ b/internal/command/project_grant_member_test.go @@ -104,58 +104,6 @@ func TestCommandSide_AddProjectGrantMember(t *testing.T) { err: zerrors.IsPreconditionFailed, }, }, - { - name: "member already exists, precondition error", - fields: fields{ - eventstore: eventstoreExpect( - t, - expectFilter( - eventFromEventPusher( - user.NewHumanAddedEvent(context.Background(), - &user.NewAggregate("user1", "org1").Aggregate, - "username1", - "firstname1", - "lastname1", - "nickname1", - "displayname1", - language.German, - domain.GenderMale, - "email1", - true, - ), - ), - ), - expectFilter( - eventFromEventPusher( - project.NewProjectGrantMemberAddedEvent(context.Background(), - &project.NewAggregate("project1", "org1").Aggregate, - "user1", - "projectgrant1", - ), - ), - ), - ), - zitadelRoles: []authz.RoleMapping{ - { - Role: "PROJECT_GRANT_OWNER", - }, - }, - }, - args: args{ - ctx: context.Background(), - member: &domain.ProjectGrantMember{ - ObjectRoot: models.ObjectRoot{ - AggregateID: "project1", - }, - GrantID: "projectgrant1", - UserID: "user1", - Roles: []string{"PROJECT_GRANT_OWNER"}, - }, - }, - res: res{ - err: zerrors.IsErrorAlreadyExists, - }, - }, { name: "member add uniqueconstraint err, already exists", fields: fields{ @@ -177,7 +125,6 @@ func TestCommandSide_AddProjectGrantMember(t *testing.T) { ), ), ), - expectFilter(), expectPushFailed(zerrors.ThrowAlreadyExists(nil, "ERROR", "internal"), project.NewProjectGrantMemberAddedEvent(context.Background(), &project.NewAggregate("project1", "").Aggregate, @@ -229,7 +176,6 @@ func TestCommandSide_AddProjectGrantMember(t *testing.T) { ), ), ), - expectFilter(), expectPush( project.NewProjectGrantMemberAddedEvent(context.Background(), &project.NewAggregate("project1", "").Aggregate, diff --git a/internal/integration/assert.go b/internal/integration/assert.go index 225b3399b4..610c48cf31 100644 --- a/internal/integration/assert.go +++ b/internal/integration/assert.go @@ -4,7 +4,10 @@ import ( "testing" "time" + "github.com/pmezard/go-difflib/difflib" "github.com/stretchr/testify/assert" + "google.golang.org/protobuf/encoding/protojson" + "google.golang.org/protobuf/proto" "google.golang.org/protobuf/types/known/timestamppb" object "github.com/zitadel/zitadel/pkg/grpc/object/v2beta" @@ -71,3 +74,36 @@ func AssertListDetails[D ListDetailsMsg](t testing.TB, expected, actual D) { assert.WithinRange(t, gotCD, wantCD.Add(-time.Minute), wantCD.Add(time.Minute)) } } + +// EqualProto is inspired by [assert.Equal], only that it tests equality of a proto message. +// A message diff is printed on the error test log if the messages are not equal. +// +// As [assert.Equal] is based on reflection, comparing 2 proto messages sometimes fails, +// due to their internal state. +// Expected messages are usually with a vanilla state, eg only exported fields contain data. +// Actual messages obtained from the gRPC client had unexported fields with data. +// This makes them hard to compare. +func EqualProto(t testing.TB, expected, actual proto.Message) bool { + t.Helper() + if proto.Equal(expected, actual) { + return true + } + t.Errorf("Proto messages not equal: %s", diffProto(expected, actual)) + return false +} + +func diffProto(expected, actual proto.Message) string { + diff, err := difflib.GetUnifiedDiffString(difflib.UnifiedDiff{ + A: difflib.SplitLines(protojson.Format(expected)), + B: difflib.SplitLines(protojson.Format(actual)), + FromFile: "Expected", + FromDate: "", + ToFile: "Actual", + ToDate: "", + Context: 1, + }) + if err != nil { + panic(err) + } + return "\n\nDiff:\n" + diff +} From 00b5e555656346ce3a0983971d8151b057b9a974 Mon Sep 17 00:00:00 2001 From: Livio Spring Date: Thu, 20 Jun 2024 16:09:20 +0200 Subject: [PATCH 43/44] fix: set certificate validity for SAML IdPs (#8170) # Which Problems Are Solved Certificates created for a SAML IdP (used for metadata and request singing) did not have any validity set. While it's not required for SAML, when trying to import the certificate into a (keychain) tool it might fail. # How the Problems Are Solved The validity is set based on the `CertificateLifetime` set in the runtime config. ## After the fix: If an IdP was created with a certificate without validity, an admin can regenerate the certificate: - for instance wide IdPs: https://zitadel.com/docs/apis/resources/admin/admin-service-regenerate-saml-provider-certificate#regenerate-saml-identity-provider-certificate - for organization specific IdPs: https://zitadel.com/docs/apis/resources/mgmt/management-service-regenerate-saml-provider-certificate#regenerate-saml-identity-provider-certificate Due to the new certificate, the metadata will change and will need to be updated at the external IdP. # Additional Changes Additionally the `CertificateSize` instead of the `Size` (used for keys) is used for generating the certificate, resp. the underlying key pair. # Additional Context - noted by a customer - needs backports --------- Co-authored-by: Elio Bischof --- internal/command/command.go | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/internal/command/command.go b/internal/command/command.go index d8e6cfb7cf..22a0ba819b 100644 --- a/internal/command/command.go +++ b/internal/command/command.go @@ -156,7 +156,7 @@ func StartCommands( defaultRefreshTokenLifetime: defaultRefreshTokenLifetime, defaultRefreshTokenIdleLifetime: defaultRefreshTokenIdleLifetime, defaultSecretGenerators: defaultSecretGenerators, - samlCertificateAndKeyGenerator: samlCertificateAndKeyGenerator(defaults.KeyConfig.Size), + samlCertificateAndKeyGenerator: samlCertificateAndKeyGenerator(defaults.KeyConfig.CertificateSize, defaults.KeyConfig.CertificateLifetime), // always true for now until we can check with an eventlist EventExisting: func(event string) bool { return true }, // always true for now until we can check with an eventlist @@ -223,7 +223,7 @@ func exists(ctx context.Context, filter preparation.FilterToQueryReducer, wm exi return wm.Exists(), nil } -func samlCertificateAndKeyGenerator(keySize int) func(id string) ([]byte, []byte, error) { +func samlCertificateAndKeyGenerator(keySize int, lifetime time.Duration) func(id string) ([]byte, []byte, error) { return func(id string) ([]byte, []byte, error) { priv, pub, err := crypto.GenerateKeyPair(keySize) if err != nil { @@ -234,12 +234,15 @@ func samlCertificateAndKeyGenerator(keySize int) func(id string) ([]byte, []byte if err != nil { return nil, nil, err } + now := time.Now() template := x509.Certificate{ SerialNumber: big.NewInt(int64(serial)), Subject: pkix.Name{ Organization: []string{"ZITADEL"}, SerialNumber: id, }, + NotBefore: now, + NotAfter: now.Add(lifetime), KeyUsage: x509.KeyUsageKeyEncipherment | x509.KeyUsageDigitalSignature, ExtKeyUsage: []x509.ExtKeyUsage{x509.ExtKeyUsageServerAuth}, BasicConstraintsValid: true, From 3635320ce86582d1addd629d45076be881724337 Mon Sep 17 00:00:00 2001 From: Miguel Cabrerizo <30386061+doncicuto@users.noreply.github.com> Date: Thu, 20 Jun 2024 21:51:42 +0200 Subject: [PATCH 44/44] feat: send test mail (#7968) # Which Problems Are Solved - Zitadel doesn't have a way to test SMTP settings either before creating a new provider or once the SMTP provider has been created. - Zitadel SMTP messages can be more informative for usual errors # How the Problems Are Solved - A new step is added to the new/update SMTP provider wizard that allows us to test a configuration. The result is shown in a text area. - From the table of SMTP providers you can test your settings too. - The email address to send the email is by default the email address for the logged in user as suggested. - Some of the SMTP error messages have been changed to give more information about the possible situation. For example: could not contact with the SMTP server, check the port, firewall issues... instead of could not dial Here's a video showing this new option in action: https://github.com/zitadel/zitadel/assets/30386061/50128ba1-c9fa-4481-8eec-e79a3ca69bda # Additional Changes Replace this example text with a concise list of additional changes that this PR introduces, that are not directly solving the initial problem but are related. For example: - The docs explicitly describe that the property XY is mandatory - Adds missing translations for validations. # Additional Context - Closes #4504 --- .../smtp-provider.component.html | 73 +++- .../smtp-provider/smtp-provider.component.ts | 57 +++- .../modules/smtp-provider/smtp-provider.scss | 22 ++ .../smtp-table/smtp-table.component.html | 12 + .../smtp-table/smtp-table.component.ts | 16 + .../modules/smtp-table/smtp-table.module.ts | 2 + .../smtp-test-dialog.component.html | 47 +++ .../smtp-test-dialog.component.scss | 51 +++ .../smtp-test-dialog.component.spec.ts | 24 ++ .../smtp-test-dialog.component.ts | 72 ++++ .../smtp-test-dialog.module.ts | 26 ++ console/src/app/services/admin.service.ts | 13 + console/src/assets/i18n/bg.json | 19 +- console/src/assets/i18n/cs.json | 9 +- console/src/assets/i18n/de.json | 10 +- console/src/assets/i18n/en.json | 15 +- console/src/assets/i18n/es.json | 9 +- console/src/assets/i18n/fr.json | 10 +- console/src/assets/i18n/it.json | 10 +- console/src/assets/i18n/ja.json | 9 +- console/src/assets/i18n/mk.json | 9 +- console/src/assets/i18n/nl.json | 9 +- console/src/assets/i18n/pl.json | 9 +- console/src/assets/i18n/pt.json | 9 +- console/src/assets/i18n/ru.json | 9 +- console/src/assets/i18n/sv.json | 15 +- console/src/assets/i18n/zh.json | 10 +- .../manage/console/default-settings.mdx | 8 + docs/static/img/guides/console/smtp_table.png | Bin 0 -> 26985 bytes docs/static/img/guides/console/smtp_test.png | Bin 0 -> 34879 bytes .../e2e/instance/settings/notifications.cy.ts | 13 +- internal/api/grpc/admin/smtp.go | 27 ++ internal/command/smtp.go | 83 +++++ internal/command/smtp_test.go | 323 ++++++++++++++++++ .../notification/channels/smtp/channel.go | 71 +++- internal/static/i18n/bg.yaml | 13 + internal/static/i18n/cs.yaml | 13 + internal/static/i18n/de.yaml | 13 + internal/static/i18n/en.yaml | 13 + internal/static/i18n/es.yaml | 13 + internal/static/i18n/fr.yaml | 13 + internal/static/i18n/it.yaml | 13 + internal/static/i18n/ja.yaml | 13 + internal/static/i18n/mk.yaml | 13 + internal/static/i18n/nl.yaml | 14 + internal/static/i18n/pl.yaml | 13 + internal/static/i18n/pt.yaml | 13 + internal/static/i18n/ru.yaml | 13 + internal/static/i18n/sv.yaml | 14 +- internal/static/i18n/zh.yaml | 13 + proto/zitadel/admin.proto | 110 ++++++ 51 files changed, 1362 insertions(+), 46 deletions(-) create mode 100644 console/src/app/modules/smtp-test-dialog/smtp-test-dialog.component.html create mode 100644 console/src/app/modules/smtp-test-dialog/smtp-test-dialog.component.scss create mode 100644 console/src/app/modules/smtp-test-dialog/smtp-test-dialog.component.spec.ts create mode 100644 console/src/app/modules/smtp-test-dialog/smtp-test-dialog.component.ts create mode 100644 console/src/app/modules/smtp-test-dialog/smtp-test-dialog.module.ts create mode 100644 docs/static/img/guides/console/smtp_table.png create mode 100644 docs/static/img/guides/console/smtp_test.png diff --git a/console/src/app/modules/smtp-provider/smtp-provider.component.html b/console/src/app/modules/smtp-provider/smtp-provider.component.html index 80d90df499..78ce22c211 100644 --- a/console/src/app/modules/smtp-provider/smtp-provider.component.html +++ b/console/src/app/modules/smtp-provider/smtp-provider.component.html @@ -2,7 +2,7 @@ title="{{ id ? ('SMTP.DETAIL.TITLE' | translate) : ('SMTP.CREATE.STEPS.TITLE' | translate: { value: providerDefaultSetting.name }) }}" - [createSteps]="3" + [createSteps]="4" [currentCreateStep]="currentCreateStep" (closed)="close()" > @@ -93,7 +93,7 @@ [disabled]="firstFormGroup.invalid" color="primary" matStepperNext - data-e2e="continue-button" + data-e2e="continue-to-2nd-form" > {{ 'ACTIONS.CONTINUE' | translate }} @@ -130,19 +130,74 @@ + + + {{ 'SMTP.CREATE.STEPS.SAVE_SETTINGS' | translate }} + +
+
+

{{ 'SMTP.CREATE.STEPS.TEST.TITLE' | translate }}

+
+
+ +
+
+

{{ 'SMTP.CREATE.STEPS.TEST.DESCRIPTION' | translate }}

+ + {{ 'SMTP.LIST.DIALOG.TEST_EMAIL' | translate }} + + + +
+ +
+ + + {{ 'SMTP.LIST.DIALOG.TEST_RESULT' | translate }} + + +
+ +
+ + +
+ +
+
{{ 'SMTP.CREATE.STEPS.NEXT_STEPS' | translate }} diff --git a/console/src/app/modules/smtp-provider/smtp-provider.component.ts b/console/src/app/modules/smtp-provider/smtp-provider.component.ts index 439ec60339..9e0f91afcb 100644 --- a/console/src/app/modules/smtp-provider/smtp-provider.component.ts +++ b/console/src/app/modules/smtp-provider/smtp-provider.component.ts @@ -1,8 +1,8 @@ import { COMMA, ENTER, SPACE } from '@angular/cdk/keycodes'; import { Location } from '@angular/common'; -import { Component } from '@angular/core'; +import { Component, signal } from '@angular/core'; import { AbstractControl, UntypedFormBuilder, UntypedFormGroup } from '@angular/forms'; -import { Subject } from 'rxjs'; +import { Subject, take } from 'rxjs'; import { StepperSelectionEvent } from '@angular/cdk/stepper'; import { Options } from 'src/app/proto/generated/zitadel/idp_pb'; import { requiredValidator } from '../form-field/validators/validators'; @@ -11,6 +11,7 @@ import { PolicyComponentServiceType } from '../policies/policy-component-types.e import { AddSMTPConfigRequest, AddSMTPConfigResponse, + TestSMTPConfigRequest, UpdateSMTPConfigRequest, UpdateSMTPConfigResponse, } from 'src/app/proto/generated/zitadel/admin_pb'; @@ -31,8 +32,10 @@ import { OutlookDefaultSettings, SendgridDefaultSettings, } from './known-smtp-providers-settings'; +import { GrpcAuthService } from 'src/app/services/grpc-auth.service'; import { MatStepper } from '@angular/material/stepper'; import { SMTPConfigState } from 'src/app/proto/generated/zitadel/settings_pb'; +import { TranslateService } from '@ngx-translate/core'; @Component({ selector: 'cnsl-smtp-provider', @@ -61,6 +64,11 @@ export class SMTPProviderComponent { public senderEmailPlaceholder = 'sender@example.com'; + public resultClass = 'test-success'; + public isLoading = signal(false); + public email: string = ''; + public testResult: string = ''; + constructor( private service: AdminService, private _location: Location, @@ -68,6 +76,8 @@ export class SMTPProviderComponent { private toast: ToastService, private router: Router, private route: ActivatedRoute, + private authService: GrpcAuthService, + private translate: TranslateService, ) { this.route.parent?.url.subscribe((urlPath) => { const providerName = urlPath[urlPath.length - 1].path; @@ -136,6 +146,17 @@ export class SMTPProviderComponent { this.fetchData(this.id); } } + + this.authService + .getMyUser() + .then((resp) => { + if (resp.user) { + this.email = resp.user.human?.email?.email || ''; + } + }) + .catch((error) => { + this.toast.showError(error); + }); }); } @@ -281,6 +302,38 @@ export class SMTPProviderComponent { }); } + public testEmailConfiguration(): void { + this.isLoading.set(true); + + const req = new TestSMTPConfigRequest(); + req.setSenderAddress(this.senderAddress?.value ?? ''); + req.setSenderName(this.senderName?.value ?? ''); + req.setHost(this.hostAndPort?.value ?? ''); + req.setUser(this.user?.value); + req.setPassword(this.password?.value ?? ''); + req.setTls(this.tls?.value ?? false); + req.setId(this.id ?? ''); + req.setReceiverAddress(this.email ?? ''); + + this.service + .testSMTPConfig(req) + .then(() => { + this.resultClass = 'test-success'; + this.isLoading.set(false); + this.translate + .get('SMTP.CREATE.STEPS.TEST.RESULT') + .pipe(take(1)) + .subscribe((msg) => { + this.testResult = msg; + }); + }) + .catch((error) => { + this.resultClass = 'test-error'; + this.isLoading.set(false); + this.testResult = error; + }); + } + public get description(): AbstractControl | null { return this.firstFormGroup.get('description'); } diff --git a/console/src/app/modules/smtp-provider/smtp-provider.scss b/console/src/app/modules/smtp-provider/smtp-provider.scss index 2bb7bca332..e6313df643 100644 --- a/console/src/app/modules/smtp-provider/smtp-provider.scss +++ b/console/src/app/modules/smtp-provider/smtp-provider.scss @@ -96,4 +96,26 @@ width: 1.2rem; } } + + .continue-button { + margin-top: 3rem; + display: block; + height: 3.5rem; + padding: 0 4rem; + } + + .is-loading { + display: flex; + justify-content: center; + } + + .test-error { + border-color: #ff3b5b !important; + min-height: 200px; + } + + .test-success { + border-color: #10b981 !important; + min-height: 200px; + } } diff --git a/console/src/app/modules/smtp-table/smtp-table.component.html b/console/src/app/modules/smtp-table/smtp-table.component.html index bbb59d451c..91d244f8b1 100644 --- a/console/src/app/modules/smtp-table/smtp-table.component.html +++ b/console/src/app/modules/smtp-table/smtp-table.component.html @@ -93,6 +93,18 @@ + + + + + diff --git a/console/src/app/modules/smtp-test-dialog/smtp-test-dialog.component.scss b/console/src/app/modules/smtp-test-dialog/smtp-test-dialog.component.scss new file mode 100644 index 0000000000..dd5a2e0867 --- /dev/null +++ b/console/src/app/modules/smtp-test-dialog/smtp-test-dialog.component.scss @@ -0,0 +1,51 @@ +h1 { + font-size: 1.5rem; + margin: 0; +} + +.icon-wrapper { + display: flex; + justify-content: center; + padding: 1rem; + margin: 1rem; + align-items: center; + + .icon { + font-size: 3rem; + } +} + +.desc { + font-size: 0.9rem; +} + +.action { + display: flex; + + button { + border-radius: 0.5rem; + } + + .ok-button { + margin-left: 0.5rem; + } + + .fill-space { + flex: 1; + } +} + +.is-loading { + display: flex; + justify-content: center; +} + +.test-error { + border-color: #ff3b5b; + min-height: 200px; +} + +.test-success { + border-color: #10b981; + min-height: 200px; +} diff --git a/console/src/app/modules/smtp-test-dialog/smtp-test-dialog.component.spec.ts b/console/src/app/modules/smtp-test-dialog/smtp-test-dialog.component.spec.ts new file mode 100644 index 0000000000..1e0383a9fa --- /dev/null +++ b/console/src/app/modules/smtp-test-dialog/smtp-test-dialog.component.spec.ts @@ -0,0 +1,24 @@ +import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; + +import { SmtpTestDialogComponent } from './smtp-test-dialog.component'; + +describe('SmtpTestDialogComponent', () => { + let component: SmtpTestDialogComponent; + let fixture: ComponentFixture; + + beforeEach(waitForAsync(() => { + TestBed.configureTestingModule({ + declarations: [SmtpTestDialogComponent], + }).compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(SmtpTestDialogComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/console/src/app/modules/smtp-test-dialog/smtp-test-dialog.component.ts b/console/src/app/modules/smtp-test-dialog/smtp-test-dialog.component.ts new file mode 100644 index 0000000000..d641b5ad83 --- /dev/null +++ b/console/src/app/modules/smtp-test-dialog/smtp-test-dialog.component.ts @@ -0,0 +1,72 @@ +import { Component, Inject, signal } from '@angular/core'; +import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog'; + +import { InfoSectionType } from '../info-section/info-section.component'; +import { AdminService } from 'src/app/services/admin.service'; +import { GrpcAuthService } from 'src/app/services/grpc-auth.service'; +import { ToastService } from 'src/app/services/toast.service'; +import { TranslateService } from '@ngx-translate/core'; +import { TestSMTPConfigByIdRequest } from 'src/app/proto/generated/zitadel/admin_pb'; +import { take } from 'rxjs'; + +@Component({ + selector: 'cnsl-smtp-test-dialog', + templateUrl: './smtp-test-dialog.component.html', + styleUrls: ['./smtp-test-dialog.component.scss'], +}) +export class SmtpTestDialogComponent { + public resultClass = 'test-success'; + public isLoading = signal(false); + public email: string = ''; + public testResult: string = ''; + InfoSectionType: any = InfoSectionType; + constructor( + public dialogRef: MatDialogRef, + private adminService: AdminService, + private authService: GrpcAuthService, + private toast: ToastService, + private translate: TranslateService, + @Inject(MAT_DIALOG_DATA) public data: any, + ) { + this.authService + .getMyUser() + .then((resp) => { + if (resp.user) { + this.email = resp.user.human?.email?.email || ''; + } + }) + .catch((error) => { + this.toast.showError(error); + }); + } + + public testEmailConfiguration(): void { + this.isLoading.set(true); + + const req = new TestSMTPConfigByIdRequest(); + req.setId(this.data.id); + req.setReceiverAddress(this.email); + + this.adminService + .testSMTPConfigById(req) + .then(() => { + this.resultClass = 'test-success'; + this.isLoading.set(false); + this.translate + .get('SMTP.CREATE.STEPS.TEST.RESULT') + .pipe(take(1)) + .subscribe((msg) => { + this.testResult = msg; + }); + }) + .catch((error) => { + this.resultClass = 'test-error'; + this.isLoading.set(false); + this.testResult = error; + }); + } + + public closeDialog(): void { + this.dialogRef.close(false); + } +} diff --git a/console/src/app/modules/smtp-test-dialog/smtp-test-dialog.module.ts b/console/src/app/modules/smtp-test-dialog/smtp-test-dialog.module.ts new file mode 100644 index 0000000000..faa0a5cfe2 --- /dev/null +++ b/console/src/app/modules/smtp-test-dialog/smtp-test-dialog.module.ts @@ -0,0 +1,26 @@ +import { CommonModule } from '@angular/common'; +import { NgModule } from '@angular/core'; +import { FormsModule } from '@angular/forms'; +import { MatButtonModule } from '@angular/material/button'; +import { TranslateModule } from '@ngx-translate/core'; + +import { MatDialogModule } from '@angular/material/dialog'; +import { InfoSectionModule } from '../info-section/info-section.module'; +import { InputModule } from '../input/input.module'; +import { SmtpTestDialogComponent } from './smtp-test-dialog.component'; +import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; + +@NgModule({ + declarations: [SmtpTestDialogComponent], + imports: [ + CommonModule, + FormsModule, + MatDialogModule, + MatProgressSpinnerModule, + TranslateModule, + InfoSectionModule, + MatButtonModule, + InputModule, + ], +}) +export class SmtpTestDialogModule {} diff --git a/console/src/app/services/admin.service.ts b/console/src/app/services/admin.service.ts index ca4c12b890..791fc2bb71 100644 --- a/console/src/app/services/admin.service.ts +++ b/console/src/app/services/admin.service.ts @@ -240,6 +240,10 @@ import { SetSecurityPolicyResponse, SetUpOrgRequest, SetUpOrgResponse, + TestSMTPConfigByIdRequest, + TestSMTPConfigByIdResponse, + TestSMTPConfigRequest, + TestSMTPConfigResponse, UpdateAppleProviderRequest, UpdateAppleProviderResponse, UpdateAzureADProviderRequest, @@ -330,6 +334,7 @@ import { } from '../proto/generated/zitadel/milestone/v1/milestone_pb'; import { OrgFieldName, OrgQuery } from '../proto/generated/zitadel/org_pb'; import { SortDirection } from '@angular/material/sort'; +import { SMTPConfig } from '../proto/generated/zitadel/settings_pb'; export interface OnboardingActions { order: number; @@ -946,6 +951,14 @@ export class AdminService { return this.grpcService.admin.deactivateSMTPConfig(req, null).then((resp) => resp.toObject()); } + public testSMTPConfigById(req: TestSMTPConfigByIdRequest): Promise { + return this.grpcService.admin.testSMTPConfigById(req, null).then((resp) => resp.toObject()); + } + + public testSMTPConfig(req: TestSMTPConfigRequest): Promise { + return this.grpcService.admin.testSMTPConfig(req, null).then((resp) => resp.toObject()); + } + public removeSMTPConfig(id: string): Promise { const req = new RemoveSMTPConfigRequest(); req.setId(id); diff --git a/console/src/assets/i18n/bg.json b/console/src/assets/i18n/bg.json index a2b2f7616c..0e4e9590bf 100644 --- a/console/src/assets/i18n/bg.json +++ b/console/src/assets/i18n/bg.json @@ -485,8 +485,15 @@ "NEXT": "Следващ", "MORE": "Повече ▼", "STEP": "стъпка", - "SETUP": "Настройвам", - "COMINGSOON": "Очаквайте скоро", + "TEST": "Тест", + "UNSAVEDCHANGES": "Незапазени промени", + "UNSAVED": { + "DIALOG": { + "DESCRIPTION": "Сигурни ли сте, че искате да отхвърлите това ново действие? Вашето действие ще бъде загубено", + "CANCEL": "Отказ", + "DISCARD": "Изхвърлете" + } + }, "TABLE": { "SHOWUSER": "Покажи потребител {{value}}" }, @@ -2228,6 +2235,7 @@ "ACTIVATED": "Активиран", "ACTIVATE": "Активирайте доставчика", "DEACTIVATE": "Деактивирайте доставчика", + "TEST": "Тествайте вашия доставчик", "TYPE": "Тип", "DIALOG": { "ACTIVATED": "SMTP конфигурацията е активирана", @@ -2251,7 +2259,6 @@ "CURRENT_DESC_TITLE": "Това са вашите SMTP настройки", "PROVIDER_SETTINGS": "Настройки на SMTP доставчик", "SENDER_SETTINGS": "Настройки на изпращача", - "TEST_SETTINGS": "Тествайте настройките на SMTP", "NEXT_STEPS": "Следващи стъпки", "ACTIVATE": { "TITLE": "Активирайте вашия SMTP доставчик", @@ -2260,6 +2267,12 @@ "DEACTIVATE": { "TITLE": "Деактивирайте вашия SMTP доставчик", "DESCRIPTION": "Ако деактивирате този SMTP доставчик, ZITADEL не може да го използва за изпращане на известия, докато не го активирате отново." + }, + "SAVE_SETTINGS": "Запазете вашите настройки", + "TEST": { + "TITLE": "Тествайте настройките си", + "DESCRIPTION": "Можете да тествате настройките на вашия SMTP доставчик и да проверите резултата от теста, преди да ги запазите", + "RESULT": "Вашият имейл беше изпратен успешно" } } }, diff --git a/console/src/assets/i18n/cs.json b/console/src/assets/i18n/cs.json index 8e78955c6a..b16155886b 100644 --- a/console/src/assets/i18n/cs.json +++ b/console/src/assets/i18n/cs.json @@ -486,6 +486,7 @@ "MORE": "více", "STEP": "Krok", "SETUP": "Nastavit", + "TEST": "Test", "UNSAVEDCHANGES": "Neuložené změny", "UNSAVED": { "DIALOG": { @@ -2247,6 +2248,7 @@ "ACTIVATED": "Aktivováno", "ACTIVATE": "Aktivujte poskytovatele", "DEACTIVATE": "Deaktivovat poskytovatele", + "TEST": "Otestujte svého poskytovatele", "TYPE": "Typ", "DIALOG": { "ACTIVATED": "Konfigurace SMTP byla aktivována", @@ -2270,7 +2272,6 @@ "CURRENT_DESC_TITLE": "Toto jsou vaše nastavení SMTP", "PROVIDER_SETTINGS": "Nastavení poskytovatele SMTP", "SENDER_SETTINGS": "Nastavení odesílatele", - "TEST_SETTINGS": "Otestujte nastavení SMTP", "NEXT_STEPS": "Další kroky", "ACTIVATE": { "TITLE": "Aktivujte svého poskytovatele SMTP", @@ -2279,6 +2280,12 @@ "DEACTIVATE": { "TITLE": "Deaktivujte svého poskytovatele SMTP", "DESCRIPTION": "Pokud deaktivujete tohoto poskytovatele SMTP, ZITADEL jej nebude moci používat k odesílání upozornění, dokud jej znovu neaktivujete." + }, + "SAVE_SETTINGS": "Uložte nastavení", + "TEST": { + "TITLE": "Otestujte svá nastavení", + "DESCRIPTION": "Nastavení poskytovatele SMTP můžete otestovat a před uložením zkontrolovat výsledek testu", + "RESULT": "Váš email byl úspěšně odeslán" } } }, diff --git a/console/src/assets/i18n/de.json b/console/src/assets/i18n/de.json index 5c905e2e62..1b717427ec 100644 --- a/console/src/assets/i18n/de.json +++ b/console/src/assets/i18n/de.json @@ -485,6 +485,8 @@ "NEXT": "Weiter", "MORE": "mehr", "STEP": "Schritt", + "SETUP": "Aufstellen", + "TEST": "Prüfen", "UNSAVEDCHANGES": "Nicht gespeicherte Änderungen", "UNSAVED": { "DIALOG": { @@ -2237,6 +2239,7 @@ "ACTIVATED": "Aktiviert", "ACTIVATE": "Anbieter aktivieren", "DEACTIVATE": "Anbieter deaktivieren", + "TEST": "Testen Sie Ihren Anbieter", "TYPE": "Typ", "DIALOG": { "ACTIVATED": "Die SMTP-Konfiguration wurde aktiviert", @@ -2260,7 +2263,6 @@ "CURRENT_DESC_TITLE": "Dies sind Ihre SMTP-Einstellungen", "PROVIDER_SETTINGS": "SMTP-Anbietereinstellungen", "SENDER_SETTINGS": "Absendereinstellungen", - "TEST_SETTINGS": "Testen Sie die SMTP-Einstellungen", "NEXT_STEPS": "Nächste Schritte", "ACTIVATE": { "TITLE": "Aktivieren Sie Ihren SMTP-Anbieter", @@ -2269,6 +2271,12 @@ "DEACTIVATE": { "TITLE": "Deaktivieren Sie Ihren SMTP-Anbieter", "DESCRIPTION": "Wenn Sie diesen SMTP-Anbieter deaktivieren, kann ZITADEL ihn nicht zum Versenden von Benachrichtigungen verwenden, bis Sie ihn erneut aktivieren." + }, + "SAVE_SETTINGS": "Speichern Sie Ihre Einstellungen", + "TEST": { + "TITLE": "Testen Sie Ihre Einstellungen", + "DESCRIPTION": "Sie können die Einstellungen Ihres SMTP-Anbieters testen und das Testergebnis überprüfen, bevor Sie sie speichern", + "RESULT": "Deine E-Mail wurde erfolgreich versandt" } } }, diff --git a/console/src/assets/i18n/en.json b/console/src/assets/i18n/en.json index 00b54a64b0..96a6de2a92 100644 --- a/console/src/assets/i18n/en.json +++ b/console/src/assets/i18n/en.json @@ -486,6 +486,7 @@ "MORE": "more", "STEP": "Step", "SETUP": "Setup", + "TEST": "Test", "UNSAVEDCHANGES": "Unsaved changes", "UNSAVED": { "DIALOG": { @@ -2259,6 +2260,7 @@ "ACTIVATED": "Activated", "ACTIVATE": "Activate provider", "DEACTIVATE": "Deactivate provider", + "TEST": "Test your provider", "TYPE": "Type", "DIALOG": { "ACTIVATED": "SMTP config has been activated", @@ -2270,7 +2272,11 @@ "DELETE_TITLE": "Delete SMTP config", "DELETE_DESCRIPTION": "You are about to delete a configuration. Confirm this action typing the sender name", "DELETED": "SMTP config has been deleted", - "SENDER": "Type {{value}}, to delete this SMTP configuration." + "SENDER": "Type {{value}}, to delete this SMTP configuration.", + "TEST_TITLE": "Test your SMTP config", + "TEST_DESCRIPTION": "Specify an email address to test your SMTP configuration for this provider", + "TEST_EMAIL": "Email address", + "TEST_RESULT": "Test result" } }, "CREATE": { @@ -2282,7 +2288,6 @@ "CURRENT_DESC_TITLE": "These are your SMTP settings", "PROVIDER_SETTINGS": "SMTP Provider Settings", "SENDER_SETTINGS": "Sender Settings", - "TEST_SETTINGS": "Test SMTP Settings", "NEXT_STEPS": "Next Steps", "ACTIVATE": { "TITLE": "Activate your SMTP Provider", @@ -2291,6 +2296,12 @@ "DEACTIVATE": { "TITLE": "Deactivate your SMTP Provider", "DESCRIPTION": "If you deactivate this SMTP Provider, ZITADEL cannot use it to send notifications until you activate it again." + }, + "SAVE_SETTINGS": "Save your settings", + "TEST": { + "TITLE": "Test your settings", + "DESCRIPTION": "You can test your SMTP provider settings and check the test result before saving them", + "RESULT": "Your email was succesfully sent" } } }, diff --git a/console/src/assets/i18n/es.json b/console/src/assets/i18n/es.json index bbf6db2056..a6b3e0ba31 100644 --- a/console/src/assets/i18n/es.json +++ b/console/src/assets/i18n/es.json @@ -486,6 +486,7 @@ "MORE": "más", "STEP": "Paso", "SETUP": "Configurar", + "TEST": "Probar", "UNSAVEDCHANGES": "Cambios no guardados", "UNSAVED": { "DIALOG": { @@ -2235,6 +2236,7 @@ "ACTIVATED": "Activado", "ACTIVATE": "Activar proveedor", "DEACTIVATE": "Desactivar proveedor", + "TEST": "Prueba tu proveedor", "TYPE": "Tipo", "DIALOG": { "ACTIVATED": "Tu configuración SMTP ha sido activada", @@ -2258,7 +2260,6 @@ "CURRENT_DESC_TITLE": "Estas son tus configuraciones SMTP", "PROVIDER_SETTINGS": "Configuración del proveedor SMTP", "SENDER_SETTINGS": "Configuración del remitente", - "TEST_SETTINGS": "Probar la configuración SMTP", "NEXT_STEPS": "Pŕoximos pasos", "ACTIVATE": { "TITLE": "Activa tu proveedor SMTP", @@ -2267,6 +2268,12 @@ "DEACTIVATE": { "TITLE": "Desactiva tu proveedor SMTP", "DESCRIPTION": "Si desactivas este proveedor SMTP, ZITADEL no puede utilizarlo para enviar notificationes hasta que lo actives otra vez." + }, + "SAVE_SETTINGS": "Guarda tu configuración", + "TEST": { + "TITLE": "Prueba tu configuración", + "DESCRIPTION": "Puedes probar tu configuración SMTP y revisar el resultado de la prueba antes de guardar la configuración", + "RESULT": "Tu email fue enviado con éxito" } } }, diff --git a/console/src/assets/i18n/fr.json b/console/src/assets/i18n/fr.json index afa97d1adf..8ed44fa241 100644 --- a/console/src/assets/i18n/fr.json +++ b/console/src/assets/i18n/fr.json @@ -485,6 +485,8 @@ "NEXT": "Suivant", "MORE": "Plus", "STEP": "Étape", + "SETUP": "Installation", + "TEST": "Test", "UNSAVEDCHANGES": "Modifications non enregistrées", "UNSAVED": { "DIALOG": { @@ -2238,6 +2240,7 @@ "ACTIVATED": "Activé", "ACTIVATE": "Activer le fournisseur", "DEACTIVATE": "Désactiver le fournisseur", + "TEST": "Testez votre fournisseur", "TYPE": "Type", "DIALOG": { "ACTIVATED": "La configuration SMTP a été activée", @@ -2261,7 +2264,6 @@ "CURRENT_DESC_TITLE": "Ce sont vos paramètres SMTP", "PROVIDER_SETTINGS": "Paramètres du fournisseur SMTP", "SENDER_SETTINGS": "Paramètres de l'expéditeur", - "TEST_SETTINGS": "Tester les paramètres SMTP", "NEXT_STEPS": "Prochaines étapes", "ACTIVATE": { "TITLE": "Activez votre fournisseur SMTP", @@ -2270,6 +2272,12 @@ "DEACTIVATE": { "TITLE": "Désactivez votre fournisseur SMTP", "DESCRIPTION": "Si vous désactivez l'option SMTP, vous ne pourrez pas vous connecter à l'application, le dossier sera alors désactivé." + }, + "SAVE_SETTINGS": "Enregistrez vos paramètres", + "TEST": { + "TITLE": "Testez vos paramètres", + "DESCRIPTION": "Vous pouvez tester les paramètres de votre fournisseur SMTP et vérifier le résultat du test avant de les enregistrer", + "RESULT": "Votre email a été envoyé avec succès" } } }, diff --git a/console/src/assets/i18n/it.json b/console/src/assets/i18n/it.json index ac84a51c49..c77ed216f0 100644 --- a/console/src/assets/i18n/it.json +++ b/console/src/assets/i18n/it.json @@ -485,6 +485,8 @@ "NEXT": "Avanti", "MORE": "azioni", "STEP": "Passo", + "SETUP": "Setup", + "TEST": "Test", "UNSAVED": { "DIALOG": { "DESCRIPTION": "Sei sicuro di voler eliminare questa nuova azione? La tua azione andrà persa", @@ -2238,6 +2240,7 @@ "ACTIVATED": "Attivato", "ACTIVATE": "Attiva fornitore", "DEACTIVATE": "Disattiva fornitore", + "TEST": "Metti alla prova il tuo fornitore", "TYPE": "Tipo", "DIALOG": { "ACTIVATED": "La configurazione SMTP è stata attivata", @@ -2261,7 +2264,6 @@ "CURRENT_DESC_TITLE": "Queste sono le tue impostazioni SMTP", "PROVIDER_SETTINGS": "Impostazioni del provider SMTP", "SENDER_SETTINGS": "Impostazioni mittente", - "TEST_SETTINGS": "Testare le impostazioni SMTP", "NEXT_STEPS": "Prossimi passi", "ACTIVATE": { "TITLE": "Attiva il tuo provider SMTP", @@ -2270,6 +2272,12 @@ "DEACTIVATE": { "TITLE": "Disattiva il tuo provider SMTP", "DESCRIPTION": "Dopo aver disattivato l'archivio SMTP, la schermata non è disponibile per l'utente, il documento è nuovo e non è attivo." + }, + "SAVE_SETTINGS": "Salva le tue impostazioni", + "TEST": { + "TITLE": "Metti alla prova le tue impostazioni", + "DESCRIPTION": "Puoi testare le impostazioni del tuo provider SMTP e controllare il risultato del test prima di salvarle", + "RESULT": "La tua email è stata inviata correttamente" } } }, diff --git a/console/src/assets/i18n/ja.json b/console/src/assets/i18n/ja.json index bd31dff6ee..c0865167f5 100644 --- a/console/src/assets/i18n/ja.json +++ b/console/src/assets/i18n/ja.json @@ -486,6 +486,7 @@ "MORE": "さらに", "STEP": "ステップ", "SETUP": "セットアップ", + "TEST": "テスト", "UNSAVEDCHANGES": "未保存の変更", "UNSAVED": { "DIALOG": { @@ -2230,6 +2231,7 @@ "ACTIVATED": "アクティブ化された", "ACTIVATE": "プロバイダーをアクティブ化する", "DEACTIVATE": "プロバイダーを非アクティブ化する", + "TEST": "プロバイダーをテストする", "TYPE": "タイプ", "DIALOG": { "ACTIVATED": "SMTP設定が有効化されました", @@ -2253,7 +2255,6 @@ "CURRENT_DESC_TITLE": "これらは SMTP 設定です", "PROVIDER_SETTINGS": "SMTPプロバイダーの設定", "SENDER_SETTINGS": "送信者の設定", - "TEST_SETTINGS": "SMTP設定をテストする", "NEXT_STEPS": "次のステップ", "ACTIVATE": { "TITLE": "SMTP プロバイダーをアクティブ化する", @@ -2262,6 +2263,12 @@ "DEACTIVATE": { "TITLE": "SMTPプロバイダーを非アクティブ化します", "DESCRIPTION": "この SMTP プロバイダーを非アクティブ化すると、再度アクティブ化するまで、Zitadel はそれを使用して通知を送信できなくなります。" + }, + "SAVE_SETTINGS": "設定を保存する", + "TEST": { + "TITLE": "設定をテストする", + "DESCRIPTION": "SMTP プロバイダーの設定をテストし、保存する前にテスト結果を確認できます。", + "RESULT": "あなたの電子メールが正常に送信されました" } } }, diff --git a/console/src/assets/i18n/mk.json b/console/src/assets/i18n/mk.json index 868437796b..496f06d641 100644 --- a/console/src/assets/i18n/mk.json +++ b/console/src/assets/i18n/mk.json @@ -486,6 +486,7 @@ "MORE": "повеќе", "STEP": "Чекор", "SETUP": "Подесување", + "TEST": "Тест", "UNSAVEDCHANGES": "Незачувани промени", "UNSAVED": { "DIALOG": { @@ -2235,6 +2236,7 @@ "ACTIVATED": "Активиран", "ACTIVATE": "Активирајте го провајдерот", "DEACTIVATE": "Деактивирајте го провајдерот", + "TEST": "Тестирајте го вашиот провајдер", "TYPE": "Тип", "DIALOG": { "ACTIVATED": "SMTP конфигурацијата е активирана", @@ -2258,7 +2260,6 @@ "CURRENT_DESC_TITLE": "Ова се вашите поставки за SMTP", "PROVIDER_SETTINGS": "Поставки на провајдерот SMTP", "SENDER_SETTINGS": "Поставки на испраќачот", - "TEST_SETTINGS": "Тестирајте ги поставките за SMTP", "NEXT_STEPS": "Следните чекори", "ACTIVATE": { "TITLE": "Активирајте го вашиот SMTP провајдер", @@ -2267,6 +2268,12 @@ "DEACTIVATE": { "TITLE": "Деактивирајте го вашиот SMTP провајдер", "DESCRIPTION": "Ако го деактивирате овој SMTP провајдер, ZITADEL не може да го користи за испраќање известувања додека не го активирате повторно." + }, + "SAVE_SETTINGS": "Зачувајте ги вашите поставки", + "TEST": { + "TITLE": "Тестирајте ги вашите поставки", + "DESCRIPTION": "Можете да ги тестирате поставките на провајдерот SMTP и да го проверите резултатот од тестот пред да ги зачувате", + "RESULT": "Вашата е-пошта беше успешно испратена" } } }, diff --git a/console/src/assets/i18n/nl.json b/console/src/assets/i18n/nl.json index b6feca01b3..6fa179e71d 100644 --- a/console/src/assets/i18n/nl.json +++ b/console/src/assets/i18n/nl.json @@ -486,6 +486,7 @@ "MORE": "meer", "STEP": "Stap", "SETUP": "Instellen", + "TEST": "Test", "UNSAVEDCHANGES": "Niet-opgeslagen wijzigingen", "UNSAVED": { "DIALOG": { @@ -2256,6 +2257,7 @@ "ACTIVATED": "Geactiveerd", "ACTIVATE": "Aanbieder activeren", "DEACTIVATE": "Aanbieder deactiveren", + "TEST": "Test uw aanbieder", "TYPE": "Type", "DIALOG": { "ACTIVATED": "SMTP-configuratie is geactiveerd", @@ -2279,7 +2281,6 @@ "CURRENT_DESC_TITLE": "Dit zijn uw SMTP-instellingen", "PROVIDER_SETTINGS": "SMTP-providerinstellingen", "SENDER_SETTINGS": "Afzenderinstellingen", - "TEST_SETTINGS": "SMTP-instellingen testen", "NEXT_STEPS": "Volgende stappen", "ACTIVATE": { "TITLE": "Activeer uw SMTP-provider", @@ -2288,6 +2289,12 @@ "DEACTIVATE": { "TITLE": "Deactiveer uw SMTP-provider", "DESCRIPTION": "Als u deze SMTP-provider deactiveert, kan ZITADEL deze niet gebruiken om meldingen te verzenden totdat u deze opnieuw activeert." + }, + "SAVE_SETTINGS": "Sla uw instellingen op", + "TEST": { + "TITLE": "Test uw instellingen", + "DESCRIPTION": "U kunt de instellingen van uw SMTP-provider testen en het testresultaat controleren voordat u deze opslaat", + "RESULT": "Je email is succesvol verzonden" } } }, diff --git a/console/src/assets/i18n/pl.json b/console/src/assets/i18n/pl.json index d630c791f0..a7005564d6 100644 --- a/console/src/assets/i18n/pl.json +++ b/console/src/assets/i18n/pl.json @@ -486,6 +486,7 @@ "MORE": "więcej", "STEP": "Krok", "UNSAVEDCHANGES": "Niezapisane zmiany", + "TEST": "Test", "UNSAVED": { "DIALOG": { "DESCRIPTION": "Czy na pewno chcesz odrzucić to nowe działanie? Twoje działanie zostanie utracone", @@ -2238,6 +2239,7 @@ "ACTIVATED": "Aktywowany", "ACTIVATE": "Aktywuj dostawcę", "DEACTIVATE": "Dezaktywuj dostawcę", + "TEST": "Przetestuj swojego dostawcę", "TYPE": "Typ", "DIALOG": { "ACTIVATED": "Konfiguracja SMTP została aktywowana", @@ -2261,7 +2263,6 @@ "CURRENT_DESC_TITLE": "To są Twoje ustawienia SMTP", "PROVIDER_SETTINGS": "Ustawienia dostawcy SMTP", "SENDER_SETTINGS": "Ustawienia nadawcy", - "TEST_SETTINGS": "Przetestuj ustawienia SMTP", "NEXT_STEPS": "Następne kroki", "ACTIVATE": { "TITLE": "Aktywuj swojego dostawcę SMTP", @@ -2270,6 +2271,12 @@ "DEACTIVATE": { "TITLE": "Dezaktywuj swojego dostawcę SMTP", "DESCRIPTION": "Jeśli dezaktywujesz tego dostawcę SMTP, ZITADEL nie będzie mógł go używać do wysyłania powiadomień, dopóki nie aktywujesz go ponownie." + }, + "SAVE_SETTINGS": "Zapisz swoje ustawienia", + "TEST": { + "TITLE": "Przetestuj swoje ustawienia", + "DESCRIPTION": "Możesz przetestować ustawienia dostawcy SMTP i sprawdzić wynik testu przed ich zapisaniem", + "RESULT": "Twój email został wysłany" } } }, diff --git a/console/src/assets/i18n/pt.json b/console/src/assets/i18n/pt.json index afbb02d83d..79aa509055 100644 --- a/console/src/assets/i18n/pt.json +++ b/console/src/assets/i18n/pt.json @@ -486,6 +486,7 @@ "MORE": "mais", "STEP": "Passo", "SETUP": "Configuração", + "TEST": "Teste", "UNSAVEDCHANGES": "Alterações não salvas", "UNSAVED": { "DIALOG": { @@ -2233,6 +2234,7 @@ "ACTIVATED": "Ativado", "ACTIVATE": "Ativar provedor", "DEACTIVATE": "Desativar provedor", + "TEST": "Teste seu provedor", "TYPE": "Tipo", "DIALOG": { "ACTIVATED": "A configuração SMTP foi ativada", @@ -2256,7 +2258,6 @@ "CURRENT_DESC_TITLE": "Estas são suas configurações de SMTP", "PROVIDER_SETTINGS": "Configurações do provedor SMTP", "SENDER_SETTINGS": "Configurações do remetente", - "TEST_SETTINGS": "Testar configurações de SMTP", "NEXT_STEPS": "Próximos passos", "ACTIVATE": { "TITLE": "Ative seu provedor SMTP", @@ -2265,6 +2266,12 @@ "DEACTIVATE": { "TITLE": "Desative seu provedor SMTP", "DESCRIPTION": "Se você desativar este provedor SMTP, a ZITADEL não poderá usá-lo para enviar notificações até que você o ative novamente." + }, + "SAVE_SETTINGS": "Salve suas configurações", + "TEST": { + "TITLE": "Teste suas configurações", + "DESCRIPTION": "Você pode testar as configurações do seu provedor SMTP e verificar o resultado do teste antes de salvá-las", + "RESULT": "Seu e-mail foi enviado com sucesso" } } }, diff --git a/console/src/assets/i18n/ru.json b/console/src/assets/i18n/ru.json index 50e0562967..56e538b90b 100644 --- a/console/src/assets/i18n/ru.json +++ b/console/src/assets/i18n/ru.json @@ -485,6 +485,7 @@ "MORE": "больше", "STEP": "Шаг", "SETUP": "Настроить", + "TEST": "Тест", "UNSAVEDCHANGES": "Несохраненные изменения", "UNSAVED": { "DIALOG": { @@ -2350,6 +2351,7 @@ "ACTIVATED": "Активировано", "ACTIVATE": "Активировать провайдера", "DEACTIVATE": "Деактивировать провайдера", + "TEST": "Проверьте своего провайдера", "TYPE": "Тип", "DIALOG": { "ACTIVATED": "Конфигурация SMTP активирована", @@ -2373,7 +2375,6 @@ "CURRENT_DESC_TITLE": "Это ваши настройки SMTP", "PROVIDER_SETTINGS": "Настройки SMTP-провайдера", "SENDER_SETTINGS": "Настройки отправителя", - "TEST_SETTINGS": "Проверка настроек SMTP", "NEXT_STEPS": "Следующие шаги", "ACTIVATE": { "TITLE": "Активируйте своего SMTP-провайдера", @@ -2382,6 +2383,12 @@ "DEACTIVATE": { "TITLE": "Деактивируйте своего SMTP-провайдера", "DESCRIPTION": "Если вы деактивируете этого поставщика SMTP, ZITADEL не сможет использовать его для отправки уведомлений, пока вы не активируете его снова." + }, + "SAVE_SETTINGS": "Сохраните настройки", + "TEST": { + "TITLE": "Проверьте свои настройки", + "DESCRIPTION": "Вы можете проверить настройки своего провайдера SMTP и проверить результаты проверки перед их сохранением.", + "RESULT": "Ваше письмо было успешно отправлено" } } }, diff --git a/console/src/assets/i18n/sv.json b/console/src/assets/i18n/sv.json index c7a947b690..3a15595b42 100644 --- a/console/src/assets/i18n/sv.json +++ b/console/src/assets/i18n/sv.json @@ -486,6 +486,7 @@ "MORE": "mer", "STEP": "Steg", "SETUP": "Inställning", + "TEST": "Testa", "UNSAVEDCHANGES": "Osparade ändringar", "UNSAVED": { "DIALOG": { @@ -2259,6 +2260,7 @@ "ACTIVATED": "Aktiverad", "ACTIVATE": "Aktivera leverantör", "DEACTIVATE": "Inaktivera leverantör", + "TEST": "Testa din leverantör", "TYPE": "Typ", "DIALOG": { "ACTIVATED": "SMTP-konfigurationen har aktiverats", @@ -2270,7 +2272,11 @@ "DELETE_TITLE": "Radera SMTP-konfiguration", "DELETE_DESCRIPTION": "Du håller på att radera en konfiguration. Bekräfta denna åtgärd genom att skriva avsändarnamnet", "DELETED": "SMTP-konfigurationen har raderats", - "SENDER": "Skriv {{value}}, för att radera denna SMTP-konfiguration." + "SENDER": "Skriv {{value}}, för att radera denna SMTP-konfiguration.", + "TEST_TITLE": "Testa din SMTP-konfiguration", + "TEST_DESCRIPTION": "Ange en e-postadress för att testa din SMTP-konfiguration för den här leverantören", + "TEST_EMAIL": "E-postadress", + "TEST_RESULT": "Testresultat" } }, "CREATE": { @@ -2282,7 +2288,6 @@ "CURRENT_DESC_TITLE": "Dessa är dina SMTP-inställningar", "PROVIDER_SETTINGS": "SMTP-leverantörsinställningar", "SENDER_SETTINGS": "Avsändarinställningar", - "TEST_SETTINGS": "Testa SMTP-inställningar", "NEXT_STEPS": "Nästa steg", "ACTIVATE": { "TITLE": "Aktivera din SMTP-leverantör", @@ -2291,6 +2296,12 @@ "DEACTIVATE": { "TITLE": "Inaktivera din SMTP-leverantör", "DESCRIPTION": "Om du inaktiverar denna SMTP-leverantör kan ZITADEL inte använda den för att skicka meddelanden förrän du aktiverar den igen." + }, + "SAVE_SETTINGS": "Spara dina inställningar", + "TEST": { + "TITLE": "Testa dina inställningar", + "DESCRIPTION": "Du kan testa inställningarna för din SMTP-leverantör och kontrollera testresultatet innan du sparar dem", + "RESULT": "Ditt e-postmeddelande har skickats" } } }, diff --git a/console/src/assets/i18n/zh.json b/console/src/assets/i18n/zh.json index 82d7f0c541..c35be2b6f5 100644 --- a/console/src/assets/i18n/zh.json +++ b/console/src/assets/i18n/zh.json @@ -485,6 +485,8 @@ "NEXT": "下一页", "MORE": "更多", "STEP": "步", + "SETUP": "设置", + "TEST": "测试", "UNSAVEDCHANGES": "未保存的更改", "UNSAVED": { "DIALOG": { @@ -2237,6 +2239,7 @@ "ACTIVATED": "活性", "ACTIVATE": "激活提供商", "DEACTIVATE": "停用提供商", + "TEST": "测试您的提供商", "TYPE": "类型", "DIALOG": { "ACTIVATED": "SMTP 配置已激活", @@ -2260,7 +2263,6 @@ "CURRENT_DESC_TITLE": "这些是您的 SMTP 设置", "PROVIDER_SETTINGS": "SMTP 提供商设置", "SENDER_SETTINGS": "发件人设置", - "TEST_SETTINGS": "测试 SMTP 设置", "NEXT_STEPS": "下一步", "ACTIVATE": { "TITLE": "激活您的 SMTP 提供商", @@ -2269,6 +2271,12 @@ "DEACTIVATE": { "TITLE": "停用您的 SMTP 提供商", "DESCRIPTION": "如果您停用此 SMTP 提供程序,Zitadel 将无法使用它发送通知,直到您再次激活它。" + }, + "SAVE_SETTINGS": "保存您的设置", + "TEST": { + "TITLE": "测试您的设置", + "DESCRIPTION": "您可以测试您的 SMTP 提供商设置并在保存之前检查测试结果", + "RESULT": "您的电子邮件已成功发送" } } }, diff --git a/docs/docs/guides/manage/console/default-settings.mdx b/docs/docs/guides/manage/console/default-settings.mdx index 4c78daceed..c3bbe0bfdf 100644 --- a/docs/docs/guides/manage/console/default-settings.mdx +++ b/docs/docs/guides/manage/console/default-settings.mdx @@ -107,6 +107,14 @@ To configure your custom SMTP please fill the following fields: SMTP +While you create/update a SMTP provider you have the chance to test your SMTP configuration + +SMTP + +In the SMTP providers table you can hover on a provider row to show buttons that allow you to activate/deactivate a provider, test your smtp settings and delete a provider + +SMTP + ### SMS No default provider is configured to send some SMS to your users. If you like to validate the phone numbers of your users make sure to add your twilio configuration by adding your Sid, Token and Sender Number. diff --git a/docs/static/img/guides/console/smtp_table.png b/docs/static/img/guides/console/smtp_table.png new file mode 100644 index 0000000000000000000000000000000000000000..9666d2e161cf135f033a6029906d4959feb142d6 GIT binary patch literal 26985 zcmdSBWn5L;8!fyjMG!<%T0lZl=|(_MI;6Whq&q~A?ve)S?k=T~?(XjHdZ(Uq{`Y=+ zKVN!&-Ry={D6XlhXg?oipaq(y`M5s9jhs>=4OtL;LrTiTj%Xp}!~gJrged=N(tSsIdRM z6_JJSMLX%ACu!@C)0O@_AsM~Z!VLU-wRqzHH!mi2_r8=hvh&f6O9o{_;0@-s`(9$V zC-1KO&=Rll(NIzl7t*wXhUEFmOl<8|%G%o6_4$5s!o70Wg6DlBjMk7V*LehSF0n4( zw^V(3tLWA; z1gj%|hkci>p6<9f)RH%BxNj|-KN`J?dnYTaGqcWuVYYre=Q`ol#Y&Ek^^*+s-)$$Z_F?FNw^w;FEIiJKr_yu{>+D#FxJ+JbSeu&{Dl?hw&$`@h zolJ0I!$A?BWMNW$%48)lxKg+eXIHXBC|sY!hR0Au2A5Pho^J|^&L*^3 zhF{F8UtjDXK=AzUeQ)3!Y6hY=gf_?)_`C;=n4ym$!F6sc+%EF@3UmxfT=9o2q+2c- zJ+xo}XKJL<`YE5~_eF3oqZ;nZ}Ga zSo||GrrUV!P0obL@iC=FO>?y)kLzt&(W7>k*Ahg!a}&n7q;uuYTh2^l(BXGEJ~xEu zzpS*Jcyyo0PUEb@GpB&lPlTsqfqu3=$0W57F)Rxyy>aM}kByY0wi~!#`4EyMuc+we zcyrvfB&bX~j&gAWruq5qyiZbEo@k&+nfwwi1ell$Ty^j}ax9yLPQTlNapm*6L57h@bC*5#N z*;4kk))>%qr8$rO^7kIaIgCizZKX%h8>7PN&+|dY$4CqZo+_^tKFOyI86~;IN5?9L ziOI>Um@O>7z$0QYX&`i>-B2%je8t0AZ`3LIHWYWuFO>y_FZ0jzhd+z&&<>>(G112c+J4z(0xYXB4Ta5ee*0u{L#5S zL#@lhlW!$|Lw@4+l87qwQ;(5H^U|s5@RO`8x07CVW%Si=ePo9NzK&?Kn+MdnCM)+L zuQ+h)>B34xJXZ8fH1*?LguG^5huVTlvWA9cZLpm z=)c%3T}(PcMsq3?4{P~5YzOfuL~mwIy5K@L=IZe9?TxC3hx{FyWo08&;*}jJ{nmeZL{;>c0N7li|%9 zcH3?*WjB`#Dk>^&`)vXBbNz#oFL#Fp*Al%QI;HFj5utEoJnrYD3=AIIQAf|XlV>Dx zHB}Vs4}M|H6Xal0LzphkL?ch629B6qZ5=t$LaKB0Rt=;le zC{&Sr!L=OjYxulby0RuCqbB3Mn4tP#NK<(^zm1*+!HAdUHZ*O6u?e4D-XIm?BWB!-%Cs|l3txNJ*(a<_e2RirgTEDyWq5j?77~; z9`HF+7)7q-vyNG1d+-}5oQKT$+MBCBT;8*UQYJ4mPiOe2+u2oY(5tlH3l%*hZf*z; z!R2XTr013Cikj8U?tk_c-*KXEZL`~^y`6j{OVTJe_m@UOie`yb&;E+KtI)AF8qZ8XtI9G3q0VQ(RC0Me6 zEk`KRhw)~wl}izI*J^vR$=v)|g@LcleQ%mmdG=9}N|WCFc%SLEm1fnaj(T+)`+Dap zqLTs!aG5n827H28IM3GMtIlT+q2d$_lw7u5sd#H@<}CE_mKV)?`0TMprlxbXPHCD8 z$t>K6Ml-_AHk7UL7V@D6lai;dyW`o47bc&q$6gtdParC07mb6>XsURo(tPh~QbI$c z2>a&F0Woh$*vyQDXY1^vh{(`MX#&4#Bj#B32qeuXr}g8i16tT2z9TAN!%9_5gQR6;Rh|jms8UD~xGfEz z^%m^b=`mVVoK@sv6lpXk#m5X~mJhW!*%u3tzIgfwdP>N+xqsK`FY-EZtFW-QvVyrQ zDVg0(Mnwe)dW5oRYGF_Yf)AsFnVDBj4Lj)EmE)rkMInSM?HB{!bMtbCNwkzOx!7Ta zz?X;=U%U0*;@dJnT9avWr@0u3_PY;bF+pJr)+$!Mul=AE|#!i>tJ|`_drESAo`a@9fn) zk$%yla6CJcCr^&9Y_b<>A8N3dtsm*9xU!Cc9rTgwp%Yoes8AMLd%t~SC3kTF=AAa8`;^>P99;|>>5n2`C@bD?Te@VoUa~8 zl9Q8h@j*H!W4VyR<@R~kXosvbX-C6= z^u`)i&78Be=GDZtj%<44%Tt`u*8znwUS78#XoKyMGCPBi)0vf?_c^4euNOm~JW?$c z8WABofa5-4F|W@U_xpDMsu+$fh}7>F%~3Fz*eTN`ZcVi3*p2dDmHo`zS--gpD`;yjU|}r zvSg&`Qe2wUwA2(fgTr!sc4oyD6{BBxB%u=1f#=pZKX4M%UtkAj78JC(_tgHrJ8!Mb z-{Y#XyxHnuv+n*Lu7H3bR4hpLl&dOV#;r`LU~&>3<&3YXxYlE5cs%JbMG)aoqiS}+ zZsJ#8sYtFma5SsXC2LB2bGZBPG8b8c7iM}|g=Tld&TOHoBxmzJ-LU$=Svq$#p~#S- zM(yPI$xE9AfGQXH?_vsPZPzb(AATzCR}+INY;UeWubER+bPW~~bx7&kCQ2jUk?F&( z>Ug|uvI05)orrnu?Z0PUjdttm>+9?Ay7KP1#@!9r&b(eR6i@h=Ce2M;9~~7HlEU~w zSj8D2AGn)~N1n0#B!&Z;uW4vDTxj)jQ4bcH9IrUf*)KrUVq`2!WT-hNdJQR|;&K~S z(cMfpx^{Du>$ijXS!Fuo+&ONSka%98u3wy)*<`deJzDW}{Wt9I zo{DkxY=zwb(v4GVL2q~ZM{#ittph3$>kMP|e%?3YKFtESw!Md~OTt7hxB*Ov{W?us zrN*_9SW7)FkB6lZa69eo?EuK7IMhCZ8tyi4;{-ViRZs~A4eR#WK7{fB9NSjCvin)( zW_|A_hK|MedmMm0Y7MSm)g;l{M!Q#pL(3w*(6!dUA(g}(lTR@f-C*7m|Kmr5;D><{)8n5Sl&baZ@cf_USr#PeGJayO zQ-Jvid2Z;kLErVbQq<k4IjM#$ zh?P9f-qCZj`m5-8!S-jv-RYG5KHkFTdvk94;N5uJ#<+1C3>wIRj&P8v0zG!NKWJjm z>}|_bt5kAR&BG?{mHql@_gtO5wNkl{>yGnL+b1bv##bh~sUE98&$~yk2iw{l@#z)} zC^pNUKn=kX(n+^w_^@@ad<2vmwANF<+RzP{EobL?}P3o?vQLKblah4qmQ%TCE;DT$s%b6??adu)a3Z>?{i z_V2vnI*~W6j(AAipQzpdi*Za|URHKQDzWy($r97SnQyiGd_%Cdra0tjnT~!(O14Ui zXbdsq?PcxY#?r8*@LrI_2H~5Vzts!73qU!ugTWbPFtI%sx@FIIpolj4O2bV3#Gu5{ zpoBfd9C@_F!C^`g_u|$krLnamF|lC`l`q?Of3hy7Tc=-RvBco6Dw(G)gplPaggua= zEHBSudLQtx$D<-Ij{qGXTYo^^b;P}N-VSO9x1w3+XfeZjofucFSx)=*b-Q+O+rdH9=*x&p@ zc=SXhP_cl|_H=hrW*i_2rWa2iVt;|TygOS!Tic8aMs>2~aN$Y@r zt$^g9cPSYNa|4O>$Ac@iMIq})Rg0gDq$%vN|@8~FPdlF3%xy}ea<#!T+N z382aS)tua-D*F}GP82Q`6BDx=7MrLYr7oY8W_Kw`k#anf4tm3s}54HdiHQJlYWPG;i_{3N0fhL$1S`YJdQPJzPYPIes55mDOrmLl%Elz~4Gicmh^<0>; z?JEUWaM+!rBkr>^Wl1;_pBP8%-GUoX;G&h4lY^jo<4EDq3U2FOr}-aaGM4kk#>VgL z+`dF+WOxH+jMtrCoZ>`(&{Qn&*RFg6$I1As8RV4MuM*dyA|er%badjaEen`fv4;x( zEcf}QFEjRp@DLbe1u}Ca4>xr#^KI{yZ2E$knonQ{0+{DL$0q@m1Hde)7tJQJ+i9q| zMo`6KG8{nqXU)3jv> zr>kY8!ybFGKDrhaMY_8=CsjP#pQ2lD-6$)wZVJY}WMSful~|mZgdg+&3_`xM?LnFI z+&ET#wVs|{c&sSNSi5S52?H$4b=%Sm%X)tq3+|v{=e{6*^}dYxkk`Q%#NAJ11*n8P z^^RB9m);raj~#yh?m{&2J>0MxHp%Fl6e*v~|I@-U_cg)L4KUa1oL54cl2H%q?-4ol z^(egXqWy4i`3?CU;ZjGo++lu!Mofx*Q;v6Wdd%F0kSG@1-{ePZcvfVYxt)jJde+`S z5xtF49sA(3x9RD~$ui(L^Q`~Q`G3R!+&FMUgxj}59xkTedy|TB1D%N`7I|W_noUpK~uBy#D{ny z56r-}cFLIOXiaOo$jE3C2Y3hoU9eX=U%{`gtpR>QSz5_<`pVkc+5~VIvBh-~$?Wk0 zX$^-@-mvbcX63;`d(%}Gxw-tPFG^6V@giblJEEnuH zYhx|V)V#93;Wg$_)6=JwHPan+dUn%dJ{}~a=N=?`HSP@fP>Pb16^Kxe0#|K z&M!7KWMzjK6Ya7tFArqx3{Zuo=}QU878?U}5XX znH=W7feufeSxk(-Q~ZDrU9QuvY6-Ufpr)pNe7YlK!PS*Dh#Lao?x#77Sb+j2 z5td9C;fI{h1wIM#Ffj1Z@i5Wcbk04NqNdqm;qf2SfHyhyZ=GQ=VxG=F z84+QBwocg8zF5E1c0|UYR!8(4D+wH2pN$5vc1L@iRB@X)OPpW@AMJE-#YxyeVK86% zI1p8a6M>Q>IBy&WSGE#mamywJtP1D4LMS!(i@O*die~dq=Vs57yrHS$xlZM|A$K1` zTcbmKx%kR&Nisj1n9^%%;32(?OhCj^!LN;$Hm+Jz`v_!@z$`AMZ=m*IzreRUJbQM0 zj0)E3wR7R=nH_y1k9Zbl_7LeqB9Dj#A|y^xo|-BxDH-FM5Es{uYRk+r2A~#UOuyl+ z$&`;zJ77sN_4UtW%_Q#`G_RUnGv{P&?i06E*@}}{JcKOv2Xp{U#Cz(<+ta_kQ(f~! z_X7dDt4bTvt2@ii0hh6paDh(~?Ta$$M$ zPi_OcX;fPA?wp7B_3QRtThE(4-}Njw!IpHShX$8-n#E%imR1d9onRk}Enb+~N?-8k z?dr1TaA1CUcm~oK@7dU_;_S%S*atGoSa2)R>eA8~#o1#0`0L!*tj8|fAOwH&7E=EH z%=vg$wJRKHnqdp0`BtPSwwI2YzR7h=LK>Dn(VUEpK~quz+eAKiY_Th^p&`-iq2cc1 z$Dr;y=1HRMR z^R0%b%fqG?F}`SYrgxO zGCwy^ucoN@X>TmOCx7BO;dCX(=Sxh)ToLy^@%NftuHal=#yPmV z^GitmNDX|a;!IJSA)LbQTKDZ+ytj87SYbZIhzH-|@l2MNmo=O3ioSrTqO!AtH1GjU zop29i32MkfTbLdOq%|^Q=cIypRWNOouiWmiO^vmk_m|}XYdDeiT&SJ=%pGP!KD}JC zKD4|J!|*OhhvrF;j*syqRg9uOIS(b9<@^tMwVp;-*m;jjJ!5T7-RW1zC;T*oNq|Jw z^c5!HwicFFsNnFcsm(GmrkT=Zy?Gxp}txdR;j>+zmE9Y69s)w7n8)MYF33<)0Z` zVMB;!GjnpZv<;Sbh~MA$1Y646Ja7EjGIkJ`S0%R;ZV94SpZH^RXhCNsGV;?Gvzbbh zX%M^uae6`HM@OYYuMU+JKh#SV?`P_-$M`9X*AuIF^!DTU9 zlI@I7ZUca!^0IB|Jq89G^r)G}yb|FnU;2!*;>aiE5n=M*Lc+E{y4uT7%%>N)Q_B;oPvUnP4b`Q0T2@_*mvJB)M#>Zwj<`6=Dd_=cR~(HC8MK$9Uc{? z#ehTZB`Y0Pt;xJG|22Co2=CrW1$A#Gt02R1b2DzMd~a%mXIvh!%;rx| zS1=-AQfq473oKudEg>d%5aOOm%J6HqOojthRGfl|nKn;#LXxN6PW!?^#zYn~FP1#}mpBI1}{y<1r`Y3M?^B$%+Bl8tbf5NXE zo%c;nkI$T8aE2L7-2SF}^5 z38WQDddZ#fc6KhV?9|l5Ehb`I+_<O~F6<3Sb6s|cs8uh-=#L&I{0rAlD`2YV0@ z9%W@^SL?YbBAs^j(`(DK&-Uij1=ag(r62ZG2{=@#lO!2vXbvW_4MEtQN|HF$iBvH$ zPUNgIyo=X|yS`urYV=Ol*jr*=kF`rlZ`+&X&g8pJ{N-F(fDt3h13}sm5G=NcZ_VSp zoH;Du1hz;Z`>5By7)az@18mKzC(x4a6RHogC2==!(AsVsC7V4LLkOqi6HucfBA9Up zvmc5d>m&2=n}HA>$8A-SSP&GS7Z4J{x>25A)8O)Ov{O9^WJ|EqpPt$N`M9gY+UW!T zdEw66uI@@alkKfN%G-}Xhs^Z%MvUM+JVsu`yS6KJDZuz~2%vPlStM&>Is6a&dBs(%P%+%cs zRKkT$S3FKVw1q@K9aeLL0ig`RkBg7t=XI2nmbbApSxUlzkOBjspI|V4QQSGM@Ubo# z=4BODPs_r1ZXiDZNCY;6)!3)dqW#S;=|Fyv>;fwR_*YQ;@qE(;3>aS5T(e19c+^&;hU{`{|qVLEkDF=FOp{vHQ)OgJIUHXybrShtjUUeC3 zVZT5G2eyK0fLzJRv0}sI%2l=7*!7kFQKTYm?D*GJD!F9@8!=+dbQ3F)gp;_$w_rn5K; z5SpHj2PuK&d{wAryqA}NFN~)|b5QUqAqz9GJqg%>Ygdz#k--8anl4P_0^Rt$W|_?QP3})lm}+f8m*JTK^ao>AX8U z`C@)7WNzPS%N(MKD^S=G~jMNU42kB3_Y zpx9dD)ymNbjwu0lPxtS`zPNmf+N!f7X(suRahe7>2-r-{mR4ecUF4km-Y;jf@v&4ta4cwV-BtwkKJ4)c z&tu`7Quj{gv;yiH$Qb($M2*gb9rg8tB{?9l2*1ClwK?1=DNQfb<#ol@i1b3NGqYx` z0x%V+7=vG(k&evf$SV#oOnP@+9L~!GPR}GN$J&)Mz|i=p?WeA%us5I*^VQo&H}=$$ zy?(vr8_MOdrPe1QXBMkINAsIzf{Q*fGW_cFYDV+}==7Ab`IJR7r804`srW z5ZBNMxx0*V_I7aa_mdtrTA0*-XLo$qAN}=%B(ihYX0sL`yg~X|G-1hR&ySWT1!%;M z=#lz!qG0!nw9+0gX~8&l3%!MTo^i9u`AGz075dc+e9aU~ zz|7dL4{&+S5U&o|z3=~UB{9+ASFz1vnD86z0f>f}e`Qk^5{DDW2z;hhc>lk1*|BLz|2q?nAQ0<+7xrTh6m80R z^&(g`f&%p)O*f4K-VoCd@!uC&Ua;_3h>#X+KGLC6Y0JL`xly@6B}`c8^GgNz|2_lD z(KL4RzfY&0nMe9v{-+MC-1FYoqA+iDt~_ePBoyF6+V>Y4GXY!^^p&Dm032nJW_hoz zw1>02ytekxy15G*JH2IY=1^Itfs>Pyq@>0>>8^A2$0Hc?#@lx8jvK%C-8zA)*=5dF z>_A0J%j}A-V*7<_ovt9X=U3y#o%d7rtRvZy zdS&1Fi(9G=I1wTH5sJR}w>~fZL^Q@Q|~ZU z=X92HWY0J}Y?UGi(q-w_qZzBCKwaQW;e46n4!u)VHN7}T0W>KIBIzsIVdKs(4Gpet zJV`gz^l{1(T|GUIJz?%#fP={Otj_$*MmPbEzwk%%R#!_4DI*HVo>(>_A18BPxSvi& zy5e6=_c&LWE1W-TGV~QlBbcu4>nh=i7T~eE_WJUL*HUJR!-mxkLbEmCn9&wBi61$? z!;MqcLv5hTt0)Mv{M8kewj`q?S328pOHMOBkiw+?aS9C`LGi1{;!)zoHLY|0dIKih zPti^gSGLslV&*!X98QNf_?!93fIiX<58NxyeLyPdvODGzG#s|nn zMkAiRXt6fRp#o}dnPy6|W>Y)R^)c`E;r^HvC`m}Vdre>?yGJKRU_5bcVqkyn6XNr^ z-8-Lk5cc;msMm5BuFEk7WDXfcQii;(BzO#sm{TSSD1WFhIr?bIj2?k_d}?d?21=WfC3R$fAHJ=EUeb`+Y~9KLoPAUDAvi=x8Wq^cbbT3smlS!u z|Ai56{4cGFw}X#8IheA+_=hGi0t_#$Az9^C&#L!(q(2rAYOkrOy&v;5-z+}a2su7R z77nh4^L#L0C^7maPI5*@M{c(;r$3ja4qRK%n?3`t8x}*r%R{Lz8656Ue~DC`0B`55 z3w$LK>pYYE0eljnDUA)1j}C`UKn=Tuy87OiP8$-THM8wibbiB_xj!Zdiv@N|UNh1p zNlHbl%AE3zB198brz?bX%3gRVTOxmBa!O7$7*Rej|5qe(ZPCDwYLmqp%t*ky)lTmX zMQ%))*4oRdsH|5QpLvm+c9Daf-)29&x?VoeA<~5JHG8O!Ww(z<7Qy5S^O%KvA&K0|JHuA#O<*Zh!DorqXov{0b-(w zRR`6YN;f3rBph-Ia=*K~L0*6l0p=9$=k(Y)&4dLV6&1W^%a3KCBPVXj%SV;lSi>X4 z1BH9KngvZZLWYb^u!Xc+2_7n{pQEFpVPhjigh;f*bB%F;)Zv=KRupvW$5v~USl)+snrSekmd6R#t6wWHB*o&^;HNVHe^m@yTs_3JUIPdG&J@-Ck9V?pGDS^Aq{O;iTxAC^j{FCQspU z8>R1ANDudZt@Er+bZjKuYr3TJpV~vN^(Co>7@fgUVQ8_D(GnseD}CBkNx>-_b9ePg zW_#Eta|k{HxJ)K5Tv!n_K?+l9<-xoLC^cKVN*K?Ven9DX`j)A*;!WY)+xu#(q})2g znpyYxO0n!NJ{A@%G*^2s4WH!3Md$5Fjbh6EBraT}?nui|IBUHf9psx^CN^|>)l?*X z!u%TZd)rf?mYTxvh5wjT9(9I>L9Y1R6KA!;g(`|45*k+N6AeEUp$}U)@gaiQFtb#F z4JEP`&ev`r?o2pTkh+(B&a=nhPhr{BT~f6sNqG&G{B#cv*S;D2X(*YX5Gea`G>H2- zUBDf!!lg_>Y8vuL19Ml97qEu_8(b*CBn$-1%^+kPd0gcMf6)kLthL@7-^0hzxP+(b z>WPGlD>siVczZyO+*Sz$S0u#gt{^wC#`R^#%RlID-gI;q78Vc*qOR-T8o&cjho zF5E-!l-d$73N(@hZbff^Z z=+P5@kSRI*@f}w%12JATD2dth+Uy2&sOBa7Q)1Q(;mnAbi0SoJ$MxIjX~L*O0zh`y z?wCA<0OPN(zlIeZjYB`jUeYNdtbzvt_Kpr_#pM&Y4Ol_ zX=OY#rD1a-oARb!3;0a*^)lS;1?nm8NOyUW{HH=tZ&4N{Aj%^&1X z^G<`rWh@dw2cEP{k$uXdgZIQ8p_r?^xIs==bs#cVt8Q8G$2m~2P)y>mlo%Tua=$)& zRH6iZ1`gJE-gF3pUn{ZN3lKUngnjpZb;bs#xCr=T3JTt%wE?KMWqUn@u@S=%ce6W$ zf*mNYAyaDC>E6!`L?es0dV@7XA6}Db|v%pt&@L2^JzQN^U$lzMQy8mrL zvBzL{c`P%_s7d&PM`)+IqP463*mR*92*MZSo4bQ;#`GH@vQ+PdgfdsY?Rl|o%#2PH zJR~LW^hWH3wd-Z+>q%B6X)3=y^vg461>6SB1ScU+g-zS!7K#khW=c!-FB|ogDSsj3 zF+PTN=x_%YVb!#0FXkY`+UBJGtaOn!gDQn~H@{P^zCBKP%F8+DPztGEH_d;@Q4Cdp z@6&hjZ?#*H^{XzRQqnF<1P?qmnI;m;pntvf@)bWk9c6fc!P(M^q}nRf$}e)4?cL? zykYJnl7WTvB3GboT;-Q?QXf*lzWsloc!?!YLUJJ}{ z?_2);i^yWU+#*SwtfbsYWY+`Zf2oA`2D-8MUYf47gC6?p#l3#*qjDV+liiCM zn!3hpuN?os^d*cEy?dAzPm&@>K|Os^VOr%(7WJ?Dx??y)pyTjZlsd48ZY)T!AS$Y& zxdcZ*B;8HD%CNM?Ll5?Eh16XS;y@evea)J-7lCvsq#3!!(Ze(^yHsI z5GImPkZ^QZ#6-lW-fq!+S_T9KvS+_#Gxg-RV_NxmYeGQAmG(gUMC7%;-5zju{TAi? z`b)1g-fdD4Aq+tPi1PtxUu3_8y+nKqJ%S?Jb>4ip&ts# z$G`!qzjbKKzhJ!}^5_^Lgmzkk@@E<%a*(o@K)$x02pOWXR|_hxvbcf_f2nL>4E#{n z*SLQt*AWRF<$xAz=8>X+c)^1}SXlntxDIU?98#sij4aIRmzHGT-#Vorl2s(S?up83 z{@aAGElq2g808CkzCq#N!ddntAaHf_aHZ1tpBRBU1t0 zwkowmjBH_Shg&l|>6!&8t=A{^#fH3{qlK_fnB#0LK72_rrY=jJA7{ZUR zc34kp=jfmy=6o4qxp%;CUfgp|t8nJ9U1}Sx^$YqDO}gX4+P3yiguF}i-46C(9YO}? z&&toskvZ8gX(}(MK5b{E#0X~d(naW(XnDK(Ge*CqlVQqvUsoCk$|-V0bYPH`>K=XL zb65Fyc+x6y;Zhn2Qr|1UB4B4Q=CfBv!-|r>iTn8@faTcGs8zVM zAY}VZF){ZIeD%U%Kfz1Jz{N?i&FseqBg)_KQj5j8uO?I1_#a*(Af0G`+3m2Ezb^Km z9{!?~{Nw)Dn|X!OL)#G973^nVF4<%Z3v{2&-XB=`pTt_wQ_(J~sLH989dum{`Z;V! z?e?lRj~Y*usvP)fF)Cq!m4t<97%rx?oC!gh2raBDFA;v;h{HZ3mnb5yUsEa3)Krkx zZN68K=iq$^J?MP``%3w}F^1!~30%lUnO>WA_d7pv3X7vB+EacLPX;AX6ynj%<&=W& z$k2jy{NlQ^H(w(72saHKG*gF5+I*B}(7zuV4OEUgMDOk&_AM<09 zbN~H&3d!bymK85#M*VwbPR&b7YZejjO#nG97n%-c3;BCT#+bB61CzoJ3lL7k|CaHrax=H-XhESVz~Cf z4plLGjRQ?>1JFrsl6-~d#DnVMHXSyj<6}r(m4c!4eYF3$P^` zft?815Y>i`fK%@f6yFW-%qF|k6snYdR8h&h|LrGje!4SfKIo~DKYl=RumFlxwrBEb zT40Ssn+{8A_87<_a4cG9+^<3Q_63ZI&BCxRWpW zu1~v8DNLT?g(k5)p^0xzYwyWR^9EIPt7Z6w$xqQwmtp;!xQKA750U(|uD7>#zaqw> zqg$wv#=Ov@(_Sl(Z%PHUM7>gq*O3<;ot9D@mR5|6j4a$zFrV3+a1MQdal1KXcij~? za+Es{O$3gSr@Id)Dwe6m7gs&i6{o%6aeM1!f?hoy7%24$!_YvVtv@_)dkt}s78<-} z+T+AfTU$sg7e0@j=haXzi)DINS>hZ$=+5;RIB z2W^T)J~ba27FP?n^N;dVmgN6EsH0iFWz>NXh`t8KH(=@<50xh%C z{V6$yX-@uJojWi2zPZt2`SWo>{58i1CP`C6cjh3RQ^VJqobQ`X)3tAn_f&XETT?6N zM||1jRH&MfFKl@2(4b4!AVB;G`(8C6U(D2-GC{l3Rqn%=L#nI=&N%xMm4R;!zo|)N zM#^-y6^8?hH|#sg^bq2Cc|a z^gQ>Xj`YevzRqf?balEEJaFLE8A=GsRn;9!4CVZ)rxsHd(w%tiHLLW9AOb$SrCldQ z>$Hd;0`tY5m6c7B0y>Nn^9YpVYZ5{6nDbfvE^mSPq8V8JJFCAm4IG?r&g-|-gx5P* z;29X-)6a(9F1!D3dt1iHh-z9D_Mq^Zp}1zr{b2LShIxX=d>Nf+F^s42C(8Fej+Aa5 zHs`A_c)^dxDkn``P!?LX(}#>)>@6g3@ve9owSX+W8UgyF-2*lBfuO0?m`?fI5Luxb zLo&O^`k^n|7jP=kWV6H1z{jBbij+8;m->I-Cc&SrkRRkH>CE<%HCM< zR<+tnr_`P&l$F_ZRX(@W5f$rkw%?K4nUld(g;|-9R&;v)CSOVXQQD|%lsUqjyS&Id zqI}V$R0u+N7oRHazwki0@`)utDW-&~>WF1hsi2G*dUrlRnOV9@u6;nIpkQ06`kxn| zSYh{!R`4u^WY<6TJr;&2H4KEQkC(??Io51h96lc7CSIWGu)DW{vsq%$Gqd>}6bM&a z8V=TG=Z@vP2A+81g?>+QZi`+&mYpiQef@JXN{6iPn}W4d08NM#2rpU5PkKxjL3FOJ+LdA{vqxNo zg&$j@)x8a5(j=ESx(ZD=r~yS#LSBC+rcxo@tnRGx&~f<*lu*6rMu=BxGqBX(*b5~1 z5}Ors>H|L4I_o~Si;!S=egfVS-JK9OC#Ne=l1M{MbMv&UiipW>Z#%OP7~DNY)2iMM z5*zWFoSeH!5ve_MCmheLb~>$pwxhs6#xwzJp;=j+T{^uvM2$QT#lzdC9U^* zQYTWHU03p2fkbUlw?L*@ZBgj(d7!G|(&0-}D6sAxDO{%b+ffD+N8{lT60X;qwEu`t z;Tc`5iRWAhTr%-(C+2fw*)?G_OcPX4IG?)-1=Tao`)f0`u~Sa5rqCOQbLQ-%8<%{8=sazwc{fQ)D{NUs@NZ$>w%^Bczl{u$=A75UgkYL~(bU9e;>T(=dTpR~5<1 zPJf^`Tl(Q4?d}oE!{rrCZH5?S`u^QF`#q)%)mX`V4;Gb37&qV`AIpqYZsz4-EwU*g zVj8n<%c#tc+1@l_+nnOJ%SbDVkGge94C&URS1lhI;p$pDwJ87Pwn0DDb=3un9T*)E zlbf6Nn<0B!=BYU1nZ5i0@vX*t23=QI$vq>4fU#%+?Mz|RBaefS45$agcqtZ$|7lKa@5fRX@f>O z9JNl67L(I%T6%U*4-NP_fPG#^9dj0M@!gdRMjkQ@2==QWs4akl61rE4)a;~0Bn;oY z*ib79Cb+k896Rw@AXlue9(pUjevlgn=1RRi>wM{rH1IUZTAOG|vwRAWsVvLSNz0TK zxG&4!K6y>jfC91@zY!z7M4VerwaqHm_}|HJom{wfw!C(4*w_w$umXY7xeC*P@Y&f0 zpq+xze9OB1&SHP>CZb#Ko3}6(H8r=>J__{Z7fIsLW+n|=cb}$@cX{Ur1gwO{fNBXa zR}ak0YBqkB0xk{6!^LwAtwbSiSm+vZY7xodaVeUIw?4!WFjIly5EBuB{rPZC1jPQI zwF~XY2D$mUL|k^su3R2Rc`ycKGcV3KtY@d%uf8W+(2)2`B{mtEa7Z=_4sZl2^v4yw^M)GUu_m8cJLXNRLn=7g$eF zQ|{&~32YlUn3zP|&fn%t(a|G;8MQDkFTnML{(7!+c(@GMAAot>-dttE@-F>a2yM1m ziTqa41c(eW`Sodj*oC=-zVeMO@U{MlJ#kiFdPf~9h^k&H^f6lnEK)wvd;7vfz#~*4 zN#HqS`n!+)9ui-JA8*9KLOH+R36nr*v|35eV5qTnAA5B^eqn)_!sOvw0;N(TLtzuE z`=0}X0z%v$j;2}@Y&qxHUS1x3Vt}MS$y-fVeA5tl3@Iz)hEmR6T!4B;z#>AaX<5@# zlY@HiG$FKf|FyNdTV7^{lz|Lv36#p&hKA!~kL!*rgWziI)z#HLDg{-e%A1mzIKjxPA^SWQA8)5OmXN z*%4Bu!937!5{2R-%+BRkd$HKvFf{_cl%hSE>1RSsYHCSpDjGzZ{=>3n0iQdk8Q@gc zJS-MmSJlgTxXvoBLX>k40`Qd(%lf7x!w=u*)3bgEpc2q(yfFnH%_%HU~y-}QURHapfo!21SoR*YT{3Ic9!y^sQ4ygS7 zB+JxQool?M(oFR0m&_w!d91sM9qK1X@pHZ*_y1pO-yIG26ZM^6dJv*UCrXG;lpsh! zqOD#RtBW2HL~qd(qL--ASML_PtM`^Dt4pE=tM^sjk(~FO_kI3;_BiaZW4<$Y?%cWe z&gXtq?Da8-P3o=JlHn~bG;?cFTw9)WNERGhZ7GxX*&FG9Yz)hogAT#IK^&G@NqnzVR#sKs$SWC^pw16LNTcs;rkGDC9s zvlr{#*TdW25#C&VMv0;Nrv6K(X%ldYd=k`^S^T0k{%o~PQ~`Abdhu^v08oV>gdOIr6k4A9EO{} z(J`xTf4E)Kz4xh)qDNkk`ZFZ&+GUZ3JjdZZy=st8t=;s2$|@&5$QK6rVkf6vX(cY+ zPROTZE);iTMp>6}fBa`iLnOmV`aB0NE&`Hbv%7;29K&nA711WFsU=xic6L@M=g#xY zmp9R&5yY`<4yF97h(>I-O6_jxOFh;wZ(Pp@~7obYq8>euBr7!nsw}b&+|5( zgy9Apbo`6DsfY6>3nw!jF*&oKf;|^r+?Wk@Axpxx?pDm(+Z>~BDchSqQqi!p-yyyI zytQ~jQC2GKqi-DJjgMT}~R;8&&*Nf5gEKCcn1!=L$OL z0UM{OofYAg?nhQRIXSGXtXBZj#AJ<<4IQ1GqvPaJIWvG|UHeaI(MMc(_AR=0bEx~% zry}x$-TyK?Fc3+UpPbwyfUT?d@m}UhK_uOIes3&($v})s0w4yQ$Q{Z-rvoYDrCC}1 zQxDNzk+`Ejy~%M3ZEbA?dTUDQV$Il^*8v$I0MSV#y6QWSN??!@DP}jKIiTCJ1eJ*(M3J;AwEAtk3U)mx(FRQc z=LbkNFTAy|vPvq6sHv!ku1~ghm(9)1tp|)ZQKSRF?a{0D{MFcAn4(Mv3K(Y^?TA9A zZ9Wl9b+)s8{3sI^K3wm*#^rt-ct|~K;4oVjZMy)l42IaU*Ut?hdV1D?1BsuXzZObF zt33g(4ZFH~iuB5d?xMxsENw_`2@2bGde@K1V5WwbN)C4J-t>iYboehqDY)iZPz`Gr z*cn$Hbqvj|twW3F;~$aF+x?!voqy+7j=^=}!bZj34%SyY+oXn&uDzLw8JifZSGlJu ztOVR$LTqS?N`LNzg3u^(}RO=LF@-aMV_449K z{Maei8kGA@)&Sh-9@f|A8?%3K1JQt*!S>M@_RC$vSv13$kfhj%6Sg86zkZQg+)AsL zLW!ASR?OwCwuP*@L+^jpi`|vW7>DV4r`_M<-{*)`Ctw6hO8viDZwAjG+&307C-CFV zmlsIBH#4If8ty)wubdkg%hl|)=n-MYgKF4w3RHln^J(O51)_|Z5pPFc&q}P48zklyNlIt(dgC1 z^Uk53AE(pZFEg99v9`sv?wb$3?cOh0Sz8OdZn!>l?!+YaVchb2OOiLn;o#4vq|-(; zr* zgfP#!;TH$rO;I{KI)pyTqBY(!O10KOztL;nq%EfF^H*1mMf|%$8(MGQH1*#rt;Poz zwV~`HA{U@Mx;?VTY{v#Or$6y~veXhSIWy*l^+x|!C9RJ;*eQ$A*os(docO3B%pEpW z77V|(0HwN<=A99*(V#t@R=6bwn)Z>lXnwsaMObf@`Yq6=qRk3E}y@w1(|Q+`DNW z)o(u)!%A0XS`CCvydq3=Qp|63=8H#l@rf~w*BdIB^ITWqMcW$Wsg%*wo|4eqALLV% zxYgij8k8=!dpLvpH7de>ZtbgM66*YBB_%pVYh%7cHYi~b8~Mqd-?2kYvvza!_m3r! z%~3W;s?VJGkU+=&Ft@x0@SoO1ktm!U&!MVh6p#9Ov^g{VMYbOTntN2x zm=d;sCRnAl7NVEKmLFC=QPeWjcOrAg$+k^b8X(l!#c_OoR>%?20Wn2zT|EL&y2Sj%|nz4+~jQ@Eb~l z4hR|Yc=lt8dg65A&xnfJQKB7&((~fc)spSm>KfEB(ASe!#|)(-9>yjspl|RG&R(=g z__~VPC%kD+xQHr%HuKxxoRAZk%|lY)U%9f0HLxj{XL@-JXqktrs~d5`Ju+Gjh}`hK z+q5*}t{X#o4--mvC!My&lZaA$yCN{Qj9Hdi+ut5?CUB52bTOoul5uQafy;c#4HJVM zek!^S$3=d*PuR~Tl}TP^OJAN_jii8*K8g>~3Cc&1SJynWx%PuZ1@*~|)%YbTyP%)y z$oYoR5zCng_r|x~jY+%zL|Y!++4SlcxN^m_haPNolqY;5EEby)F5uW~0zZ^xzu%eUk#h z?D1sEYvA|Ku&?p)M9F7o)Z z+!|BXizdAs|8?AB^jcLTHZ3_nueA5AWE5i|V~@$i)dL9%bKUrz(0&d_QK?qry*=k) zby6~!ok^u5{mh8%&V64oT`;OGIg_vjH7jFO=IgfkZ7RZYu5yOm63-b%=4j$x)*xI7 z0f*_Mud}h=7T-Sc{7+e3U7da8LuxcTcURU9oRnSD+?;n*1=Pg@Y2DB|4jmN{92+9T z6a47umr=8$yTl?$nl{%ze;As}MC{wAy7 z(a+u0p&!{bHMyuX;ob_l?$SaBGBcIS9-Yk{Y;p^;H1n9ah_~II8qgKHyHJdZ;i++f z4}I$ehK38UkMcqFp=R;fKXu6Gq>qG7sjC#!YllSrUH1|4){z-#nC9X1zv(?Y8!1LM zUG~1UeUpgZ*4&&mraN2B>h0UDtXGlN9pZ+Ufb13pnkK=&2BfhmDYSHS{mZ+!{WVJy6Q-!ww6p-)=m1QniODxK+NZ$gtsabExL#WMA#MSmQVq9EYU|`)bY_x>0SV&}~rK@Zw zqFaA~?*c3=*?IEB&WuanUsJ1IyF&gNsbrzjPbRy zGTL>Mo;WZ#*wWlQDJiMjOn?dGRoY>QF*Y{P)5FAs&^Of4VJE{2@b{mdnSmkQ z;{bn8R8(d`0Tn$x4@G$B%J~_t`klW{_@xpbUC+tQmHe>PG&eUlIvUrz7}jnQ^;$zk zg^?nB@f|{+hxbsohpE)j(GdcHNM~ndnOa*X$HvBf`SMH}>AsIgNNAx81V1)5ro}~p z>50%`{cF>Fm17hi;u8?W%ICnmk8`A%ws&`(K&ZC0wKCIC`>tP;90r4Nau$BidezX- zfWzSwSV$21^wiYWc6Mh++onuAyStBp*tWJPCETk%e^ydT9fDH6+?A~s;JZ{^&ul-K zGgs|QPY(wtC#Sgh*APWT#aNs2$w^Qd_E4H7p|{3McPoDpO#vr2v4=<-$;zk^xTZC8p{4?;*aqN&%uu)kc-T7nZ zj+jg1enn`wDl|)d{w6rjk`$9cU4NX`CVctUYe;{HTarfcOUA#3I6o%7Kb2Zs?D}-w zK8G9^FUOBD61?lx=__@#C842?Yw`VAu*Oeep)oxRZpVS6VkX%1$Ctfp7&5;K?$thv zQJ@PL>r<3-iL^J^2$C6TdaGHCmr2qUz1;9wyarQ+(q`91Rzp-X6mq5`{V+z^+Nz?kwUV+{*DhE+v-#LZ7F$CQl`b z`s-|Gu8x-%a+vLa+W_&aIqQc)rzisPsK5$*1qOl=o2!c$x8q}TamS*~CcZu#A$LMA zK7I~A?{BT5+3^BXsGskJ-}08Q(_?i5gH(<`m%PJQ;N76tP?kbVm`J+RfTloDa#Av_ z#FoMf#g%{t?;g6_0k^!7?u(IL?ymSm2)L)RPaW>3$Mb~ww7IEjuWRWS8@BL*%m;Bj zW&)zbNnevrXeUUISH`Nt*}jT6F)`sg4G&A==!0+SBi~l+TlR;t3;ik&Ko;*HFg$6r zLz}(7OI9(JQa%SEidMO6&FnKG9MO5i~B zD8qE^v3d*$QNO|3W>8Kr#-Fv;6Q`+OK|vCe&J=KNX6`s^7Qq|ytbWG`{3cM8*OqLze_LCKtg>h@_`Z8_KXlEYeFs zlY*nzP4kP1t38xq|H!35xOlA8kaqv5ruehwja!k_;xh=Vc{XDa2<>b&P|{~V?U+uM zzm=lWHd1Nsi&xor{Ru+{1$9VSMsDmJG~TB!X|yObSwp%kER%B?J_!%$P)eRDvWn>n z7I|rJVEbddT!jM=4N7_JG@VUpuY-X6!-c%G6pyZi+iCug(cJSAuhQcg_R*;r%fZsQ z+jxYHKl!Z_!SVC<@Ofr4%JSj~pJnsTI_=*BgOQ1Plb=cKqzo3K06rfWF3dH6qdC~UE0H{^8yt#ChBesH> z4H6hA#c^ol^msTZVjmAb2kGHrQ0?-V7$8#Dn~c+6MW&N{@A_p=&`SGs$7AtT`U-!a z2WA$JkW#4Stc4W@PGlR9+82MKP*D-m<*{}Xbo5{&E1W3&HqqqSnqTp31EAx#-k*3XAQF z(ywGR_vZ>s8{nz4&CF~eT>}HTW+0P7c-TrGYwLFYwBvg@3JxLI+wY8^GB(P9!6hE6 zSGZn8DTZdRF5&#F-@`6F=%&2Ph1^#`=Q9vKn~pZ1Uz^9~rmVPQ->C#|N^WjrLwm#S z_{PSkbar-{otE+}9)}F7hU$9`rm3N2AFD58H{U}5X({1qV2SAt=^E=;?I@n=2^Mzn zIHcM8y`Vv3qY%oXa6H|{;#fVP^+*cv-$Dz`!c`O!)1p+H)nlL6e2}Su$mq1_{T&Ss zi2r%B>&(r4HYQ-S@5e*9*CX(bPFp)6-k#da5c>CY0;}`5OWT~U*We=|xE3rI zeCP)1p|na4)MkC<;y$m%Q-u;ZJ3BYl7U?b{&U!}I#0B0q_}4#XE*|ylh3%2P*$3Rb3t(dj-|FuO9i^=%(G=FMVd{1Zwo_jZ^!xUZDzZo zVhV03w3}E+NXTL^ab%=G)zJHVVCL3Fu!I?vLK8MX)%42l%CNZG$c3)rF ztg8N)`72V`VTw7SH%_^>wsHbRV*LbQyKWy|{*M5+{W>`(Kw{46B&L)~U92PEFyO!F z$V)0uuUq3|W7DfU%%+q06*!L`_UAd%=RjCLTg{diO7yXs-2uxy`l@jAx#oEsp%y0a zl=`Y4aN6Gu7NXL4h|SF{FOD&Rh{{}m*0=0GQ35`wjTW~kAlMAa8{`-^Hs~#tXK2W3 za_(ZsJjfz3WCa&u)6QM_=@`3$Xe+P8@+`CsCYL;6cTDc?`rIqVd$FI(nr8$=_=FN^+y_p#7}@ZeMBnDt5@&RmI(L&^}r_8l+j51^=J8jD3tO$|5Cy5xUd`w&Uo6CC6@yxEW$5Ju#2CT6-n#Xku? zdv+m7)7Yq~v_CLYM$!K@O!{Vz1DZi{VQ*r$r}V4fyXh+9_Hzk95lbl}U8sGkqt9%* z_~Up$iG~wRNQm(1TNWgik&Gn93#27n?lqi=xbT*J7?YEOK0s0o<++M5=^?!pK;hks z%nv8)h^Q`=<7v5h*)!+!ckU-^6{MVp@Auw2FI`j#aEe2Zfj24P{U$E}X@@vt5Zl3l zte`a6HcQ0^X|TnP7O>;h+L*4Ih2S0TiG|paD0+3S_2hB!n#4*Yx$Z;25m%k91Nik> zIfeTYD?co3IcU-ipM^s}zH$Io1D5{rTiO7Q-DjfqOYY-f4!uKIaooam$twgn^i|4(h|k64s+mAF>^%EKf_A z=a5d%oh%9%1Rb9c5T7}1uV(nc@^W(x>O716Gy4@k1#C`hQi2~`h15+E7#W4q=?(> ztU5#EOba-!ia1Vp6|Jv>sDV^%Z229c(qu#hU%S*dng9`4G=gDj`YAC!)O z0~Zw4a9y~WcK7swSzSr@P0qjnHU50ErR7t|`W%WhIr>@C{oB_Qyw1)_=BoHa!ritj zWOj3U@$ zbP^8=3JJNpZ0a9$fp#P$(S)=Ik0$CY7M0nQFOb&QrTj!4^WH!O%=FEDAFA{W#e8{+ zrCj`F2o(JtnsS<}D2tH!`Baw3RJZ0s$nJg5PQ^q~w+{dA#}rS!4m`IjoRyigKtRy9 zygRpTjViW097s;4Hpj7jJHYB4UesfHgbaK9|4lMFxy}_6*o%qhO`94j_tw}82l0+t zWO8zHU!p*K2tbN>LDKMjwpKcirQWZO3$HiN$Bqaxg?ZA?G%VkLoEt&PmPa;McGOX9 zq}3b`?-vFlU+PbO14Qkh>$I~scm7}P0Bmcf#!V=p)op8~+W{A;2i1+(rTpc3rlqQ? zT3}VQKdl946+FG9d{b8+CcBW*NlDq^Q1#s2fyRw$@j#8NO&TpbWlbneCJG+=a6zw^ z*enyi46a*RTqL61A}78vL#SKr;xuvJdba2hjmTyr!-2}^pS_i_V;W4Utz8iX_tAp| z!y{BcXQ$hz5V!3g9g`Ir7Y*JLRc61q3KU&BET#ArA&`yQ)=ur6e{shlf6&rrYY##O zld0TM8xh;$B#!2GU?m%cixT&rRWMQlI z4X;s6yjqs(#%p$2LHkbc-q}29A^DzwY&bT=&qqn*5-X=YXt~U%YRD?Bv**7XWXkf< ztIu8PJewbZjZXT2+b3%*!{z4E+pe3YrcvO={7rbCSE>ygeoaaqIpFF6S;>@WwG*a% z>lX4=N=)DDORe47CX>Mfrz%TQ^mK~8OzNZD?)i7X>!^3elAUbH$p&RVlr8e(zigTT ze;V%IJin{2FGd+kVC})Wy5xnC|NjB#PTDU3 literal 0 HcmV?d00001 diff --git a/docs/static/img/guides/console/smtp_test.png b/docs/static/img/guides/console/smtp_test.png new file mode 100644 index 0000000000000000000000000000000000000000..6ce08f28187933e03774866d67ebd43c94102dc0 GIT binary patch literal 34879 zcmeFZXH-*B7cCkU6-C8HS3qgfdlyg9E$i7xKi5ZHUj=3a(*VKK@1LWVzW=+GnI>sj*Gg3xr@7r6BJ@$?_dYzbT)N@ zLhYR`9bDEgASJ;~%!HeyouDQzRu1;`8di2th_x$}o>z$8&cuVBkB3iyo|jjQk57zO zz+2;wI0Qluk$e7B<6ZK~gsaP4ZMybN3)9xGQ)_E#6;D{#*4Fe2s@1<)e%EotOsx^Q zyR*D}_LhX`bE9wOL>$wz^H_KcP4O0Ly0le5cE!&xJFYU-$DJrh^rqYnK8>5%%c}$HFwyC7&wH4-F*h zeCMKkg$j)56U%A59`Uj4P9-t(M=LGF8Dps8Y9U(Xs~(iPt>8(XtKoG z!*G3z7*3mPl|2fE+6=CgksOQt;zut+79%q|)+kzb*7LRZv5azd`hr3uXS0(`6ZJ07 z^W%C{1D%){&SXB(D=U|}EdRVwXe7jvr*MuiV()Y29|EPH{J_Vld+m-Y^xeO&@!de~ zRITFM$56`R1ZVPuio@u8BjuLU!zS%Fr;(CUl9;&R3TRFd_N|~~?^nsfFDJ>yK{x0y zS?rjQF^Ag8&tJFyjPaDLuP^tPA`BcR`nm*Z?lO3~oa(Ju#BdlrC(9EYjL2XKwX?I! zuzHJM%TukA$%VPuVxL{P(<(e7WV7}rD(S^tcDx^Pj?Yi3; z&GXb-CfGbj}-$xhQt=y3GA+-b;EAlpcXAiqaG|Qx?y;<*xbhc zoz}*|BIg{eE>Cm&V_6Ata&(pB_Kn>YagDg%mEhlE7CnZxTh*$kiELZWK7|t{fBQ-nfjQ!-Nbet>i-@f)D$xQ^vjUVfOX) zRZ6OPa`8(vW-rByQEsHnynoFue`kRXX69f)vEn$_9s9fQg8pDO)KphTXEC+o0@`l) zMX0{ZV2f;c=&Iy38o!O7Df~$soSX>TIWbdWW;vBKNld(>x?-hVKUmP+oh9e%%NU7P z$vSsC7IA%jyOBzEHEW-P#nNn)0lk8P0vR6hHZyrf3a-X@TmZ8Xwnayn<~+<`BrM1e z?PoX1Z_s^I$DdBjoJphY2DPpyx&8)wuB@U$qi#saW#AeYZ-s%IwvP*sNEV?GAAmiDqpF)ow*pQb95LV8j29BbohRu z4ud;eb*}YxL)N-koAx_o90|@j;tIfHHR8ewT@P1$JjTWHjlbL#sD$e@MpxRo3`t=4 zof^C~2&ynSH;4pX>4Stm!jmW)A= z1PR#nTQaG{w$4_A!PsDX5l@ef-xXGButwqF9Z)iEEgh)*X&%F|5Uwd@yB$#_xig9j zWn|S3vwhI$L+81@SJU$DN#p>2954Q)3_c6bXzebCLK%2sU;69 zH?5(PSsRimlrW*evMvipa-0cLGH~@Q9;eKzgvYB|GF(~kc5TNhmSs)JKK4Q`Zu zObiT^iI-$2tg;`sG+~vC#^%=79m*WGwJ69q^qvlwbG>@<#IN(s(fzTi-=zWip}~LB zB%PnObq{Ian;3TISI1r-hvy15OJe2`!B9JBp-D!&&F*MVo^D|}^XX|H^esL_6**~G z;f#?)to=6Jrr^{DdrH7=%hEK7)^N<`HPU{x78W<^wgPAB9?EqM{@9hw3adUk98O-E zK^H2B-xu>XxDXUF)Oac@@J&VA^{g;PPF#P?l3J{~%G1S;TN@)j>bsF!WK_p0XFZvj zN=PXk;c0o!RcF+E-pN~YJz1ePG{!hGjr1IBF zxlwrj_jNkKr~KyJ*Mt_Y+PCX!PzhPr#}*qnc;5r5j!l~* zW4P3GX{4NjO{?N-o+ek0PrwVy<&eX6w<-rL`WM_((5lNeMZ#TGFi-RMww>TQGP?r1gr@h{QfXc5Qr2-~42Gb}wkR{HfiCUe|+Mr&)d?RFqo zTfN3&5zsL%LEAk%Pa70{02xK zdAbehTE%0T3n=4UgM{fk5C@o*6SA75@qDyM&sFnPXWe|00I#HE{>Rpu#hJCCqt+lt zJgD>l7P+J}W-}jMO7LcDt^8aYjG>_W`*L%X{_WZRmvUR1n|*1(-;ZW_t@}$V=YJWq z$;qd2A(jUV(mhDxmU<2MQF)>q{h7*eAx@g5iMsvKM*hWXoyNgu1tN~ggC)9`?@Q3W z^O!Cp!-X8T9Qhd4Iw?`{6J4^`E}Hz^B;65WCp|`ym{e4yS?nl&ctCW?Jg(RPQ*);d zUHz1EcUf3b)Y(k+tiEPfKdw=)%of3DwLclql^_w!!NIwM!M;xmQh{j^b~nU0jLIZp z3gk{Ut=ih78~2JZMn;k6*C%yKEIpLc5cFLZUV&}3*Y%ZX(?rOse|UDyzAsOp9?XAW zY;4SFP~V?9kzFWGcJt=9^gxoAk*Uac@OvYC`LCMln^IW{PQ8EitfqDvUSV3A&dQfh ze)RO~?#PR<1hd=za%x#yS!4_^TzU*k1YRN+xQ(4si6a@7L+simwwc81=2`0TKZNu$yB%0(igMGzH6 z>+oNhl~OWVWR;1=e8ASyL%2l&H1|C(rrT;POd=8aHerwMG27BM7WH!)H^c6A{NpQb zXN1Jbeg73k+0JFNUvpyn-8Vu)1EZuCn|7GtO*<+eSRK-M@2QT6cW+kkKHcN~)5|6# z+>KcZ3{q_!9omH1ZaN7DOyCc&Hy3}Fs&^TdR9I`|e@oP4w+4X(oegD(VKdfW+g}T+ zNee#}eDgI?s3>EO9b>cd!K&8vxM;M>D$f&<9|-rs`dVxVSPwm|TC2V|vc7c4)@quA z(#tK&3eGo~NF4QD{N!YYN*6-z@>tzb`%0y`j@w?~9^9*vMRZ&`>$*e_2==9B`oQa#&OTn zQ3X^Qk{Gc{cptw5eEyey-qksI>p#hzdHQvEXGdPvAlItA_pU+LTS=Vqu5d?vouBJ2 z3A&GQn2cm>`*h3D-hRK?JDG8H!dFMTXyVmCyK6L?rjvxn(XUxGHO!cMG`odXTQH4m zc-mt@Q6bm7yIZ@vF-iJUS&0tVhNzfb%ps+oo^I!B9`7wz>c_Sr29*UGozpS`W(U;{ z)-U?|W^!D14p^_>d0Y^T@K9X^FncSsszrsq53U6;i(_@BhYUyB-n_P!AqftS(nH1^e#5|7b zJNGnLTYQAuSH<_25pi*~Zng|GG&WH%09LQ5?RS{>=oUn?M#Ak2^YltAYdTXd;z`;@ zD{Rf26x(;KGz%;r)T~T8)Vpl=-ggH;@cE6sy>>Stp&|JwW@vm`cgNArVkQ+nBqBwAo|=2~*xSSAG@Z%Z)!B{7(v>i@)^| zRc3*Gz^PxVT&ORg1_BF!T0Xk^`f!)dH-!4ad>o;2Q5FUUGh|LoN4b{PZ@n=5msPQgl`LuTNZy^ z%^Y^DURPPv|3wqG3oN)b-w9vV?6#Tu%KQD}liqHO^^>$BCl{CB;}?6GkA>_fzjKbc zE$#Q(#XQ!%eP7f~9@LTA!P&dBONa8OmqG<94Xe$vx?)(1bO+k4+gD`1knw-?vB5lZ zoDmB=tnud1Dxd_}J5oOGNb{KVUf+NPYFB;j9sr0925#$^#9e*K5!oELRUK^hby zgIT6FN{M{>AW3Rxhb#@|`fzgU)Ek^TckYj;RIx$B1G(k#?^%(I^54>BuI8DP-|#%% zGt51f)UK_7YfNJvQuEt?aa))8X4#kC+1K}!$%ivNJ9K%G;3>P*C!HulTMRPQee1)Y za>V+$J|UT993cd3-#Rq-tY$HEDCYr)*1nNvmEXIJ%@592rp|JAz~TlIw(~R^B0A@6 zOqLd;-PdaKVGEMWW93oGbgmJ&Rq;eouL$57-vCSvtT~fW&|d1xU|H^mhkCl;=s|U8 zSp81Z(DT~K?2#teQ3Kl)+=M^^LgGy`->BG>!BQ9rx=>RyhCLRYuU$M>w&3?MJn`EY zU4aS0^_a^QC#ZvTx6fzV&ROn4cPl zjzlHvWrU)go=|^qTIwGB5&^ze|Y+s z7&$IlZq+eAx7-i&Bj?hkLeEW!zXD(u;V_^<#h=58_OfKkiqeZk;vrV84t<- z-e+2>hLA=ja^5?gVsgs5tt#Bzi6{p7!EBj}JhODj!PO0KMkIy%-2O_DH=SV=e!EW9kQoAzA_^9PgN{NWM@nRO z7i+?`zB`Ym(9(wzr1#umw1&{}Q)MbbKl{`2!;R~o$qn6Vth>ZqA5dNUu0nZ@cq6U~ z_q0L0LEaO;%uYrO@k=PJjGIt#g+?7Myh;M7?C0^3eS>)Ui!G1sm@gL~-VW!_pJdd2 za7b(#HFA?eM=2#Xf3GAVCjNbFQ@3;W%labE+Q((}k!H+`o0k{@OdpHh#T&-<%>>~@ zq)(Ol)TM;+z7LI8lRP7I^LveNR*x`vl8vZF(Ms%qqN1> zRzOxa=NAh$2y=I1Pli$BGQ{t&R6bhsMq6E1^Qe$Phpx_87qjNmLkZUyJiCwFMaTiA zvx&cH%%l8!3NBHB2*c{I@{-CZr9A&FSaUVa?SQ76Xr}ms$~U6VuPe}u%-JxKj8Udd z1P0n&10QlB0Z=0HOTcnvrEzxevyBG>?as_2p%tIt;LUUip$#inh4ATID^~@g3Mk!? zmx)YXRoKRuk+IBC?3*xKLP`@}_#LOH5Jj-5%a& zN9Q3^L1r_LaM2#p@1BK0wGS(JaI`wVg=ya&iO;_7kJ?OEI(3MNJMO*c0Ue|%CGnKb$VZXrr?HqV?ekMBZC&}J4 zpD(x#y}r+zRo*_7`GN{DH-6_LQF-t5!p;>4UJch6`s%>fQGLA1K+NwPTY5V% z|J3)v@He#ZocE5&2g0+@P<-|qNa&4D-v>G^OB61Xr>F}YqE$n*mo zrbKv>EK4nN&vhFyAzwD4C`N^x*(UqT5Xgh@y2zd7lr*CTFLt>v=FnHMjA2KGW_(K6 zRaz(CQYv?(E0KwL?`x`^v?oKEHxkj0%c)V-xi+MeFRywLldGlC$;S$8E>K*9{2=|& zGr`abyF_zLKbA-)S0FDsleZZX?0Gt=qBi`jZ#Vm;2wzzq5xL; zHt==i?EWv#hYCcH9|c6hVU3;(Iqm#hKbxDs88&Qx5G5jkgF)O}RG-NVe6WE$JJ(;x zvM%6~lJAuBsVLgfPAXsOxdiaxh2stRPsc}v^>EIG)DP@L#~NUD=v~gZ{qg5d!5UDj zAiw4BH#Fb#4;-R{K)#-&Vy`$F1BVvO&}ELYyYgoEW#r^BkyJTX1sLm8|4Z=1MeE$- zie8mn;6u;m_gCyc9Y4k%!uvvkZxJ3d&sE{*)YB=ehY`&=%Z=5eK|NOWrxaS& zeUMd|?3H)S-Ow^Y*LeLGaLY5)#4PMs=fmy->^S};Z9B;V0+EbcAJD&5+4u<+z`h0Z zWdFN$W$%twd(EBEAmW|nMxtae^;)`vRZeWH^#>Xfv4*6T4XD%ZkUH!+0w|hy?&-a}Ltz&Jjx&-Nc)k9!GP~HdC~4)EH9N#6#IwD5`_i68v=goRP|oCywV3NiwF# z(6s5huU9O5oxn`cpC@`J(KnVs(wG}A9JH_jy$A8*A%1tN;}G@>pDsChFR`ckIHjb* zIYe9}FZjtI$veEfq@Y~4f&W+wMf zQsDkG`}2X5wDD}l;ZqK{8xS6MgS+JSd{syfB^_g+{vl;0l_cAaJ`Sn4o-_E?t_aO% zGz@#~lC(zLYkvg>6Sl;RbSN7`l7Nhv35~>H_Sw2o=kffx24uaaC;qU!6EH}R3RaYEM44Y+=sTb@BFfjzywk|x-_ARk%j zpl3er2ENpjB>I$9osp#9L1zpG@3EoC_rka}tE-ajU7D(p@TAIR+sEcpU;E^v`Re3ji#Z(}97MU3 zxd7Qs4+}y}#EF3J7~mqPzQcTSWd@GeG^Z&9t@o1TV~PtYxFuqErE67at6Z8ivJ{fK z%*Mb_m1t$%RspCOSO`-xR*(HfC1Bo4Pw0jOe$gB}3f0%Fc>7+3HjcrIyeC;~$ZV{` zbQ!d$Tz7`y#KlyQjTwa~u`E!nz{N4j%kxD6=~;mPR;le<{`-CG8}z^+qRZ6<^u3Y;r*rCl?u(B4SsD2YnXTrD1v4rE9|W z&LvgaK|(z)r!S^>CnqI6cMd)?E}`==Tf5tWl4oCwi;E|b`>}O(LACo->0{dA>~@LK zPoJffR36`!mOZ&|0=t-_)90^OVV0$wD#;=T_+QKTFomRc0V0KX`o?rwcYzV|5yS+4lH zz2`En$#%Q%#b*AC(i&TtV69P@OI1$s!qo#?!G%QhfBT-{idju{)Zb+z+u2*yzc1qQ ztGWkpK0aq>s;bkZfm9|YJ5x;zf(6pH#GQ-73dCkd4M2Ry=@GB#M^Y `8w94?le-Swlt8#OKWOs zT6jzPczO9SK+NZDzBQ(RL+;Cc@mQ|p(R_I_c^tT|$LIS+ZUXc=)neqKWb9hM=uxaD z{s(%MmY~NYk_q@KYVO0~di&3y%>IsGpU2JqS(OJ4B2;LYS?%}+x8g{ll=k>Vq@p#Q zgtuRH{6h%$Kw-2^mwdlFLIjU%NC4wgu&nzTf%~*yq>8poz41O%X3u2sm=r zuCI1f+%v9!C!_DaqJ>c|WRlx+b6fshS@SVG^c#BxE`V=K2;L@s@3o31#Kw1EbgVHHzIdO?`K*wFkav z()fRHfO)xT^)r5s5p?GT)Q6Tb-HG4tIxpEQmADt8Tjbg!UAuz~3gXZM;YSKLrHYo( zMS0nUV)?RZ513)f@sHK7Om_?%M%4+rPCtV7MD|rXOcq=bbKdjsx8TfNYry{=r<#G< z*%fYSE_aWO$!gjNs;2s9xen}Bj=C&H|Ty zbHgr4A@apFTuu#1a?ELtu_oM;VWI|C#LOuU*I#g}bvaBdn`O%*x2sz=;VIt-1yJhO z_G~~JS{+VPElXKu^36R;zYr8=J(z|!W-o6omZ`9x5t?H+Q0AZK82sdW;afkGk7`h5 zk7kiPjO--Kf3gu~@i-fh0n6xyj4sWh9D|GUtTJ1f*1)A0J71f;!cQ9Rbd;2`sl$up zLUF=&7(nJ!prD0XqA0BzzP8ZgXVg*Jg%g?Zfdwnv-UMMH<~@e@%oMLHzeMHR;h49) zcjZO5VqeW0$bfDoKN-8G;pR*m`rFxrW~G|M9M>y7@YHZW_luB?!fjIGuLwj;XKfb1_N(afPVT(Utw z=E5Rb6w((+i&zau2ir~awF|$26hKXft?`jR+@2o-PuiL4y@)PWpO`g>jg6(=U4R%O z-#(8+(f-bry8N@ZS1a-^zxlPEcs?zAVHI369JV}>5yip55zPj5nrLv;BM`1F%QBv4 zQ;7tUH{-Y}7i?^T$y24Ov-?^u%Y#K<&52R4ph0=;w_6d^GkSB6W%mtG*6U%2uEayU zlsW~c!7ISE4KP#%6CSjw64`nsWX;XZiup6m?wM6)p8O+*jsLK4PYgznH5vB z09$9d-YfW&y!Sq@XF4DvzqfwAoht)c)84zI7Co16n7UwlgU2A{s62v=4q6Y^2b=^X zoKfo4Spb?B<@X1)`;#9_7{k>L`^9`W%Y^JkSf!+-2o1MO~Ws07rpj)#*gV(+hL07YkNYX5FnTm4) zx*3AzC@4IcAckRvO}f_QoXB*+)iFNu(U0B(p5xV@XNNIjnpfw3#>$woD8?|Rh&dbW zuS;o!aqAEdLoq%Rz8fziU8bf~p}ltx^mjmG6neU@C}m?~pLkg4Na{lgli2CP7FCFiww9|#x{>z-#Rkn_{JZ_jhy7o|Q3^uWJo zXm`xk>gm#}eisNJ2^_HTRtrU^?WW5^dFhA2v7M)ru*1VctNG-%yjMk;j`&P?Il``E z?RA`Nu4+|a-k^0}5GkF_S;6P!A*PK>yx&7R(-<-r=1wQ|W69s!MCs}3vC-2%;WlcF zPD7^I78HgW=aSx+r1kCqaHb2;*Dk1;_ipyO@LnW>uSQQkvMY`ge#zA)R~Gvq&mg0e z&!X#_Pebh@&j4RQ415WJo$49=ABKG zlbQI7!P>b_fqYI*U!dbdB}PiCZ$~mLP^mUc%}eqTkKt?>%S?GR4Vz}ytlmiOIY4~s(kjYVo3jCQy}RknMbP{`IX#WZdBUn$ zF!Y4Umopu3_c(wB<>Q!;jBvHxk52OOMmS-6^|Oa_E`Ul6J+g^RzMZX&YLxaLWRN2# zzZ80J$k_MfFs|RMHwSRhi)mLFm@a;F2wqU>1A>ldMptD)hXJMyL93yswEJ|{f5v?) z%umgsJ*UASYtV~}*YP09vEoC-BtaG^Bg>OMdCKM|*Ye@s-=H+LZ+fnzIW(xSK!; z!fg7^awg~QfpiDK@lIx`Tyg!%rX4D$v+*ZPlHNw@7QL9s`!)#EZKuP7gFJVniRaNy z4I|tmiEDWvBZ?5nR83iIhQ`}&Ir%_-RN(;Y13-J0(S-Q&zOtR*H`Kab<(m}Gol|Lt z$$E5q&luP$_A>_p4uALrbM>VoD_lmX5te$!3>`#9s+#4VOex5>x^YDY0~_CAf_6ja zS4Z4mMOM7syeep?BP&Bf@jG_4E@S~))*}O?1e*DtOg-@pufRm|jI#Vk-Pf|7UEIoh z()hS5c7b9Bf36CuSMU>-XMo-}4ZCz*K+kZ+bJ zm)GmPL#>B$8Ex3vMY)Y>X5WF(?BUrM35ZjG8)(h&e+9iZC0s_e)@7$ig!;3sKR7ly zVTVbr>DDW=^K0Mt*RlC(yX_{PKE~-l!I>!J+{mnyU{^LVupLvoN15w$LDsUl+GKeW z(E#@Qqkh~u$n(PA?b%T|y>QiSY%>~LZh@Mcz3bAzD@XA89(_XrnAR|P9VxsWltNU# zCB#;WVU`3+O22A7*Q6Zl|H}YdW*0|bqSBleezyw-R{+te#5>B$bq*lq!~iYkt{3V( zK~O?q?^Rna|J+8i?^12#Fj94}$$9Q9mO6SHlv+2OQT~=Da6ET%dh?V)bgpoTVPtjA zz6O*-p?TV@4v&Wb_sDD7&Ldg{%B$qKV%1YIw4mwUvlv!gMaf3V(HfhyM8Tr`pm5qG zMcZnen+nKE+MsZ(a5vsSmK+UlMp--?uX53ystKnX&j!V!Rqsib=gBOb&qAIXB(2qn zO?+B8P*(1qHMqz39iB!!ATX_YbeGFjY1Z@no6Zo?*MH5fe z)rG6PmitZpj(pzk|8!^q6j?O8tQJ9VtTyGz1n4j{h^|a>-C9K$Zotd_L|uGVuRmDS za5)qg%czt%Y$g%e)|)?wbf;(wp^_#iCucL9j-z+~eiV;DAe8Tqe6K8|W(T?hHlu

6^8WiKx@TvKKbuZ;2Do)7KMQ80bnktFOu22?am@{|B2 zFq2|zoB;v8yVNJ=UX(VNf@4A0Wt6LBDHZ|ss0JYTfYwo8!uvqvCxtDGsTC+v zk62Z1#2g5|{YI;>OYF?|(0F)w1m-(He(d*jbjT{i77l@p ztC{=6Nbda~mGX91M3+Zc?|m#NGx5IsF+j5M6T0t%F4C1r;LBG3xMPKIQkqiCc3+>g z8UBQfDSoRvlLj<-KRslAU%5v@Ui>O-MK@a1)DvB3s0lK37Zz)LDd1^ZHGZ6;?%iRY z6WJp;h%s=rHa@X3hw|IZpNiervA91ivdp^+tUB_bqw#6b)2MN0@Y{FOo&CiJwVr2R z#ZHIhU1<=!z4Exh!ZbqSrr^8@ycpI;j1ex2~?PPZ=sOSbMpD z&PL43J8p<0Eg#B`>BMrsy@dY5z#`x|E(O{HwS?vwfb5IAIF+Cm62~_P;^zwB;jx^F zMR!;(U~WY`ql*%Dn1ILgrsIas3fbbN!ZW{_TI&!dn}}F0APiHcHcbG`45U`A%F0UX zS5>vjbQ5sUXMpP$H+hnMTp)rRG%_hgzT`E1E<8dmY=3XU_ofJm&96^Sf!ZkXW9W&# z$JH3E^|KbmQ7*&A7ihLP?Nw^ciWX?`rqeOIb}??j-$eiCX?u@8A&HDuSQh}*msMYX zOuOXm)^M9LdtFcf-(?Al;xcYDKcPBk$$AGm!y?A-e{5KR)Xk=qm+0*c)1>#MHLUTJ zmWyOm+nSXNkeHuI8iZMUy}Pz@Tt_WrQ+#dYDqOKmOw4V%qVp`HLj_I{3vYD1jN#Vj z`(Whr_)^XXs)wQ!7aRW;eN7WI8ubQBH8m6JF0z+7uAxP*D2$G>CPB@ZE59{dlJd;`ivz&6_(fY;T#2&hoMuJVKr&i0KO(IItT}8Z3{N zhFYT?;1gb?*0@U+1bG$13ze@x3E7Sp)R4JK@#>>(Afp_R7Xjxg0gx2Ex$iSt!Soi^ zeg1IE@-*)v81W;!u~PlcNG4UFenI>GCa#&Ry^|SsXX|;;UKf%l09uww_ z1IH2RRRcwzgWrv1Wo2rCdDj``g7)o)B1~BZ>+n2T3Q>B_<{{d^FQOm9rntjEb(Rau zG15ai>X)F9J}Jwd$7?B-_Sh_2T|TSbtr~){?Z@l0Ky$aNsp%>3?}1nK!qOgRfQA>LfX&k_mMIa0 zcEu|P?b)iu8pr@d_?^(!jBE>DMqp?T-+6WK?ipUE71N{OGSuAXS{1NayDj0hr#RDo zEe2>6L6hRF4S&Pml*e1&xumhs+OK$}Z-!-A+_GAWBNgt<;%0+;VPQ91pK|jW#81T% zTN797Vw(l7(AJKU5KsLL?RsEpgorRrl#L|{6u(llBW9S zX)cl(4zjjbt#9!BFUn#iefKVaOyAX4RfRhyq>^It#hg|$sfBRg=9QM0hTj(^KDMt` zPJWyLP{bwuj>O%hxtST8-o^2^{?ZhF37-n6Ot4=FzdRZk zZR`4q`0BX%&RM{I=O#!#3FC8RW}E4t#fJ1@(>Tf>Y7Y6QRPlTHJ6#S|sEbI`4 zGOyrF8Z!Ek$$3JD$%7;XAfx77F3v7TtG~ZiftXLrA_Z<^X}LoGBa2Cg{4cVn9`bI|0L#77|9b$YxT(8n zCT}t#lQgrhS(+8OT>qv*-%n&tCpFJeLVD}N#TJ+M-gr7UG5WtF^xMHcJUnafkXr7! zaOHox(CMM-kw9mK?cS?GV?I3@lKGHjr@wE7{GxuU!$^G!0>A!Dy6PQrD@)|ims=AL z@)Z7!m`5LY?2m8`qhuX1my`Nb2`^Tl*=zf<^a!PGq-se1Z|u4ciG!b$#M+@(uE2KI z8mg3&Ytrl1NHc2xIW44I<|et^y%jrz)2aPL{T!Ego#m+SfvrZ|zZH8uMBMyPF3B9N zQS2!PdN$pFLci}7mX9r2`X8?tA-sYGWq|$_h>H<}zM1=#$d%XqZ|!(&#s&EzlaVg! zH*Qq2B};i}#Qn#0co{hQSB7DVowqx*U1X1Qx&HlH67uH7e_fUc%pb1zJ+~{4&C)xW z-OCeUW5jut{XesJFrcQAQ_E3ImsLr{4Z{^cl4wv)ZcHyo=zk8P>EFXVn4aVITz87@ zp_7G>q@?GT+Fh;x{D^b%n(`HXqUWx+u!(+tq{fkuHl;|;F6)1zKA=t=7w7JL?QP3L z`ON+#bX_ILY!Pm)VDIP{71O=$&B!{mJaU4jZKpF4!JuW+J|a^ zF1zg$uP-Eg`YHyUez~;o6(=SGgy8Oi2FGH1)H$tJW|n71rosuP-H_T_6Kl*n3ZFT^ zO$w4ww=c#al#q@_|Wz!d4EspimQ{HMm za$90WH!P|n02`iilDvLpVr+f?-mQoZ*>&QmYwWWT+~o=fDr}1p!Y$j%9)@NEl^0a< z7;pVMYQjA~=td-u7$JO$Y!_=DIf ziVt{?b7EGcyc25$+4=sYJeciTy7c3Zozw*$-#*XAgu3yv>ohbBHoo{|arZZiyc@7z z=FX8~lBcgJ5qa9*lu*2_?d_`BW+p~U*w5B6-P5lfI$~_jIP~j6(Y|XH1p|A5wTkzo zqJ^an5|R7&$`!e1Bf`;0B_*|%G==O^pKZyr6C3Us<8|3KCnk|4*N8t3J`n{<{bG|| zYiR9;F6ZHq(P@wQ+t`!pdno=m$h$0GmLnIhb1br#J>Be;QN2CyTPKZTy5baFCmW?x zy#=8Hi2S%5Bb+wp@v(EKfRMe!k0B)KcKZeet9CY}`!J*^aWgb?IMcR!p}d-1{3}KmT`> zQC>9BdYBZ&u-ynFrC6}#(5XL%qXGH+pX>n)Bb0JiY?K|M<#yEdP?H)M)~HjczdTqbpmv zGuE-Y{=~z%uR!%WIT!Z1t?fN9+1WZP2S;%Z|2Fojx8fX;M+o-Kv!n};R14?_kcK-i zJM=4EZjDwJD1f_VRXm-ielFdOQ^375otgG1QdIRx=B35r-v2uBVddp5b+H}zx}Fnm zI%T82(YV->c)d=;HOi_>p9nh;6`^InbN0mbtanbKjK<$=VxYjSj5^@wj1*>iWeao7U$RAXXm#F(6 zYQg+i)6rJUaLv95Nt^?-tQ&<`MIMSo$)zn%^qZb!-^n?m!!0OFNp2dD3x&!Ifa!_!;{_x+S z`+4$~Ig?n0y&tBAJ@)2G>ixR#2!=Wmz(6qbu_c20m8dn^S|m`&QEcJZAKOtkKd`yg z7T1nTLtZeXj0%|TzmGE5C(VA_bP~;J_(5rmRPR}d7jUm@PlA~R>8$XW(}0A!*LI2B zk5}FWle^_Owe{PMd;YlXe=c5;*=<$)X;0o9ExdAv_*yOWO4C}+yAk2e;}KgsTjKCf z@@0zep5Lvk6dE2KhP)MjeEafcui6TmkkC+j_kS^})PDJv`NezpRyw1^#Yf7;%VDd+ za`RN7pZ|Qy55A-7o_@Go*H$mNBBO;DipgN9KQ!H@6|x<%SW=3<6|8OdT^e`EWqmk= z$~pFTi82)Yv4gf*?u84lD&G1)ijEFg^!Fz#9$wtGc!z`tOWT|BWf^X_gjKzM-wIi8 z>+M+@ZFG!uU0tVs*`%yzUnBVprg`IR%FgK;KR|zmh=i>EreK$?ylKVq2K701o3ii8djMfAi{GzWYJ<{XyN+9zrDI zwK2J>K)FF$f91z?jQ(%~p2*HPR~9$#dT_AXySd+_IO%Gp zlQdroarbLYwbsW={u)d`>c!T$iYLc?RQjem!B$~ylw^NDslP#8y&bm02`2Khp#R_Q zI=e%AQax7wbECrNeeXlU(1GVPVgeq0v+SjMA7qoKezVJVsX%j=kR zi?uQ25Zj5EgJ-@VghQe^j2?A5WhpS8ie`XBb1!13-ghQspKN@4?oE?B9nX5w{sBlmdv-_fJ+Sq%36X*8Yy3+dTXnZS z`2Of&Tu}cvCF=N|`OD9EoTrJI%Bg;3TWp{vMtO4_L$>I5iOX*zIrLPbjx-NAH<>cMQu90nR&av8e zZQ(;bIG!VPYITj+jK|*X{Idh`wo_)tc%4$W%M6#?p=df^{YgVtlm)-9=^ll{R<}D{ ziCYU-b8|+naoz1*8z~gp|0Ua&(|@7Mz;VlH2d!g6GXII5*I3l z_2~D^sqMVO3D3-Z@?VF3WH#1%g2KYmw#-+8KCc^)kc2ZXnm_8H*6i4S zaTBCM^F0-IkaD8t>t*L=7oT(pT_16ty1VUzzjN739E68Q`gxDI_pMtha}Jjz&U#u*7g6IbXIr!HN?EqxmhDuY?kYieWxs|1b?&r zkDh!=SorHtbr%@-i20LxmhZ=2B_wYUE1NPT=g{X;tVT1Yzzhppp+ z6fm|5LhBzEJT9HC-!Y>4{kc&>?+?I4WOTlgr`G4#hgM&ftt8QT_tcph&4>QszD;(& zr7}f!QR>a@?s*lDOd&bcrl;|a$!{BVN}*g5331_;z9w2a)8z<=1E~f^fq)GLgJA(7*&xPUFG6`-_JD z08G$sb8qiQc8vW-?}rgvENsVk)%c&~M$Foyi#g^O^xhYqwou@Uo!KGw7kS8vKK@x@ z4tc*&P4Q8#>ze39cOGi|0nH+-zV<`f1hBn4^DM` z`LRk}>~6e-9S2z#`9iRR+L2i9r@se+&r~Sk+w*_|D*vZ%NULt|-VVRB>meWd@kQ62 zT{V=}ff4DO<06IxL;2X-Hz}LH_NDP<8p|HJ_`U~t>y`&gB11=SzwfLWm%&!g%I$wK zlW*dbq45`_=#alKHm4Z@F&7ZwJgptj&esb*mjccObcT%BdLA@u$v=(%H-k@R z9z%ThdiBD#RauGe{CobbTlwGU760>y=LP=$Jpa93dbRTZYVIwdqHNo?QIJP407aBe zK@jN%i7`ki1*N-@?ik8Iln#j@RRjd2yQP~EkdC1d7=|7g28Mmj^ZGvTzt^|_Z|(iB zf35w`TE@h6-&dcSjVt3R7CxalyL$VO&K zpXIv}solRqx@3l{o-7Y^+BLuLdXe(=&3`W5^-2Gkj_mrgFvCGFhGwe4X%)CTw@^k( z$87RMCA(zVq}vq#Ywtwk`O%z^--f*Wjv4TQ9qSMpT%Vpg=H5-{@Xfa${x&-# z)6CR^SOHT&)db}cd-mrxZ%6YnnchPS8o!*mM|HLr90 z!DoB?nAxy}4{e+ry=o^ZSf zuN$s$ASc+XpB%~4Hzt^p&ZH+XAQER=yc8X^hMwiuQ0U-z3aS(0CTZ$y(OofB_~Ac2 z9>j%IzwkH^y?CfCFDaT$-h8e2ec@2>5W#48ZRvX9O9$V2IxPRY(tX24Xgk&RQLcTY z|LMsS`73K){mX16Hc5sp$^_oonV| z9X3wSG~P?fQWY^MNe@Cp9iQGqvs^U$)5N%JTGDszkXUiS^vSfz6={kbVR}KikQo{6 z4w<~t0px{$FSraIBAN)A2r-w#>!mH!CB8+X#N+-nthyr9_VZ+`@{Ml(^qonD`AvRwS7zNh~WnGBdR2W@wLPFY*R6Y{<6VwxX?bkdWR0 z8X+c@IA=;n1rz$GxcQw38b=2~aB~Obk2C@fcWdgy-x0(D6Q&jwEv6!0#7$+={+SIu z!*S@SGQunhgDi@EFVlDR=lc=0SWSPT;32n&jmwE*|GDff94&_(fx{01>-}N5^cGXIBi2{&)+F*nMq{kvoS?>o^y<>mgrj`n{kfTSH? z4e{$g^&ka4g>p`{ykyqFRnm3y3vB(?|IH;JE0#`{kC6(Q6Cb_hvZc139MPT zt-7eWHV$slmH+PQAt3e3W9wTDN?FVVU|2I-leQ0jbxnP-ucvqWtXpwk!(sk^{Y!dciY>1UT`{N zG3nh*JuUP*JBrqL+jVS*XX9rbD}c+`pDRLsPTS*I?(TuORiYEL?U~XhgjeH4wm_@= zwid*1>x0AJu%%2kn;j0$MxiYP=zv4b+gIVB9_6t)5fP#yZY~59Dy{pKa92BKsLk)J zz!5kOG1MtzfvUG;>Oe9Off^IVK%=r(g4+Y82v#^dVQhRB5kNBPRT)`XGK|wAt)>D5 zJJ`KQQbw7O&sn)8=P{hqUQAV|r(HQR1i*bAvFRouWfToTBszWaKGGKXZm_b>@H^m( zh54?udu)t>nMMG@4kmgyzz%``?P?Ffxtg6&9D z?bb-6&|HAv5#!wuTx~4Yt#Megm`26#)NGfZ_m&&u=SmszMKgE}@HCqF5lZ9a1HkJd z`J^?i0Ic!yPr+iXX#syBc9Y*s0{luTs6mRFESomZ!k|!kk;DFmmTv=RP0tjiKG=6QO6nhCc z-_Si0Oz^~ng!Q0azvua<+@|ec%l!*s@mj-7cdr@SjQbNMAD-P82PG zCWP<;!fDCX_r{j{nZotY)oe_gUYT#Z0y58ZG7j+@NSx?|wHM*u_7-GW8JkFEizp*B zz{x62Q*Q__>@ySIeep%$u?b3!HQFDv(h|jAQ0p?8wDyF0<&dJ07Tx)rrPO=4*quY* zcct=MMLE4HM|=Cn%^8liGoS8zqvXmR$ITK8=bpec<$ogz7(2pl&M)4ASO+w}olpJz zD^D*LIQJBEbn0ND3cv>Zu}f|Mv6MQL2X3vcBkE<;qtO0RjtrY(Nb{w!fR9`+-s+rq zw+xKJt|kQ>qjGP7J3cE?6(l~|d>bB42@dbu3^pWqyqtdj&a>cYy@LGxYWw~JXDYYd zFy@#E%B5B-X6^5@;eavoqXG%F^~j%%~uE{@uDi8QO!gZg3N+aL<*`U4DiCA0=tV@FmNzjIIy4KT{NbD@2X?y z7#WxGuQz%K{)KT#N+0iG2jF>k$4il9g*Gb1K0>AK)x95?eM)tMC?C*S&%WqBeC<59 zip6l(g4}cYl`|t{c8>QeRglWw#}l+F)1uCX@l5F{7D6!Ky~l_2iN!%o_&S>f3B<=8 z@I$aRXtL71E8J65zE54eJ2&x=)X(uo5#Qvo`QqKg;#md24Y;@tcJ5V9Pn0dO5H!|R zeSJ9FD`Df_+A(=K*jpAy429NPjxTMM1hsxJl$@cNs3v-GFJWP9%Ox!@T8Yrnp15)5YxAk7dVp*p z=L2XX#pC(H7Nm?z9H8PqD)-b!?>Np4l-?_X7dfNf32_PqoQx6r^sfU=;WY?!A#yAIe_^bHST3_+d=uE5S3HW4zU3L0%KRIjw`T9}!$s?}(wRE;}l%Ej>UrImmXd2TUbH{@EPNeY3O z<20UHHJFRm&b7V+D6%Esor^1?JGK?B6Dg{j_a^QCo^8CflF5zx=_NozdayAS2WIac zZh1Sde>!L)zE7ukzoY$G1H|h(AZ|6PaB(jTZ0Eia*SggZ{>;}i0;`6n`BXMcv*YT} z*N2|u%u?|V#(*M}^x9(p@f|jxYa*D&`i7ZC??FPd-pDWqq1k{H`T}UhhKa+AvM|}q zS8SZFvyk`Wp+~D=b8Bs7%hO)TJdzc)dzuc|P4;O-a%_ME6nF12PCR7AzG`t}!vS`* z+TCPWgY1iWrgiMv@^X%5sB2HXp2WVE6Y$9=Xomr8eDhM!QjY6<2`2%_&yl0Jw%P!( zA}@|iRRB}eZtNSe_~{$WN$8!oA&P>av-(d0mBYp--?**yMm07vT0oLJKJu>#mS{kM z_16TOw!Et6VvJ7eVD1+C_j5Z0_5m-%kH8%&q9L&=bxJtJ%JZ%ql9RWTVg$A57IqP5~; zII~1&;)iS=jYp}~u5Q9h#B+o!(6=8she8hgb3Lx*YU^xm+`6mTojyKy^4gnoU^PEF zC~S>QG_Mjab8*Jq9jsh%7r_6hD_nz8fDC`ni=B(hlVH^@jN|?nXe80@RD9FP8v#&_ zCr7?u!I?bSy21t77T)vs`G`ek{K_~Ck=}E~^m-CUrL`A<zn~ z?alPr?#;&f%kWBiFSq4mJ^x}74p>Hvsrg<-CTs^2J#&T3qQ6@f;5d;UA=yAe2I&p? zHMCkub#)ftuX&6r?-*elO~g1!@Zb=zX35?NhVCgcsmaQ1pR$!xr@t0F(Lx0EN0~o5 zCO>mOZRCzes;+F0(SH_KxC_Ic=KI1 z_JV|zl-tIuxhDWlap~6p3E@uFCg7?7XMZsmikrE~uO0JZ(~H1mp^Trk+Q~qcW5<;D zC|T9o!O<~q$M7;i!{8kzm8Fx>iMplhE#i*_VX6)jbVmf2!BfPQoN3VFwVKV;4P%mjKFu!ig+5r8De52DC) zv+LPQhgskEfW$Htf=Rec2=`o{sp8#?2Leblui82Gn~?rv{b7HOcFw0?W2Aidmswcu z0;IIQ+2MXJlcsHS`SN9;aVmT;zxW{{Y;`!GrGLq#?VLmEh^fs|sMMnAb0JMN?;47qz&z@6pu~s5<-K@(O`Bj`F{zLhk zj*Dkc=jVEvdm5RIa-UyghAW-%1cYyuovkGmh)fc{IJ1A_`ppaMIGyA9n6J$&#E1s9 z3`5DCYc;SU$JKsRFMu@h8t{cDSZy+{7hkRqPNtQVt6(&RV5$>SvZq3Qu-SwQ7x#8{ zr5^K+IEBhD{LhJT%V8$fT6e3p<@No< zOp9$NDUBiq{upsM2RMd@aOn-*ue=E0L}d;b?sPNHC~1({DR06`Jiwm5G5L<4 zvw1K?Mb=-~Tdz)b#^vt`MH20|@Qj7uLIKUnaX)c;t@uf0Ayeqij?#=_ny^Pet|#Kr z9+X>VTD{On3p$s(hKY$gn6aUajoE=Wew-6)@HRqhUW8qDZslV<|9<1|{V)?($ba=} z?JWgZobuz0nc6b<){)fX_HD~Yq2<8jP!&$d0T+Qr ztYo@5Ulb7SYy2kyTbqcu0kBZ#23j@-SUb72Cs4fdF!IgeNmg~ z!8V}n0g`)Rbt9s%kZgDN@{ie)9jD^Zw{QRI+i8gqpo>&)eNB&RN!&v4gC#YKjUFjg zdn|jrj3wPB`QgCPX7aM4y1Zjx00!K~ni`2asmyNN5r&epJdkN1;%~%7&c{4;3VG*# zGGnzdUZi?9l>pnBoUz;tRg_yqruo;$_!wK5FCF{5+&ct0Jd>?wf!l}Q_<^oz-FmDe z;nE)eY5plWqf{Gk1ev@h&cjj*gh85A(*r4!8;p#pmUC@IT@;V&C@E+=4xFiP(B2v- z!(_^O1OZLDM#4tL9hS;k?dtB@IX5U~WJdFK76)`vHt!-NS5YG1A^j|85jyT*EiI7T}k04a_T9 z=yQ!tT2?%~g!7R__P3HVNvicMhVX2!=K-SOitqB$&TjcJNyt1BDYx(%BS=FkV*gyY z!x1U#@*1Fgu&gM6yb7d#4X{8gy*;guaFp#`oKK5XOG(G6C@EE%8YEpkdlbO846>{8 zusC_1%GKTlYg#ug;6ouD9BUbwTGFKi6O9>51xtNu)>ut4(t29g7JzF$BNX^q`$riT1i-ufs)>ms_{gmlaRF63 z;>iORh1u`EbS?lq%z+$KZ=ix^lulSIQ_()_IF%1_L!FM2R_S&w_oY$-6ALcAK9qe? zwuvw=aA9{_M$vAlh6>mh3lX~Yxjfo6evGa$U8BV~#r;ZqRTrhZf#Pw_Y_8w5M94Ot z6VGF=WZzwmJ?>}#Zn5EE?ZasGfznbzutREO`Mq#;QK}b@iO+hoVxJ6*8Ndy90AsLK zPd<_(Z**nmEX=U<_Qh|{n{LMVs7Xpm#euZ~ZfuY<8gpMcku=LQp3BjXX#gb!KqI}?+UzNv); zy9SCu#4#CNGFLGb1jb3kQI`=knue4Z&{$70W+ZtwQIO@Hxi`5qha2Hsfgc1pI1(Q* z`R=-CU^m~dHxdi&sp4xWSyq1?jO_0%mp;kvZj5?C5r7AGjeil9PpXDdTo2{;+Lm&{#IgQ}*rpP$2(non^p6JE)N4y-5Ou~m{2ehj7sWxAFZ@XZ z3Uq4VaMPjWx?BKS1@5E8DLqj)h-@j46+gBb@?+Uef0$uR4HNVvHSl7v1V9=P2tVrE z-ZAG`q`qU2SnO%7-|o5x5S|u z=hX=~#h`Lm@|>2QZGZ?n8&d>%O|2v)6O$F@WTh^$o<`<7wR=wUn`jdPEO|!z0Po7e zz_lv)S)&}k$zhgJ-^ufUCZ1OhtCP`c=Ec<&McX7Y$fkg&epTt3^$H5|xtNBaiG5by zyjdGSZ#@~_+-}d#-HpjY@djB$)F4xG*SjD5BP&N<)rV_@_ z1n&iQMro}|&Bvxy9A?xjY~S6N{vNm#3uTc2*yPKaBm((X82ttYGfGiP{EWqG8_Ug{ z6Wcd;;O}ETDuhaJ0>Pu~t59~>JaRc1Wo&f&$e`}!)#8Kge$dZK0UUigp9WN$$x(|S~yQ2ysO^bOuI~*!iOIQ@Y?%2`8PcpAn1A%;PG}#Awm~`B4aHeLCag|I}O2z z$WL7_GXAYx2E7K}p!tT*z9ba4VKF)8dCpRV<^H#16#HHNp)QpeE)sWqd{MKaM9TY% zg~WnyhF@hyS5MC?7=o7rfD>yn`=9x~jAd5tmh1Vv$SLnMJevtF@p^mMbiYNf_ z*h0}iWK5j+Ob*L=Ql}1pRsa&s+dj>`vOp2*FYU<(xV6vj^__Tw=Z&Ll=AC^oIV?~6 zGgoGJcQ;MKGXrc1L-~4)DWdrgfxF0kKG8BnX_M(=5caQ@beC&@nhIK5ng9}-Fc~-S zh|hSp%~WL3n=J;=?WXPXsE_xaB`cep%7t@O+D@0r?o$=D4fVW=&cOv2sEEm8Oxf$v zj6uJfH1+X@7etof@tg}hDfPbSJ;JZ|89$lL-t!l;AbcqP*wwX10l`%08`R5SZf@@D zX{rN~2B-mL9CnUnPLm2s0Ga{;Shi_q7CCV-rmZb4sLK^Of4baK{z_}v`*j4Ls;jN# zgQu4W9*R3t06-MC*i5TG3Pn^%j@6})?g|dw#;ri5JZFo+BW`cZrr~8 ziKYJ~P{s)IpWk~7%x7tJHCt*tkwVtO=S?t7kwZ$49z80<-^Nrdl{Y9lTH{9-f3S0q zVTMC3;41BAzwkwFyjWR+ukQ66V4fH0rtod0KCP1jl=)=JTpONWz`wYy`;iye_iysV zBmvTGZ>iWmS<*)EnYTHUZ+d|&?zvCVUj%o;Z&mPQP92aKHEk&NEM9blC(#El%F6(! zP63$b8n-QC$a!6&w67aM3^)ml4{Vv-D7@(c-?t^<|I-|8MH$eQ-g7j;J(d^d)jder zx&m=OJprz!pr`KonIuJdgHEBla5}nSFsyQ#My7$f(*F66{r)?EpdCrWed_*Z+k~~d z2yj!2t;mfVbe-N1-dw#bI(!AI#KcakJczuisz`s&lH1sDk`fa^&g#S()!6@i_raKv z#_yPgaJ?jKDDo9d`XYCB-S3!vREkXInxZq=gt?k!8U%c17_>UfV+x*r) z3hMj!FP{D*YTwp=XcF0fp*N97X?>9iID=`E*`U0%YqgW2%fcSnpwU4e^6$`wW!fwj zB(2V82Z|?DJzW`RiZvA1Rly)yCxL42wNFe;JpCcV4g|X z^DkU@A-4fd=9=a@eo_1`t~pXiJKxBc=knV`gL zl0hNT2UF_kyn9+q13`~^@Jaell32XM=pR|`y{U=U@L?>PgoBR-;WxA852|^IXOq;Jftg-bk;oqF`=G)5z z8OC$RM%M^F_3p3G%rrys7cauh{MbZxkQVNbZ9cxMRVTp+CAS!@Yrb?fnt+9s^;G~# z^hg%Mc5kJpqc7mTO%1V>lmSPB_!S-MwFt)dU&E(#@M9#`?sxZ6`R!ct?``8yn>a|k zEDhPIFlph##tk0a3U?S4`Um!y10>71z)r3vRboL)t?pel%*-3OtVBZLMv>>O`6>omQ5TCnuBF!rft5VgUZicok^_*zki5e#@?$J zJ0I*J+N8Pvi4#2k#rmwbmH|=yj=3r0ZDTrPjEAmy+leUtn!G7v7E2q6b(MZZ||b zn}dq>_(_d^(~hm|TXg|VK_Z$yg4VvvdK2(&@G_9z7`G$o2j>b^B-}lS?2`sc4TWPQ zKJJZNc3$)a0jE*lZ3g=x`;uie8^4TNYbWlu5QeV#)R(kt?1`%@|KKub=d3zZWm8;>qAYv57}WXHL* zvTtF@nQ~P^seP<|hLh4_m{tlZ%{Gz{`zyKIAUiWFf!~p>Vl-c&uicITNGTJUoUEJw zBF}Wv`mAmgGoMb;AQ^biD!;-Ud7RgP9dpqaDNHJ=JKw@BEiKs%mr!-7`wW#>G3WT> z7`K~5BcdErhnlbjA}=SCz(WLvb6#XwVxywNy9P!>z_VM1ilz&GIn59Sk1OIRlMgm$ zKQOQHvkC2y$3y(n=|=Ajmn}WWAKiW(A5UZ?Rk7T?JCY{rp5gE7rgx$GAT4^LMnd14 z_QHd#!~mEimRkDCvIROK8Ybn;1={o({zK4XdpL!T(BRMK2wy{CV_W^`q<0b7Zd*}2 zCY7;>HMLxDErJMI(U^@F_kPwMDWy~f(29#wH>KQX3O+(GJp@_(Z6{q>;N$Dvu}is_ zg-zu=RDo)qIS}nsM#Rp3kDin1ixp_(dJPcT&Q+bJ5kK{ ze2W6lALQC;+#B8aQI(E`9d=;3{uyi|FxXEA(oKtn*$ z5M8HY`Vg)%Jf}x1!;B+r`DHs1nawSJ9hm0Y{Uk}BWA=p1Ae0kSWMS`?iFVPfD!_Gs z={JSHvPe9v_jVc(&D=b#vn6wN-8F2c=aj{Z*(JTo88yTu9dpF@*D?< zHjSUH`y4G1ocVb#)-zMPE-bz{C3@|9l(qi7mL9Ekd|>Z)jpj|z0|C6i@32A)rVyKR zh9MWK&r(S6u#fptBjX@=3W20oYxuA?{4q$OsN1~m?1hq)^Y_01dd772WXogg*9`(4 z8ymowzmKSUtm?p1Zq5J6bu&rGzu{kYZqK0{#4atbr;4pO0xJrWgg&fG^mZv(iySBZ z`7KawX2wt;b)crsvTXtNwC)1Rce4Eao0V_*WIt$VVrKX)UZnymGMf7(HgQ{i>9sKq zCMK%1irY*d+Bn|4e*8_pc)xiL^5DU|S|7r~+??=|ziCQV*5iD~d2hD)Oe>2e7Y`*v zkWb?k0H1#m&whm_jisUMf`cBESWN=z#C;4a6dUUeh(⪻kuucbWfGApR6heWx7xpv!Gt+X``>d?vdcSr24ccKx68m=K$6r}tECt!~5>(Gj?< z^hbrei}4xlDhr+UzJLG=!eTRstf{SYIc#!wT}ffqDZ=P&_+ukKgQ9etoQe^h?S^x# z39KoyP2vJD)x^xKtaC{l`72P}*3O`fo$P04bOfsB)=c}W{=ExE+>@o71VN6|Z8^O4 z@nj3P{>GKytkT2e1m8RzMes}&^}Z+~WhEu0@%zk;Sh~^t=kqI{mv~q^Kb+a~?r&|y zlTa&Usl{bNGI!a^hbazJQ!$i~K@(#3Cdv)hElBncHa1qJm*I7F5`e+H7z{j=Snu;d zcwa!h%TynI@RVrAT1Ap~oWR<%LB(oyURtS_*WV~K^r0FR36h1~Ut2XbHX4{o~bUFNp*?YQAP;bj4B#d%KSmc6>R zRsu9UYsbKR{c;+9L+n{FQe(y|n<*WYVKgmZdt6UD^~Yb3o)!@q4g>npd%Ow8##@7j z^6U$U7Q8U;*icKnp8rWP&}}wgK@tq~)3~Ir>8Yuw4Ym*a;7P^Dnz&j`<*M}z$Tbi+ z?>-UyBNg~2F!wcnuyo)Sljrds!t6K2#dVNdNQrgds5S0{Y;d)-GzQo)&K3wW?>|Jc z=?o(MC2*qFa3f2-qi1l%$c+REpXHBt{t~8(e12DFN(cdAd4D@ZI_^7&4}aE&;5XUL zR$Vurm^h`Rs;jND{3cHG03dLn`995;8)6?(xyjwX!Y%uDrY=By{+=~Vr=o;}&179= zPP+E4_E#3jX~Wx{_euo!bo}@pW1A5x+)W?-KSjme33I{Z^Aps%udv9xL&_e(_QpC=Iv+$Zy!$i)hZ)fRnH1pCM4^%0M_`xbGilt+wF;l4Ui)_UToE(tA?w zAY74eshKq}DIi-xDY9CxKfU^6vp4f!LO!x6IielI$s09w67FYy1b4!2f#X>^Y3b?7 z=$>g1;1joP40S*#?wW`Ep34>;98?GQPTqLItzT7bzGV%D%6IdyMM6?CPD+QoDFaQI zsX?2xD2U!1{Q$BvWJ_$1%iGh4)li3Az4Zfxn|vnni{p3Z(=MF8@WVNLT*%y(xfh}n zcZzWnUO0R9t4I&_bJ|Q!ezx@2i+XFTK5PRx?i0VTzq9#ew8C-nJ*d5z2wk2|{k<&% zakHT^h#+00gW(xlaWqn+%0Yc%a#Azb+UoZ0tQy~a?K1Sg*R0B8wn8~zFMXQK^)iZe z6ANsr403WsOfM}K+U&bl<173zL}hHZul2>B z5lP)2G3N+6z7IWOwm{DyU@}KX?ECap$j88})_QJMS?Mbbb{*2cI<0iP=H3kJFAg6U z2pE$F*;U(LG4@?1ukFx5^xJ@y)_>+Dgit+?8ShlJ1XUCA`o)r??h_AYqJa0@jj5`a z7arK!(wv$2rUG=(5<@6cOX(R3X3_4#vK|+cNxVWO;j!m#isgO|JS7xtoMXkugdj3? zt$}~&Ec@B<35IBAr9Tt+^49CcO{>@v)(V2 zS22i^q~DW;ye9p}AGU(FIl+GBFq!sEzgC*x%l>h~lNH;UlRJ%RMsmx7boW1zG#5_9 zPFmqXt0iqqVD9l+B>bzy%XPh6CbQeoEdZKWAX=6hW^#p{Bbg$?Rm1>|BI%C0jojD0;G)HK(pWE>_8|$RM#T!uLyq|r0e@-p_SBmU!e+T^azY-){Vq<9e zT%@RI5N7o5{rhgMgxP_FlAUk;e2?*0%@DlOn&C=ae4^Ft^#VA6!u8-BLTqj;;FkgH zb?FcnC|AK7s#u$d;dq-FT4&~sF`p>#@K#GNybq}{kX?ZDN#F1JAN^)(>dYU5XSu@l zq<@<@Q21Q>pYsj>-T8z6Q+Ue~52g3v;LOIqyFDZMxaN01-$LHg>xtxo-cD9tm;W`# zKnJKI)2CrZty-U1co@I5zWMN>Eb8i`KLx+5cvxO~w(w9n2SkUf=CAe$ff;E(h`fyp z?_b5Hc95>NpX*rsIjEqdZB}#C{4OZ)^>_NWc)}A-OhnUfDzQ zhG!S$*gM;j#;|Q; z&N9k39a+Nh2l?aGcCX?lU<>x%k0#>phM89znMHS$7$HPs+3;T@FV>?Y)n~~PFPUkq zQ+MKz_y?1Z_E7NbmYka8k2r((1i@b!$l9YyTqn*HCOnhynF)R@YrWg4lww8dJnf{% z=PWQSa~HXR|EcEnR`3tO-HWXF=X(GD_x4*A6kiY1ZTm|7Ev8ois?Tn2F`2bqHUl62 z{M^o;(M!1~KlGECu6Bn1{COtngKO}@=OXyQRMID$nZp>J4*0Q^DR!U^`s`RFcaA(FLFTUaZxfnC0`dNxboGN_7>RS&IQ zWy%(lRWW62=jYs9P5@(qs3+oS8R=D=H8kqGK)Lzx5-eZF#`nilBA4Tzd1^~$Fmt|* ze4Je{Owq-fsoH3)p_5%OYk}{>T#v&Xp|ek38ZGRau)wF9r#zIN8@o!Z4h;7a2G2!r z8KpNXfDRF|txQo4Pz-B5-=}H*@{N5!p^G{CpctP8<9|NI94@3m$GC+X7UoEuYsBft z10aan!;^+}vbEFR@zkmDqy@4g>(zc*sFM=7PV!swzmX>#(iUJ-P5u<~YH5>ti( zx9<>1a}sU9Xxcdv1Dl#oAgLaomZ8J4NVRe(6^uS96iW%McI*>(s^v9l!sSR~mv3z` zT?Liks6^a%Q{X$FIyto+LC=(;Kc5aI9EF)mbFqF`3;WU?#aPL%?CtH1+u)zezy`V) zps+2DwL7o(y_&Y$v*F!^;z5G;=WF$ty){UBh$0itecW$=+a#qJ;iBdTg>pCqf}2cG zOYh9v8aE+7WlE7x&c0Y)q-IKav8|to{{!(ypR)Jl4w|IxYrv}a17wWko3JRG)fhc3 zA*i2*c9WB$E6XdA zOa0~X>?9z%YiMYQ2eNX|kKBf-k<*FHKDN&X0RfEw@hC zd!mEN_>xW!N#fYs+6>B1GDIa;e`g6lkb8LGN*}f^6UATs-M@_mwEL?HJqPRD#yh- z9)6$PQKA}1O(~w0NjqvnzUN7i5v(NOk<-AOxVVY_??*ax@hwOrl8Eqhu!47vyieBp9*J!Gt!~JW~KU_+liHT zwzl(%uOeJEF0IK@8@G@qUyJ^7N77B*#IGPBLQKCFH8|iqG)yF%Rh)855t+$9TPazd zd-Qek;FU`q%ggiZNm~HUsy==0I8I2BeH~oVzhLtl_j@ zc(3#7Is4|=wbeSfF^rv-p#cJy#C+v!9CX)^64ohfkfv^2KlMM((oyY3f=ZU~=iOA^ zFO3hc^b@A98WRH59PL|M?ohebKP~HSLj2CY_T;sNH?F_3Ky1~*hQD`Si5F30!w#7p z>IVM>rHW4{j;1SaaJ>F5`S4!ClN|IRegb3!wwu+?AKI)zngXD4%i@`?4o-C#1HI}% z0eAA0^v4-hEXsQc^v;8e9ar~Xubq3vSz^kT+Q3Jjs^n*Rh-0Eq^ z^1%2$py$mH7e$e3-))fHS=?4)QW79ymOnjc;&F4xRB;K7vj4OE#N(s2)+0y{CfEhhZlE@SI3a$W`fiz5~U z$;cb5O-#Qnas3tj~85{uD{@3A4lB#`csh%zQlTS^air1>K>TTAStY_i;^w{ZS+1>9fF% zo9Q}U=(txcpZim#I0LX-;}l)&^#!BIYD6GR{OA)Ysgv!I1gJlfHJUi$c4TaeblHZ< zlnim;Yy~x7H%3)DtrqSFdYdj8>(DyxGgE}J)&|bL(1@^-JUpcE2|BBBQJ= z+tmRC3|1d{S(&j@3A1jDErMMg_HHd0sXRaRP)nVhBb>AmsUpiQ^%R(HI*YcGtq@Fj zsT0>bczrDIq3R`kN0FDQklKrmIEW0t936Qn>K%A3?2FQ~=bAT1pV!sJec5NzjZ?)5 z<1Nt-e(mR)c^rk-vD$H$%%qF%YO-_POZd3nqxbiqdBn_m?^oz2+)U`Dl)e6x)M6a^ zl~k&Qi4#AR4@mBX-7eI&PpaAdJ=8rI&3NiouUIT3S0eX!C88>!e{riIP5pa)AeYSW zBYVLrf~ll_PnwJjybIQ({67Py{;$C0kaMD7y>lP?{KzQK6ar;=b-AKPrmz1mVL%wF literal 0 HcmV?d00001 diff --git a/e2e/cypress/e2e/instance/settings/notifications.cy.ts b/e2e/cypress/e2e/instance/settings/notifications.cy.ts index ce500fc92e..ca7af80d46 100644 --- a/e2e/cypress/e2e/instance/settings/notifications.cy.ts +++ b/e2e/cypress/e2e/instance/settings/notifications.cy.ts @@ -26,10 +26,11 @@ describe('instance notifications', () => { cy.get('[formcontrolname="hostAndPort"]').should('have.value', 'smtp.mailgun.org:587'); cy.get('[formcontrolname="user"]').clear().type('user@example.com'); cy.get('[formcontrolname="password"]').clear().type('password'); - cy.get('[data-e2e="continue-button"]').click(); + cy.get('[data-e2e="continue-to-2nd-form"]').click(); cy.get('[formcontrolname="senderAddress"]').clear().type('sender1@example.com'); cy.get('[formcontrolname="senderName"]').clear().type('Test1'); cy.get('[formcontrolname="replyToAddress"]').clear().type('replyto1@example.com'); + cy.get('[data-e2e="continue-button"]').click(); cy.get('[data-e2e="create-button"]').click(); cy.shouldConfirmSuccess(); cy.get('[data-e2e="close-button"]').click(); @@ -44,12 +45,13 @@ describe('instance notifications', () => { cy.get('[formcontrolname="hostAndPort"]').should('have.value', 'smtp.mailgun.org:587'); cy.get('[formcontrolname="user"]').should('have.value', 'user@example.com'); cy.get('[formcontrolname="user"]').clear().type('change@example.com'); - cy.get('[data-e2e="continue-button"]').click(); + cy.get('[data-e2e="continue-to-2nd-form"]').click(); cy.get('[formcontrolname="senderAddress"]').should('have.value', 'sender1@example.com'); cy.get('[formcontrolname="senderName"]').should('have.value', 'Test1'); cy.get('[formcontrolname="replyToAddress"]').should('have.value', 'replyto1@example.com'); cy.get('[formcontrolname="senderAddress"]').clear().type('senderchange1@example.com'); cy.get('[formcontrolname="senderName"]').clear().type('Change1'); + cy.get('[data-e2e="continue-button"]').click(); cy.get('[data-e2e="create-button"]').click(); cy.shouldConfirmSuccess(); cy.get('[data-e2e="close-button"]').click(); @@ -77,10 +79,11 @@ describe('instance notifications', () => { cy.get('[formcontrolname="hostAndPort"]').should('have.value', 'in-v3.mailjet.com:587'); cy.get('[formcontrolname="user"]').clear().type('user@example.com'); cy.get('[formcontrolname="password"]').clear().type('password'); - cy.get('[data-e2e="continue-button"]').click(); + cy.get('[data-e2e="continue-to-2nd-form"]').click(); cy.get('[formcontrolname="senderAddress"]').clear().type('sender2@example.com'); cy.get('[formcontrolname="senderName"]').clear().type('Test2'); cy.get('[formcontrolname="replyToAddress"]').clear().type('replyto2@example.com'); + cy.get('[data-e2e="continue-button"]').click(); cy.get('[data-e2e="create-button"]').click(); cy.shouldConfirmSuccess(); cy.get('[data-e2e="close-button"]').click(); @@ -140,10 +143,11 @@ describe('instance notifications', () => { cy.get('[formcontrolname="hostAndPort"]').should('have.value', 'smtp.mailgun.org:587'); cy.get('[formcontrolname="user"]').clear().type('user@example.com'); cy.get('[formcontrolname="password"]').clear().type('password'); - cy.get('[data-e2e="continue-button"]').click(); + cy.get('[data-e2e="continue-to-2nd-form"]').click(); cy.get('[formcontrolname="senderAddress"]').clear().type('sender1@example.com'); cy.get('[formcontrolname="senderName"]').clear().type('Test1'); cy.get('[formcontrolname="replyToAddress"]').clear().type('replyto1@example.com'); + cy.get('[data-e2e="continue-button"]').click(); cy.get('[data-e2e="create-button"]').click(); cy.shouldConfirmSuccess(); cy.get('[data-e2e="activate-button"]').click(); @@ -159,6 +163,7 @@ describe('instance notifications', () => { let rowSelector = `tr:contains('mailgun')`; cy.visit(smtpPath); cy.get(rowSelector).click(); + cy.get('[data-e2e="continue-to-2nd-form"]').click(); cy.get('[data-e2e="continue-button"]').click(); cy.get('[data-e2e="create-button"]').click(); cy.shouldConfirmSuccess(); diff --git a/internal/api/grpc/admin/smtp.go b/internal/api/grpc/admin/smtp.go index c06e3654da..f5abaff5bd 100644 --- a/internal/api/grpc/admin/smtp.go +++ b/internal/api/grpc/admin/smtp.go @@ -5,6 +5,7 @@ import ( "github.com/zitadel/zitadel/internal/api/authz" "github.com/zitadel/zitadel/internal/api/grpc/object" + "github.com/zitadel/zitadel/internal/notification/channels/smtp" admin_pb "github.com/zitadel/zitadel/pkg/grpc/admin" ) @@ -128,3 +129,29 @@ func (s *Server) DeactivateSMTPConfig(ctx context.Context, req *admin_pb.Deactiv Details: object.DomainToAddDetailsPb(result), }, nil } + +func (s *Server) TestSMTPConfigById(ctx context.Context, req *admin_pb.TestSMTPConfigByIdRequest) (*admin_pb.TestSMTPConfigByIdResponse, error) { + err := s.command.TestSMTPConfigById(ctx, authz.GetInstance(ctx).InstanceID(), req.Id, req.ReceiverAddress) + if err != nil { + return nil, err + } + + return &admin_pb.TestSMTPConfigByIdResponse{}, nil +} + +func (s *Server) TestSMTPConfig(ctx context.Context, req *admin_pb.TestSMTPConfigRequest) (*admin_pb.TestSMTPConfigResponse, error) { + config := smtp.Config{} + config.Tls = req.Tls + config.From = req.SenderAddress + config.FromName = req.SenderName + config.SMTP.Host = req.Host + config.SMTP.User = req.User + config.SMTP.Password = req.Password + + err := s.command.TestSMTPConfig(ctx, authz.GetInstance(ctx).InstanceID(), req.Id, req.ReceiverAddress, &config) + if err != nil { + return nil, err + } + + return &admin_pb.TestSMTPConfigResponse{}, nil +} diff --git a/internal/command/smtp.go b/internal/command/smtp.go index 87c8acb4f1..f51bef9b53 100644 --- a/internal/command/smtp.go +++ b/internal/command/smtp.go @@ -285,6 +285,89 @@ func (c *Commands) RemoveSMTPConfig(ctx context.Context, instanceID, id string) return writeModelToObjectDetails(&smtpConfigWriteModel.WriteModel), nil } +func (c *Commands) TestSMTPConfig(ctx context.Context, instanceID, id, email string, config *smtp.Config) error { + password := config.SMTP.Password + + if email == "" { + return zerrors.ThrowInvalidArgument(nil, "SMTP-p9uy", "Errors.SMTPConfig.TestEmailNotFound") + } + + if id == "" && password == "" { + return zerrors.ThrowInvalidArgument(nil, "SMTP-p9kj", "Errors.SMTPConfig.TestPassword") + } + + // If the password is not sent it'd mean that the password hasn't been changed for + // the stored configuration identified by its id so we can try to retrieve it + if id != "" && password == "" { + smtpConfigWriteModel, err := c.getSMTPConfig(ctx, instanceID, id, "") + if err != nil { + return err + } + if !smtpConfigWriteModel.State.Exists() { + return zerrors.ThrowNotFound(nil, "SMTP-p9cc", "Errors.SMTPConfig.NotFound") + } + + password, err = crypto.DecryptString(smtpConfigWriteModel.Password, c.smtpEncryption) + if err != nil { + return err + } + } + + config.SMTP.Password = password + + // Try to send an email + err := smtp.TestConfiguration(config, email) + if err != nil { + return err + } + + return nil +} + +func (c *Commands) TestSMTPConfigById(ctx context.Context, instanceID, id, email string) error { + if id == "" { + return zerrors.ThrowInvalidArgument(nil, "SMTP-99oki", "Errors.IDMissing") + } + + if email == "" { + return zerrors.ThrowInvalidArgument(nil, "SMTP-99yth", "Errors.SMTPConfig.TestEmailNotFound") + } + + smtpConfigWriteModel, err := c.getSMTPConfig(ctx, instanceID, id, "") + if err != nil { + return err + } + + if !smtpConfigWriteModel.State.Exists() { + return zerrors.ThrowNotFound(nil, "SMTP-99klw", "Errors.SMTPConfig.NotFound") + } + + password, err := crypto.DecryptString(smtpConfigWriteModel.Password, c.smtpEncryption) + if err != nil { + return err + } + + smtpConfig := &smtp.Config{ + Description: smtpConfigWriteModel.Description, + Tls: smtpConfigWriteModel.TLS, + From: smtpConfigWriteModel.SenderAddress, + FromName: smtpConfigWriteModel.SenderName, + SMTP: smtp.SMTP{ + Host: smtpConfigWriteModel.Host, + User: smtpConfigWriteModel.User, + Password: password, + }, + } + + // Try to send an email + err = smtp.TestConfiguration(smtpConfig, email) + if err != nil { + return err + } + + return nil +} + func checkSenderAddress(writeModel *IAMSMTPConfigWriteModel) error { if !writeModel.smtpSenderAddressMatchesInstanceDomain { return nil diff --git a/internal/command/smtp_test.go b/internal/command/smtp_test.go index 204614632f..bbcbd0b365 100644 --- a/internal/command/smtp_test.go +++ b/internal/command/smtp_test.go @@ -1196,6 +1196,329 @@ func TestCommandSide_RemoveSMTPConfig(t *testing.T) { } } +func TestCommandSide_TestSMTPConfig(t *testing.T) { + type fields struct { + eventstore *eventstore.Eventstore + alg crypto.EncryptionAlgorithm + } + type args struct { + ctx context.Context + instanceID string + id string + email string + config smtp.Config + } + type res struct { + err func(error) bool + } + tests := []struct { + name string + fields fields + args args + res res + }{ + { + name: "id empty, precondition error", + fields: fields{ + eventstore: eventstoreExpect( + t, + ), + }, + args: args{ + ctx: authz.WithInstanceID(context.Background(), "INSTANCE"), + }, + res: res{ + err: zerrors.IsErrorInvalidArgument, + }, + }, + { + name: "email empty, precondition error", + fields: fields{ + eventstore: eventstoreExpect( + t, + ), + }, + args: args{ + ctx: authz.WithInstanceID(context.Background(), "INSTANCE"), + instanceID: "INSTANCE", + id: "id", + }, + res: res{ + err: zerrors.IsErrorInvalidArgument, + }, + }, + { + name: "if password is empty, smtp id must not", + fields: fields{ + eventstore: eventstoreExpect( + t, + ), + }, + args: args{ + ctx: context.Background(), + instanceID: "INSTANCE", + id: "", + email: "email", + config: smtp.Config{ + From: "test@example,com", + FromName: "Test", + SMTP: smtp.SMTP{ + User: "user", + Password: "", + Host: "example.com:2525", + }, + }, + }, + res: res{ + err: zerrors.IsErrorInvalidArgument, + }, + }, + { + name: "password empty and smtp config not found, error", + fields: fields{ + eventstore: eventstoreExpect( + t, + expectFilter(), + ), + }, + args: args{ + ctx: context.Background(), + instanceID: "INSTANCE", + id: "id", + email: "email", + config: smtp.Config{ + From: "test@example,com", + FromName: "Test", + SMTP: smtp.SMTP{ + User: "user", + Password: "", + Host: "example.com:2525", + }, + }, + }, + res: res{ + err: zerrors.IsNotFound, + }, + }, + { + name: "valid new smtp config, wrong auth, ok", + fields: fields{ + eventstore: eventstoreExpect( + t, + ), + alg: crypto.CreateMockEncryptionAlg(gomock.NewController(t)), + }, + args: args{ + ctx: context.Background(), + instanceID: "INSTANCE", + email: "email", + config: smtp.Config{ + From: "test@example.com", + FromName: "Test", + SMTP: smtp.SMTP{ + User: "user", + Password: "password", + Host: "mail.smtp2go.com:2525", + }, + }, + }, + res: res{ + err: zerrors.IsInternal, + }, + }, + { + name: "valid smtp config using stored password, wrong auth, ok", + fields: fields{ + eventstore: eventstoreExpect( + t, + expectFilter( + eventFromEventPusher( + instance.NewSMTPConfigAddedEvent( + context.Background(), + &instance.NewAggregate("INSTANCE").Aggregate, + "ID", + "test", + true, + "from", + "name", + "", + "mail.smtp2go.com:2525", + "user", + &crypto.CryptoValue{ + CryptoType: crypto.TypeEncryption, + Algorithm: "enc", + KeyID: "id", + Crypted: []byte("password"), + }, + ), + ), + ), + ), + alg: crypto.CreateMockEncryptionAlg(gomock.NewController(t)), + }, + args: args{ + ctx: context.Background(), + instanceID: "INSTANCE", + email: "email", + id: "ID", + config: smtp.Config{ + From: "test@example.com", + FromName: "Test", + SMTP: smtp.SMTP{ + User: "user", + Password: "", + Host: "mail.smtp2go.com:2525", + }, + }, + }, + res: res{ + err: zerrors.IsInternal, + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + r := &Commands{ + eventstore: tt.fields.eventstore, + smtpEncryption: tt.fields.alg, + } + err := r.TestSMTPConfig(tt.args.ctx, tt.args.instanceID, tt.args.id, tt.args.email, &tt.args.config) + if tt.res.err == nil { + assert.NoError(t, err) + } + if tt.res.err != nil && !tt.res.err(err) { + t.Errorf("got wrong err: %v ", err) + } + }) + } +} + +func TestCommandSide_TestSMTPConfigById(t *testing.T) { + type fields struct { + eventstore *eventstore.Eventstore + alg crypto.EncryptionAlgorithm + } + type args struct { + ctx context.Context + instanceID string + id string + email string + } + type res struct { + err func(error) bool + } + tests := []struct { + name string + fields fields + args args + res res + }{ + { + name: "id empty, precondition error", + fields: fields{ + eventstore: eventstoreExpect( + t, + ), + }, + args: args{ + ctx: authz.WithInstanceID(context.Background(), "INSTANCE"), + }, + res: res{ + err: zerrors.IsErrorInvalidArgument, + }, + }, + { + name: "email empty, precondition error", + fields: fields{ + eventstore: eventstoreExpect( + t, + ), + }, + args: args{ + ctx: authz.WithInstanceID(context.Background(), "INSTANCE"), + instanceID: "INSTANCE", + id: "id", + }, + res: res{ + err: zerrors.IsErrorInvalidArgument, + }, + }, + { + name: "smtp config not found error", + fields: fields{ + eventstore: eventstoreExpect( + t, + expectFilter(), + ), + }, + args: args{ + ctx: context.Background(), + instanceID: "INSTANCE", + id: "id", + email: "email", + }, + res: res{ + err: zerrors.IsNotFound, + }, + }, + { + name: "valid smtp config, wrong auth, ok", + fields: fields{ + eventstore: eventstoreExpect( + t, + expectFilter( + eventFromEventPusher( + instance.NewSMTPConfigAddedEvent( + context.Background(), + &instance.NewAggregate("INSTANCE").Aggregate, + "ID", + "test", + true, + "from", + "name", + "", + "mail.smtp2go.com:2525", + "user", + &crypto.CryptoValue{ + CryptoType: crypto.TypeEncryption, + Algorithm: "enc", + KeyID: "id", + Crypted: []byte("password"), + }, + ), + ), + ), + ), + alg: crypto.CreateMockEncryptionAlg(gomock.NewController(t)), + }, + args: args{ + ctx: authz.WithInstanceID(context.Background(), "INSTANCE"), + id: "ID", + instanceID: "INSTANCE", + email: "test@example.com", + }, + res: res{ + err: zerrors.IsInternal, + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + r := &Commands{ + eventstore: tt.fields.eventstore, + smtpEncryption: tt.fields.alg, + } + err := r.TestSMTPConfigById(tt.args.ctx, tt.args.instanceID, tt.args.id, tt.args.email) + if tt.res.err == nil { + assert.NoError(t, err) + } + if tt.res.err != nil && !tt.res.err(err) { + t.Errorf("got wrong err: %v ", err) + } + }) + } +} + func newSMTPConfigChangedEvent(ctx context.Context, id, description string, tls bool, fromAddress, fromName, replyTo, host, user string) *instance.SMTPConfigChangedEvent { changes := []instance.SMTPConfigChanges{ instance.ChangeSMTPConfigDescription(description), diff --git a/internal/notification/channels/smtp/channel.go b/internal/notification/channels/smtp/channel.go index 88f5bb7f6b..0fa4462870 100644 --- a/internal/notification/channels/smtp/channel.go +++ b/internal/notification/channels/smtp/channel.go @@ -41,22 +41,22 @@ func (email *Email) HandleMessage(message channels.Message) error { defer email.smtpClient.Close() emailMsg, ok := message.(*messages.Email) if !ok { - return zerrors.ThrowInternal(nil, "EMAIL-s8JLs", "message is not EmailMessage") + return zerrors.ThrowInternal(nil, "EMAIL-s8JLs", "Errors.SMTP.NotEmailMessage") } if emailMsg.Content == "" || emailMsg.Subject == "" || len(emailMsg.Recipients) == 0 { - return zerrors.ThrowInternalf(nil, "EMAIL-zGemZ", "subject, recipients and content must be set but got subject %s, recipients length %d and content length %d", emailMsg.Subject, len(emailMsg.Recipients), len(emailMsg.Content)) + return zerrors.ThrowInternal(nil, "EMAIL-zGemZ", "Errors.SMTP.RequiredAttributes") } emailMsg.SenderEmail = email.senderAddress emailMsg.SenderName = email.senderName emailMsg.ReplyToAddress = email.replyToAddress // To && From if err := email.smtpClient.Mail(emailMsg.SenderEmail); err != nil { - return zerrors.ThrowInternalf(err, "EMAIL-s3is3", "could not set sender: %v", emailMsg.SenderEmail) + return zerrors.ThrowInternal(err, "EMAIL-s3is3", "Errors.SMTP.CouldNotSetSender") } for _, recp := range append(append(emailMsg.Recipients, emailMsg.CC...), emailMsg.BCC...) { if err := email.smtpClient.Rcpt(recp); err != nil { - return zerrors.ThrowInternalf(err, "EMAIL-s4is4", "could not set recipient: %v", recp) + return zerrors.ThrowInternal(err, "EMAIL-s4is4", "Errors.SMTP.CouldNotSetRecipient") } } @@ -87,7 +87,7 @@ func (email *Email) HandleMessage(message channels.Message) error { func (smtpConfig SMTP) connectToSMTP(tlsRequired bool) (client *smtp.Client, err error) { host, _, err := net.SplitHostPort(smtpConfig.Host) if err != nil { - return nil, zerrors.ThrowInternal(err, "EMAIL-spR56", "could not split host and port for connect to smtp") + return nil, zerrors.ThrowInternal(err, "EMAIL-spR56", "Errors.SMTP.CouldNotSplit") } if !tlsRequired { @@ -109,7 +109,7 @@ func (smtpConfig SMTP) connectToSMTP(tlsRequired bool) (client *smtp.Client, err func (smtpConfig SMTP) getSMTPClient() (*smtp.Client, error) { client, err := smtp.Dial(smtpConfig.Host) if err != nil { - return nil, zerrors.ThrowInternal(err, "EMAIL-skwos", "could not make smtp dial") + return nil, zerrors.ThrowInternal(err, "EMAIL-skwos", "Errors.SMTP.CouldNotDial") } return client, nil } @@ -118,17 +118,17 @@ func (smtpConfig SMTP) getSMTPClientWithTls(host string) (*smtp.Client, error) { conn, err := tls.Dial("tcp", smtpConfig.Host, &tls.Config{}) if errors.As(err, &tls.RecordHeaderError{}) { - logging.Log("MAIN-xKIzT").OnError(err).Warn("could not connect using normal tls. trying starttls instead...") + logging.OnError(err).Warn("could not connect using normal tls. trying starttls instead...") return smtpConfig.getSMTPClientWithStartTls(host) } if err != nil { - return nil, zerrors.ThrowInternal(err, "EMAIL-sl39s", "could not make tls dial") + return nil, zerrors.ThrowInternal(err, "EMAIL-sl39s", "Errors.SMTP.CouldNotDialTLS") } client, err := smtp.NewClient(conn, host) if err != nil { - return nil, zerrors.ThrowInternal(err, "EMAIL-skwi4", "could not create smtp client") + return nil, zerrors.ThrowInternal(err, "EMAIL-skwi4", "Errors.SMTP.CouldNotCreateClient") } return client, err } @@ -142,7 +142,7 @@ func (smtpConfig SMTP) getSMTPClientWithStartTls(host string) (*smtp.Client, err if err := client.StartTLS(&tls.Config{ ServerName: host, }); err != nil { - return nil, zerrors.ThrowInternal(err, "EMAIL-guvsQ", "could not start tls") + return nil, zerrors.ThrowInternal(err, "EMAIL-guvsQ", "Errors.SMTP.CouldNotStartTLS") } return client, nil } @@ -154,7 +154,56 @@ func (smtpConfig SMTP) smtpAuth(client *smtp.Client, host string) error { // Auth err := client.Auth(PlainOrLoginAuth(smtpConfig.User, smtpConfig.Password, host)) if err != nil { - return zerrors.ThrowInternalf(err, "EMAIL-s9kfs", "could not add smtp auth for user %s", smtpConfig.User) + return zerrors.ThrowInternal(err, "EMAIL-s9kfs", "Errors.SMTP.CouldNotAuth") } return nil } + +func TestConfiguration(cfg *Config, testEmail string) error { + client, err := cfg.SMTP.connectToSMTP(cfg.Tls) + if err != nil { + return err + } + + defer client.Close() + + message := &messages.Email{ + Recipients: []string{testEmail}, + Subject: "Test email", + Content: "This is a test email to check if your SMTP provider works fine", + SenderEmail: cfg.From, + SenderName: cfg.FromName, + } + + if err := client.Mail(cfg.From); err != nil { + return zerrors.ThrowInternal(err, "EMAIL-s3is3", "Errors.SMTP.CouldNotSetSender") + } + + if err := client.Rcpt(testEmail); err != nil { + return zerrors.ThrowInternal(err, "EMAIL-s4is4", "Errors.SMTP.CouldNotSetRecipient") + } + + // Open data connection + w, err := client.Data() + if err != nil { + return err + } + + // Send content + content, err := message.GetContent() + if err != nil { + return err + } + _, err = w.Write([]byte(content)) + if err != nil { + return err + } + + // Close IO and quit smtp connection + err = w.Close() + if err != nil { + return err + } + + return client.Quit() +} diff --git a/internal/static/i18n/bg.yaml b/internal/static/i18n/bg.yaml index 175775e73e..007a20bf53 100644 --- a/internal/static/i18n/bg.yaml +++ b/internal/static/i18n/bg.yaml @@ -53,13 +53,26 @@ Errors: NotFound: SMS конфигурацията не е намерена AlreadyActive: SMS конфигурацията вече е активна AlreadyDeactivated: SMS конфигурацията вече е деактивирана + SMTP: + NotEmailMessage: съобщението не е имейл съобщение + RequiredAttributes: темата, получателите и съдържанието трябва да бъдат зададени, но някои или всички са празни + CouldNotSplit: не можа да раздели хост и порт за свързване към smtp + CouldNotDial: не може да се свърже със SMTP сървъра, проверете порта, проблеми със защитната стена... + CouldNotDialTLS: не може да се свърже със SMTP сървъра чрез TLS, проверете порта, проблеми със защитната стена... + CouldNotCreateClient: не може да създаде smtp клиент + CouldNotStartTLS: не можа да стартира TLS + CouldNotAuth: не може да добави smtp auth, проверете дали потребителят и паролата ви са правилни, ако са правилни, може би вашият доставчик изисква метод за удостоверяване, който не се поддържа от ZITADEL + CouldNotSetSender: не можа да зададе подател + CouldNotSetRecipient: не можа да зададе получател SMTPConfig: + TestPassword: Паролата за тест не е намерена NotFound: SMTP конфигурацията не е намерена AlreadyExists: SMTP конфигурация вече съществува AlreadyDeactivated: SMTP конфигурацията вече е деактивирана SenderAdressNotCustomDomain: >- Адресът на изпращача трябва да бъде конфигуриран като персонализиран домейн в екземпляра. + TestEmailNotFound: Имейл адресът за теста не е намерен Notification: NoDomain: Няма намерен домейн за съобщение User: diff --git a/internal/static/i18n/cs.yaml b/internal/static/i18n/cs.yaml index 9f737b8142..b119e1bba7 100644 --- a/internal/static/i18n/cs.yaml +++ b/internal/static/i18n/cs.yaml @@ -53,11 +53,24 @@ Errors: NotFound: Konfigurace SMS nebyla nalezena AlreadyActive: Konfigurace SMS je již aktivní AlreadyDeactivated: Konfigurace SMS je již deaktivovaná + SMTP: + NotEmailMessage: zpráva není EmailMessage + RequiredAttributes: předmět, příjemci a obsah musí být nastaveny, ale některé nebo všechny jsou prázdné + CouldNotSplit: nemohl rozdělit hostitele a port pro připojení k smtp + CouldNotDial: nelze se spojit se serverem SMTP, zkontrolovat port, problémy s firewallem... + CouldNotDialTLS: nelze se spojit se serverem SMTP pomocí TLS, zkontrolovat port, problémy s firewallem... + CouldNotCreateClient: nelze vytvořit smtp klienta + CouldNotStartTLS: nelze spustit tls + CouldNotAuth: nemohlo se přidat smtp auth, zkontrolujte, zda je váš uživatel i heslo správné, pokud jsou správné, možná váš poskytovatel vyžaduje metodu auth, kterou ZITADEL nepodporuje + CouldNotSetSender: nelze nastavit odesílatele + CouldNotSetRecipient: nelze nastavit příjemce SMTPConfig: + TestPassword: Heslo pro test nenalezeno NotFound: Konfigurace SMTP nebyla nalezena AlreadyExists: Konfigurace SMTP již existuje AlreadyDeactivated: Konfigurace SMTP je již deaktivována SenderAdressNotCustomDomain: Adresa odesílatele musí být nakonfigurována jako vlastní doména na instanci. + TestEmailNotFound: E-mailová adresa pro test nebyla nalezena Notification: NoDomain: Pro zprávu nebyla nalezena žádná doména User: diff --git a/internal/static/i18n/de.yaml b/internal/static/i18n/de.yaml index 74f159ec28..518e1ec501 100644 --- a/internal/static/i18n/de.yaml +++ b/internal/static/i18n/de.yaml @@ -53,11 +53,24 @@ Errors: NotFound: SMS Konfiguration nicht gefunden AlreadyActive: SMS Konfiguration ist bereits aktiviert AlreadyDeactivated: SMS Konfiguration ist bereits deaktiviert + SMTP: + NotEmailMessage: Die Nachricht ist nicht EmailMessage + RequiredAttributes: Betreff, Empfänger und Inhalt müssen festgelegt werden, aber einige oder alle davon sind leer + CouldNotSplit: Host und Port konnten für die Verbindung zu SMTP nicht getrennt werden + CouldNotDial: Es konnte keine Verbindung zum SMTP-Server hergestellt werden, Port überprüfen, Firewall-Probleme ... + CouldNotDialTLS: Es konnte keine Verbindung zum SMTP-Server über TLS hergestellt werden, überprüfen Sie den Port, Firewall-Probleme ... + CouldNotCreateClient: Der SMTP-Client konnte nicht erstellt werden + CouldNotStartTLS: TLS konnte nicht gestartet werden + CouldNotAuth: Die SMTP-Authentifizierung konnte nicht hinzugefügt werden. Überprüfen Sie, ob sowohl Ihr Benutzername als auch Ihr Passwort korrekt sind. Wenn sie korrekt sind, erfordert Ihr Anbieter möglicherweise eine Authentifizierungsmethode, die von ZITADEL nicht unterstützt wird + CouldNotSetSender: Absender konnte nicht eingestellt werden + CouldNotSetRecipient: Der Empfänger konnte nicht festgelegt werden SMTPConfig: + TestPassword: Passwort für Test nicht gefunden NotFound: SMTP Konfiguration nicht gefunden AlreadyExists: SMTP Konfiguration existiert bereits AlreadyDeactivated: SMTP-Konfiguration bereits deaktiviert SenderAdressNotCustomDomain: Die Sender Adresse muss als Custom Domain auf der Instanz registriert sein. + TestEmailNotFound: E-Mail-Adresse für den Test nicht gefunden Notification: NoDomain: Keine Domäne für Nachricht gefunden User: diff --git a/internal/static/i18n/en.yaml b/internal/static/i18n/en.yaml index 1c3d141088..7cedac9fd6 100644 --- a/internal/static/i18n/en.yaml +++ b/internal/static/i18n/en.yaml @@ -53,11 +53,24 @@ Errors: NotFound: SMS configuration not found AlreadyActive: SMS configuration already active AlreadyDeactivated: SMS configuration already deactivated + SMTP: + NotEmailMessage: message is not EmailMessage + RequiredAttributes: subject, recipients and content must be set but some or all of them are empty + CouldNotSplit: could not split host and port for connect to smtp + CouldNotDial: could not contact with the SMTP server, check the port, firewall issues... + CouldNotDialTLS: could not contact with the SMTP server using TLS, check the port, firewall issues... + CouldNotCreateClient: could not create smtp client + CouldNotStartTLS: could not start tls + CouldNotAuth: could not add smtp auth, check if both your user and password are correct, if they're correct maybe your provider requires an auth method not supported by ZITADEL + CouldNotSetSender: could not set sender + CouldNotSetRecipient: could not set recipient SMTPConfig: + TestPassword: Password for test not found NotFound: SMTP configuration not found AlreadyExists: SMTP configuration already exists AlreadyDeactivated: SMTP configuration already deactivated SenderAdressNotCustomDomain: The sender address must be configured as custom domain on the instance. + TestEmailNotFound: Email address for test not found Notification: NoDomain: No Domain found for message User: diff --git a/internal/static/i18n/es.yaml b/internal/static/i18n/es.yaml index 3ffb229d7e..bae735134e 100644 --- a/internal/static/i18n/es.yaml +++ b/internal/static/i18n/es.yaml @@ -53,11 +53,24 @@ Errors: NotFound: configuración SMS no encontrada AlreadyActive: la configuración SMS ya está activa AlreadyDeactivated: la configuracion SMS ya está desactivada + SMTP: + NotEmailMessage: el mensaje no es EmailMessage + RequiredAttributes: Se deben configurar el asunto, los destinatarios y el contenido, pero algunos o todos están vacíos. + CouldNotSplit: No se pudo dividir el host y el puerto para conectarse a SMTP + CouldNotDial: No se pudo contactar con el servidor SMTP, verifique el puerto, problemas con el firewall... + CouldNotDialTLS: No se pudo contactar con el servidor SMTP usando TLS, verifique el puerto, problemas con el firewall... + CouldNotCreateClient: no se pudo crear el cliente smtp + CouldNotStartTLS: no se pudo iniciar TLS + CouldNotAuth: no se pudo agregar la autenticación smtp, verifique si tanto su usuario como su contraseña son correctos, si son correctos tal vez su proveedor requiera un método de autenticación no admitido por ZITADEL + CouldNotSetSender: no se pudo configurar el remitente + CouldNotSetRecipient: No se pudo establecer el destinatario SMTPConfig: + TestPassword: Contraseña para la prueba no encontrada NotFound: configuración SMTP no encontrada AlreadyExists: la configuración SMTP ya existe AlreadyDeactivated: la configuración SMTP ya está desactivada SenderAdressNotCustomDomain: La dirección del remitente debe configurarse como un dominio personalizado en la instancia. + TestEmailNotFound: Dirección de correo electrónico para la prueba no encontrada Notification: NoDomain: No se encontró el dominio para el mensaje User: diff --git a/internal/static/i18n/fr.yaml b/internal/static/i18n/fr.yaml index 41d10dbc28..9c8e215e25 100644 --- a/internal/static/i18n/fr.yaml +++ b/internal/static/i18n/fr.yaml @@ -53,11 +53,24 @@ Errors: NotFound: Configuration SMS non trouvée AlreadyActive: Configuration SMS déjà active AlreadyDeactivated: Configuration SMS déjà désactivée + SMTP: + NotEmailMessage: le message n'est pas un EmailMessage + RequiredAttributes: le sujet, les destinataires et le contenu doivent être définis mais certains ou la totalité d'entre eux sont vides + CouldNotSplit: impossible de diviser l'hôte et le port pour la connexion à SMTP + CouldNotDial: impossible de contacter le serveur SMTP, vérifier le port, problèmes de pare-feu... + CouldNotDialTLS: Impossible de contacter le serveur SMTP via TLS, vérifiez le port, problèmes de pare-feu... + CouldNotCreateClient: impossible de créer un client SMTP + CouldNotStartTLS: je n'ai pas pu démarrer tls + CouldNotAuth: Impossible d'ajouter l'authentification SMTP, vérifiez si votre utilisateur et votre mot de passe sont corrects. S'ils sont corrects, votre fournisseur nécessite peut-être une méthode d'authentification non prise en charge par ZITADEL. + CouldNotSetSender: impossible de définir l'expéditeur + CouldNotSetRecipient: impossible de définir le destinataire SMTPConfig: + TestPassword: Mot de passe pour le test introuvable NotFound: Configuration SMTP non trouvée AlreadyExists: La configuration SMTP existe déjà AlreadyDeactivated: Configuration SMTP déjà désactivée SenderAdressNotCustomDomain: L'adresse de l'expéditeur doit être configurée comme un domaine personnalisé sur l'instance. + TestEmailNotFound: Adresse e-mail pour le test introuvable Notification: NoDomain: Aucun domaine trouvé pour le message User: diff --git a/internal/static/i18n/it.yaml b/internal/static/i18n/it.yaml index 9e5541b13e..dcc0fab2f3 100644 --- a/internal/static/i18n/it.yaml +++ b/internal/static/i18n/it.yaml @@ -53,11 +53,24 @@ Errors: NotFound: Configurazione SMS non trovata AlreadyActive: Configurazione SMS già attiva AlreadyDeactivated: Configurazione SMS già disattivata + SMTP: + NotEmailMessage: il messaggio non è EmailMessage + RequiredAttributes: oggetto, destinatari e contenuto devono essere impostati ma alcuni o tutti sono vuoti + CouldNotSplit: impossibile dividere l'host e la porta per la connessione a SMTP + CouldNotDial: impossibile contattare il server SMTP, controllare la porta, problemi con il firewall... + CouldNotDialTLS: Impossibile contattare con il server SMTP utilizzando TLS, controllare la porta, problemi di firewall ... + CouldNotCreateClient: impossibile creare il client SMTP + CouldNotStartTLS: impossibile avviare tls + CouldNotAuth: impossibile aggiungere l'autenticazione smtp, controlla se sia l'utente che la password sono corretti, se sono corretti forse il tuo provider richiede un metodo di autenticazione non supportato da ZITADEL + CouldNotSetSender: impossibile impostare il mittente + CouldNotSetRecipient: impossibile impostare il destinatario SMTPConfig: + TestPassword: Password per il test non trovata NotFound: Configurazione SMTP non trovata AlreadyExists: La configurazione SMTP esiste già AlreadyDeactivated: Configurazione SMTP già disattivata SenderAdressNotCustomDomain: L'indirizzo del mittente deve essere configurato come dominio personalizzato sull'istanza. + TestEmailNotFound: Indirizzo email per il test non trovato Notification: NoDomain: Nessun dominio trovato per il messaggio User: diff --git a/internal/static/i18n/ja.yaml b/internal/static/i18n/ja.yaml index ed922e4814..a4224571ec 100644 --- a/internal/static/i18n/ja.yaml +++ b/internal/static/i18n/ja.yaml @@ -53,11 +53,24 @@ Errors: NotFound: SMS構成が見つかりません AlreadyActive: このSMS構成はすでにアクティブです AlreadyDeactivated: このSMS構成はすでに非アクティブです + SMTP: + NotEmailMessage: メッセージは EmailMessage ではありません + RequiredAttributes: 件名、受信者、コンテンツを設定する必要がありますが、一部またはすべてが空です + CouldNotSplit: smtp に接続するためにホストとポートを分割できませんでした + CouldNotDial: SMTP サーバーに接続できませんでした。ポート、ファイアウォールの問題を確認してください... + CouldNotDialTLS: TLS を使用して SMTP サーバーに接続できませんでした。ポート、ファイアウォールの問題を確認してください... + CouldNotCreateClient: SMTPクライアントを作成できませんでした + CouldNotStartTLS: TLSを開始できませんでした + CouldNotAuth: smtp 認証を追加できませんでした。ユーザーとパスワードの両方が正しいかどうかを確認してください。正しい場合は、プロバイダーが ZITADEL でサポートされていない認証方法を必要としている可能性があります。 + CouldNotSetSender: 送信者を設定できませんでした + CouldNotSetRecipient: 受信者を設定できませんでした SMTPConfig: + TestPassword: テスト用のパスワードが見つかりません NotFound: SMTP構成が見つかりません AlreadyExists: すでに存在するSMTP構成です AlreadyDeactivated: SMTP設定はすでに無効化されています SenderAdressNotCustomDomain: 送信者アドレスは、インスタンスのカスタムドメインとして構成する必要があります。 + TestEmailNotFound: テスト用のメールアドレスが見つかりません Notification: NoDomain: メッセージのドメインが見つかりません User: diff --git a/internal/static/i18n/mk.yaml b/internal/static/i18n/mk.yaml index db2d29dd1b..8102a4d557 100644 --- a/internal/static/i18n/mk.yaml +++ b/internal/static/i18n/mk.yaml @@ -53,11 +53,24 @@ Errors: NotFound: SMS конфигурацијата не е пронајдена AlreadyActive: SMS конфигурацијата е веќе активна AlreadyDeactivated: SMS конфигурацијата е веќе деактивирана + SMTP: + NotEmailMessage: пораката не е Email Message + RequiredAttributes: предметот, примачите и содржината мора да бидат поставени, но некои или сите се празни + CouldNotSplit: не може да се подели домаќинот и портата за поврзување со smtp + CouldNotDial: не можев да контактираме со SMTP-серверот, да ја провериме портата, проблеми со заштитен ѕид... + CouldNotDialTLS: не можев да контактираме со SMTP-серверот користејќи TLS, проверете ја портата, проблеми со заштитен ѕид... + CouldNotCreateClient: не можев да креирам smtp клиент + CouldNotStartTLS: не можеше да започне tls + CouldNotAuth: не можев да додадам smtp auth, проверете дали и корисникот и лозинката се точни, дали се точни, можеби вашиот провајдер бара метод за автетика што не е поддржан од ZITADEL + CouldNotSetSender: не може да се постави испраќач + CouldNotSetRecipient: не може да се постави примач SMTPConfig: + TestPassword: Лозинката за тестот не е пронајдена NotFound: SMTP конфигурацијата не е пронајдена AlreadyExists: SMTP конфигурацијата веќе постои AlreadyDeactivated: SMTP конфигурацијата е веќе деактивирана SenderAdressNotCustomDomain: Адресата на испраќачот мора да биде конфигурирана како прилагоден домен на инстанцата. + TestEmailNotFound: Адресата на е-пошта за тест не е пронајдена Notification: NoDomain: Не е пронајден домен за пораката User: diff --git a/internal/static/i18n/nl.yaml b/internal/static/i18n/nl.yaml index 3ef228c853..11a9510d0d 100644 --- a/internal/static/i18n/nl.yaml +++ b/internal/static/i18n/nl.yaml @@ -53,10 +53,24 @@ Errors: NotFound: SMS-configuratie niet gevonden AlreadyActive: SMS-configuratie al actief AlreadyDeactivated: SMS-configuratie al gedeactiveerd + SMTP: + NotEmailMessage: bericht is geen E-mailbericht + RequiredAttributes: onderwerp, ontvangers en inhoud moeten worden ingesteld, maar sommige of allemaal zijn leeg + CouldNotSplit: Kan host en poort niet splitsen voor verbinding met smtp + CouldNotDial: Kan geen contact maken met de SMTP-server, controleer de poort, firewallproblemen... + CouldNotDialTLS: kon geen contact maken met de SMTP-server via TLS, controleer de poort, firewallproblemen... + CouldNotCreateClient: kan geen smtp-client maken + CouldNotStartTLS: kon tls niet starten + CouldNotAuth: kon geen smtp-authenticatie toevoegen, controleer of zowel uw gebruiker als uw wachtwoord correct zijn. Als ze correct zijn, vereist uw provider misschien een auth-methode die niet door ZITADEL wordt ondersteund + CouldNotSetSender: kon de afzender niet instellen + CouldNotSetRecipient: Kan de ontvanger niet instellen SMTPConfig: + TestPassword: Wachtwoord voor test niet gevonden NotFound: SMTP-configuratie niet gevonden AlreadyExists: SMTP-configuratie bestaat al + AlreadyDeactivated: SMTP-configuratie al gedeactiveerd SenderAdressNotCustomDomain: Het afzenderadres moet worden geconfigureerd als aangepaste domein op de instantie. + TestEmailNotFound: E-mailadres voor test niet gevonden Notification: NoDomain: Geen domein gevonden voor bericht User: diff --git a/internal/static/i18n/pl.yaml b/internal/static/i18n/pl.yaml index 69abd71e89..d5d688e021 100644 --- a/internal/static/i18n/pl.yaml +++ b/internal/static/i18n/pl.yaml @@ -53,11 +53,24 @@ Errors: NotFound: Konfiguracja SMS nie znaleziona AlreadyActive: Konfiguracja SMS już aktywna AlreadyDeactivated: Konfiguracja SMS już dezaktywowana + SMTP: + NotEmailMessage: wiadomość nie jest wiadomością e-mail + RequiredAttributes: Temat, odbiorcy i treść muszą być ustawione, ale niektóre lub wszystkie z nich są puste + CouldNotSplit: nie można podzielić hosta i portu w celu połączenia z smtp + CouldNotDial: nie można połączyć się z serwerem SMTP, sprawdzić port, problemy z zaporą sieciową... + CouldNotDialTLS: nie można połączyć się z serwerem SMTP przy użyciu protokołu TLS, sprawdź port, problemy z zaporą sieciową... + CouldNotCreateClient: nie można utworzyć klienta smtp + CouldNotStartTLS: nie można rozpocząć tls + CouldNotAuth: nie można dodać uwierzytelnienia smtp, sprawdź, czy zarówno użytkownik, jak i hasło są poprawne, jeśli są poprawne, być może Twój dostawca wymaga metody uwierzytelniania nieobsługiwanej przez ZITADEL + CouldNotSetSender: nie można ustawić nadawcy + CouldNotSetRecipient: nie można ustawić odbiorcy SMTPConfig: + TestPassword: Nie znaleziono hasła do testu NotFound: Konfiguracja SMTP nie znaleziona AlreadyExists: Konfiguracja SMTP już istnieje AlreadyDeactivated: Konfiguracja SMTP jest już dezaktywowana SenderAdressNotCustomDomain: Adres nadawcy musi być skonfigurowany jako domena niestandardowa na instancji. + TestEmailNotFound: Nie znaleziono adresu e-mail do testu Notification: NoDomain: Nie znaleziono domeny dla wiadomości User: diff --git a/internal/static/i18n/pt.yaml b/internal/static/i18n/pt.yaml index da5a6a7614..59506fc1d0 100644 --- a/internal/static/i18n/pt.yaml +++ b/internal/static/i18n/pt.yaml @@ -53,11 +53,24 @@ Errors: NotFound: Configuração de SMS não encontrada AlreadyActive: Configuração de SMS já está ativa AlreadyDeactivated: Configuração de SMS já está desativada + SMTP: + NotEmailMessage: a mensagem não é EmailMessage + RequiredAttributes: assunto, destinatários e conteúdo devem ser definidos, mas alguns ou todos eles estão vazios + CouldNotSplit: não foi possível dividir o host e a porta para conectar ao smtp + CouldNotDial: não foi possível entrar em contato com o servidor SMTP, verificar a porta, problemas de firewall... + CouldNotDialTLS: não foi possível entrar em contato com o servidor SMTP usando TLS, verifique a porta, problemas de firewall... + CouldNotCreateClient: não foi possível criar o cliente smtp + CouldNotStartTLS: não foi possível iniciar o tls + CouldNotAuth: não foi possível adicionar autenticação smtp, verifique se seu usuário e senha estão corretos, se estiverem corretos, talvez seu provedor exija um método de autenticação não suportado pelo ZITADEL + CouldNotSetSender: não foi possível definir o remetente + CouldNotSetRecipient: não foi possível definir o destinatário SMTPConfig: + TestPassword: Senha para teste não encontrada NotFound: Configuração de SMTP não encontrada AlreadyExists: Configuração de SMTP já existe AlreadyDeactivated: Configuração SMTP já desativada SenderAdressNotCustomDomain: O endereço do remetente deve ser configurado como um domínio personalizado na instância. + TestEmailNotFound: Endereço de e-mail para teste não encontrado Notification: NoDomain: Nenhum domínio encontrado para a mensagem User: diff --git a/internal/static/i18n/ru.yaml b/internal/static/i18n/ru.yaml index 9be827e3b6..7bde4b3f2b 100644 --- a/internal/static/i18n/ru.yaml +++ b/internal/static/i18n/ru.yaml @@ -53,11 +53,24 @@ Errors: NotFound: Конфигурация SMS не найдена AlreadyActive: Конфигурация SMS уже активна AlreadyDeactivated: Конфигурация SMS уже деактивирована + SMTP: + NotEmailMessage: сообщение не является EmailMessage + RequiredAttributes: тема, получатели и контент должны быть заданы, но некоторые или все из них пусты. + CouldNotSplit: не удалось разделить хост и порт для подключения к smtp + CouldNotDial: не удалось связаться с SMTP-сервером, проверить порт, проблемы с брандмауэром... + CouldNotDialTLS: не удалось связаться с SMTP-сервером с помощью TLS, проверьте порт, проблемы с брандмауэром... + CouldNotCreateClient: не удалось создать smtp-клиент + CouldNotStartTLS: не удалось запустить тлс + CouldNotAuth: не удалось добавить аутентификацию smtp, проверьте правильность вашего пользователя и пароля. Если они верны, возможно, ваш провайдер требует метод аутентификации, не поддерживаемый ZITADEL + CouldNotSetSender: не удалось установить отправителя + CouldNotSetRecipient: не удалось установить получателя SMTPConfig: + TestPassword: Пароль для теста не найден NotFound: Конфигурация SMTP не найдена AlreadyExists: Конфигурация SMTP уже существует AlreadyDeactivated: Конфигурация SMTP уже деактивирована SenderAdressNotCustomDomain: Адрес отправителя должен быть настроен как личный домен на экземпляре. + TestEmailNotFound: Адрес электронной почты для теста не найден Notification: NoDomain: Домен не найден User: diff --git a/internal/static/i18n/sv.yaml b/internal/static/i18n/sv.yaml index a96638ffde..1540c63a1d 100644 --- a/internal/static/i18n/sv.yaml +++ b/internal/static/i18n/sv.yaml @@ -53,11 +53,24 @@ Errors: NotFound: SMS-konfiguration hittades inte AlreadyActive: SMS-konfiguration redan aktiv AlreadyDeactivated: SMS-konfiguration redan avaktiverad + SMTP: + NotEmailMessage: meddelandet är inte EmailMessage + RequiredAttributes: Ämne, mottagare och innehåll måste anges men några eller alla är tomma + CouldNotSplit: kunde inte dela värd och port för anslutning till smtp + CouldNotDial: kunde inte kontakta SMTP-servern, kontrollera porten, brandväggsproblem... + CouldNotDialTLS: kunde inte kontakta SMTP-servern med TLS, kontrollera porten, brandväggsproblem... + CouldNotCreateClient: kunde inte skapa smtp-klient + CouldNotStartTLS: kunde inte starta tls + CouldNotAuth: kunde inte lägga till smtp auth, kontrollera om både din användare och lösenord är korrekta, om de är korrekta kanske din leverantör kräver en auth-metod som inte stöds av ZITADEL + CouldNotSetSender: kunde inte ställa in avsändare + CouldNotSetRecipient: kunde inte ange mottagare SMTPConfig: + TestPassword: Lösenordet för testet hittades inte NotFound: SMTP-konfiguration hittades inte AlreadyExists: SMTP-konfiguration finns redan AlreadyDeactivated: SMTP-konfiguration redan avaktiverad SenderAdressNotCustomDomain: Avsändaradressen måste sättas som kundanpassad domän på instansen. + TestEmailNotFound: E-postadressen för testet hittades inte Notification: NoDomain: Ingen domän hittades för meddelandet User: @@ -1340,4 +1353,3 @@ Action: PreUserinfoCreation: Före skapande av användarinformation PreAccessTokenCreation: Före skapande av åtkomsttoken PreSAMLResponseCreation: Före skapande av SAMLResponse - diff --git a/internal/static/i18n/zh.yaml b/internal/static/i18n/zh.yaml index 409fb9ce71..4c78a33cb7 100644 --- a/internal/static/i18n/zh.yaml +++ b/internal/static/i18n/zh.yaml @@ -53,11 +53,24 @@ Errors: NotFound: 未找到 SMS 配置 AlreadyActive: SMS 配置已启用 AlreadyDeactivated: SMS 配置已停用 + SMTP: + NotEmailMessage: 消息不是电子邮件消息 + RequiredAttributes: 必须设置主题、收件人和内容,但部分或全部为空 + CouldNotSplit: 无法拆分主机和端口以连接到 smtp + CouldNotDial: 无法与 SMTP 服务器联系,请检查端口、防火墙问题... + CouldNotDialTLS: 无法使用 TLS 与 SMTP 服务器联系,请检查端口、防火墙问题... + CouldNotCreateClient: 无法创建 smtp 客户端 + CouldNotStartTLS: 无法启动 tls + CouldNotAuth: 无法添加 smtp 身份验证,请检查您的用户名和密码是否正确,如果正确,可能您的提供商需要 ZITADEL 不支持的身份验证方法 + CouldNotSetSender: 无法设置发件人 + CouldNotSetRecipient: 无法设置收件人 SMTPConfig: + TestPassword: 未找到测试密码 NotFound: 未找到 SMTP 配置 AlreadyExists: SMTP 配置已存在 AlreadyDeactivated: SMTP 配置已停用 SenderAdressNotCustomDomain: 发件人地址必须在在实例的域名设置中验证。 + TestEmailNotFound: 找不到用于测试的电子邮件地址 Notification: NoDomain: 未找到对应的域名 User: diff --git a/proto/zitadel/admin.proto b/proto/zitadel/admin.proto index a141569ea7..8fa9b03226 100644 --- a/proto/zitadel/admin.proto +++ b/proto/zitadel/admin.proto @@ -506,6 +506,40 @@ service AdminService { }; } + rpc TestSMTPConfigById(TestSMTPConfigByIdRequest) returns (TestSMTPConfigByIdResponse) { + option (google.api.http) = { + post: "/smtp/{id}/_test"; + body: "*" + }; + + option (zitadel.v1.auth_option) = { + permission: "iam.write"; + }; + + option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation) = { + tags: "SMTP Provider"; + summary: "Test SMTP Provider "; + description: "Test an SMTP provider identified by its ID. After testing the provider, the users will receive information about the test results." + }; + } + + rpc TestSMTPConfig(TestSMTPConfigRequest) returns (TestSMTPConfigResponse) { + option (google.api.http) = { + post: "/smtp/_test"; + body: "*" + }; + + option (zitadel.v1.auth_option) = { + permission: "iam.write"; + }; + + option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation) = { + tags: "SMTP Provider"; + summary: "Test SMTP Provider"; + description: "Test an SMTP provider. After testing the provider, the users will receive information about the test results." + }; + } + rpc ListSMTPConfigs(ListSMTPConfigsRequest) returns (ListSMTPConfigsResponse) { option (google.api.http) = { post: "/smtp/_search" @@ -4257,6 +4291,82 @@ message RemoveSMTPConfigResponse { zitadel.v1.ObjectDetails details = 1; } +message TestSMTPConfigByIdRequest { + string id = 1 [(validate.rules).string = {min_len: 1, max_len: 100}]; + string receiver_address = 2 [ + (validate.rules).string = {min_len: 1, max_len: 200, email: true}, + (google.api.field_behavior) = REQUIRED, + (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { + example: "\"noreply@m.zitadel.cloud\""; + min_length: 1; + max_length: 200; + } + ]; +} + +// This is an empty response +message TestSMTPConfigByIdResponse {} + +message TestSMTPConfigRequest { + string sender_address = 1 [ + (validate.rules).string = {min_len: 1, max_len: 200}, + (google.api.field_behavior) = REQUIRED, + (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { + example: "\"noreply@m.zitadel.cloud\""; + min_length: 1; + max_length: 200; + } + ]; + string sender_name = 2 [ + (validate.rules).string = {min_len: 1, max_len: 200}, + (google.api.field_behavior) = REQUIRED, + (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { + example: "\"ZITADEL\""; + min_length: 1; + max_length: 200; + } + ]; + bool tls = 3; + string host = 4 [ + (validate.rules).string = {min_len: 1, max_len: 500}, + (google.api.field_behavior) = REQUIRED, + (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { + example: "\"smtp.postmarkapp.com:587\""; + description: "Make sure to include the port."; + min_length: 1; + max_length: 500; + } + ]; + string user = 5 [ + (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { + example: "\"197f0117-529e-443d-bf6c-0292dd9a02b7\""; + } + ]; + string password = 6 [ + (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { + example: "\"this-is-my-password\""; + } + ]; + string receiver_address = 7 [ + (validate.rules).string = {min_len: 1, max_len: 200, email: true}, + (google.api.field_behavior) = REQUIRED, + (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { + example: "\"noreply@m.zitadel.cloud\""; + min_length: 1; + max_length: 200; + } + ]; + string id = 8 [ + (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { + description: "Zitadel SMTP provider id in case you are not sending the password and want to reuse the stored password"; + example: "\"267191369515139464\""; + } + ]; +} + +// This is an empty response +message TestSMTPConfigResponse {} + message ListSMSProvidersRequest { //list limitations and ordering zitadel.v1.ListQuery query = 1;