diff --git a/.husky/commit-msg b/.husky/commit-msg new file mode 100644 index 00000000..0abe7314 --- /dev/null +++ b/.husky/commit-msg @@ -0,0 +1,4 @@ +#!/usr/bin/env sh +. "$(dirname -- "$0")/_/husky.sh" + +# npx --no -- commitlint --edit ${1} diff --git a/.husky/pre-commit b/.husky/pre-commit new file mode 100644 index 00000000..6852b5b1 --- /dev/null +++ b/.husky/pre-commit @@ -0,0 +1,4 @@ +#!/usr/bin/env sh +. "$(dirname -- "$0")/_/husky.sh" + +# make format && git add -A . diff --git a/commitlint.config.js b/commitlint.config.js new file mode 100644 index 00000000..31186e2c --- /dev/null +++ b/commitlint.config.js @@ -0,0 +1 @@ +module.exports = { extends: '@commitlint/config-conventional']}; \ No newline at end of file diff --git a/internal/pkg/bun/postgres/bun_postgres.go b/internal/pkg/bun/postgres/bun_postgres.go index 794a58fd..0d174cda 100644 --- a/internal/pkg/bun/postgres/bun_postgres.go +++ b/internal/pkg/bun/postgres/bun_postgres.go @@ -24,7 +24,7 @@ func NewBunDB(cfg *bun2.BunConfig) (*bun.DB, error) { return nil, err } - //https://bun.uptrace.dev/postgres/#pgdriver + // https://bun.uptrace.dev/postgres/#pgdriver datasource := fmt.Sprintf("postgres://%s:%s@%s:%d/%s?sslmode=disable", cfg.User, cfg.Password, diff --git a/internal/pkg/core/metadata/metadata.go b/internal/pkg/core/metadata/metadata.go index dd6de5d1..a425edf7 100644 --- a/internal/pkg/core/metadata/metadata.go +++ b/internal/pkg/core/metadata/metadata.go @@ -24,7 +24,7 @@ func (m Metadata) Keys() []string { i := 0 r := make([]string, len(m)) - for k, _ := range m { + for k := range m { r[i] = k i++ } diff --git a/internal/pkg/es/contracts/store/aggregate_store.go b/internal/pkg/es/contracts/store/aggregate_store.go index 43145cec..e68a7302 100644 --- a/internal/pkg/es/contracts/store/aggregate_store.go +++ b/internal/pkg/es/contracts/store/aggregate_store.go @@ -14,7 +14,6 @@ import ( // AggregateStore is responsible for loading and saving Aggregate. type AggregateStore[T models.IHaveEventSourcedAggregate] interface { - // StoreWithVersion store the new or update aggregate state with expected version StoreWithVersion( aggregate T, diff --git a/internal/pkg/es/contracts/store/event_store.go b/internal/pkg/es/contracts/store/event_store.go index 690d8619..f479aa61 100644 --- a/internal/pkg/es/contracts/store/event_store.go +++ b/internal/pkg/es/contracts/store/event_store.go @@ -12,7 +12,7 @@ import ( ) type EventStore interface { - //StreamExists Check if specific stream exists in the store + // StreamExists Check if specific stream exists in the store StreamExists(streamName streamName.StreamName, ctx context.Context) (bool, error) // ReadEventsFromStart Read events for existing stream and start position with specified events count. @@ -22,7 +22,7 @@ type EventStore interface { ctx context.Context, ) ([]*models.StreamEvent, error) - //ReadEvents Read events for a specific stream and position in forward mode with specified events count. + // ReadEvents Read events for a specific stream and position in forward mode with specified events count. ReadEvents( streamName streamName.StreamName, readPosition readPosition.StreamReadPosition, @@ -30,7 +30,7 @@ type EventStore interface { ctx context.Context, ) ([]*models.StreamEvent, error) - //ReadEventsWithMaxCount Read events for a specific stream and position in forward mode with max count. + // ReadEventsWithMaxCount Read events for a specific stream and position in forward mode with max count. ReadEventsWithMaxCount( streamName streamName.StreamName, readPosition readPosition.StreamReadPosition, diff --git a/internal/pkg/es/errors/errors.go b/internal/pkg/es/errors/errors.go index 56ec46cf..45ec2730 100644 --- a/internal/pkg/es/errors/errors.go +++ b/internal/pkg/es/errors/errors.go @@ -1,16 +1,16 @@ package errors import ( - "fmt" + "fmt" - "emperror.dev/errors" + "emperror.dev/errors" - customErrors "github.com/mehdihadeli/go-ecommerce-microservices/internal/pkg/http/http_errors/custom_errors" + customErrors "github.com/mehdihadeli/go-ecommerce-microservices/internal/pkg/http/http_errors/custom_errors" ) var ( - EventAlreadyExistsError = customErrors.NewConflictError( - fmt.Sprintf("domain_events event already exists in event registry"), - ) - InvalidEventTypeError = errors.New("invalid event type") + EventAlreadyExistsError = customErrors.NewConflictError( + fmt.Sprintf("domain_events event already exists in event registry"), + ) + InvalidEventTypeError = errors.New("invalid event type") ) diff --git a/internal/pkg/es/models/stream_version/expected_stream_version.go b/internal/pkg/es/models/stream_version/expected_stream_version.go index 514c6778..55483db6 100644 --- a/internal/pkg/es/models/stream_version/expected_stream_version.go +++ b/internal/pkg/es/models/stream_version/expected_stream_version.go @@ -1,7 +1,7 @@ package expectedStreamVersion -//https://github.com/EventStore/EventStore-Client-Go/blob/1591d047c0c448cacc0468f9af3605572aba7970/esdb/revision.go -//https://github.com/EventStore/EventStore-Client-Dotnet/blob/b8beee7b97ef359316822cb2d00f120bf67bd14d/src/EventStore.Client/StreamRevision.cs +// https://github.com/EventStore/EventStore-Client-Go/blob/1591d047c0c448cacc0468f9af3605572aba7970/esdb/revision.go +// https://github.com/EventStore/EventStore-Client-Dotnet/blob/b8beee7b97ef359316822cb2d00f120bf67bd14d/src/EventStore.Client/StreamRevision.cs // ExpectedStreamVersion an int64 for accepts negative and positive value type ExpectedStreamVersion int64 diff --git a/internal/pkg/eventstroredb/errors/aggregate_not_found_error.go b/internal/pkg/eventstroredb/errors/aggregate_not_found_error.go index f0425ab0..1333bb9b 100644 --- a/internal/pkg/eventstroredb/errors/aggregate_not_found_error.go +++ b/internal/pkg/eventstroredb/errors/aggregate_not_found_error.go @@ -9,8 +9,8 @@ import ( customErrors "github.com/mehdihadeli/go-ecommerce-microservices/internal/pkg/http/http_errors/custom_errors" ) -//https://klotzandrew.com/blog/error-handling-in-golang/ -//https://banzaicloud.com/blog/error-handling-go/ +// https://klotzandrew.com/blog/error-handling-in-golang/ +// https://banzaicloud.com/blog/error-handling-go/ type aggregateNotFoundError struct { customErrors.NotFoundError diff --git a/internal/pkg/grpc/grpcErrors/custom_grpc_errors.go b/internal/pkg/grpc/grpcErrors/custom_grpc_errors.go index 284212a7..a55ab9da 100644 --- a/internal/pkg/grpc/grpcErrors/custom_grpc_errors.go +++ b/internal/pkg/grpc/grpcErrors/custom_grpc_errors.go @@ -9,14 +9,13 @@ import ( ) func NewValidationGrpcError(detail string, stackTrace string) GrpcErr { - validationError := - &grpcErr{ - Title: constants.ErrBadRequestTitle, - Detail: detail, - Status: codes.InvalidArgument, - Timestamp: time.Now(), - StackTrace: stackTrace, - } + validationError := &grpcErr{ + Title: constants.ErrBadRequestTitle, + Detail: detail, + Status: codes.InvalidArgument, + Timestamp: time.Now(), + StackTrace: stackTrace, + } return validationError } diff --git a/internal/pkg/grpc/grpcErrors/grpc_error_parser.go b/internal/pkg/grpc/grpcErrors/grpc_error_parser.go index 49900e0d..13547af6 100644 --- a/internal/pkg/grpc/grpcErrors/grpc_error_parser.go +++ b/internal/pkg/grpc/grpcErrors/grpc_error_parser.go @@ -13,8 +13,8 @@ import ( errorUtils "github.com/mehdihadeli/go-ecommerce-microservices/internal/pkg/utils/error_utils" ) -//https://github.com/grpc/grpc/blob/master/doc/http-grpc-status-mapping.md -//https://github.com/grpc/grpc/blob/master/doc/statuscodes.md +// https://github.com/grpc/grpc/blob/master/doc/http-grpc-status-mapping.md +// https://github.com/grpc/grpc/blob/master/doc/statuscodes.md func ParseError(err error) GrpcErr { customErr := customErrors.GetCustomError(err) diff --git a/internal/pkg/grpc/interceptors/grpc_error/error_interceptor.go b/internal/pkg/grpc/interceptors/grpc_error/error_interceptor.go index 471011e3..878ed2b5 100644 --- a/internal/pkg/grpc/interceptors/grpc_error/error_interceptor.go +++ b/internal/pkg/grpc/interceptors/grpc_error/error_interceptor.go @@ -17,14 +17,12 @@ func UnaryServerInterceptor() grpc.UnaryServerInterceptor { info *grpc.UnaryServerInfo, handler grpc.UnaryHandler, ) (interface{}, error) { - resp, err := handler(ctx, req) if err != nil { grpcErr := grpcErrors.ParseError(err) if grpcErr != nil { return nil, grpcErr.ToGrpcResponseErr() - } else { prb := grpcErrors.NewInternalServerGrpcError(err.Error(), fmt.Sprintf("%+v\n", err)) return nil, prb.ToGrpcResponseErr() @@ -44,13 +42,11 @@ func StreamServerInterceptor() grpc.StreamServerInterceptor { handler grpc.StreamHandler, ) error { err := handler(srv, ss) - if err != nil { grpcErr := grpcErrors.ParseError(err) if grpcErr != nil { return grpcErr.ToGrpcResponseErr() - } else { prb := grpcErrors.NewInternalServerGrpcError(err.Error(), fmt.Sprintf("%+v\n", err)) return prb.ToGrpcResponseErr() diff --git a/internal/pkg/http/custom_echo/otel/tracing/utils.go b/internal/pkg/http/custom_echo/otel/tracing/utils.go index e38560d0..80772217 100644 --- a/internal/pkg/http/custom_echo/otel/tracing/utils.go +++ b/internal/pkg/http/custom_echo/otel/tracing/utils.go @@ -43,7 +43,7 @@ func TraceHttpErrFromSpanWithCode(span trace.Span, err error, code int) error { } func TraceHttpErrFromContext(ctx context.Context, err error) error { - //https://opentelemetry.io/docs/instrumentation/go/manual/#record-errors + // https://opentelemetry.io/docs/instrumentation/go/manual/#record-errors span := trace.SpanFromContext(ctx) defer span.End() diff --git a/internal/pkg/http/http_errors/custom_errors/bad_request_error.go b/internal/pkg/http/http_errors/custom_errors/bad_request_error.go index 6c38c9df..20104d44 100644 --- a/internal/pkg/http/http_errors/custom_errors/bad_request_error.go +++ b/internal/pkg/http/http_errors/custom_errors/bad_request_error.go @@ -39,7 +39,7 @@ func (b *badRequestError) IsBadRequestError() bool { func IsBadRequestError(err error) bool { var badRequestError BadRequestError - //us, ok := grpc_errors.Cause(err).(BadRequestError) + // us, ok := grpc_errors.Cause(err).(BadRequestError) if errors.As(err, &badRequestError) { return badRequestError.IsBadRequestError() } diff --git a/internal/pkg/http/http_errors/custom_errors/conflict_error.go b/internal/pkg/http/http_errors/custom_errors/conflict_error.go index f9efa01d..a7194368 100644 --- a/internal/pkg/http/http_errors/custom_errors/conflict_error.go +++ b/internal/pkg/http/http_errors/custom_errors/conflict_error.go @@ -39,7 +39,7 @@ func (c *conflictError) IsConflictError() bool { func IsConflictError(err error) bool { var conflictError ConflictError - //us, ok := grpc_errors.Cause(err).(ConflictError) + // us, ok := grpc_errors.Cause(err).(ConflictError) if errors.As(err, &conflictError) { return conflictError.IsConflictError() } diff --git a/internal/pkg/http/http_errors/custom_errors/custom_errors_test.go b/internal/pkg/http/http_errors/custom_errors/custom_errors_test.go index 330a98ca..020211bc 100644 --- a/internal/pkg/http/http_errors/custom_errors/custom_errors_test.go +++ b/internal/pkg/http/http_errors/custom_errors/custom_errors_test.go @@ -38,13 +38,12 @@ func Test_BadRequest_Err(t *testing.T) { var stackErr contracts.StackTracer if ok := errors.As(err, &stackErr); ok { - //https://dave.cheney.net/2016/06/12/stack-traces-and-the-errors-package + // https://dave.cheney.net/2016/06/12/stack-traces-and-the-errors-package fmt.Println(errorUtils.ErrorsWithoutStack(err, false)) // Just write errorUtils messages for - fmt.Println(errorUtils.ErrorsWithStack(err)) //write errorUtils messages with stacktrace + fmt.Println(errorUtils.ErrorsWithStack(err)) // write errorUtils messages with stacktrace } else { fmt.Println(errorUtils.ErrorsWithoutStack(err, false)) } - } func Test_NotFound_Err(t *testing.T) { @@ -66,9 +65,9 @@ func Test_NotFound_Err(t *testing.T) { var stackErr contracts.StackTracer if ok := errors.As(err, &stackErr); ok { - //https://dave.cheney.net/2016/06/12/stack-traces-and-the-errors-package + // https://dave.cheney.net/2016/06/12/stack-traces-and-the-errors-package fmt.Println(errorUtils.ErrorsWithoutStack(err, false)) // Just write errorUtils messages for - fmt.Println(errorUtils.ErrorsWithStack(err)) //write errorUtils messages with stacktrace + fmt.Println(errorUtils.ErrorsWithStack(err)) // write errorUtils messages with stacktrace } else { fmt.Println(errorUtils.ErrorsWithoutStack(err, false)) } @@ -97,9 +96,9 @@ func Test_Domain_Err(t *testing.T) { var stackErr contracts.StackTracer if ok := errors.As(err, &stackErr); ok { - //https://dave.cheney.net/2016/06/12/stack-traces-and-the-errors-package + // https://dave.cheney.net/2016/06/12/stack-traces-and-the-errors-package fmt.Println(errorUtils.ErrorsWithoutStack(err, false)) // Just write errorUtils messages for - fmt.Println(errorUtils.ErrorsWithStack(err)) //write errorUtils messages with stacktrace + fmt.Println(errorUtils.ErrorsWithStack(err)) // write errorUtils messages with stacktrace } else { fmt.Println(errorUtils.ErrorsWithoutStack(err, false)) } @@ -132,7 +131,7 @@ func Test_Application_Err(t *testing.T) { var stackErr contracts.StackTracer if ok := errors.As(err, &stackErr); ok { - //https://dave.cheney.net/2016/06/12/stack-traces-and-the-errors-package + // https://dave.cheney.net/2016/06/12/stack-traces-and-the-errors-package fmt.Println(errorUtils.ErrorsWithoutStack(err, false)) // Just write errorUtils messages for fmt.Println(errorUtils.ErrorsWithStack(err)) } else { @@ -159,7 +158,7 @@ func Test_Internal_Server_Error(t *testing.T) { var stackErr contracts.StackTracer if ok := errors.As(err, &stackErr); ok { - //https://dave.cheney.net/2016/06/12/stack-traces-and-the-errors-package + // https://dave.cheney.net/2016/06/12/stack-traces-and-the-errors-package fmt.Println(errorUtils.ErrorsWithoutStack(err, false)) // Just write errorUtils messages for fmt.Println(errorUtils.ErrorsWithStack(err)) } else { @@ -199,7 +198,7 @@ func Test_Marshaling_Error(t *testing.T) { var stackErr contracts.StackTracer if ok := errors.As(err, &stackErr); ok { - //https://dave.cheney.net/2016/06/12/stack-traces-and-the-errors-package + // https://dave.cheney.net/2016/06/12/stack-traces-and-the-errors-package fmt.Println(errorUtils.ErrorsWithoutStack(err, false)) // Just write errorUtils messages for fmt.Println(errorUtils.ErrorsWithStack(err)) } else { @@ -239,7 +238,7 @@ func Test_Validation_Error(t *testing.T) { var stackErr contracts.StackTracer if ok := errors.As(err, &stackErr); ok { - //https://dave.cheney.net/2016/06/12/stack-traces-and-the-errors-package + // https://dave.cheney.net/2016/06/12/stack-traces-and-the-errors-package fmt.Println(errorUtils.ErrorsWithoutStack(err, false)) // Just write errorUtils messages for fmt.Println(errorUtils.ErrorsWithStack(err)) } else { @@ -274,7 +273,7 @@ func Test_Conflict_Error(t *testing.T) { var stackErr contracts.StackTracer if ok := errors.As(err, &stackErr); ok { - //https://dave.cheney.net/2016/06/12/stack-traces-and-the-errors-package + // https://dave.cheney.net/2016/06/12/stack-traces-and-the-errors-package fmt.Println(errorUtils.ErrorsWithoutStack(err, false)) // Just write errorUtils messages for fmt.Println(errorUtils.ErrorsWithStack(err)) } else { @@ -283,8 +282,8 @@ func Test_Conflict_Error(t *testing.T) { } func myfoo(e error) error { - //https://itnext.io/golang-error-handling-best-practice-a36f47b0b94c - //Note: Do not repeat Wrap, it will record redundancy call stacks, we usually care about root stack trace + // https://itnext.io/golang-error-handling-best-practice-a36f47b0b94c + // Note: Do not repeat Wrap, it will record redundancy call stacks, we usually care about root stack trace return errors.WithMessage(e, "foo failed") // or grpc_errors.WrapIf() } diff --git a/internal/pkg/http/http_errors/custom_errors/forbiden_error.go b/internal/pkg/http/http_errors/custom_errors/forbiden_error.go index e081500c..0a35add3 100644 --- a/internal/pkg/http/http_errors/custom_errors/forbiden_error.go +++ b/internal/pkg/http/http_errors/custom_errors/forbiden_error.go @@ -39,7 +39,7 @@ func (f *forbiddenError) IsForbiddenError() bool { func IsForbiddenError(err error) bool { var forbiddenError ForbiddenError - //us, ok := grpc_errors.Cause(err).(ForbiddenError) + // us, ok := grpc_errors.Cause(err).(ForbiddenError) if errors.As(err, &forbiddenError) { return forbiddenError.IsForbiddenError() } diff --git a/internal/pkg/http/http_errors/custom_errors/internal_server_error.go b/internal/pkg/http/http_errors/custom_errors/internal_server_error.go index 5dde24e6..f6db30a5 100644 --- a/internal/pkg/http/http_errors/custom_errors/internal_server_error.go +++ b/internal/pkg/http/http_errors/custom_errors/internal_server_error.go @@ -39,7 +39,7 @@ func (i *internalServerError) IsInternalServerError() bool { func IsInternalServerError(err error) bool { var internalErr InternalServerError - //us, ok := grpc_errors.Cause(err).(InternalServerError) + // us, ok := grpc_errors.Cause(err).(InternalServerError) if errors.As(err, &internalErr) { return internalErr.IsInternalServerError() } diff --git a/internal/pkg/http/http_errors/custom_errors/marshaling_error.go b/internal/pkg/http/http_errors/custom_errors/marshaling_error.go index ac5878ad..84ce3853 100644 --- a/internal/pkg/http/http_errors/custom_errors/marshaling_error.go +++ b/internal/pkg/http/http_errors/custom_errors/marshaling_error.go @@ -42,7 +42,7 @@ func (m *marshalingError) IsMarshalingError() bool { func IsMarshalingError(err error) bool { var me MarshalingError - //us, ok := grpc_errors.Cause(err).(MarshalingError) + // us, ok := grpc_errors.Cause(err).(MarshalingError) if errors.As(err, &me) { return me.IsMarshalingError() } diff --git a/internal/pkg/http/http_errors/custom_errors/not_found_error.go b/internal/pkg/http/http_errors/custom_errors/not_found_error.go index 25b4e191..a334c7c7 100644 --- a/internal/pkg/http/http_errors/custom_errors/not_found_error.go +++ b/internal/pkg/http/http_errors/custom_errors/not_found_error.go @@ -39,7 +39,7 @@ func (n *notFoundError) IsNotFoundError() bool { func IsNotFoundError(err error) bool { var notFoundError NotFoundError - //us, ok := grpc_errors.Cause(err).(NotFoundError) + // us, ok := grpc_errors.Cause(err).(NotFoundError) if errors.As(err, ¬FoundError) { return notFoundError.IsNotFoundError() } diff --git a/internal/pkg/http/http_errors/custom_errors/unauthorized_error.go b/internal/pkg/http/http_errors/custom_errors/unauthorized_error.go index ea8edefb..51638b5a 100644 --- a/internal/pkg/http/http_errors/custom_errors/unauthorized_error.go +++ b/internal/pkg/http/http_errors/custom_errors/unauthorized_error.go @@ -39,7 +39,7 @@ func (u *unauthorizedError) IsUnAuthorizedError() bool { func IsUnAuthorizedError(err error) bool { var unauthorizedError UnauthorizedError - //us, ok := grpc_errors.Cause(err).(UnauthorizedError) + // us, ok := grpc_errors.Cause(err).(UnauthorizedError) if errors.As(err, &unauthorizedError) { return unauthorizedError.IsUnAuthorizedError() } diff --git a/internal/pkg/http/http_errors/custom_errors/unmarshaling_error.go b/internal/pkg/http/http_errors/custom_errors/unmarshaling_error.go index 2f0d65dc..b65dec8d 100644 --- a/internal/pkg/http/http_errors/custom_errors/unmarshaling_error.go +++ b/internal/pkg/http/http_errors/custom_errors/unmarshaling_error.go @@ -41,7 +41,7 @@ func (u *unMarshalingError) IsUnMarshalingError() bool { func IsUnMarshalingError(err error) bool { var unMarshalingError UnMarshalingError - //us, ok := grpc_errors.Cause(err).(UnMarshalingError) + // us, ok := grpc_errors.Cause(err).(UnMarshalingError) if errors.As(err, &unMarshalingError) { return unMarshalingError.IsUnMarshalingError() } diff --git a/internal/pkg/http/http_errors/custom_errors/validation_error.go b/internal/pkg/http/http_errors/custom_errors/validation_error.go index fc995f1d..b2d2dda8 100644 --- a/internal/pkg/http/http_errors/custom_errors/validation_error.go +++ b/internal/pkg/http/http_errors/custom_errors/validation_error.go @@ -41,7 +41,7 @@ func (v *validationError) IsValidationError() bool { func IsValidationError(err error) bool { var validationError ValidationError - //us, ok := grpc_errors.Cause(err).(ValidationError) + // us, ok := grpc_errors.Cause(err).(ValidationError) if errors.As(err, &validationError) { return validationError.IsValidationError() } diff --git a/internal/pkg/http/http_errors/problemDetails/custom_problem_details_errors.go b/internal/pkg/http/http_errors/problemDetails/custom_problem_details_errors.go index abadb403..f40a42ea 100644 --- a/internal/pkg/http/http_errors/problemDetails/custom_problem_details_errors.go +++ b/internal/pkg/http/http_errors/problemDetails/custom_problem_details_errors.go @@ -8,15 +8,14 @@ import ( ) func NewValidationProblemDetail(detail string, stackTrace string) ProblemDetailErr { - validationError := - &problemDetail{ - Title: constants.ErrBadRequestTitle, - Detail: detail, - Status: http.StatusBadRequest, - Type: getDefaultType(http.StatusBadRequest), - Timestamp: time.Now(), - StackTrace: stackTrace, - } + validationError := &problemDetail{ + Title: constants.ErrBadRequestTitle, + Detail: detail, + Status: http.StatusBadRequest, + Type: getDefaultType(http.StatusBadRequest), + Timestamp: time.Now(), + StackTrace: stackTrace, + } return validationError } diff --git a/internal/pkg/mapper/mapper.go b/internal/pkg/mapper/mapper.go index cf7d2d6c..ae4740a8 100644 --- a/internal/pkg/mapper/mapper.go +++ b/internal/pkg/mapper/mapper.go @@ -48,9 +48,11 @@ type typeMeta struct { type MapFunc[TSrc any, TDst any] func(TSrc) TDst -var profiles = map[string][][2]string{} -var maps = map[mappingsEntry]interface{}{} -var mapperConfig *MapperConfig +var ( + profiles = map[string][][2]string{} + maps = map[mappingsEntry]interface{}{} + mapperConfig *MapperConfig +) func init() { mapperConfig = &MapperConfig{ @@ -332,7 +334,7 @@ func mapStructs[TDes any, TSrc any](src reflect.Value, dest reflect.Value) { var sourceFiledValue reflect.Value if sourceField.Kind() != reflect.Invalid { - //var destinationFieldValue reflect.Value + // var destinationFieldValue reflect.Value if !sourceField.CanInterface() { if mapperConfig.MapUnexportedFields { sourceFiledValue = reflectionHelper.GetFieldValue(sourceField) @@ -430,7 +432,7 @@ func processValues[TDes any, TSrc any](src reflect.Value, dest reflect.Value) er // if types are equal set dest value if src.Type() == dest.Type() { reflectionHelper.SetFieldValue(dest, src.Interface()) - //dest.Set(src) + // dest.Set(src) return nil } diff --git a/internal/pkg/messaging/message_header/message_header.go b/internal/pkg/messaging/message_header/message_header.go index 043c4cb2..fa9d17b5 100644 --- a/internal/pkg/messaging/message_header/message_header.go +++ b/internal/pkg/messaging/message_header/message_header.go @@ -1,8 +1,10 @@ package messageHeader -const MessageId string = "message-id" -const CorrelationId string = "correlation-id" -const Name string = "name" -const Type string = "type" -const ContentType string = "content-type" -const Created string = "created" +const ( + MessageId string = "message-id" + CorrelationId string = "correlation-id" + Name string = "name" + Type string = "type" + ContentType string = "content-type" + Created string = "created" +) diff --git a/internal/pkg/messaging/otel/tracing/consumer/consumer.go b/internal/pkg/messaging/otel/tracing/consumer/consumer.go index e284b7e9..8c36bdbc 100644 --- a/internal/pkg/messaging/otel/tracing/consumer/consumer.go +++ b/internal/pkg/messaging/otel/tracing/consumer/consumer.go @@ -18,12 +18,12 @@ import ( tracingHeaders "github.com/mehdihadeli/go-ecommerce-microservices/internal/pkg/otel/tracing/tracing_headers" ) -//https://devandchill.com/posts/2021/12/go-step-by-step-guide-for-implementing-tracing-on-a-microservices-architecture-2/2/ -//https://github.com/open-telemetry/opentelemetry-go-contrib/blob/e84d6d6575e3c3eabcf3204ac88550258673ed3c/instrumentation/github.com/Shopify/sarama/otelsarama/dispatcher.go -//https://opentelemetry.io/docs/reference/specification/trace/semantic_conventions/messaging/ -//https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/trace/semantic_conventions/messaging.md#messaging-attributes -//https://opentelemetry.io/docs/instrumentation/go/manual/#semantic-attributes -//https://trstringer.com/otel-part5-propagation/ +// https://devandchill.com/posts/2021/12/go-step-by-step-guide-for-implementing-tracing-on-a-microservices-architecture-2/2/ +// https://github.com/open-telemetry/opentelemetry-go-contrib/blob/e84d6d6575e3c3eabcf3204ac88550258673ed3c/instrumentation/github.com/Shopify/sarama/otelsarama/dispatcher.go +// https://opentelemetry.io/docs/reference/specification/trace/semantic_conventions/messaging/ +// https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/trace/semantic_conventions/messaging.md#messaging-attributes +// https://opentelemetry.io/docs/instrumentation/go/manual/#semantic-attributes +// https://trstringer.com/otel-part5-propagation/ func StartConsumerSpan( ctx context.Context, @@ -40,7 +40,7 @@ func StartConsumerSpan( opts := getTraceOptions(meta, payload, consumerTracingOptions) - //https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/trace/semantic_conventions/messaging.md#span-name + // https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/trace/semantic_conventions/messaging.md#span-name // SpanName = Destination Name + Operation Name ctx, span := messageTracing.MessagingTracer.Start( parentSpanContext, @@ -81,8 +81,8 @@ func getTraceOptions( ) []trace.SpanStartOption { correlationId := messageHeader.GetCorrelationId(*meta) - //https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/trace/semantic_conventions/messaging.md#topic-with-multiple-consumers - //https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/trace/semantic_conventions/messaging.md#batch-receiving + // https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/trace/semantic_conventions/messaging.md#topic-with-multiple-consumers + // https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/trace/semantic_conventions/messaging.md#batch-receiving attrs := []attribute.KeyValue{ semconv.MessageIDKey.String(messageHeader.GetMessageId(*meta)), semconv.MessagingConversationIDKey.String(correlationId), diff --git a/internal/pkg/messaging/otel/tracing/producer/producer.go b/internal/pkg/messaging/otel/tracing/producer/producer.go index 5f9b3a32..42c210ab 100644 --- a/internal/pkg/messaging/otel/tracing/producer/producer.go +++ b/internal/pkg/messaging/otel/tracing/producer/producer.go @@ -18,12 +18,12 @@ import ( "github.com/mehdihadeli/go-ecommerce-microservices/internal/pkg/otel/tracing" ) -//https://devandchill.com/posts/2021/12/go-step-by-step-guide-for-implementing-tracing-on-a-microservices-architecture-2/2/ -//https://github.com/open-telemetry/opentelemetry-go-contrib/blob/v0.12.0/instrumentation/github.com/Shopify/sarama/otelsarama/producer.go -//https://opentelemetry.io/docs/reference/specification/trace/semantic_conventions/messaging/ -//https://opentelemetry.io/docs/instrumentation/go/manual/#semantic-attributes -//https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/trace/semantic_conventions/messaging.md#messaging-attributes -//https://trstringer.com/otel-part5-propagation/ +// https://devandchill.com/posts/2021/12/go-step-by-step-guide-for-implementing-tracing-on-a-microservices-architecture-2/2/ +// https://github.com/open-telemetry/opentelemetry-go-contrib/blob/v0.12.0/instrumentation/github.com/Shopify/sarama/otelsarama/producer.go +// https://opentelemetry.io/docs/reference/specification/trace/semantic_conventions/messaging/ +// https://opentelemetry.io/docs/instrumentation/go/manual/#semantic-attributes +// https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/trace/semantic_conventions/messaging.md#messaging-attributes +// https://trstringer.com/otel-part5-propagation/ func StartProducerSpan( ctx context.Context, @@ -41,7 +41,7 @@ func StartProducerSpan( opts := getTraceOptions(meta, message, payload, producerTracingOptions) - //https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/trace/semantic_conventions/messaging.md#span-name + // https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/trace/semantic_conventions/messaging.md#span-name // SpanName = Destination Name + Operation Name ctx, span := messageTracing.MessagingTracer.Start( parentSpanContext, @@ -84,8 +84,8 @@ func getTraceOptions( ) []trace.SpanStartOption { correlationId := messageHeader.GetCorrelationId(*meta) - //https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/trace/semantic_conventions/messaging.md#topic-with-multiple-consumers - //https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/trace/semantic_conventions/messaging.md#batch-receiving + // https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/trace/semantic_conventions/messaging.md#topic-with-multiple-consumers + // https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/trace/semantic_conventions/messaging.md#batch-receiving attrs := []attribute.KeyValue{ semconv.MessageIDKey.String(message.GeMessageId()), semconv.MessagingConversationIDKey.String(correlationId), diff --git a/internal/pkg/messaging/otel/tracing/trace.go b/internal/pkg/messaging/otel/tracing/trace.go index 62bf4a8e..99097dc9 100644 --- a/internal/pkg/messaging/otel/tracing/trace.go +++ b/internal/pkg/messaging/otel/tracing/trace.go @@ -11,5 +11,5 @@ var MessagingTracer trace.Tracer func init() { MessagingTracer = tracing.NewAppTracer( "github.com/mehdihadeli/go-ecommerce-microservices/internal/pkg/messaging", - ) //instrumentation name + ) // instrumentation name } diff --git a/internal/pkg/messaging/otel/tracing/utils.go b/internal/pkg/messaging/otel/tracing/utils.go index a662e2bf..95fb3272 100644 --- a/internal/pkg/messaging/otel/tracing/utils.go +++ b/internal/pkg/messaging/otel/tracing/utils.go @@ -23,7 +23,7 @@ func TraceMessagingErrFromSpan(span trace.Span, err error) error { } func TraceMessagingErrFromContext(ctx context.Context, err error) error { - //https://opentelemetry.io/docs/instrumentation/go/manual/#record-errors + // https://opentelemetry.io/docs/instrumentation/go/manual/#record-errors span := trace.SpanFromContext(ctx) defer span.End() diff --git a/internal/pkg/otel/tracing/utils.go b/internal/pkg/otel/tracing/utils.go index 926fd86e..9484bf2a 100644 --- a/internal/pkg/otel/tracing/utils.go +++ b/internal/pkg/otel/tracing/utils.go @@ -19,7 +19,7 @@ type traceContextKeyType int const parentSpanKey traceContextKeyType = iota + 1 func TraceErrFromContext(ctx context.Context, err error) error { - //https://opentelemetry.io/docs/instrumentation/go/manual/#record-errors + // https://opentelemetry.io/docs/instrumentation/go/manual/#record-errors span := trace.SpanFromContext(ctx) defer span.End() diff --git a/internal/pkg/postgres_pgx/postgres.go b/internal/pkg/postgres_pgx/postgres.go index 1a5ed9f4..c8ce73ef 100644 --- a/internal/pkg/postgres_pgx/postgres.go +++ b/internal/pkg/postgres_pgx/postgres.go @@ -41,11 +41,11 @@ type Pgx struct { DB *sql.DB SquirrelBuilder squirrel.StatementBuilderType GoquBuilder *goqu.SelectDataset - config *PostgresPxgOptions + config *PostgresPgxOptions } // NewPgx func for connection to PostgreSQL database. -func NewPgx(cfg *PostgresPxgOptions) (*Pgx, error) { +func NewPgx(cfg *PostgresPgxOptions) (*Pgx, error) { if cfg.DBName == "" { return nil, errors.New("DBName is required in the config.") } @@ -126,7 +126,7 @@ func (db *Pgx) Close() { _ = db.DB.Close() } -func createDB(cfg *PostgresPxgOptions) error { +func createDB(cfg *PostgresPgxOptions) error { // we should choose a default database in the connection, but because we don't have a database yet we specify postgres default database 'postgres' datasource := fmt.Sprintf("postgres://%s:%s@%s:%d/%s?sslmode=disable", cfg.User, diff --git a/internal/pkg/postgres_pgx/postgres_pxg_options.go b/internal/pkg/postgres_pgx/postgres_pgx_options.go similarity index 84% rename from internal/pkg/postgres_pgx/postgres_pxg_options.go rename to internal/pkg/postgres_pgx/postgres_pgx_options.go index 2b546739..74e3906b 100644 --- a/internal/pkg/postgres_pgx/postgres_pxg_options.go +++ b/internal/pkg/postgres_pgx/postgres_pgx_options.go @@ -8,9 +8,9 @@ import ( typeMapper "github.com/mehdihadeli/go-ecommerce-microservices/internal/pkg/reflection/type_mappper" ) -var optionName = strcase.ToLowerCamel(typeMapper.GetTypeNameByT[PostgresPxgOptions]()) +var optionName = strcase.ToLowerCamel(typeMapper.GetTypeNameByT[PostgresPgxOptions]()) -type PostgresPxgOptions struct { +type PostgresPgxOptions struct { Host string `mapstructure:"host"` Port int `mapstructure:"port"` User string `mapstructure:"user"` @@ -20,6 +20,6 @@ type PostgresPxgOptions struct { LogLevel int `mapstructure:"logLevel"` } -func provideConfig(environment environemnt.Environment) (*PostgresPxgOptions, error) { - return config.BindConfigKey[*PostgresPxgOptions](optionName, environment) +func provideConfig(environment environemnt.Environment) (*PostgresPgxOptions, error) { + return config.BindConfigKey[*PostgresPgxOptions](optionName, environment) } diff --git a/internal/pkg/rabbitmq/producer/rabbitmq_producer.go b/internal/pkg/rabbitmq/producer/rabbitmq_producer.go index 9bc114f2..cf3e7d46 100644 --- a/internal/pkg/rabbitmq/producer/rabbitmq_producer.go +++ b/internal/pkg/rabbitmq/producer/rabbitmq_producer.go @@ -134,7 +134,7 @@ func (r *rabbitMQProducer) PublishMessageWithTopicName( producerOptions, ) - //https://github.com/rabbitmq/rabbitmq-tutorials/blob/master/go/publisher_confirms.go + // https://github.com/rabbitmq/rabbitmq-tutorials/blob/master/go/publisher_confirms.go if r.connection == nil { return producer2.FinishProducerSpan(beforeProduceSpan, errors.New("connection is nil")) } @@ -170,7 +170,7 @@ func (r *rabbitMQProducer) PublishMessageWithTopicName( MessageId: message.GeMessageId(), Timestamp: time.Now(), Headers: metadata.MetadataToMap(meta), - Type: message.GetEventTypeName(), //typeMapper.GetTypeName(message) - just message type name not full type name because in other side package name for type could be different + Type: message.GetEventTypeName(), // typeMapper.GetTypeName(message) - just message type name not full type name because in other side package name for type could be different ContentType: serializedObj.ContentType, Body: serializedObj.Data, DeliveryMode: producerConfiguration.DeliveryMode, diff --git a/internal/pkg/rabbitmq/rabbitmqErrors/errors.go b/internal/pkg/rabbitmq/rabbitmqErrors/errors.go index 0ba37071..750a4d46 100644 --- a/internal/pkg/rabbitmq/rabbitmqErrors/errors.go +++ b/internal/pkg/rabbitmq/rabbitmqErrors/errors.go @@ -4,6 +4,4 @@ import ( "emperror.dev/errors" ) -var ( - ErrDisconnected = errors.New("disconnected from rabbitmq, trying to reconnect") -) +var ErrDisconnected = errors.New("disconnected from rabbitmq, trying to reconnect") diff --git a/internal/pkg/reflection/reflection_helper/reflection_helper.go b/internal/pkg/reflection/reflection_helper/reflection_helper.go index 1bf79d3a..705d8880 100644 --- a/internal/pkg/reflection/reflection_helper/reflection_helper.go +++ b/internal/pkg/reflection/reflection_helper/reflection_helper.go @@ -100,7 +100,7 @@ func GetFieldValueByName[T any](object T, name string) interface{} { func SetFieldValueByIndex[T any](object T, index int, value interface{}) { v := reflect.ValueOf(&object).Elem() - //https://stackoverflow.com/questions/6395076/using-reflect-how-do-you-set-the-value-of-a-struct-field + // https://stackoverflow.com/questions/6395076/using-reflect-how-do-you-set-the-value-of-a-struct-field if v.Kind() == reflect.Ptr { val := v.Elem() field := val.Field(index) @@ -139,7 +139,7 @@ func SetFieldValueByIndex[T any](object T, index int, value interface{}) { func SetFieldValueByName[T any](object T, name string, value interface{}) { v := reflect.ValueOf(&object).Elem() - //https://stackoverflow.com/questions/6395076/using-reflect-how-do-you-set-the-value-of-a-struct-field + // https://stackoverflow.com/questions/6395076/using-reflect-how-do-you-set-the-value-of-a-struct-field if v.Kind() == reflect.Ptr { val := v.Elem() field := val.FieldByName(name) @@ -211,7 +211,7 @@ func GetFieldValueFromMethodAndObject[T interface{}](object T, name string) refl res := method.Call(nil) return res[0] } else { - //https://www.geeksforgeeks.org/reflect-addr-function-in-golang-with-examples/ + // https://www.geeksforgeeks.org/reflect-addr-function-in-golang-with-examples/ pointerType := v.Addr() method := pointerType.MethodByName(name) res := method.Call(nil) @@ -235,7 +235,7 @@ func GetFieldValueFromMethodAndReflectValue(val reflect.Value, name string) refl res := method.Call(nil) return res[0] } else { - //https://www.geeksforgeeks.org/reflect-addr-function-in-golang-with-examples/ + // https://www.geeksforgeeks.org/reflect-addr-function-in-golang-with-examples/ pointerType := val.Addr() method := pointerType.MethodByName(name) res := method.Call(nil) diff --git a/internal/pkg/reflection/reflection_helper/reflection_helper_test.go b/internal/pkg/reflection/reflection_helper/reflection_helper_test.go index c37a9632..e2b13bac 100644 --- a/internal/pkg/reflection/reflection_helper/reflection_helper_test.go +++ b/internal/pkg/reflection/reflection_helper/reflection_helper_test.go @@ -99,7 +99,7 @@ func Test_Set_Field_Value_For_UnExported_Fields_And_UnAddressable_Struct(t *test func Test_Get_Field_Value_For_Exported_Fields_And_Addressable_Struct(t *testing.T) { p := &PersonPublic{Name: "John", Age: 20} - //field by name only work on struct not pointer type so we should get Elem() + // field by name only work on struct not pointer type so we should get Elem() v := reflect.ValueOf(p).Elem() name := GetFieldValue(v.FieldByName("Name")).Interface() age := GetFieldValue(v.FieldByName("Age")).Interface() @@ -111,7 +111,7 @@ func Test_Get_Field_Value_For_Exported_Fields_And_Addressable_Struct(t *testing. func Test_Get_Field_Value_For_UnExported_Fields_And_Addressable_Struct(t *testing.T) { p := &PersonPrivate{name: "John", age: 30} - //field by name only work on struct not pointer type so we should get Elem() + // field by name only work on struct not pointer type so we should get Elem() v := reflect.ValueOf(p).Elem() name := GetFieldValue(v.FieldByName("name")).Interface() age := GetFieldValue(v.FieldByName("age")).Interface() @@ -123,7 +123,7 @@ func Test_Get_Field_Value_For_UnExported_Fields_And_Addressable_Struct(t *testin func Test_Get_Field_Value_For_Exported_Fields_And_UnAddressable_Struct(t *testing.T) { p := PersonPublic{Name: "John", Age: 20} - //field by name only work on struct not pointer type so we should get Elem() + // field by name only work on struct not pointer type so we should get Elem() v := reflect.ValueOf(&p).Elem() name := GetFieldValue(v.FieldByName("Name")).Interface() age := GetFieldValue(v.FieldByName("Age")).Interface() @@ -135,7 +135,7 @@ func Test_Get_Field_Value_For_Exported_Fields_And_UnAddressable_Struct(t *testin func Test_Get_Field_Value_For_UnExported_Fields_And_UnAddressable_Struct(t *testing.T) { p := PersonPrivate{name: "John", age: 20} - //field by name only work on struct not pointer type so we should get Elem() + // field by name only work on struct not pointer type so we should get Elem() v := reflect.ValueOf(&p).Elem() name := GetFieldValue(v.FieldByName("name")).Interface() age := GetFieldValue(v.FieldByName("age")).Interface() @@ -147,7 +147,7 @@ func Test_Get_Field_Value_For_UnExported_Fields_And_UnAddressable_Struct(t *test func Test_Set_Field_For_Exported_Fields_And_Addressable_Struct(t *testing.T) { p := &PersonPublic{} - //field by name only work on struct not pointer type so we should get Elem() + // field by name only work on struct not pointer type so we should get Elem() v := reflect.ValueOf(p).Elem() name := GetFieldValue(v.FieldByName("Name")) age := GetFieldValue(v.FieldByName("Age")) @@ -162,7 +162,7 @@ func Test_Set_Field_For_Exported_Fields_And_Addressable_Struct(t *testing.T) { func Test_Set_Field_For_UnExported_Fields_And_Addressable_Struct(t *testing.T) { p := &PersonPrivate{} - //field by name only work on struct not pointer type so we should get Elem() + // field by name only work on struct not pointer type so we should get Elem() v := reflect.ValueOf(p).Elem() name := GetFieldValue(v.FieldByName("name")) age := GetFieldValue(v.FieldByName("age")) @@ -177,7 +177,7 @@ func Test_Set_Field_For_UnExported_Fields_And_Addressable_Struct(t *testing.T) { func Test_Set_Field_For_Exported_Fields_And_UnAddressable_Struct(t *testing.T) { p := PersonPublic{} - //field by name only work on struct not pointer type so we should get Elem() + // field by name only work on struct not pointer type so we should get Elem() v := reflect.ValueOf(&p).Elem() name := GetFieldValue(v.FieldByName("Name")) age := GetFieldValue(v.FieldByName("Age")) @@ -192,7 +192,7 @@ func Test_Set_Field_For_Exported_Fields_And_UnAddressable_Struct(t *testing.T) { func Test_Set_Field_For_UnExported_Fields_And_UnAddressable_Struct(t *testing.T) { p := PersonPrivate{} - //field by name only work on struct not pointer type so we should get Elem() + // field by name only work on struct not pointer type so we should get Elem() v := reflect.ValueOf(&p).Elem() name := GetFieldValue(v.FieldByName("name")) age := GetFieldValue(v.FieldByName("age")) @@ -219,7 +219,7 @@ func Test_Get_Unexported_Field_From_Method_And_UnAddressable_Struct(t *testing.T } func Test_Convert_NoPointer_Type_To_Pointer_Type_With_Addr(t *testing.T) { - //https://www.geeksforgeeks.org/reflect-addr-function-in-golang-with-examples/ + // https://www.geeksforgeeks.org/reflect-addr-function-in-golang-with-examples/ p := PersonPrivate{name: "John", age: 20} v := reflect.ValueOf(&p).Elem() diff --git a/internal/pkg/test/containers/container.go b/internal/pkg/test/containers/container.go index 09f7450c..9eff2112 100644 --- a/internal/pkg/test/containers/container.go +++ b/internal/pkg/test/containers/container.go @@ -1,4 +1,3 @@ package containers -type TestContainer interface { -} +type TestContainer interface{} diff --git a/internal/pkg/test/containers/contracts/postgrespgx_container.go b/internal/pkg/test/containers/contracts/postgrespgx_container.go new file mode 100644 index 00000000..7d1bd432 --- /dev/null +++ b/internal/pkg/test/containers/contracts/postgrespgx_container.go @@ -0,0 +1,18 @@ +package contracts + +import ( + "context" + "testing" + + postgres "github.com/mehdihadeli/go-ecommerce-microservices/internal/pkg/postgres_pgx" +) + +type PostgresPgxContainer interface { + Start(ctx context.Context, t *testing.T, options ...*PostgresContainerOptions) (*postgres.Pgx, error) + CreatingContainerOptions( + ctx context.Context, + t *testing.T, + options ...*PostgresContainerOptions, + ) (*postgres.PostgresPgxOptions, error) + Cleanup(ctx context.Context) error +} diff --git a/internal/pkg/test/containers/dockertest/gorm/gorm_container.go b/internal/pkg/test/containers/dockertest/gorm/gorm_container.go index 546bcf4b..1ea98663 100644 --- a/internal/pkg/test/containers/dockertest/gorm/gorm_container.go +++ b/internal/pkg/test/containers/dockertest/gorm/gorm_container.go @@ -40,8 +40,8 @@ func (g *gormDockerTest) CreatingContainerOptions( t *testing.T, options ...*contracts.PostgresContainerOptions, ) (*gormPostgres.GormOptions, error) { - //https://github.com/ory/dockertest/blob/v3/examples/PostgreSQL.md - //https://github.com/bozd4g/fb.testcontainers + // https://github.com/ory/dockertest/blob/v3/examples/PostgreSQL.md + // https://github.com/bozd4g/fb.testcontainers pool, err := dockertest.NewPool("") if err != nil { log.Fatalf("Could not connect to docker: %s", err) diff --git a/internal/pkg/test/containers/gnomock/gorm/gorm_container.go b/internal/pkg/test/containers/gnomock/gorm/gorm_container.go index 16f0c908..2257b503 100644 --- a/internal/pkg/test/containers/gnomock/gorm/gorm_container.go +++ b/internal/pkg/test/containers/gnomock/gorm/gorm_container.go @@ -39,7 +39,7 @@ func (g *gnoMockGormContainer) CreatingContainerOptions( t *testing.T, options ...*contracts.PostgresContainerOptions, ) (*gormPostgres.GormOptions, error) { - //https://github.com/orlangure/gnomock + // https://github.com/orlangure/gnomock gnomock.WithContext(ctx) runOption := g.getRunOptions(options...) container, err := gnomock.Start(runOption) @@ -70,7 +70,6 @@ func (g *gnoMockGormContainer) Start( t *testing.T, options ...*contracts.PostgresContainerOptions, ) (*gorm.DB, error) { - gormOptions, err := g.CreatingContainerOptions(ctx, t, options...) if err != nil { return nil, err diff --git a/internal/pkg/test/containers/testcontainer/postgrespxg/postgrespgx_container.go b/internal/pkg/test/containers/testcontainer/postgrespxg/postgrespgx_container.go new file mode 100644 index 00000000..94058eca --- /dev/null +++ b/internal/pkg/test/containers/testcontainer/postgrespxg/postgrespgx_container.go @@ -0,0 +1,149 @@ +package postgrespxg + +import ( + "context" + "fmt" + "testing" + + "github.com/docker/go-connections/nat" + "github.com/testcontainers/testcontainers-go" + "github.com/testcontainers/testcontainers-go/wait" + + postgres "github.com/mehdihadeli/go-ecommerce-microservices/internal/pkg/postgres_pgx" + "github.com/mehdihadeli/go-ecommerce-microservices/internal/pkg/test/containers/contracts" +) + +type postgresPgxTestContainers struct { + container testcontainers.Container + defaultOptions *contracts.PostgresContainerOptions +} + +func NewPostgresPgxContainers() contracts.PostgresPgxContainer { + return &postgresPgxTestContainers{ + defaultOptions: &contracts.PostgresContainerOptions{ + Database: "test_db", + Port: "5432/tcp", + Host: "localhost", + UserName: "testcontainers", + Password: "testcontainers", + Tag: "latest", + ImageName: "postgres", + Name: "postgresql-testcontainer", + }, + } +} + +func (g *postgresPgxTestContainers) CreatingContainerOptions( + ctx context.Context, + t *testing.T, + options ...*contracts.PostgresContainerOptions, +) (*postgres.PostgresPgxOptions, error) { + // https://github.com/testcontainers/testcontainers-go + // https://dev.to/remast/go-integration-tests-using-testcontainers-9o5 + containerReq := g.getRunOptions(options...) + + // TODO: Using Parallel Container + dbContainer, err := testcontainers.GenericContainer( + ctx, + testcontainers.GenericContainerRequest{ + ContainerRequest: containerReq, + Started: true, + }) + if err != nil { + return nil, err + } + + // get a free random host hostPort + hostPort, err := dbContainer.MappedPort(ctx, nat.Port(g.defaultOptions.Port)) + if err != nil { + return nil, err + } + g.defaultOptions.HostPort = hostPort.Int() + + host, err := dbContainer.Host(ctx) + if err != nil { + return nil, err + } + + g.container = dbContainer + + // Clean up the container after the test is complete + t.Cleanup(func() { + _ = dbContainer.Terminate(ctx) + }) + + gormOptions := &postgres.PostgresPgxOptions{ + Port: g.defaultOptions.HostPort, + Host: host, + Password: g.defaultOptions.Password, + DBName: g.defaultOptions.Database, + SSLMode: false, + User: g.defaultOptions.UserName, + } + return gormOptions, nil +} + +func (g *postgresPgxTestContainers) Start( + ctx context.Context, + t *testing.T, + options ...*contracts.PostgresContainerOptions, +) (*postgres.Pgx, error) { + postgresPgxOptions, err := g.CreatingContainerOptions(ctx, t, options...) + if err != nil { + return nil, err + } + + db, err := postgres.NewPgx(postgresPgxOptions) + + return db, nil +} + +func (g *postgresPgxTestContainers) Cleanup(ctx context.Context) error { + return g.container.Terminate(ctx) +} + +func (g *postgresPgxTestContainers) getRunOptions( + opts ...*contracts.PostgresContainerOptions, +) testcontainers.ContainerRequest { + if len(opts) > 0 && opts[0] != nil { + option := opts[0] + if option.ImageName != "" { + g.defaultOptions.ImageName = option.ImageName + } + if option.Host != "" { + g.defaultOptions.Host = option.Host + } + if option.Port != "" { + g.defaultOptions.Port = option.Port + } + if option.UserName != "" { + g.defaultOptions.UserName = option.UserName + } + if option.Password != "" { + g.defaultOptions.Password = option.Password + } + if option.Tag != "" { + g.defaultOptions.Tag = option.Tag + } + } + + //hostFreePort, err := freeport.GetFreePort() + //if err != nil { + // log.Fatal(err) + //} + //g.defaultOptions.HostPort = hostFreePort + + containerReq := testcontainers.ContainerRequest{ + Image: fmt.Sprintf("%s:%s", g.defaultOptions.ImageName, g.defaultOptions.Tag), + ExposedPorts: []string{g.defaultOptions.Port}, + WaitingFor: wait.ForListeningPort(nat.Port(g.defaultOptions.Port)), + Hostname: g.defaultOptions.Host, + Env: map[string]string{ + "POSTGRES_DB": g.defaultOptions.Database, + "POSTGRES_PASSWORD": g.defaultOptions.Password, + "POSTGRES_USER": g.defaultOptions.UserName, + }, + } + + return containerReq +} diff --git a/internal/pkg/test/containers/testcontainer/postgrespxg/postgrespgx_container_test.go b/internal/pkg/test/containers/testcontainer/postgrespxg/postgrespgx_container_test.go new file mode 100644 index 00000000..49f46692 --- /dev/null +++ b/internal/pkg/test/containers/testcontainer/postgrespxg/postgrespgx_container_test.go @@ -0,0 +1,16 @@ +package postgrespxg + +import ( + "context" + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func Test_Gorm_Container(t *testing.T) { + gorm, err := NewPostgresPgxContainers().Start(context.Background(), t) + require.NoError(t, err) + + assert.NotNil(t, gorm) +} diff --git a/internal/pkg/test/containers/testcontainer/postgrespxg/postgrespgx_fx.go b/internal/pkg/test/containers/testcontainer/postgrespxg/postgrespgx_fx.go new file mode 100644 index 00000000..69dd74c3 --- /dev/null +++ b/internal/pkg/test/containers/testcontainer/postgrespxg/postgrespgx_fx.go @@ -0,0 +1,14 @@ +package postgrespxg + +import ( + "context" + "testing" + + postgres "github.com/mehdihadeli/go-ecommerce-microservices/internal/pkg/postgres_pgx" +) + +var PostgresPgxContainerOptionsDecorator = func(t *testing.T, ctx context.Context) interface{} { + return func(c *postgres.PostgresPgxOptions) (*postgres.PostgresPgxOptions, error) { + return NewPostgresPgxContainers().CreatingContainerOptions(ctx, t) + } +} diff --git a/internal/pkg/test/hypothesis/hypothesis.go b/internal/pkg/test/hypothesis/hypothesis.go index c10babdc..33cb62ff 100644 --- a/internal/pkg/test/hypothesis/hypothesis.go +++ b/internal/pkg/test/hypothesis/hypothesis.go @@ -28,7 +28,6 @@ func (h *hypothesis[T]) Validate(ctx context.Context, message string, time time. } return true }, time) - if err != nil { assert.FailNowf(h.t, "hypothesis validation failed, %s", message) } diff --git a/internal/pkg/testfixture/postgres_testfixture.go b/internal/pkg/testfixture/postgres_testfixture.go index b2d851a2..d8e68905 100644 --- a/internal/pkg/testfixture/postgres_testfixture.go +++ b/internal/pkg/testfixture/postgres_testfixture.go @@ -21,7 +21,7 @@ func RunPostgresFixture(db *sql.DB, fixturePaths []string, data map[string]inter fixturePaths[i] = fmt.Sprintf("%v/%v", rootPath, filepath.ToSlash(fixturePaths[i])) } - //https://github.com/go-testfixtures/testfixtures + // https://github.com/go-testfixtures/testfixtures fixtures, err := testfixtures.New( testfixtures.Database(db), testfixtures.Dialect("postgres"), diff --git a/internal/pkg/utils/array.go b/internal/pkg/utils/array.go index dd828626..7c205ba5 100644 --- a/internal/pkg/utils/array.go +++ b/internal/pkg/utils/array.go @@ -13,7 +13,6 @@ func Contains[T any](arr []T, x T) bool { func ContainsFunc[T any](arr []T, predicate func(T) bool) bool { for _, v := range arr { - if predicate(v) == true { return true } diff --git a/internal/pkg/utils/error_utils/errors.go b/internal/pkg/utils/error_utils/errors.go index 42fb71b2..4ca3e8e2 100644 --- a/internal/pkg/utils/error_utils/errors.go +++ b/internal/pkg/utils/error_utils/errors.go @@ -49,7 +49,7 @@ func ErrorsWithoutStack(err error, format bool) string { // StackTrace returns all stack traces with a string contains just stack trace levels for the given error func StackTrace(err error) string { var stackTrace contracts.StackTracer - var stackStr = "" + stackStr := "" for { s, ok := err.(contracts.StackTracer) stackTrace = s diff --git a/internal/pkg/web/background_worker.go b/internal/pkg/web/background_worker.go index c7f17274..fae83495 100644 --- a/internal/pkg/web/background_worker.go +++ b/internal/pkg/web/background_worker.go @@ -9,8 +9,10 @@ type Worker interface { Stop(ctx context.Context) error } -type ExecutionFunc func(ctx context.Context) error -type StopFunc func(ctx context.Context) error +type ( + ExecutionFunc func(ctx context.Context) error + StopFunc func(ctx context.Context) error +) type BackgroundWorker struct { ctx context.Context diff --git a/internal/services/catalog_read_service/internal/products/models/product.go b/internal/services/catalog_read_service/internal/products/models/product.go index 57c72f1d..be3c6f31 100644 --- a/internal/services/catalog_read_service/internal/products/models/product.go +++ b/internal/services/catalog_read_service/internal/products/models/product.go @@ -6,7 +6,7 @@ import ( type Product struct { // we generate id ourselves because auto generate mongo string id column with type _id is not an uuid - Id string `json:"id" bson:"_id,omitempty"` //https://www.mongodb.com/docs/drivers/go/current/fundamentals/crud/write-operations/insert/#the-_id-field + Id string `json:"id" bson:"_id,omitempty"` // https://www.mongodb.com/docs/drivers/go/current/fundamentals/crud/write-operations/insert/#the-_id-field ProductId string `json:"productId" bson:"productId"` Name string `json:"name,omitempty" bson:"name,omitempty"` Description string `json:"description,omitempty" bson:"description,omitempty"` diff --git a/internal/services/catalog_write_service/internal/shared/app/test/test_app.go b/internal/services/catalog_write_service/internal/shared/app/test/test_app.go index 34eafc4f..4080b378 100644 --- a/internal/services/catalog_write_service/internal/shared/app/test/test_app.go +++ b/internal/services/catalog_write_service/internal/shared/app/test/test_app.go @@ -16,6 +16,7 @@ import ( "github.com/mehdihadeli/go-ecommerce-microservices/internal/pkg/rabbitmq/bus" config2 "github.com/mehdihadeli/go-ecommerce-microservices/internal/pkg/rabbitmq/config" "github.com/mehdihadeli/go-ecommerce-microservices/internal/pkg/test/containers/testcontainer/gorm" + "github.com/mehdihadeli/go-ecommerce-microservices/internal/pkg/test/containers/testcontainer/postgrespxg" "github.com/mehdihadeli/go-ecommerce-microservices/internal/pkg/test/containers/testcontainer/rabbitmq" "github.com/mehdihadeli/go-ecommerce-microservices/internal/services/catalogwriteservice/config" "github.com/mehdihadeli/go-ecommerce-microservices/internal/services/catalogwriteservice/internal/products/contracts/data" @@ -51,6 +52,7 @@ func (a *TestApp) Run(t *testing.T) (result *TestAppResult) { appBuilder.ProvideModule(catalogs.CatalogsServiceModule) appBuilder.Decorate(rabbitmq.RabbitmqContainerOptionsDecorator(t, lifetimeCtx)) appBuilder.Decorate(gorm.GormContainerOptionsDecorator(t, lifetimeCtx)) + appBuilder.Decorate(postgrespxg.PostgresPgxContainerOptionsDecorator(t, lifetimeCtx)) testApp := appBuilder.Build() diff --git a/internal/services/order_service/internal/orders/configurations/rabbitmq/rabbitmq_configurations.go b/internal/services/order_service/internal/orders/configurations/rabbitmq/rabbitmq_configurations.go index a99f33e2..c4d58d03 100644 --- a/internal/services/order_service/internal/orders/configurations/rabbitmq/rabbitmq_configurations.go +++ b/internal/services/order_service/internal/orders/configurations/rabbitmq/rabbitmq_configurations.go @@ -8,8 +8,8 @@ import ( ) func ConfigOrdersRabbitMQ(builder rabbitmqConfigurations.RabbitMQConfigurationBuilder) { - //add custom message type mappings - //utils.RegisterCustomMessageTypesToRegistrty(map[string]types.IMessage{"orderCreatedV1": &OrderCreatedV1{}}) + // add custom message type mappings + // utils.RegisterCustomMessageTypesToRegistrty(map[string]types.IMessage{"orderCreatedV1": &OrderCreatedV1{}}) builder.AddProducer( createOrderIntegrationEventsV1.OrderCreatedV1{}, diff --git a/internal/services/order_service/internal/orders/features/creating_order/v1/dtos/create_order_response_dto.go b/internal/services/order_service/internal/orders/features/creating_order/v1/dtos/create_order_response_dto.go index 8243e201..ecd912f2 100644 --- a/internal/services/order_service/internal/orders/features/creating_order/v1/dtos/create_order_response_dto.go +++ b/internal/services/order_service/internal/orders/features/creating_order/v1/dtos/create_order_response_dto.go @@ -2,8 +2,7 @@ package dtos import uuid "github.com/satori/go.uuid" -//https://echo.labstack.com/guide/response/ - +// https://echo.labstack.com/guide/response/ type CreateOrderResponseDto struct { OrderId uuid.UUID `json:"Id"` } diff --git a/internal/services/order_service/internal/orders/models/orders/read_models/order_read.go b/internal/services/order_service/internal/orders/models/orders/read_models/order_read.go index 1963e9d8..2b56a575 100644 --- a/internal/services/order_service/internal/orders/models/orders/read_models/order_read.go +++ b/internal/services/order_service/internal/orders/models/orders/read_models/order_read.go @@ -8,7 +8,7 @@ import ( type OrderReadModel struct { // we generate id ourself because auto generate mongo string id column with type _id is not an uuid - Id string `json:"id" bson:"_id,omitempty"` //https://www.mongodb.com/docs/drivers/go/current/fundamentals/crud/write-operations/insert/#the-_id-field + Id string `json:"id" bson:"_id,omitempty"` // https://www.mongodb.com/docs/drivers/go/current/fundamentals/crud/write-operations/insert/#the-_id-field OrderId string `json:"orderId" bson:"orderId,omitempty"` ShopItems []*ShopItemReadModel `json:"shopItems,omitempty" bson:"shopItems,omitempty"` AccountEmail string `json:"accountEmail,omitempty" bson:"accountEmail,omitempty"` diff --git a/internal/services/order_service/mocks/OrdersServiceServer.go b/internal/services/order_service/mocks/OrdersServiceServer.go index 77db8195..ec8143a3 100644 --- a/internal/services/order_service/mocks/OrdersServiceServer.go +++ b/internal/services/order_service/mocks/OrdersServiceServer.go @@ -7,7 +7,7 @@ import ( mock "github.com/stretchr/testify/mock" - orders_service "github.com/mehdihadeli/go-ecommerce-microservices/internal/services/orderservice/internal/shared/grpc/genproto" + orders_service "github.com/mehdihadeli/go-ecommerce-microservices/internal/services/orderservice/internal/shared/grpc/genproto" ) // OrdersServiceServer is an autogenerated mock type for the OrdersServiceServer type diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 00000000..78521191 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,2268 @@ +{ + "name": "go-ecommerce-microservices", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "go-ecommerce-microservices", + "version": "1.0.0", + "license": "MIT", + "devDependencies": { + "@commitlint/cli": "^17.6.7", + "@commitlint/config-conventional": "^17.6.7", + "husky": "^8.0.3" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.10.tgz", + "integrity": "sha512-/KKIMG4UEL35WmI9OlvMhurwtytjvXoFcGNrOvyG9zIzA8YmPjVtIZUf7b05+TPO7G7/GEmLHDaoCgACHl9hhA==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.22.10", + "chalk": "^2.4.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/code-frame/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/code-frame/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/@babel/code-frame/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz", + "integrity": "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.10.tgz", + "integrity": "sha512-78aUtVcT7MUscr0K5mIEnkwxPE0MaxkR5RxRwuHaQ+JuU5AmTPhY+do2mdzVTnIJJpyBglql2pehuBIWHug+WQ==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.22.5", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/@babel/highlight/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@commitlint/cli": { + "version": "17.6.7", + "resolved": "https://registry.npmjs.org/@commitlint/cli/-/cli-17.6.7.tgz", + "integrity": "sha512-nzZmfO5KIOupYppn1MsnYX/80I+KDlxiwkks3CJT0XT+t34UgqGi3eSyEuzgcIjPlORk5/GMaAEiys78iLfGMg==", + "dev": true, + "dependencies": { + "@commitlint/format": "^17.4.4", + "@commitlint/lint": "^17.6.7", + "@commitlint/load": "^17.6.7", + "@commitlint/read": "^17.5.1", + "@commitlint/types": "^17.4.4", + "execa": "^5.0.0", + "lodash.isfunction": "^3.0.9", + "resolve-from": "5.0.0", + "resolve-global": "1.0.0", + "yargs": "^17.0.0" + }, + "bin": { + "commitlint": "cli.js" + }, + "engines": { + "node": ">=v14" + } + }, + "node_modules/@commitlint/config-conventional": { + "version": "17.6.7", + "resolved": "https://registry.npmjs.org/@commitlint/config-conventional/-/config-conventional-17.6.7.tgz", + "integrity": "sha512-4oTpEUC0HRM54QRHBPMOJW1pETp7usxXn9RuNYNWHcmu8wi1mpws95hvS20u2n6HtIkTn0jfn7vHioCm4AGUTw==", + "dev": true, + "dependencies": { + "conventional-changelog-conventionalcommits": "^5.0.0" + }, + "engines": { + "node": ">=v14" + } + }, + "node_modules/@commitlint/config-validator": { + "version": "17.6.7", + "resolved": "https://registry.npmjs.org/@commitlint/config-validator/-/config-validator-17.6.7.tgz", + "integrity": "sha512-vJSncmnzwMvpr3lIcm0I8YVVDJTzyjy7NZAeXbTXy+MPUdAr9pKyyg7Tx/ebOQ9kqzE6O9WT6jg2164br5UdsQ==", + "dev": true, + "dependencies": { + "@commitlint/types": "^17.4.4", + "ajv": "^8.11.0" + }, + "engines": { + "node": ">=v14" + } + }, + "node_modules/@commitlint/ensure": { + "version": "17.6.7", + "resolved": "https://registry.npmjs.org/@commitlint/ensure/-/ensure-17.6.7.tgz", + "integrity": "sha512-mfDJOd1/O/eIb/h4qwXzUxkmskXDL9vNPnZ4AKYKiZALz4vHzwMxBSYtyL2mUIDeU9DRSpEUins8SeKtFkYHSw==", + "dev": true, + "dependencies": { + "@commitlint/types": "^17.4.4", + "lodash.camelcase": "^4.3.0", + "lodash.kebabcase": "^4.1.1", + "lodash.snakecase": "^4.1.1", + "lodash.startcase": "^4.4.0", + "lodash.upperfirst": "^4.3.1" + }, + "engines": { + "node": ">=v14" + } + }, + "node_modules/@commitlint/execute-rule": { + "version": "17.4.0", + "resolved": "https://registry.npmjs.org/@commitlint/execute-rule/-/execute-rule-17.4.0.tgz", + "integrity": "sha512-LIgYXuCSO5Gvtc0t9bebAMSwd68ewzmqLypqI2Kke1rqOqqDbMpYcYfoPfFlv9eyLIh4jocHWwCK5FS7z9icUA==", + "dev": true, + "engines": { + "node": ">=v14" + } + }, + "node_modules/@commitlint/format": { + "version": "17.4.4", + "resolved": "https://registry.npmjs.org/@commitlint/format/-/format-17.4.4.tgz", + "integrity": "sha512-+IS7vpC4Gd/x+uyQPTAt3hXs5NxnkqAZ3aqrHd5Bx/R9skyCAWusNlNbw3InDbAK6j166D9asQM8fnmYIa+CXQ==", + "dev": true, + "dependencies": { + "@commitlint/types": "^17.4.4", + "chalk": "^4.1.0" + }, + "engines": { + "node": ">=v14" + } + }, + "node_modules/@commitlint/is-ignored": { + "version": "17.6.7", + "resolved": "https://registry.npmjs.org/@commitlint/is-ignored/-/is-ignored-17.6.7.tgz", + "integrity": "sha512-vqyNRqtbq72P2JadaoWiuoLtXIs9SaAWDqdtef6G2zsoXqKFc7vqj1f+thzVgosXG3X/5K9jNp+iYijmvOfc/g==", + "dev": true, + "dependencies": { + "@commitlint/types": "^17.4.4", + "semver": "7.5.2" + }, + "engines": { + "node": ">=v14" + } + }, + "node_modules/@commitlint/lint": { + "version": "17.6.7", + "resolved": "https://registry.npmjs.org/@commitlint/lint/-/lint-17.6.7.tgz", + "integrity": "sha512-TW+AozfuOFMrHn+jdwtz0IWu8REKFp0eryOvoBp2r8IXNc4KihKB1spAiUB6SFyHD6hVVeolz12aHnJ3Mb+xVQ==", + "dev": true, + "dependencies": { + "@commitlint/is-ignored": "^17.6.7", + "@commitlint/parse": "^17.6.7", + "@commitlint/rules": "^17.6.7", + "@commitlint/types": "^17.4.4" + }, + "engines": { + "node": ">=v14" + } + }, + "node_modules/@commitlint/load": { + "version": "17.6.7", + "resolved": "https://registry.npmjs.org/@commitlint/load/-/load-17.6.7.tgz", + "integrity": "sha512-QZ2rJTbX55BQdYrCm/p6+hh/pFBgC9nTJxfsrK6xRPe2thiQzHN0AQDBqBwAirn6gIkHrjIbCbtAE6kiDYLjrw==", + "dev": true, + "dependencies": { + "@commitlint/config-validator": "^17.6.7", + "@commitlint/execute-rule": "^17.4.0", + "@commitlint/resolve-extends": "^17.6.7", + "@commitlint/types": "^17.4.4", + "@types/node": "*", + "chalk": "^4.1.0", + "cosmiconfig": "^8.0.0", + "cosmiconfig-typescript-loader": "^4.0.0", + "lodash.isplainobject": "^4.0.6", + "lodash.merge": "^4.6.2", + "lodash.uniq": "^4.5.0", + "resolve-from": "^5.0.0", + "ts-node": "^10.8.1", + "typescript": "^4.6.4 || ^5.0.0" + }, + "engines": { + "node": ">=v14" + } + }, + "node_modules/@commitlint/message": { + "version": "17.4.2", + "resolved": "https://registry.npmjs.org/@commitlint/message/-/message-17.4.2.tgz", + "integrity": "sha512-3XMNbzB+3bhKA1hSAWPCQA3lNxR4zaeQAQcHj0Hx5sVdO6ryXtgUBGGv+1ZCLMgAPRixuc6en+iNAzZ4NzAa8Q==", + "dev": true, + "engines": { + "node": ">=v14" + } + }, + "node_modules/@commitlint/parse": { + "version": "17.6.7", + "resolved": "https://registry.npmjs.org/@commitlint/parse/-/parse-17.6.7.tgz", + "integrity": "sha512-ibO03BgEns+JJpohpBZYD49mCdSNMg6fTv7vA5yqzEFWkBQk5NWhEBw2yG+Z1UClStIRkMkAYyI2HzoQG9tCQQ==", + "dev": true, + "dependencies": { + "@commitlint/types": "^17.4.4", + "conventional-changelog-angular": "^5.0.11", + "conventional-commits-parser": "^3.2.2" + }, + "engines": { + "node": ">=v14" + } + }, + "node_modules/@commitlint/read": { + "version": "17.5.1", + "resolved": "https://registry.npmjs.org/@commitlint/read/-/read-17.5.1.tgz", + "integrity": "sha512-7IhfvEvB//p9aYW09YVclHbdf1u7g7QhxeYW9ZHSO8Huzp8Rz7m05aCO1mFG7G8M+7yfFnXB5xOmG18brqQIBg==", + "dev": true, + "dependencies": { + "@commitlint/top-level": "^17.4.0", + "@commitlint/types": "^17.4.4", + "fs-extra": "^11.0.0", + "git-raw-commits": "^2.0.11", + "minimist": "^1.2.6" + }, + "engines": { + "node": ">=v14" + } + }, + "node_modules/@commitlint/resolve-extends": { + "version": "17.6.7", + "resolved": "https://registry.npmjs.org/@commitlint/resolve-extends/-/resolve-extends-17.6.7.tgz", + "integrity": "sha512-PfeoAwLHtbOaC9bGn/FADN156CqkFz6ZKiVDMjuC2N5N0740Ke56rKU7Wxdwya8R8xzLK9vZzHgNbuGhaOVKIg==", + "dev": true, + "dependencies": { + "@commitlint/config-validator": "^17.6.7", + "@commitlint/types": "^17.4.4", + "import-fresh": "^3.0.0", + "lodash.mergewith": "^4.6.2", + "resolve-from": "^5.0.0", + "resolve-global": "^1.0.0" + }, + "engines": { + "node": ">=v14" + } + }, + "node_modules/@commitlint/rules": { + "version": "17.6.7", + "resolved": "https://registry.npmjs.org/@commitlint/rules/-/rules-17.6.7.tgz", + "integrity": "sha512-x/SDwDTN3w3Gr5xkhrIORu96rlKCc8ZLYEMXRqi9+MB33st2mKcGvKa5uJuigHlbl3xm75bAAubATrodVrjguQ==", + "dev": true, + "dependencies": { + "@commitlint/ensure": "^17.6.7", + "@commitlint/message": "^17.4.2", + "@commitlint/to-lines": "^17.4.0", + "@commitlint/types": "^17.4.4", + "execa": "^5.0.0" + }, + "engines": { + "node": ">=v14" + } + }, + "node_modules/@commitlint/to-lines": { + "version": "17.4.0", + "resolved": "https://registry.npmjs.org/@commitlint/to-lines/-/to-lines-17.4.0.tgz", + "integrity": "sha512-LcIy/6ZZolsfwDUWfN1mJ+co09soSuNASfKEU5sCmgFCvX5iHwRYLiIuoqXzOVDYOy7E7IcHilr/KS0e5T+0Hg==", + "dev": true, + "engines": { + "node": ">=v14" + } + }, + "node_modules/@commitlint/top-level": { + "version": "17.4.0", + "resolved": "https://registry.npmjs.org/@commitlint/top-level/-/top-level-17.4.0.tgz", + "integrity": "sha512-/1loE/g+dTTQgHnjoCy0AexKAEFyHsR2zRB4NWrZ6lZSMIxAhBJnmCqwao7b4H8888PsfoTBCLBYIw8vGnej8g==", + "dev": true, + "dependencies": { + "find-up": "^5.0.0" + }, + "engines": { + "node": ">=v14" + } + }, + "node_modules/@commitlint/types": { + "version": "17.4.4", + "resolved": "https://registry.npmjs.org/@commitlint/types/-/types-17.4.4.tgz", + "integrity": "sha512-amRN8tRLYOsxRr6mTnGGGvB5EmW/4DDjLMgiwK3CCVEmN6Sr/6xePGEpWaspKkckILuUORCwe6VfDBw6uj4axQ==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0" + }, + "engines": { + "node": ">=v14" + } + }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "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==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "node_modules/@tsconfig/node10": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", + "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", + "dev": true + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "dev": true + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "dev": true + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", + "dev": true + }, + "node_modules/@types/minimist": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.2.tgz", + "integrity": "sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==", + "dev": true + }, + "node_modules/@types/node": { + "version": "20.4.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.4.9.tgz", + "integrity": "sha512-8e2HYcg7ohnTUbHk8focoklEQYvemQmu9M/f43DZVx43kHn0tE3BY/6gSDxS7k0SprtS0NHvj+L80cGLnoOUcQ==", + "dev": true + }, + "node_modules/@types/normalize-package-data": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz", + "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==", + "dev": true + }, + "node_modules/acorn": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", + "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/array-ify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz", + "integrity": "sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==", + "dev": true + }, + "node_modules/arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase-keys": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", + "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", + "dev": true, + "dependencies": { + "camelcase": "^5.3.1", + "map-obj": "^4.0.0", + "quick-lru": "^4.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/compare-func": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-2.0.0.tgz", + "integrity": "sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==", + "dev": true, + "dependencies": { + "array-ify": "^1.0.0", + "dot-prop": "^5.1.0" + } + }, + "node_modules/conventional-changelog-angular": { + "version": "5.0.13", + "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-5.0.13.tgz", + "integrity": "sha512-i/gipMxs7s8L/QeuavPF2hLnJgH6pEZAttySB6aiQLWcX3puWDL3ACVmvBhJGxnAy52Qc15ua26BufY6KpmrVA==", + "dev": true, + "dependencies": { + "compare-func": "^2.0.0", + "q": "^1.5.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/conventional-changelog-conventionalcommits": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-5.0.0.tgz", + "integrity": "sha512-lCDbA+ZqVFQGUj7h9QBKoIpLhl8iihkO0nCTyRNzuXtcd7ubODpYB04IFy31JloiJgG0Uovu8ot8oxRzn7Nwtw==", + "dev": true, + "dependencies": { + "compare-func": "^2.0.0", + "lodash": "^4.17.15", + "q": "^1.5.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/conventional-commits-parser": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-3.2.4.tgz", + "integrity": "sha512-nK7sAtfi+QXbxHCYfhpZsfRtaitZLIA6889kFIouLvz6repszQDgxBu7wf2WbU+Dco7sAnNCJYERCwt54WPC2Q==", + "dev": true, + "dependencies": { + "is-text-path": "^1.0.1", + "JSONStream": "^1.0.4", + "lodash": "^4.17.15", + "meow": "^8.0.0", + "split2": "^3.0.0", + "through2": "^4.0.0" + }, + "bin": { + "conventional-commits-parser": "cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/cosmiconfig": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.2.0.tgz", + "integrity": "sha512-3rTMnFJA1tCOPwRxtgF4wd7Ab2qvDbL8jX+3smjIbS4HlZBagTlpERbdN7iAbWlrfxE3M8c27kTwTawQ7st+OQ==", + "dev": true, + "dependencies": { + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "parse-json": "^5.0.0", + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + } + }, + "node_modules/cosmiconfig-typescript-loader": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-4.4.0.tgz", + "integrity": "sha512-BabizFdC3wBHhbI4kJh0VkQP9GkBfoHPydD0COMce1nJ1kJAB3F2TmJ/I7diULBKtmEWSwEbuN/KDtgnmUUVmw==", + "dev": true, + "engines": { + "node": ">=v14.21.3" + }, + "peerDependencies": { + "@types/node": "*", + "cosmiconfig": ">=7", + "ts-node": ">=10", + "typescript": ">=4" + } + }, + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/dargs": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/dargs/-/dargs-7.0.0.tgz", + "integrity": "sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decamelize-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.1.tgz", + "integrity": "sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==", + "dev": true, + "dependencies": { + "decamelize": "^1.1.0", + "map-obj": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/decamelize-keys/node_modules/map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/dot-prop": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", + "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", + "dev": true, + "dependencies": { + "is-obj": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/fs-extra": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.1.tgz", + "integrity": "sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/git-raw-commits": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-2.0.11.tgz", + "integrity": "sha512-VnctFhw+xfj8Va1xtfEqCUD2XDrbAPSJx+hSrE5K7fGdjZruW7XV+QOrN7LF/RJyvspRiD2I0asWsxFp0ya26A==", + "dev": true, + "dependencies": { + "dargs": "^7.0.0", + "lodash": "^4.17.15", + "meow": "^8.0.0", + "split2": "^3.0.0", + "through2": "^4.0.0" + }, + "bin": { + "git-raw-commits": "cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/global-dirs": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", + "integrity": "sha512-NknMLn7F2J7aflwFOlGdNIuCDpN3VGoSoB+aap3KABFWbHVn1TCgFC+np23J8W2BiZbjfEw3BFBycSMv1AFblg==", + "dev": true, + "dependencies": { + "ini": "^1.3.4" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true + }, + "node_modules/hard-rejection": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", + "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/hosted-git-info": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", + "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/husky": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/husky/-/husky-8.0.3.tgz", + "integrity": "sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg==", + "dev": true, + "bin": { + "husky": "lib/bin.js" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/typicode" + } + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-fresh/node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true + }, + "node_modules/is-core-module": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", + "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-text-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-1.0.1.tgz", + "integrity": "sha512-xFuJpne9oFz5qDaodwmmG08e3CawH/2ZV8Qqza1Ko7Sk8POWbkRdwIoAWVhqvq0XeUzANEhKo2n0IXUGBm7A/w==", + "dev": true, + "dependencies": { + "text-extensions": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, + "node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jsonparse": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", + "dev": true, + "engines": [ + "node >= 0.2.0" + ] + }, + "node_modules/JSONStream": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", + "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", + "dev": true, + "dependencies": { + "jsonparse": "^1.2.0", + "through": ">=2.2.7 <3" + }, + "bin": { + "JSONStream": "bin.js" + }, + "engines": { + "node": "*" + } + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "node_modules/lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", + "dev": true + }, + "node_modules/lodash.isfunction": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/lodash.isfunction/-/lodash.isfunction-3.0.9.tgz", + "integrity": "sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw==", + "dev": true + }, + "node_modules/lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", + "dev": true + }, + "node_modules/lodash.kebabcase": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz", + "integrity": "sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g==", + "dev": true + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "node_modules/lodash.mergewith": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.2.tgz", + "integrity": "sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==", + "dev": true + }, + "node_modules/lodash.snakecase": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz", + "integrity": "sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==", + "dev": true + }, + "node_modules/lodash.startcase": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.startcase/-/lodash.startcase-4.4.0.tgz", + "integrity": "sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==", + "dev": true + }, + "node_modules/lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==", + "dev": true + }, + "node_modules/lodash.upperfirst": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/lodash.upperfirst/-/lodash.upperfirst-4.3.1.tgz", + "integrity": "sha512-sReKOYJIJf74dhJONhU4e0/shzi1trVbSWDOhKYE5XV2O+H7Sb2Dihwuc7xWxVl+DgFPyTqIN3zMfT9cq5iWDg==", + "dev": true + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, + "node_modules/map-obj": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", + "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/meow": { + "version": "8.1.2", + "resolved": "https://registry.npmjs.org/meow/-/meow-8.1.2.tgz", + "integrity": "sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==", + "dev": true, + "dependencies": { + "@types/minimist": "^1.2.0", + "camelcase-keys": "^6.2.2", + "decamelize-keys": "^1.1.0", + "hard-rejection": "^2.1.0", + "minimist-options": "4.1.0", + "normalize-package-data": "^3.0.0", + "read-pkg-up": "^7.0.1", + "redent": "^3.0.0", + "trim-newlines": "^3.0.0", + "type-fest": "^0.18.0", + "yargs-parser": "^20.2.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minimist-options": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", + "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", + "dev": true, + "dependencies": { + "arrify": "^1.0.1", + "is-plain-obj": "^1.1.0", + "kind-of": "^6.0.3" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/normalize-package-data": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", + "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", + "dev": true, + "dependencies": { + "hosted-git-info": "^4.0.1", + "is-core-module": "^2.5.0", + "semver": "^7.3.4", + "validate-npm-package-license": "^3.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/punycode": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==", + "dev": true, + "engines": { + "node": ">=0.6.0", + "teleport": ">=0.2.0" + } + }, + "node_modules/quick-lru": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", + "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "dev": true, + "dependencies": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "dev": true, + "dependencies": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg-up/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg-up/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg-up/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg-up/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg-up/node_modules/type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg/node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true + }, + "node_modules/read-pkg/node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/read-pkg/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/read-pkg/node_modules/type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/redent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", + "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", + "dev": true, + "dependencies": { + "indent-string": "^4.0.0", + "strip-indent": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.4", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.4.tgz", + "integrity": "sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==", + "dev": true, + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-global": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-global/-/resolve-global-1.0.0.tgz", + "integrity": "sha512-zFa12V4OLtT5XUX/Q4VLvTfBf+Ok0SPc1FNGM/z9ctUdiU618qwKpWnd0CHs3+RqROfyEg/DhuHbMWYqcgljEw==", + "dev": true, + "dependencies": { + "global-dirs": "^0.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/semver": { + "version": "7.5.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.2.tgz", + "integrity": "sha512-SoftuTROv/cRjCze/scjGyiDtcUyxw1rgYQSZY7XTmtR5hX+dm76iDbTH8TkLPHCQmlbQVSSbNZCPM2hb0knnQ==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "node_modules/spdx-correct": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", + "dev": true, + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "dev": true + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.13", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.13.tgz", + "integrity": "sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==", + "dev": true + }, + "node_modules/split2": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz", + "integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==", + "dev": true, + "dependencies": { + "readable-stream": "^3.0.0" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-indent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "dev": true, + "dependencies": { + "min-indent": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/text-extensions": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-1.9.0.tgz", + "integrity": "sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==", + "dev": true, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", + "dev": true + }, + "node_modules/through2": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", + "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", + "dev": true, + "dependencies": { + "readable-stream": "3" + } + }, + "node_modules/trim-newlines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", + "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ts-node": { + "version": "10.9.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", + "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", + "dev": true, + "dependencies": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } + } + }, + "node_modules/type-fest": { + "version": "0.18.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", + "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typescript": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz", + "integrity": "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true + }, + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "dev": true + }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs/node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 00000000..e60d7c39 --- /dev/null +++ b/package.json @@ -0,0 +1,23 @@ +{ + "name": "go-ecommerce-microservices", + "version": "1.0.0", + "description": "", + "scripts": { + "prepare": "husky install" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/mehdihadeli/go-ecommerce-microservices.git" + }, + "author": "", + "license": "MIT", + "bugs": { + "url": "https://github.com/mehdihadeli/go-ecommerce-microservices/issues" + }, + "homepage": "https://github.com/mehdihadeli/go-ecommerce-microservices#readme", + "devDependencies": { + "@commitlint/cli": "^17.6.7", + "@commitlint/config-conventional": "^17.6.7", + "husky": "^8.0.3" + } +} diff --git a/scripts/format.sh b/scripts/format.sh index a60437da..d30c4140 100755 --- a/scripts/format.sh +++ b/scripts/format.sh @@ -26,7 +26,7 @@ gofumpt -l -w . # https://github.com/incu6us/goimports-reviser # will do `gofmt` and `goimports` internally -goimports-reviser -rm-unused -set-alias -format -recursive ./... +# goimports-reviser -rm-unused -set-alias -format -recursive ./... # https://github.com/segmentio/golines golines . -m 120 -w --ignore-generated